Skip to content

Commit

Permalink
tc-testing: Allow test cases to be skipped
Browse files Browse the repository at this point in the history
By adding a check for an optional key/value pair to the test case
data, individual test cases may be skipped to prevent tdc from
aborting a test run due to setup or teardown failure.

If a test case is skipped, it will still appear in the results
output to allow for a consistent number of executed tests in each
run. However, the test will be marked as skipped.

This support for skipping extends to any plugins that may generate
additional results for each executed test.

Signed-off-by: Lucas Bates <lucasb@mojatatu.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
  • Loading branch information
Lucas Bates authored and David S. Miller committed Mar 2, 2019
1 parent 745732c commit 255c1c7
Show file tree
Hide file tree
Showing 4 changed files with 27 additions and 13 deletions.
4 changes: 2 additions & 2 deletions tools/testing/selftests/tc-testing/TdcPlugin.py
Original file line number Diff line number Diff line change
Expand Up @@ -18,13 +18,13 @@ def post_suite(self, index):
if self.args.verbose > 1:
print(' -- {}.post_suite'.format(self.sub_class))

def pre_case(self, test_ordinal, testid, test_name):
def pre_case(self, testid, test_name, test_skip):
'''run commands before test_runner does one test'''
if self.args.verbose > 1:
print(' -- {}.pre_case'.format(self.sub_class))
self.args.testid = testid
self.args.test_name = test_name
self.args.test_ordinal = test_ordinal
self.args.test_skip = test_skip

def post_case(self):
'''run commands after test_runner does one test'''
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -33,6 +33,11 @@ Each test case has required data:

id: A unique alphanumeric value to identify a particular test case
name: Descriptive name that explains the command under test
skip: A completely optional key, if the corresponding value is "yes"
then tdc will not execute the test case in question. However,
this test case will still appear in the results output but
marked as skipped. This key can be placed anywhere inside the
test case at the top level.
category: A list of single-word descriptions covering what the command
under test is testing. Example: filter, actions, u32, gact, etc.
setup: The list of commands required to ensure the command under test
Expand Down
16 changes: 8 additions & 8 deletions tools/testing/selftests/tc-testing/plugin-lib/valgrindPlugin.py
Original file line number Diff line number Diff line change
Expand Up @@ -102,6 +102,14 @@ def post_execute(self):
if not self.args.valgrind:
return

res = TestResult('{}-mem'.format(self.args.testid),
'{} memory leak check'.format(self.args.test_name))
if self.args.test_skip:
res.set_result(ResultState.skip)
res.set_errormsg('Test case designated as skipped.')
self._add_results(res)
return

self.definitely_lost_re = re.compile(
r'definitely lost:\s+([,0-9]+)\s+bytes in\s+([,0-9]+)\sblocks', re.MULTILINE | re.DOTALL)
self.indirectly_lost_re = re.compile(
Expand Down Expand Up @@ -134,8 +142,6 @@ def post_execute(self):
nle_num = int(nle_mo.group(1))

mem_results = ''
res = TestResult('{}-mem'.format(self.args.testid),
'{} memory leak check'.format(self.args.test_name))
if (def_num > 0) or (ind_num > 0) or (pos_num > 0) or (nle_num > 0):
mem_results += 'not '
res.set_result(ResultState.fail)
Expand All @@ -146,12 +152,6 @@ def post_execute(self):

self._add_results(res)

mem_results += 'ok {} - {}-mem # {}\n'.format(
self.args.test_ordinal, self.args.testid, 'memory leak check')
self._add_to_tap(mem_results)
if mem_results.startswith('not '):
print('{}'.format(content))
self._add_to_tap(content)

def _add_results(self, res):
self._tsr.add_resultdata(res)
Expand Down
15 changes: 12 additions & 3 deletions tools/testing/selftests/tc-testing/tdc.py
Original file line number Diff line number Diff line change
Expand Up @@ -61,10 +61,10 @@ def call_post_suite(self, index):
for pgn_inst in reversed(self.plugin_instances):
pgn_inst.post_suite(index)

def call_pre_case(self, test_ordinal, testid, test_name):
def call_pre_case(self, testid, test_name, *, test_skip=False):
for pgn_inst in self.plugin_instances:
try:
pgn_inst.pre_case(test_ordinal, testid, test_name)
pgn_inst.pre_case(testid, test_name, test_skip)
except Exception as ee:
print('exception {} in call to pre_case for {} plugin'.
format(ee, pgn_inst.__class__))
Expand Down Expand Up @@ -192,10 +192,19 @@ def run_one_test(pm, args, index, tidx):
print("\t====================\n=====> ", end="")
print("Test " + tidx["id"] + ": " + tidx["name"])

if 'skip' in tidx:
if tidx['skip'] == 'yes':
res = TestResult(tidx['id'], tidx['name'])
res.set_result(ResultState.skip)
res.set_errormsg('Test case designated as skipped.')
pm.call_pre_case(tidx['id'], tidx['name'], test_skip=True)
pm.call_post_execute()
return res

# populate NAMES with TESTID for this test
NAMES['TESTID'] = tidx['id']

pm.call_pre_case(index, tidx['id'], tidx['name'])
pm.call_pre_case(tidx['id'], tidx['name'])
prepare_env(args, pm, 'setup', "-----> prepare stage", tidx["setup"])

if (args.verbose > 0):
Expand Down

0 comments on commit 255c1c7

Please sign in to comment.