Skip to content

Instantly share code, notes, and snippets.

@apahim
Created October 24, 2015 16:35
Show Gist options
  • Save apahim/e661960b512d764a1fc2 to your computer and use it in GitHub Desktop.
Save apahim/e661960b512d764a1fc2 to your computer and use it in GitHub Desktop.
commit 805b2aa2e99de434bb9e1e27b1d89b91a2147109
Author: Amador Pahim <[email protected]>
Date: Fri Oct 23 09:43:39 2015 -0200
Adding support to --replay-test-status
Signed-off-by: Amador Pahim <[email protected]>
diff --git a/avocado/core/job.py b/avocado/core/job.py
index 8a436b3..d0e1735 100644
--- a/avocado/core/job.py
+++ b/avocado/core/job.py
@@ -86,6 +86,10 @@ class Job(object):
self.args = args
self.standalone = getattr(self.args, 'standalone', False)
self.replay = getattr(self.args, 'replay', False)
+ self.replay_test_status = getattr(self.args, 'replay-test-status',
+ False)
+ self.replay_ignore = getattr(self.args, 'replay-ignore',
+ False)
unique_id = getattr(self.args, 'unique_job_id', None)
if unique_id is None:
unique_id = job_id.create_unique_job_id()
@@ -459,7 +463,7 @@ class Job(object):
with open(mux_file, 'r') as mux_file_obj:
rec_mux_file_obj.write(mux_file_obj.read())
- def _run(self, urls=None):
+ def _run(self, urls=None, replay_map=None):
"""
Unhandled job method. Runs a list of test URLs to its completion.
@@ -504,7 +508,7 @@ class Job(object):
self._record_job_replay(self._handle_urls(urls))
self.view.logfile = self.logfile
- failures = self.test_runner.run_suite(test_suite, mux,
+ failures = self.test_runner.run_suite(test_suite, mux, replay_map,
timeout=self.timeout)
self.view.stop_file_logging()
# If it's all good so far, set job status to 'PASS'
@@ -592,12 +596,19 @@ class Job(object):
pattern = os.path.join(mux_dir, "*.yaml")
return glob.glob(pattern)
-# def _get_recorded_results(self, replaydir):
-# resultsfile = os.path.join(self.logdir, replaydir, "results.json")
-# with open(resultsfile, 'r') as results_file_obj:
-# results = results_file_obj.read()
-#
-# return json.loads(results)
+ def _get_replay_map(self, resultsdir, replay_test_status):
+ replay_map = []
+ resultsfile = os.path.join(resultsdir, "results.json")
+ with open(resultsfile, 'r') as results_file_obj:
+ results = json.loads(results_file_obj.read())
+
+ for status in replay_test_status:
+ for index, test in enumerate(results['tests']):
+ if test['status'] == status:
+ replay_map.append(index)
+
+ return replay_map
+
def _probe_job_replay_dir(self, jobid):
idfile_pattern = '%s/job-*/id' % data_dir.get_logs_dir()
@@ -608,20 +619,37 @@ class Job(object):
return os.path.dirname(id_file)
def _replay(self, jobid, urls):
+ replay_map = None
+ filter_status = True
urls = self._handle_urls(urls)
+ resultsdir = os.path.join(self._probe_job_replay_dir(jobid))
replaydir = os.path.join(self._probe_job_replay_dir(jobid),
- ".replay")
+ ".replay")
if not self.args.multiplex_files:
- setattr(self.args, 'multiplex_files',
- self._get_recorded_muxfiles(replaydir))
+ if self.replay_ignore and 'mux' in self.replay_ignore:
+ if self.replay_test_status:
+ filter_status = False
+ pass
+ else:
+ setattr(self.args, 'multiplex_files',
+ self._get_recorded_muxfiles(replaydir))
+
+ if self.replay_test_status:
+ filter_status = True
+ replay_map = self._get_replay_map(resultsdir,
+ self.replay_test_status)
+
+ if not filter_status:
+ no_filter = "Ignoring \"--replay-test-status\". It can be only " \
+ "used when using the recorded job multiplex."
+ filter_status = self.view.notify(event='warning',
+ msg=str(no_filter))
if not urls:
urls = self._get_recorded_urls(replaydir)
- return self._run(urls)
- else:
- return self._run(urls)
+ return self._run(urls, replay_map)
class TestProgram(object):
diff --git a/avocado/core/plugins/runner.py b/avocado/core/plugins/runner.py
index d8cf192..b9b8518 100644
--- a/avocado/core/plugins/runner.py
+++ b/avocado/core/plugins/runner.py
@@ -54,6 +54,15 @@ class TestRunner(plugin.Plugin):
type=str, default=None,
help='Replay a job identified by its hash')
+ self.parser.add_argument('--replay-ignore', dest='replay-ignore',
+ type=str, default=None, nargs='*',
+ help='Ignore replay properties')
+
+ self.parser.add_argument('--replay-test-status',
+ dest='replay-test-status', type=str,
+ default=None, nargs='*',
+ help='Filter replay by job status')
+
self.parser.add_argument('-z', '--archive', action='store_true', default=False,
help='Archive (ZIP) files generated by tests')
diff --git a/avocado/core/runner.py b/avocado/core/runner.py
index 72d1814..b98c88d 100644
--- a/avocado/core/runner.py
+++ b/avocado/core/runner.py
@@ -238,7 +238,7 @@ class TestRunner(object):
return False
return True
- def run_suite(self, test_suite, mux, timeout=0):
+ def run_suite(self, test_suite, mux, replay_map=None, timeout=0):
"""
Run one or more tests and report with test result.
@@ -258,11 +258,15 @@ class TestRunner(object):
else:
deadline = None
+ index = -1
for test_template in test_suite:
test_template[1]['base_logdir'] = self.job.logdir
test_template[1]['job'] = self.job
break_loop = False
for test_factory in mux.itertests(test_template):
+ index += 1
+ if replay_map and index not in replay_map:
+ continue
if deadline is not None and time.time() > deadline:
test_parameters = test_factory[1]
if 'methodName' in test_parameters:
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment