Source code
Revision control
Copy as Markdown
Other Tools
# 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
import json
import optparse
import os
import re
import sys
from threading import RLock
from tps import TPSTestRunner
def main():
parser = optparse.OptionParser()
parser.add_option(
"--binary",
action="store",
type="string",
dest="binary",
default=None,
help="path to the Firefox binary, specified either as "
"a local file or a url; if omitted, the PATH "
"will be searched;",
)
parser.add_option(
"--configfile",
action="store",
type="string",
dest="configfile",
default=None,
help="path to the config file to use default: %default]",
)
parser.add_option(
"--debug",
action="store_true",
dest="debug",
default=False,
help="run in debug mode",
)
parser.add_option(
"--ignore-unused-engines",
default=False,
action="store_true",
dest="ignore_unused_engines",
help="If defined, do not load unused engines in individual tests."
" Has no effect for pulse monitor.",
)
parser.add_option(
"--logfile",
action="store",
type="string",
dest="logfile",
default="tps.log",
help="path to the log file [default: %default]",
)
parser.add_option(
"--mobile",
action="store_true",
dest="mobile",
default=False,
help="run with mobile settings",
)
parser.add_option(
"--pulsefile",
action="store",
type="string",
dest="pulsefile",
default=None,
help="path to file containing a pulse message in "
"json format that you want to inject into the monitor",
)
parser.add_option(
"--resultfile",
action="store",
type="string",
dest="resultfile",
default="tps_result.json",
help="path to the result file [default: %default]",
)
parser.add_option(
"--testfile",
action="store",
type="string",
dest="testfile",
default="all_tests.json",
help="path to the test file to run [default: %default]",
)
parser.add_option(
"--stop-on-error",
action="store_true",
dest="stop_on_error",
help="stop running tests after the first failure",
)
(options, args) = parser.parse_args()
configfile = options.configfile
if configfile is None:
virtual_env = os.environ.get("VIRTUAL_ENV")
if virtual_env:
configfile = os.path.join(virtual_env, "config.json")
if configfile is None or not os.access(configfile, os.F_OK):
raise Exception(
"Unable to find config.json in a VIRTUAL_ENV; you must "
"specify a config file using the --configfile option"
)
# load the config file
f = open(configfile, "r")
configcontent = f.read()
f.close()
config = json.loads(configcontent)
testfile = os.path.join(config.get("testdir", ""), options.testfile)
rlock = RLock()
print("using result file", options.resultfile)
extensionDir = config.get("extensiondir")
if not extensionDir or extensionDir == "__EXTENSIONDIR__":
extensionDir = os.path.join(
os.getcwd(), "..", "..", "services", "sync", "tps", "extensions"
)
else:
if sys.platform == "win32":
# replace msys-style paths with proper Windows paths
m = re.match(r"^\/\w\/", extensionDir)
if m:
extensionDir = "%s:/%s" % (m.group(0)[1:2], extensionDir[3:])
extensionDir = extensionDir.replace("/", "\\")
if sys.platform == "darwin":
# Needed to avoid tab crashes on mac due to level 3 sandboxing
sourceRoot = os.path.join(extensionDir, "..", "..", "..", "..")
os.environ["MOZ_DEVELOPER_REPO_DIR"] = os.path.abspath(sourceRoot)
TPS = TPSTestRunner(
extensionDir,
binary=options.binary,
config=config,
debug=options.debug,
ignore_unused_engines=options.ignore_unused_engines,
logfile=options.logfile,
mobile=options.mobile,
resultfile=options.resultfile,
rlock=rlock,
testfile=testfile,
stop_on_error=options.stop_on_error,
)
TPS.run_tests()
if TPS.numfailed > 0 or TPS.numpassed == 0:
sys.exit(1)
if __name__ == "__main__":
main()