def test_profile_recovery(monkeypatch, default_params, task_manager_creator, testcase, stateful, seed_tar): """Test browser profile recovery in various scenarios.""" manager_params, browser_params = default_params manager_params.num_browsers = 1 browser_params[0].seed_tar = seed_tar manager, db = task_manager_creator((manager_params, browser_params[:1])) manager.get(BASE_TEST_URL, reset=not stateful) if testcase == "normal_operation": pass elif testcase == "on_crash": # Cause a selenium crash to force browser to restart manager.get("example.com", reset=not stateful) elif testcase == "on_crash_during_launch": # Cause a selenium crash to force browser to restart manager.get("example.com", reset=not stateful) # This will cause browser restarts to fail monkeypatch.setenv("FIREFOX_BINARY", "/tmp/NOTREAL") # Let the launch succeed after some failed launch attempts def undo_monkeypatch(): time.sleep(5) # This should be smaller than _SPAWN_TIMEOUT monkeypatch.undo() Thread(target=undo_monkeypatch).start() elif testcase == "on_timeout": # Set a very low timeout to cause a restart manager.get("about:config", reset=not stateful, timeout=0.1) cs = CommandSequence("about:config", reset=not stateful) expected_value = True if seed_tar else False cs.append_command(AssertConfigSetCommand("test_pref", expected_value)) tar_directory = manager_params.data_directory / "browser_profile" tar_path = tar_directory / "profile.tar.gz" cs.dump_profile(tar_path, True) manager.execute_command_sequence(cs) manager.close() # Check that a consistent profile is used for stateful crawls but # not for stateless crawls with tarfile.open(tar_path) as tar: tar.extractall(tar_directory) ff_db = tar_directory / "places.sqlite" rows = db_utils.query_db(ff_db, "SELECT url FROM moz_places") places = [url for (url, ) in rows] if stateful: assert BASE_TEST_URL in places else: assert BASE_TEST_URL not in places # Check if seed_tar was loaded on restart rows = db_utils.query_db( db, "SELECT command_status FROM crawl_history WHERE" " command='AssertConfigSetCommand'", ) assert rows[0][0] == "ok"
def test_dump_profile_command(default_params, task_manager_creator): """Test saving the browser profile using a command.""" manager_params, browser_params = default_params manager_params.num_browsers = 1 manager, _ = task_manager_creator((manager_params, browser_params[:1])) cs = CommandSequence(url=BASE_TEST_URL) cs.get() tar_path = manager_params.data_directory / "profile.tar.gz" cs.dump_profile(tar_path, True) manager.execute_command_sequence(cs) manager.close() assert tar_path.is_file()