You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
72 lines
2.2 KiB
72 lines
2.2 KiB
import os, random, subprocess, shlex, datetime, time, signal
|
|
from extra.hcqfuzz.tools import create_report, on_start_run, collect_tests, init_log, log
|
|
from extra.hcqfuzz.spec import AMSpec
|
|
|
|
def run_test(dev, test):
|
|
on_start_run(dev, test)
|
|
|
|
dev_env = dev.get_exec_state()
|
|
test_env, cmd, timeout = test.get_exec_state()
|
|
env = {**dev_env, **test_env}
|
|
|
|
if isinstance(cmd, str): cmd = shlex.split(cmd)
|
|
assert isinstance(cmd, list), "cmd must be list or str"
|
|
|
|
if env is None: env = os.environ.copy()
|
|
else:
|
|
env = {k: str(v) for k, v in env.items()}
|
|
env = {**os.environ, **env}
|
|
|
|
start_ts = datetime.datetime.now()
|
|
t0 = time.perf_counter()
|
|
log(f"[{start_ts:%Y-%m-%d %H:%M:%S}] running: {test.name()}: {' '.join(cmd)}", end="", flush=True)
|
|
|
|
proc = subprocess.Popen(cmd, env=env, stdout=subprocess.PIPE, stderr=subprocess.PIPE, text=True)
|
|
try:
|
|
stdout, stderr = proc.communicate(timeout=timeout)
|
|
ret = proc.returncode
|
|
except KeyboardInterrupt:
|
|
print("\nExiting...", flush=True)
|
|
proc.send_signal(signal.SIGINT)
|
|
try: stdout, stderr = proc.communicate(timeout=5)
|
|
except subprocess.TimeoutExpired:
|
|
proc.kill()
|
|
stdout, stderr = proc.communicate()
|
|
raise
|
|
except subprocess.TimeoutExpired:
|
|
cur_time = datetime.datetime.now()
|
|
log(f"\r[{cur_time:%Y-%m-%d %H:%M:%S}] {test.name()} send SIGKILL", end="", flush=True)
|
|
|
|
proc.kill()
|
|
stdout, stderr = proc.communicate()
|
|
ret = -9
|
|
|
|
finish_time = datetime.datetime.now()
|
|
elapsed = time.perf_counter() - t0
|
|
if ret != 0:
|
|
log(f"\r[{finish_time:%Y-%m-%d %H:%M:%S}] {test.name()} failed with {ret} after {elapsed:.1f}s", flush=True)
|
|
create_report(dev, test, ret, stdout, stderr)
|
|
else:
|
|
log(f"\r[{finish_time:%Y-%m-%d %H:%M:%S}] {test.name()} exited {ret} after {elapsed:.1f}s", flush=True)
|
|
|
|
if __name__ == "__main__":
|
|
init_log()
|
|
device_name = "AM"
|
|
dev = AMSpec()
|
|
|
|
start_seed = os.environ.get("SEED", 3332)
|
|
random.seed(start_seed)
|
|
|
|
log(f"Starting with seed {start_seed}")
|
|
|
|
test_set = collect_tests()
|
|
log(f"Found {len(test_set)} tests:")
|
|
for test in test_set: log(f" - {test.name()}")
|
|
|
|
while True:
|
|
seed = random.randint(0, 2**31)
|
|
test = random.choice(test_set)
|
|
|
|
dev.prepare(seed)
|
|
test.prepare(dev, seed)
|
|
run_test(dev, test)
|
|
|