# 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 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()