8 from framework import VppTestCase, VppTestRunner, running_extended_tests, \
10 from vpp_ip_route import VppIpTable, VppIpRoute, VppRoutePath
13 class QUICAppWorker(Worker):
14 """ QUIC Test Application Worker """
17 def __init__(self, build_dir, appname, args, logger, role, testcase,
19 app = "%s/vpp/bin/%s" % (build_dir, appname)
20 self.args = [app] + args
22 self.wait_for_gdb = 'wait-for-gdb'
23 self.testcase = testcase
24 super(QUICAppWorker, self).__init__(self.args, logger, env)
27 super(QUICAppWorker, self).run()
29 def teardown(self, logger, timeout):
30 if self.process is None:
33 logger.debug("Killing worker process (pid %d)" % self.process.pid)
34 os.killpg(os.getpgid(self.process.pid), signal.SIGKILL)
37 logger.debug("Couldn't kill worker process")
42 class QUICTestCase(VppTestCase):
43 """ QUIC Test Case """
46 cls.extra_vpp_plugin_config.append("plugin quic_plugin.so { enable }")
47 super(QUICTestCase, cls).setUpClass()
50 super(QUICTestCase, self).setUp()
52 self.build_dir = os.getenv(var, None)
53 if self.build_dir is None:
54 raise Exception("Environment variable `%s' not set" % var)
55 self.vppDebug = 'vpp_debug' in self.build_dir
57 self.vapi.session_enable_disable(is_enabled=1)
58 self.pre_test_sleep = 0.3
59 self.post_test_sleep = 0.2
61 self.create_loopback_interfaces(2)
62 self.uri = "quic://%s/1234" % self.loop0.local_ip4
64 for i in self.lo_interfaces:
68 tbl = VppIpTable(self, table_id)
71 i.set_table_ip4(table_id)
75 # Configure namespaces
76 self.vapi.app_namespace_add_del(namespace_id=b"server",
77 sw_if_index=self.loop0.sw_if_index)
78 self.vapi.app_namespace_add_del(namespace_id=b"client",
79 sw_if_index=self.loop1.sw_if_index)
81 # Add inter-table routes
82 self.ip_t01 = VppIpRoute(self, self.loop1.local_ip4, 32,
83 [VppRoutePath("0.0.0.0",
85 nh_table_id=2)], table_id=1)
86 self.ip_t10 = VppIpRoute(self, self.loop0.local_ip4, 32,
87 [VppRoutePath("0.0.0.0",
89 nh_table_id=1)], table_id=2)
90 self.ip_t01.add_vpp_config()
91 self.ip_t10.add_vpp_config()
92 self.logger.debug(self.vapi.cli("show ip fib"))
95 self.vapi.session_enable_disable(is_enabled=0)
96 # Delete inter-table routes
97 self.ip_t01.remove_vpp_config()
98 self.ip_t10.remove_vpp_config()
100 for i in self.lo_interfaces:
104 super(QUICTestCase, self).tearDown()
107 class QUICEchoIntTestCase(QUICTestCase):
108 """QUIC Echo Internal Test Case"""
111 super(QUICEchoIntTestCase, self).setUp()
112 self.client_args = "uri %s fifo-size 64 test-bytes appns client" \
114 self.server_args = "uri %s fifo-size 64 appns server" % self.uri
116 def server(self, *args):
117 error = self.vapi.cli(
118 "test echo server %s %s" %
119 (self.server_args, ' '.join(args)))
121 self.logger.critical(error)
122 self.assertNotIn("failed", error)
124 def client(self, *args):
125 error = self.vapi.cli(
126 "test echo client %s %s" %
127 (self.client_args, ' '.join(args)))
129 self.logger.critical(error)
130 self.assertNotIn("failed", error)
133 class QUICEchoIntTransferTestCase(QUICEchoIntTestCase):
134 """QUIC Echo Internal Transfer Test Case"""
135 def test_quic_int_transfer(self):
137 self.client("no-output", "mbytes", "2")
140 class QUICEchoIntSerialTestCase(QUICEchoIntTestCase):
141 """QUIC Echo Internal Serial Transfer Test Case"""
142 def test_quic_serial_int_transfer(self):
144 self.client("no-output", "mbytes", "2")
145 self.client("no-output", "mbytes", "2")
146 self.client("no-output", "mbytes", "2")
147 self.client("no-output", "mbytes", "2")
148 self.client("no-output", "mbytes", "2")
151 class QUICEchoIntMStreamTestCase(QUICEchoIntTestCase):
152 """QUIC Echo Internal MultiStream Test Case"""
153 def test_quic_int_multistream_transfer(self):
155 self.client("nclients", "10", "mbytes", "1", "no-output")
158 class QUICEchoExtTestCase(QUICTestCase):
159 extra_vpp_punt_config = ["session", "{", "evt_qs_memfd_seg", "}"]
160 quic_setup = "default"
164 super(QUICEchoExtTestCase, self).setUp()
174 self.server_echo_test_args = common_args + \
175 ["server", "appns", "server", "quic-setup", self.quic_setup]
176 self.client_echo_test_args = common_args + \
177 ["client", "appns", "client", "quic-setup", self.quic_setup]
178 error = self.vapi.cli(
179 "quic set fifo-size 4Mb")
181 self.logger.critical(error)
182 self.assertNotIn("failed", error)
184 def server(self, *args):
185 _args = self.server_echo_test_args + list(args)
186 self.worker_server = QUICAppWorker(
193 self.worker_server.start()
194 self.sleep(self.pre_test_sleep)
196 def client(self, *args):
197 _args = self.client_echo_test_args + list(args)
198 # self.client_echo_test_args += "use-svm-api"
199 self.worker_client = QUICAppWorker(
206 self.worker_client.start()
207 timeout = None if self.debug_all else self.timeout
208 self.worker_client.join(timeout)
209 self.worker_server.join(timeout)
210 self.sleep(self.post_test_sleep)
212 def validate_ext_test_results(self):
213 server_result = self.worker_server.result
214 client_result = self.worker_client.result
215 self.logger.info("Server worker result is `%s'" %
217 self.logger.info("Client worker result is `%s'" %
219 server_kill_error = False
220 if self.worker_server.result is None:
221 server_kill_error = self.worker_server.teardown(
222 self.logger, self.timeout)
223 if self.worker_client.result is None:
224 self.worker_client.teardown(self.logger, self.timeout)
225 err_msg = "Wrong server worker return code (%s)" % server_result
226 self.assertEqual(server_result, 0, err_msg)
227 self.assertIsNotNone(
229 "Timeout! Client worker did not finish in %ss" %
231 err_msg = "Wrong client worker return code (%s)" % client_result
232 self.assertEqual(client_result, 0, err_msg)
233 self.assertFalse(server_kill_error, "Server kill errored")
236 class QUICEchoExtTransferTestCase(QUICEchoExtTestCase):
237 """QUIC Echo External Transfer Test Case"""
238 def test_quic_ext_transfer(self):
241 self.validate_ext_test_results()
244 class QUICEchoExtQcloseRxTestCase(QUICEchoExtTestCase):
245 """QUIC Echo External Transfer Qclose Rx Test Case"""
247 @unittest.skipUnless(running_extended_tests, "part of extended tests")
248 def test_quic_ext_qclose_rx(self):
249 self.server("TX=0", "RX=10Mb", "qclose=Y", "sclose=N")
250 self.client("TX=10Mb", "RX=0", "qclose=W", "sclose=W")
251 self.validate_ext_test_results()
254 class QUICEchoExtQcloseTxTestCase(QUICEchoExtTestCase):
255 """QUIC Echo External Transfer Qclose Tx Test Case"""
257 @unittest.skipUnless(running_extended_tests, "part of extended tests")
258 def test_quic_ext_qclose_tx(self):
259 self.server("TX=0", "RX=10Mb", "qclose=W", "sclose=W",
261 self.client("TX=10Mb", "RX=0", "qclose=Y", "sclose=N")
262 self.validate_ext_test_results()
265 class QUICEchoExtEarlyQcloseRxTestCase(QUICEchoExtTestCase):
266 """QUIC Echo External Transfer Early Qclose Rx Test Case"""
268 @unittest.skipUnless(running_extended_tests, "part of extended tests")
269 def test_quic_ext_early_qclose_rx(self):
270 self.server("TX=0", "RX=10Mb", "qclose=Y", "sclose=N")
271 self.client("TX=20Mb", "RX=0", "qclose=W", "sclose=W",
273 self.validate_ext_test_results()
276 class QUICEchoExtEarlyQcloseTxTestCase(QUICEchoExtTestCase):
277 """QUIC Echo External Transfer Early Qclose Tx Test Case"""
279 @unittest.skipUnless(running_extended_tests, "part of extended tests")
280 def test_quic_ext_early_qclose_tx(self):
281 self.server("TX=0", "RX=20Mb", "qclose=W", "sclose=W",
283 self.client("TX=10Mb", "RX=0", "qclose=Y", "sclose=N")
284 self.validate_ext_test_results()
287 class QUICEchoExtScloseRxTestCase(QUICEchoExtTestCase):
288 """QUIC Echo External Transfer Sclose Rx Test Case"""
290 @unittest.skipUnless(running_extended_tests, "part of extended tests")
291 def test_quic_ext_sclose_rx(self):
292 self.server("TX=0", "RX=10Mb", "qclose=N", "sclose=Y")
293 self.client("TX=10Mb", "RX=0", "qclose=W", "sclose=W")
294 self.validate_ext_test_results()
297 class QUICEchoExtScloseTxTestCase(QUICEchoExtTestCase):
298 """QUIC Echo External Transfer Sclose Tx Test Case"""
300 @unittest.skipUnless(running_extended_tests, "part of extended tests")
301 def test_quic_ext_sclose_tx(self):
302 self.server("TX=0", "RX=10Mb", "qclose=W", "sclose=W")
303 self.client("TX=10Mb", "RX=0", "qclose=Y", "sclose=Y")
304 self.validate_ext_test_results()
307 class QUICEchoExtEarlyScloseRxTestCase(QUICEchoExtTestCase):
308 """QUIC Echo External Transfer Early Sclose Rx Test Case"""
310 @unittest.skipUnless(running_extended_tests, "part of extended tests")
311 def test_quic_ext_early_sclose_rx(self):
312 self.server("TX=0", "RX=10Mb", "qclose=N", "sclose=Y")
313 self.client("TX=20Mb", "RX=0", "qclose=W", "sclose=W",
315 self.validate_ext_test_results()
318 class QUICEchoExtEarlyScloseTxTestCase(QUICEchoExtTestCase):
319 """QUIC Echo External Transfer Early Sclose Tx Test Case"""
321 @unittest.skipUnless(running_extended_tests, "part of extended tests")
322 def test_quic_ext_early_sclose_tx(self):
323 self.server("TX=0", "RX=20Mb", "qclose=W", "sclose=W",
325 self.client("TX=10Mb", "RX=0", "qclose=Y", "sclose=Y")
326 self.validate_ext_test_results()
329 class QUICEchoExtServerStreamTestCase(QUICEchoExtTestCase):
330 """QUIC Echo External Transfer Server Stream Test Case"""
331 quic_setup = "serverstream"
333 def test_quic_ext_transfer_server_stream(self):
334 self.server("TX=10Mb", "RX=0")
335 self.client("TX=0", "RX=10Mb")
336 self.validate_ext_test_results()
339 class QUICEchoExtServerStreamQcloseRxTestCase(QUICEchoExtTestCase):
340 """QUIC Echo External Transfer Server Stream Qclose Rx Test Case"""
341 quic_setup = "serverstream"
343 @unittest.skipUnless(running_extended_tests, "part of extended tests")
344 def test_quic_ext_server_stream_qclose_rx(self):
345 self.server("TX=10Mb", "RX=0", "qclose=W", "sclose=W")
346 self.client("TX=0", "RX=10Mb", "qclose=Y", "sclose=N")
347 self.validate_ext_test_results()
350 class QUICEchoExtServerStreamQcloseTxTestCase(QUICEchoExtTestCase):
351 """QUIC Echo External Transfer Server Stream Qclose Tx Test Case"""
352 quic_setup = "serverstream"
354 @unittest.skipUnless(running_extended_tests, "part of extended tests")
355 def test_quic_ext_server_stream_qclose_tx(self):
356 self.server("TX=10Mb", "RX=0", "qclose=Y", "sclose=N")
357 self.client("TX=0", "RX=10Mb", "qclose=W", "sclose=W",
359 self.validate_ext_test_results()
362 class QUICEchoExtServerStreamEarlyQcloseRxTestCase(QUICEchoExtTestCase):
363 """QUIC Echo External Transfer Server Stream Early Qclose Rx Test Case"""
364 quic_setup = "serverstream"
366 @unittest.skipUnless(running_extended_tests, "part of extended tests")
367 def test_quic_ext_server_stream_early_qclose_rx(self):
368 self.server("TX=20Mb", "RX=0", "qclose=W", "sclose=W",
370 self.client("TX=0", "RX=10Mb", "qclose=Y", "sclose=N")
371 self.validate_ext_test_results()
374 class QUICEchoExtServerStreamEarlyQcloseTxTestCase(QUICEchoExtTestCase):
375 """QUIC Echo External Transfer Server Stream Early Qclose Tx Test Case"""
376 quic_setup = "serverstream"
378 @unittest.skipUnless(running_extended_tests, "part of extended tests")
379 def test_quic_ext_server_stream_early_qclose_tx(self):
380 self.server("TX=10Mb", "RX=0", "qclose=Y", "sclose=N")
381 self.client("TX=0", "RX=20Mb", "qclose=W", "sclose=W",
383 self.validate_ext_test_results()
386 class QUICEchoExtServerStreamScloseRxTestCase(QUICEchoExtTestCase):
387 """QUIC Echo External Transfer Server Stream Sclose Rx Test Case"""
388 quic_setup = "serverstream"
390 @unittest.skipUnless(running_extended_tests, "part of extended tests")
391 def test_quic_ext_server_stream_sclose_rx(self):
392 self.server("TX=10Mb", "RX=0", "qclose=W", "sclose=W")
393 self.client("TX=0", "RX=10Mb", "qclose=N", "sclose=Y")
394 self.validate_ext_test_results()
397 class QUICEchoExtServerStreamScloseTxTestCase(QUICEchoExtTestCase):
398 """QUIC Echo External Transfer Server Stream Sclose Tx Test Case"""
399 quic_setup = "serverstream"
401 @unittest.skipUnless(running_extended_tests, "part of extended tests")
402 def test_quic_ext_server_stream_sclose_tx(self):
403 self.server("TX=10Mb", "RX=0", "qclose=Y", "sclose=Y")
404 self.client("TX=0", "RX=10Mb", "qclose=W", "sclose=W")
405 self.validate_ext_test_results()
408 class QUICEchoExtServerStreamEarlyScloseRxTestCase(QUICEchoExtTestCase):
409 """QUIC Echo External Transfer Server Stream Early Sclose Rx Test Case"""
410 quic_setup = "serverstream"
412 @unittest.skipUnless(running_extended_tests, "part of extended tests")
413 def test_quic_ext_server_stream_early_sclose_rx(self):
414 self.server("TX=20Mb", "RX=0", "qclose=W", "sclose=W",
416 self.client("TX=0", "RX=10Mb", "qclose=N", "sclose=Y")
417 self.validate_ext_test_results()
420 class QUICEchoExtServerStreamEarlyScloseTxTestCase(QUICEchoExtTestCase):
421 """QUIC Echo Ext Transfer Server Stream Early Sclose Tx Test Case"""
422 quic_setup = "serverstream"
424 @unittest.skipUnless(running_extended_tests, "part of extended tests")
425 def test_quic_ext_server_stream_early_sclose_tx(self):
426 self.server("TX=10Mb", "RX=0", "qclose=Y", "sclose=Y")
427 self.client("TX=0", "RX=20Mb", "qclose=W", "sclose=W",
429 self.validate_ext_test_results()
432 class QUICEchoExtServerStreamWorkersTestCase(QUICEchoExtTestCase):
433 """QUIC Echo External Transfer Server Stream MultiWorker Test Case"""
434 quic_setup = "serverstream"
436 @unittest.skipUnless(running_extended_tests, "part of extended tests")
437 def test_quic_ext_transfer_server_stream_multi_workers(self):
438 self.server("nclients", "4", "quic-streams", "4", "TX=10Mb", "RX=0")
439 self.client("nclients", "4", "quic-streams", "4", "TX=0", "RX=10Mb")
440 self.validate_ext_test_results()
443 if __name__ == '__main__':
444 unittest.main(testRunner=VppTestRunner)