def run_mochitest(context, **kwargs): from mochitest_options import ALL_FLAVORS flavor = kwargs.get('flavor') or 'mochitest' if flavor not in ALL_FLAVORS: for fname, fobj in ALL_FLAVORS.iteritems(): if flavor in fobj['aliases']: flavor = fname break fobj = ALL_FLAVORS[flavor] kwargs.update(fobj.get('extra_args', {})) args = Namespace(**kwargs) args.e10s = context.mozharness_config.get('e10s', args.e10s) args.certPath = context.certs_dir if args.test_paths: install_subdir = fobj.get('install_subdir', fobj['suite']) test_root = os.path.join(context.package_root, 'mochitest', install_subdir) normalize = partial(context.normalize_test_path, test_root) args.test_paths = map(normalize, args.test_paths) import mozinfo if mozinfo.info.get('buildapp') == 'mobile/android': return run_mochitest_android(context, args) return run_mochitest_desktop(context, args)
def run_test(context, is_junit, **kwargs): from mochitest_options import ALL_FLAVORS from mozlog.commandline import setup_logging if not kwargs.get('log'): kwargs['log'] = setup_logging('mochitest', kwargs, {'mach': sys.stdout}) global log log = kwargs['log'] flavor = kwargs.get('flavor') or 'mochitest' if flavor not in ALL_FLAVORS: for fname, fobj in ALL_FLAVORS.iteritems(): if flavor in fobj['aliases']: flavor = fname break fobj = ALL_FLAVORS[flavor] kwargs.update(fobj.get('extra_args', {})) args = Namespace(**kwargs) args.e10s = context.mozharness_config.get('e10s', args.e10s) args.certPath = context.certs_dir if is_junit: return run_geckoview_junit(context, args) if args.test_paths: install_subdir = fobj.get('install_subdir', fobj['suite']) test_root = os.path.join(context.package_root, 'mochitest', install_subdir) normalize = partial(context.normalize_test_path, test_root) args.test_paths = map(normalize, args.test_paths) import mozinfo if mozinfo.info.get('buildapp') == 'mobile/android': return run_mochitest_android(context, args) return run_mochitest_desktop(context, args)
def run_mochitest_general(self, flavor=None, test_objects=None, resolve_tests=True, **kwargs): from mochitest_options import ALL_FLAVORS buildapp = None for app in SUPPORTED_APPS: if is_buildapp_in(app)(self): buildapp = app break flavors = None if flavor: for fname, fobj in ALL_FLAVORS.iteritems(): if flavor in fobj['aliases']: if buildapp not in fobj['enabled_apps']: continue flavors = [fname] break else: flavors = [f for f, v in ALL_FLAVORS.iteritems() if buildapp in v['enabled_apps']] from mozbuild.controller.building import BuildDriver self._ensure_state_subdir_exists('.') test_paths = kwargs['test_paths'] kwargs['test_paths'] = [] mochitest = self._spawn(MochitestRunner) tests = [] if resolve_tests: tests = mochitest.resolve_tests(test_paths, test_objects, cwd=self._mach_context.cwd) driver = self._spawn(BuildDriver) driver.install_tests(tests) subsuite = kwargs.get('subsuite') if subsuite == 'default': kwargs['subsuite'] = None suites = defaultdict(list) unsupported = set() for test in tests: # Filter out non-mochitests and unsupported flavors. if test['flavor'] not in ALL_FLAVORS: continue key = (test['flavor'], test.get('subsuite', '')) if test['flavor'] not in flavors: unsupported.add(key) continue if subsuite == 'default': # "--subsuite default" means only run tests that don't have a subsuite if test.get('subsuite'): unsupported.add(key) continue elif subsuite and test.get('subsuite', '') != subsuite: unsupported.add(key) continue suites[key].append(test) if ('mochitest', 'media') in suites: req = os.path.join('testing', 'tools', 'websocketprocessbridge', 'websocketprocessbridge_requirements.txt') self.virtualenv_manager.activate() self.virtualenv_manager.install_pip_requirements(req, require_hashes=False) # sys.executable is used to start the websocketprocessbridge, though for some # reason it doesn't get set when calling `activate_this.py` in the virtualenv. sys.executable = self.virtualenv_manager.python_path # This is a hack to introduce an option in mach to not send # filtered tests to the mochitest harness. Mochitest harness will read # the master manifest in that case. if not resolve_tests: for flavor in flavors: key = (flavor, kwargs.get('subsuite')) suites[key] = [] if not suites: # Make it very clear why no tests were found if not unsupported: print(TESTS_NOT_FOUND.format('\n'.join( sorted(list(test_paths or test_objects))))) return 1 msg = [] for f, s in unsupported: fobj = ALL_FLAVORS[f] apps = fobj['enabled_apps'] name = fobj['aliases'][0] if s: name = '{} --subsuite {}'.format(name, s) if buildapp not in apps: reason = 'requires {}'.format(' or '.join(apps)) else: reason = 'excluded by the command line' msg.append(' mochitest -f {} ({})'.format(name, reason)) print(SUPPORTED_TESTS_NOT_FOUND.format( buildapp, '\n'.join(sorted(msg)))) return 1 if buildapp == 'android': from mozrunner.devices.android_device import grant_runtime_permissions grant_runtime_permissions(self) run_mochitest = mochitest.run_android_test else: run_mochitest = mochitest.run_desktop_test overall = None for (flavor, subsuite), tests in sorted(suites.items()): fobj = ALL_FLAVORS[flavor] msg = fobj['aliases'][0] if subsuite: msg = '{} with subsuite {}'.format(msg, subsuite) print(NOW_RUNNING.format(msg)) harness_args = kwargs.copy() harness_args['subsuite'] = subsuite harness_args.update(fobj.get('extra_args', {})) result = run_mochitest( self._mach_context, tests=tests, suite=fobj['suite'], **harness_args) if result: overall = result # TODO consolidate summaries from all suites return overall
def run_mochitest_general(self, flavor=None, test_objects=None, resolve_tests=True, **kwargs): from mochitest_options import ALL_FLAVORS from mozlog.commandline import setup_logging from mozlog.handlers import StreamHandler from moztest.resolve import get_suite_definition buildapp = None for app in SUPPORTED_APPS: if is_buildapp_in(app)(self): buildapp = app break flavors = None if flavor: for fname, fobj in ALL_FLAVORS.iteritems(): if flavor in fobj['aliases']: if buildapp not in fobj['enabled_apps']: continue flavors = [fname] break else: flavors = [ f for f, v in ALL_FLAVORS.iteritems() if buildapp in v['enabled_apps'] ] from mozbuild.controller.building import BuildDriver self._ensure_state_subdir_exists('.') test_paths = kwargs['test_paths'] kwargs['test_paths'] = [] mochitest = self._spawn(MochitestRunner) tests = [] if resolve_tests: tests = mochitest.resolve_tests(test_paths, test_objects, cwd=self._mach_context.cwd) if not kwargs.get('log'): # Create shared logger format_args = { 'level': self._mach_context.settings['test']['level'] } if len(tests) == 1: format_args['verbose'] = True format_args['compact'] = False default_format = self._mach_context.settings['test']['format'] kwargs['log'] = setup_logging('mach-mochitest', kwargs, {default_format: sys.stdout}, format_args) for handler in kwargs['log'].handlers: if isinstance(handler, StreamHandler): handler.formatter.inner.summary_on_shutdown = True driver = self._spawn(BuildDriver) driver.install_tests(tests) subsuite = kwargs.get('subsuite') if subsuite == 'default': kwargs['subsuite'] = None suites = defaultdict(list) unsupported = set() for test in tests: # Filter out non-mochitests and unsupported flavors. if test['flavor'] not in ALL_FLAVORS: continue key = (test['flavor'], test.get('subsuite', '')) if test['flavor'] not in flavors: unsupported.add(key) continue if subsuite == 'default': # "--subsuite default" means only run tests that don't have a subsuite if test.get('subsuite'): unsupported.add(key) continue elif subsuite and test.get('subsuite', '') != subsuite: unsupported.add(key) continue suites[key].append(test) if ('mochitest', 'media') in suites: req = os.path.join('testing', 'tools', 'websocketprocessbridge', 'websocketprocessbridge_requirements.txt') self.virtualenv_manager.activate() self.virtualenv_manager.install_pip_requirements( req, require_hashes=False) # sys.executable is used to start the websocketprocessbridge, though for some # reason it doesn't get set when calling `activate_this.py` in the virtualenv. sys.executable = self.virtualenv_manager.python_path # This is a hack to introduce an option in mach to not send # filtered tests to the mochitest harness. Mochitest harness will read # the master manifest in that case. if not resolve_tests: for flavor in flavors: key = (flavor, kwargs.get('subsuite')) suites[key] = [] if not suites: # Make it very clear why no tests were found if not unsupported: print( TESTS_NOT_FOUND.format('\n'.join( sorted(list(test_paths or test_objects))))) return 1 msg = [] for f, s in unsupported: fobj = ALL_FLAVORS[f] apps = fobj['enabled_apps'] name = fobj['aliases'][0] if s: name = '{} --subsuite {}'.format(name, s) if buildapp not in apps: reason = 'requires {}'.format(' or '.join(apps)) else: reason = 'excluded by the command line' msg.append(' mochitest -f {} ({})'.format(name, reason)) print( SUPPORTED_TESTS_NOT_FOUND.format(buildapp, '\n'.join(sorted(msg)))) return 1 if buildapp == 'android': from mozrunner.devices.android_device import grant_runtime_permissions from mozrunner.devices.android_device import verify_android_device app = kwargs.get('app') if not app: app = self.substs["ANDROID_PACKAGE_NAME"] device_serial = kwargs.get('deviceSerial') # verify installation verify_android_device(self, install=True, xre=False, network=True, app=app, device_serial=device_serial) grant_runtime_permissions(self, app, device_serial=device_serial) run_mochitest = mochitest.run_android_test else: run_mochitest = mochitest.run_desktop_test overall = None for (flavor, subsuite), tests in sorted(suites.items()): _, suite = get_suite_definition(flavor, subsuite) if 'test_paths' in suite['kwargs']: del suite['kwargs']['test_paths'] harness_args = kwargs.copy() harness_args.update(suite['kwargs']) result = run_mochitest(self._mach_context, tests=tests, **harness_args) if result: overall = result # Halt tests on keyboard interrupt if result == -1: break # Only shutdown the logger if we created it if kwargs['log'].name == 'mach-mochitest': kwargs['log'].shutdown() return overall
def run_mochitest_general(self, flavor=None, test_objects=None, resolve_tests=True, **kwargs): from mochitest_options import ALL_FLAVORS buildapp = None for app in SUPPORTED_APPS: if is_buildapp_in(app)(self): buildapp = app break flavors = None if flavor: for fname, fobj in ALL_FLAVORS.iteritems(): if flavor in fobj['aliases']: if buildapp not in fobj['enabled_apps']: continue flavors = [fname] break else: flavors = [ f for f, v in ALL_FLAVORS.iteritems() if buildapp in v['enabled_apps'] ] from mozbuild.controller.building import BuildDriver self._ensure_state_subdir_exists('.') test_paths = kwargs['test_paths'] kwargs['test_paths'] = [] mochitest = self._spawn(MochitestRunner) tests = [] if resolve_tests: tests = mochitest.resolve_tests(test_paths, test_objects, cwd=self._mach_context.cwd) driver = self._spawn(BuildDriver) driver.install_tests(tests) subsuite = kwargs.get('subsuite') if subsuite == 'default': kwargs['subsuite'] = None suites = defaultdict(list) unsupported = set() for test in tests: # Filter out non-mochitests and unsupported flavors. if test['flavor'] not in ALL_FLAVORS: continue key = (test['flavor'], test.get('subsuite', '')) if test['flavor'] not in flavors: unsupported.add(key) continue if subsuite == 'default': # "--subsuite default" means only run tests that don't have a subsuite if test.get('subsuite'): unsupported.add(key) continue elif subsuite and test.get('subsuite', '') != subsuite: unsupported.add(key) continue suites[key].append(test) if ('mochitest', 'media') in suites: req = os.path.join('testing', 'tools', 'websocketprocessbridge', 'websocketprocessbridge_requirements.txt') self.virtualenv_manager.activate() self.virtualenv_manager.install_pip_requirements( req, require_hashes=False) # sys.executable is used to start the websocketprocessbridge, though for some # reason it doesn't get set when calling `activate_this.py` in the virtualenv. sys.executable = self.virtualenv_manager.python_path # This is a hack to introduce an option in mach to not send # filtered tests to the mochitest harness. Mochitest harness will read # the master manifest in that case. if not resolve_tests: for flavor in flavors: key = (flavor, kwargs.get('subsuite')) suites[key] = [] if not suites: # Make it very clear why no tests were found if not unsupported: print( TESTS_NOT_FOUND.format('\n'.join( sorted(list(test_paths or test_objects))))) return 1 msg = [] for f, s in unsupported: fobj = ALL_FLAVORS[f] apps = fobj['enabled_apps'] name = fobj['aliases'][0] if s: name = '{} --subsuite {}'.format(name, s) if buildapp not in apps: reason = 'requires {}'.format(' or '.join(apps)) else: reason = 'excluded by the command line' msg.append(' mochitest -f {} ({})'.format(name, reason)) print( SUPPORTED_TESTS_NOT_FOUND.format(buildapp, '\n'.join(sorted(msg)))) return 1 if buildapp == 'android': from mozrunner.devices.android_device import grant_runtime_permissions grant_runtime_permissions(self) run_mochitest = mochitest.run_android_test else: run_mochitest = mochitest.run_desktop_test overall = None for (flavor, subsuite), tests in sorted(suites.items()): fobj = ALL_FLAVORS[flavor] msg = fobj['aliases'][0] if subsuite: msg = '{} with subsuite {}'.format(msg, subsuite) print(NOW_RUNNING.format(msg)) harness_args = kwargs.copy() harness_args['subsuite'] = subsuite harness_args.update(fobj.get('extra_args', {})) result = run_mochitest(self._mach_context, tests=tests, suite=fobj['suite'], **harness_args) if result: overall = result # TODO consolidate summaries from all suites return overall
def run_test(context, is_junit, **kwargs): from mochitest_options import ALL_FLAVORS from mozlog.commandline import setup_logging if not kwargs.get('log'): kwargs['log'] = setup_logging('mochitest', kwargs, {'mach': sys.stdout}) global logger logger = kwargs['log'] flavor = kwargs.get('flavor') or 'mochitest' if flavor not in ALL_FLAVORS: for fname, fobj in ALL_FLAVORS.iteritems(): if flavor in fobj['aliases']: flavor = fname break fobj = ALL_FLAVORS[flavor] kwargs.update(fobj.get('extra_args', {})) if kwargs.get('allow_software_gl_layers'): os.environ['MOZ_LAYERS_ALLOW_SOFTWARE_GL'] = '1' del kwargs['allow_software_gl_layers'] if kwargs.get('mochitest_suite'): suite = kwargs['mochitest_suite'] del kwargs['mochitest_suite'] elif kwargs.get('test_suite'): suite = kwargs['test_suite'] del kwargs['test_suite'] if kwargs.get('no_run_tests'): del kwargs['no_run_tests'] args = Namespace(**kwargs) args.e10s = context.mozharness_config.get('e10s', args.e10s) args.certPath = context.certs_dir if is_junit: return run_geckoview_junit(context, args) # subsuite mapping from mozharness configs subsuites = { # --mochitest-suite -> --subsuite "mochitest-chrome-gpu": "gpu", "mochitest-plain-gpu": "gpu", "mochitest-media": "media", "mochitest-browser-chrome-screenshots": "screenshots", "mochitest-webgl1-core": "webgl1-core", "mochitest-webgl1-ext": "webgl1-ext", "mochitest-webgl2-core": "webgl2-core", "mochitest-webgl2-ext": "webgl2-ext", "mochitest-webgl2-deqp": "webgl2-deqp", "mochitest-webgpu": "webgpu", "mochitest-devtools-chrome": "devtools", "mochitest-remote": "remote", } args.subsuite = subsuites.get(suite) if args.subsuite == 'devtools': args.flavor = 'browser' if not args.test_paths: mh_test_paths = json.loads( os.environ.get('MOZHARNESS_TEST_PATHS', '""')) if mh_test_paths: logger.info("Found MOZHARNESS_TEST_PATHS:") logger.info(str(mh_test_paths)) args.test_paths = [] for k in mh_test_paths: args.test_paths.extend(mh_test_paths[k]) if args.test_paths: install_subdir = fobj.get('install_subdir', fobj['suite']) test_root = os.path.join(context.package_root, 'mochitest', install_subdir) normalize = partial(context.normalize_test_path, test_root) args.test_paths = map(normalize, args.test_paths) import mozinfo if mozinfo.info.get('buildapp') == 'mobile/android': return run_mochitest_android(context, args) return run_mochitest_desktop(context, args)
def run_test(context, is_junit, **kwargs): from mochitest_options import ALL_FLAVORS from mozlog.commandline import setup_logging if not kwargs.get("log"): kwargs["log"] = setup_logging("mochitest", kwargs, {"mach": sys.stdout}) global logger logger = kwargs["log"] flavor = kwargs.get("flavor") or "mochitest" if flavor not in ALL_FLAVORS: for fname, fobj in ALL_FLAVORS.iteritems(): if flavor in fobj["aliases"]: flavor = fname break fobj = ALL_FLAVORS[flavor] kwargs.update(fobj.get("extra_args", {})) if kwargs.get("allow_software_gl_layers"): os.environ["MOZ_LAYERS_ALLOW_SOFTWARE_GL"] = "1" del kwargs["allow_software_gl_layers"] if kwargs.get("mochitest_suite"): suite = kwargs["mochitest_suite"] del kwargs["mochitest_suite"] elif kwargs.get("test_suite"): suite = kwargs["test_suite"] del kwargs["test_suite"] if kwargs.get("no_run_tests"): del kwargs["no_run_tests"] args = Namespace(**kwargs) args.e10s = context.mozharness_config.get("e10s", args.e10s) args.certPath = context.certs_dir if is_junit: return run_geckoview_junit(context, args) # subsuite mapping from mozharness configs subsuites = { # --mochitest-suite -> --subsuite "mochitest-chrome-gpu": "gpu", "mochitest-plain-gpu": "gpu", "mochitest-media": "media", "mochitest-browser-chrome-screenshots": "screenshots", "mochitest-webgl1-core": "webgl1-core", "mochitest-webgl1-ext": "webgl1-ext", "mochitest-webgl2-core": "webgl2-core", "mochitest-webgl2-ext": "webgl2-ext", "mochitest-webgl2-deqp": "webgl2-deqp", "mochitest-webgpu": "webgpu", "mochitest-devtools-chrome": "devtools", "mochitest-remote": "remote", } args.subsuite = subsuites.get(suite) if args.subsuite == "devtools": args.flavor = "browser" if not args.test_paths: mh_test_paths = json.loads( os.environ.get("MOZHARNESS_TEST_PATHS", '""')) if mh_test_paths: logger.info("Found MOZHARNESS_TEST_PATHS:") logger.info(str(mh_test_paths)) args.test_paths = [] for k in mh_test_paths: args.test_paths.extend(mh_test_paths[k]) if args.test_paths: install_subdir = fobj.get("install_subdir", fobj["suite"]) test_root = os.path.join(context.package_root, "mochitest", install_subdir) normalize = partial(context.normalize_test_path, test_root) args.test_paths = map(normalize, args.test_paths) import mozinfo if mozinfo.info.get("buildapp") == "mobile/android": return run_mochitest_android(context, args) return run_mochitest_desktop(context, args)