- 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>
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/
import sys
import os
import select
+import signal
import unittest
import tempfile
import time
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
"""
+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.
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)
"to 'continue' VPP from within gdb?", RED))
raise
except Exception:
- try:
- cls.quit()
- except Exception:
- pass
+
+ cls.quit()
raise
@classmethod
-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
pass
-class VppDiedError(Exception):
- pass
-
-
class PollHook(Hook):
""" Hook which checks if the vpp subprocess is alive """
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):
"""
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):