Source code
Revision control
Copy as Markdown
Other Tools
#!/usr/bin/env python3
import re
RE_DEFAULT = re.compile(r"\[D=([TF])\] ")
RE_TRANSITION = re.compile(r"([a-zA-Z0-9 \[\]=#_-]+) *->(.*)")
RE_ASSERTION = re.compile(
r"\[A S=([a-zA-Z01_]+) SS=([a-zA-Z01_]+) ES=([a-zA-Z01_]+) P=([a-zA-Z_]+) ESP=([a-zA-Z_]+)\]"
)
RE_ASSERTION_SHORTHAND = re.compile(r"\[A#([0-9T]+)\]")
# ======================================================================
# ======================================================================
testnum = 1
def start_test(line):
global testnum
output.write(
"""
def test_{0}(self):
# {1}...\n""".format(
testnum, line[0:80]
)
)
testnum += 1
def set_default(d):
output.write(
"""
if self.default_is is not {0}:
return\n""".format(
"True" if d == "T" else "False"
)
)
def enroll(e):
if e.endswith("-C"):
e = e[:-2]
output.write("\n # Re-set enrollment pref, like Normandy would do\n")
output.write(
" self.set_enrollment_status(ExperimentStatus.ENROLLED_{0})\n".format(
e.upper()
)
)
def set_pref(enabled):
output.write(
"\n self.marionette.set_pref(Prefs.WIN32K, {0})\n".format(str(enabled))
)
def set_e10s(enable):
if enable:
output.write(
"""
self.restart(env={ENV_DISABLE_E10S: "1"})
self.set_env(ENV_DISABLE_E10S, "null")\n"""
)
else:
raise Exception("Not implemented")
def set_header(enable):
if enable:
output.write(
"""
self.restart(env={ENV_DISABLE_WIN32K: "1"})\n"""
)
else:
output.write(
"""
self.set_env(ENV_DISABLE_WIN32K, "")\n"""
)
def set_bad_requirements(enabled):
output.write(
"""
self.marionette.set_pref(Prefs.WEBGL, {0})\n""".format(
"False" if enabled else "True"
)
)
def restart():
output.write("\n self.restart()\n")
def print_assertion(assertion):
if not assertion:
return
output.write(
"""
self.check_win32k_status(
status=ContentWin32kLockdownState.{0},
sessionStatus=ContentWin32kLockdownState.{1},
experimentStatus=ExperimentStatus.{2},
pref={3},
enrollmentStatusPref=ExperimentStatus.{4},
)\n""".format(
*assertion
)
)
# ======================================================================
# ======================================================================
TESTS = open("win32k_tests.txt", "r").readlines()
output = open("test_win32k_enrollment.py", "w", newline="\n")
header = open("test_win32k_enrollment.template.py", "r")
for l in header:
output.write(l)
mappings = {}
for line in TESTS:
line = line.strip()
if not line:
continue
if line.startswith("#"):
continue
elif line.startswith("> "):
line = line[2:]
key, value = line.split(":")
mappings[key.strip()] = value.strip()
continue
elif line.startswith("-"):
line = line[1:].strip()
elif line.startswith("+"):
line = line[1:].strip()
import pdb
pdb.set_trace()
else:
raise Exception("unknown line type: " + line)
# We can't handle Safe Mode right now
if "Safe Mode" in line:
continue
# If we have no assertions defined, skip the test entirely
if "[A" not in line:
continue
if not RE_DEFAULT.match(line):
raise Exception("'{0}' does not match the default regex".format(line))
default = RE_DEFAULT.search(line).groups(1)[0]
start_test(line)
set_default(default)
line = line[6:]
while line:
# this is a horrible hack for the line ending to avoid making the
# regex more complicated and having to fix it
if not line.endswith(" ->"):
line += " ->"
groups = RE_TRANSITION.search(line).groups()
start = groups[0].strip()
end = groups[1].strip()
if RE_ASSERTION.search(start):
assertion = RE_ASSERTION.search(start).groups()
start = start[0 : start.index("[")].strip()
elif RE_ASSERTION_SHORTHAND.search(start):
key = RE_ASSERTION_SHORTHAND.search(start).groups()[0]
assertion = RE_ASSERTION.search(mappings[key]).groups()
start = start[0 : start.index("[")].strip()
else:
assertion = ""
if start == "Nothing":
pass
elif start.startswith("Enrolled "):
enroll(start[9:])
elif start == "E10S":
set_e10s(True)
elif start == "Header-On":
set_header(True)
elif start == "Header-Off":
set_header(False)
elif start == "Bad Requirements":
set_bad_requirements(True)
elif start == "Restart":
restart()
elif start == "On":
set_pref(True)
elif start == "Off":
set_pref(False)
else:
raise Exception("Unknown Action: " + start)
print_assertion(assertion)
line = end.strip()
if RE_ASSERTION.match(line):
print_assertion(RE_ASSERTION.search(line).groups())
elif RE_ASSERTION_SHORTHAND.search(line):
key = RE_ASSERTION_SHORTHAND.search(line).groups()[0]
print_assertion(RE_ASSERTION.search(mappings[key]).groups())