#!/usr/bin/env python3
import argparse
import multiprocessing
import os
import sys

import nose2

from infra.basetest import BRConfigTest


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:
        BRConfigTest.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

    BRConfigTest.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)

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

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

    BRConfigTest.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
        BRConfigTest.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
        BRConfigTest.jlevel = args.jlevel

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

    nose2_args = ["-v",
                  "-N", str(args.testcases),
                  "-s", test_dir,
                  "-c", os.path.join(test_dir, "conf/unittest.cfg")]

    if args.testname:
        nose2_args += args.testname

    nose2.discover(argv=nose2_args)


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