aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--test/framework.py32
-rw-r--r--test/vpp_pg_interface.py33
2 files changed, 65 insertions, 0 deletions
diff --git a/test/framework.py b/test/framework.py
index 4185dbfb..6a0ec965 100644
--- a/test/framework.py
+++ b/test/framework.py
@@ -8,6 +8,7 @@ import resource
from collections import deque
from threading import Thread
from inspect import getdoc
+from traceback import format_exception
from hook import StepHook, PollHook
from vpp_pg_interface import VppPGInterface
from vpp_sub_interface import VppSubInterface
@@ -287,6 +288,9 @@ class VppTestCase(unittest.TestCase):
def tearDown(self):
""" Show various debug prints after each test """
+ self.logger.debug("--- tearDown() for %s.%s(%s) called ---" %
+ (self.__class__.__name__, self._testMethodName,
+ self._testMethodDoc))
if not self.vpp_dead:
self.logger.debug(self.vapi.cli("show trace"))
self.logger.info(self.vapi.ppcli("show int"))
@@ -297,6 +301,9 @@ class VppTestCase(unittest.TestCase):
def setUp(self):
""" Clear trace before running each test"""
+ self.logger.debug("--- setUp() for %s.%s(%s) called ---" %
+ (self.__class__.__name__, self._testMethodName,
+ self._testMethodDoc))
if self.vpp_dead:
raise Exception("VPP is dead when setting up the test")
time.sleep(.1)
@@ -586,6 +593,11 @@ class VppTestResult(unittest.TestResult):
:param test:
"""
+ if hasattr(test, 'logger'):
+ test.logger.debug("--- addSuccess() %s.%s(%s) called"
+ % (test.__class__.__name__,
+ test._testMethodName,
+ test._testMethodDoc))
unittest.TestResult.addSuccess(self, test)
self.result_string = colorize("OK", GREEN)
@@ -597,6 +609,12 @@ class VppTestResult(unittest.TestResult):
:param reason:
"""
+ if hasattr(test, 'logger'):
+ test.logger.debug("--- addSkip() %s.%s(%s) called, reason is %s"
+ % (test.__class__.__name__,
+ test._testMethodName,
+ test._testMethodDoc,
+ reason))
unittest.TestResult.addSkip(self, test, reason)
self.result_string = colorize("SKIP", YELLOW)
@@ -608,6 +626,13 @@ class VppTestResult(unittest.TestResult):
:param err: error message
"""
+ if hasattr(test, 'logger'):
+ test.logger.debug("--- addFailure() %s.%s(%s) called, err is %s"
+ % (test.__class__.__name__,
+ test._testMethodName,
+ test._testMethodDoc, err))
+ test.logger.debug("formatted exception is:\n%s" %
+ "".join(format_exception(*err)))
unittest.TestResult.addFailure(self, test, err)
if hasattr(test, 'tempdir'):
self.result_string = colorize("FAIL", RED) + \
@@ -623,6 +648,13 @@ class VppTestResult(unittest.TestResult):
:param err: error message
"""
+ if hasattr(test, 'logger'):
+ test.logger.debug("--- addError() %s.%s(%s) called, err is %s"
+ % (test.__class__.__name__,
+ test._testMethodName,
+ test._testMethodDoc, err))
+ test.logger.debug("formatted exception is:\n%s" %
+ "".join(format_exception(*err)))
unittest.TestResult.addError(self, test, err)
if hasattr(test, 'tempdir'):
self.result_string = colorize("ERROR", RED) + \
diff --git a/test/vpp_pg_interface.py b/test/vpp_pg_interface.py
index 81737c6d..d6e66849 100644
--- a/test/vpp_pg_interface.py
+++ b/test/vpp_pg_interface.py
@@ -1,6 +1,7 @@
import os
import time
import socket
+import struct
from traceback import format_exc, format_stack
from scapy.utils import wrpcap, rdpcap, PcapReader
from scapy.plist import PacketList
@@ -283,6 +284,37 @@ class VppPGInterface(VppInterface):
return False
return True
+ def wait_for_packet_data(self, deadline):
+ """
+ Wait until enough data is available in the file handled by internal
+ pcap reader so that a whole packet can be read.
+
+ :param deadline: timestamp by which the data must arrive
+ :raises Exception: if not enough data by deadline
+ """
+ orig_pos = self._pcap_reader.f.tell() # save file position
+ enough_data = False
+ while time.time() < deadline:
+ # read packet header from pcap
+ hdr = self._pcap_reader.f.read(16)
+ if len(hdr) < 16:
+ time.sleep(0) # yield
+ continue # cannot read full header, continue looping
+ # find the capture length - caplen
+ sec, usec, caplen, wirelen = struct.unpack(
+ self._pcap_reader.endian + "IIII", hdr)
+ self._pcap_reader.f.seek(0, 2) # seek to end of file
+ end_pos = self._pcap_reader.f.tell() # get position at end
+ if end_pos >= orig_pos + len(hdr) + caplen:
+ enough_data = True # yay, we have enough data
+ break
+ self.test.logger.debug("Partial packet data in pcap")
+ time.sleep(0) # yield
+ self._pcap_reader.f.seek(orig_pos, 0) # restore original position
+ if not enough_data:
+ raise Exception(
+ "Not enough data to read a full packet within deadline")
+
def wait_for_packet(self, timeout, filter_out_fn=is_ipv6_misc):
"""
Wait for next packet captured with a timeout
@@ -311,6 +343,7 @@ class VppPGInterface(VppInterface):
self.test.logger.debug("Waiting for packet")
while time.time() < deadline:
+ self.wait_for_packet_data(deadline)
p = self._pcap_reader.recv()
if p is not None:
if filter_out_fn is not None and filter_out_fn(p):