Created
October 24, 2015 16:35
-
-
Save apahim/e661960b512d764a1fc2 to your computer and use it in GitHub Desktop.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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