vcl/session: tx notifications for cut-thru sessions
[vpp.git] / test / test_vcl.py
1 #!/usr/bin/env python
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, DpoProto
11
12
13 class VCLAppWorker(Worker):
14     """ VCL Test Application Worker """
15
16     def __init__(self, build_dir, appname, args, logger, env={}):
17         vcl_lib_dir = "%s/vpp/lib" % build_dir
18         if "iperf" in appname:
19             app = appname
20             env.update({'LD_PRELOAD':
21                         "%s/libvcl_ldpreload.so" % vcl_lib_dir})
22         elif "sock" in appname:
23             app = "%s/vpp/bin/%s" % (build_dir, appname)
24             env.update({'LD_PRELOAD':
25                         "%s/libvcl_ldpreload.so" % vcl_lib_dir})
26         else:
27             app = "%s/vpp/bin/%s" % (build_dir, appname)
28         self.args = [app] + args
29         super(VCLAppWorker, self).__init__(self.args, logger, env)
30
31
32 class VCLTestCase(VppTestCase):
33     """ VCL Test Class """
34
35     @classmethod
36     def setUpClass(cls):
37         super(VCLTestCase, cls).setUpClass()
38
39     @classmethod
40     def tearDownClass(cls):
41         super(VCLTestCase, cls).tearDownClass()
42
43     def setUp(self):
44         var = "VPP_BUILD_DIR"
45         self.build_dir = os.getenv(var, None)
46         if self.build_dir is None:
47             raise Exception("Environment variable `%s' not set" % var)
48         self.vppDebug = 'vpp_debug' in self.build_dir
49         self.server_addr = "127.0.0.1"
50         self.server_port = "22000"
51         self.server_args = [self.server_port]
52         self.server_ipv6_addr = "::1"
53         self.server_ipv6_args = ["-6", self.server_port]
54         self.timeout = 20
55         self.echo_phrase = "Hello, world! Jenny is a friend of mine."
56         self.pre_test_sleep = 0.3
57         self.post_test_sleep = 0.2
58
59         if os.path.isfile("/tmp/ldp_server_af_unix_socket"):
60             os.remove("/tmp/ldp_server_af_unix_socket")
61
62         super(VCLTestCase, self).setUp()
63
64     def cut_thru_setup(self):
65         self.vapi.session_enable_disable(is_enabled=1)
66
67     def cut_thru_tear_down(self):
68         self.vapi.session_enable_disable(is_enabled=0)
69
70     def cut_thru_test(self, server_app, server_args, client_app, client_args):
71         self.env = {'VCL_API_PREFIX': self.shm_prefix,
72                     'VCL_APP_SCOPE_LOCAL': "true"}
73
74         worker_server = VCLAppWorker(self.build_dir, server_app, server_args,
75                                      self.logger, self.env)
76         worker_server.start()
77         self.sleep(self.pre_test_sleep)
78         worker_client = VCLAppWorker(self.build_dir, client_app, client_args,
79                                      self.logger, self.env)
80         worker_client.start()
81         worker_client.join(self.timeout)
82         try:
83             self.validateResults(worker_client, worker_server, self.timeout)
84         except Exception as error:
85             self.fail("Failed with %s" % error)
86         self.sleep(self.post_test_sleep)
87
88     def thru_host_stack_setup(self):
89         self.vapi.session_enable_disable(is_enabled=1)
90         self.create_loopback_interfaces(2)
91
92         table_id = 1
93
94         for i in self.lo_interfaces:
95             i.admin_up()
96
97             if table_id != 0:
98                 tbl = VppIpTable(self, table_id)
99                 tbl.add_vpp_config()
100
101             i.set_table_ip4(table_id)
102             i.config_ip4()
103             table_id += 1
104
105         # Configure namespaces
106         self.vapi.app_namespace_add_del(namespace_id=b"1", secret=1234,
107                                         sw_if_index=self.loop0.sw_if_index)
108         self.vapi.app_namespace_add_del(namespace_id=b"2", secret=5678,
109                                         sw_if_index=self.loop1.sw_if_index)
110
111         # Add inter-table routes
112         ip_t01 = VppIpRoute(self, self.loop1.local_ip4, 32,
113                             [VppRoutePath("0.0.0.0",
114                                           0xffffffff,
115                                           nh_table_id=2)], table_id=1)
116         ip_t10 = VppIpRoute(self, self.loop0.local_ip4, 32,
117                             [VppRoutePath("0.0.0.0",
118                                           0xffffffff,
119                                           nh_table_id=1)], table_id=2)
120         ip_t01.add_vpp_config()
121         ip_t10.add_vpp_config()
122         self.logger.debug(self.vapi.cli("show ip fib"))
123
124     def thru_host_stack_tear_down(self):
125         for i in self.lo_interfaces:
126             i.unconfig_ip4()
127             i.set_table_ip4(0)
128             i.admin_down()
129
130         self.vapi.session_enable_disable(is_enabled=0)
131
132     def thru_host_stack_ipv6_setup(self):
133         self.vapi.session_enable_disable(is_enabled=1)
134         self.create_loopback_interfaces(2)
135
136         table_id = 1
137
138         for i in self.lo_interfaces:
139             i.admin_up()
140
141             tbl = VppIpTable(self, table_id, is_ip6=1)
142             tbl.add_vpp_config()
143
144             i.set_table_ip6(table_id)
145             i.config_ip6()
146             table_id += 1
147
148         # Configure namespaces
149         self.vapi.app_namespace_add_del(namespace_id=b"1", secret=1234,
150                                         sw_if_index=self.loop0.sw_if_index)
151         self.vapi.app_namespace_add_del(namespace_id=b"2", secret=5678,
152                                         sw_if_index=self.loop1.sw_if_index)
153
154         # Add inter-table routes
155         ip_t01 = VppIpRoute(self, self.loop1.local_ip6, 128,
156                             [VppRoutePath("::0", 0xffffffff,
157                                           nh_table_id=2,
158                                           proto=DpoProto.DPO_PROTO_IP6)],
159                             table_id=1, is_ip6=1)
160         ip_t10 = VppIpRoute(self, self.loop0.local_ip6, 128,
161                             [VppRoutePath("::0", 0xffffffff,
162                                           nh_table_id=1,
163                                           proto=DpoProto.DPO_PROTO_IP6)],
164                             table_id=2, is_ip6=1)
165         ip_t01.add_vpp_config()
166         ip_t10.add_vpp_config()
167         self.logger.debug(self.vapi.cli("show interface addr"))
168         self.logger.debug(self.vapi.cli("show ip6 fib"))
169
170     def thru_host_stack_ipv6_tear_down(self):
171         for i in self.lo_interfaces:
172             i.unconfig_ip6()
173             i.set_table_ip6(0)
174             i.admin_down()
175
176         self.vapi.session_enable_disable(is_enabled=0)
177
178     def thru_host_stack_test(self, server_app, server_args,
179                              client_app, client_args):
180         self.env = {'VCL_API_PREFIX': self.shm_prefix,
181                     'VCL_APP_SCOPE_GLOBAL': "true",
182                     'VCL_APP_NAMESPACE_ID': "1",
183                     'VCL_APP_NAMESPACE_SECRET': "1234"}
184
185         worker_server = VCLAppWorker(self.build_dir, server_app, server_args,
186                                      self.logger, self.env)
187         worker_server.start()
188         self.sleep(self.pre_test_sleep)
189
190         self.env.update({'VCL_APP_NAMESPACE_ID': "2",
191                          'VCL_APP_NAMESPACE_SECRET': "5678"})
192         worker_client = VCLAppWorker(self.build_dir, client_app, client_args,
193                                      self.logger, self.env)
194         worker_client.start()
195         worker_client.join(self.timeout)
196
197         try:
198             self.validateResults(worker_client, worker_server, self.timeout)
199         except Exception as error:
200             self.fail("Failed with %s" % error)
201         self.sleep(self.post_test_sleep)
202
203     def validateResults(self, worker_client, worker_server, timeout):
204         if os.path.isdir('/proc/{}'.format(worker_server.process.pid)):
205             self.logger.info("Killing server worker process (pid %d)" %
206                              worker_server.process.pid)
207             os.killpg(os.getpgid(worker_server.process.pid), signal.SIGKILL)
208             worker_server.join()
209         self.logger.info("Client worker result is `%s'" % worker_client.result)
210         error = False
211         if worker_client.result is None:
212             try:
213                 error = True
214                 self.logger.error(
215                     "Timeout: %ss! Killing client worker process (pid %d)" %
216                     (timeout, worker_client.process.pid))
217                 os.killpg(os.getpgid(worker_client.process.pid),
218                           signal.SIGKILL)
219                 worker_client.join()
220             except:
221                 self.logger.debug(
222                     "Couldn't kill client worker process")
223                 raise
224         if error:
225             raise Exception(
226                 "Timeout! Client worker did not finish in %ss" % timeout)
227         self.assert_equal(worker_client.result, 0, "Binary test return code")
228
229
230 class LDPCutThruTestCase(VCLTestCase):
231     """ LDP Cut Thru Tests """
232
233     @classmethod
234     def setUpClass(cls):
235         super(LDPCutThruTestCase, cls).setUpClass()
236
237     @classmethod
238     def tearDownClass(cls):
239         super(LDPCutThruTestCase, cls).tearDownClass()
240
241     def setUp(self):
242         super(LDPCutThruTestCase, self).setUp()
243
244         self.cut_thru_setup()
245         self.client_echo_test_args = ["-E", self.echo_phrase, "-X",
246                                       self.server_addr, self.server_port]
247         self.client_iperf3_timeout = 20
248         self.client_iperf3_args = ["-V4d", "-t 2", "-c", self.server_addr]
249         self.server_iperf3_args = ["-V4d", "-s"]
250         self.client_uni_dir_nsock_timeout = 20
251         self.client_uni_dir_nsock_test_args = ["-N", "1000", "-U", "-X",
252                                                "-I", "2",
253                                                self.server_addr,
254                                                self.server_port]
255         self.client_bi_dir_nsock_timeout = 20
256         self.client_bi_dir_nsock_test_args = ["-N", "1000", "-B", "-X",
257                                               "-I", "2",
258                                               self.server_addr,
259                                               self.server_port]
260
261     def tearDown(self):
262         self.cut_thru_tear_down()
263         super(LDPCutThruTestCase, self).tearDown()
264
265     def show_commands_at_teardown(self):
266         self.logger.debug(self.vapi.cli("show session verbose 2"))
267
268     @unittest.skipUnless(running_extended_tests, "part of extended tests")
269     def test_ldp_cut_thru_echo(self):
270         """ run LDP cut thru echo test """
271
272         self.cut_thru_test("sock_test_server", self.server_args,
273                            "sock_test_client", self.client_echo_test_args)
274
275     def test_ldp_cut_thru_iperf3(self):
276         """ run LDP cut thru iperf3 test """
277
278         try:
279             subprocess.check_output(['iperf3', '-v'])
280         except subprocess.CalledProcessError:
281             self.logger.error(
282                 "WARNING: Subprocess returned non-0 running 'iperf3 -v")
283             self.logger.error("         'test_ldp_cut_thru_iperf3' not run!")
284             return
285         except OSError as e:
286             self.logger.error(
287                 "WARNING: Subprocess returned with OS error (%s) %s\n"
288                 "         'iperf3' is likely not installed,",
289                 e.errno, e.strerror)
290             self.logger.error("         'test_ldp_cut_thru_iperf3' not run!")
291             return
292         except Exception:
293             self.logger.exception(
294                 "Subprocess returned non-0 running 'iperf3 -v")
295
296         self.timeout = self.client_iperf3_timeout
297         self.cut_thru_test("iperf3", self.server_iperf3_args,
298                            "iperf3", self.client_iperf3_args)
299
300     @unittest.skipUnless(running_extended_tests, "part of extended tests")
301     def test_ldp_cut_thru_uni_dir_nsock(self):
302         """ run LDP cut thru uni-directional (multiple sockets) test """
303
304         self.timeout = self.client_uni_dir_nsock_timeout
305         self.cut_thru_test("sock_test_server", self.server_args,
306                            "sock_test_client",
307                            self.client_uni_dir_nsock_test_args)
308
309     @unittest.skipUnless(running_extended_tests, "part of extended tests")
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     def test_ldp_thru_host_stack_iperf3(self):
641         """ run LDP thru host stack iperf3 test """
642
643         try:
644             subprocess.check_output(['iperf3', '-v'])
645         except subprocess.CalledProcessError:
646             self.logger.error("WARNING: 'iperf3' is not installed,")
647             self.logger.error(
648                 "         'test_ldp_thru_host_stack_iperf3' not run!")
649             return
650         except OSError as e:
651             self.logger.error("WARNING: 'iperf3' is not installed,")
652             self.logger.error("         'test' not run!")
653             return
654         except Exception as e:
655             self.logger.error("WARNING: 'iperf3' unexpected error,")
656             self.logger.error("         'test' not run!")
657             return
658
659         self.timeout = self.client_iperf3_timeout
660         self.thru_host_stack_test("iperf3", self.server_iperf3_args,
661                                   "iperf3", self.client_iperf3_args)
662
663
664 class LDPIpv6CutThruTestCase(VCLTestCase):
665     """ LDP IPv6 Cut Thru Tests """
666
667     @classmethod
668     def setUpClass(cls):
669         super(LDPIpv6CutThruTestCase, cls).setUpClass()
670
671     @classmethod
672     def tearDownClass(cls):
673         super(LDPIpv6CutThruTestCase, cls).tearDownClass()
674
675     def setUp(self):
676         super(LDPIpv6CutThruTestCase, self).setUp()
677
678         self.cut_thru_setup()
679         self.client_iperf3_timeout = 20
680         self.client_uni_dir_nsock_timeout = 20
681         self.client_bi_dir_nsock_timeout = 20
682         self.client_ipv6_echo_test_args = ["-6", "-E", self.echo_phrase, "-X",
683                                            self.server_ipv6_addr,
684                                            self.server_port]
685         self.client_ipv6_iperf3_args = ["-V6d", "-t 2", "-c",
686                                         self.server_ipv6_addr]
687         self.server_ipv6_iperf3_args = ["-V6d", "-s"]
688         self.client_ipv6_uni_dir_nsock_test_args = ["-N", "1000", "-U", "-X",
689                                                     "-6",
690                                                     "-I", "2",
691                                                     self.server_ipv6_addr,
692                                                     self.server_port]
693         self.client_ipv6_bi_dir_nsock_test_args = ["-N", "1000", "-B", "-X",
694                                                    "-6",
695                                                    "-I", "2",
696                                                    self.server_ipv6_addr,
697                                                    self.server_port]
698
699     def tearDown(self):
700         self.cut_thru_tear_down()
701
702         super(LDPIpv6CutThruTestCase, self).tearDown()
703
704     def test_ldp_ipv6_cut_thru_echo(self):
705         """ run LDP IPv6 cut thru echo test """
706
707         self.cut_thru_test("sock_test_server",
708                            self.server_ipv6_args,
709                            "sock_test_client",
710                            self.client_ipv6_echo_test_args)
711
712     @unittest.skipUnless(running_extended_tests, "part of extended tests")
713     def test_ldp_ipv6_cut_thru_iperf3(self):
714         """ run LDP IPv6 cut thru iperf3 test """
715
716         try:
717             subprocess.check_output(['iperf3', '-v'])
718         except:
719             self.logger.error("WARNING: 'iperf3' is not installed,")
720             self.logger.error(
721                 "         'test_ldp_ipv6_cut_thru_iperf3' not run!")
722             return
723
724         self.timeout = self.client_iperf3_timeout
725         self.cut_thru_test("iperf3", self.server_ipv6_iperf3_args,
726                            "iperf3", self.client_ipv6_iperf3_args)
727
728     @unittest.skipUnless(running_extended_tests, "part of extended tests")
729     def test_ldp_ipv6_cut_thru_uni_dir_nsock(self):
730         """ run LDP IPv6 cut thru uni-directional (multiple sockets) test """
731
732         self.timeout = self.client_uni_dir_nsock_timeout
733         self.cut_thru_test("sock_test_server", self.server_ipv6_args,
734                            "sock_test_client",
735                            self.client_ipv6_uni_dir_nsock_test_args)
736
737     @unittest.skipUnless(running_extended_tests, "part of extended tests")
738     def test_ldp_ipv6_cut_thru_bi_dir_nsock(self):
739         """ run LDP IPv6 cut thru bi-directional (multiple sockets) test """
740
741         self.timeout = self.client_bi_dir_nsock_timeout
742         self.cut_thru_test("sock_test_server", self.server_ipv6_args,
743                            "sock_test_client",
744                            self.client_ipv6_bi_dir_nsock_test_args)
745
746
747 class VCLIpv6CutThruTestCase(VCLTestCase):
748     """ VCL IPv6 Cut Thru Tests """
749
750     @classmethod
751     def setUpClass(cls):
752         super(VCLIpv6CutThruTestCase, cls).setUpClass()
753
754     @classmethod
755     def tearDownClass(cls):
756         super(VCLIpv6CutThruTestCase, cls).tearDownClass()
757
758     def setUp(self):
759         super(VCLIpv6CutThruTestCase, self).setUp()
760
761         self.cut_thru_setup()
762         self.client_uni_dir_nsock_timeout = 20
763         self.client_bi_dir_nsock_timeout = 20
764         self.client_ipv6_echo_test_args = ["-6", "-E", self.echo_phrase, "-X",
765                                            self.server_ipv6_addr,
766                                            self.server_port]
767         self.client_ipv6_uni_dir_nsock_test_args = ["-N", "1000", "-U", "-X",
768                                                     "-6",
769                                                     "-I", "2",
770                                                     self.server_ipv6_addr,
771                                                     self.server_port]
772         self.client_ipv6_bi_dir_nsock_test_args = ["-N", "1000", "-B", "-X",
773                                                    "-6",
774                                                    "-I", "2",
775                                                    self.server_ipv6_addr,
776                                                    self.server_port]
777
778     def tearDown(self):
779         self.cut_thru_tear_down()
780
781         super(VCLIpv6CutThruTestCase, self).tearDown()
782
783     def test_vcl_ipv6_cut_thru_echo(self):
784         """ run VCL IPv6 cut thru echo test """
785
786         self.cut_thru_test("vcl_test_server",
787                            self.server_ipv6_args,
788                            "vcl_test_client",
789                            self.client_ipv6_echo_test_args)
790
791     @unittest.skipUnless(running_extended_tests, "part of extended tests")
792     def test_vcl_ipv6_cut_thru_uni_dir_nsock(self):
793         """ run VCL IPv6 cut thru uni-directional (multiple sockets) test """
794
795         self.timeout = self.client_uni_dir_nsock_timeout
796         self.cut_thru_test("vcl_test_server", self.server_ipv6_args,
797                            "vcl_test_client",
798                            self.client_ipv6_uni_dir_nsock_test_args)
799
800     @unittest.skipUnless(running_extended_tests, "part of extended tests")
801     def test_vcl_ipv6_cut_thru_bi_dir_nsock(self):
802         """ run VCL IPv6 cut thru bi-directional (multiple sockets) test """
803
804         self.timeout = self.client_bi_dir_nsock_timeout
805         self.cut_thru_test("vcl_test_server", self.server_ipv6_args,
806                            "vcl_test_client",
807                            self.client_ipv6_bi_dir_nsock_test_args)
808
809
810 class VCLIpv6ThruHostStackEcho(VCLTestCase):
811     """ VCL IPv6 Thru Host Stack Echo """
812
813     @classmethod
814     def setUpClass(cls):
815         super(VCLIpv6ThruHostStackEcho, cls).setUpClass()
816
817     @classmethod
818     def tearDownClass(cls):
819         super(VCLIpv6ThruHostStackEcho, cls).tearDownClass()
820
821     def setUp(self):
822         super(VCLIpv6ThruHostStackEcho, self).setUp()
823
824         self.thru_host_stack_ipv6_setup()
825         self.client_ipv6_echo_test_args = ["-6", "-E", self.echo_phrase, "-X",
826                                            self.loop0.local_ip6,
827                                            self.server_port]
828
829     def tearDown(self):
830         self.thru_host_stack_ipv6_tear_down()
831         super(VCLIpv6ThruHostStackEcho, self).tearDown()
832
833     def test_vcl_ipv6_thru_host_stack_echo(self):
834         """ run VCL IPv6 thru host stack echo test """
835
836         self.thru_host_stack_test("vcl_test_server",
837                                   self.server_ipv6_args,
838                                   "vcl_test_client",
839                                   self.client_ipv6_echo_test_args)
840
841
842 if __name__ == '__main__':
843     unittest.main(testRunner=VppTestRunner)