cb9cc66b35
With -S option we will run tests in random order. Signed-off-by: Janusz Dziedzic <janusz.dziedzic@gmail.com>
408 lines
14 KiB
Python
Executable file
408 lines
14 KiB
Python
Executable file
#!/usr/bin/env python3
|
|
#
|
|
# Remote test case executor
|
|
# Copyright (c) 2016, Tieto Corporation
|
|
#
|
|
# This software may be distributed under the terms of the BSD license.
|
|
# See README for more details.
|
|
|
|
import os
|
|
import re
|
|
import sys
|
|
import time
|
|
import traceback
|
|
import getopt
|
|
from datetime import datetime
|
|
from random import shuffle
|
|
|
|
import logging
|
|
logger = logging.getLogger()
|
|
|
|
scriptsdir = os.path.dirname(os.path.realpath(sys.modules[__name__].__file__))
|
|
sys.path.append(os.path.join(scriptsdir, '..', '..', 'wpaspy'))
|
|
sys.path.append(os.path.join(scriptsdir, '..', 'hwsim'))
|
|
|
|
import wpaspy
|
|
import config
|
|
from test_devices import show_devices
|
|
from test_devices import check_devices
|
|
from rutils import TestSkip
|
|
from utils import HwsimSkip
|
|
from hwsim_wrapper import run_hwsim_test
|
|
|
|
def usage():
|
|
print("USAGE: " + sys.argv[0] + " -t devices")
|
|
print("USAGE: " + sys.argv[0] + " -t check_devices")
|
|
print("USAGE: " + sys.argv[0] + " -d <dut_name> -t <all|sanity|tests_to_run> [-r <ref_name>] [-c <cfg_file.py>] [-m <all|monitor_name>] [-h hwsim_tests] [-f hwsim_modules][-R][-T][-P][-S][-v]")
|
|
print("USAGE: " + sys.argv[0])
|
|
|
|
def get_devices(devices, duts, refs, monitors):
|
|
for dut in duts:
|
|
config.get_device(devices, dut, lock=True)
|
|
for ref in refs:
|
|
config.get_device(devices, ref, lock=True)
|
|
for monitor in monitors:
|
|
if monitor == "all":
|
|
continue
|
|
if monitor in duts:
|
|
continue
|
|
if monitor in refs:
|
|
continue
|
|
config.get_device(devices, monitor, lock=True)
|
|
|
|
def put_devices(devices, duts, refs, monitors):
|
|
for dut in duts:
|
|
config.put_device(devices, dut)
|
|
for ref in refs:
|
|
config.put_device(devices, ref)
|
|
for monitor in monitors:
|
|
if monitor == "all":
|
|
continue
|
|
if monitor in duts:
|
|
continue
|
|
if monitor in refs:
|
|
continue
|
|
config.put_device(devices, monitor)
|
|
|
|
def main():
|
|
duts = []
|
|
refs = []
|
|
monitors = []
|
|
filter_keys = []
|
|
requested_tests = ["help"]
|
|
requested_hwsim_tests = []
|
|
hwsim_tests = []
|
|
requested_modules = []
|
|
modules_tests = []
|
|
cfg_file = "cfg.py"
|
|
log_dir = "./logs/"
|
|
verbose = False
|
|
trace = False
|
|
restart = False
|
|
perf = False
|
|
shuffle_tests = False
|
|
|
|
# parse input parameters
|
|
try:
|
|
opts, args = getopt.getopt(sys.argv[1:], "d:f:r:t:l:k:c:m:h:vRPTS",
|
|
["dut=", "modules=", "ref=", "tests=",
|
|
"log-dir=",
|
|
"cfg=", "key=", "monitor=", "hwsim="])
|
|
except getopt.GetoptError as err:
|
|
print(err)
|
|
usage()
|
|
sys.exit(2)
|
|
|
|
for option, argument in opts:
|
|
if option == "-v":
|
|
verbose = True
|
|
elif option == "-R":
|
|
restart = True
|
|
elif option == "-T":
|
|
trace = True
|
|
elif option == "-P":
|
|
perf = True
|
|
elif option == "-S":
|
|
shuffle_tests = True
|
|
elif option in ("-d", "--dut"):
|
|
duts.append(argument)
|
|
elif option in ("-r", "--ref"):
|
|
refs.append(argument)
|
|
elif option in ("-t", "--tests"):
|
|
requested_tests = re.split('; | |, ', argument)
|
|
elif option in ("-l", "--log-dir"):
|
|
log_dir = argument
|
|
elif option in ("-k", "--key"):
|
|
filter_keys.append(argument)
|
|
elif option in ("-m", "--monitor"):
|
|
monitors.append(argument)
|
|
elif option in ("-c", "--cfg"):
|
|
cfg_file = argument
|
|
elif option in ("-h", "--hwsim"):
|
|
requested_hwsim_tests = re.split('; | |, ', argument)
|
|
elif option in ("-f", "--modules"):
|
|
requested_modules = re.split('; | |, ', argument)
|
|
else:
|
|
assert False, "unhandled option"
|
|
|
|
# get env configuration
|
|
setup_params = config.get_setup_params(cfg_file)
|
|
devices = config.get_devices(cfg_file)
|
|
|
|
# put logs in log_dir
|
|
symlink = os.path.join(log_dir, "current");
|
|
if os.path.exists(symlink):
|
|
os.unlink(symlink)
|
|
log_dir = os.path.join(log_dir, time.strftime("%Y_%m_%d_%H_%M_%S"))
|
|
if not os.path.exists(log_dir):
|
|
os.makedirs(log_dir)
|
|
os.symlink(os.path.join("../", log_dir), symlink)
|
|
|
|
# setup restart/trace/perf request
|
|
setup_params['local_log_dir'] = log_dir
|
|
setup_params['restart_device'] = restart
|
|
setup_params['trace'] = trace
|
|
setup_params['perf'] = perf
|
|
|
|
# configure logger
|
|
logger.setLevel(logging.DEBUG)
|
|
|
|
stdout_handler = logging.StreamHandler()
|
|
stdout_handler.setLevel(logging.WARNING)
|
|
if verbose:
|
|
stdout_handler.setLevel(logging.DEBUG)
|
|
logger.addHandler(stdout_handler)
|
|
|
|
formatter = logging.Formatter('%(asctime)s - %(message)s')
|
|
file_name = os.path.join(log_dir, 'run-tests.log')
|
|
log_handler = logging.FileHandler(file_name)
|
|
log_handler.setLevel(logging.DEBUG)
|
|
log_handler.setFormatter(formatter)
|
|
logger.addHandler(log_handler)
|
|
|
|
# import available tests
|
|
tests = []
|
|
failed = []
|
|
test_modules = []
|
|
files = os.listdir(scriptsdir)
|
|
for t in files:
|
|
m = re.match(r'(test_.*)\.py$', t)
|
|
if m:
|
|
mod = __import__(m.group(1))
|
|
test_modules.append(mod.__name__.replace('test_', '', 1))
|
|
for key, val in mod.__dict__.items():
|
|
if key.startswith("test_"):
|
|
tests.append(val)
|
|
test_names = list(set([t.__name__.replace('test_', '', 1) for t in tests]))
|
|
|
|
# import test_*
|
|
files = os.listdir("../hwsim/")
|
|
for t in files:
|
|
m = re.match(r'(test_.*)\.py$', t)
|
|
if m:
|
|
mod = __import__(m.group(1))
|
|
test_modules.append(mod.__name__.replace('test_', '', 1))
|
|
for key, val in mod.__dict__.items():
|
|
if key.startswith("test_"):
|
|
hwsim_tests.append(val)
|
|
|
|
# setup hwsim tests
|
|
hwsim_tests_to_run = []
|
|
if len(requested_hwsim_tests) > 0:
|
|
# apply filters
|
|
for filter_key in filter_keys:
|
|
filtered_tests = []
|
|
for hwsim_test in hwsim_tests:
|
|
if re.search(filter_key, hwsim_test.__name__):
|
|
filtered_tests.append(hwsim_test)
|
|
hwsim_tests = filtered_tests
|
|
|
|
# setup hwsim_test we should run
|
|
if requested_hwsim_tests[0] == "all":
|
|
hwsim_tests_to_run = hwsim_tests
|
|
elif requested_hwsim_tests[0] == "remote":
|
|
hwsim_tests_to_run = [t for t in hwsim_tests
|
|
if hasattr(t, "remote_compatible") and
|
|
t.remote_compatible]
|
|
else:
|
|
for test in requested_hwsim_tests:
|
|
t = None
|
|
for tt in hwsim_tests:
|
|
name = tt.__name__.replace('test_', '', 1)
|
|
if name == test:
|
|
t = tt
|
|
break
|
|
if not t:
|
|
logger.warning("hwsim test case: " + test + " NOT-FOUND")
|
|
continue
|
|
hwsim_tests_to_run.append(t)
|
|
|
|
# import test_* from modules
|
|
files = os.listdir("../hwsim/")
|
|
for t in files:
|
|
m = re.match(r'(test_.*)\.py$', t)
|
|
if m:
|
|
mod = __import__(m.group(1))
|
|
if mod.__name__.replace('test_', '', 1) not in requested_modules:
|
|
continue
|
|
for key, val in mod.__dict__.items():
|
|
if key.startswith("test_"):
|
|
modules_tests.append(val)
|
|
|
|
if len(requested_modules) > 0:
|
|
requested_hwsim_tests = modules_tests
|
|
hwsim_tests_to_run = modules_tests
|
|
|
|
# sort the list
|
|
test_names.sort()
|
|
tests.sort(key=lambda t: t.__name__)
|
|
|
|
# print help
|
|
if requested_tests[0] == "help" and len(requested_hwsim_tests) == 0:
|
|
usage()
|
|
print("\nAvailable Devices:")
|
|
for device in devices:
|
|
print("\t", device['name'])
|
|
print("\nAvailable tests:")
|
|
for test in test_names:
|
|
print("\t", test)
|
|
print("\nAvailable hwsim tests:")
|
|
for hwsim_test in hwsim_tests:
|
|
print("\t", hwsim_test.__name__.replace('test_', '', 1))
|
|
return
|
|
|
|
# show/check devices
|
|
if requested_tests[0] == "devices":
|
|
show_devices(devices, setup_params)
|
|
return
|
|
|
|
# apply filters
|
|
for filter_key in filter_keys:
|
|
filtered_tests = []
|
|
for test in tests:
|
|
if re.search(filter_key, test.__name__):
|
|
filtered_tests.append(test)
|
|
tests = filtered_tests
|
|
|
|
# setup test we should run
|
|
tests_to_run = []
|
|
if requested_tests[0] == "all":
|
|
tests_to_run = tests
|
|
if requested_tests[0] == "help":
|
|
pass
|
|
elif requested_tests[0] == "sanity":
|
|
for test in tests:
|
|
if test.__name__.startswith("test_sanity_"):
|
|
tests_to_run.append(test)
|
|
else:
|
|
for test in requested_tests:
|
|
t = None
|
|
for tt in tests:
|
|
name = tt.__name__.replace('test_', '', 1)
|
|
if name == test:
|
|
t = tt
|
|
break
|
|
if not t:
|
|
logger.warning("test case: " + test + " NOT-FOUND")
|
|
continue
|
|
tests_to_run.append(t)
|
|
|
|
if shuffle_tests:
|
|
shuffle(tests_to_run)
|
|
shuffle(hwsim_tests_to_run)
|
|
|
|
# lock devices
|
|
try:
|
|
get_devices(devices, duts, refs, monitors)
|
|
except Exception as e:
|
|
logger.warning("get devices failed: " + str(e))
|
|
logger.info(traceback.format_exc())
|
|
put_devices(devices, duts, refs, monitors)
|
|
return
|
|
except:
|
|
logger.warning("get devices failed")
|
|
logger.info(traceback.format_exc())
|
|
put_devices(devices, duts, refs, monitors)
|
|
return
|
|
|
|
# now run test cases
|
|
for dut in duts:
|
|
if len(requested_hwsim_tests) > 0:
|
|
logger.warning("DUT (apdev): " + str(dut))
|
|
else:
|
|
logger.warning("DUT: " + str(dut))
|
|
for ref in refs:
|
|
if len(requested_hwsim_tests) > 0:
|
|
logger.warning("REF (dev): " + str(ref))
|
|
else:
|
|
logger.warning("REF: " + str(ref))
|
|
for monitor in monitors:
|
|
logger.warning("MON: " + str(monitor))
|
|
|
|
# run check_devices at beginning
|
|
logger.warning("RUN check_devices")
|
|
try:
|
|
check_devices(devices, setup_params, refs, duts, monitors)
|
|
except Exception as e:
|
|
logger.warning("FAILED: " + str(e))
|
|
logger.info(traceback.format_exc())
|
|
put_devices(devices, duts, refs, monitors)
|
|
return
|
|
except:
|
|
logger.warning("FAILED")
|
|
logger.info(traceback.format_exc())
|
|
put_devices(devices, duts, refs, monitors)
|
|
return
|
|
logger.warning("PASS")
|
|
|
|
test_no = 1
|
|
for test in tests_to_run:
|
|
try:
|
|
start = datetime.now()
|
|
setup_params['tc_name'] = test.__name__.replace('test_', '', 1)
|
|
logger.warning("START - " + setup_params['tc_name'] + " (" + str(test_no) + "/" + str(len(tests_to_run)) + ")")
|
|
if test.__doc__:
|
|
logger.info("Test: " + test.__doc__)
|
|
|
|
# run tc
|
|
res = test(devices, setup_params, refs, duts, monitors)
|
|
|
|
end = datetime.now()
|
|
logger.warning("PASS (" + res + ") - " + str((end - start).total_seconds()) + "s")
|
|
except KeyboardInterrupt:
|
|
put_devices(devices, duts, refs, monitors)
|
|
raise
|
|
except TestSkip as e:
|
|
end = datetime.now()
|
|
logger.warning("SKIP (" + str(e) + ") - " + str((end - start).total_seconds()) + "s")
|
|
except Exception as e:
|
|
end = datetime.now()
|
|
logger.warning("FAILED (" + str(e) + ") - " + str((end - start).total_seconds()) + "s")
|
|
logger.info(traceback.format_exc())
|
|
failed.append(test.__name__.replace('test_', '', 1))
|
|
except:
|
|
end = datetime.now()
|
|
logger.warning("FAILED - " + str((end - start).total_seconds()) + "s")
|
|
logger.info(traceback.format_exc())
|
|
failed.append(test.__name__.replace('test_', '', 1))
|
|
test_no += 1
|
|
|
|
test_no = 1
|
|
for hwsim_test in hwsim_tests_to_run:
|
|
try:
|
|
start = datetime.now()
|
|
setup_params['tc_name'] = hwsim_test.__name__.replace('test_', '', 1)
|
|
logger.warning("START - " + setup_params['tc_name'] + " (" + str(test_no) + "/" + str(len(hwsim_tests_to_run)) + ")")
|
|
res = run_hwsim_test(devices, setup_params, refs, duts, monitors, hwsim_test)
|
|
end = datetime.now()
|
|
logger.warning("PASS (" + res + ") - " + str((end - start).total_seconds()) + "s")
|
|
except KeyboardInterrupt:
|
|
put_devices(devices, duts, refs, monitors)
|
|
raise
|
|
except HwsimSkip as e:
|
|
end = datetime.now()
|
|
logger.warning("SKIP (" + str(e) + ") - " + str((end - start).total_seconds()) + "s")
|
|
failed.append(hwsim_test.__name__.replace('test_', '', 1))
|
|
except Exception as e:
|
|
end = datetime.now()
|
|
logger.warning("FAILED (" + str(e) + ") - " + str((end - start).total_seconds()) + "s")
|
|
logger.info(traceback.format_exc())
|
|
failed.append(hwsim_test.__name__.replace('test_', '', 1))
|
|
except:
|
|
end = datetime.now()
|
|
logger.warning("FAILED - " + str((end - start).total_seconds()) + "s")
|
|
logger.info(traceback.format_exc())
|
|
failed.append(hwsim_test.__name__.replace('test_', '', 1))
|
|
test_no += 1
|
|
|
|
# unlock devices
|
|
put_devices(devices, duts, refs, monitors)
|
|
|
|
if len(failed) > 0:
|
|
logger.warning("Failed test cases:")
|
|
for test in failed:
|
|
logger.warning("\t" + test)
|
|
|
|
|
|
if __name__ == "__main__":
|
|
main()
|