mirror of https://github.com/krallin/tini.git
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.
96 lines
2.9 KiB
96 lines
2.9 KiB
#coding:utf-8 |
|
import os |
|
import sys |
|
import time |
|
import pipes |
|
import subprocess |
|
import threading |
|
|
|
|
|
class Command(object): |
|
def __init__(self, cmd, fail_cmd, post_cmd=None, post_delay=0): |
|
self.cmd = cmd |
|
self.fail_cmd = fail_cmd |
|
self.post_cmd = post_cmd |
|
self.post_delay = post_delay |
|
self.proc = None |
|
|
|
def run(self, timeout=None, retcode=0): |
|
print "Testing '{0}'...".format(" ".join(pipes.quote(s) for s in self.cmd)), |
|
sys.stdout.flush() |
|
|
|
err = None |
|
pipe_kwargs = {"stdout": subprocess.PIPE, "stderr": subprocess.PIPE, "stdin": subprocess.PIPE} |
|
|
|
def target(): |
|
self.proc = subprocess.Popen(self.cmd, **pipe_kwargs) |
|
self.stdout, self.stderr = self.proc.communicate() |
|
|
|
thread = threading.Thread(target=target) |
|
thread.start() |
|
|
|
if self.post_cmd is not None: |
|
time.sleep(self.post_delay) |
|
subprocess.check_call(self.post_cmd, **pipe_kwargs) |
|
|
|
thread.join(timeout - self.post_delay if timeout is not None else timeout) |
|
|
|
# Checks |
|
if thread.is_alive(): |
|
subprocess.check_call(self.fail_cmd, **pipe_kwargs) |
|
err = Exception("Test failed with timeout!") |
|
|
|
elif self.proc.returncode != retcode: |
|
err = Exception("Test failed with unexpected returncode (expected {0}, got {1})".format(retcode, self.proc.returncode)) |
|
|
|
if err is not None: |
|
print "FAIL" |
|
print "--- STDOUT ---" |
|
print self.stdout |
|
print "--- STDERR ---" |
|
print self.stderr |
|
print "--- ... ---" |
|
raise err |
|
else: |
|
print "OK" |
|
|
|
|
|
if __name__ == "__main__": |
|
img = sys.argv[1] |
|
name = "{0}-test".format(img) |
|
|
|
root = os.path.abspath(os.path.join(os.path.dirname(__file__), "..")) |
|
|
|
for entrypoint in ["/tini/dist/tini"]: |
|
base_cmd = [ |
|
"docker", |
|
"run", |
|
"--rm", |
|
"--volume={0}:/tini".format(root), |
|
"--name={0}".format(name), |
|
"--entrypoint={0}".format(entrypoint), |
|
img, |
|
"-vvvv", |
|
] |
|
|
|
fail_cmd = ["docker", "kill", name] |
|
|
|
# Reaping test |
|
Command(base_cmd + ["/tini/test/reaping/stage_1.py"], fail_cmd).run(timeout=10) |
|
|
|
# Signals test |
|
for sig, retcode in [("INT", 1), ("TERM", 143)]: |
|
Command( |
|
base_cmd + ["--", "/tini/test/signals/test.py"], |
|
fail_cmd, |
|
["docker", "kill", "-s", sig, name], |
|
2 |
|
).run(timeout=10, retcode=retcode) |
|
|
|
# Exit code test |
|
Command(base_cmd + ["-z"], fail_cmd).run(retcode=1) |
|
Command(base_cmd + ["--", "zzzz"], fail_cmd).run(retcode=1) |
|
Command(base_cmd + ["-h"], fail_cmd).run(retcode=0) |
|
|
|
# Valgrind test |
|
Command(base_cmd + ["--", "valgrind", "--leak-check=full", "--error-exitcode=1", entrypoint, "-v", "--", "ls"], fail_cmd).run()
|
|
|