1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182
|
# 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")
# Uncomment this to record tp7 desktop sites in CI or locally.
# This is still a WIP (Bug 1831310) and meant to be used by the
# perftest team.
# RECORDING_LIST = Path(Path(__file__).parent, "tp7_desktop_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") == 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"
# bug 1883701 linux uses a different version for now
name = [
"mitm8" if platform_name == "linux" else "mitm11",
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}")
# Add prefs that will attempt to remove cookie banners
add_option(
env, "firefox.preference", "cookiebanners.bannerClicking.enabled:true"
)
add_option(env, "firefox.preference", "cookiebanners.service.mode:2")
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))
|