def test_06_knx_blockception(self): """Test that we can do blockception""" block = knx.KnxBlock(name="atoll") block.append(knx.KnxField(name="pom-")) block.append(knx.KnxField(name="pom")) block.append(knx.KnxBlock(name="galli")) block.galli.append(knx.KnxField(name="sout pacific", value=b"10")) self.assertEqual(block.attributes, ["pom_", "pom", "galli"]) self.assertEqual([x.name for x in block.fields], ["pom-", "pom", "sout pacific"])
def test_03_knx_block_supp_svc_families(self): """Test that special block supported service families containing a nested block with repeat keyword is correctly instantiated. """ block = knx.KnxBlock(type="DIB_SUPP_SVC_FAMILIES") self.assertEqual(byte.to_int(block.structure_length.value), 4) self.assertEqual(bytes(block.service_family.id), b'\x00') self.assertEqual(bytes(block.service_family.version), b'\x00') block.append(knx.KnxBlock(type="SERVICE_FAMILY")) self.assertEqual(byte.to_int(block.structure_length.value), 6)
def test_05_knx_header_resize(self): """Test that resize changes the value of the field's bytearray""" header = knx.KnxBlock(type="header") header.header_length.size = 2 self.assertEqual(bytes(header.header_length), b'\x00\x06') header.update() self.assertEqual(bytes(header.header_length), b'\x00\x07')
def test_04_knx_header_resize_total_length(self): """Test that header length is updated when a field is expanded.""" header = knx.KnxBlock(type="header") header.total_length.size = 3 header.total_length.value = 123456 header.update() self.assertEqual(bytes(header.header_length), b'\x07')
def test_02_knx_create_field_length(self): """Test that we can craft a block and assign it as frame header.""" new_header = knx.KnxBlock() new_header.append(knx.KnxField(name="gasoline", size=3, is_length=True)) new_header.append(knx.KnxField(name="fuel", size=2, value=666)) new_header.update() self.assertEqual(bytes(new_header.gasoline), b'\x00\x00\x05')
def test_07_knx_header_set_content_different_size(self): """Test behavior when trying to set different size bytearrays as field values.""" header = knx.KnxBlock(type="header") header.service_identifier.value = b'\x10\x10\x10' self.assertEqual(bytes(header.service_identifier), b'\x10\x10') header.service_identifier.value = b'\x10' self.assertEqual(bytes(header.service_identifier), b'\x00\x10')
def test_05_knx_multiple_fields_same_name(self): """Test the behavior in case multiple fields have the same name.""" body = knx.KnxBlock() body.append(knx.KnxField(name="gasoline", size=1, value=1)) body.append(knx.KnxField(name="gasoline", size=2, value=666)) body.gasoline.value = 21 self.assertEqual(bytes(body), b'\x01\x00\x15') body.remove("gasoline") self.assertEqual(bytes(body), b'\x00\x15')
def test_06_knx_header_fixed_value(self): """Test that manual field value changes enable fixed_value boolean, which prevent from automatically updating the field. """ header = knx.KnxBlock(type="header") header.header_length.value = b'\x02' self.assertEqual(bytes(header.header_length), b'\x02') header.update() self.assertEqual(bytes(header.header_length), b'\x02')
def test_03_knx_header_resize(self): """Test that header length is resized automatically when modifying the size of a field. """ header = knx.KnxBlock(type="header") header.service_identifier.size = 3 header.update() self.assertEqual(byte.to_int(header.header_length.value), 7) self.assertEqual(bytes(header), b"\x07\x10\x00\x00\x00\x00\x00")
from sys import path, argv path.append('../') from bof import knx, BOFNetworkError if len(argv) < 2: print("Usage: python {0} IP_ADDRESS".format(argv[0])) else: knxnet = knx.KnxNet() try: knxnet.connect(argv[1], 3671) frame = knx.KnxFrame() frame.header.service_identifier.value = b"\x02\x03" hpai = knx.KnxBlock(type="HPAI") frame.body.append(hpai) print(frame) knxnet.send(bytes(frame)) response = knxnet.receive() print(response) except BOFNetworkError as bne: print(str(bne)) finally: knxnet.disconnect()
def test_02_knx_block_device_info(self): """Test that we can create a valid block from type.""" block = knx.KnxBlock(type="DIB_DEVICE_INFO") self.assertEqual((byte.to_int(bytes(block.structure_length))), 54)
def test_01_knx_block_unknown_type(self): """Test that an exception is rose when creating a block from an unknown template.""" with self.assertRaises(BOFProgrammingError): frame = knx.KnxBlock(type="WTF")
def test_03_knx_append_field(self): """Test the append method of a frame.""" frame = knx.KnxFrame(type="DESCRIPTION REQUEST") frame.append("toto", knx.KnxBlock(type="SERVICE_FAMILY")) self.assertIn("version", frame.attributes)
def test_01_knx_create_field(self): """Test that we can craft a block and assign it as frame header.""" new_header = knx.KnxBlock() new_header.append(knx.KnxField(name="gasoline", size=3, value=666)) self.assertIn("gasoline", new_header.attributes) self.assertEqual(bytes(new_header), b'\x00\x02\x9a')
def test_08_knx_header_set_invalid_content(self): """Test negative value for size.""" header = knx.KnxBlock(type="header") header.header_length.size = -4 self.assertEqual(header.header_length.size, -4) self.assertEqual(bytes(header.header_length), b'')
def test_02_basic_knx_header(self): """Test direct creation of a knx header, automated lengths update is disabled for total length (which is handled at frame level. """ header = knx.KnxBlock(type="header") self.assertEqual(bytes(header), b"\x06\x10\x00\x00\x00\x00")