make test: improve handling of packet captures
[vpp.git] / test / util.py
1 import socket
2 import sys
3 from abc import abstractmethod, ABCMeta
4 from cStringIO import StringIO
5
6
7 def ppp(headline, packet):
8     """ Return string containing the output of scapy packet.show() call. """
9     o = StringIO()
10     old_stdout = sys.stdout
11     sys.stdout = o
12     print(headline)
13     packet.show()
14     sys.stdout = old_stdout
15     return o.getvalue()
16
17
18 def ppc(headline, capture, limit=10):
19     """ Return string containing ppp() printout for a capture.
20
21     :param headline: printed as first line of output
22     :param capture: packets to print
23     :param limit: limit the print to # of packets
24     """
25     if not capture:
26         return headline
27     tail = ""
28     if limit < len(capture):
29         tail = "\nPrint limit reached, %s out of %s packets printed" % (
30             len(capture), limit)
31         limit = len(capture)
32     body = "".join([ppp("Packet #%s:" % count, p)
33                     for count, p in zip(range(0, limit), capture)])
34     return "%s\n%s%s" % (headline, body, tail)
35
36
37 class NumericConstant(object):
38     __metaclass__ = ABCMeta
39
40     desc_dict = {}
41
42     @abstractmethod
43     def __init__(self, value):
44         self._value = value
45
46     def __int__(self):
47         return self._value
48
49     def __long__(self):
50         return self._value
51
52     def __str__(self):
53         if self._value in self.desc_dict:
54             return self.desc_dict[self._value]
55         return ""
56
57
58 class Host(object):
59     """ Generic test host "connected" to VPPs interface. """
60
61     @property
62     def mac(self):
63         """ MAC address """
64         return self._mac
65
66     @property
67     def ip4(self):
68         """ IPv4 address """
69         return self._ip4
70
71     @property
72     def ip4n(self):
73         """ IPv4 address """
74         return socket.inet_pton(socket.AF_INET, self._ip4)
75
76     @property
77     def ip6(self):
78         """ IPv6 address """
79         return self._ip6
80
81     def __init__(self, mac=None, ip4=None, ip6=None):
82         self._mac = mac
83         self._ip4 = ip4
84         self._ip6 = ip6