make test: detect early vpp crash 45/3945/3
authorKlement Sekera <ksekera@cisco.com>
Thu, 24 Nov 2016 00:59:16 +0000 (01:59 +0100)
committerDamjan Marion <dmarion.lists@gmail.com>
Mon, 28 Nov 2016 11:54:47 +0000 (11:54 +0000)
If VPP process dies right at start, do a quick detection instead of being
stuck in the connect timeout (60s).

Change-Id: I41675181635fb81a6a7d93fbf652480a16bf78a0
Signed-off-by: Klement Sekera <ksekera@cisco.com>
test/framework.py
test/hook.py

index 1375f07..315556a 100644 (file)
@@ -177,6 +177,7 @@ class VppTestCase(unittest.TestCase):
         cls.pg_streams = []
         cls.packet_infos = {}
         cls.verbose = 0
+        cls.vpp_dead = False
         print(double_line_delim)
         print(colorize(getdoc(cls).splitlines()[0], YELLOW))
         print(double_line_delim)
@@ -184,13 +185,22 @@ class VppTestCase(unittest.TestCase):
         # doesn't get called and we might end with a zombie vpp
         try:
             cls.run_vpp()
-            cls.vpp_dead = False
+            cls.vpp_stdout_queue = Queue()
+            cls.vpp_stdout_reader_thread = Thread(
+                target=pump_output, args=(cls.vpp.stdout, cls.vpp_stdout_queue))
+            cls.vpp_stdout_reader_thread.start()
+            cls.vpp_stderr_queue = Queue()
+            cls.vpp_stderr_reader_thread = Thread(
+                target=pump_output, args=(cls.vpp.stderr, cls.vpp_stderr_queue))
+            cls.vpp_stderr_reader_thread.start()
             cls.vapi = VppPapiProvider(cls.shm_prefix, cls.shm_prefix)
             if cls.step:
-                cls.vapi.register_hook(StepHook(cls))
+                hook = StepHook(cls)
             else:
-                cls.vapi.register_hook(PollHook(cls))
+                hook = PollHook(cls)
+            cls.vapi.register_hook(hook)
             time.sleep(0.1)
+            hook.poll_vpp()
             try:
                 cls.vapi.connect()
             except:
@@ -199,18 +209,11 @@ class VppTestCase(unittest.TestCase):
                                    "VPP-API connection failed, did you forget "
                                    "to 'continue' VPP from within gdb?", RED))
                 raise
-            cls.vpp_stdout_queue = Queue()
-            cls.vpp_stdout_reader_thread = Thread(
-                target=pump_output, args=(cls.vpp.stdout, cls.vpp_stdout_queue))
-            cls.vpp_stdout_reader_thread.start()
-            cls.vpp_stderr_queue = Queue()
-            cls.vpp_stderr_reader_thread = Thread(
-                target=pump_output, args=(cls.vpp.stderr, cls.vpp_stderr_queue))
-            cls.vpp_stderr_reader_thread.start()
         except:
-            if hasattr(cls, 'vpp'):
-                cls.vpp.terminate()
-                del cls.vpp
+            try:
+                cls.quit()
+            except:
+                pass
             raise
 
     @classmethod
index f81e518..90e9bbf 100644 (file)
@@ -57,7 +57,6 @@ class PollHook(Hook):
     """ Hook which checks if the vpp subprocess is alive """
 
     def __init__(self, testcase):
-        self.vpp_dead = False
         self.testcase = testcase
         self.logger = testcase.logger
 
@@ -92,7 +91,7 @@ class PollHook(Hook):
         Poll the vpp status and throw an exception if it's not running
         :raises VppDiedError: exception if VPP is not running anymore
         """
-        if self.vpp_dead:
+        if self.testcase.vpp_dead:
             # already dead, nothing to do
             return