class GaiaUnitTestRunner(object): def __init__(self, binary=None, profile=None, symbols_path=None, browser_arg=()): self.binary = binary self.profile = profile self.symbols_path = symbols_path self.browser_arg = browser_arg def run(self): self.profile_dir = os.path.join(tempfile.mkdtemp(suffix='.gaiaunittest'), 'profile') shutil.copytree(self.profile, self.profile_dir) cmdargs = ['--runapp', 'Test Agent'] if self.browser_arg: cmdargs += list(self.browser_arg) profile = Profile(profile=self.profile_dir) self.runner = Runner(binary=self.binary, profile=profile, clean_profile=False, cmdargs=cmdargs, symbols_path=self.symbols_path) self.runner.start() def cleanup(self): print 'checking for crashes' crashed = self.runner.check_for_crashes() self.runner.cleanup() shutil.rmtree(os.path.dirname(self.profile_dir)) return crashed __del__ = cleanup
class GeckoInstance(object): required_prefs = { "browser.displayedE10SPrompt.1": 5, "browser.displayedE10SPrompt.2": 5, "browser.displayedE10SPrompt.3": 5, "browser.displayedE10SPrompt.4": 5, "browser.displayedE10SPrompt": 5, "browser.sessionstore.resume_from_crash": False, "browser.shell.checkDefaultBrowser": False, "browser.startup.page": 0, "browser.tabs.remote.autostart.1": False, "browser.tabs.remote.autostart.2": False, "browser.tabs.remote.autostart": False, "browser.urlbar.userMadeSearchSuggestionsChoice": True, "browser.warnOnQuit": False, "datareporting.healthreport.logging.consoleEnabled": False, "datareporting.healthreport.service.enabled": False, "datareporting.healthreport.service.firstRun": False, "datareporting.healthreport.uploadEnabled": False, "datareporting.policy.dataSubmissionEnabled": False, "datareporting.policy.dataSubmissionPolicyAccepted": False, "dom.ipc.reportProcessHangs": False, "focusmanager.testmode": True, "marionette.defaultPrefs.enabled": True, "startup.homepage_welcome_url": "about:blank", "toolkit.telemetry.enabled": False, } def __init__(self, host, port, bin, profile=None, addons=None, app_args=None, symbols_path=None, gecko_log=None, prefs=None, workspace=None, verbose=0): self.marionette_host = host self.marionette_port = port self.bin = bin # Alternative to default temporary directory self.workspace = workspace # Check if it is a Profile object or a path to profile self.profile = None self.addons = addons if isinstance(profile, Profile): self.profile = profile else: self.profile_path = profile self.prefs = prefs self.required_prefs = deepcopy(GeckoInstance.required_prefs) if prefs: self.required_prefs.update(prefs) self.app_args = app_args or [] self.runner = None self.symbols_path = symbols_path if gecko_log != '-': if gecko_log is None: gecko_log = 'gecko.log' elif os.path.isdir(gecko_log): fname = 'gecko-%d.log' % time.time() gecko_log = os.path.join(gecko_log, fname) gecko_log = os.path.realpath(gecko_log) if os.access(gecko_log, os.F_OK): os.remove(gecko_log) self.gecko_log = gecko_log self.verbose = verbose def start(self): profile_args = {"preferences": deepcopy(self.required_prefs)} profile_args["preferences"]["marionette.defaultPrefs.port"] = self.marionette_port if self.prefs: profile_args["preferences"].update(self.prefs) if self.verbose: level = "TRACE" if self.verbose >= 2 else "DEBUG" profile_args["preferences"]["marionette.logging"] = level if '-jsdebugger' in self.app_args: profile_args["preferences"].update({ "devtools.browsertoolbox.panel": "jsdebugger", "devtools.debugger.remote-enabled": True, "devtools.chrome.enabled": True, "devtools.debugger.prompt-connection": False, "marionette.debugging.clicktostart": True, }) if self.addons: profile_args['addons'] = self.addons if hasattr(self, "profile_path") and self.profile is None: if not self.profile_path: if self.workspace: profile_args['profile'] = tempfile.mkdtemp( suffix='.mozrunner-{:.0f}'.format(time.time()), dir=self.workspace) self.profile = Profile(**profile_args) else: profile_args["path_from"] = self.profile_path profile_name = '{}-{:.0f}'.format( os.path.basename(self.profile_path), time.time() ) if self.workspace: profile_args["path_to"] = os.path.join(self.workspace, profile_name) self.profile = Profile.clone(**profile_args) process_args = { 'processOutputLine': [NullOutput()], } if self.gecko_log == '-': process_args['stream'] = sys.stdout else: process_args['logfile'] = self.gecko_log env = os.environ.copy() # environment variables needed for crashreporting # https://developer.mozilla.org/docs/Environment_variables_affecting_crash_reporting env.update({ 'MOZ_CRASHREPORTER': '1', 'MOZ_CRASHREPORTER_NO_REPORT': '1', }) self.runner = Runner( binary=self.bin, profile=self.profile, cmdargs=['-no-remote', '-marionette'] + self.app_args, env=env, symbols_path=self.symbols_path, process_args=process_args) self.runner.start() def close(self, restart=False): if not restart: self.profile = None if self.runner: self.runner.stop() self.runner.cleanup() def restart(self, prefs=None, clean=True): self.close(restart=True) if clean: self.profile.cleanup() self.profile = None if prefs: self.prefs = prefs else: self.prefs = None self.start()
class GeckoInstance(object): required_prefs = {"marionette.defaultPrefs.enabled": True, "marionette.defaultPrefs.port": 2828, "marionette.logging": True, "startup.homepage_welcome_url": "about:blank", "browser.shell.checkDefaultBrowser": False, "browser.startup.page": 0, "browser.sessionstore.resume_from_crash": False, "browser.warnOnQuit": False, "browser.displayedE10SPrompt": 5, "browser.displayedE10SPrompt.1": 5, "browser.displayedE10SPrompt.2": 5, "browser.displayedE10SPrompt.3": 5, "browser.displayedE10SPrompt.4": 5, "browser.tabs.remote.autostart.1": False, "browser.tabs.remote.autostart.2": False} def __init__(self, host, port, bin, profile, app_args=None, symbols_path=None, gecko_log=None, prefs=None): self.marionette_host = host self.marionette_port = port self.bin = bin self.profile_path = profile self.prefs = prefs self.app_args = app_args or [] self.runner = None self.symbols_path = symbols_path self.gecko_log = gecko_log def start(self): profile_args = {"preferences": deepcopy(self.required_prefs)} if self.prefs: profile_args["preferences"].update(self.prefs) if not self.profile_path: profile_args["restore"] = False profile = Profile(**profile_args) else: profile_args["path_from"] = self.profile_path profile = Profile.clone(**profile_args) if self.gecko_log is None: self.gecko_log = 'gecko.log' elif os.path.isdir(self.gecko_log): fname = "gecko-%d.log" % time.time() self.gecko_log = os.path.join(self.gecko_log, fname) self.gecko_log = os.path.realpath(self.gecko_log) if os.access(self.gecko_log, os.F_OK): if platform.system() is 'Windows': # NOTE: windows has a weird filesystem where it happily 'closes' # the file, but complains if you try to delete it. You get a # 'file still in use' error. Sometimes you can wait a bit and # a retry will succeed. # If all retries fail, we'll just continue without removing # the file. In this case, if we are restarting the instance, # then the new logs just get appended to the old file. tries = 0 while tries < 10: try: os.remove(self.gecko_log) break except WindowsError as e: if e.errno == errno.EACCES: tries += 1 time.sleep(0.5) else: raise e else: os.remove(self.gecko_log) env = os.environ.copy() # environment variables needed for crashreporting # https://developer.mozilla.org/docs/Environment_variables_affecting_crash_reporting env.update({ 'MOZ_CRASHREPORTER': '1', 'MOZ_CRASHREPORTER_NO_REPORT': '1', }) self.runner = Runner( binary=self.bin, profile=profile, cmdargs=['-no-remote', '-marionette'] + self.app_args, env=env, symbols_path=self.symbols_path, process_args={ 'processOutputLine': [NullOutput()], 'logfile': self.gecko_log}) self.runner.start() def close(self): if self.runner: self.runner.stop() self.runner.cleanup() def restart(self, prefs=None): self.close() if prefs: self.prefs = prefs else: self.prefs = None self.start()
class GeckoInstance(object): required_prefs = { "marionette.defaultPrefs.enabled": True, "marionette.logging": True, "browser.displayedE10SPrompt": 5, "browser.displayedE10SPrompt.1": 5, "browser.displayedE10SPrompt.2": 5, "browser.displayedE10SPrompt.3": 5, "browser.displayedE10SPrompt.4": 5, "browser.sessionstore.resume_from_crash": False, "browser.shell.checkDefaultBrowser": False, "browser.startup.page": 0, "browser.tabs.remote.autostart.1": False, "browser.tabs.remote.autostart.2": False, "browser.warnOnQuit": False, "dom.ipc.reportProcessHangs": False, "focusmanager.testmode": True, "startup.homepage_welcome_url": "about:blank" } def __init__(self, host, port, bin, profile=None, app_args=None, symbols_path=None, gecko_log=None, prefs=None): self.marionette_host = host self.marionette_port = port self.bin = bin # Check if it is a Profile object or a path to profile self.profile = None if isinstance(profile, Profile): self.profile = profile else: self.profile_path = profile self.prefs = prefs self.required_prefs = deepcopy(GeckoInstance.required_prefs) if prefs: self.required_prefs.update(prefs) self.app_args = app_args or [] self.runner = None self.symbols_path = symbols_path self.gecko_log = gecko_log def start(self): profile_args = {"preferences": deepcopy(self.required_prefs)} profile_args["preferences"][ "marionette.defaultPrefs.port"] = self.marionette_port if self.prefs: profile_args["preferences"].update(self.prefs) if '-jsdebugger' in self.app_args: profile_args["preferences"].update({ "devtools.browsertoolbox.panel": "jsdebugger", "devtools.debugger.remote-enabled": True, "devtools.chrome.enabled": True, "devtools.debugger.prompt-connection": False, "marionette.debugging.clicktostart": True, }) if hasattr(self, "profile_path") and self.profile is None: if not self.profile_path: self.profile = Profile(**profile_args) else: profile_args["path_from"] = self.profile_path self.profile = Profile.clone(**profile_args) process_args = { 'processOutputLine': [NullOutput()], } if self.gecko_log == '-': process_args['stream'] = sys.stdout else: if self.gecko_log is None: self.gecko_log = 'gecko.log' elif os.path.isdir(self.gecko_log): fname = "gecko-%d.log" % time.time() self.gecko_log = os.path.join(self.gecko_log, fname) self.gecko_log = os.path.realpath(self.gecko_log) if os.access(self.gecko_log, os.F_OK): if platform.system() is 'Windows': # NOTE: windows has a weird filesystem where it happily 'closes' # the file, but complains if you try to delete it. You get a # 'file still in use' error. Sometimes you can wait a bit and # a retry will succeed. # If all retries fail, we'll just continue without removing # the file. In this case, if we are restarting the instance, # then the new logs just get appended to the old file. tries = 0 while tries < 10: try: os.remove(self.gecko_log) break except WindowsError as e: if e.errno == errno.EACCES: tries += 1 time.sleep(0.5) else: raise e else: os.remove(self.gecko_log) process_args['logfile'] = self.gecko_log env = os.environ.copy() # environment variables needed for crashreporting # https://developer.mozilla.org/docs/Environment_variables_affecting_crash_reporting env.update({ 'MOZ_CRASHREPORTER': '1', 'MOZ_CRASHREPORTER_NO_REPORT': '1', }) self.runner = Runner(binary=self.bin, profile=self.profile, cmdargs=['-no-remote', '-marionette'] + self.app_args, env=env, symbols_path=self.symbols_path, process_args=process_args) self.runner.start() def close(self, restart=False): if not restart: self.profile = None if self.runner: self.runner.stop() self.runner.cleanup() def restart(self, prefs=None, clean=True): self.close(restart=True) if clean: self.profile.cleanup() self.profile = None if prefs: self.prefs = prefs else: self.prefs = None self.start()
class GeckoInstance(object): required_prefs = {"marionette.defaultPrefs.enabled": True, "marionette.logging": True, "browser.displayedE10SPrompt": 5, "browser.displayedE10SPrompt.1": 5, "browser.displayedE10SPrompt.2": 5, "browser.displayedE10SPrompt.3": 5, "browser.displayedE10SPrompt.4": 5, "browser.sessionstore.resume_from_crash": False, "browser.shell.checkDefaultBrowser": False, "browser.startup.page": 0, "browser.tabs.remote.autostart.1": False, "browser.tabs.remote.autostart.2": False, "browser.warnOnQuit": False, "dom.ipc.reportProcessHangs": False, "focusmanager.testmode": True, "startup.homepage_welcome_url": "about:blank"} def __init__(self, host, port, bin, profile=None, addons=None, app_args=None, symbols_path=None, gecko_log=None, prefs=None): self.marionette_host = host self.marionette_port = port self.bin = bin # Check if it is a Profile object or a path to profile self.profile = None self.addons = addons if isinstance(profile, Profile): self.profile = profile else: self.profile_path = profile self.prefs = prefs self.required_prefs = deepcopy(GeckoInstance.required_prefs) if prefs: self.required_prefs.update(prefs) self.app_args = app_args or [] self.runner = None self.symbols_path = symbols_path if gecko_log != '-': if gecko_log is None: gecko_log = 'gecko.log' elif os.path.isdir(gecko_log): fname = 'gecko-%d.log' % time.time() gecko_log = os.path.join(gecko_log, fname) gecko_log = os.path.realpath(gecko_log) if os.access(gecko_log, os.F_OK): os.remove(gecko_log) self.gecko_log = gecko_log def start(self): profile_args = {"preferences": deepcopy(self.required_prefs)} profile_args["preferences"]["marionette.defaultPrefs.port"] = self.marionette_port if self.prefs: profile_args["preferences"].update(self.prefs) if '-jsdebugger' in self.app_args: profile_args["preferences"].update({ "devtools.browsertoolbox.panel": "jsdebugger", "devtools.debugger.remote-enabled": True, "devtools.chrome.enabled": True, "devtools.debugger.prompt-connection": False, "marionette.debugging.clicktostart": True, }) if self.addons: profile_args['addons'] = self.addons if hasattr(self, "profile_path") and self.profile is None: if not self.profile_path: self.profile = Profile(**profile_args) else: profile_args["path_from"] = self.profile_path self.profile = Profile.clone(**profile_args) process_args = { 'processOutputLine': [NullOutput()], } if self.gecko_log == '-': process_args['stream'] = sys.stdout else: process_args['logfile'] = self.gecko_log env = os.environ.copy() # environment variables needed for crashreporting # https://developer.mozilla.org/docs/Environment_variables_affecting_crash_reporting env.update({ 'MOZ_CRASHREPORTER': '1', 'MOZ_CRASHREPORTER_NO_REPORT': '1', }) self.runner = Runner( binary=self.bin, profile=self.profile, cmdargs=['-no-remote', '-marionette'] + self.app_args, env=env, symbols_path=self.symbols_path, process_args=process_args) self.runner.start() def close(self, restart=False): if not restart: self.profile = None if self.runner: self.runner.stop() self.runner.cleanup() def restart(self, prefs=None, clean=True): self.close(restart=True) if clean: self.profile.cleanup() self.profile = None if prefs: self.prefs = prefs else: self.prefs = None self.start()
class GeckoInstance(object): required_prefs = { "marionette.defaultPrefs.enabled": True, "marionette.logging": True, "startup.homepage_welcome_url": "about:blank", "browser.shell.checkDefaultBrowser": False, "browser.startup.page": 0, "browser.sessionstore.resume_from_crash": False, "browser.warnOnQuit": False, "browser.displayedE10SPrompt": 5, "browser.displayedE10SPrompt.1": 5, "browser.displayedE10SPrompt.2": 5, "browser.displayedE10SPrompt.3": 5, "browser.displayedE10SPrompt.4": 5, "browser.tabs.remote.autostart.1": False, "browser.tabs.remote.autostart.2": False, "dom.ipc.reportProcessHangs": False, } def __init__(self, host, port, bin, profile=None, app_args=None, symbols_path=None, gecko_log=None, prefs=None): self.marionette_host = host self.marionette_port = port self.bin = bin # Check if it is a Profile object or a path to profile self.profile = None if isinstance(profile, Profile): self.profile = profile else: self.profile_path = profile self.prefs = prefs self.required_prefs = deepcopy(GeckoInstance.required_prefs) if prefs: self.required_prefs.update(prefs) self.app_args = app_args or [] self.runner = None self.symbols_path = symbols_path self.gecko_log = gecko_log def start(self): profile_args = {"preferences": deepcopy(self.required_prefs)} profile_args["preferences"]["marionette.defaultPrefs.port"] = self.marionette_port if self.prefs: profile_args["preferences"].update(self.prefs) if "-jsdebugger" in self.app_args: profile_args["preferences"].update( { "devtools.browsertoolbox.panel": "jsdebugger", "devtools.debugger.remote-enabled": True, "devtools.debugger.chrome-enabled": True, "devtools.chrome.enabled": True, "devtools.debugger.prompt-connection": False, "marionette.debugging.clicktostart": True, } ) if hasattr(self, "profile_path") and self.profile is None: if not self.profile_path: profile_args["restore"] = False self.profile = Profile(**profile_args) else: profile_args["path_from"] = self.profile_path self.profile = Profile.clone(**profile_args) process_args = {"processOutputLine": [NullOutput()]} if self.gecko_log == "-": process_args["stream"] = sys.stdout else: if self.gecko_log is None: self.gecko_log = "gecko.log" elif os.path.isdir(self.gecko_log): fname = "gecko-%d.log" % time.time() self.gecko_log = os.path.join(self.gecko_log, fname) self.gecko_log = os.path.realpath(self.gecko_log) if os.access(self.gecko_log, os.F_OK): if platform.system() is "Windows": # NOTE: windows has a weird filesystem where it happily 'closes' # the file, but complains if you try to delete it. You get a # 'file still in use' error. Sometimes you can wait a bit and # a retry will succeed. # If all retries fail, we'll just continue without removing # the file. In this case, if we are restarting the instance, # then the new logs just get appended to the old file. tries = 0 while tries < 10: try: os.remove(self.gecko_log) break except WindowsError as e: if e.errno == errno.EACCES: tries += 1 time.sleep(0.5) else: raise e else: os.remove(self.gecko_log) process_args["logfile"] = self.gecko_log env = os.environ.copy() # environment variables needed for crashreporting # https://developer.mozilla.org/docs/Environment_variables_affecting_crash_reporting env.update({"MOZ_CRASHREPORTER": "1", "MOZ_CRASHREPORTER_NO_REPORT": "1"}) self.runner = Runner( binary=self.bin, profile=self.profile, cmdargs=["-no-remote", "-marionette"] + self.app_args, env=env, symbols_path=self.symbols_path, process_args=process_args, ) self.runner.start() def close(self, restart=False): if not restart: self.profile = None if self.runner: self.runner.stop() self.runner.cleanup() def restart(self, prefs=None, clean=True): if clean: self.profile.cleanup() self.profile = None self.close(restart=True) if prefs: self.prefs = prefs else: self.prefs = None self.start()
class GeckoInstance(object): required_prefs = {"marionette.defaultPrefs.enabled": True, "marionette.defaultPrefs.port": 2828, "marionette.logging": True, "startup.homepage_welcome_url": "about:blank", "browser.shell.checkDefaultBrowser": False, "browser.startup.page": 0, "browser.sessionstore.resume_from_crash": False, "browser.warnOnQuit": False} def __init__(self, host, port, bin, profile, app_args=None, symbols_path=None, gecko_log=None): self.marionette_host = host self.marionette_port = port self.bin = bin self.profile_path = profile self.app_args = app_args or [] self.runner = None self.symbols_path = symbols_path self.gecko_log = gecko_log def start(self): profile_args = {"preferences": self.required_prefs} if not self.profile_path: profile_args["restore"] = False profile = Profile(**profile_args) else: profile_args["path_from"] = self.profile_path profile = Profile.clone(**profile_args) if self.gecko_log is None: self.gecko_log = 'gecko.log' elif os.path.isdir(self.gecko_log): fname = "gecko-%d.log" % time.time() self.gecko_log = os.path.join(self.gecko_log, fname) self.gecko_log = os.path.realpath(self.gecko_log) if os.access(self.gecko_log, os.F_OK): os.remove(self.gecko_log) env = os.environ.copy() # environment variables needed for crashreporting # https://developer.mozilla.org/docs/Environment_variables_affecting_crash_reporting env.update({ 'MOZ_CRASHREPORTER': '1', 'MOZ_CRASHREPORTER_NO_REPORT': '1', }) self.runner = Runner( binary=self.bin, profile=profile, cmdargs=['-no-remote', '-marionette'] + self.app_args, env=env, symbols_path=self.symbols_path, process_args={ 'processOutputLine': [NullOutput()], 'logfile': self.gecko_log}) self.runner.start() def check_for_crashes(self): return self.runner.check_for_crashes() def close(self): if self.runner: self.runner.stop() self.runner.cleanup()
class GeckoInstance(object): required_prefs = { "browser.displayedE10SPrompt.1": 5, "browser.displayedE10SPrompt.2": 5, "browser.displayedE10SPrompt.3": 5, "browser.displayedE10SPrompt.4": 5, "browser.displayedE10SPrompt": 5, "browser.sessionstore.resume_from_crash": False, "browser.shell.checkDefaultBrowser": False, "browser.startup.page": 0, "browser.tabs.remote.autostart.1": False, "browser.tabs.remote.autostart.2": False, "browser.tabs.remote.autostart": False, "browser.urlbar.userMadeSearchSuggestionsChoice": True, "browser.warnOnQuit": False, "datareporting.healthreport.logging.consoleEnabled": False, "datareporting.healthreport.service.enabled": False, "datareporting.healthreport.service.firstRun": False, "datareporting.healthreport.uploadEnabled": False, "datareporting.policy.dataSubmissionEnabled": False, "datareporting.policy.dataSubmissionPolicyAccepted": False, "dom.ipc.reportProcessHangs": False, "focusmanager.testmode": True, "marionette.defaultPrefs.enabled": True, "startup.homepage_welcome_url": "about:blank", "toolkit.telemetry.enabled": False, # Until Bug 1238095 is fixed, we have to enable CPOWs in order # for Marionette tests to work properly. "dom.ipc.cpows.forbid-unsafe-from-browser": False, } def __init__(self, host, port, bin, profile=None, addons=None, app_args=None, symbols_path=None, gecko_log=None, prefs=None, workspace=None, verbose=0): self.marionette_host = host self.marionette_port = port self.bin = bin # Alternative to default temporary directory self.workspace = workspace # Check if it is a Profile object or a path to profile self.profile = None self.addons = addons if isinstance(profile, Profile): self.profile = profile else: self.profile_path = profile self.prefs = prefs self.required_prefs = deepcopy(GeckoInstance.required_prefs) if prefs: self.required_prefs.update(prefs) self.app_args = app_args or [] self.runner = None self.symbols_path = symbols_path if gecko_log != '-': if gecko_log is None: gecko_log = 'gecko.log' elif os.path.isdir(gecko_log): fname = 'gecko-%d.log' % time.time() gecko_log = os.path.join(gecko_log, fname) gecko_log = os.path.realpath(gecko_log) if os.access(gecko_log, os.F_OK): os.remove(gecko_log) self.gecko_log = gecko_log self.verbose = verbose def start(self): profile_args = {"preferences": deepcopy(self.required_prefs)} profile_args["preferences"][ "marionette.defaultPrefs.port"] = self.marionette_port if self.prefs: profile_args["preferences"].update(self.prefs) if self.verbose: level = "TRACE" if self.verbose >= 2 else "DEBUG" profile_args["preferences"]["marionette.logging"] = level if '-jsdebugger' in self.app_args: profile_args["preferences"].update({ "devtools.browsertoolbox.panel": "jsdebugger", "devtools.debugger.remote-enabled": True, "devtools.chrome.enabled": True, "devtools.debugger.prompt-connection": False, "marionette.debugging.clicktostart": True, }) if self.addons: profile_args['addons'] = self.addons if hasattr(self, "profile_path") and self.profile is None: if not self.profile_path: if self.workspace: profile_args['profile'] = tempfile.mkdtemp( suffix='.mozrunner-{:.0f}'.format(time.time()), dir=self.workspace) self.profile = Profile(**profile_args) else: profile_args["path_from"] = self.profile_path profile_name = '{}-{:.0f}'.format( os.path.basename(self.profile_path), time.time()) if self.workspace: profile_args["path_to"] = os.path.join( self.workspace, profile_name) self.profile = Profile.clone(**profile_args) process_args = { 'processOutputLine': [NullOutput()], } if self.gecko_log == '-': process_args['stream'] = sys.stdout else: process_args['logfile'] = self.gecko_log env = os.environ.copy() # environment variables needed for crashreporting # https://developer.mozilla.org/docs/Environment_variables_affecting_crash_reporting env.update({ 'MOZ_CRASHREPORTER': '1', 'MOZ_CRASHREPORTER_NO_REPORT': '1', }) self.runner = Runner(binary=self.bin, profile=self.profile, cmdargs=['-no-remote', '-marionette'] + self.app_args, env=env, symbols_path=self.symbols_path, process_args=process_args) self.runner.start() def close(self, restart=False): if not restart: self.profile = None if self.runner: self.runner.stop() self.runner.cleanup() def restart(self, prefs=None, clean=True): self.close(restart=True) if clean: self.profile.cleanup() self.profile = None if prefs: self.prefs = prefs else: self.prefs = None self.start()
class GeckoInstance(object): required_prefs = { "marionette.defaultPrefs.enabled": True, "marionette.logging": True, "browser.displayedE10SPrompt": 5, "browser.displayedE10SPrompt.1": 5, "browser.displayedE10SPrompt.2": 5, "browser.displayedE10SPrompt.3": 5, "browser.displayedE10SPrompt.4": 5, "browser.sessionstore.resume_from_crash": False, "browser.shell.checkDefaultBrowser": False, "browser.startup.page": 0, "browser.tabs.remote.autostart.1": False, "browser.tabs.remote.autostart.2": False, "browser.urlbar.userMadeSearchSuggestionsChoice": True, "browser.warnOnQuit": False, "dom.ipc.reportProcessHangs": False, "focusmanager.testmode": True, "startup.homepage_welcome_url": "about:blank" } def __init__(self, host, port, bin, profile=None, addons=None, app_args=None, symbols_path=None, gecko_log=None, prefs=None): self.marionette_host = host self.marionette_port = port self.bin = bin # Check if it is a Profile object or a path to profile self.profile = None self.addons = addons if isinstance(profile, Profile): self.profile = profile else: self.profile_path = profile self.prefs = prefs self.required_prefs = deepcopy(GeckoInstance.required_prefs) if prefs: self.required_prefs.update(prefs) self.app_args = app_args or [] self.runner = None self.symbols_path = symbols_path if gecko_log != '-': if gecko_log is None: gecko_log = 'gecko.log' elif os.path.isdir(gecko_log): fname = 'gecko-%d.log' % time.time() gecko_log = os.path.join(gecko_log, fname) gecko_log = os.path.realpath(gecko_log) if os.access(gecko_log, os.F_OK): os.remove(gecko_log) self.gecko_log = gecko_log def start(self): profile_args = {"preferences": deepcopy(self.required_prefs)} profile_args["preferences"][ "marionette.defaultPrefs.port"] = self.marionette_port if self.prefs: profile_args["preferences"].update(self.prefs) if '-jsdebugger' in self.app_args: profile_args["preferences"].update({ "devtools.browsertoolbox.panel": "jsdebugger", "devtools.debugger.remote-enabled": True, "devtools.chrome.enabled": True, "devtools.debugger.prompt-connection": False, "marionette.debugging.clicktostart": True, }) if self.addons: profile_args['addons'] = self.addons if hasattr(self, "profile_path") and self.profile is None: if not self.profile_path: self.profile = Profile(**profile_args) else: profile_args["path_from"] = self.profile_path self.profile = Profile.clone(**profile_args) process_args = { 'processOutputLine': [NullOutput()], } if self.gecko_log == '-': process_args['stream'] = sys.stdout else: process_args['logfile'] = self.gecko_log env = os.environ.copy() # environment variables needed for crashreporting # https://developer.mozilla.org/docs/Environment_variables_affecting_crash_reporting env.update({ 'MOZ_CRASHREPORTER': '1', 'MOZ_CRASHREPORTER_NO_REPORT': '1', }) self.runner = Runner(binary=self.bin, profile=self.profile, cmdargs=['-no-remote', '-marionette'] + self.app_args, env=env, symbols_path=self.symbols_path, process_args=process_args) self.runner.start() def close(self, restart=False): if not restart: self.profile = None if self.runner: self.runner.stop() self.runner.cleanup() def restart(self, prefs=None, clean=True): self.close(restart=True) if clean: self.profile.cleanup() self.profile = None if prefs: self.prefs = prefs else: self.prefs = None self.start()
class GeckoInstance(object): required_prefs = { "browser.sessionstore.resume_from_crash": False, "browser.shell.checkDefaultBrowser": False, "browser.startup.page": 0, "browser.tabs.remote.autostart.1": False, "browser.tabs.remote.autostart.2": False, "browser.tabs.remote.autostart": False, "browser.urlbar.userMadeSearchSuggestionsChoice": True, "browser.warnOnQuit": False, "datareporting.healthreport.logging.consoleEnabled": False, "datareporting.healthreport.service.enabled": False, "datareporting.healthreport.service.firstRun": False, "datareporting.healthreport.uploadEnabled": False, "datareporting.policy.dataSubmissionEnabled": False, "datareporting.policy.dataSubmissionPolicyAccepted": False, "dom.ipc.reportProcessHangs": False, # Only install add-ons from the profile and the application scope # Also ensure that those are not getting disabled. # see: https://developer.mozilla.org/en/Installing_extensions "extensions.enabledScopes": 5, "extensions.autoDisableScopes": 10, "focusmanager.testmode": True, "marionette.defaultPrefs.enabled": True, "startup.homepage_welcome_url": "about:blank", "toolkit.telemetry.enabled": False, # Until Bug 1238095 is fixed, we have to enable CPOWs in order # for Marionette tests to work properly. "dom.ipc.cpows.forbid-unsafe-from-browser": False, } def __init__( self, host, port, bin, profile=None, addons=None, app_args=None, symbols_path=None, gecko_log=None, prefs=None, workspace=None, verbose=0, ): self.marionette_host = host self.marionette_port = port self.bin = bin # Alternative to default temporary directory self.workspace = workspace # Check if it is a Profile object or a path to profile self.profile = None self.addons = addons if isinstance(profile, Profile): self.profile = profile else: self.profile_path = profile self.prefs = prefs self.required_prefs = deepcopy(GeckoInstance.required_prefs) if prefs: self.required_prefs.update(prefs) self.app_args = app_args or [] self.runner = None self.symbols_path = symbols_path if gecko_log != "-": if gecko_log is None: gecko_log = "gecko.log" elif os.path.isdir(gecko_log): fname = "gecko-%d.log" % time.time() gecko_log = os.path.join(gecko_log, fname) gecko_log = os.path.realpath(gecko_log) if os.access(gecko_log, os.F_OK): os.remove(gecko_log) self.gecko_log = gecko_log self.verbose = verbose def start(self): profile_args = {"preferences": deepcopy(self.required_prefs)} profile_args["preferences"]["marionette.defaultPrefs.port"] = self.marionette_port if self.prefs: profile_args["preferences"].update(self.prefs) if self.verbose: level = "TRACE" if self.verbose >= 2 else "DEBUG" profile_args["preferences"]["marionette.logging"] = level if "-jsdebugger" in self.app_args: profile_args["preferences"].update( { "devtools.browsertoolbox.panel": "jsdebugger", "devtools.debugger.remote-enabled": True, "devtools.chrome.enabled": True, "devtools.debugger.prompt-connection": False, "marionette.debugging.clicktostart": True, } ) if self.addons: profile_args["addons"] = self.addons if hasattr(self, "profile_path") and self.profile is None: if not self.profile_path: if self.workspace: profile_args["profile"] = tempfile.mkdtemp( suffix=".mozrunner-{:.0f}".format(time.time()), dir=self.workspace ) self.profile = Profile(**profile_args) else: profile_args["path_from"] = self.profile_path profile_name = "{}-{:.0f}".format(os.path.basename(self.profile_path), time.time()) if self.workspace: profile_args["path_to"] = os.path.join(self.workspace, profile_name) self.profile = Profile.clone(**profile_args) process_args = {"processOutputLine": [NullOutput()]} if self.gecko_log == "-": process_args["stream"] = sys.stdout else: process_args["logfile"] = self.gecko_log env = os.environ.copy() # environment variables needed for crashreporting # https://developer.mozilla.org/docs/Environment_variables_affecting_crash_reporting env.update({"MOZ_CRASHREPORTER": "1", "MOZ_CRASHREPORTER_NO_REPORT": "1"}) self.runner = Runner( binary=self.bin, profile=self.profile, cmdargs=["-no-remote", "-marionette"] + self.app_args, env=env, symbols_path=self.symbols_path, process_args=process_args, ) self.runner.start() def close(self, restart=False): if not restart: self.profile = None if self.runner: self.runner.stop() self.runner.cleanup() def restart(self, prefs=None, clean=True): self.close(restart=True) if clean: self.profile.cleanup() self.profile = None if prefs: self.prefs = prefs else: self.prefs = None self.start()