From 507257ce32cb3a5e74efa42ccdd75fdde2dd1c69 Mon Sep 17 00:00:00 2001 From: Lucas Meneghel Rodrigues Date: Mon, 28 Jul 2014 12:15:42 -0300 Subject: [PATCH] avocado.job: Get rid of the 1 test == 1 dir rule Make it possible to load avocado tests from any path, rather than enforcing the rule '1 test has 1 dir'. Signed-off-by: Lucas Meneghel Rodrigues --- avocado/job.py | 56 ++++++++++++++++++++++++++++++++------------------ 1 file changed, 36 insertions(+), 20 deletions(-) diff --git a/avocado/job.py b/avocado/job.py index 15fae08d..773767b4 100644 --- a/avocado/job.py +++ b/avocado/job.py @@ -69,28 +69,44 @@ class TestRunner(object): :type params: dict :return: an instance of :class:`avocado.test.Test`. """ - shortname = params.get('shortname') - url = shortname.split('.')[0] - path_attempt = os.path.abspath(shortname) - if os.path.exists(path_attempt): - test_class = test.DropinTest - test_instance = test_class(path=path_attempt, - base_logdir=self.job.logdir, - job=self.job) - else: + t_id = params.get('id') + test_path = os.path.abspath(t_id) + path_analyzer = path.PathInspector(test_path) + module_name = os.path.basename(test_path).split('.')[0] + if not os.path.exists(test_path): + # Try to resolve test ID (keep compatibility) + test_path = os.path.join(data_dir.get_test_dir(), '%s.py' % t_id) + if os.path.exists(test_path): + path_analyzer = path.PathInspector(test_path) + else: + test_class = test.MissingTest + test_instance = test_class(name=module_name, + base_logdir=self.job.logdir, + params=params, + job=self.job) + return test_instance + + if path_analyzer.is_python(): try: - test_module_dir = os.path.join(self.job.test_dir, url) - f, p, d = imp.find_module(url, [test_module_dir]) - test_module = imp.load_module(url, f, p, d) + test_module_dir = os.path.dirname(test_path) + f, p, d = imp.find_module(module_name, [test_module_dir]) + test_module = imp.load_module(module_name, f, p, d) f.close() - test_class = getattr(test_module, url) + test_class = getattr(test_module, module_name) except ImportError: test_class = test.MissingTest finally: - test_instance = test_class(name=url, + test_instance = test_class(name=module_name, base_logdir=self.job.logdir, params=params, job=self.job) + + else: + test_class = test.DropinTest + test_instance = test_class(path=test_path, + base_logdir=self.job.logdir, + job=self.job) + return test_instance def run_test(self, instance, queue): @@ -287,7 +303,7 @@ class Job(object): if urls is not None: for url in urls: - params_list.append({'shortname': url}) + params_list.append({'id': url}) if multiplex_file is None: if self.args and self.args.multiplex_file is not None: @@ -299,18 +315,18 @@ class Job(object): params_list = [] if urls is not None: for url in urls: + test_module = os.path.basename(url).split('.')[0] parser = multiplex_config.Parser(multiplex_file) - parser.only_filter(url) + parser.only_filter(test_module) dcts = [d for d in parser.get_dicts()] if dcts: for dct in dcts: + dct['id'] = url params_list.append(dct) else: - params_list.append({'shortname': url}) + params_list.append({'id': url}) else: - parser = multiplex_config.Parser(multiplex_file) - for dct in parser.get_dicts(): - params_list.append(dct) + raise ValueError('A test path must be provided') if self.args is not None: self.args.test_result_total = len(params_list) -- GitLab