Setup, teardown, DEBUG=core, FAILFAST fixes
- Fixed a bug when an error occuring in tearDownClass would not result in test being marked as failed - Improved test results reporting in cases when an error occurs in setUpClass and tearDownClass - Fixed DEBUG=core when the core is produced in setUpClass or tearDownClass - Reworked DEBUG=core to always be handled after all tests have been executed - Fixed FAILFAST=1 for parallel test runs Change-Id: I3e9cd3b97ba6fa802fa0aa2dd7678ff82eee09ec Signed-off-by: juraj.linkes <juraj.linkes@pantheon.tech>
This commit is contained in:

committed by
Damjan Marion

parent
825fc4892e
commit
40dd73bcfa
@ -2,11 +2,12 @@
|
||||
|
||||
import os
|
||||
import pexpect
|
||||
import sys
|
||||
|
||||
gdb_path = '/usr/bin/gdb'
|
||||
|
||||
|
||||
def spawn_gdb(binary_path, core_path, logger):
|
||||
def spawn_gdb(binary_path, core_path):
|
||||
if os.path.isfile(gdb_path) and os.access(gdb_path, os.X_OK):
|
||||
# automatically attach gdb
|
||||
gdb_cmdline = "%s %s %s" % (gdb_path, binary_path, core_path)
|
||||
@ -19,5 +20,5 @@ def spawn_gdb(binary_path, core_path, logger):
|
||||
if gdb.isalive():
|
||||
raise Exception("GDB refused to die...")
|
||||
else:
|
||||
logger.error("Debugger '%s' does not exist or is not an "
|
||||
"executable.." % gdb_path)
|
||||
sys.stderr.write("Debugger '%s' does not exist or is not "
|
||||
"an executable..\n" % gdb_path)
|
||||
|
File diff suppressed because it is too large
Load Diff
35
test/hook.py
35
test/hook.py
@ -3,9 +3,8 @@ import os
|
||||
import sys
|
||||
import traceback
|
||||
from log import RED, single_line_delim, double_line_delim
|
||||
from debug import spawn_gdb
|
||||
from subprocess import check_output, CalledProcessError
|
||||
from util import check_core_path
|
||||
from util import check_core_path, get_core_path
|
||||
|
||||
|
||||
class Hook(object):
|
||||
@ -60,27 +59,21 @@ class PollHook(Hook):
|
||||
""" Hook which checks if the vpp subprocess is alive """
|
||||
|
||||
def __init__(self, testcase):
|
||||
super(PollHook, self).__init__(testcase.logger)
|
||||
self.testcase = testcase
|
||||
self.logger = testcase.logger
|
||||
|
||||
def on_crash(self, core_path):
|
||||
if self.testcase.debug_core:
|
||||
# notify parent process that we're handling a core file
|
||||
open('%s/_core_handled' % self.testcase.tempdir, 'a').close()
|
||||
spawn_gdb(self.testcase.vpp_bin, core_path, self.logger)
|
||||
else:
|
||||
self.logger.error("Core file present, debug with: gdb %s %s" %
|
||||
(self.testcase.vpp_bin, core_path))
|
||||
check_core_path(self.logger, core_path)
|
||||
self.logger.error("Running `file %s':" % core_path)
|
||||
try:
|
||||
info = check_output(["file", core_path])
|
||||
self.logger.error(info)
|
||||
except CalledProcessError as e:
|
||||
self.logger.error(
|
||||
"Could not run `file' utility on core-file, "
|
||||
"rc=%s" % e.returncode)
|
||||
pass
|
||||
self.logger.error("Core file present, debug with: gdb %s %s" %
|
||||
(self.testcase.vpp_bin, core_path))
|
||||
check_core_path(self.logger, core_path)
|
||||
self.logger.error("Running `file %s':" % core_path)
|
||||
try:
|
||||
info = check_output(["file", core_path])
|
||||
self.logger.error(info)
|
||||
except CalledProcessError as e:
|
||||
self.logger.error(
|
||||
"Could not run `file' utility on core-file, "
|
||||
"rc=%s" % e.returncode)
|
||||
|
||||
def poll_vpp(self):
|
||||
"""
|
||||
@ -104,7 +97,7 @@ class PollHook(Hook):
|
||||
msg = "VPP subprocess died unexpectedly with returncode %d [%s]" %\
|
||||
(self.testcase.vpp.returncode, s)
|
||||
self.logger.critical(msg)
|
||||
core_path = self.testcase.tempdir + '/core'
|
||||
core_path = get_core_path(self.testcase.tempdir)
|
||||
if os.path.isfile(core_path):
|
||||
self.on_crash(core_path)
|
||||
self.testcase.vpp_dead = True
|
||||
|
File diff suppressed because it is too large
Load Diff
38
test/util.py
38
test/util.py
@ -2,6 +2,7 @@
|
||||
|
||||
import socket
|
||||
import sys
|
||||
import os.path
|
||||
from abc import abstractmethod, ABCMeta
|
||||
from cStringIO import StringIO
|
||||
from scapy.utils6 import in6_mactoifaceid
|
||||
@ -73,19 +74,32 @@ def ip6_normalize(ip6):
|
||||
socket.inet_pton(socket.AF_INET6, ip6))
|
||||
|
||||
|
||||
def check_core_path(logger, core_path):
|
||||
def get_core_path(tempdir):
|
||||
return "%s/%s" % (tempdir, get_core_pattern())
|
||||
|
||||
|
||||
def is_core_present(tempdir):
|
||||
return os.path.isfile(get_core_path(tempdir))
|
||||
|
||||
|
||||
def get_core_pattern():
|
||||
with open("/proc/sys/kernel/core_pattern", "r") as f:
|
||||
corefmt = f.read()
|
||||
if corefmt.startswith("|"):
|
||||
logger.error(
|
||||
"WARNING: redirecting the core dump through a"
|
||||
" filter may result in truncated dumps.")
|
||||
logger.error(
|
||||
" You may want to check the filter settings"
|
||||
" or uninstall it and edit the"
|
||||
" /proc/sys/kernel/core_pattern accordingly.")
|
||||
logger.error(
|
||||
" current core pattern is: %s" % corefmt)
|
||||
corefmt = f.read().strip()
|
||||
return corefmt
|
||||
|
||||
|
||||
def check_core_path(logger, core_path):
|
||||
corefmt = get_core_pattern()
|
||||
if corefmt.startswith("|"):
|
||||
logger.error(
|
||||
"WARNING: redirecting the core dump through a"
|
||||
" filter may result in truncated dumps.")
|
||||
logger.error(
|
||||
" You may want to check the filter settings"
|
||||
" or uninstall it and edit the"
|
||||
" /proc/sys/kernel/core_pattern accordingly.")
|
||||
logger.error(
|
||||
" current core pattern is: %s" % corefmt)
|
||||
|
||||
|
||||
class NumericConstant(object):
|
||||
|
Reference in New Issue
Block a user