tests: fix worker thread initialization
[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_API_PREFIX': self.shm_prefix,
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=b"1", secret=1234,
124                                         sw_if_index=self.loop0.sw_if_index)
125         self.vapi.app_namespace_add_del(namespace_id=b"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=b"1", secret=1234,
165                                         sw_if_index=self.loop0.sw_if_index)
166         self.vapi.app_namespace_add_del(namespace_id=b"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_API_PREFIX': self.shm_prefix,
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         if self.vppDebug:
504             self.client_bi_dir_nsock_timeout = 20
505             self.client_bi_dir_nsock_test_args = ["-N", "1000", "-B", "-X",
506                                                   # OUCH! Host Stack Bug?
507                                                   # "-I", "2",
508                                                   self.loop0.local_ip4,
509                                                   self.server_port]
510         else:
511             self.client_bi_dir_nsock_timeout = 20
512             self.client_bi_dir_nsock_test_args = ["-N", "1000", "-B", "-X",
513                                                   # OUCH! Host Stack Bug?
514                                                   # "-I", "2",
515                                                   self.loop0.local_ip4,
516                                                   self.server_port]
517
518     def tearDown(self):
519         self.thru_host_stack_tear_down()
520         super(LDPThruHostStackBidirNsock, self).tearDown()
521
522     def show_commands_at_teardown(self):
523         self.logger.debug(self.vapi.cli("show session verbose 2"))
524
525     def test_ldp_thru_host_stack_bi_dir_nsock(self):
526         """ run LDP thru host stack bi-directional (multiple sockets) test """
527
528         self.timeout = self.client_bi_dir_nsock_timeout
529         self.thru_host_stack_test("sock_test_server", self.server_args,
530                                   "sock_test_client",
531                                   self.client_bi_dir_nsock_test_args)
532
533
534 class LDPThruHostStackNsock(VCLTestCase):
535     """ LDP Thru Host Stack Nsock """
536
537     @classmethod
538     def setUpClass(cls):
539         super(LDPThruHostStackNsock, cls).setUpClass()
540
541     @classmethod
542     def tearDownClass(cls):
543         super(LDPThruHostStackNsock, cls).tearDownClass()
544
545     def setUp(self):
546         super(LDPThruHostStackNsock, self).setUp()
547
548         self.thru_host_stack_setup()
549         if self.vppDebug:
550             self.client_uni_dir_nsock_timeout = 20
551             self.numSockets = "2"
552         else:
553             self.client_uni_dir_nsock_timeout = 20
554             self.numSockets = "5"
555
556         self.client_uni_dir_nsock_test_args = ["-N", "1000", "-U", "-X",
557                                                "-I", self.numSockets,
558                                                self.loop0.local_ip4,
559                                                self.server_port]
560
561     def tearDown(self):
562         self.thru_host_stack_tear_down()
563         super(LDPThruHostStackNsock, self).tearDown()
564
565     def test_ldp_thru_host_stack_uni_dir_nsock(self):
566         """ run LDP thru host stack uni-directional (multiple sockets) test """
567
568         self.timeout = self.client_uni_dir_nsock_timeout
569         self.thru_host_stack_test("sock_test_server", self.server_args,
570                                   "sock_test_client",
571                                   self.client_uni_dir_nsock_test_args)
572
573
574 class VCLThruHostStackNsock(VCLTestCase):
575     """ VCL Thru Host Stack Nsock """
576
577     @classmethod
578     def setUpClass(cls):
579         super(VCLThruHostStackNsock, cls).setUpClass()
580
581     @classmethod
582     def tearDownClass(cls):
583         super(VCLThruHostStackNsock, cls).tearDownClass()
584
585     def setUp(self):
586         super(VCLThruHostStackNsock, self).setUp()
587
588         self.thru_host_stack_setup()
589         if self.vppDebug:
590             self.client_uni_dir_nsock_timeout = 20
591             self.numSockets = "2"
592         else:
593             self.client_uni_dir_nsock_timeout = 20
594             self.numSockets = "5"
595
596         self.client_uni_dir_nsock_test_args = ["-N", "1000", "-U", "-X",
597                                                "-I", self.numSockets,
598                                                self.loop0.local_ip4,
599                                                self.server_port]
600
601     def tearDown(self):
602         self.thru_host_stack_tear_down()
603         super(VCLThruHostStackNsock, self).tearDown()
604
605     def test_vcl_thru_host_stack_uni_dir_nsock(self):
606         """ run VCL thru host stack uni-directional (multiple sockets) test """
607
608         self.timeout = self.client_uni_dir_nsock_timeout
609         self.thru_host_stack_test("vcl_test_server", self.server_args,
610                                   "vcl_test_client",
611                                   self.client_uni_dir_nsock_test_args)
612
613
614 class LDPThruHostStackIperf(VCLTestCase):
615     """ LDP Thru Host Stack Iperf  """
616
617     @classmethod
618     def setUpClass(cls):
619         super(LDPThruHostStackIperf, cls).setUpClass()
620
621     @classmethod
622     def tearDownClass(cls):
623         super(LDPThruHostStackIperf, cls).tearDownClass()
624
625     def setUp(self):
626         super(LDPThruHostStackIperf, self).setUp()
627
628         self.thru_host_stack_setup()
629         self.client_iperf3_timeout = 20
630         self.client_iperf3_args = ["-V4d", "-t 2", "-c", self.loop0.local_ip4]
631         self.server_iperf3_args = ["-V4d", "-s"]
632
633     def tearDown(self):
634         self.thru_host_stack_tear_down()
635         super(LDPThruHostStackIperf, self).tearDown()
636
637     def show_commands_at_teardown(self):
638         self.logger.debug(self.vapi.cli("show session verbose 2"))
639
640     @unittest.skipUnless(_have_iperf3, "'%s' not found, Skipping.")
641     def test_ldp_thru_host_stack_iperf3(self):
642         """ run LDP thru host stack iperf3 test """
643
644         self.timeout = self.client_iperf3_timeout
645         self.thru_host_stack_test(iperf3, self.server_iperf3_args,
646                                   iperf3, self.client_iperf3_args)
647
648
649 class LDPIpv6CutThruTestCase(VCLTestCase):
650     """ LDP IPv6 Cut Thru Tests """
651
652     @classmethod
653     def setUpClass(cls):
654         super(LDPIpv6CutThruTestCase, cls).setUpClass()
655
656     @classmethod
657     def tearDownClass(cls):
658         super(LDPIpv6CutThruTestCase, cls).tearDownClass()
659
660     def setUp(self):
661         super(LDPIpv6CutThruTestCase, self).setUp()
662
663         self.cut_thru_setup()
664         self.client_iperf3_timeout = 20
665         self.client_uni_dir_nsock_timeout = 20
666         self.client_bi_dir_nsock_timeout = 20
667         self.client_ipv6_echo_test_args = ["-6", "-E", self.echo_phrase, "-X",
668                                            self.server_ipv6_addr,
669                                            self.server_port]
670         self.client_ipv6_iperf3_args = ["-V6d", "-t 2", "-c",
671                                         self.server_ipv6_addr]
672         self.server_ipv6_iperf3_args = ["-V6d", "-s"]
673         self.client_ipv6_uni_dir_nsock_test_args = ["-N", "1000", "-U", "-X",
674                                                     "-6",
675                                                     "-I", "2",
676                                                     self.server_ipv6_addr,
677                                                     self.server_port]
678         self.client_ipv6_bi_dir_nsock_test_args = ["-N", "1000", "-B", "-X",
679                                                    "-6",
680                                                    "-I", "2",
681                                                    self.server_ipv6_addr,
682                                                    self.server_port]
683
684     def tearDown(self):
685         super(LDPIpv6CutThruTestCase, self).tearDown()
686         self.cut_thru_tear_down()
687
688     def test_ldp_ipv6_cut_thru_echo(self):
689         """ run LDP IPv6 cut thru echo test """
690
691         self.cut_thru_test("sock_test_server",
692                            self.server_ipv6_args,
693                            "sock_test_client",
694                            self.client_ipv6_echo_test_args)
695
696     @unittest.skipUnless(_have_iperf3, "'%s' not found, Skipping.")
697     @unittest.skipUnless(running_extended_tests, "part of extended tests")
698     def test_ldp_ipv6_cut_thru_iperf3(self):
699         """ run LDP IPv6 cut thru iperf3 test """
700
701         self.timeout = self.client_iperf3_timeout
702         self.cut_thru_test(iperf3, self.server_ipv6_iperf3_args,
703                            iperf3, self.client_ipv6_iperf3_args)
704
705     @unittest.skipUnless(running_extended_tests, "part of extended tests")
706     def test_ldp_ipv6_cut_thru_uni_dir_nsock(self):
707         """ run LDP IPv6 cut thru uni-directional (multiple sockets) test """
708
709         self.timeout = self.client_uni_dir_nsock_timeout
710         self.cut_thru_test("sock_test_server", self.server_ipv6_args,
711                            "sock_test_client",
712                            self.client_ipv6_uni_dir_nsock_test_args)
713
714     @unittest.skipUnless(running_extended_tests, "part of extended tests")
715     @unittest.skip("sock test apps need to be improved")
716     def test_ldp_ipv6_cut_thru_bi_dir_nsock(self):
717         """ run LDP IPv6 cut thru bi-directional (multiple sockets) test """
718
719         self.timeout = self.client_bi_dir_nsock_timeout
720         self.cut_thru_test("sock_test_server", self.server_ipv6_args,
721                            "sock_test_client",
722                            self.client_ipv6_bi_dir_nsock_test_args)
723
724
725 class VCLIpv6CutThruTestCase(VCLTestCase):
726     """ VCL IPv6 Cut Thru Tests """
727
728     @classmethod
729     def setUpClass(cls):
730         super(VCLIpv6CutThruTestCase, cls).setUpClass()
731
732     @classmethod
733     def tearDownClass(cls):
734         super(VCLIpv6CutThruTestCase, cls).tearDownClass()
735
736     def setUp(self):
737         super(VCLIpv6CutThruTestCase, self).setUp()
738
739         self.cut_thru_setup()
740         self.client_uni_dir_nsock_timeout = 20
741         self.client_bi_dir_nsock_timeout = 20
742         self.client_ipv6_echo_test_args = ["-6", "-E", self.echo_phrase, "-X",
743                                            self.server_ipv6_addr,
744                                            self.server_port]
745         self.client_ipv6_uni_dir_nsock_test_args = ["-N", "1000", "-U", "-X",
746                                                     "-6",
747                                                     "-I", "2",
748                                                     self.server_ipv6_addr,
749                                                     self.server_port]
750         self.client_ipv6_bi_dir_nsock_test_args = ["-N", "1000", "-B", "-X",
751                                                    "-6",
752                                                    "-I", "2",
753                                                    self.server_ipv6_addr,
754                                                    self.server_port]
755
756     def tearDown(self):
757         super(VCLIpv6CutThruTestCase, self).tearDown()
758         self.cut_thru_tear_down()
759
760     def test_vcl_ipv6_cut_thru_echo(self):
761         """ run VCL IPv6 cut thru echo test """
762
763         self.cut_thru_test("vcl_test_server",
764                            self.server_ipv6_args,
765                            "vcl_test_client",
766                            self.client_ipv6_echo_test_args)
767
768     @unittest.skipUnless(running_extended_tests, "part of extended tests")
769     def test_vcl_ipv6_cut_thru_uni_dir_nsock(self):
770         """ run VCL IPv6 cut thru uni-directional (multiple sockets) test """
771
772         self.timeout = self.client_uni_dir_nsock_timeout
773         self.cut_thru_test("vcl_test_server", self.server_ipv6_args,
774                            "vcl_test_client",
775                            self.client_ipv6_uni_dir_nsock_test_args)
776
777     @unittest.skipUnless(running_extended_tests, "part of extended tests")
778     def test_vcl_ipv6_cut_thru_bi_dir_nsock(self):
779         """ run VCL IPv6 cut thru bi-directional (multiple sockets) test """
780
781         self.timeout = self.client_bi_dir_nsock_timeout
782         self.cut_thru_test("vcl_test_server", self.server_ipv6_args,
783                            "vcl_test_client",
784                            self.client_ipv6_bi_dir_nsock_test_args)
785
786
787 class VCLIpv6ThruHostStackEcho(VCLTestCase):
788     """ VCL IPv6 Thru Host Stack Echo """
789
790     @classmethod
791     def setUpClass(cls):
792         super(VCLIpv6ThruHostStackEcho, cls).setUpClass()
793
794     @classmethod
795     def tearDownClass(cls):
796         super(VCLIpv6ThruHostStackEcho, cls).tearDownClass()
797
798     def setUp(self):
799         super(VCLIpv6ThruHostStackEcho, self).setUp()
800
801         self.thru_host_stack_ipv6_setup()
802         self.client_ipv6_echo_test_args = ["-6", "-E", self.echo_phrase, "-X",
803                                            self.loop0.local_ip6,
804                                            self.server_port]
805
806     def tearDown(self):
807         self.thru_host_stack_ipv6_tear_down()
808         super(VCLIpv6ThruHostStackEcho, self).tearDown()
809
810     def test_vcl_ipv6_thru_host_stack_echo(self):
811         """ run VCL IPv6 thru host stack echo test """
812
813         self.thru_host_stack_test("vcl_test_server",
814                                   self.server_ipv6_args,
815                                   "vcl_test_client",
816                                   self.client_ipv6_echo_test_args)
817
818
819 if __name__ == '__main__':
820     unittest.main(testRunner=VppTestRunner)