/scripts/smoke_test.py

https://github.com/piqueserver/piqueserver · Python · 87 lines · 59 code · 14 blank · 14 comment · 9 complexity · c58cb7c451829f8341e87ab335a53e59 MD5 · raw file

  1. #!/usr/bin/python3
  2. """
  3. usage: smoke_test.py [-h] [--timeout TIMEOUT] [--config-dir CONFIG_DIR]
  4. Basic smoke test for pique
  5. optional arguments:
  6. -h, --help show this help message and exit
  7. --timeout TIMEOUT, -t TIMEOUT
  8. Timeout for killing the proc
  9. --config-dir CONFIG_DIR, -d CONFIG_DIR
  10. Pique config dir
  11. """
  12. import asyncio
  13. import sys
  14. import argparse
  15. def printer(buffer, prefix):
  16. def p(data):
  17. buffer.write(prefix + data)
  18. buffer.flush()
  19. return p
  20. stdoutprinter = printer(sys.stdout.buffer, b"[STDOUT]: ")
  21. stderrprinter = printer(sys.stderr.buffer, b"[STDERR]: ")
  22. async def _read_stream(stream, cb):
  23. while True:
  24. line = await stream.readline()
  25. if line:
  26. cb(line)
  27. else:
  28. break
  29. async def smoketest(config_dir: str, timeout: int):
  30. cmd = "piqueserver -d {}".format(config_dir)
  31. proc = await asyncio.create_subprocess_exec(
  32. "piqueserver",
  33. "-d",
  34. config_dir,
  35. stdout=asyncio.subprocess.PIPE,
  36. stderr=asyncio.subprocess.PIPE)
  37. print("Running \"{}\" (pid: {}) with timeout {} seconds.".format(
  38. cmd, proc.pid, timeout))
  39. print("-" * 10, "Output start", "-" * 10)
  40. asyncio.ensure_future(_read_stream(proc.stdout, stdoutprinter))
  41. asyncio.ensure_future(_read_stream(proc.stderr, stderrprinter))
  42. try:
  43. await asyncio.wait_for(proc.wait(), timeout=timeout)
  44. except asyncio.TimeoutError:
  45. pass
  46. print("-" * 10, "Output end", "-" * 10)
  47. return proc
  48. def main():
  49. parser = argparse.ArgumentParser(description="Basic smoke test for pique")
  50. parser.add_argument("--timeout", "-t", type=int,
  51. default=45, help='Timeout for killing the proc')
  52. parser.add_argument(
  53. "--config-dir",
  54. "-d",
  55. type=str,
  56. default="./piqueserver/config",
  57. help='Pique config dir')
  58. options = parser.parse_args()
  59. loop = asyncio.get_event_loop()
  60. proc = loop.run_until_complete(
  61. smoketest(options.config_dir, options.timeout))
  62. loop.close()
  63. if proc.returncode is None:
  64. print("Smoke test passed.")
  65. proc.kill()
  66. else:
  67. print("Smoke test failed. Exit code: ", proc.returncode)
  68. sys.exit(proc.returncode or 0)
  69. if __name__ == "__main__":
  70. main()