7 from vpp_papi.vpp_stats import VPPStats
9 from framework import tag_fixme_vpp_workers
10 from framework import VppTestCase, VppTestRunner
11 from scapy.layers.l2 import Ether
12 from scapy.layers.inet import IP
15 @tag_fixme_vpp_workers
16 class StatsClientTestCase(VppTestCase):
17 """Test Stats Client"""
21 super(StatsClientTestCase, cls).setUpClass()
24 def tearDownClass(cls):
25 super(StatsClientTestCase, cls).tearDownClass()
28 def setUpConstants(cls):
29 cls.extra_vpp_statseg_config = "per-node-counters on"
30 cls.extra_vpp_statseg_config += "update-interval 0.05"
31 super(StatsClientTestCase, cls).setUpConstants()
33 def test_set_errors(self):
35 self.assertEqual(self.statistics.set_errors(), {})
37 self.statistics.get_counter('/err/ethernet-input/no error'), [0])
39 def test_client_fd_leak(self):
40 """Test file descriptor count - VPP-1486"""
44 initial_fds = p.num_fds()
47 stats = VPPStats(socketname=cls.get_stats_sock_path())
50 ending_fds = p.num_fds()
51 self.assertEqual(initial_fds, ending_fds,
52 "initial client side file descriptor count: %s "
54 "ending client side file descriptor count: %s" % (
55 initial_fds, ending_fds))
57 def test_symlink_values(self):
58 """Test symlinks reported values"""
59 self.create_pg_interfaces(range(2))
61 for i in self.pg_interfaces:
68 packet = (Ether(src=self.pg0.remote_mac, dst=self.pg0.local_mac) /
69 IP(src=self.pg0.remote_ip4, dst=self.pg1.remote_ip4))
72 self.send_and_expect(self.pg0, p, self.pg1)
74 pg1_tx = self.statistics.get_counter('/interfaces/pg1/tx')
75 if_tx = self.statistics.get_counter('/if/tx')
77 self.assertEqual(pg1_tx[0]['bytes'],
78 if_tx[0][self.pg1.sw_if_index]['bytes'])
79 for i in self.pg_interfaces:
83 def test_symlink_add_del_interfaces(self):
84 """Test symlinks when adding and deleting interfaces"""
85 # We first create and delete interfaces
86 self.create_loopback_interfaces(1)
87 self.create_pg_interfaces(range(1))
88 self.loop0.remove_vpp_config()
89 self.create_pg_interfaces(range(2))
91 for i in self.pg_interfaces:
99 packet = (Ether(src=self.pg0.remote_mac, dst=self.pg0.local_mac) /
100 IP(src=self.pg0.remote_ip4, dst=self.pg1.remote_ip4))
101 bytes_to_send += len(packet)
104 tx_before_sending = self.statistics.get_counter('/interfaces/pg1/tx')
105 rx_before_sending = self.statistics.get_counter('/interfaces/pg0/rx')
106 self.send_and_expect(self.pg0, p, self.pg1)
107 tx = self.statistics.get_counter('/interfaces/pg1/tx')
108 rx = self.statistics.get_counter('/interfaces/pg0/rx')
110 # We wait for nodes symlinks to update (interfaces created/deleted).
111 # ... and packets to be sent
115 vectors = self.statistics.get_counter('/nodes/pg1-tx/vectors')
117 raise ValueError("Nodes counters are not up to date")
120 t, v, tb = sys.exc_info()
125 six.reraise(t, v, tb)
127 self.assertEqual(tx[0]['bytes'] - tx_before_sending[0]['bytes'],
129 self.assertEqual(tx[0]['packets'] - tx_before_sending[0]['packets'],
131 self.assertEqual(rx[0]['bytes'] - rx_before_sending[0]['bytes'],
133 self.assertEqual(rx[0]['packets'] - rx_before_sending[0]['packets'],
135 self.assertEqual(vectors[0], rx[0]['packets'])
137 for i in self.pg_interfaces:
141 def test_index_consistency(self):
142 """Test index consistency despite changes in the stats"""
143 d = self.statistics.ls(['/if/names'])
144 self.create_loopback_interfaces(10)
147 s = self.statistics.dump(d)
152 self.assertEqual(len(v), 11)
154 for i in self.lo_interfaces:
155 i.remove_vpp_config()
157 @unittest.skip("Manual only")
158 def test_mem_leak(self):
160 print('Running loop')
162 rv = self.vapi.papi.tap_create_v2(id=i, use_random_mac=1)
163 self.assertEqual(rv.retval, 0)
164 rv = self.vapi.papi.tap_delete_v2(sw_if_index=rv.sw_if_index)
165 self.assertEqual(rv.retval, 0)
167 before = self.statistics.get_counter('/mem/statseg/used')
169 self.vapi.cli("memory-trace on stats-segment")
172 print(self.vapi.cli("show memory stats-segment verbose"))
173 print('AFTER', before,
174 self.statistics.get_counter('/mem/statseg/used'))
177 if __name__ == '__main__':
178 unittest.main(testRunner=VppTestRunner)