X-Git-Url: https://gerrit.fd.io/r/gitweb?a=blobdiff_plain;f=test%2Fframework.py;h=2bbb4ce44f7029a537cc0e1202406589e04da1d5;hb=b2204671dad112e3195771854b4ef00bb388d4e6;hp=d985ac6439dbce9f7b14a21c82e4628c7ddbddab;hpb=72f0004ac5f6e201cbe042593d76df6f2491d743;p=vpp.git diff --git a/test/framework.py b/test/framework.py index d985ac6439d..2bbb4ce44f7 100644 --- a/test/framework.py +++ b/test/framework.py @@ -1,41 +1,36 @@ #!/usr/bin/env python from __future__ import print_function - -import copy import gc +import sys import os -import random import select -import six -import sys +import unittest import tempfile import time -import unittest +import faulthandler +import random +import copy +import psutil from collections import deque -from inspect import getdoc, isclass -from logging import FileHandler, DEBUG, Formatter from threading import Thread, Event +from inspect import getdoc, isclass from traceback import format_exception - -import faulthandler -import psutil -from scapy.layers.inet import IPerror, TCPerror, UDPerror, ICMPerror -from scapy.layers.inet6 import ICMPv6DestUnreach, ICMPv6EchoRequest -from scapy.layers.inet6 import ICMPv6EchoReply +from logging import FileHandler, DEBUG, Formatter from scapy.packet import Raw -from vpp_papi.vpp_stats import VPPStats - from hook import StepHook, PollHook, VppDiedError +from vpp_pg_interface import VppPGInterface +from vpp_sub_interface import VppSubInterface +from vpp_lo_interface import VppLoInterface +from vpp_papi_provider import VppPapiProvider +from vpp_papi.vpp_stats import VPPStats from log import RED, GREEN, YELLOW, double_line_delim, single_line_delim, \ get_logger, colorize -from util import ppp, is_core_present -from vpp_lo_interface import VppLoInterface from vpp_object import VppObjectRegistry -from vpp_papi_provider import VppPapiProvider -from vpp_pg_interface import VppPGInterface -from vpp_sub_interface import VppSubInterface - +from util import ppp, is_core_present +from scapy.layers.inet import IPerror, TCPerror, UDPerror, ICMPerror +from scapy.layers.inet6 import ICMPv6DestUnreach, ICMPv6EchoRequest +from scapy.layers.inet6 import ICMPv6EchoReply if os.name == 'posix' and sys.version_info[0] < 3: # using subprocess32 is recommended by python official documentation # @ https://docs.python.org/2/library/subprocess.html @@ -224,8 +219,8 @@ class VppTestCase(unittest.TestCase): else: raise Exception("Unrecognized DEBUG option: '%s'" % d) - @classmethod - def get_least_used_cpu(self): + @staticmethod + def get_least_used_cpu(): cpu_usage_list = [set(range(psutil.cpu_count()))] vpp_processes = [p for p in psutil.process_iter(attrs=['pid', 'name']) if 'vpp_main' == p.info['name']] @@ -253,7 +248,7 @@ class VppTestCase(unittest.TestCase): return random.choice(tuple(min_usage_set)) - @staticmethod + @classmethod def print_header(cls): if not hasattr(cls, '_header_printed'): print(double_line_delim) @@ -270,8 +265,8 @@ class VppTestCase(unittest.TestCase): c = os.getenv("CACHE_OUTPUT", "1") cls.cache_vpp_output = False if c.lower() in ("n", "no", "0") else True cls.set_debug_flags(d) - cls.vpp_bin = os.getenv('VPP_TEST_BIN', "vpp") - cls.plugin_path = os.getenv('VPP_TEST_PLUGIN_PATH') + cls.vpp_bin = os.getenv('VPP_BIN', "vpp") + cls.plugin_path = os.getenv('VPP_PLUGIN_PATH') cls.extern_plugin_path = os.getenv('EXTERN_PLUGINS') plugin_path = None if cls.plugin_path is not None: @@ -332,7 +327,7 @@ class VppTestCase(unittest.TestCase): print("Now is the time to attach a gdb by running the above " "command and set up breakpoints etc.") print(single_line_delim) - six.input("Press ENTER to continue running the testcase...") + raw_input("Press ENTER to continue running the testcase...") @classmethod def run_vpp(cls): @@ -380,7 +375,7 @@ class VppTestCase(unittest.TestCase): """ gc.collect() # run garbage collection first random.seed() - cls.print_header(cls) + cls.print_header() cls.logger = get_logger(cls.__name__) if hasattr(cls, 'parallel_handler'): cls.logger.addHandler(cls.parallel_handler) @@ -472,7 +467,7 @@ class VppTestCase(unittest.TestCase): print(double_line_delim) print("VPP or GDB server is still running") print(single_line_delim) - six.input("When done debugging, press ENTER to kill the " + raw_input("When done debugging, press ENTER to kill the " "process and finish running the testcase...") # first signal that we want to stop the pump thread, then wake it up @@ -1025,7 +1020,7 @@ class VppTestResult(unittest.TestResult): core_crash_test_cases_info = set() current_test_case_info = None - def __init__(self, stream, descriptions, verbosity): + def __init__(self, stream, descriptions, verbosity, runner): """ :param stream File descriptor to store where to report test results. Set to the standard error stream by default. @@ -1038,6 +1033,7 @@ class VppTestResult(unittest.TestResult): self.descriptions = descriptions self.verbosity = verbosity self.result_string = None + self.runner = runner def addSuccess(self, test): """ @@ -1077,7 +1073,7 @@ class VppTestResult(unittest.TestResult): def symlink_failed(self): if self.current_test_case_info: try: - failed_dir = os.getenv('VPP_TEST_FAILED_DIR') + failed_dir = os.getenv('FAILED_DIR') link_path = os.path.join( failed_dir, '%s-FAILED' % @@ -1190,7 +1186,7 @@ class VppTestResult(unittest.TestResult): :param test: """ - test.print_header(test.__class__) + test.print_header() unittest.TestResult.startTest(self, test) if self.verbosity > 0: @@ -1221,9 +1217,16 @@ class VppTestResult(unittest.TestResult): """ Print errors from running the test case """ - self.stream.writeln() - self.printErrorList('ERROR', self.errors) - self.printErrorList('FAIL', self.failures) + if len(self.errors) > 0 or len(self.failures) > 0: + self.stream.writeln() + self.printErrorList('ERROR', self.errors) + self.printErrorList('FAIL', self.failures) + + # ^^ that is the last output from unittest before summary + if not self.runner.print_summary: + devnull = unittest.runner._WritelnDecorator(open(os.devnull, 'w')) + self.stream = devnull + self.runner.stream = devnull def printErrorList(self, flavour, errors): """ @@ -1253,7 +1256,7 @@ class VppTestRunner(unittest.TextTestRunner): def __init__(self, keep_alive_pipe=None, descriptions=True, verbosity=1, result_pipe=None, failfast=False, buffer=False, - resultclass=None): + resultclass=None, print_summary=True): # ignore stream setting here, use hard-coded stdout to be in sync # with prints from VppTestCase methods ... @@ -1262,7 +1265,16 @@ class VppTestRunner(unittest.TextTestRunner): resultclass) KeepAliveReporter.pipe = keep_alive_pipe - VppTestResult.test_framework_result_pipe = result_pipe + self.orig_stream = self.stream + self.resultclass.test_framework_result_pipe = result_pipe + + self.print_summary = print_summary + + def _makeResult(self): + return self.resultclass(self.stream, + self.descriptions, + self.verbosity, + self) def run(self, test): """ @@ -1274,6 +1286,9 @@ class VppTestRunner(unittest.TextTestRunner): faulthandler.enable() # emit stack trace to stderr if killed by signal result = super(VppTestRunner, self).run(test) + if not self.print_summary: + self.stream = self.orig_stream + result.stream = self.orig_stream return result