diff options
Diffstat (limited to 'testing/mozharness/scripts/marionette_harness_tests.py')
-rw-r--r-- | testing/mozharness/scripts/marionette_harness_tests.py | 141 |
1 files changed, 141 insertions, 0 deletions
diff --git a/testing/mozharness/scripts/marionette_harness_tests.py b/testing/mozharness/scripts/marionette_harness_tests.py new file mode 100644 index 000000000..0811bef9c --- /dev/null +++ b/testing/mozharness/scripts/marionette_harness_tests.py @@ -0,0 +1,141 @@ +#!/usr/bin/env python +# This Source Code Form is subject to the terms of the Mozilla Public +# License, v. 2.0. If a copy of the MPL was not distributed with this file, +# You can obtain one at http://mozilla.org/MPL/2.0/. +import copy +import os +import sys + +# load modules from parent dir +sys.path.insert(1, os.path.dirname(sys.path[0])) + +from mozharness.base.python import PreScriptAction +from mozharness.base.python import ( + VirtualenvMixin, + virtualenv_config_options, +) +from mozharness.base.script import BaseScript +from mozharness.mozilla.buildbot import ( + BuildbotMixin, TBPL_SUCCESS, TBPL_WARNING, TBPL_FAILURE, + TBPL_EXCEPTION +) + +marionette_harness_tests_config_options = [ + [['--tests'], { + 'dest': 'test_path', + 'default': None, + 'help': 'Path to test_*.py or directory relative to src root.', + }], + [['--src-dir'], { + 'dest': 'rel_src_dir', + 'default': None, + 'help': 'Path to hg.mo source checkout relative to work dir.', + }], + +] + copy.deepcopy(virtualenv_config_options) + +marionette_harness_tests_config = { + "find_links": [ + "http://pypi.pub.build.mozilla.org/pub", + ], + "pip_index": False, + # relative to workspace + "rel_src_dir": os.path.join("build", "src"), +} + +class MarionetteHarnessTests(VirtualenvMixin, BuildbotMixin, BaseScript): + + def __init__(self, config_options=None, + all_actions=None, default_actions=None, + *args, **kwargs): + config_options = config_options or marionette_harness_tests_config_options + actions = [ + 'clobber', + 'create-virtualenv', + 'run-tests', + ] + super(MarionetteHarnessTests, self).__init__( + config_options=config_options, + all_actions=all_actions or actions, + default_actions=default_actions or actions, + config=marionette_harness_tests_config, + *args, **kwargs) + + @PreScriptAction('create-virtualenv') + def _pre_create_virtualenv(self, action): + dirs = self.query_abs_dirs() + c = self.config + requirements = os.path.join( + dirs['abs_src_dir'], + 'testing', 'config', + 'marionette_harness_test_requirements.txt' + ) + self.register_virtualenv_module( + requirements=[requirements], + two_pass=True + ) + + def query_abs_dirs(self): + if self.abs_dirs: + return self.abs_dirs + c = self.config + abs_dirs = super(MarionetteHarnessTests, self).query_abs_dirs() + dirs = { + 'abs_src_dir': os.path.abspath( + os.path.join(abs_dirs['base_work_dir'], c['rel_src_dir']) + ), + } + + for key in dirs: + if key not in abs_dirs: + abs_dirs[key] = dirs[key] + self.abs_dirs = abs_dirs + + return self.abs_dirs + + def _get_pytest_status(self, code): + """ + Translate pytest exit code to TH status + + Based on https://github.com/pytest-dev/pytest/blob/master/_pytest/main.py#L21-L26 + """ + if code == 0: + return TBPL_SUCCESS + elif code == 1: + return TBPL_WARNING + elif 1 < code < 6: + self.error("pytest returned exit code: %s" % code) + return TBPL_FAILURE + else: + return TBPL_EXCEPTION + + def run_tests(self): + """Run all the tests""" + dirs = self.query_abs_dirs() + test_relpath = self.config.get( + 'test_path', + os.path.join('testing', 'marionette', + 'harness', 'marionette_harness', 'tests', + 'harness_unit') + ) + test_path = os.path.join(dirs['abs_src_dir'], test_relpath) + self.activate_virtualenv() + import pytest + command = ['-p', 'no:terminalreporter', # disable pytest logging + test_path] + logs = {} + for fmt in ['tbpl', 'mach', 'raw']: + logs[fmt] = os.path.join(dirs['abs_log_dir'], + 'mn-harness_{}.log'.format(fmt)) + command.extend(['--log-'+fmt, logs[fmt]]) + self.info('Calling pytest.main with the following arguments: %s' % command) + status = self._get_pytest_status(pytest.main(command)) + self.read_from_file(logs['tbpl']) + for log in logs.values(): + self.copy_to_upload_dir(log, dest='logs/') + self.buildbot_status(status) + + +if __name__ == '__main__': + script = MarionetteHarnessTests() + script.run_and_exit() |