From bfd7d294d06e22f7bf809e8ac26220ebf51db683 Mon Sep 17 00:00:00 2001 From: Paul Vinciguerra Date: Sat, 26 Oct 2019 22:25:49 -0400 Subject: vlib: add 'wait' cli command When running exec scripts, there can be a need to wait between statements. Type: feature Change-Id: I2a45b390697e09fc222358c9354f28e3368a06ba Signed-off-by: Paul Vinciguerra --- src/vlib/unix/cli.c | 40 ++++++++++++++++++++++++++++++++++++++++ test/framework.py | 7 +++---- test/test_cli.py | 48 ++++++++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 91 insertions(+), 4 deletions(-) diff --git a/src/vlib/unix/cli.c b/src/vlib/unix/cli.c index 729180994a5..0a8041e4ac4 100644 --- a/src/vlib/unix/cli.c +++ b/src/vlib/unix/cli.c @@ -3847,6 +3847,46 @@ VLIB_CLI_COMMAND (cli_unix_cli_set_terminal_ansi, static) = { }; /* *INDENT-ON* */ + +#define MAX_CLI_WAIT 86400 +/** CLI command to wait seconds. Useful for exec script. */ +static clib_error_t * +unix_wait_cmd (vlib_main_t * vm, + unformat_input_t * input, vlib_cli_command_t * cmd) +{ + unformat_input_t _line_input, *line_input = &_line_input; + f64 sec = 1.0; + + if (!unformat_user (input, unformat_line_input, line_input)) + return 0; + + while (unformat_check_input (line_input) != UNFORMAT_END_OF_INPUT) + { + if (unformat (line_input, "%f", &sec)) + ; + else + return clib_error_return (0, "unknown parameter: `%U`", + format_unformat_error, input); + } + + if (sec <= 0 || sec > MAX_CLI_WAIT || floor (sec * 1000) / 1000 != sec) + return clib_error_return (0, + " must be a positive value and less than 86400 (one day) with no more than msec precision."); + + vlib_process_wait_for_event_or_clock (vm, sec); + vlib_cli_output (vm, "waited %.3f sec.", sec); + + unformat_free (line_input); + return 0; +} +/* *INDENT-OFF* */ +VLIB_CLI_COMMAND (cli_unix_wait_cmd, static) = { + .path = "wait", + .short_help = "wait ", + .function = unix_wait_cmd, +}; +/* *INDENT-ON* */ + static clib_error_t * unix_cli_init (vlib_main_t * vm) { diff --git a/test/framework.py b/test/framework.py index 02c56fbcfe4..24ee8692976 100644 --- a/test/framework.py +++ b/test/framework.py @@ -267,6 +267,7 @@ class VppTestCase(unittest.TestCase): extra_vpp_punt_config = [] extra_vpp_plugin_config = [] + vapi_response_timeout = 5 @property def packet_infos(self): @@ -550,11 +551,9 @@ class VppTestCase(unittest.TestCase): cls.pump_thread.daemon = True cls.pump_thread.start() if cls.debug_gdb or cls.debug_gdbserver: - read_timeout = 0 - else: - read_timeout = 5 + cls.vapi_response_timeout = 0 cls.vapi = VppPapiProvider(cls.shm_prefix, cls.shm_prefix, cls, - read_timeout) + cls.vapi_response_timeout) if cls.step: hook = hookmodule.StepHook(cls) else: diff --git a/test/test_cli.py b/test/test_cli.py index 97885b9b44e..7fa734b2231 100644 --- a/test/test_cli.py +++ b/test/test_cli.py @@ -1,7 +1,12 @@ #!/usr/bin/env python3 """CLI functional tests""" +import datetime +import time import unittest + +from vpp_papi import vpp_transport_shmem + from framework import VppTestCase, VppTestRunner @@ -11,6 +16,8 @@ class TestCLI(VppTestCase): @classmethod def setUpClass(cls): + # using the framework default + # cls.vapi_response_timeout = 5 super(TestCLI, cls).setUpClass() @classmethod @@ -31,6 +38,47 @@ class TestCLI(VppTestCase): rv = self.vapi.papi.cli_inband(cmd='show version') self.assertEqual(rv.retval, 0) + def test_long_cli_delay(self): + """ Test that VppApiClient raises VppTransportShmemIOError if timeout.""" # noqa + with self.assertRaises( + vpp_transport_shmem.VppTransportShmemIOError) as ctx: + rv = self.vapi.papi.cli_inband(cmd='wait 10') + + +class TestCLIExtendedVapiTimeout(VppTestCase): + maxDiff = None + + @classmethod + def setUpClass(cls): + cls.vapi_response_timeout = 15 + cls.__doc__ = " CLI Test Case w/ Extended (%ssec) Vapi Timeout " \ + % cls.vapi_response_timeout + super(TestCLIExtendedVapiTimeout, cls).setUpClass() + + @classmethod + def tearDownClass(cls): + super(TestCLIExtendedVapiTimeout, cls).tearDownClass() + + def setUp(self): + super(TestCLIExtendedVapiTimeout, self).setUp() + + def tearDown(self): + super(TestCLIExtendedVapiTimeout, self).tearDown() + + def test_long_cli_delay(self): + """ Test that delayed result returns with extended timeout.""" + wait_secs = self.vapi_response_timeout - 1 + + # get vpp time as float + start = self.vapi.papi.show_vpe_system_time( + _no_type_conversion=True).vpe_system_time + rv = self.vapi.papi.cli_inband(cmd='wait %s' % wait_secs) + now = self.vapi.papi.show_vpe_system_time( + _no_type_conversion=True).vpe_system_time + + # assume that the overhead of the measurement is not more that .5 sec. + self.assertEqual(round(now - start), wait_secs) + if __name__ == '__main__': unittest.main(testRunner=VppTestRunner) -- cgit 1.2.3-korg