Quelle android_hardware_unittest.py
Sprache: Python
#!/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/.
# load modules from parent dir
sys.path.insert(1, os.path.dirname(sys.path[0]))
from mozharness.base.log import WARNING from mozharness.base.script import BaseScript, PreScriptAction from mozharness.mozilla.automation import TBPL_RETRY from mozharness.mozilla.mozbase import MozbaseMixin from mozharness.mozilla.testing.android import AndroidMixin from mozharness.mozilla.testing.codecoverage import CodeCoverageMixin from mozharness.mozilla.testing.testbase import TestingMixin, testing_config_options
str_format_values = { "device_serial": self.device_serial, "remote_webserver": c["remote_webserver"], "xre_path": self.xre_path, "utility_path": self.xre_path, "http_port": "8854", # starting http port to use for the mochitest server "ssl_port": "4454", # starting ssl port to use for the server "certs_path": os.path.join(dirs["abs_work_dir"], "tests/certs"), # TestingMixin._download_and_extract_symbols() will set # self.symbols_path when downloading/extracting. "symbols_path": self.symbols_path, "modules_dir": dirs["abs_modules_dir"], "installer_path": self.installer_path, "raw_log_file": raw_log_file, "log_tbpl_level": self.log_tbpl_level, "log_raw_level": self.log_raw_level, "error_summary_file": error_summary_file, "xpcshell_extra": c.get("xpcshell_extra", ""), "jittest_flags": self.jittest_flags,
}
for option in self.config["suite_definitions"][self.test_suite]["options"]:
opt = option.split("=")[0] # override configured chunk options with script args, if specified if opt in ("--this-chunk", "--total-chunks"): if (
user_paths or getattr(self, opt.replace("-", "_").strip("_"), None) isnotNone
): continue
if"%(app)"in option: # only query package name if requested
cmd.extend([option % {"app": self.query_package_name()}]) else:
option = option % str_format_values if option:
cmd.extend([option])
ifnot self.verify_enabled andnot user_paths: if self.this_chunk isnotNone:
cmd.extend(["--this-chunk", self.this_chunk]) if self.total_chunks isnotNone:
cmd.extend(["--total-chunks", self.total_chunks])
if"mochitest"in self.test_suite:
category = "mochitest" elif"reftest"in self.test_suite or"crashtest"in self.test_suite:
category = "reftest" else:
category = self.test_suite if c.get("repeat"): if category in SUITE_REPEATABLE:
cmd.extend(["--repeat=%s" % c.get("repeat")]) else:
self.log("--repeat not supported in {}".format(category), level=WARNING)
if category notin SUITE_NO_E10S: if category in SUITE_DEFAULT_E10S andnot c["e10s"]:
cmd.append("--disable-e10s") elif category notin SUITE_DEFAULT_E10S and c["e10s"]:
cmd.append("--e10s")
if self.disable_fission and category notin SUITE_NO_E10S:
cmd.append("--disable-fission")
cmd.extend(["--setpref={}".format(p) for p in self.extra_prefs])
try_options, try_tests = self.try_args(self.test_suite) if try_options:
cmd.extend(try_options)
if user_paths: # reftest on android-hw uses a subset (reftest-qr) of tests, # but scheduling only knows about 'reftest'
suite = self.test_suite if suite == "reftest-qr":
suite = "reftest"
if user_paths.get(suite, []):
suite_test_paths = user_paths.get(suite, []) # NOTE: we do not want to prepend 'tests' if a single path if confirm_paths and confirm_paths.get(suite, []):
suite_test_paths = confirm_paths.get(suite, [])
suite_test_paths = [os.path.join("tests", p) for p in suite_test_paths]
cmd.extend(suite_test_paths)
########################################## # Actions for AndroidHardwareTest # ##########################################
def preflight_install(self): # in the base class, this checks for mozinstall, but we don't use it pass
@PreScriptAction("create-virtualenv") def pre_create_virtualenv(self, action):
dirs = self.query_abs_dirs()
requirements = None
suites = self._query_suites() if ("mochitest-media", "mochitest-media") in suites: # mochitest-media is the only thing that needs this
requirements = os.path.join(
dirs["abs_mochitest_dir"], "websocketprocessbridge", "websocketprocessbridge_requirements_3.txt",
) if requirements:
self.register_virtualenv_module(requirements=[requirements])
def install(self): """
Install APKs on the device. """
install_needed = (not self.test_suite) or self.config["suite_definitions"][
self.test_suite
].get("install") if install_needed isFalse:
self.info("Skipping apk installation for %s" % self.test_suite) return assert (
self.installer_path isnotNone
), "Either add installer_path to the config or use --installer-path."
self.uninstall_android_app()
self.install_android_app(self.installer_path)
self.info("Finished installing apps for %s" % self.device_name)
def run_tests(self): """
Run the tests """
self.start_time = datetime.datetime.now()
max_per_test_time = datetime.timedelta(minutes=60)
per_test_args = []
suites = self._query_suites()
minidump = self.query_minidump_stackwalk() for per_test_suite, suite in suites:
self.test_suite = suite
try:
cwd = self._query_tests_dir() except Exception:
self.fatal("Don't know how to run --test-suite '%s'!" % self.test_suite)
env = self.query_env() if minidump:
env["MINIDUMP_STACKWALK"] = minidump
env["MOZ_UPLOAD_DIR"] = self.query_abs_dirs()["abs_blob_upload_dir"]
env["MINIDUMP_SAVE_PATH"] = self.query_abs_dirs()["abs_blob_upload_dir"]
env["RUST_BACKTRACE"] = "full"
summary = None for per_test_args in self.query_args(per_test_suite): if (datetime.datetime.now() - self.start_time) > max_per_test_time: # Running tests has run out of time. That is okay! Stop running # them so that a task timeout is not triggered, and so that # (partial) results are made available in a timely manner.
self.info( "TinderboxPrint: Running tests took too long: " "Not all tests were executed. "
) # Signal per-test time exceeded, to break out of suites and # suite categories loops also. return
cmd = self._build_command()
final_cmd = copy.copy(cmd) if len(per_test_args) > 0: # in per-test mode, remove any chunk arguments from command for arg in final_cmd: if"total-chunk"in arg or"this-chunk"in arg:
final_cmd.remove(arg)
final_cmd.extend(per_test_args)
self.info( "Running on %s the command %s"
% (self.device_name, subprocess.list2cmdline(final_cmd))
)
self.info("##### %s log begins" % self.test_suite)
if len(per_test_args) > 0:
self.record_status(tbpl_status, level=log_level)
self.log_per_test_status(per_test_args[-1], tbpl_status, log_level) if tbpl_status == TBPL_RETRY:
self.info("Per-test run abandoned due to RETRY status") return else:
self.record_status(tbpl_status, level=log_level) # report as INFO instead of log_level to avoid extra Treeherder lines
self.info( "The %s suite: %s ran with return status: %s"
% (suite_category, suite, tbpl_status),
)
if __name__ == "__main__":
test = AndroidHardwareTest()
test.run_and_exit()
Die Informationen auf dieser Webseite wurden
nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit,
noch Qualität der bereit gestellten Informationen zugesichert.
Bemerkung:
Die farbliche Syntaxdarstellung ist noch experimentell.