aboutsummaryrefslogtreecommitdiffstats
path: root/test/hook.py
diff options
context:
space:
mode:
authorKlement Sekera <ksekera@cisco.com>2016-10-28 13:20:27 +0200
committerDamjan Marion <dmarion.lists@gmail.com>2016-10-31 23:48:25 +0000
commit277b89c946e6fdc764ee48726fcd3df1c189eda9 (patch)
tree1ced5e4a47a00290251e89929df0945ae64370c8 /test/hook.py
parentcede3798b7f3c35cab2a8268c584fd22bf3a34f6 (diff)
add vpp debugging support to test framework
improve test documentation Change-Id: Ia9678aa2532ecb4cb33736aedb4a31aa3f2a3f93 Signed-off-by: Klement Sekera <ksekera@cisco.com>
Diffstat (limited to 'test/hook.py')
-rw-r--r--test/hook.py112
1 files changed, 104 insertions, 8 deletions
diff --git a/test/hook.py b/test/hook.py
index 9489aa9d..3ae14737 100644
--- a/test/hook.py
+++ b/test/hook.py
@@ -1,7 +1,8 @@
import signal
import os
import pexpect
-from logging import *
+import traceback
+from log import *
class Hook(object):
@@ -9,6 +10,9 @@ class Hook(object):
Generic hooks before/after API/CLI calls
"""
+ def __init__(self, logger):
+ self.logger = logger
+
def before_api(self, api_name, api_args):
"""
Function called before API call
@@ -17,7 +21,8 @@ class Hook(object):
@param api_name: name of the API
@param api_args: tuple containing the API arguments
"""
- debug("API: %s (%s)" % (api_name, api_args))
+ self.logger.debug("API: %s (%s)" %
+ (api_name, api_args), extra={'color': RED})
def after_api(self, api_name, api_args):
"""
@@ -35,7 +40,7 @@ class Hook(object):
@param cli: CLI string
"""
- debug("CLI: %s" % (cli))
+ self.logger.debug("CLI: %s" % (cli), extra={'color': RED})
def after_cli(self, cli):
"""
@@ -54,6 +59,7 @@ class PollHook(Hook):
def __init__(self, testcase):
self.vpp_dead = False
self.testcase = testcase
+ self.logger = testcase.logger
def spawn_gdb(self, gdb_path, core_path):
gdb_cmdline = gdb_path + ' ' + self.testcase.vpp_bin + ' ' + core_path
@@ -74,11 +80,12 @@ class PollHook(Hook):
self.spawn_gdb(gdb_path, core_path)
return
else:
- error("Debugger '%s' does not exist or is not an executable.." %
- gdb_path)
+ self.logger.error(
+ "Debugger '%s' does not exist or is not an executable.." %
+ gdb_path)
- critical('core file present, debug with: gdb ' +
- self.testcase.vpp_bin + ' ' + core_path)
+ self.logger.critical('core file present, debug with: gdb ' +
+ self.testcase.vpp_bin + ' ' + core_path)
def poll_vpp(self):
"""
@@ -97,7 +104,7 @@ class PollHook(Hook):
msg = "VPP subprocess died unexpectedly with returncode %d [%s]" % (
self.testcase.vpp.returncode,
signaldict[abs(self.testcase.vpp.returncode)])
- critical(msg)
+ self.logger.critical(msg)
core_path = self.testcase.tempdir + '/core'
if os.path.isfile(core_path):
self.on_crash(core_path)
@@ -126,3 +133,92 @@ class PollHook(Hook):
"""
super(PollHook, self).after_cli(cli)
self.poll_vpp()
+
+
+class StepHook(PollHook):
+ """ Hook which requires user to press ENTER before doing any API/CLI """
+
+ def __init__(self, testcase):
+ self.skip_stack = None
+ self.skip_num = None
+ self.skip_count = 0
+ super(StepHook, self).__init__(testcase)
+
+ def skip(self):
+ if self.skip_stack is None:
+ return False
+ stack = traceback.extract_stack()
+ counter = 0
+ skip = True
+ for e in stack:
+ if counter > self.skip_num:
+ break
+ if e[0] != self.skip_stack[counter][0]:
+ skip = False
+ if e[1] != self.skip_stack[counter][1]:
+ skip = False
+ counter += 1
+ if skip:
+ self.skip_count += 1
+ return True
+ else:
+ print("%d API/CLI calls skipped in specified stack "
+ "frame" % self.skip_count)
+ self.skip_count = 0
+ self.skip_stack = None
+ self.skip_num = None
+ return False
+
+ def user_input(self):
+ print('number\tfunction\tfile\tcode')
+ counter = 0
+ stack = traceback.extract_stack()
+ for e in stack:
+ print('%02d.\t%s\t%s:%d\t[%s]' % (counter, e[2], e[0], e[1], e[3]))
+ counter += 1
+ print(single_line_delim)
+ print("You can enter a number of stack frame chosen from above")
+ print("Calls in/below that stack frame will be not be stepped anymore")
+ print(single_line_delim)
+ while True:
+ choice = raw_input("Enter your choice, if any, and press ENTER to "
+ "continue running the testcase...")
+ if choice == "":
+ choice = None
+ try:
+ if choice is not None:
+ num = int(choice)
+ except:
+ print("Invalid input")
+ continue
+ if choice is not None and (num < 0 or num >= len(stack)):
+ print("Invalid choice")
+ continue
+ break
+ if choice is not None:
+ self.skip_stack = stack
+ self.skip_num = num
+
+ def before_cli(self, cli):
+ """ Wait for ENTER before executing CLI """
+ if self.skip():
+ print("Skip pause before executing CLI: %s" % cli)
+ else:
+ print(double_line_delim)
+ print("Test paused before executing CLI: %s" % cli)
+ print(single_line_delim)
+ self.user_input()
+ super(StepHook, self).before_cli(cli)
+
+ def before_api(self, api_name, api_args):
+ """ Wait for ENTER before executing API """
+ if self.skip():
+ print("Skip pause before executing API: %s (%s)"
+ % (api_name, api_args))
+ else:
+ print(double_line_delim)
+ print("Test paused before executing API: %s (%s)"
+ % (api_name, api_args))
+ print(single_line_delim)
+ self.user_input()
+ super(StepHook, self).before_api(api_name, api_args)