#!/usr/bin/python2 -u
#
# autotest <control file> - run the autotest control file specified.
#
from __future__ import absolute_import
from __future__ import division
from __future__ import print_function
import os, sys
import common
from optparse import OptionParser
from autotest_lib.client.bin import job
from autotest_lib.client.common_lib import global_config


# Use the name of the binary to find the real installation directory
# aka $AUTODIR.  Update our path to include the $AUTODIR/bin/tests
# directory and ensure we have $AUTODIR in our environment.
autodirbin = os.path.dirname(os.path.realpath(sys.argv[0]))
autodir = os.path.dirname(autodirbin)

sys.path.insert(0, autodirbin)

os.environ['AUTODIR'] = autodir
os.environ['AUTODIRBIN'] = autodirbin
os.environ['PYTHONPATH'] = autodirbin

parser = OptionParser(usage='Usage: %prog [options] <control-file>')

parser.add_option("-a", "--args", dest='args',
                        help="additional args to pass to control file")

parser.add_option("-c", "--continue", dest="cont", action="store_true",
                        default=False, help="continue previously started job")

parser.add_option("-t", "--tag", dest="tag", type="string", default="default",
                        help="set the job tag")

parser.add_option("-H", "--harness", dest="harness", type="string", default='',
                        help="set the harness type")

parser.add_option("-P", "--harness_args", dest="harness_args", type="string", default='',
                        help="arguments delivered to harness")

parser.add_option("-U", "--user", dest="user", type="string",
                        default='', help="set the job username")

parser.add_option("-l", "--external_logging", dest="log", action="store_true",
                        default=False, help="enable external logging")

parser.add_option('--verbose', dest='verbose', action='store_true',
                  help='Include DEBUG messages in console output')

parser.add_option('--quiet', dest='verbose', action='store_false',
                  help='Not include DEBUG messages in console output')

parser.add_option('--hostname', dest='hostname', type='string',
                  default=None, action='store',
                  help='Take this as the hostname of this machine '
                       '(given by autoserv)')

parser.add_option('--output_dir', dest='output_dir',
                  type='string', default="", action='store',
                  help='Specify an alternate path to store test result logs')

parser.add_option('--client_test_setup', dest='client_test_setup',
                  type='string', default=None, action='store',
                  help='a comma seperated list of client tests to prebuild on '
                       'the server. Use all to prebuild all of them.')

parser.add_option('--tap', dest='tap_report', action='store_true',
                  default=None, help='Deprecated, do not use.')

def usage():
    parser.print_help()
    sys.exit(1)

options, args = parser.parse_args()

# Check for a control file if not in prebuild mode.
if len(args) != 1 and options.client_test_setup is None:
    print("Missing control file!")
    usage()

drop_caches = global_config.global_config.get_config_value('CLIENT',
                                                           'drop_caches',
                                                           type=bool,
                                                           default=True)

if options.client_test_setup:
    from autotest_lib.client.bin import setup_job
    exit_code = 0
    try:
        setup_job.setup_tests(options)
    except:
        exit_code = 1
    sys.exit(exit_code)

# JOB: run the specified job control file.
job.runjob(os.path.realpath(args[0]), drop_caches, options)
