session: default to using memfd mq segments
[vpp.git] / src / vcl / test / test_vcl.py
1 #!/usr/bin/env python3
2 """ Vpp VCL tests """
3
4 import unittest
5 import os
6 import subprocess
7 import signal
8 from framework import VppTestCase, VppTestRunner, running_extended_tests, \
9     Worker
10 from vpp_ip_route import VppIpTable, VppIpRoute, VppRoutePath, FibPathProto
11
12 iperf3 = '/usr/bin/iperf3'
13
14
15 def have_app(app):
16     try:
17         subprocess.check_output([app, '-v'])
18     except (subprocess.CalledProcessError, OSError):
19         return False
20     return True
21
22
23 _have_iperf3 = have_app(iperf3)
24
25
26 class VCLAppWorker(Worker):
27     """ VCL Test Application Worker """
28
29     def __init__(self, build_dir, appname, executable_args, logger, env=None,
30                  *args, **kwargs):
31
32         if env is None:
33             env = {}
34         vcl_lib_dir = "%s/vpp/lib" % build_dir
35         if "iperf" in appname:
36             app = appname
37             env.update({'LD_PRELOAD':
38                         "%s/libvcl_ldpreload.so" % vcl_lib_dir})
39         elif "sock" in appname:
40             app = "%s/vpp/bin/%s" % (build_dir, appname)
41             env.update({'LD_PRELOAD':
42                         "%s/libvcl_ldpreload.so" % vcl_lib_dir})
43         else:
44             app = "%s/vpp/bin/%s" % (build_dir, appname)
45         self.args = [app] + executable_args
46         super(VCLAppWorker, self).__init__(self.args, logger, env,
47                                            *args, **kwargs)
48
49
50 class VCLTestCase(VppTestCase):
51     """ VCL Test Class """
52
53     @classmethod
54     def setUpClass(cls):
55         super(VCLTestCase, cls).setUpClass()
56
57     @classmethod
58     def tearDownClass(cls):
59         super(VCLTestCase, cls).tearDownClass()
60
61     def setUp(self):
62         var = "VPP_BUILD_DIR"
63         self.build_dir = os.getenv(var, None)
64         if self.build_dir is None:
65             raise EnvironmentError("Environment variable `%s' not set" % var)
66         self.vppDebug = 'vpp_debug' in self.build_dir
67         self.server_addr = "127.0.0.1"
68         self.server_port = "22000"
69         self.server_args = [self.server_port]
70         self.server_ipv6_addr = "::1"
71         self.server_ipv6_args = ["-6", self.server_port]
72         self.timeout = 20
73         self.echo_phrase = "Hello, world! Jenny is a friend of mine."
74         self.pre_test_sleep = 0.3
75         self.post_test_sleep = 0.2
76
77         if os.path.isfile("/tmp/ldp_server_af_unix_socket"):
78             os.remove("/tmp/ldp_server_af_unix_socket")
79
80         super(VCLTestCase, self).setUp()
81
82     def cut_thru_setup(self):
83         self.vapi.session_enable_disable(is_enabled=1)
84
85     def cut_thru_tear_down(self):
86         self.vapi.session_enable_disable(is_enabled=0)
87
88     def cut_thru_test(self, server_app, server_args, client_app, client_args):
89         self.env = {'VCL_VPP_API_SOCKET': self.api_sock,
90                     'VCL_APP_SCOPE_LOCAL': "true"}
91         worker_server = VCLAppWorker(self.build_dir, server_app, server_args,
92                                      self.logger, self.env)
93         worker_server.start()
94         self.sleep(self.pre_test_sleep)
95         worker_client = VCLAppWorker(self.build_dir, client_app, client_args,
96                                      self.logger, self.env)
97         worker_client.start()
98         worker_client.join(self.timeout)
99         try:
100             self.validateResults(worker_client, worker_server, self.timeout)
101         except Exception as error:
102             self.fail("Failed with %s" % error)
103         self.sleep(self.post_test_sleep)
104
105     def thru_host_stack_setup(self):
106         self.vapi.session_enable_disable(is_enabled=1)
107         self.create_loopback_interfaces(2)
108
109         table_id = 1
110
111         for i in self.lo_interfaces:
112             i.admin_up()
113
114             if table_id != 0:
115                 tbl = VppIpTable(self, table_id)
116                 tbl.add_vpp_config()
117
118             i.set_table_ip4(table_id)
119             i.config_ip4()
120             table_id += 1
121
122         # Configure namespaces
123         self.vapi.app_namespace_add_del(namespace_id="1", secret=1234,
124                                         sw_if_index=self.loop0.sw_if_index)
125         self.vapi.app_namespace_add_del(namespace_id="2", secret=5678,
126                                         sw_if_index=self.loop1.sw_if_index)
127
128         # Add inter-table routes
129         ip_t01 = VppIpRoute(self, self.loop1.local_ip4, 32,
130                             [VppRoutePath("0.0.0.0",
131                                           0xffffffff,
132                                           nh_table_id=2)], table_id=1)
133         ip_t10 = VppIpRoute(self, self.loop0.local_ip4, 32,
134                             [VppRoutePath("0.0.0.0",
135                                           0xffffffff,
136                                           nh_table_id=1)], table_id=2)
137         ip_t01.add_vpp_config()
138         ip_t10.add_vpp_config()
139         self.logger.debug(self.vapi.cli("show ip fib"))
140
141     def thru_host_stack_tear_down(self):
142         for i in self.lo_interfaces:
143             i.unconfig_ip4()
144             i.set_table_ip4(0)
145             i.admin_down()
146
147     def thru_host_stack_ipv6_setup(self):
148         self.vapi.session_enable_disable(is_enabled=1)
149         self.create_loopback_interfaces(2)
150
151         table_id = 1
152
153         for i in self.lo_interfaces:
154             i.admin_up()
155
156             tbl = VppIpTable(self, table_id, is_ip6=1)
157             tbl.add_vpp_config()
158
159             i.set_table_ip6(table_id)
160             i.config_ip6()
161             table_id += 1
162
163         # Configure namespaces
164         self.vapi.app_namespace_add_del(namespace_id="1", secret=1234,
165                                         sw_if_index=self.loop0.sw_if_index)
166         self.vapi.app_namespace_add_del(namespace_id="2", secret=5678,
167                                         sw_if_index=self.loop1.sw_if_index)
168
169         # Add inter-table routes
170         ip_t01 = VppIpRoute(self, self.loop1.local_ip6, 128,
171                             [VppRoutePath("::0", 0xffffffff,
172                                           nh_table_id=2)],
173                             table_id=1)
174         ip_t10 = VppIpRoute(self, self.loop0.local_ip6, 128,
175                             [VppRoutePath("::0", 0xffffffff,
176                                           nh_table_id=1)],
177                             table_id=2)
178         ip_t01.add_vpp_config()
179         ip_t10.add_vpp_config()
180         self.logger.debug(self.vapi.cli("show interface addr"))
181         self.logger.debug(self.vapi.cli("show ip6 fib"))
182
183     def thru_host_stack_ipv6_tear_down(self):
184         for i in self.lo_interfaces:
185             i.unconfig_ip6()
186             i.set_table_ip6(0)
187             i.admin_down()
188
189         self.vapi.session_enable_disable(is_enabled=0)
190
191     @unittest.skipUnless(_have_iperf3, "'%s' not found, Skipping.")
192     def thru_host_stack_test(self, server_app, server_args,
193                              client_app, client_args):
194         self.env = {'VCL_VPP_API_SOCKET': self.api_sock,
195                     'VCL_APP_SCOPE_GLOBAL': "true",
196                     'VCL_APP_NAMESPACE_ID': "1",
197                     'VCL_APP_NAMESPACE_SECRET': "1234"}
198
199         worker_server = VCLAppWorker(self.build_dir, server_app, server_args,
200                                      self.logger, self.env)
201         worker_server.start()
202         self.sleep(self.pre_test_sleep)
203
204         self.env.update({'VCL_APP_NAMESPACE_ID': "2",
205                          'VCL_APP_NAMESPACE_SECRET': "5678"})
206         worker_client = VCLAppWorker(self.build_dir, client_app, client_args,
207                                      self.logger, self.env)
208         worker_client.start()
209         worker_client.join(self.timeout)
210
211         try:
212             self.validateResults(worker_client, worker_server, self.timeout)
213         except Exception as error:
214             self.fail("Failed with %s" % error)
215         self.sleep(self.post_test_sleep)
216
217     def validateResults(self, worker_client, worker_server, timeout):
218         if worker_server.process is None:
219             raise RuntimeError('worker_server is not running.')
220         if os.path.isdir('/proc/{}'.format(worker_server.process.pid)):
221             self.logger.info("Killing server worker process (pid %d)" %
222                              worker_server.process.pid)
223             os.killpg(os.getpgid(worker_server.process.pid), signal.SIGTERM)
224             worker_server.join()
225         self.logger.info("Client worker result is `%s'" % worker_client.result)
226         error = False
227         if worker_client.result is None:
228             try:
229                 error = True
230                 self.logger.error(
231                     "Timeout: %ss! Killing client worker process (pid %d)" %
232                     (timeout, worker_client.process.pid))
233                 os.killpg(os.getpgid(worker_client.process.pid),
234                           signal.SIGKILL)
235                 worker_client.join()
236             except OSError:
237                 self.logger.debug(
238                     "Couldn't kill client worker process")
239                 raise
240         if error:
241             raise RuntimeError(
242                 "Timeout! Client worker did not finish in %ss" % timeout)
243         self.assert_equal(worker_client.result, 0, "Binary test return code")
244
245
246 class LDPCutThruTestCase(VCLTestCase):
247     """ LDP Cut Thru Tests """
248
249     @classmethod
250     def setUpClass(cls):
251         super(LDPCutThruTestCase, cls).setUpClass()
252
253     @classmethod
254     def tearDownClass(cls):
255         super(LDPCutThruTestCase, cls).tearDownClass()
256
257     def setUp(self):
258         super(LDPCutThruTestCase, self).setUp()
259
260         self.cut_thru_setup()
261         self.client_echo_test_args = ["-E", self.echo_phrase, "-X",
262                                       self.server_addr, self.server_port]
263         self.client_iperf3_timeout = 20
264         self.client_iperf3_args = ["-V4d", "-t 2", "-c", self.server_addr]
265         self.server_iperf3_args = ["-V4d", "-s"]
266         self.client_uni_dir_nsock_timeout = 20
267         self.client_uni_dir_nsock_test_args = ["-N", "1000", "-U", "-X",
268                                                "-I", "2",
269                                                self.server_addr,
270                                                self.server_port]
271         self.client_bi_dir_nsock_timeout = 20
272         self.client_bi_dir_nsock_test_args = ["-N", "1000", "-B", "-X",
273                                               "-I", "2",
274                                               self.server_addr,
275                                               self.server_port]
276
277     def tearDown(self):
278         super(LDPCutThruTestCase, self).tearDown()
279         self.cut_thru_tear_down()
280
281     def show_commands_at_teardown(self):
282         self.logger.debug(self.vapi.cli("show session verbose 2"))
283
284     @unittest.skipUnless(running_extended_tests, "part of extended tests")
285     def test_ldp_cut_thru_echo(self):
286         """ run LDP cut thru echo test """
287
288         self.cut_thru_test("sock_test_server", self.server_args,
289                            "sock_test_client", self.client_echo_test_args)
290
291     @unittest.skipUnless(_have_iperf3, "'%s' not found, Skipping.")
292     def test_ldp_cut_thru_iperf3(self):
293         """ run LDP cut thru iperf3 test """
294
295         self.timeout = self.client_iperf3_timeout
296         self.cut_thru_test(iperf3, self.server_iperf3_args,
297                            iperf3, self.client_iperf3_args)
298
299     @unittest.skipUnless(running_extended_tests, "part of extended tests")
300     def test_ldp_cut_thru_uni_dir_nsock(self):
301         """ run LDP cut thru uni-directional (multiple sockets) test """
302
303         self.timeout = self.client_uni_dir_nsock_timeout
304         self.cut_thru_test("sock_test_server", self.server_args,
305                            "sock_test_client",
306                            self.client_uni_dir_nsock_test_args)
307
308     @unittest.skipUnless(running_extended_tests, "part of extended tests")
309     @unittest.skip("sock test apps need to be improved")
310     def test_ldp_cut_thru_bi_dir_nsock(self):
311         """ run LDP cut thru bi-directional (multiple sockets) test """
312
313         self.timeout = self.client_bi_dir_nsock_timeout
314         self.cut_thru_test("sock_test_server", self.server_args,
315                            "sock_test_client",
316                            self.client_bi_dir_nsock_test_args)
317
318
319 class VCLCutThruTestCase(VCLTestCase):
320     """ VCL Cut Thru Tests """
321
322     @classmethod
323     def setUpClass(cls):
324         super(VCLCutThruTestCase, cls).setUpClass()
325
326     @classmethod
327     def tearDownClass(cls):
328         super(VCLCutThruTestCase, cls).tearDownClass()
329
330     def setUp(self):
331         super(VCLCutThruTestCase, self).setUp()
332
333         self.cut_thru_setup()
334         self.client_echo_test_args = ["-E", self.echo_phrase, "-X",
335                                       self.server_addr, self.server_port]
336
337         self.client_uni_dir_nsock_timeout = 20
338         self.client_uni_dir_nsock_test_args = ["-N", "1000", "-U", "-X",
339                                                "-I", "2",
340                                                self.server_addr,
341                                                self.server_port]
342         self.client_bi_dir_nsock_timeout = 20
343         self.client_bi_dir_nsock_test_args = ["-N", "1000", "-B", "-X",
344                                               "-I", "2",
345                                               self.server_addr,
346                                               self.server_port]
347
348     def tearDown(self):
349         super(VCLCutThruTestCase, self).tearDown()
350
351     def show_commands_at_teardown(self):
352         self.logger.debug(self.vapi.cli("show session verbose 2"))
353
354     def test_vcl_cut_thru_echo(self):
355         """ run VCL cut thru echo test """
356
357         self.cut_thru_test("vcl_test_server", self.server_args,
358                            "vcl_test_client", self.client_echo_test_args)
359
360     def test_vcl_cut_thru_uni_dir_nsock(self):
361         """ run VCL cut thru uni-directional (multiple sockets) test """
362
363         self.timeout = self.client_uni_dir_nsock_timeout
364         self.cut_thru_test("vcl_test_server", self.server_args,
365                            "vcl_test_client",
366                            self.client_uni_dir_nsock_test_args)
367
368     def test_vcl_cut_thru_bi_dir_nsock(self):
369         """ run VCL cut thru bi-directional (multiple sockets) test """
370
371         self.timeout = self.client_bi_dir_nsock_timeout
372         self.cut_thru_test("vcl_test_server", self.server_args,
373                            "vcl_test_client",
374                            self.client_bi_dir_nsock_test_args)
375
376
377 class VCLThruHostStackEcho(VCLTestCase):
378     """ VCL Thru Host Stack Echo """
379
380     @classmethod
381     def setUpClass(cls):
382         super(VCLThruHostStackEcho, cls).setUpClass()
383
384     @classmethod
385     def tearDownClass(cls):
386         super(VCLThruHostStackEcho, cls).tearDownClass()
387
388     def setUp(self):
389         super(VCLThruHostStackEcho, self).setUp()
390
391         self.thru_host_stack_setup()
392         self.client_bi_dir_nsock_timeout = 20
393         self.client_bi_dir_nsock_test_args = ["-N", "1000", "-B", "-X",
394                                               "-I", "2",
395                                               self.loop0.local_ip4,
396                                               self.server_port]
397         self.client_echo_test_args = ["-E", self.echo_phrase, "-X",
398                                       self.loop0.local_ip4,
399                                       self.server_port]
400
401     def tearDown(self):
402         self.thru_host_stack_tear_down()
403         super(VCLThruHostStackEcho, self).tearDown()
404
405     def show_commands_at_teardown(self):
406         self.logger.debug(self.vapi.cli("show app server"))
407         self.logger.debug(self.vapi.cli("show session verbose"))
408
409
410 class VCLThruHostStackTLS(VCLTestCase):
411     """ VCL Thru Host Stack TLS """
412
413     @classmethod
414     def setUpClass(cls):
415         super(VCLThruHostStackTLS, cls).setUpClass()
416
417     @classmethod
418     def tearDownClass(cls):
419         super(VCLThruHostStackTLS, cls).tearDownClass()
420
421     def setUp(self):
422         super(VCLThruHostStackTLS, self).setUp()
423
424         self.thru_host_stack_setup()
425         self.client_uni_dir_tls_timeout = 20
426         self.server_tls_args = ["-L", self.server_port]
427         self.client_uni_dir_tls_test_args = ["-N", "1000", "-U", "-X", "-L",
428                                              self.loop0.local_ip4,
429                                              self.server_port]
430
431     def test_vcl_thru_host_stack_tls_uni_dir(self):
432         """ run VCL thru host stack uni-directional TLS test """
433
434         self.timeout = self.client_uni_dir_tls_timeout
435         self.thru_host_stack_test("vcl_test_server", self.server_tls_args,
436                                   "vcl_test_client",
437                                   self.client_uni_dir_tls_test_args)
438
439     def tearDown(self):
440         self.thru_host_stack_tear_down()
441         super(VCLThruHostStackTLS, self).tearDown()
442
443     def show_commands_at_teardown(self):
444         self.logger.debug(self.vapi.cli("show app server"))
445         self.logger.debug(self.vapi.cli("show session verbose 2"))
446
447
448 class VCLThruHostStackBidirNsock(VCLTestCase):
449     """ VCL Thru Host Stack Bidir Nsock """
450
451     @classmethod
452     def setUpClass(cls):
453         super(VCLThruHostStackBidirNsock, cls).setUpClass()
454
455     @classmethod
456     def tearDownClass(cls):
457         super(VCLThruHostStackBidirNsock, cls).tearDownClass()
458
459     def setUp(self):
460         super(VCLThruHostStackBidirNsock, self).setUp()
461
462         self.thru_host_stack_setup()
463         self.client_bi_dir_nsock_timeout = 20
464         self.client_bi_dir_nsock_test_args = ["-N", "1000", "-B", "-X",
465                                               "-I", "2",
466                                               self.loop0.local_ip4,
467                                               self.server_port]
468         self.client_echo_test_args = ["-E", self.echo_phrase, "-X",
469                                       self.loop0.local_ip4,
470                                       self.server_port]
471
472     def tearDown(self):
473         self.thru_host_stack_tear_down()
474         super(VCLThruHostStackBidirNsock, self).tearDown()
475
476     def show_commands_at_teardown(self):
477         self.logger.debug(self.vapi.cli("show session verbose 2"))
478
479     def test_vcl_thru_host_stack_bi_dir_nsock(self):
480         """ run VCL thru host stack bi-directional (multiple sockets) test """
481
482         self.timeout = self.client_bi_dir_nsock_timeout
483         self.thru_host_stack_test("vcl_test_server", self.server_args,
484                                   "vcl_test_client",
485                                   self.client_bi_dir_nsock_test_args)
486
487
488 class LDPThruHostStackBidirNsock(VCLTestCase):
489     """ LDP Thru Host Stack Bidir Nsock """
490
491     @classmethod
492     def setUpClass(cls):
493         super(LDPThruHostStackBidirNsock, cls).setUpClass()
494
495     @classmethod
496     def tearDownClass(cls):
497         super(LDPThruHostStackBidirNsock, cls).tearDownClass()
498
499     def setUp(self):
500         super(LDPThruHostStackBidirNsock, self).setUp()
501
502         self.thru_host_stack_setup()
503         self.client_bi_dir_nsock_timeout = 20
504         self.client_bi_dir_nsock_test_args = ["-N", "1000", "-B", "-X",
505                                               # OUCH! Host Stack Bug?
506                                               # Only fails when running
507                                               # 'make test TEST_JOBS=auto'
508                                               # or TEST_JOBS > 1
509                                               # "-I", "2",
510                                               self.loop0.local_ip4,
511                                               self.server_port]
512
513     def tearDown(self):
514         self.thru_host_stack_tear_down()
515         super(LDPThruHostStackBidirNsock, self).tearDown()
516
517     def show_commands_at_teardown(self):
518         self.logger.debug(self.vapi.cli("show session verbose 2"))
519
520     def test_ldp_thru_host_stack_bi_dir_nsock(self):
521         """ run LDP thru host stack bi-directional (multiple sockets) test """
522
523         self.timeout = self.client_bi_dir_nsock_timeout
524         self.thru_host_stack_test("sock_test_server", self.server_args,
525                                   "sock_test_client",
526                                   self.client_bi_dir_nsock_test_args)
527
528
529 class LDPThruHostStackNsock(VCLTestCase):
530     """ LDP Thru Host Stack Nsock """
531
532     @classmethod
533     def setUpClass(cls):
534         super(LDPThruHostStackNsock, cls).setUpClass()
535
536     @classmethod
537     def tearDownClass(cls):
538         super(LDPThruHostStackNsock, cls).tearDownClass()
539
540     def setUp(self):
541         super(LDPThruHostStackNsock, self).setUp()
542
543         self.thru_host_stack_setup()
544         if self.vppDebug:
545             self.client_uni_dir_nsock_timeout = 20
546             self.numSockets = "2"
547         else:
548             self.client_uni_dir_nsock_timeout = 20
549             self.numSockets = "5"
550
551         self.client_uni_dir_nsock_test_args = ["-N", "1000", "-U", "-X",
552                                                "-I", self.numSockets,
553                                                self.loop0.local_ip4,
554                                                self.server_port]
555
556     def tearDown(self):
557         self.thru_host_stack_tear_down()
558         super(LDPThruHostStackNsock, self).tearDown()
559
560     def test_ldp_thru_host_stack_uni_dir_nsock(self):
561         """ run LDP thru host stack uni-directional (multiple sockets) test """
562
563         self.timeout = self.client_uni_dir_nsock_timeout
564         self.thru_host_stack_test("sock_test_server", self.server_args,
565                                   "sock_test_client",
566                                   self.client_uni_dir_nsock_test_args)
567
568
569 class VCLThruHostStackNsock(VCLTestCase):
570     """ VCL Thru Host Stack Nsock """
571
572     @classmethod
573     def setUpClass(cls):
574         super(VCLThruHostStackNsock, cls).setUpClass()
575
576     @classmethod
577     def tearDownClass(cls):
578         super(VCLThruHostStackNsock, cls).tearDownClass()
579
580     def setUp(self):
581         super(VCLThruHostStackNsock, self).setUp()
582
583         self.thru_host_stack_setup()
584         if self.vppDebug:
585             self.client_uni_dir_nsock_timeout = 20
586             self.numSockets = "2"
587         else:
588             self.client_uni_dir_nsock_timeout = 20
589             self.numSockets = "5"
590
591         self.client_uni_dir_nsock_test_args = ["-N", "1000", "-U", "-X",
592                                                "-I", self.numSockets,
593                                                self.loop0.local_ip4,
594                                                self.server_port]
595
596     def tearDown(self):
597         self.thru_host_stack_tear_down()
598         super(VCLThruHostStackNsock, self).tearDown()
599
600     def test_vcl_thru_host_stack_uni_dir_nsock(self):
601         """ run VCL thru host stack uni-directional (multiple sockets) test """
602
603         self.timeout = self.client_uni_dir_nsock_timeout
604         self.thru_host_stack_test("vcl_test_server", self.server_args,
605                                   "vcl_test_client",
606                                   self.client_uni_dir_nsock_test_args)
607
608
609 class LDPThruHostStackIperf(VCLTestCase):
610     """ LDP Thru Host Stack Iperf  """
611
612     @classmethod
613     def setUpClass(cls):
614         super(LDPThruHostStackIperf, cls).setUpClass()
615
616     @classmethod
617     def tearDownClass(cls):
618         super(LDPThruHostStackIperf, cls).tearDownClass()
619
620     def setUp(self):
621         super(LDPThruHostStackIperf, self).setUp()
622
623         self.thru_host_stack_setup()
624         self.client_iperf3_timeout = 20
625         self.client_iperf3_args = ["-V4d", "-t 2", "-c", self.loop0.local_ip4]
626         self.server_iperf3_args = ["-V4d", "-s"]
627
628     def tearDown(self):
629         self.thru_host_stack_tear_down()
630         super(LDPThruHostStackIperf, self).tearDown()
631
632     def show_commands_at_teardown(self):
633         self.logger.debug(self.vapi.cli("show session verbose 2"))
634
635     @unittest.skipUnless(_have_iperf3, "'%s' not found, Skipping.")
636     def test_ldp_thru_host_stack_iperf3(self):
637         """ run LDP thru host stack iperf3 test """
638
639         self.timeout = self.client_iperf3_timeout
640         self.thru_host_stack_test(iperf3, self.server_iperf3_args,
641                                   iperf3, self.client_iperf3_args)
642
643
644 class LDPThruHostStackIperfUdp(VCLTestCase):
645     """ LDP Thru Host Stack Iperf UDP """
646
647     @classmethod
648     def setUpClass(cls):
649         super(LDPThruHostStackIperfUdp, cls).setUpClass()
650
651     @classmethod
652     def tearDownClass(cls):
653         super(LDPThruHostStackIperfUdp, cls).tearDownClass()
654
655     def setUp(self):
656         super(LDPThruHostStackIperfUdp, self).setUp()
657
658         self.thru_host_stack_setup()
659         self.client_iperf3_timeout = 20
660         self.client_iperf3_args = ["-V4d", "-t 2", "-u", "-l 1400",
661                                    "-c", self.loop0.local_ip4]
662         self.server_iperf3_args = ["-V4d", "-s"]
663
664     def tearDown(self):
665         self.thru_host_stack_tear_down()
666         super(LDPThruHostStackIperfUdp, self).tearDown()
667
668     def show_commands_at_teardown(self):
669         self.logger.debug(self.vapi.cli("show session verbose 2"))
670
671     @unittest.skipUnless(_have_iperf3, "'%s' not found, Skipping.")
672     def test_ldp_thru_host_stack_iperf3_udp(self):
673         """ run LDP thru host stack iperf3 UDP test """
674
675         self.timeout = self.client_iperf3_timeout
676         self.thru_host_stack_test(iperf3, self.server_iperf3_args,
677                                   iperf3, self.client_iperf3_args)
678
679
680 class LDPIpv6CutThruTestCase(VCLTestCase):
681     """ LDP IPv6 Cut Thru Tests """
682
683     @classmethod
684     def setUpClass(cls):
685         super(LDPIpv6CutThruTestCase, cls).setUpClass()
686
687     @classmethod
688     def tearDownClass(cls):
689         super(LDPIpv6CutThruTestCase, cls).tearDownClass()
690
691     def setUp(self):
692         super(LDPIpv6CutThruTestCase, self).setUp()
693
694         self.cut_thru_setup()
695         self.client_iperf3_timeout = 20
696         self.client_uni_dir_nsock_timeout = 20
697         self.client_bi_dir_nsock_timeout = 20
698         self.client_ipv6_echo_test_args = ["-6", "-E", self.echo_phrase, "-X",
699                                            self.server_ipv6_addr,
700                                            self.server_port]
701         self.client_ipv6_iperf3_args = ["-V6d", "-t 2", "-c",
702                                         self.server_ipv6_addr]
703         self.server_ipv6_iperf3_args = ["-V6d", "-s"]
704         self.client_ipv6_uni_dir_nsock_test_args = ["-N", "1000", "-U", "-X",
705                                                     "-6",
706                                                     "-I", "2",
707                                                     self.server_ipv6_addr,
708                                                     self.server_port]
709         self.client_ipv6_bi_dir_nsock_test_args = ["-N", "1000", "-B", "-X",
710                                                    "-6",
711                                                    "-I", "2",
712                                                    self.server_ipv6_addr,
713                                                    self.server_port]
714
715     def tearDown(self):
716         super(LDPIpv6CutThruTestCase, self).tearDown()
717         self.cut_thru_tear_down()
718
719     def test_ldp_ipv6_cut_thru_echo(self):
720         """ run LDP IPv6 cut thru echo test """
721
722         self.cut_thru_test("sock_test_server",
723                            self.server_ipv6_args,
724                            "sock_test_client",
725                            self.client_ipv6_echo_test_args)
726
727     @unittest.skipUnless(_have_iperf3, "'%s' not found, Skipping.")
728     @unittest.skipUnless(running_extended_tests, "part of extended tests")
729     def test_ldp_ipv6_cut_thru_iperf3(self):
730         """ run LDP IPv6 cut thru iperf3 test """
731
732         self.timeout = self.client_iperf3_timeout
733         self.cut_thru_test(iperf3, self.server_ipv6_iperf3_args,
734                            iperf3, self.client_ipv6_iperf3_args)
735
736     @unittest.skipUnless(running_extended_tests, "part of extended tests")
737     def test_ldp_ipv6_cut_thru_uni_dir_nsock(self):
738         """ run LDP IPv6 cut thru uni-directional (multiple sockets) test """
739
740         self.timeout = self.client_uni_dir_nsock_timeout
741         self.cut_thru_test("sock_test_server", self.server_ipv6_args,
742                            "sock_test_client",
743                            self.client_ipv6_uni_dir_nsock_test_args)
744
745     @unittest.skipUnless(running_extended_tests, "part of extended tests")
746     @unittest.skip("sock test apps need to be improved")
747     def test_ldp_ipv6_cut_thru_bi_dir_nsock(self):
748         """ run LDP IPv6 cut thru bi-directional (multiple sockets) test """
749
750         self.timeout = self.client_bi_dir_nsock_timeout
751         self.cut_thru_test("sock_test_server", self.server_ipv6_args,
752                            "sock_test_client",
753                            self.client_ipv6_bi_dir_nsock_test_args)
754
755
756 class VCLIpv6CutThruTestCase(VCLTestCase):
757     """ VCL IPv6 Cut Thru Tests """
758
759     @classmethod
760     def setUpClass(cls):
761         super(VCLIpv6CutThruTestCase, cls).setUpClass()
762
763     @classmethod
764     def tearDownClass(cls):
765         super(VCLIpv6CutThruTestCase, cls).tearDownClass()
766
767     def setUp(self):
768         super(VCLIpv6CutThruTestCase, self).setUp()
769
770         self.cut_thru_setup()
771         self.client_uni_dir_nsock_timeout = 20
772         self.client_bi_dir_nsock_timeout = 20
773         self.client_ipv6_echo_test_args = ["-6", "-E", self.echo_phrase, "-X",
774                                            self.server_ipv6_addr,
775                                            self.server_port]
776         self.client_ipv6_uni_dir_nsock_test_args = ["-N", "1000", "-U", "-X",
777                                                     "-6",
778                                                     "-I", "2",
779                                                     self.server_ipv6_addr,
780                                                     self.server_port]
781         self.client_ipv6_bi_dir_nsock_test_args = ["-N", "1000", "-B", "-X",
782                                                    "-6",
783                                                    "-I", "2",
784                                                    self.server_ipv6_addr,
785                                                    self.server_port]
786
787     def tearDown(self):
788         super(VCLIpv6CutThruTestCase, self).tearDown()
789         self.cut_thru_tear_down()
790
791     def test_vcl_ipv6_cut_thru_echo(self):
792         """ run VCL IPv6 cut thru echo test """
793
794         self.cut_thru_test("vcl_test_server",
795                            self.server_ipv6_args,
796                            "vcl_test_client",
797                            self.client_ipv6_echo_test_args)
798
799     @unittest.skipUnless(running_extended_tests, "part of extended tests")
800     def test_vcl_ipv6_cut_thru_uni_dir_nsock(self):
801         """ run VCL IPv6 cut thru uni-directional (multiple sockets) test """
802
803         self.timeout = self.client_uni_dir_nsock_timeout
804         self.cut_thru_test("vcl_test_server", self.server_ipv6_args,
805                            "vcl_test_client",
806                            self.client_ipv6_uni_dir_nsock_test_args)
807
808     @unittest.skipUnless(running_extended_tests, "part of extended tests")
809     def test_vcl_ipv6_cut_thru_bi_dir_nsock(self):
810         """ run VCL IPv6 cut thru bi-directional (multiple sockets) test """
811
812         self.timeout = self.client_bi_dir_nsock_timeout
813         self.cut_thru_test("vcl_test_server", self.server_ipv6_args,
814                            "vcl_test_client",
815                            self.client_ipv6_bi_dir_nsock_test_args)
816
817
818 class VCLIpv6ThruHostStackEcho(VCLTestCase):
819     """ VCL IPv6 Thru Host Stack Echo """
820
821     @classmethod
822     def setUpClass(cls):
823         super(VCLIpv6ThruHostStackEcho, cls).setUpClass()
824
825     @classmethod
826     def tearDownClass(cls):
827         super(VCLIpv6ThruHostStackEcho, cls).tearDownClass()
828
829     def setUp(self):
830         super(VCLIpv6ThruHostStackEcho, self).setUp()
831
832         self.thru_host_stack_ipv6_setup()
833         self.client_ipv6_echo_test_args = ["-6", "-E", self.echo_phrase, "-X",
834                                            self.loop0.local_ip6,
835                                            self.server_port]
836
837     def tearDown(self):
838         self.thru_host_stack_ipv6_tear_down()
839         super(VCLIpv6ThruHostStackEcho, self).tearDown()
840
841     def test_vcl_ipv6_thru_host_stack_echo(self):
842         """ run VCL IPv6 thru host stack echo test """
843
844         self.thru_host_stack_test("vcl_test_server",
845                                   self.server_ipv6_args,
846                                   "vcl_test_client",
847                                   self.client_ipv6_echo_test_args)
848
849
850 if __name__ == '__main__':
851     unittest.main(testRunner=VppTestRunner)