summaryrefslogtreecommitdiffstats
path: root/testing/performance/hooks_recording.py
diff options
context:
space:
mode:
Diffstat (limited to 'testing/performance/hooks_recording.py')
-rw-r--r--testing/performance/hooks_recording.py171
1 files changed, 171 insertions, 0 deletions
diff --git a/testing/performance/hooks_recording.py b/testing/performance/hooks_recording.py
new file mode 100644
index 0000000000..63cc65caa0
--- /dev/null
+++ b/testing/performance/hooks_recording.py
@@ -0,0 +1,171 @@
+# This Source Code Form is subject to the terms of the Mozilla Public
+# License, v. 2.0. If a copy of the MPL was not distributed with this
+# file, You can obtain one at http://mozilla.org/MPL/2.0/.
+import json
+import os
+import platform
+from pathlib import Path
+
+from mozperftest.test.browsertime import add_option, add_options
+
+# Uncomment the manual_login line if you need to do a manual login.
+# The extra browsertime arguments get overwritten below so they
+# need to be set here. The value is the time you need to do a login.
+options = [
+ ("pageCompleteWaitTime", "10000"),
+ # ("browsertime.manual_login", 100000),
+]
+
+next_site = None
+
+RECORDING_LIST = Path(Path(__file__).parent, "pageload_sites.json")
+
+SCM_1_LOGIN_SITES = ("facebook", "netflix")
+
+
+def before_iterations(kw):
+
+ global next_site
+ print("Setting up next site to record.")
+
+ with RECORDING_LIST.open() as f:
+ site_list = json.load(f)
+ # currently can't record websites that require user interactions(Logins)
+ if kw.get("android"):
+ site_list = site_list["mobile"]
+ else:
+ site_list = site_list["desktop"]
+
+ def __should_record(test):
+ # If a test page selection was provided, only select those
+ # tests and exclude all the others
+ specified_tests = kw["proxy_perftest_page"]
+ if specified_tests is not None:
+ if test.get("name") in specified_tests:
+ if test.get("login"):
+ print(f"WARNING: You selected a login test: {test.get('name')}")
+ return True
+ else:
+ return False
+
+ # Only perform login recordings in automation or when
+ # RAPTOR_LOGINS is defined
+ record = False
+ if not test.get("login") or test.get("login-test"):
+ record = True
+ if not (
+ "MOZ_AUTOMATION" in os.environ or "RAPTOR_LOGINS" in os.environ
+ ) and test.get("login-test"):
+ record = False
+ print(
+ f"Skipping login test `{test.get('name')}` "
+ f"because login info cannot be obtained."
+ )
+
+ # When pushing to Try, only attempt login recording using the
+ # taskcluster secrets that are associated with SCM level 1 as defined
+ # in `SCM_LVL_1_SITES`.
+ if test.get("login"):
+ if "MOZ_AUTOMATION" in os.environ.keys():
+ if (
+ os.environ.get("MOZ_SCM_LEVEL") == 1
+ and test.get("name") not in SCM_1_LOGIN_SITES
+ ):
+ print(
+ f"Skipping login test `{test.get('name')}` "
+ f"Because SCM = `{os.environ.get('MOZ_SCM_LEVEL') }`"
+ f"and there is no secret available at this level"
+ )
+ return False
+ return True
+ elif "RAPTOR_LOGINS" in os.environ:
+ # Leave it to the user to have properly set up a local json file with
+ # the login websites of interest
+ return True
+
+ return record
+
+ sites = [test_site for test_site in site_list if __should_record(test_site)]
+
+ if not sites:
+ raise Exception("No tests were selected for recording!")
+
+ def next_site():
+ for site in sites:
+ yield site
+
+ next_site = next_site()
+
+ # Set the number of test-iterations to the number of builds
+ kw["test_iterations"] = len(sites)
+ return kw
+
+
+def before_runs(env):
+ global next_site
+ print("Running before_runs")
+ add_options(env, options)
+
+ if next_site:
+ test_site = next(next_site)
+ print("Next site: %s" % test_site)
+
+ if env.get_arg("android"):
+ platform_name = "android"
+ app_name = env.get_arg("android-app-name").split(".")[-1]
+ else:
+ platform_name = platform.system().lower()
+ app_name = "firefox"
+
+ name = [
+ "mitm8",
+ platform_name,
+ "gve" if app_name == "geckoview_example" else app_name,
+ test_site["name"],
+ ]
+
+ recording_file = "%s.zip" % "-".join(name)
+
+ env.set_arg("proxy-mode", "record")
+ env.set_arg(
+ "proxy-file",
+ recording_file,
+ )
+
+ add_options(env, options, overwrite=True)
+ add_option(env, "browsertime.url", test_site.get("test_url"))
+ add_option(env, "browsertime.screenshot", "true")
+ add_option(env, "browsertime.testName", test_site.get("name"))
+ add_option(env, "browsertime.testType", test_site.get("type", "pageload"))
+ add_option(
+ env, "browsertime.login", "true" if test_site.get("login") else "false"
+ )
+
+ prefs = test_site.get("preferences", {})
+ for pref, val in prefs.items():
+ add_option(env, "firefox.preference", f"{pref}:{val}")
+
+ second_url = test_site.get("secondary_url", None)
+ if second_url:
+ add_option(env, "browsertime.secondary_url", second_url)
+
+ inject_deterministic = test_site.get("inject_deterministic", True)
+ env.set_arg("proxy-deterministic", inject_deterministic)
+
+ dismiss_cookie_prompt = test_site.get("dismiss_cookie_prompt", [])
+ if dismiss_cookie_prompt:
+ parsed_cmds = [
+ ":::".join([str(i) for i in item])
+ for item in dismiss_cookie_prompt
+ if item
+ ]
+ add_option(
+ env, "browsertime.dismiss_cookie_prompt", ";;;".join(parsed_cmds)
+ )
+
+ cmds = test_site.get("test_cmds", [])
+ if cmds:
+ parsed_cmds = [":::".join([str(i) for i in item]) for item in cmds if item]
+ add_option(env, "browsertime.commands", ";;;".join(parsed_cmds))
+
+ print("Recording %s to file: %s" % (test_site.get("test_url"), recording_file))