def test__write(self): ts = int(time.time()) expected_time = datetime.fromtimestamp(ts) pkt_sender_mac = '01:02:03:04:05:06' pkt_sender_ip = '192.168.0.1' pkt_target_ip = '192.168.0.2' pkt_target_mac = '00:00:00:00:00:00' eth_src = '02:03:04:05:06:07' eth_dst = 'ff:ff:ff:ff:ff:ff' arp_packet = make_arp_packet(pkt_sender_ip, pkt_sender_mac, pkt_target_ip, pkt_target_mac) arp = ARP(arp_packet, time=ts, src_mac=hex_str_to_bytes(eth_src), dst_mac=hex_str_to_bytes(eth_dst), vid=100) out = io.StringIO() arp.write(out) expected_output = dedent("""\ ARP observed at {expected_time}: 802.1q VLAN ID (VID): 100 (0x064) Ethernet source: {eth_src} Ethernet destination: {eth_dst} Hardware type: 0x0001 Protocol type: 0x0800 Hardware address length: 6 Protocol address length: 4 Operation: 1 (request) Sender hardware address: {pkt_sender_mac} Sender protocol address: {pkt_sender_ip} Target hardware address: {pkt_target_mac} Target protocol address: {pkt_target_ip} """) self.assertThat(out.getvalue().strip(), Equals(expected_output.format(**locals()).strip()))
def test__bindings__skips_null_source_eui_for_request(self): pkt_sender_mac = '00:00:00:00:00:00' pkt_sender_ip = '192.168.0.1' pkt_target_ip = '192.168.0.2' pkt_target_mac = '00:00:00:00:00:00' arp = ARP(make_arp_packet( pkt_sender_ip, pkt_sender_mac, pkt_target_ip, pkt_target_mac, op=ARP_OPERATION.REQUEST)) self.assertItemsEqual(arp.bindings(), [])
def test__bindings__skips_null_target_eui_in_reply(self): pkt_sender_mac = '01:02:03:04:05:06' pkt_sender_ip = '192.168.0.1' pkt_target_ip = '192.168.0.2' pkt_target_mac = '00:00:00:00:00:00' arp = ARP(make_arp_packet( pkt_sender_ip, pkt_sender_mac, pkt_target_ip, pkt_target_mac, op=ARP_OPERATION.REPLY)) self.assertItemsEqual( arp.bindings(), [(IPAddress(pkt_sender_ip), EUI(pkt_sender_mac))])
def test__bindings__returns_sender_for_request(self): pkt_sender_mac = '01:02:03:04:05:06' pkt_sender_ip = '192.168.0.1' pkt_target_ip = '192.168.0.2' pkt_target_mac = '00:00:00:00:00:00' arp = ARP(make_arp_packet( pkt_sender_ip, pkt_sender_mac, pkt_target_ip, pkt_target_mac, op=ARP_OPERATION.REQUEST)) self.assertItemsEqual( arp.bindings(), [(IPAddress(pkt_sender_ip), EUI(pkt_sender_mac))])
def test__bindings__skips_null_source_ip_for_request(self): pkt_sender_mac = "01:02:03:04:05:06" pkt_sender_ip = "0.0.0.0" pkt_target_ip = "192.168.0.2" pkt_target_mac = "00:00:00:00:00:00" arp = ARP( make_arp_packet( pkt_sender_ip, pkt_sender_mac, pkt_target_ip, pkt_target_mac, op=ARP_OPERATION.REQUEST, )) self.assertItemsEqual(arp.bindings(), [])
def test__bindings__skips_null_source_eui_in_reply(self): pkt_sender_mac = "00:00:00:00:00:00" pkt_sender_ip = "192.168.0.1" pkt_target_ip = "192.168.0.2" pkt_target_mac = "02:03:04:05:06:07" arp = ARP( make_arp_packet( pkt_sender_ip, pkt_sender_mac, pkt_target_ip, pkt_target_mac, op=ARP_OPERATION.REPLY, )) self.assertItemsEqual( arp.bindings(), [(IPAddress(pkt_target_ip), EUI(pkt_target_mac))])
def test__bindings__returns_sender_and_target_for_reply(self): pkt_sender_mac = "01:02:03:04:05:06" pkt_sender_ip = "192.168.0.1" pkt_target_ip = "192.168.0.2" pkt_target_mac = "02:03:04:05:06:07" arp = ARP( make_arp_packet( pkt_sender_ip, pkt_sender_mac, pkt_target_ip, pkt_target_mac, op=ARP_OPERATION.REPLY, )) self.assertItemsEqual( arp.bindings(), [ (IPAddress(pkt_sender_ip), EUI(pkt_sender_mac)), (IPAddress(pkt_target_ip), EUI(pkt_target_mac)), ], )
def test__properties(self): pkt_sender_mac = '01:02:03:04:05:06' pkt_sender_ip = '192.168.0.1' pkt_target_ip = '192.168.0.2' pkt_target_mac = '00:00:00:00:00:00' eth_src = '02:03:04:05:06:07' eth_dst = 'ff:ff:ff:ff:ff:ff' arp_packet = make_arp_packet(pkt_sender_ip, pkt_sender_mac, pkt_target_ip, pkt_target_mac) arp = ARP(arp_packet, src_mac=hex_str_to_bytes(eth_src), dst_mac=hex_str_to_bytes(eth_dst)) self.assertThat(arp.source_eui, Equals(EUI(pkt_sender_mac))) self.assertThat(arp.target_eui, Equals(EUI(pkt_target_mac))) self.assertThat(arp.source_ip, Equals(IPAddress(pkt_sender_ip))) self.assertThat(arp.target_ip, Equals(IPAddress(pkt_target_ip)))
def test__properties(self): pkt_sender_mac = "01:02:03:04:05:06" pkt_sender_ip = "192.168.0.1" pkt_target_ip = "192.168.0.2" pkt_target_mac = "00:00:00:00:00:00" eth_src = "02:03:04:05:06:07" eth_dst = "ff:ff:ff:ff:ff:ff" arp_packet = make_arp_packet(pkt_sender_ip, pkt_sender_mac, pkt_target_ip, pkt_target_mac) arp = ARP( arp_packet, src_mac=hex_str_to_bytes(eth_src), dst_mac=hex_str_to_bytes(eth_dst), ) self.assertThat(arp.source_eui, Equals(EUI(pkt_sender_mac))) self.assertThat(arp.target_eui, Equals(EUI(pkt_target_mac))) self.assertThat(arp.source_ip, Equals(IPAddress(pkt_sender_ip))) self.assertThat(arp.target_ip, Equals(IPAddress(pkt_target_ip)))
def test__is_valid__fails_for_invalid_packets(self): arp = ARP(b"\x00" * 28) self.assertFalse(arp.is_valid()) arp = ARP( make_arp_packet( "192.168.0.1", "01:02:03:04:05:06", "192.168.0.2", hardware_type="0x0000", )) self.assertFalse(arp.is_valid()) arp = ARP( make_arp_packet( "192.168.0.1", "01:02:03:04:05:06", "192.168.0.2", protocol="0x0000", )) self.assertFalse(arp.is_valid()) arp = ARP( make_arp_packet( "192.168.0.1", "01:02:03:04:05:06", "192.168.0.2", hardware_length="0x00", )) self.assertFalse(arp.is_valid()) arp = ARP( make_arp_packet( "192.168.0.1", "01:02:03:04:05:06", "192.168.0.2", protocol_length="0x00", )) self.assertFalse(arp.is_valid())
def test__is_valid__succeeds_for_normal_packet(self): arp_packet = make_arp_packet("192.168.0.1", "01:02:03:04:05:06", "192.168.0.2") arp = ARP(arp_packet) self.assertTrue(arp.is_valid())
def test__is_valid__fails_for_invalid_packets(self): arp = ARP(b'\x00' * 28) self.assertFalse(arp.is_valid()) arp = ARP( make_arp_packet('192.168.0.1', '01:02:03:04:05:06', '192.168.0.2', hardware_type='0x0000')) self.assertFalse(arp.is_valid()) arp = ARP( make_arp_packet('192.168.0.1', '01:02:03:04:05:06', '192.168.0.2', protocol='0x0000')) self.assertFalse(arp.is_valid()) arp = ARP( make_arp_packet('192.168.0.1', '01:02:03:04:05:06', '192.168.0.2', hardware_length='0x00')) self.assertFalse(arp.is_valid()) arp = ARP( make_arp_packet('192.168.0.1', '01:02:03:04:05:06', '192.168.0.2', protocol_length='0x00')) self.assertFalse(arp.is_valid())