ptest.py 2.2 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879
  1. #!/usr/bin/env python3
  2. import subprocess
  3. import time
  4. import sys
  5. def next_test(tests, ports):
  6. if len(tests) == 0 or len(ports) == 0:
  7. return
  8. test = tests.pop()
  9. proc_ports = ()
  10. if len(ports) < test[0]:
  11. tests.insert(0, test)
  12. return None
  13. else:
  14. if isinstance(test[1], (list,)):
  15. args = test[1]
  16. else:
  17. args = [test[1]]
  18. for i in range(0, test[0]):
  19. proc_port = ports.pop()
  20. proc_ports = proc_ports + (proc_port,)
  21. args.append(str(proc_port))
  22. proc = subprocess.Popen(args)
  23. proc.start_time = time.time()
  24. proc.mosq_port = proc_ports
  25. return proc
  26. def run_tests(tests, minport=1888, max_running=20):
  27. ports = list(range(minport, minport+max_running+1))
  28. start_time = time.time()
  29. passed = 0
  30. failed = 0
  31. failed_tests = []
  32. running_tests = []
  33. while len(tests) > 0 or len(running_tests) > 0:
  34. if len(running_tests) <= max_running:
  35. t = next_test(tests, ports)
  36. if t is None:
  37. time.sleep(0.1)
  38. else:
  39. running_tests.append(t)
  40. for t in running_tests:
  41. t.poll()
  42. if t.returncode is not None:
  43. running_tests.remove(t)
  44. if isinstance(t.mosq_port, tuple):
  45. for portret in t.mosq_port:
  46. ports.append(portret)
  47. else:
  48. ports.append(t.mosq_port)
  49. t.terminate()
  50. t.wait()
  51. runtime = time.time() - t.start_time
  52. #(stdo, stde) = t.communicate()
  53. if t.returncode == 1:
  54. print("%0.3fs : \033[31m%s\033[0m" % (runtime, t.args[0]))
  55. failed = failed + 1
  56. failed_tests.append(t.args[0])
  57. else:
  58. passed = passed + 1
  59. print("%0.3fs : \033[32m%s\033[0m" % (runtime, t.args[0]))
  60. print("Passed: %d\nFailed: %d\nTotal: %d\nTotal time: %0.2f" % (passed, failed, passed+failed, time.time()-start_time))
  61. if failed > 0:
  62. print("Failing tests:")
  63. failed_tests.sort()
  64. for f in failed_tests:
  65. print(f)
  66. sys.exit(1)