def test_header_validate_length(self): """ Tests that we validate the length is encodable """ out_buf = bytearray(message.HEADER_LEN) with self.assertRaises(CodecException): header = message.MessageHeader() header.encode(out_buf, 0, 0x00FFFFFF + 1) with self.assertRaises(CodecException): header = message.MessageHeader() header.encode(out_buf, 0, -1)
def test_header_validate_ete_id(self): """ Tests that we validate the ete id is encodable """ out_buf = bytearray(message.HEADER_LEN) with self.assertRaises(CodecException): header = message.MessageHeader() header.end_to_end_id = 0xFFFFFFFF + 1 header.encode(out_buf, 0, 0) with self.assertRaises(CodecException): header = message.MessageHeader() header.end_to_end_id = -1 header.encode(out_buf, 0, 0)
def test_header_validate_command_code(self): """ Tests that we validate the command code is encodable """ out_buf = bytearray(message.HEADER_LEN) with self.assertRaises(CodecException): header = message.MessageHeader() header.command_code = 0x00FFFFFF + 1 header.encode(out_buf, 0, 0) with self.assertRaises(CodecException): header = message.MessageHeader() header.command_code = -1 header.encode(out_buf, 0, 0)
def test_header_validate_version(self): """ Tests that we validate the version is encodable """ out_buf = bytearray(message.HEADER_LEN) with self.assertRaises(CodecException): header = message.MessageHeader() header.version = 0xFF + 1 header.encode(out_buf, 0, 0) with self.assertRaises(CodecException): header = message.MessageHeader() header.version = -1 header.encode(out_buf, 0, 0)
def test_respond(self): """ Tests that we can use the convenience clone constructor and create_response_header method for copying fields from header """ # Set some non-defaults we will clone header = message.MessageHeader() header.version = 0x2 header.command_code = 0x3 header.application_id = 0x4 header.hop_by_hop_id = 0x5 header.end_to_end_id = 0x6 header.request = True header.retransmitted = True header.error = True header.proxiable = True msg = message.Message(header) msg.append_avp(avp.AVP('User-Name', '')) # A clone should be almost equal resp = message.Message.create_response_msg(msg) # These fields are reset self.assertFalse(resp.header.request) self.assertFalse(resp.header.retransmitted) self.assertFalse(resp.header.error) self.assertEqual(len(resp._avps), 0) # Now they should be equal resp.header.request = msg.header.request resp.header.retransmitted = msg.header.retransmitted resp.header.error = msg.header.error self.assertEqual(msg.header, resp.header)
def test_clone_and_respond(self): """ Tests that we can use the convenience clone constructor and create_response_header method for copying fields from header """ # Set some non-defaults we will clone header = message.MessageHeader() header.version = 0x2 header.command_code = 0x3 header.application_id = 0x4 header.hop_by_hop_id = 0x5 header.end_to_end_id = 0x6 header.request = True header.retransmitted = True header.error = True header.proxiable = True # A clone should be identical clone = message.MessageHeader.copy(header) self.assertEqual(header, clone) # A clone should be almost equal resp = message.MessageHeader.create_response_header(header) # These fields are reset self.assertFalse(resp.request) self.assertFalse(resp.retransmitted) self.assertFalse(resp.error) # Now they should be equal resp.request = header.request resp.retransmitted = header.retransmitted resp.error = header.error self.assertEqual(header, resp)
def test_write(self): """ Test that we can use the message header flag properties to flip the bits of the command_flags field """ header = message.MessageHeader() # Set reserved bit to validate we are not overriding command_flags # and are properly doing the bit flipping header.command_flags = 0x01 header.retransmitted = True self.assertEqual(header.command_flags, 0x11) header.retransmitted = False self.assertEqual(header.command_flags, 0x01) header.error = True self.assertEqual(header.command_flags, 0x21) header.error = False self.assertEqual(header.command_flags, 0x01) header.proxiable = True self.assertEqual(header.command_flags, 0x41) header.proxiable = False self.assertEqual(header.command_flags, 0x01) header.request = True self.assertEqual(header.command_flags, 0x81) header.request = False self.assertEqual(header.command_flags, 0x01)
def test_header_basic(self): """Test that we can encode and decode message header""" # The default message header is all zeros except the version number header = message.MessageHeader() self._compare_header( header, b'\x01' + b'\x00' * (message.HEADER_LEN - 1), 0, ) # Next three bytes are the length self._compare_header( header, b'\x01\x00\x00\x02' + b'\x00' * (message.HEADER_LEN - 4), 2, ) # Next is our command flags header.command_flags = 0x1f self._compare_header( header, b'\x01\x00\x00\x02\x1f' + b'\x00' * (message.HEADER_LEN - 5), 2, ) # Command code is the next three bytes header.command_code = 0x1 self._compare_header( header, b'\x01\x00\x00\x02\x1f\x00\x00\x01' + b'\x00' * (message.HEADER_LEN - 8), 2, ) # Application id is the next four bytes header.application_id = 0x7 self._compare_header( header, b'\x01\x00\x00\x02\x1f\x00\x00\x01' + b'\x00\x00\x00\x07' + b'\x00' * (message.HEADER_LEN - 12), 2, ) # hop by hop id is the next four bytes header.hop_by_hop_id = 0xb33f0000 self._compare_header( header, b'\x01\x00\x00\x02\x1f\x00\x00\x01' + b'\x00\x00\x00\x07\xb3\x3f\x00\x00' + b'\x00' * (message.HEADER_LEN - 16), 2, ) # end to end id is the last four header.end_to_end_id = 0x0000dead self._compare_header( header, b'\x01\x00\x00\x02\x1f\x00\x00\x01' + b'\x00\x00\x00\x07\xb3\x3f\x00\x00' + b'\x00\x00\xde\xad', 2, )
def test_read(self): """ Tests that we can use the flag properties to read bits of command_flags """ header = message.MessageHeader() # It all starts off as false self.assertFalse(header.retransmitted) self.assertFalse(header.error) self.assertFalse(header.proxiable) self.assertFalse(header.request) header.command_flags = 0x10 self.assertTrue(header.retransmitted) header.command_flags = 0x20 self.assertTrue(header.error) header.command_flags = 0x40 self.assertTrue(header.proxiable) header.command_flags = 0x80 self.assertTrue(header.request)