#!/usr/bin/env python3 import subprocess import time import sys def next_test(tests, ports): if len(tests) == 0 or len(ports) == 0: return test = tests.pop() proc_ports = () if len(ports) < test[0]: tests.insert(0, test) return None else: if isinstance(test[1], (list,)): args = test[1] else: args = [test[1]] for i in range(0, test[0]): proc_port = ports.pop() proc_ports = proc_ports + (proc_port,) args.append(str(proc_port)) proc = subprocess.Popen(args) proc.start_time = time.time() proc.mosq_port = proc_ports return proc def run_tests(tests, minport=1888, max_running=20): ports = list(range(minport, minport+max_running+1)) start_time = time.time() passed = 0 failed = 0 failed_tests = [] running_tests = [] while len(tests) > 0 or len(running_tests) > 0: if len(running_tests) <= max_running: t = next_test(tests, ports) if t is None: time.sleep(0.1) else: running_tests.append(t) for t in running_tests: t.poll() if t.returncode is not None: running_tests.remove(t) if isinstance(t.mosq_port, tuple): for portret in t.mosq_port: ports.append(portret) else: ports.append(t.mosq_port) t.terminate() t.wait() runtime = time.time() - t.start_time #(stdo, stde) = t.communicate() if t.returncode == 1: print("%0.3fs : \033[31m%s\033[0m" % (runtime, t.args[0])) failed = failed + 1 failed_tests.append(t.args[0]) else: passed = passed + 1 print("%0.3fs : \033[32m%s\033[0m" % (runtime, t.args[0])) print("Passed: %d\nFailed: %d\nTotal: %d\nTotal time: %0.2f" % (passed, failed, passed+failed, time.time()-start_time)) if failed > 0: print("Failing tests:") for f in failed_tests: print(f) sys.exit(1)