summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorKlement Sekera <ksekera@cisco.com>2017-08-15 07:09:02 +0200
committerDave Wallace <dwallacelf@gmail.com>2017-08-17 14:44:05 +0000
commitf413bef1358e014c9a6cb75bd2ec3e1f351e64ff (patch)
treee029364853723c14452255b6e3966453172a02a6
parent6bf177ce815dc1454e8ac1b9d5bad08fde01d98d (diff)
make test: collect symlinks to failed tests
Compress files in temporary directories of failed tests and symlink the directories under /tmp/vpp-failed-unittests location - preparation for jenkins archivation. Automatically cleanup the directory at start of test run. The compression is performed only when environment variable COMPRESS_FAILED_TEST_LOGS is set to one of "yes", "y", "1". This is set in verify target, but left unset by default, so when invoking make test by hand, files won't be compressed. Change-Id: I84c8f1c6aa79aa9c0b753357022b1f195f17a283 Signed-off-by: Klement Sekera <ksekera@cisco.com>
-rw-r--r--Makefile2
-rw-r--r--test/Makefile7
-rw-r--r--test/framework.py22
-rwxr-xr-xtest/scripts/compress_failed.sh21
4 files changed, 49 insertions, 3 deletions
diff --git a/Makefile b/Makefile
index 1cce928aa1a..c1a7cbb58a5 100644
--- a/Makefile
+++ b/Makefile
@@ -501,7 +501,7 @@ endif
$(call banner,"Building $(PKG) packages")
@make pkg-$(PKG)
ifeq ($(OS_ID)-$(OS_VERSION_ID),ubuntu-16.04)
- @make test
+ @make COMPRESS_FAILED_TEST_LOGS=yes test
endif
diff --git a/test/Makefile b/test/Makefile
index 33779dcebd9..72b4dac7454 100644
--- a/test/Makefile
+++ b/test/Makefile
@@ -1,5 +1,7 @@
.PHONY: verify-python-path
+VPP_TEST_FAILED_DIR=/tmp/vpp-failed-unittests/
+
verify-python-path:
ifndef VPP_PYTHON_PREFIX
$(error VPP_PYTHON_PREFIX is not set)
@@ -84,7 +86,8 @@ $(PAPI_INSTALL_DONE): $(PIP_PATCH_DONE)
@touch $@
define retest-func
- @scripts/setsid_wrapper.sh $(FORCE_FOREGROUND) $(PYTHON_VENV_PATH)/bin/activate python run_tests.py -d $(TEST_DIR) $(UNITTEST_EXTRA_OPTS)
+ @env VPP_TEST_FAILED_DIR=$(VPP_TEST_FAILED_DIR) scripts/setsid_wrapper.sh $(FORCE_FOREGROUND) $(PYTHON_VENV_PATH)/bin/activate python run_tests.py -d $(TEST_DIR) $(UNITTEST_EXTRA_OPTS)
+ @env VPP_TEST_FAILED_DIR=$(VPP_TEST_FAILED_DIR) scripts/compress_failed.sh
endef
.PHONY: sanity
@@ -129,6 +132,8 @@ shell: verify-python-path $(PAPI_INSTALL_DONE)
reset:
@rm -f /dev/shm/vpp-unittest-*
@rm -rf /tmp/vpp-unittest-*
+ @rm -rf $(VPP_TEST_FAILED_DIR)
+ @mkdir $(VPP_TEST_FAILED_DIR)
wipe: reset
@rm -rf $(PYTHON_VENV_PATH)
diff --git a/test/framework.py b/test/framework.py
index 89d95cb36c9..008bda3b7ce 100644
--- a/test/framework.py
+++ b/test/framework.py
@@ -275,7 +275,7 @@ class VppTestCase(unittest.TestCase):
gc.collect() # run garbage collection first
cls.logger = getLogger(cls.__name__)
cls.tempdir = tempfile.mkdtemp(
- prefix='vpp-unittest-' + cls.__name__ + '-')
+ prefix='vpp-unittest-%s-' % cls.__name__)
cls.file_handler = FileHandler("%s/log.txt" % cls.tempdir)
cls.file_handler.setFormatter(
Formatter(fmt='%(asctime)s,%(msecs)03d %(message)s',
@@ -781,6 +781,24 @@ class VppTestResult(unittest.TestResult):
unittest.TestResult.addSkip(self, test, reason)
self.result_string = colorize("SKIP", YELLOW)
+ def symlink_failed(self, test):
+ logger = None
+ if hasattr(test, 'logger'):
+ logger = test.logger
+ if hasattr(test, 'tempdir'):
+ try:
+ failed_dir = os.getenv('VPP_TEST_FAILED_DIR')
+ link_path = '%s/%s-FAILED' % (failed_dir,
+ test.tempdir.split("/")[-1])
+ if logger:
+ logger.debug("creating a link to the failed test")
+ logger.debug("os.symlink(%s, %s)" %
+ (test.tempdir, link_path))
+ os.symlink(test.tempdir, link_path)
+ except Exception as e:
+ if logger:
+ logger.error(e)
+
def addFailure(self, test, err):
"""
Record a test failed result
@@ -800,6 +818,7 @@ class VppTestResult(unittest.TestResult):
if hasattr(test, 'tempdir'):
self.result_string = colorize("FAIL", RED) + \
' [ temp dir used by test case: ' + test.tempdir + ' ]'
+ self.symlink_failed(test)
else:
self.result_string = colorize("FAIL", RED) + ' [no temp dir]'
@@ -822,6 +841,7 @@ class VppTestResult(unittest.TestResult):
if hasattr(test, 'tempdir'):
self.result_string = colorize("ERROR", RED) + \
' [ temp dir used by test case: ' + test.tempdir + ' ]'
+ self.symlink_failed(test)
else:
self.result_string = colorize("ERROR", RED) + ' [no temp dir]'
diff --git a/test/scripts/compress_failed.sh b/test/scripts/compress_failed.sh
new file mode 100755
index 00000000000..6076b3b3d0c
--- /dev/null
+++ b/test/scripts/compress_failed.sh
@@ -0,0 +1,21 @@
+#!/bin/bash
+
+if [ "$(ls -A ${VPP_TEST_FAILED_DIR})" ]
+then
+ if [ "${COMPRESS_FAILED_TEST_LOGS}" == "yes" ]
+ then
+ echo -n "Compressing files in temporary directories from failed test runs..."
+ cd ${VPP_TEST_FAILED_DIR}
+ for d in *
+ do
+ cd ${d}
+ find . ! -path . -print0 | xargs -0 -n1 gzip
+ cd ${VPP_TEST_FAILED_DIR}
+ done
+ echo "done."
+ else
+ echo "Not compressing files in temporary directories from failed test runs."
+ fi
+else
+ echo "No symlinks to failed tests' temporary directories found in ${VPP_TEST_FAILED_DIR}."
+fi