import contextlib import os import shutil import subprocess import sys import tempfile from pathlib import Path from unittest.mock import MagicMock from mozperftest import utils from mozperftest.environment import MachEnvironment from mozperftest.hooks import Hooks from mozperftest.metadata import Metadata from mozperftest.script import ScriptInfo HERE = Path(__file__).parent ROOT = Path(HERE, "..", "..", "..", "..").resolve() EXAMPLE_TESTS_DIR = os.path.join(HERE, "data", "samples") EXAMPLE_TEST = os.path.join(EXAMPLE_TESTS_DIR, "perftest_example.js") EXAMPLE_XPCSHELL_TEST = Path(EXAMPLE_TESTS_DIR, "test_xpcshell.js") EXAMPLE_XPCSHELL_TEST2 = Path(EXAMPLE_TESTS_DIR, "test_xpcshell_flavor2.js") EXAMPLE_WPT_TEST = Path(EXAMPLE_TESTS_DIR, "test_perftest_WPT_init_file.js") BT_DATA = Path(HERE, "data", "browsertime-results", "browsertime.json") BT_DATA_VIDEO = Path(HERE, "data", "browsertime-results-video", "browsertime.json") DMG = Path(HERE, "data", "firefox.dmg") MOZINFO = Path(HERE, "data", "mozinfo.json") EXAMPLE_ANDROID_STARTUP_TEST = Path( EXAMPLE_TESTS_DIR, "test_perftest_android_startup.js" ) @contextlib.contextmanager def temp_file(name="temp", content=None): tempdir = tempfile.mkdtemp() path = os.path.join(tempdir, name) if content is not None: with open(path, "w") as f: f.write(content) try: yield path finally: shutil.rmtree(tempdir) def get_running_env(**kwargs): from mozbuild.base import MozbuildObject config = MozbuildObject.from_environment() mach_cmd = MagicMock() def get_binary_path(*args): return "" def run_pip(args): subprocess.check_call( [sys.executable, "-m", "pip"] + args, stderr=subprocess.STDOUT, cwd=config.topsrcdir, universal_newlines=True, ) mach_cmd.get_binary_path = get_binary_path mach_cmd.topsrcdir = config.topsrcdir mach_cmd.topobjdir = config.topobjdir mach_cmd.distdir = config.distdir mach_cmd.bindir = config.bindir mach_cmd._mach_context = MagicMock() mach_cmd._mach_context.state_dir = tempfile.mkdtemp() mach_cmd.run_process.return_value = 0 mach_cmd.virtualenv_manager = MagicMock() mach_cmd.virtualenv_manager.python_path = sys.executable mach_cmd.virtualenv_manager.bin_path = Path(sys.executable).parent mach_cmd.virtualenv_manager._run_pip = run_pip mach_args = { "flavor": "desktop-browser", "test_objects": None, "resolve_tests": True, "browsertime-clobber": False, "browsertime-install-url": None, } mach_args.update(kwargs) hooks = Hooks(mach_cmd, mach_args.pop("hooks", None)) tests = mach_args.get("tests", []) if len(tests) > 0: script = ScriptInfo(tests[0]) else: script = None env = MachEnvironment(mach_cmd, hooks=hooks, **mach_args) metadata = Metadata(mach_cmd, env, "desktop-browser", script) return mach_cmd, metadata, env def requests_content(chunks=None): if chunks is None: chunks = [b"some ", b"content"] def _content(*args, **kw): class Resp: def iter_content(self, **kw): for chunk in chunks: yield chunk return Resp() return _content @contextlib.contextmanager def running_on_try(on_try=True): old = utils.ON_TRY utils.ON_TRY = on_try try: if on_try: with utils.temporary_env(MOZ_AUTOMATION="1"): yield else: yield finally: utils.ON_TRY = old