def run_perftest(self, **kwargs): push_to_try = kwargs.pop("push_to_try", False) if push_to_try: from pathlib import Path sys.path.append(str(Path(self.topsrcdir, "tools", "tryselect"))) from tryselect.push import push_to_try platform = kwargs.pop("try_platform") if platform not in _TRY_PLATFORMS: # we can extend platform support here: linux, win, macOs, pixel2 # by adding more jobs in taskcluster/ci/perftest/kind.yml # then picking up the right one here raise NotImplementedError("%r not supported yet" % platform) perftest_parameters = {} parser = get_perftest_parser()() for name, value in kwargs.items(): # ignore values that are set to default if parser.get_default(name) == value: continue perftest_parameters[name] = value parameters = { "try_task_config": { "tasks": [_TRY_PLATFORMS[platform]], "perftest-options": perftest_parameters, }, "try_mode": "try_task_config", } task_config = {"parameters": parameters, "version": 2} push_to_try("perftest", "perftest", try_task_config=task_config) return # run locally MachCommandBase._activate_virtualenv(self) from mozperftest.runner import run_tests run_tests(mach_cmd=self, **kwargs)
def run_perftest(self, **kwargs): # original parser that brought us there original_parser = self.get_parser() from pathlib import Path # user selection with fuzzy UI from mozperftest.utils import ON_TRY from mozperftest.script import ScriptInfo, ScriptType, ParseError if not ON_TRY and kwargs.get("tests", []) == []: from moztest.resolve import TestResolver from mozperftest.fzf.fzf import select resolver = self._spawn(TestResolver) test_objects = list( resolver.resolve_tests(paths=None, flavor="perftest")) selected = select(test_objects) def full_path(selection): __, script_name, __, location = selection.split(" ") return str( Path( self.topsrcdir.rstrip(os.sep), location.strip(os.sep), script_name, )) kwargs["tests"] = [full_path(s) for s in selected] if kwargs["tests"] == []: print("\nNo selection. Bye!") return if len(kwargs["tests"]) > 1: print("\nSorry no support yet for multiple local perftest") return sel = "\n".join(kwargs["tests"]) print("\nGood job! Best selection.\n%s" % sel) # if the script is xpcshell, we can force the flavor here # XXX on multi-selection, what happens if we have seeveral flavors? try: script_info = ScriptInfo(kwargs["tests"][0]) except ParseError as e: if e.exception is IsADirectoryError: script_info = None else: raise else: if script_info.script_type == ScriptType.xpcshell: kwargs["flavor"] = script_info.script_type.name else: # we set the value only if not provided (so "mobile-browser" # can be picked) if "flavor" not in kwargs: kwargs["flavor"] = "desktop-browser" push_to_try = kwargs.pop("push_to_try", False) if push_to_try: sys.path.append(str(Path(self.topsrcdir, "tools", "tryselect"))) from tryselect.push import push_to_try perftest_parameters = {} args = script_info.update_args( **original_parser.get_user_args(kwargs)) platform = args.pop("try_platform", "linux") if isinstance(platform, str): platform = [platform] platform = [ "%s-%s" % (plat, script_info.script_type.name) for plat in platform ] for plat in platform: if plat not in _TRY_PLATFORMS: # we can extend platform support here: linux, win, macOs, pixel2 # by adding more jobs in taskcluster/ci/perftest/kind.yml # then picking up the right one here raise NotImplementedError( "%r doesn't exist or is not yet supported" % plat) def relative(path): if path.startswith(self.topsrcdir): return path[len(self.topsrcdir):].lstrip(os.sep) return path for name, value in args.items(): # ignore values that are set to default if original_parser.get_default(name) == value: continue if name == "tests": value = [relative(path) for path in value] perftest_parameters[name] = value parameters = { "try_task_config": { "tasks": [_TRY_PLATFORMS[plat] for plat in platform], "perftest-options": perftest_parameters, }, "try_mode": "try_task_config", } task_config = {"parameters": parameters, "version": 2} if args["verbose"]: print("Pushing run to try...") print(json.dumps(task_config, indent=4, sort_keys=True)) push_to_try("perftest", "perftest", try_task_config=task_config) return from mozperftest.runner import run_tests run_tests(self, kwargs, original_parser.get_user_args(kwargs)) print("\nFirefox. Fast For Good.\n")