#!/usr/bin/env python2
import argparse
import sys
import os
import nose2
import multiprocessing

from infra.basetest import BRTest

def main():
    parser = argparse.ArgumentParser(description='Run Buildroot tests')
    parser.add_argument('testname', nargs='*',
                        help='list of test cases to execute')
    parser.add_argument('-l', '--list', action='store_true',
                        help='list of available test cases')
    parser.add_argument('-a', '--all', action='store_true',
                        help='execute all test cases')
    parser.add_argument('-s', '--stdout', action='store_true',
                        help='log everything to stdout')
    parser.add_argument('-o', '--output',
                        help='output directory')
    parser.add_argument('-d', '--download',
                        help='download directory')
    parser.add_argument('-k', '--keep',
                        help='keep build directories',
                        action='store_true')
    parser.add_argument('-t', '--testcases', type=int, default=1,
                        help='number of testcases to run simultaneously')
    parser.add_argument('-j', '--jlevel', type=int,
                        help='BR2_JLEVEL to use for each testcase')
    parser.add_argument('--timeout-multiplier', type=int, default=1,
                        help='increase timeouts (useful for slow machines)')

    args = parser.parse_args()

    script_path = os.path.realpath(__file__)
    test_dir = os.path.dirname(script_path)

    if args.stdout:
        BRTest.logtofile = False

    if args.list:
        print "List of tests"
        nose2.discover(argv=[script_path,
                             "-s", test_dir,
                             "-v",
                             "--collect-only"],
                       plugins=["nose2.plugins.collect"])
        return 0

    if args.download is None:
        args.download = os.getenv("BR2_DL_DIR")
        if args.download is None:
            print "Missing download directory, please use -d/--download"
            print ""
            parser.print_help()
            return 1

    BRTest.downloaddir = os.path.abspath(args.download)

    if args.output is None:
        print "Missing output directory, please use -o/--output"
        print ""
        parser.print_help()
        return 1

    if not os.path.exists(args.output):
        os.mkdir(args.output)

    BRTest.outputdir = os.path.abspath(args.output)

    if args.all is False and len(args.testname) == 0:
        print "No test selected"
        print ""
        parser.print_help()
        return 1

    BRTest.keepbuilds = args.keep

    if args.testcases != 1:
        if args.testcases < 1:
            print "Invalid number of testcases to run simultaneously"
            print ""
            parser.print_help()
            return 1
        # same default BR2_JLEVEL as package/Makefile.in
        br2_jlevel = 1 + multiprocessing.cpu_count()
        each_testcase = br2_jlevel / args.testcases
        if each_testcase < 1:
            each_testcase = 1
        BRTest.jlevel = each_testcase

    if args.jlevel:
        if args.jlevel < 0:
            print "Invalid BR2_JLEVEL to use for each testcase"
            print ""
            parser.print_help()
            return 1
        # the user can override the auto calculated value
        BRTest.jlevel = args.jlevel

    if args.timeout_multiplier < 1:
        print "Invalid multiplier for timeout values"
        print ""
        parser.print_help()
        return 1
    BRTest.timeout_multiplier = args.timeout_multiplier

    nose2_args = ["-v",
                  "-N", str(args.testcases),
                  "-s", "support/testing",
                  "-c", "support/testing/conf/unittest.cfg"]

    if len(args.testname) != 0:
        nose2_args += args.testname

    nose2.discover(argv=nose2_args)

if __name__ == "__main__":
    sys.exit(main())
