Example #1
0
    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)
Example #2
0
    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)
Example #3
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)
Example #4
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)
Example #5
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)
Example #6
0
    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)
Example #7
0
    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)
Example #8
0
    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,
        )
Example #9
0
    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)