X-Git-Url: https://gerrit.fd.io/r/gitweb?a=blobdiff_plain;f=test%2Fframework.py;h=b3cbb08a4b53e9cfc277a8a9acaf3ba7a6c2be53;hb=dbb3c25374fc5735c57960465bcc10278b147e5a;hp=b10592cf1e78173b796a40c627ea61c50eebdf21;hpb=931be3aca223e094241a92ae7184ff97375fa155;p=vpp.git diff --git a/test/framework.py b/test/framework.py index b10592cf1e7..b3cbb08a4b5 100644 --- a/test/framework.py +++ b/test/framework.py @@ -1,7 +1,5 @@ #!/usr/bin/env python -from abc import * -import os import subprocess import unittest import tempfile @@ -13,6 +11,7 @@ from threading import Thread from inspect import getdoc from hook import StepHook, PollHook from vpp_pg_interface import VppPGInterface +from vpp_lo_interface import VppLoInterface from vpp_papi_provider import VppPapiProvider from scapy.packet import Raw from log import * @@ -30,22 +29,15 @@ class _PacketInfo(object): Help process information about the next packet. Set variables to default values. - @property index - Integer variable to store the index of the packet. - @property src - Integer variable to store the index of the source packet generator - interface of the packet. - @property dst - Integer variable to store the index of the destination packet generator - interface of the packet. - @property data - Object variable to store the copy of the former packet. - - """ + #: Store the index of the packet. index = -1 + #: Store the index of the source packet generator interface of the packet. src = -1 + #: Store the index of the destination packet generator interface + #: of the packet. dst = -1 + #: Store the copy of the former packet. data = None @@ -55,12 +47,8 @@ def pump_output(out, queue): class VppTestCase(unittest.TestCase): - """ - Subclass of the python unittest.TestCase class. - - This subclass is a base class for test cases that are implemented as classes - It provides methods to create and run test case. - + """This subclass is a base class for VPP test cases that are implemented as + classes. It provides methods to create and run test case. """ @property @@ -189,20 +177,30 @@ class VppTestCase(unittest.TestCase): cls.pg_streams = [] cls.packet_infos = {} cls.verbose = 0 + cls.vpp_dead = False print(double_line_delim) - print(colorize(getdoc(cls), YELLOW)) + print(colorize(getdoc(cls).splitlines()[0], YELLOW)) print(double_line_delim) # need to catch exceptions here because if we raise, then the cleanup # doesn't get called and we might end with a zombie vpp try: cls.run_vpp() - cls.vpp_dead = False - cls.vapi = VppPapiProvider(cls.shm_prefix, cls.shm_prefix) + cls.vpp_stdout_queue = Queue() + cls.vpp_stdout_reader_thread = Thread(target=pump_output, args=( + cls.vpp.stdout, cls.vpp_stdout_queue)) + cls.vpp_stdout_reader_thread.start() + cls.vpp_stderr_queue = Queue() + cls.vpp_stderr_reader_thread = Thread(target=pump_output, args=( + cls.vpp.stderr, cls.vpp_stderr_queue)) + cls.vpp_stderr_reader_thread.start() + cls.vapi = VppPapiProvider(cls.shm_prefix, cls.shm_prefix, cls) if cls.step: - cls.vapi.register_hook(StepHook(cls)) + hook = StepHook(cls) else: - cls.vapi.register_hook(PollHook(cls)) + hook = PollHook(cls) + cls.vapi.register_hook(hook) time.sleep(0.1) + hook.poll_vpp() try: cls.vapi.connect() except: @@ -211,19 +209,13 @@ class VppTestCase(unittest.TestCase): "VPP-API connection failed, did you forget " "to 'continue' VPP from within gdb?", RED)) raise - cls.vpp_stdout_queue = Queue() - cls.vpp_stdout_reader_thread = Thread( - target=pump_output, args=(cls.vpp.stdout, cls.vpp_stdout_queue)) - cls.vpp_stdout_reader_thread.start() - cls.vpp_stderr_queue = Queue() - cls.vpp_stderr_reader_thread = Thread( - target=pump_output, args=(cls.vpp.stderr, cls.vpp_stderr_queue)) - cls.vpp_stderr_reader_thread.start() except: - if hasattr(cls, 'vpp'): - cls.vpp.terminate() - del cls.vpp - raise + t, v, tb = sys.exc_info() + try: + cls.quit() + except: + pass + raise t, v, tb @classmethod def quit(cls): @@ -240,7 +232,8 @@ class VppTestCase(unittest.TestCase): " and finish running the testcase...") if hasattr(cls, 'vpp'): - cls.vapi.disconnect() + if hasattr(cls, 'vapi'): + cls.vapi.disconnect() cls.vpp.poll() if cls.vpp.returncode is None: cls.vpp.terminate() @@ -277,11 +270,11 @@ class VppTestCase(unittest.TestCase): def tearDown(self): """ Show various debug prints after each test """ if not self.vpp_dead: - self.logger.info(self.vapi.cli("show int")) - self.logger.info(self.vapi.cli("show trace")) - self.logger.info(self.vapi.cli("show hardware")) - self.logger.info(self.vapi.cli("show error")) - self.logger.info(self.vapi.cli("show run")) + self.logger.debug(self.vapi.cli("show trace")) + self.logger.info(self.vapi.ppcli("show int")) + self.logger.info(self.vapi.ppcli("show hardware")) + self.logger.info(self.vapi.ppcli("show error")) + self.logger.info(self.vapi.ppcli("show run")) def setUp(self): """ Clear trace before running each test""" @@ -330,6 +323,22 @@ class VppTestCase(unittest.TestCase): cls.pg_interfaces = result return result + @classmethod + def create_loopback_interfaces(cls, interfaces): + """ + Create loopback interfaces + + :param interfaces: iterable indexes of the interfaces + + """ + result = [] + for i in interfaces: + intf = VppLoInterface(cls, i) + setattr(cls, intf.name, intf) + result.append(intf) + cls.lo_interfaces = result + return result + @staticmethod def extend_packet(packet, size): """