Bug 1877642 - Disable browser_fullscreen-tab-close-race.js on apple_silicon !debug...
[gecko.git] / testing / mochitest / mach_test_package_commands.py
blob7bbd294fa6a573df2202934541b73892587abde6
1 # This Source Code Form is subject to the terms of the Mozilla Public
2 # License, v. 2.0. If a copy of the MPL was not distributed with this
3 # file, You can obtain one at http://mozilla.org/MPL/2.0/.
5 import json
6 import os
7 import sys
8 from argparse import Namespace
9 from functools import partial
11 import six
12 from mach.decorators import Command
14 here = os.path.abspath(os.path.dirname(__file__))
15 parser = None
16 logger = None
19 def run_test(context, is_junit, **kwargs):
20 from mochitest_options import ALL_FLAVORS
21 from mozlog.commandline import setup_logging
23 if not kwargs.get("log"):
24 kwargs["log"] = setup_logging("mochitest", kwargs, {"mach": sys.stdout})
25 global logger
26 logger = kwargs["log"]
28 flavor = kwargs.get("flavor") or "mochitest"
29 if flavor not in ALL_FLAVORS:
30 for fname, fobj in six.iteritems(ALL_FLAVORS):
31 if flavor in fobj["aliases"]:
32 flavor = fname
33 break
34 fobj = ALL_FLAVORS[flavor]
35 kwargs.update(fobj.get("extra_args", {}))
37 if kwargs.get("allow_software_gl_layers"):
38 os.environ["MOZ_LAYERS_ALLOW_SOFTWARE_GL"] = "1"
39 del kwargs["allow_software_gl_layers"]
40 if kwargs.get("mochitest_suite"):
41 suite = kwargs["mochitest_suite"]
42 del kwargs["mochitest_suite"]
43 elif kwargs.get("test_suite"):
44 suite = kwargs["test_suite"]
45 del kwargs["test_suite"]
46 if kwargs.get("no_run_tests"):
47 del kwargs["no_run_tests"]
49 args = Namespace(**kwargs)
50 args.e10s = context.mozharness_config.get("e10s", args.e10s)
51 args.certPath = context.certs_dir
53 if is_junit:
54 return run_geckoview_junit(context, args)
56 # subsuite mapping from mozharness configs
57 subsuites = {
58 # --mochitest-suite -> --subsuite
59 "mochitest-chrome-gpu": "gpu",
60 "mochitest-plain-gpu": "gpu",
61 "mochitest-media": "media",
62 "mochitest-browser-screenshots": "screenshots",
63 "mochitest-webgl1-core": "webgl1-core",
64 "mochitest-webgl1-ext": "webgl1-ext",
65 "mochitest-webgl2-core": "webgl2-core",
66 "mochitest-webgl2-ext": "webgl2-ext",
67 "mochitest-webgl2-deqp": "webgl2-deqp",
68 "mochitest-webgpu": "webgpu",
69 "mochitest-devtools-chrome": "devtools",
70 "mochitest-browser-a11y": "a11y",
71 "mochitest-remote": "remote",
72 "mochitest-browser-media": "media-bc",
74 args.subsuite = subsuites.get(suite)
75 if args.subsuite == "devtools":
76 args.flavor = "browser"
77 if args.subsuite == "a11y":
78 args.flavor = "browser"
79 if args.subsuite == "media-bc":
80 args.flavor = "browser"
82 if not args.test_paths:
83 mh_test_paths = json.loads(os.environ.get("MOZHARNESS_TEST_PATHS", '""'))
84 if mh_test_paths:
85 logger.info("Found MOZHARNESS_TEST_PATHS:")
86 logger.info(str(mh_test_paths))
87 args.test_paths = []
88 for k in mh_test_paths:
89 args.test_paths.extend(mh_test_paths[k])
90 if args.test_paths:
91 install_subdir = fobj.get("install_subdir", fobj["suite"])
92 test_root = os.path.join(context.package_root, "mochitest", install_subdir)
93 normalize = partial(context.normalize_test_path, test_root)
94 # pylint --py3k: W1636
95 args.test_paths = list(map(normalize, args.test_paths))
97 import mozinfo
99 if mozinfo.info.get("buildapp") == "mobile/android":
100 return run_mochitest_android(context, args)
101 return run_mochitest_desktop(context, args)
104 def run_mochitest_desktop(context, args):
105 args.app = args.app or context.firefox_bin
106 args.utilityPath = context.bin_dir
107 args.extraProfileFiles.append(os.path.join(context.bin_dir, "plugins"))
108 args.extraPrefs.append("webgl.force-enabled=true")
109 args.quiet = True
110 args.useTestMediaDevices = True
111 args.screenshotOnFail = True
112 args.cleanupCrashes = True
113 args.marionette_startup_timeout = "180"
114 args.sandboxReadWhitelist.append(context.mozharness_workdir)
115 if args.flavor == "browser":
116 args.chunkByRuntime = True
117 else:
118 args.chunkByDir = 4
120 from runtests import run_test_harness
122 logger.info("mach calling runtests with args: " + str(args))
123 return run_test_harness(parser, args)
126 def set_android_args(context, args):
127 args.app = args.app or "org.mozilla.geckoview.test_runner"
128 args.utilityPath = context.hostutils
129 args.xrePath = context.hostutils
130 config = context.mozharness_config
131 if config:
132 host = os.environ.get("HOST_IP", "10.0.2.2")
133 args.remoteWebServer = config.get("remote_webserver", host)
134 args.httpPort = config.get("http_port", 8854)
135 args.sslPort = config.get("ssl_port", 4454)
136 args.adbPath = config["exes"]["adb"] % {
137 "abs_work_dir": context.mozharness_workdir
139 args.deviceSerial = os.environ.get("DEVICE_SERIAL", "emulator-5554")
140 return args
143 def run_mochitest_android(context, args):
144 args = set_android_args(context, args)
145 args.extraProfileFiles.append(
146 os.path.join(context.package_root, "mochitest", "fonts")
149 from runtestsremote import run_test_harness
151 logger.info("mach calling runtestsremote with args: " + str(args))
152 return run_test_harness(parser, args)
155 def run_geckoview_junit(context, args):
156 args = set_android_args(context, args)
158 from runjunit import run_test_harness
160 # Force fission disabled by default for android
161 args["disable_fission"] = True
163 logger.info("mach calling runjunit with args: " + str(args))
164 return run_test_harness(parser, args)
167 def add_global_arguments(parser):
168 parser.add_argument("--test-suite")
169 parser.add_argument("--mochitest-suite")
170 parser.add_argument("--download-symbols")
171 parser.add_argument("--allow-software-gl-layers", action="store_true")
172 parser.add_argument("--no-run-tests", action="store_true")
175 def setup_mochitest_argument_parser():
176 import mozinfo
178 mozinfo.find_and_update_from_json(here)
179 app = "generic"
180 if mozinfo.info.get("buildapp") == "mobile/android":
181 app = "android"
183 from mochitest_options import MochitestArgumentParser
185 global parser
186 parser = MochitestArgumentParser(app=app)
187 add_global_arguments(parser)
188 return parser
191 def setup_junit_argument_parser():
192 from runjunit import JunitArgumentParser
194 global parser
195 parser = JunitArgumentParser()
196 add_global_arguments(parser)
197 return parser
200 @Command(
201 "mochitest",
202 category="testing",
203 description="Run the mochitest harness.",
204 parser=setup_mochitest_argument_parser,
206 def mochitest(command_context, **kwargs):
207 command_context._mach_context.activate_mozharness_venv()
208 return run_test(command_context._mach_context, False, **kwargs)
211 @Command(
212 "geckoview-junit",
213 category="testing",
214 description="Run the geckoview-junit harness.",
215 parser=setup_junit_argument_parser,
217 def geckoview_junit(command_context, **kwargs):
218 command_context._mach_context.activate_mozharness_venv()
219 return run_test(command_context._mach_context, True, **kwargs)