From 81cdf61bf6fcb012a580585290be0447cffff589 Mon Sep 17 00:00:00 2001 From: James Graham Date: Mon, 7 Dec 2015 12:28:40 +0000 Subject: [PATCH] Bug 1207377 - Add a |mach mozharness| command for running tests locally in mozharness, r=ahal --- build/mach_bootstrap.py | 1 + .../configs/marionette/test_config.py | 4 - testing/mozharness/mach_commands.py | 205 ++++++++++++++++++ .../mozharness/mozilla/testing/testbase.py | 2 +- 4 files changed, 207 insertions(+), 5 deletions(-) create mode 100644 testing/mozharness/mach_commands.py diff --git a/build/mach_bootstrap.py b/build/mach_bootstrap.py index 0ed91c625b84..7c9b796573d1 100644 --- a/build/mach_bootstrap.py +++ b/build/mach_bootstrap.py @@ -120,6 +120,7 @@ MACH_MODULES = [ 'testing/taskcluster/mach_commands.py', 'testing/marionette/mach_commands.py', 'testing/mochitest/mach_commands.py', + 'testing/mozharness/mach_commands.py', 'testing/xpcshell/mach_commands.py', 'testing/talos/mach_commands.py', 'testing/web-platform/mach_commands.py', diff --git a/testing/mozharness/configs/marionette/test_config.py b/testing/mozharness/configs/marionette/test_config.py index a04ae379791a..f0cc15cc515b 100644 --- a/testing/mozharness/configs/marionette/test_config.py +++ b/testing/mozharness/configs/marionette/test_config.py @@ -6,10 +6,6 @@ config = { "marionette_address": "localhost:2828", "test_manifest": "unit-tests.ini", - # XXX: replace these with something appropriate to your system - "installer_url": "http://archive.mozilla.org/pub/firefox/tinderbox-builds/mozilla-central-linux-debug/1344372927/firefox-17.0a1.en-US.linux-i686.tar.bz2", - "test_url": "http://archive.mozilla.org/pub/firefox/tinderbox-builds/mozilla-central-linux-debug/1344372927/firefox-17.0a1.en-US.linux-i686.tests.zip", - "default_actions": [ 'clobber', 'download-and-extract', diff --git a/testing/mozharness/mach_commands.py b/testing/mozharness/mach_commands.py new file mode 100644 index 000000000000..1115cb96949f --- /dev/null +++ b/testing/mozharness/mach_commands.py @@ -0,0 +1,205 @@ +# 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/. + +from __future__ import absolute_import, print_function, unicode_literals + +import argparse +import os +import re +import subprocess +import sys +import urllib +import urlparse + +import mozinfo + +from mach.decorators import ( + CommandArgument, + CommandProvider, + Command, +) + +from mozbuild.base import MachCommandBase, MozbuildObject +from mozbuild.base import MachCommandConditions as conditions +from argparse import ArgumentParser + +def get_parser(): + parser = argparse.ArgumentParser() + parser.add_argument("suite_name", nargs=1, type=str, action="store", + help="Suite to run in mozharness") + parser.add_argument("mozharness_args", nargs=argparse.REMAINDER, + help="Extra arguments to pass to mozharness") + return parser + +class MozharnessRunner(MozbuildObject): + def __init__(self, *args, **kwargs): + MozbuildObject.__init__(self, *args, **kwargs) + + + self.test_packages_url = os.path.join(self.topobjdir, "dist", "test_packages.json") + self.installer_url = self._installer_url() + + desktop_unittest_config = [ + "--config-file", lambda: self.config_path("unittests", + "%s_unittest.py" % mozinfo.info['os']), + "--config-file", lambda: self.config_path("developer_config.py")] + + self.config = { + "__defaults__": { + "config": ["--no-read-buildbot-config", + "--download-symbols", "ondemand", + "--installer-url", self.installer_url, + "--test-packages-url", self.test_packages_url] + }, + + "mochitest": { + "script": "desktop_unittest.py", + "config": desktop_unittest_config + [ + "--mochitest-suite", "plain"] + }, + "mochitest-chrome": { + "script": "desktop_unittest.py", + "config": desktop_unittest_config + [ + "--mochitest-suite", "chrome"] + }, + "mochitest-browser-chrome": { + "script": "desktop_unittest.py", + "config": desktop_unittest_config + [ + "--mochitest-suite", "browser-chrome"] + }, + "mochitest-devtools-chrome": { + "script": "desktop_unittest.py", + "config": desktop_unittest_config + [ + "--mochitest-suite", "mochitest-devtools-chrome"] + }, + "reftest": { + "script": "desktop_unittest.py", + "config": desktop_unittest_config + [ + "--reftest-suite", "reftest"] + }, + "crashtest": { + "script": "desktop_unittest.py", + "config": desktop_unittest_config + [ + "--reftest-suite", "crashtest"] + }, + "jsreftest": { + "script": "desktop_unittest.py", + "config": desktop_unittest_config + [ + "--reftest-suite", "jsreftest"] + }, + "reftest-ipc": { + "script": "desktop_unittest.py", + "config": desktop_unittest_config + [ + "--reftest-suite", "reftest-ipc"] + }, + "reftest-no-accel": { + "script": "desktop_unittest.py", + "config": desktop_unittest_config + [ + "--reftest-suite", "reftest-no-accel"] + }, + "crashtest-ipc": { + "script": "desktop_unittest.py", + "config": desktop_unittest_config + [ + "--reftest-suite", "crashtest-ipc"] + }, + "cppunittest": { + "script": "desktop_unittest.py", + "config": desktop_unittest_config + [ + "--cppunittest-suite", "cppunittest"] + }, + "webapprt-chrome": { + "script": "desktop_unittest.py", + "config": desktop_unittest_config + [ + "--webapprt-suite", "chrome"] + }, + "webapprt-content": { + "script": "desktop_unittest.py", + "config": desktop_unittest_config + [ + "--webapprt-suite", "content"] + }, + "xpcshell": { + "script": "desktop_unittest.py", + "config": desktop_unittest_config + [ + "--xpcshell-suite", "xpcshell"] + }, + "xpcshell-addons": { + "script": "desktop_unittest.py", + "config": desktop_unittest_config + [ + "--xpcshell-suite", "xpcshell-addons"] + }, + "jittest": { + "script": "desktop_unittest.py", + "config": desktop_unittest_config + [ + "--jittest-suite", "jittest"] + }, + "mozbase": { + "script": "desktop_unittest.py", + "config": desktop_unittest_config + [ + "--mozbase-suite", "mozbase"] + }, + "marionette": { + "script": "marionette.py", + "config": ["--config-file", self.config_path("marionette", + "test_config.py")] + }, + "web-platform-tests": { + "script": "web_platform_tests.py", + "config": ["--config-file", self.config_path("web_platform_tests", + self.wpt_config)] + }, + } + + + def path_to_url(self, path): + return urlparse.urljoin('file:', urllib.pathname2url(path)) + + def _installer_url(self): + package_re = { + "linux": re.compile("^firefox-\d+\..+\.tar\.bz2$"), + "win": re.compile("^firefox-\d+\..+\.installer\.exe$"), + "mac": re.compile("^firefox-\d+\..+\.mac(?:64)?\.dmg$"), + }[mozinfo.info['os']] + dist_path = os.path.join(self.topobjdir, "dist") + filenames = [item for item in os.listdir(dist_path) if + package_re.match(item)] + assert len(filenames) == 1 + return self.path_to_url(os.path.join(dist_path, filenames[0])) + + + def config_path(self, *parts): + return self.path_to_url(os.path.join(self.topsrcdir, "testing", "mozharness", + "configs", *parts)) + + @property + def wpt_config(self): + return "test_config.py" if mozinfo.info['os'] != "win" else "test_config_windows.py" + + def run_suite(self, suite, **kwargs): + default_config = self.config.get("__defaults__") + suite_config = self.config.get(suite) + + if suite_config is None: + print("Unknown suite %s" % suite) + return 1 + + script = os.path.join(self.topsrcdir, "testing", "mozharness", + "scripts", suite_config["script"]) + options = [item() if callable(item) else item + for item in default_config["config"] + suite_config["config"]] + + cmd = [script] + options + + rv = subprocess.call(cmd, cwd=os.path.dirname(script)) + return rv + + +@CommandProvider +class MozharnessCommands(MachCommandBase): + @Command('mozharness', category='testing', + description='Run tests using mozharness.', + conditions=[conditions.is_firefox], + parser=get_parser) + def mozharness(self, **kwargs): + runner = self._spawn(MozharnessRunner) + return runner.run_suite(kwargs.pop("suite_name")[0], **kwargs) diff --git a/testing/mozharness/mozharness/mozilla/testing/testbase.py b/testing/mozharness/mozharness/mozilla/testing/testbase.py index 661fccb23286..19be45b357b2 100755 --- a/testing/mozharness/mozharness/mozilla/testing/testbase.py +++ b/testing/mozharness/mozharness/mozilla/testing/testbase.py @@ -538,7 +538,7 @@ You can set this by: if self.test_packages_url: self.error('Test data will be downloaded from "%s", the specified test ' ' package data at "%s" will be ignored.' % - (self.config('test_url'), self.test_packages_url)) + (self.config.get('test_url'), self.test_packages_url)) self._download_test_zip() self._extract_test_zip(target_unzip_dirs=target_unzip_dirs)