make test: improve handling of packet captures
[vpp.git] / test / template_bd.py
1 #!/usr/bin/env python
2
3 from abc import abstractmethod, ABCMeta
4
5 from scapy.layers.l2 import Ether, Raw
6 from scapy.layers.inet import IP, UDP
7
8
9 class BridgeDomain(object):
10     """ Bridge domain abstraction """
11     __metaclass__ = ABCMeta
12
13     @property
14     def frame_pg0_to_pg1(self):
15         """ Ethernet frame sent from pg0 and expected to arrive at pg1 """
16         return (Ether(src='00:00:00:00:00:01', dst='00:00:00:00:00:02') /
17                 IP(src='1.2.3.4', dst='4.3.2.1') /
18                 UDP(sport=10000, dport=20000) /
19                 Raw('\xa5' * 100))
20
21     @property
22     def frame_pg1_to_pg0(self):
23         """ Ethernet frame sent from pg1 and expected to arrive at pg0 """
24         return (Ether(src='00:00:00:00:00:02', dst='00:00:00:00:00:01') /
25                 IP(src='4.3.2.1', dst='1.2.3.4') /
26                 UDP(sport=20000, dport=10000) /
27                 Raw('\xa5' * 100))
28
29     @abstractmethod
30     def encapsulate(self, pkt):
31         """ Encapsulate packet """
32         pass
33
34     @abstractmethod
35     def decapsulate(self, pkt):
36         """ Decapsulate packet """
37         pass
38
39     @abstractmethod
40     def check_encapsulation(self, pkt):
41         """ Verify the encapsulation """
42         pass
43
44     def test_decap(self):
45         """ Decapsulation test
46         Send encapsulated frames from pg0
47         Verify receipt of decapsulated frames on pg1
48         """
49
50         encapsulated_pkt = self.encapsulate(self.frame_pg0_to_pg1)
51
52         self.pg0.add_stream([encapsulated_pkt, ])
53
54         self.pg1.enable_capture()
55
56         self.pg_start()
57
58         # Pick first received frame and check if it's the non-encapsulated frame
59         out = self.pg1.get_capture(1)
60         pkt = out[0]
61
62         # TODO: add error messages
63         self.assertEqual(pkt[Ether].src, self.frame_pg0_to_pg1[Ether].src)
64         self.assertEqual(pkt[Ether].dst, self.frame_pg0_to_pg1[Ether].dst)
65         self.assertEqual(pkt[IP].src, self.frame_pg0_to_pg1[IP].src)
66         self.assertEqual(pkt[IP].dst, self.frame_pg0_to_pg1[IP].dst)
67         self.assertEqual(pkt[UDP].sport, self.frame_pg0_to_pg1[UDP].sport)
68         self.assertEqual(pkt[UDP].dport, self.frame_pg0_to_pg1[UDP].dport)
69         self.assertEqual(pkt[Raw], self.frame_pg0_to_pg1[Raw])
70
71     def test_encap(self):
72         """ Encapsulation test
73         Send frames from pg1
74         Verify receipt of encapsulated frames on pg0
75         """
76         self.pg1.add_stream([self.frame_pg1_to_pg0])
77
78         self.pg0.enable_capture()
79
80         self.pg_start()
81
82         # Pick first received frame and check if it's corectly encapsulated.
83         out = self.pg0.get_capture(1)
84         pkt = out[0]
85         self.check_encapsulation(pkt)
86
87         payload = self.decapsulate(pkt)
88         # TODO: add error messages
89         self.assertEqual(payload[Ether].src, self.frame_pg1_to_pg0[Ether].src)
90         self.assertEqual(payload[Ether].dst, self.frame_pg1_to_pg0[Ether].dst)
91         self.assertEqual(payload[IP].src, self.frame_pg1_to_pg0[IP].src)
92         self.assertEqual(payload[IP].dst, self.frame_pg1_to_pg0[IP].dst)
93         self.assertEqual(payload[UDP].sport, self.frame_pg1_to_pg0[UDP].sport)
94         self.assertEqual(payload[UDP].dport, self.frame_pg1_to_pg0[UDP].dport)
95         self.assertEqual(payload[Raw], self.frame_pg1_to_pg0[Raw])