# 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('^\/\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()
