class FennecBrowser(FirefoxBrowser): used_ports = set() init_timeout = 300 shutdown_timeout = 60 def __init__(self, logger, prefs_root, test_type, package_name=None, device_serial="emulator-5444", **kwargs): FirefoxBrowser.__init__(self, logger, None, prefs_root, test_type, **kwargs) self._package_name = package_name self.device_serial = device_serial @property def package_name(self): """ Name of app to run on emulator. """ if self._package_name is None: self._package_name = "org.mozilla.fennec" user = os.getenv("USER") if user: self._package_name += "_" + user return self._package_name def start(self, **kwargs): if self.marionette_port is None: self.marionette_port = get_free_port(2828, exclude=self.used_ports) self.used_ports.add(self.marionette_port) env = {} env["MOZ_CRASHREPORTER"] = "1" env["MOZ_CRASHREPORTER_SHUTDOWN"] = "1" env["MOZ_DISABLE_NONLOCAL_CONNECTIONS"] = "1" env["STYLO_THREADS"] = str(self.stylo_threads) if self.chaos_mode_flags is not None: env["MOZ_CHAOSMODE"] = str(self.chaos_mode_flags) preferences = self.load_prefs() self.profile = FennecProfile(preferences=preferences) self.profile.set_preferences({ "marionette.port": self.marionette_port, "dom.disable_open_during_load": False, "places.history.enabled": False, "dom.send_after_paint_to_content": True, "network.preload": True }) if self.leak_check and kwargs.get("check_leaks", True): self.leak_report_file = os.path.join(self.profile.profile, "runtests_leaks.log") if os.path.exists(self.leak_report_file): os.remove(self.leak_report_file) env["XPCOM_MEM_BLOAT_LOG"] = self.leak_report_file else: self.leak_report_file = None if self.ca_certificate_path is not None: self.setup_ssl() debug_args, cmd = browser_command( self.package_name, self.binary_args if self.binary_args else [] + [cmd_arg("marionette"), "about:blank"], self.debug_info) self.runner = FennecEmulatorRunner( app=self.package_name, profile=self.profile, cmdargs=cmd[1:], env=env, symbols_path=self.symbols_path, serial=self.device_serial, # TODO - choose appropriate log dir logdir=os.getcwd(), process_class=ProcessHandler, process_args={"processOutputLine": [self.on_output]}) self.logger.debug("Starting Fennec") # connect to a running emulator self.runner.device.connect() write_hosts_file(self.config, self.runner.device.device) self.runner.start(debug_args=debug_args, interactive=self.debug_info and self.debug_info.interactive) # gecko_log comes from logcat when running with device/emulator logcat_args = { "filterspec": "Gecko", "serial": self.runner.device.app_ctx.device_serial } # TODO setting logcat_args["logfile"] yields an almost empty file # even without filterspec logcat_args["stream"] = sys.stdout self.runner.device.start_logcat(**logcat_args) self.runner.device.device.forward( local="tcp:{}".format(self.marionette_port), remote="tcp:{}".format(self.marionette_port)) self.logger.debug("Fennec Started") def stop(self, force=False): if self.runner is not None: try: if self.runner.device.connected: self.runner.device.device.remove_forwards("tcp:{}".format( self.marionette_port)) except Exception: traceback.print_exception(*sys.exc_info()) # We assume that stopping the runner prompts the # browser to shut down. This allows the leak log to be written for clean, stop_f in [ (True, lambda: self.runner.wait(self.shutdown_timeout)), (False, lambda: self.runner.stop(signal.SIGTERM)), (False, lambda: self.runner.stop(signal.SIGKILL)) ]: if not force or not clean: retcode = stop_f() if retcode is not None: self.logger.info("Browser exited with return code %s" % retcode) break self.logger.debug("stopped")
class FennecBrowser(FirefoxBrowser): used_ports = set() init_timeout = 300 shutdown_timeout = 60 def __init__(self, logger, prefs_root, test_type, package_name=None, device_serial="emulator-5444", **kwargs): FirefoxBrowser.__init__(self, logger, None, prefs_root, test_type, **kwargs) self._package_name = package_name self.device_serial = device_serial @property def package_name(self): """ Name of app to run on emulator. """ if self._package_name is None: self._package_name = "org.mozilla.fennec" user = os.getenv("USER") if user: self._package_name += "_" + user return self._package_name def start(self, **kwargs): if self.marionette_port is None: self.marionette_port = get_free_port(2828, exclude=self.used_ports) self.used_ports.add(self.marionette_port) env = {} env["MOZ_CRASHREPORTER"] = "1" env["MOZ_CRASHREPORTER_SHUTDOWN"] = "1" env["MOZ_DISABLE_NONLOCAL_CONNECTIONS"] = "1" env["STYLO_THREADS"] = str(self.stylo_threads) if self.chaos_mode_flags is not None: env["MOZ_CHAOSMODE"] = str(self.chaos_mode_flags) preferences = self.load_prefs() self.profile = FennecProfile(preferences=preferences) self.profile.set_preferences({"marionette.port": self.marionette_port, "dom.disable_open_during_load": False, "places.history.enabled": False, "dom.send_after_paint_to_content": True, "network.preload": True}) if self.leak_check and kwargs.get("check_leaks", True): self.leak_report_file = os.path.join(self.profile.profile, "runtests_leaks.log") if os.path.exists(self.leak_report_file): os.remove(self.leak_report_file) env["XPCOM_MEM_BLOAT_LOG"] = self.leak_report_file else: self.leak_report_file = None if self.ca_certificate_path is not None: self.setup_ssl() debug_args, cmd = browser_command(self.package_name, self.binary_args if self.binary_args else [] + [cmd_arg("marionette"), "about:blank"], self.debug_info) self.runner = FennecEmulatorRunner(app=self.package_name, profile=self.profile, cmdargs=cmd[1:], env=env, symbols_path=self.symbols_path, serial=self.device_serial, # TODO - choose appropriate log dir logdir=os.getcwd(), process_class=ProcessHandler, process_args={"processOutputLine": [self.on_output]}) self.logger.debug("Starting Fennec") # connect to a running emulator self.runner.device.connect() write_hosts_file(self.config, self.runner.device.device) self.runner.start(debug_args=debug_args, interactive=self.debug_info and self.debug_info.interactive) # gecko_log comes from logcat when running with device/emulator logcat_args = { "filterspec": "Gecko", "serial": self.runner.device.app_ctx.device_serial } # TODO setting logcat_args["logfile"] yields an almost empty file # even without filterspec logcat_args["stream"] = sys.stdout self.runner.device.start_logcat(**logcat_args) self.runner.device.device.forward( local="tcp:{}".format(self.marionette_port), remote="tcp:{}".format(self.marionette_port)) self.logger.debug("Fennec Started") def stop(self, force=False): if self.runner is not None: try: if self.runner.device.connected: self.runner.device.device.remove_forwards( "tcp:{}".format(self.marionette_port)) except Exception: traceback.print_exception(*sys.exc_info()) # We assume that stopping the runner prompts the # browser to shut down. This allows the leak log to be written for clean, stop_f in [(True, lambda: self.runner.wait(self.shutdown_timeout)), (False, lambda: self.runner.stop(signal.SIGTERM)), (False, lambda: self.runner.stop(signal.SIGKILL))]: if not force or not clean: retcode = stop_f() if retcode is not None: self.logger.info("Browser exited with return code %s" % retcode) break self.logger.debug("stopped")
class FennecBrowser(FirefoxBrowser): used_ports = set() init_timeout = 300 shutdown_timeout = 60 def __init__(self, logger, prefs_root, test_type, package_name=None, device_serial="emulator-5444", **kwargs): FirefoxBrowser.__init__(self, logger, None, prefs_root, test_type, **kwargs) self._package_name = package_name self.device_serial = device_serial self.tests_root = kwargs["tests_root"] self.install_fonts = kwargs["install_fonts"] @property def package_name(self): """ Name of app to run on emulator. """ if self._package_name is None: self._package_name = "org.mozilla.fennec" user = os.getenv("USER") if user: self._package_name += "_" + user return self._package_name def start(self, **kwargs): if self.marionette_port is None: self.marionette_port = get_free_port(2828, exclude=self.used_ports) self.used_ports.add(self.marionette_port) env = {} env["MOZ_CRASHREPORTER"] = "1" env["MOZ_CRASHREPORTER_SHUTDOWN"] = "1" env["MOZ_DISABLE_NONLOCAL_CONNECTIONS"] = "1" env["STYLO_THREADS"] = str(self.stylo_threads) if self.chaos_mode_flags is not None: env["MOZ_CHAOSMODE"] = str(self.chaos_mode_flags) preferences = self.load_prefs() self.profile = FirefoxProfile(preferences=preferences) self.profile.set_preferences({ "marionette.port": self.marionette_port, "dom.disable_open_during_load": False, "places.history.enabled": False, "dom.send_after_paint_to_content": True, "network.preload": True }) if self.test_type == "reftest": self.logger.info("Setting android reftest preferences") self.profile.set_preferences({ "browser.viewport.desktopWidth": 600, # Disable high DPI "layout.css.devPixelsPerPx": "1.0", # Ensure that the full browser element # appears in the screenshot "apz.allow_zooming": False, "android.widget_paints_background": False, # Ensure that scrollbars are always painted "ui.scrollbarFadeBeginDelay": 100000 }) if self.install_fonts: self.logger.debug("Copying Ahem font to profile") font_dir = os.path.join(self.profile.profile, "fonts") if not os.path.exists(font_dir): os.makedirs(font_dir) with open(os.path.join(self.tests_root, "fonts", "Ahem.ttf"), "rb") as src: with open(os.path.join(font_dir, "Ahem.ttf"), "wb") as dest: dest.write(src.read()) if self.leak_check and kwargs.get("check_leaks", True): self.leak_report_file = os.path.join(self.profile.profile, "runtests_leaks.log") if os.path.exists(self.leak_report_file): os.remove(self.leak_report_file) env["XPCOM_MEM_BLOAT_LOG"] = self.leak_report_file else: self.leak_report_file = None if self.ca_certificate_path is not None: self.setup_ssl() debug_args, cmd = browser_command( self.package_name, self.binary_args if self.binary_args else [] + [cmd_arg("marionette"), "about:blank"], self.debug_info) self.runner = FennecEmulatorRunner( app=self.package_name, profile=self.profile, cmdargs=cmd[1:], env=env, symbols_path=self.symbols_path, serial=self.device_serial, # TODO - choose appropriate log dir logdir=os.getcwd(), process_class=ProcessHandler, process_args={"processOutputLine": [self.on_output]}) self.logger.debug("Starting %s" % self.package_name) # connect to a running emulator self.runner.device.connect() write_hosts_file(self.config, self.runner.device.device) self.runner.start(debug_args=debug_args, interactive=self.debug_info and self.debug_info.interactive) self.runner.device.device.forward( local="tcp:{}".format(self.marionette_port), remote="tcp:{}".format(self.marionette_port)) self.logger.debug("%s Started" % self.package_name) def stop(self, force=False): if self.runner is not None: try: if self.runner.device.connected: if len(self.runner.device.device.list_forwards()) > 0: self.runner.device.device.remove_forwards( "tcp:{}".format(self.marionette_port)) except Exception: traceback.print_exception(*sys.exc_info()) # We assume that stopping the runner prompts the # browser to shut down. This allows the leak log to be written self.runner.stop() for clean, stop_f in [ (True, lambda: self.runner.wait(self.shutdown_timeout)), (False, lambda: self.runner.stop(signal.SIGTERM)), (False, lambda: self.runner.stop(signal.SIGKILL)) ]: if not force or not clean: retcode = stop_f() if retcode is not None: self.logger.info("Browser exited with return code %s" % retcode) break self.logger.debug("stopped")