# 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/.

from optparse import OptionParser
import os
import re
import sys
import unittest

import mozlog

import dmunit
import genfiles


def main(ip, port, heartbeat_port, scripts, directory, isTestDevice, verbose):
    dmunit.ip = ip
    dmunit.port = port
    dmunit.heartbeat_port = heartbeat_port
    if verbose:
        dmunit.log_level = mozlog.DEBUG

    suite = unittest.TestSuite()

    genfiles.gen_test_files()

    if scripts:
        # Ensure the user didn't include the .py on the name of the test file
        # (and get rid of it if they did)
        scripts = map(lambda x: x.split('.')[0], scripts)
    else:
        # Go through the directory and pick up everything
        # named test_*.py and run it
        testfile = re.compile('^test_.*\.py$')
        files = os.listdir(directory)

        for f in files:
            if testfile.match(f):
                scripts.append(f.split('.')[0])

    testLoader = dmunit.DeviceManagerTestLoader(isTestDevice)
    for s in scripts:
        suite.addTest(testLoader.loadTestsFromModuleName(s))
    unittest.TextTestRunner(verbosity=2).run(suite)

    genfiles.clean_test_files()


if  __name__ == "__main__":

    default_ip = '127.0.0.1'
    default_port = 20701

    env_ip, _, env_port = os.getenv('TEST_DEVICE', '').partition(':')
    if env_port:
        try:
            env_port = int(env_port)
        except ValueError:
            print >> sys.stderr, "Port in TEST_DEVICE should be an integer."
            sys.exit(1)

    # Deal with the options
    parser = OptionParser()
    parser.add_option("--ip", action="store", type="string", dest="ip",
                      help="IP address for device running SUTAgent, defaults "
                      "to what's provided in $TEST_DEVICE or 127.0.0.1",
                      default=(env_ip or default_ip))

    parser.add_option("--port", action="store", type="int", dest="port",
                      help="Port of SUTAgent on device, defaults to "
                      "what's provided in $TEST_DEVICE or 20701",
                      default=(env_port or default_port))

    parser.add_option("--heartbeat", action="store", type="int",
                      dest="heartbeat_port", help="Port for heartbeat/data "
                      "channel, defaults to 20700", default=20700)

    parser.add_option("--script", action="append", type="string",
                      dest="scripts", help="Name of test script to run, "
                      "can be specified multiple times", default=[])

    parser.add_option("--directory", action="store", type="string", dest="dir",
                      help="Directory to look for tests in, defaults to "
                      "current directory", default=os.getcwd())

    parser.add_option("--testDevice", action="store_true", dest="isTestDevice",
                      help="Specifies that the device is a local test agent",
                      default=False)

    parser.add_option("-v", "--verbose", action="store_true", dest="verbose",
                      help="Verbose DeviceManager output", default=False)

    (options, args) = parser.parse_args()

    main(options.ip, options.port, options.heartbeat_port, options.scripts,
         options.dir, options.isTestDevice, options.verbose)
