def test_encode_header_invalid_length(self): method = 0x0001 message_class = MessageClass.Request transaction_id = 123 invalid_message_lengths = [-1, 0x1FFFF] for message_length in invalid_message_lengths: data_description = f"case for message_length={message_length}" with self.assertRaises(AssertionError, msg=data_description): _encode_message_header( message_class, method, message_length, transaction_id )
def test_encode_zero_header(self): method = 0x0 message_class = 0x0 transaction_id = 0x0 message_length = 0x0 encoded_header = _encode_message_header(message_class, method, message_length, transaction_id) self.assertIsInstance(encoded_header, bytes) self.assertEqual(len(encoded_header), 20) self.assertEqual(encoded_header, b"\x00" * 4 + MAGIC_COOKIE.to_bytes(4, "big") + b"\x00" * 12)
def test_encode_header_valid_message_class(self): method = 0x0001 message_classes = list(MessageClass) message_length = 12 transaction_id = 0 for message_class in message_classes: case_message = f"for message_class={message_class}" encoded_header = _encode_message_header(message_class, method, message_length, transaction_id) message_type = int.from_bytes(encoded_header[0:2], case_message) self.assertEqual(len(encoded_header), 20, case_message) self.assertEqual(message_class, message_type & 0x0110, case_message)
def test_encode_header_valid_transaction_id(self): transaction_ids = [0, 1, 2**96 - 1] method = 0x0001 message_class = MessageClass.Request message_length = 12 for transaction_id in transaction_ids: data_description = f"case for transaction_id={transaction_id}" encoded_header = _encode_message_header( message_class, method, message_length, transaction_id ) transaction_id_bytes = encoded_header[8:] transaction_id_decoded = int.from_bytes(transaction_id_bytes, "big") self.assertEqual(len(encoded_header), 20, data_description) self.assertIsInstance(encoded_header, bytes, data_description) self.assertEqual(transaction_id_decoded, transaction_id, data_description)
def test_encode_header_valid_method(self): method_type_pairs = [ (0b0, 0b0), (0b111111111111, 0b11111011101111), (0b101010101010, 0b10101001001010), (0b010101010101, 0b01010010100101), ] message_class = MessageClass.Request message_length = 13 transaction_id = 123 for method, message_type in method_type_pairs: encoded_header = _encode_message_header( message_class, method, message_length, transaction_id ) message_type_decoded = int.from_bytes(encoded_header[0:2], "big") self.assertEqual(len(encoded_header), 20) self.assertIsInstance(encoded_header, bytes) self.assertEqual(message_type_decoded, message_type)
def test_encode_testcase_header(self): testcases = [ "bind-request-packet.json", "bind-response-success-packet.json", "bind-response-error-401-packet.json" ] for testcase in testcases: header, payload, message_fields = load_message_testcase(testcase) method = message_fields["method"] message_class = message_fields["message_class"] message_length = len(payload) transaction_id = message_fields["transaction_id"] encoded_header = _encode_message_header( message_class, method, message_length, transaction_id ) self.assertIsInstance(encoded_header, bytes) self.assertEqual(len(encoded_header), 20) self.assertEqual(encoded_header, header)