Source code for dhcpkit_vpp.tests.protocols.test_layer4

"""
Test whether layer 4 parsing and generating works
"""
import unittest
from ipaddress import IPv6Address

from dhcpkit_vpp.protocols.layer3 import IPv6
from dhcpkit_vpp.protocols.layer4 import UDP, UnknownLayer4Protocol
from dhcpkit_vpp.tests.protocols import FrameTestCase


[docs]class UnknownLayer4ProtocolTestCase(FrameTestCase):
[docs] def setUp(self): self.packet_class = UnknownLayer4Protocol self.packet_fixture = b'Demo packet' self.message_fixture = UnknownLayer4Protocol( data=b'Demo packet' ) self.parse_packet()
[docs] def test_length(self): self.assertEqual(self.message_fixture.length, len(self.packet_fixture)) self.assertEqual(self.message.length, len(self.packet_fixture)) self.assertEqual(self.message.length, len(self.packet_fixture)) self.assertEqual(self.length, len(self.packet_fixture))
[docs]class UDPTestCase(FrameTestCase):
[docs] def setUp(self): self.packet_class = UDP # Intentionally using odd number of bytes to test padding self.packet_fixture = bytes.fromhex('123456780017a6b8') + b'Demo UDP packet' self.message_fixture = UDP( source_port=4660, destination_port=22136, checksum=42680, payload=b'Demo UDP packet' ) self.parse_packet()
[docs] def test_checksum_calculation(self): dummy_ipv6 = IPv6( source=IPv6Address('2001:9e0::3:2002'), destination=IPv6Address('2001:9e0:4:32:212:45:32:0222'), ) self.assertEqual(self.message_fixture.checksum, self.message.calculate_checksum(dummy_ipv6))
[docs] def test_validate_source_port(self): self.check_unsigned_integer_property('source_port', 16)
[docs] def test_validate_destination_port(self): self.check_unsigned_integer_property('destination_port', 16)
[docs] def test_validate_checksum(self): self.check_unsigned_integer_property('checksum', 16)
[docs] def test_validate_payload(self): setattr(self.message, 'payload', 0.1) with self.assertRaisesRegex(ValueError, 'bytes'): self.message.validate() setattr(self.message, 'payload', 0) with self.assertRaisesRegex(ValueError, 'bytes'): self.message.validate() setattr(self.message, 'payload', 'Not bytes') with self.assertRaisesRegex(ValueError, 'bytes'): self.message.validate() setattr(self.message, 'payload', b'Bytes!') self.message.validate()
[docs] def test_udp_length(self): with self.assertRaisesRegex(ValueError, '8 bytes'): UDP.parse(bytes.fromhex('00010002000700')) with self.assertRaisesRegex(ValueError, '8 bytes'): UDP.parse(bytes.fromhex('0001000200070000')) UDP.parse(bytes.fromhex('0001000200080000')) with self.assertRaisesRegex(ValueError, 'longer than available buffer'): UDP.parse(bytes.fromhex('0001000200090000'))
[docs] def test_save_zero_checksum(self): saved = self.message_fixture.save(zero_checksum=True) fixture = bytes.fromhex('1234567800170000') + b'Demo UDP packet' self.assertEqual(saved, fixture)
[docs] def test_save_with_checksum_calculation(self): dummy_ipv6 = IPv6( source=IPv6Address('2001:9e0::3:2002'), destination=IPv6Address('2001:9e0:4:32:212:45:32:0222'), ) self.message.checksum = -1 saved = self.message.save(recalculate_checksum_for=dummy_ipv6) self.assertEqual(saved, self.packet_fixture)
if __name__ == '__main__': # pragma: no cover unittest.main()