From: Christian Brauner Date: Wed, 6 Dec 2017 14:56:35 +0000 (+0100) Subject: tests: expand tests for shortlived init processes X-Git-Tag: lxc-2.0.10~506 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=e3557539ad8d58bdd0db4acd7854222ae4118caa;p=thirdparty%2Flxc.git tests: expand tests for shortlived init processes This adds additional test for app containers. Signed-off-by: Christian Brauner --- diff --git a/src/tests/shortlived.c b/src/tests/shortlived.c index 6472ce7e0..a7a601827 100644 --- a/src/tests/shortlived.c +++ b/src/tests/shortlived.c @@ -28,6 +28,9 @@ #include #include +#include "lxctest.h" +#include "utils.h" + #define MYNAME "shortlived" static int destroy_container(void) @@ -92,12 +95,33 @@ again: int main(int argc, char *argv[]) { - struct lxc_container *c; + int i; const char *s; bool b; - int i; + struct lxc_container *c; + struct lxc_log log; + char template[sizeof(P_tmpdir"/shortlived_XXXXXX")]; int ret = 0; + strcpy(template, P_tmpdir"/shortlived_XXXXXX"); + i = lxc_make_tmpfile(template, false); + if (i < 0) { + lxc_error("Failed to create temporary log file for container %s\n", MYNAME); + exit(EXIT_FAILURE); + } else { + lxc_debug("Using \"%s\" as temporary log file for container %s\n", template, MYNAME); + close(i); + } + + log.name = MYNAME; + log.file = template; + log.level = "TRACE"; + log.prefix = "shortlived"; + log.quiet = false; + log.lxcpath = NULL; + if (lxc_log_init(&log)) + exit(EXIT_FAILURE); + ret = 1; /* test a real container */ c = lxc_container_new(MYNAME, NULL); @@ -143,14 +167,44 @@ int main(int argc, char *argv[]) c->want_daemonize(c, true); - /* Test whether we can start a really short-lived daemonized container. - */ + /* Test whether we can start a really short-lived daemonized container. */ for (i = 0; i < 10; i++) { if (!c->startl(c, 0, NULL)) { - fprintf(stderr, "%d: %s failed to start\n", __LINE__, c->name); + fprintf(stderr, "%d: %s failed to start on %dth iteration\n", __LINE__, c->name, i); + goto out; + } + + /* The container needs to exit with a successful error code. */ + if (c->error_num != 0) { + fprintf(stderr, "%d: %s exited successfully on %dth iteration\n", __LINE__, c->name, i); + goto out; + } + fprintf(stderr, "%d: %s exited correctly with error code %d on %dth iteration\n", __LINE__, c->name, c->error_num, i); + + if (!c->wait(c, "STOPPED", 30)) { + fprintf(stderr, "%d: %s failed to wait on %dth iteration\n", __LINE__, c->name, i); + goto out; + } + } + + /* Test whether we can start a really short-lived daemonized container with lxc-init. */ + for (i = 0; i < 10; i++) { + if (!c->startl(c, 1, NULL)) { + fprintf(stderr, "%d: %s failed to start on %dth iteration\n", __LINE__, c->name, i); + goto out; + } + + /* The container needs to exit with a successful error code. */ + if (c->error_num != 0) { + fprintf(stderr, "%d: %s exited successfully on %dth iteration\n", __LINE__, c->name, i); + goto out; + } + fprintf(stderr, "%d: %s exited correctly with error code %d on %dth iteration\n", __LINE__, c->name, c->error_num, i); + + if (!c->wait(c, "STOPPED", 30)) { + fprintf(stderr, "%d: %s failed to wait on %dth iteration\n", __LINE__, c->name, i); goto out; } - sleep(1); } if (!c->set_config_item(c, "lxc.init.cmd", "you-shall-fail")) { @@ -158,15 +212,47 @@ int main(int argc, char *argv[]) goto out; } - /* Test whether we catch the start failure of a really short-lived - * daemonized container. - */ + /* Test whether we can start a really short-lived daemonized container. */ for (i = 0; i < 10; i++) { if (c->startl(c, 0, NULL)) { - fprintf(stderr, "%d: %s failed to start\n", __LINE__, c->name); + fprintf(stderr, "%d: %s failed to start on %dth iteration\n", __LINE__, c->name, i); + goto out; + } + + /* The container needs to exit with an error code.*/ + if (c->error_num == 0) { + fprintf(stderr, "%d: %s exited successfully on %dth iteration\n", __LINE__, c->name, i); + goto out; + } + fprintf(stderr, "%d: %s exited correctly with error code %d on %dth iteration\n", __LINE__, c->name, c->error_num, i); + + if (!c->wait(c, "STOPPED", 30)) { + fprintf(stderr, "%d: %s failed to wait on %dth iteration\n", __LINE__, c->name, i); + goto out; + } + } + + /* Test whether we can start a really short-lived daemonized container with lxc-init. */ + for (i = 0; i < 10; i++) { + /* An container started with lxc-init will always start + * succesfully unless lxc-init has a bug. + */ + if (!c->startl(c, 1, NULL)) { + fprintf(stderr, "%d: %s failed to start on %dth iteration\n", __LINE__, c->name, i); + goto out; + } + + /* The container needs to exit with an error code.*/ + if (c->error_num == 0) { + fprintf(stderr, "%d: %s exited successfully on %dth iteration\n", __LINE__, c->name, i); + goto out; + } + fprintf(stderr, "%d: %s exited correctly with error code %d on %dth iteration\n", __LINE__, c->name, c->error_num, i); + + if (!c->wait(c, "STOPPED", 30)) { + fprintf(stderr, "%d: %s failed to wait on %dth iteration\n", __LINE__, c->name, i); goto out; } - sleep(1); } c->stop(c); @@ -180,5 +266,6 @@ out: destroy_container(); } lxc_container_put(c); + unlink(template); exit(ret); }