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 <pvinci@vinciconsulting.com>
diff --git a/test/test_cli.py b/test/test_cli.py
index 97885b9..7fa734b 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 @@
 
     @classmethod
     def setUpClass(cls):
+        # using the framework default
+        # cls.vapi_response_timeout = 5
         super(TestCLI, cls).setUpClass()
 
     @classmethod
@@ -31,6 +38,47 @@
         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)