d49bfbcaa359d45ee8348cb5b3c901731a133632
[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="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_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 LDPThruHostStackIperfUdp(VCLTestCase):
650     """ LDP Thru Host Stack Iperf UDP """
651
652     @classmethod
653     def setUpClass(cls):
654         super(LDPThruHostStackIperfUdp, cls).setUpClass()
655
656     @classmethod
657     def tearDownClass(cls):
658         super(LDPThruHostStackIperfUdp, cls).tearDownClass()
659
660     def setUp(self):
661         super(LDPThruHostStackIperfUdp, self).setUp()
662
663         self.thru_host_stack_setup()
664         self.client_iperf3_timeout = 20
665         self.client_iperf3_args = ["-V4d", "-t 2", "-u", "-l 1400",
666                                    "-c", self.loop0.local_ip4]
667         self.server_iperf3_args = ["-V4d", "-s"]
668
669     def tearDown(self):
670         self.thru_host_stack_tear_down()
671         super(LDPThruHostStackIperfUdp, self).tearDown()
672
673     def show_commands_at_teardown(self):
674         self.logger.debug(self.vapi.cli("show session verbose 2"))
675
676     @unittest.skipUnless(_have_iperf3, "'%s' not found, Skipping.")
677     def test_ldp_thru_host_stack_iperf3_udp(self):
678         """ run LDP thru host stack iperf3 UDP test """
679
680         self.timeout = self.client_iperf3_timeout
681         self.thru_host_stack_test(iperf3, self.server_iperf3_args,
682                                   iperf3, self.client_iperf3_args)
683
684
685 class LDPIpv6CutThruTestCase(VCLTestCase):
686     """ LDP IPv6 Cut Thru Tests """
687
688     @classmethod
689     def setUpClass(cls):
690         super(LDPIpv6CutThruTestCase, cls).setUpClass()
691
692     @classmethod
693     def tearDownClass(cls):
694         super(LDPIpv6CutThruTestCase, cls).tearDownClass()
695
696     def setUp(self):
697         super(LDPIpv6CutThruTestCase, self).setUp()
698
699         self.cut_thru_setup()
700         self.client_iperf3_timeout = 20
701         self.client_uni_dir_nsock_timeout = 20
702         self.client_bi_dir_nsock_timeout = 20
703         self.client_ipv6_echo_test_args = ["-6", "-E", self.echo_phrase, "-X",
704                                            self.server_ipv6_addr,
705                                            self.server_port]
706         self.client_ipv6_iperf3_args = ["-V6d", "-t 2", "-c",
707                                         self.server_ipv6_addr]
708         self.server_ipv6_iperf3_args = ["-V6d", "-s"]
709         self.client_ipv6_uni_dir_nsock_test_args = ["-N", "1000", "-U", "-X",
710                                                     "-6",
711                                                     "-I", "2",
712                                                     self.server_ipv6_addr,
713                                                     self.server_port]
714         self.client_ipv6_bi_dir_nsock_test_args = ["-N", "1000", "-B", "-X",
715                                                    "-6",
716                                                    "-I", "2",
717                                                    self.server_ipv6_addr,
718                                                    self.server_port]
719
720     def tearDown(self):
721         super(LDPIpv6CutThruTestCase, self).tearDown()
722         self.cut_thru_tear_down()
723
724     def test_ldp_ipv6_cut_thru_echo(self):
725         """ run LDP IPv6 cut thru echo test """
726
727         self.cut_thru_test("sock_test_server",
728                            self.server_ipv6_args,
729                            "sock_test_client",
730                            self.client_ipv6_echo_test_args)
731
732     @unittest.skipUnless(_have_iperf3, "'%s' not found, Skipping.")
733     @unittest.skipUnless(running_extended_tests, "part of extended tests")
734     def test_ldp_ipv6_cut_thru_iperf3(self):
735         """ run LDP IPv6 cut thru iperf3 test """
736
737         self.timeout = self.client_iperf3_timeout
738         self.cut_thru_test(iperf3, self.server_ipv6_iperf3_args,
739                            iperf3, self.client_ipv6_iperf3_args)
740
741     @unittest.skipUnless(running_extended_tests, "part of extended tests")
742     def test_ldp_ipv6_cut_thru_uni_dir_nsock(self):
743         """ run LDP IPv6 cut thru uni-directional (multiple sockets) test """
744
745         self.timeout = self.client_uni_dir_nsock_timeout
746         self.cut_thru_test("sock_test_server", self.server_ipv6_args,
747                            "sock_test_client",
748                            self.client_ipv6_uni_dir_nsock_test_args)
749
750     @unittest.skipUnless(running_extended_tests, "part of extended tests")
751     @unittest.skip("sock test apps need to be improved")
752     def test_ldp_ipv6_cut_thru_bi_dir_nsock(self):
753         """ run LDP IPv6 cut thru bi-directional (multiple sockets) test """
754
755         self.timeout = self.client_bi_dir_nsock_timeout
756         self.cut_thru_test("sock_test_server", self.server_ipv6_args,
757                            "sock_test_client",
758                            self.client_ipv6_bi_dir_nsock_test_args)
759
760
761 class VCLIpv6CutThruTestCase(VCLTestCase):
762     """ VCL IPv6 Cut Thru Tests """
763
764     @classmethod
765     def setUpClass(cls):
766         super(VCLIpv6CutThruTestCase, cls).setUpClass()
767
768     @classmethod
769     def tearDownClass(cls):
770         super(VCLIpv6CutThruTestCase, cls).tearDownClass()
771
772     def setUp(self):
773         super(VCLIpv6CutThruTestCase, self).setUp()
774
775         self.cut_thru_setup()
776         self.client_uni_dir_nsock_timeout = 20
777         self.client_bi_dir_nsock_timeout = 20
778         self.client_ipv6_echo_test_args = ["-6", "-E", self.echo_phrase, "-X",
779                                            self.server_ipv6_addr,
780                                            self.server_port]
781         self.client_ipv6_uni_dir_nsock_test_args = ["-N", "1000", "-U", "-X",
782                                                     "-6",
783                                                     "-I", "2",
784                                                     self.server_ipv6_addr,
785                                                     self.server_port]
786         self.client_ipv6_bi_dir_nsock_test_args = ["-N", "1000", "-B", "-X",
787                                                    "-6",
788                                                    "-I", "2",
789                                                    self.server_ipv6_addr,
790                                                    self.server_port]
791
792     def tearDown(self):
793         super(VCLIpv6CutThruTestCase, self).tearDown()
794         self.cut_thru_tear_down()
795
796     def test_vcl_ipv6_cut_thru_echo(self):
797         """ run VCL IPv6 cut thru echo test """
798
799         self.cut_thru_test("vcl_test_server",
800                            self.server_ipv6_args,
801                            "vcl_test_client",
802                            self.client_ipv6_echo_test_args)
803
804     @unittest.skipUnless(running_extended_tests, "part of extended tests")
805     def test_vcl_ipv6_cut_thru_uni_dir_nsock(self):
806         """ run VCL IPv6 cut thru uni-directional (multiple sockets) test """
807
808         self.timeout = self.client_uni_dir_nsock_timeout
809         self.cut_thru_test("vcl_test_server", self.server_ipv6_args,
810                            "vcl_test_client",
811                            self.client_ipv6_uni_dir_nsock_test_args)
812
813     @unittest.skipUnless(running_extended_tests, "part of extended tests")
814     def test_vcl_ipv6_cut_thru_bi_dir_nsock(self):
815         """ run VCL IPv6 cut thru bi-directional (multiple sockets) test """
816
817         self.timeout = self.client_bi_dir_nsock_timeout
818         self.cut_thru_test("vcl_test_server", self.server_ipv6_args,
819                            "vcl_test_client",
820                            self.client_ipv6_bi_dir_nsock_test_args)
821
822
823 class VCLIpv6ThruHostStackEcho(VCLTestCase):
824     """ VCL IPv6 Thru Host Stack Echo """
825
826     @classmethod
827     def setUpClass(cls):
828         super(VCLIpv6ThruHostStackEcho, cls).setUpClass()
829
830     @classmethod
831     def tearDownClass(cls):
832         super(VCLIpv6ThruHostStackEcho, cls).tearDownClass()
833
834     def setUp(self):
835         super(VCLIpv6ThruHostStackEcho, self).setUp()
836
837         self.thru_host_stack_ipv6_setup()
838         self.client_ipv6_echo_test_args = ["-6", "-E", self.echo_phrase, "-X",
839                                            self.loop0.local_ip6,
840                                            self.server_port]
841
842     def tearDown(self):
843         self.thru_host_stack_ipv6_tear_down()
844         super(VCLIpv6ThruHostStackEcho, self).tearDown()
845
846     def test_vcl_ipv6_thru_host_stack_echo(self):
847         """ run VCL IPv6 thru host stack echo test """
848
849         self.thru_host_stack_test("vcl_test_server",
850                                   self.server_ipv6_args,
851                                   "vcl_test_client",
852                                   self.client_ipv6_echo_test_args)
853
854
855 if __name__ == '__main__':
856     unittest.main(testRunner=VppTestRunner)