aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorPaul Vinciguerra <pvinci@vinciconsulting.com>2019-06-20 12:24:12 -0400
committerAndrew Yourtchenko <ayourtch@gmail.com>2019-06-24 16:03:09 +0000
commit496b0dee7f6fe4a0b18c5a5993c11840fd9a1ccc (patch)
tree167dd4fbddfcc41980f175381f719be75b4d8cf5
parentb98dbb1f2f94aba78a1b37c70721b562d13e1d7c (diff)
tests: refactor VppDiedError.
- Move Exception into same module as TestCase. - Move the error reporting logic inside the error. - Allows testing of the returncode and signal_name for tests to consume. - Fix the signal reporting code: VppDiedError: VPP subprocess died unexpectedly with returncode -6 [unknown]. displays as: VppDiedError: VPP subprocess died unexpectedly with return code: -6 [SIGABRT]. Type: test Change-Id: I8488ab318a596c9b737308829cedfb7e96e57302 Signed-off-by: Paul Vinciguerra <pvinci@vinciconsulting.com>
-rw-r--r--MAINTAINERS4
-rw-r--r--test/framework.py34
-rw-r--r--test/hook.py24
-rw-r--r--test/sanity_run_vpp.py3
4 files changed, 36 insertions, 29 deletions
diff --git a/MAINTAINERS b/MAINTAINERS
index 1943c0f9f6f..bb62ca32424 100644
--- a/MAINTAINERS
+++ b/MAINTAINERS
@@ -332,7 +332,11 @@ M: Dave Barach <dave@barachs.net>
F: src/plugins/nsim/
Test Infrastructure
+<<<<<<< HEAD
I: tests
+=======
+I: tests
+>>>>>>> d84661c... tests: refactor VppDiedError.
M: Klement Sekera <ksekera@cisco.com>
M: Paul Vinciguerra <pvinci@vinciconsulting.com>
F: test/
diff --git a/test/framework.py b/test/framework.py
index 26e93e4abd9..00fee86e9b0 100644
--- a/test/framework.py
+++ b/test/framework.py
@@ -5,6 +5,7 @@ import gc
import sys
import os
import select
+import signal
import unittest
import tempfile
import time
@@ -21,7 +22,7 @@ from logging import FileHandler, DEBUG, Formatter
import scapy.compat
from scapy.packet import Raw
-from hook import StepHook, PollHook, VppDiedError
+import hook as hookmodule
from vpp_pg_interface import VppPGInterface
from vpp_sub_interface import VppSubInterface
from vpp_lo_interface import VppLoInterface
@@ -69,6 +70,27 @@ if os.getenv('TEST_DEBUG', "0") == "1":
"""
+class VppDiedError(Exception):
+ """ exception for reporting that the subprocess has died."""
+
+ signals_by_value = {v: k for k, v in signal.__dict__.items() if
+ k.startswith('SIG') and not k.startswith('SIG_')}
+
+ def __init__(self, rv=None):
+ self.rv = rv
+ self.signal_name = None
+ try:
+ self.signal_name = VppDiedError.signals_by_value[-rv]
+ except KeyError:
+ pass
+
+ msg = "VPP subprocess died unexpectedly with return code: %d%s." % (
+ self.rv,
+ ' [%s]' % self.signal_name if
+ self.signal_name is not None else '')
+ super(VppDiedError, self).__init__(msg)
+
+
class _PacketInfo(object):
"""Private class to create packet info object.
@@ -492,9 +514,9 @@ class VppTestCase(unittest.TestCase):
cls.vapi = VppPapiProvider(cls.shm_prefix, cls.shm_prefix, cls,
read_timeout)
if cls.step:
- hook = StepHook(cls)
+ hook = hookmodule.StepHook(cls)
else:
- hook = PollHook(cls)
+ hook = hookmodule.PollHook(cls)
cls.vapi.register_hook(hook)
cls.wait_for_stats_socket()
cls.statistics = VPPStats(socketname=cls.stats_sock)
@@ -519,10 +541,8 @@ class VppTestCase(unittest.TestCase):
"to 'continue' VPP from within gdb?", RED))
raise
except Exception:
- try:
- cls.quit()
- except Exception:
- pass
+
+ cls.quit()
raise
@classmethod
diff --git a/test/hook.py b/test/hook.py
index ccc5c86b9c3..97b05d05153 100644
--- a/test/hook.py
+++ b/test/hook.py
@@ -1,13 +1,12 @@
-import signal
import os
import sys
import traceback
-from log import RED, single_line_delim, double_line_delim
import ipaddress
from subprocess import check_output, CalledProcessError
import scapy.compat
-
+import framework
+from log import RED, single_line_delim, double_line_delim
from util import check_core_path, get_core_path
@@ -72,10 +71,6 @@ class Hook(object):
pass
-class VppDiedError(Exception):
- pass
-
-
class PollHook(Hook):
""" Hook which checks if the vpp subprocess is alive """
@@ -117,22 +112,11 @@ class PollHook(Hook):
self.test.vpp.poll()
if self.test.vpp.returncode is not None:
- signaldict = dict(
- (k, v) for v, k in reversed(sorted(signal.__dict__.items()))
- if v.startswith('SIG') and not v.startswith('SIG_'))
-
- if self.test.vpp.returncode in signaldict:
- s = signaldict[abs(self.test.vpp.returncode)]
- else:
- s = "unknown"
- msg = "VPP subprocess died unexpectedly with returncode %d [%s]." \
- % (self.test.vpp.returncode, s)
- self.logger.critical(msg)
+ self.test.vpp_dead = True
+ raise framework.VppDiedError(rv=self.test.vpp.returncode)
core_path = get_core_path(self.test.tempdir)
if os.path.isfile(core_path):
self.on_crash(core_path)
- self.test.vpp_dead = True
- raise VppDiedError(msg)
def before_api(self, api_name, api_args):
"""
diff --git a/test/sanity_run_vpp.py b/test/sanity_run_vpp.py
index d1c29877b9b..92f250b2a6b 100644
--- a/test/sanity_run_vpp.py
+++ b/test/sanity_run_vpp.py
@@ -3,8 +3,7 @@
from __future__ import print_function
from multiprocessing import Pipe
from sys import exit
-from hook import VppDiedError
-from framework import VppTestCase, KeepAliveReporter
+from framework import VppDiedError, VppTestCase, KeepAliveReporter
class SanityTestCase(VppTestCase):