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
|
# 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
options = [
("pageCompleteWaitTime", "10000"),
]
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_option(env, "browsertime.url", test_site.get("test_url"), overwrite=True)
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", test_site.get("login", "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))
|