#!/usr/bin/env python3 import argparse import multiprocessing import os import sys import nose2 from infra.basetest import BRConfigTest import infra 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('-p', '--prepare-only', action='store_true', help='download emulator builtin binaries') 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.prepare_only: emulator_builtin_binaries = ["kernel-vexpress-5.10.7", "vexpress-v2p-ca9-5.10.7.dtb", "kernel-versatile-5.10.7", "versatile-pb-5.10.7.dtb"] print("Downloading emulator builtin binaries") for binary in emulator_builtin_binaries: infra.download(BRConfigTest.downloaddir, binary) return 0 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 = int((br2_jlevel + args.testcases) / args.testcases) 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())