[tests] [travis-ci] Move Travis functional test log post processing to test_runner

This commit is contained in:
John Newbery 2017-11-29 13:25:23 -05:00
parent bba1c54edd
commit dba94ead0c
2 changed files with 16 additions and 21 deletions

View file

@ -4,7 +4,6 @@
# file COPYING or http://www.opensource.org/licenses/mit-license.php. # file COPYING or http://www.opensource.org/licenses/mit-license.php.
"""Base class for RPC testing.""" """Base class for RPC testing."""
from collections import deque
from enum import Enum from enum import Enum
import logging import logging
import optparse import optparse
@ -149,21 +148,6 @@ class BitcoinTestFramework():
shutil.rmtree(self.options.tmpdir) shutil.rmtree(self.options.tmpdir)
else: else:
self.log.warning("Not cleaning up dir %s" % self.options.tmpdir) self.log.warning("Not cleaning up dir %s" % self.options.tmpdir)
if os.getenv("PYTHON_DEBUG", ""):
# Dump the end of the debug logs, to aid in debugging rare
# travis failures.
import glob
filenames = [self.options.tmpdir + "/test_framework.log"]
filenames += glob.glob(self.options.tmpdir + "/node*/regtest/debug.log")
MAX_LINES_TO_PRINT = 1000
for fn in filenames:
try:
with open(fn, 'r') as f:
print("From", fn, ":")
print("".join(deque(f, MAX_LINES_TO_PRINT)))
except OSError:
print("Opening file %s failed." % fn)
traceback.print_exc()
if success == TestStatus.PASSED: if success == TestStatus.PASSED:
self.log.info("Tests successful") self.log.info("Tests successful")

View file

@ -15,6 +15,7 @@ For a description of arguments recognized by test scripts, see
""" """
import argparse import argparse
from collections import deque
import configparser import configparser
import datetime import datetime
import os import os
@ -314,7 +315,7 @@ def run_tests(test_list, src_dir, build_dir, exeext, tmpdir, jobs=1, enable_cove
max_len_name = len(max(test_list, key=len)) max_len_name = len(max(test_list, key=len))
for _ in range(len(test_list)): for _ in range(len(test_list)):
test_result, stdout, stderr = job_queue.get_next() test_result, testdir, stdout, stderr = job_queue.get_next()
test_results.append(test_result) test_results.append(test_result)
if test_result.status == "Passed": if test_result.status == "Passed":
@ -325,6 +326,14 @@ def run_tests(test_list, src_dir, build_dir, exeext, tmpdir, jobs=1, enable_cove
print("\n%s%s%s failed, Duration: %s s\n" % (BOLD[1], test_result.name, BOLD[0], test_result.time)) print("\n%s%s%s failed, Duration: %s s\n" % (BOLD[1], test_result.name, BOLD[0], test_result.time))
print(BOLD[1] + 'stdout:\n' + BOLD[0] + stdout + '\n') print(BOLD[1] + 'stdout:\n' + BOLD[0] + stdout + '\n')
print(BOLD[1] + 'stderr:\n' + BOLD[0] + stderr + '\n') print(BOLD[1] + 'stderr:\n' + BOLD[0] + stderr + '\n')
if os.getenv("PYTHON_DEBUG", "") and os.path.isdir(testdir):
# Print the logs on travis, so they are preserved when the vm is disposed
print('{}Combine the logs and print the last {} lines ...{}'.format(BOLD[1], 4000, BOLD[0]))
print('\n============')
print('{}Combined log for {}:{}'.format(BOLD[1], testdir, BOLD[0]))
print('============\n')
combined_logs, _ = subprocess.Popen([os.path.join(tests_dir, 'combine_logs.py'), '-c', testdir], universal_newlines=True, stdout=subprocess.PIPE).communicate()
print("\n".join(deque(combined_logs.splitlines(), 4000)))
print_results(test_results, max_len_name, (int(time.time() - time0))) print_results(test_results, max_len_name, (int(time.time() - time0)))
@ -389,13 +398,15 @@ class TestHandler:
log_stdout = tempfile.SpooledTemporaryFile(max_size=2**16) log_stdout = tempfile.SpooledTemporaryFile(max_size=2**16)
log_stderr = tempfile.SpooledTemporaryFile(max_size=2**16) log_stderr = tempfile.SpooledTemporaryFile(max_size=2**16)
test_argv = t.split() test_argv = t.split()
tmpdir = ["--tmpdir=%s/%s_%s" % (self.tmpdir, re.sub(".py$", "", test_argv[0]), portseed)] testdir = "{}/{}_{}".format(self.tmpdir, re.sub(".py$", "", test_argv[0]), portseed)
tmpdir_arg = ["--tmpdir={}".format(testdir)]
self.jobs.append((t, self.jobs.append((t,
time.time(), time.time(),
subprocess.Popen([self.tests_dir + test_argv[0]] + test_argv[1:] + self.flags + portseed_arg + tmpdir, subprocess.Popen([self.tests_dir + test_argv[0]] + test_argv[1:] + self.flags + portseed_arg + tmpdir_arg,
universal_newlines=True, universal_newlines=True,
stdout=log_stdout, stdout=log_stdout,
stderr=log_stderr), stderr=log_stderr),
testdir,
log_stdout, log_stdout,
log_stderr)) log_stderr))
if not self.jobs: if not self.jobs:
@ -404,7 +415,7 @@ class TestHandler:
# Return first proc that finishes # Return first proc that finishes
time.sleep(.5) time.sleep(.5)
for j in self.jobs: for j in self.jobs:
(name, time0, proc, log_out, log_err) = j (name, time0, proc, testdir, log_out, log_err) = j
if os.getenv('TRAVIS') == 'true' and int(time.time() - time0) > 20 * 60: if os.getenv('TRAVIS') == 'true' and int(time.time() - time0) > 20 * 60:
# In travis, timeout individual tests after 20 minutes (to stop tests hanging and not # In travis, timeout individual tests after 20 minutes (to stop tests hanging and not
# providing useful output. # providing useful output.
@ -422,7 +433,7 @@ class TestHandler:
self.num_running -= 1 self.num_running -= 1
self.jobs.remove(j) self.jobs.remove(j)
return TestResult(name, status, int(time.time() - time0)), stdout, stderr return TestResult(name, status, int(time.time() - time0)), testdir, stdout, stderr
print('.', end='', flush=True) print('.', end='', flush=True)
class TestResult(): class TestResult():