From 2e338007c7801b52385dc4b061fd085199b069f0 Mon Sep 17 00:00:00 2001 From: 2xsec Date: Tue, 3 Jul 2018 18:09:32 +0900 Subject: [PATCH 01/25] tests: cleanup api_reboot.c Signed-off-by: 2xsec --- src/tests/api_reboot.c | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/tests/api_reboot.c b/src/tests/api_reboot.c index d169510b56..730d6a81a5 100644 --- a/src/tests/api_reboot.c +++ b/src/tests/api_reboot.c @@ -59,6 +59,7 @@ int main(int argc, char *argv[]) lxc_error("%s\n", "Container \"reboot\" is not defined"); goto on_error_put; } + c->clear_config(c); if (!c->load_config(c, NULL)) { @@ -118,7 +119,9 @@ int main(int argc, char *argv[]) on_error_put: lxc_container_put(c); + if (ret == EXIT_SUCCESS) lxc_debug("%s\n", "All reboot tests passed"); + exit(ret); } From 1c95b732d896a40cd8c7af971085637b73bd943a Mon Sep 17 00:00:00 2001 From: 2xsec Date: Tue, 3 Jul 2018 18:10:55 +0900 Subject: [PATCH 02/25] tests: cleanup clonetest.c Signed-off-by: 2xsec --- src/tests/clonetest.c | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/src/tests/clonetest.c b/src/tests/clonetest.c index 814706d277..f3a8e5b0b6 100644 --- a/src/tests/clonetest.c +++ b/src/tests/clonetest.c @@ -41,6 +41,7 @@ int main(int argc, char *argv[]) lxc_container_put(c); c = NULL; } + if (c2) { c2->destroy(c2); lxc_container_put(c2); @@ -52,11 +53,14 @@ int main(int argc, char *argv[]) ret = 1; goto out; } + c->save_config(c, NULL); + if (!c->createl(c, "busybox", NULL, NULL, 0, NULL)) { fprintf(stderr, "%d: failed to create a container\n", __LINE__); goto out; } + c->load_config(c, NULL); if (!c->is_defined(c)) { @@ -92,12 +96,14 @@ int main(int argc, char *argv[]) c2->destroy(c2); lxc_container_put(c2); } + c2 = lxc_container_new("clonetest-o1", NULL); if (c2) { if (c2->is_defined(c2)) c2->destroy(c2); lxc_container_put(c2); } + c2 = lxc_container_new("clonetest-o2", NULL); if (c2) { if (c2->is_defined(c2)) @@ -112,6 +118,7 @@ int main(int argc, char *argv[]) fprintf(stderr, "failed loading clonetestlvm1\n"); goto out; } + if (!c->is_defined(c)) { fprintf(stderr, "clonetestlvm1 does not exist, skipping lvm tests\n"); ret = 0; @@ -138,6 +145,7 @@ int main(int argc, char *argv[]) fprintf(stderr, "lvm clone failed\n"); goto out; } + lxc_container_put(c2); lxc_container_put(c); c = c2 = NULL; @@ -166,13 +174,16 @@ int main(int argc, char *argv[]) if (c3) { lxc_container_put(c3); } + if (c2) { c2->destroy(c2); lxc_container_put(c2); } + if (c) { c->destroy(c); lxc_container_put(c); } + exit(ret); } From fbeb7a1a24cef6899b6a4f505e81d53c05d405b3 Mon Sep 17 00:00:00 2001 From: 2xsec Date: Tue, 3 Jul 2018 18:11:46 +0900 Subject: [PATCH 03/25] tests: cleanup concurrent.c Signed-off-by: 2xsec --- src/tests/concurrent.c | 413 +++++++++++++++++++++-------------------- 1 file changed, 213 insertions(+), 200 deletions(-) diff --git a/src/tests/concurrent.c b/src/tests/concurrent.c index c41e9f48fc..87d2ae9784 100644 --- a/src/tests/concurrent.c +++ b/src/tests/concurrent.c @@ -35,223 +35,236 @@ static int delay = 0; static const char *template = "busybox"; static const struct option options[] = { - { "threads", required_argument, NULL, 'j' }, - { "iterations", required_argument, NULL, 'i' }, - { "template", required_argument, NULL, 't' }, - { "delay", required_argument, NULL, 'd' }, - { "modes", required_argument, NULL, 'm' }, - { "quiet", no_argument, NULL, 'q' }, - { "debug", no_argument, NULL, 'D' }, - { "help", no_argument, NULL, '?' }, - { 0, 0, 0, 0 }, + { "threads", required_argument, NULL, 'j' }, + { "iterations", required_argument, NULL, 'i' }, + { "template", required_argument, NULL, 't' }, + { "delay", required_argument, NULL, 'd' }, + { "modes", required_argument, NULL, 'm' }, + { "quiet", no_argument, NULL, 'q' }, + { "debug", no_argument, NULL, 'D' }, + { "help", no_argument, NULL, '?' }, + { 0, 0, 0, 0 }, }; static void usage(void) { - fprintf(stderr, "Usage: lxc-test-concurrent [OPTION]...\n\n" - "Common options :\n" - " -j, --threads=N Threads to run concurrently\n" - " (default: 5, use 1 for no threading)\n" - " -i, --iterations=N Number times to run the test (default: 1)\n" - " -t, --template=t Template to use (default: busybox)\n" - " -d, --delay=N Delay in seconds between start and stop\n" - " -m, --modes= Modes to run (create, start, stop, destroy)\n" - " -q, --quiet Don't produce any output\n" - " -D, --debug Create a debug log\n" - " -?, --help Give this help list\n" - "\n" - "Mandatory or optional arguments to long options are also mandatory or optional\n" - "for any corresponding short options.\n\n"); + fprintf(stderr, "Usage: lxc-test-concurrent [OPTION]...\n\n" + "Common options :\n" + " -j, --threads=N Threads to run concurrently\n" + " (default: 5, use 1 for no threading)\n" + " -i, --iterations=N Number times to run the test (default: 1)\n" + " -t, --template=t Template to use (default: busybox)\n" + " -d, --delay=N Delay in seconds between start and stop\n" + " -m, --modes= Modes to run (create, start, stop, destroy)\n" + " -q, --quiet Don't produce any output\n" + " -D, --debug Create a debug log\n" + " -?, --help Give this help list\n" + "\n" + "Mandatory or optional arguments to long options are also mandatory or optional\n" + "for any corresponding short options.\n\n"); } struct thread_args { - int thread_id; - int return_code; - const char *mode; + int thread_id; + int return_code; + const char *mode; }; static void do_function(void *arguments) { - char name[NAME_MAX+1]; - struct thread_args *args = arguments; - struct lxc_container *c; - - sprintf(name, "lxc-test-concurrent-%d", args->thread_id); - - args->return_code = 1; - c = lxc_container_new(name, NULL); - if (!c) { - fprintf(stderr, "Unable to instantiate container (%s)\n", name); - return; - } - - if (debug) - c->set_config_item(c, "lxc.log.level", "DEBUG"); - - if (strcmp(args->mode, "create") == 0) { - if (!c->is_defined(c)) { - if (!c->create(c, template, NULL, NULL, 1, NULL)) { - fprintf(stderr, "Creating the container (%s) failed...\n", name); - goto out; - } - } - } else if(strcmp(args->mode, "start") == 0) { - if (c->is_defined(c) && !c->is_running(c)) { - c->want_daemonize(c, true); - if (!c->start(c, false, NULL)) { - fprintf(stderr, "Starting the container (%s) failed...\n", name); - goto out; - } - if (!c->wait(c, "RUNNING", 15)) { - fprintf(stderr, "Waiting the container (%s) to start failed...\n", name); - goto out; - } - sleep(delay); - } - } else if(strcmp(args->mode, "stop") == 0) { - if (c->is_defined(c) && c->is_running(c)) { - if (!c->stop(c)) { - fprintf(stderr, "Stopping the container (%s) failed...\n", name); - goto out; - } - if (!c->wait(c, "STOPPED", 15)) { - fprintf(stderr, "Waiting the container (%s) to stop failed...\n", name); - goto out; - } - } - } else if(strcmp(args->mode, "destroy") == 0) { - if (c->is_defined(c) && !c->is_running(c)) { - if (!c->destroy(c)) { - fprintf(stderr, "Destroying the container (%s) failed...\n", name); - goto out; - } - } - } - args->return_code = 0; + char name[NAME_MAX + 1]; + struct thread_args *args = arguments; + struct lxc_container *c; + + sprintf(name, "lxc-test-concurrent-%d", args->thread_id); + + args->return_code = 1; + + c = lxc_container_new(name, NULL); + if (!c) { + fprintf(stderr, "Unable to instantiate container (%s)\n", name); + return; + } + + if (debug) + c->set_config_item(c, "lxc.log.level", "DEBUG"); + + if (strcmp(args->mode, "create") == 0) { + if (!c->is_defined(c)) { + if (!c->create(c, template, NULL, NULL, 1, NULL)) { + fprintf(stderr, "Creating the container (%s) failed...\n", name); + goto out; + } + } + } else if(strcmp(args->mode, "start") == 0) { + if (c->is_defined(c) && !c->is_running(c)) { + c->want_daemonize(c, true); + + if (!c->start(c, false, NULL)) { + fprintf(stderr, "Starting the container (%s) failed...\n", name); + goto out; + } + + if (!c->wait(c, "RUNNING", 15)) { + fprintf(stderr, "Waiting the container (%s) to start failed...\n", name); + goto out; + } + + sleep(delay); + } + } else if(strcmp(args->mode, "stop") == 0) { + if (c->is_defined(c) && c->is_running(c)) { + if (!c->stop(c)) { + fprintf(stderr, "Stopping the container (%s) failed...\n", name); + goto out; + } + + if (!c->wait(c, "STOPPED", 15)) { + fprintf(stderr, "Waiting the container (%s) to stop failed...\n", name); + goto out; + } + } + } else if(strcmp(args->mode, "destroy") == 0) { + if (c->is_defined(c) && !c->is_running(c)) { + if (!c->destroy(c)) { + fprintf(stderr, "Destroying the container (%s) failed...\n", name); + goto out; + } + } + } + + args->return_code = 0; + out: - lxc_container_put(c); - if (debug) - lxc_log_close(); + lxc_container_put(c); + + if (debug) + lxc_log_close(); } static void *concurrent(void *arguments) { - do_function(arguments); - pthread_exit(NULL); + do_function(arguments); + pthread_exit(NULL); - return NULL; + return NULL; } int main(int argc, char *argv[]) { - int i, j, iter, opt; - pthread_attr_t attr; - pthread_t *threads; - struct thread_args *args; - - char *modes_default[] = {"create", "start", "stop", "destroy", NULL}; - char **modes = modes_default; - - pthread_attr_init(&attr); - - while ((opt = getopt_long(argc, argv, "j:i:t:d:m:qD", options, NULL)) != -1) { - switch(opt) { - case 'j': - nthreads = atoi(optarg); - break; - case 'i': - iterations = atoi(optarg); - break; - case 't': - template = optarg; - break; - case 'd': - delay = atoi(optarg); - break; - case 'q': - quiet = 1; - break; - case 'D': - debug = 1; - break; - case 'm': { - char *mode_tok, *tok, *saveptr = NULL; - - if (!optarg) - continue; - - modes = NULL; - for (i = 0, mode_tok = optarg; - (tok = strtok_r(mode_tok, ",", &saveptr)); - i++, mode_tok = NULL) { - modes = realloc(modes, sizeof(*modes) * (i+2)); - if (!modes) { - perror("realloc"); - exit(EXIT_FAILURE); - } - modes[i] = tok; - } - if (modes) - modes[i] = NULL; - break; - } - default: /* '?' */ - usage(); - exit(EXIT_FAILURE); - } - } - - threads = malloc(sizeof(*threads) * nthreads); - args = malloc(sizeof(*args) * nthreads); - if (threads == NULL || args == NULL) { - fprintf(stderr, "Unable malloc enough memory for %d threads\n", nthreads); - exit(EXIT_FAILURE); - } - - for (iter = 1; iter <= iterations; iter++) { - int fd; - fd = open("/", O_RDONLY); - if (fd < 0) { - fprintf(stderr, "Failed to open /\n"); - continue; - } - - if (!quiet) - printf("\nIteration %d/%d maxfd:%d\n", iter, iterations, fd); - close(fd); - - for (i = 0; modes[i];i++) { - if (!quiet) - printf("Executing (%s) for %d containers...\n", modes[i], nthreads); - for (j = 0; j < nthreads; j++) { - args[j].thread_id = j; - args[j].mode = modes[i]; - - if (nthreads > 1) { - if (pthread_create(&threads[j], &attr, concurrent, (void *) &args[j]) != 0) { - perror("pthread_create() error"); - exit(EXIT_FAILURE); - } - } else { - do_function(&args[j]); - } - } - - for (j = 0; j < nthreads; j++) { - if (nthreads > 1) { - if (pthread_join(threads[j], NULL) != 0) { - perror("pthread_join() error"); - exit(EXIT_FAILURE); - } - } - if (args[j].return_code) { - fprintf(stderr, "thread returned error %d\n", args[j].return_code); - exit(EXIT_FAILURE); - } - } - } - } - - free(args); - free(threads); - pthread_attr_destroy(&attr); - exit(EXIT_SUCCESS); + int i, j, iter, opt; + pthread_attr_t attr; + pthread_t *threads; + struct thread_args *args; + + char *modes_default[] = {"create", "start", "stop", "destroy", NULL}; + char **modes = modes_default; + + pthread_attr_init(&attr); + + while ((opt = getopt_long(argc, argv, "j:i:t:d:m:qD", options, NULL)) != -1) { + switch(opt) { + case 'j': + nthreads = atoi(optarg); + break; + case 'i': + iterations = atoi(optarg); + break; + case 't': + template = optarg; + break; + case 'd': + delay = atoi(optarg); + break; + case 'q': + quiet = 1; + break; + case 'D': + debug = 1; + break; + case 'm': { + char *mode_tok, *tok, *saveptr = NULL; + + if (!optarg) + continue; + + modes = NULL; + for (i = 0, mode_tok = optarg; + (tok = strtok_r(mode_tok, ",", &saveptr)); + i++, mode_tok = NULL) { + modes = realloc(modes, sizeof(*modes) * (i+2)); + if (!modes) { + perror("realloc"); + exit(EXIT_FAILURE); + } + modes[i] = tok; + } + + if (modes) + modes[i] = NULL; + break; + } + default: /* '?' */ + usage(); + exit(EXIT_FAILURE); + } + } + + threads = malloc(sizeof(*threads) * nthreads); + args = malloc(sizeof(*args) * nthreads); + if (threads == NULL || args == NULL) { + fprintf(stderr, "Unable malloc enough memory for %d threads\n", nthreads); + exit(EXIT_FAILURE); + } + + for (iter = 1; iter <= iterations; iter++) { + int fd; + + fd = open("/", O_RDONLY); + if (fd < 0) { + fprintf(stderr, "Failed to open /\n"); + continue; + } + + if (!quiet) + printf("\nIteration %d/%d maxfd:%d\n", iter, iterations, fd); + + close(fd); + + for (i = 0; modes[i];i++) { + if (!quiet) + printf("Executing (%s) for %d containers...\n", modes[i], nthreads); + + for (j = 0; j < nthreads; j++) { + args[j].thread_id = j; + args[j].mode = modes[i]; + + if (nthreads > 1) { + if (pthread_create(&threads[j], &attr, concurrent, (void *) &args[j]) != 0) { + perror("pthread_create() error"); + exit(EXIT_FAILURE); + } + } else { + do_function(&args[j]); + } + } + + for (j = 0; j < nthreads; j++) { + if (nthreads > 1) { + if (pthread_join(threads[j], NULL) != 0) { + perror("pthread_join() error"); + exit(EXIT_FAILURE); + } + } + + if (args[j].return_code) { + fprintf(stderr, "thread returned error %d\n", args[j].return_code); + exit(EXIT_FAILURE); + } + } + } + } + + free(args); + free(threads); + pthread_attr_destroy(&attr); + exit(EXIT_SUCCESS); } From f120a741966670021a25517c5d8de480a52b5649 Mon Sep 17 00:00:00 2001 From: 2xsec Date: Tue, 3 Jul 2018 18:12:31 +0900 Subject: [PATCH 04/25] tests: cleanup config_jump_table.c Signed-off-by: 2xsec --- src/tests/config_jump_table.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/tests/config_jump_table.c b/src/tests/config_jump_table.c index 8e86c48e4b..3f08fb9427 100644 --- a/src/tests/config_jump_table.c +++ b/src/tests/config_jump_table.c @@ -54,6 +54,7 @@ int main(int argc, char *argv[]) for (key = strtok_r(keys, "\n", &saveptr); key != NULL; key = strtok_r(NULL, "\n", &saveptr)) { struct lxc_config_t *config; + config = lxc_get_config(key); if (!config) { lxc_error("configuration key \"%s\" not implemented in " @@ -90,5 +91,4 @@ int main(int argc, char *argv[]) free(keys); exit(ret); - } From 9ace5308609cdb02a5af2c80ffba076b7f7cdecc Mon Sep 17 00:00:00 2001 From: 2xsec Date: Tue, 3 Jul 2018 18:13:21 +0900 Subject: [PATCH 05/25] tests: cleanup console.c Signed-off-by: 2xsec --- src/tests/console.c | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) diff --git a/src/tests/console.c b/src/tests/console.c index 9c32cf2699..c0ad160330 100644 --- a/src/tests/console.c +++ b/src/tests/console.c @@ -46,6 +46,7 @@ static void test_console_close_all(int ttyfd[MAXCONSOLES], close(masterfd[i]); masterfd[i] = -1; } + if (ttyfd[i] != -1) { close(ttyfd[i]); ttyfd[i] = -1; @@ -64,11 +65,13 @@ static int test_console_running_container(struct lxc_container *c) ttynum[i] = ttyfd[i] = masterfd[i] = -1; ttynum[0] = 1; + ret = c->console_getfd(c, &ttynum[0], &masterfd[0]); if (ret < 0) { TSTERR("console allocate failed"); goto err1; } + ttyfd[0] = ret; if (ttynum[0] != 1) { TSTERR("console allocate got bad ttynum %d", ttynum[0]); @@ -94,16 +97,20 @@ static int test_console_running_container(struct lxc_container *c) break; ttyfd[nrconsoles] = ret; } + if (nrconsoles != TTYCNT) { TSTERR("didn't allocate all consoles %d != %d", nrconsoles, TTYCNT); goto err2; } + test_console_close_all(ttyfd, masterfd); } + ret = 0; err2: test_console_close_all(ttyfd, masterfd); + err1: return ret; } @@ -135,20 +142,24 @@ static int test_console(const char *lxcpath, TSTERR("instantiating container %s", name); goto out1; } + if (c->is_defined(c)) { c->stop(c); c->destroy(c); c = lxc_container_new(name, lxcpath); } + if (!c->createl(c, template, NULL, NULL, 0, NULL)) { TSTERR("creating container %s", name); goto out2; } + c->load_config(c, NULL); c->set_config_item(c, "lxc.tty.max", TTYCNT_STR); c->set_config_item(c, "lxc.pty.max", "1024"); c->save_config(c, NULL); c->want_daemonize(c, true); + if (!c->startl(c, 0, NULL)) { TSTERR("starting container %s", name); goto out3; @@ -157,10 +168,13 @@ static int test_console(const char *lxcpath, ret = test_console_running_container(c); c->stop(c); + out3: c->destroy(c); + out2: lxc_container_put(c); + out1: return ret; } @@ -168,6 +182,7 @@ static int test_console(const char *lxcpath, int main(int argc, char *argv[]) { int ret; + ret = test_console(NULL, NULL, TSTNAME, "busybox"); if (ret < 0) goto err1; @@ -175,7 +190,9 @@ int main(int argc, char *argv[]) ret = test_console("/var/lib/lxctest2", NULL, TSTNAME, "busybox"); if (ret < 0) goto err1; + printf("All tests passed\n"); + err1: return ret; } From 00e196f27a9d250d7d69fa9d3e5e1f2f30369c9c Mon Sep 17 00:00:00 2001 From: 2xsec Date: Tue, 3 Jul 2018 18:14:14 +0900 Subject: [PATCH 06/25] tests: cleanup containertests.c Signed-off-by: 2xsec --- src/tests/containertests.c | 22 ++++++++++++++++++++++ 1 file changed, 22 insertions(+) diff --git a/src/tests/containertests.c b/src/tests/containertests.c index 256ff60fdf..1412b0b846 100644 --- a/src/tests/containertests.c +++ b/src/tests/containertests.c @@ -39,10 +39,12 @@ static int destroy_busybox(void) perror("fork"); return -1; } + if (pid == 0) { execlp("lxc-destroy", "lxc-destroy", "-f", "-n", MYNAME, NULL); exit(EXIT_FAILURE); } + again: ret = waitpid(pid, &status, 0); if (ret == -1) { @@ -51,12 +53,15 @@ static int destroy_busybox(void) perror("waitpid"); return -1; } + if (ret != pid) goto again; + if (!WIFEXITED(status)) { // did not exit normally fprintf(stderr, "%d: lxc-create exited abnormally\n", __LINE__); return -1; } + return WEXITSTATUS(status); } @@ -69,10 +74,12 @@ static int create_busybox(void) perror("fork"); return -1; } + if (pid == 0) { execlp("lxc-create", "lxc-create", "-t", "busybox", "-n", MYNAME, NULL); exit(EXIT_FAILURE); } + again: ret = waitpid(pid, &status, 0); if (ret == -1) { @@ -81,12 +88,15 @@ static int create_busybox(void) perror("waitpid"); return -1; } + if (ret != pid) goto again; + if (!WIFEXITED(status)) { // did not exit normally fprintf(stderr, "%d: lxc-create exited abnormally\n", __LINE__); return -1; } + return WEXITSTATUS(status); } @@ -99,25 +109,30 @@ int main(int argc, char *argv[]) char *str; ret = 1; + /* test refcounting */ c = lxc_container_new(MYNAME, NULL); if (!c) { fprintf(stderr, "%d: error creating lxc_container %s\n", __LINE__, MYNAME); goto out; } + if (!lxc_container_get(c)) { fprintf(stderr, "%d: error getting refcount\n", __LINE__); goto out; } + /* peek in, inappropriately, make sure refcount is a we'd like */ if (c->numthreads != 2) { fprintf(stderr, "%d: refcount is %d, not %d\n", __LINE__, c->numthreads, 2); goto out; } + if (strcmp(c->name, MYNAME) != 0) { fprintf(stderr, "%d: container has wrong name (%s not %s)\n", __LINE__, c->name, MYNAME); goto out; } + str = c->config_file_name(c); #define CONFIGFNAM LXCPATH "/" MYNAME "/config" if (!str || strcmp(str, CONFIGFNAM)) { @@ -127,19 +142,23 @@ int main(int argc, char *argv[]) free(str); free(c->configfile); c->configfile = NULL; + str = c->config_file_name(c); if (str) { fprintf(stderr, "%d: config file name was not NULL as it should have been\n", __LINE__); goto out; } + if (lxc_container_put(c) != 0) { fprintf(stderr, "%d: c was freed on non-final put\n", __LINE__); goto out; } + if (c->numthreads != 1) { fprintf(stderr, "%d: refcount is %d, not %d\n", __LINE__, c->numthreads, 1); goto out; } + if (lxc_container_put(c) != 1) { fprintf(stderr, "%d: c was not freed on final put\n", __LINE__); goto out; @@ -202,9 +221,11 @@ int main(int argc, char *argv[]) fprintf(stderr, "%d: lxc_get_wait_states gave %d not %d\n", __LINE__, numstates, MAX_STATE); goto out; } + const char **sstr = malloc(numstates * sizeof(const char *)); numstates = lxc_get_wait_states(sstr); int i; + for (i=0; istop(c); destroy_busybox(); } + lxc_container_put(c); exit(ret); } From 56aff0c442029bd8bf0627ffca1cd31a8ec5fe50 Mon Sep 17 00:00:00 2001 From: 2xsec Date: Tue, 3 Jul 2018 18:14:52 +0900 Subject: [PATCH 07/25] tests: cleanup createtest.c Signed-off-by: 2xsec --- src/tests/createtest.c | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/tests/createtest.c b/src/tests/createtest.c index 4051f3c2b4..53db119be4 100644 --- a/src/tests/createtest.c +++ b/src/tests/createtest.c @@ -48,8 +48,10 @@ int main(int argc, char *argv[]) fprintf(stderr, "%d: failed to set network type\n", __LINE__); goto out; } + c->set_config_item(c, "lxc.net.0.link", "lxcbr0"); c->set_config_item(c, "lxc.net.0.flags", "up"); + if (!c->createl(c, "busybox", NULL, NULL, 0, NULL)) { fprintf(stderr, "%d: failed to create a trusty container\n", __LINE__); goto out; @@ -63,6 +65,7 @@ int main(int argc, char *argv[]) c->clear_config(c); c->load_config(c, NULL); c->want_daemonize(c, true); + if (!c->startl(c, 0, NULL)) { fprintf(stderr, "%d: failed to start %s\n", __LINE__, MYNAME); goto out; @@ -85,6 +88,7 @@ int main(int argc, char *argv[]) fprintf(stderr, "all lxc_container tests passed for %s\n", c->name); ret = 0; + out: lxc_container_put(c); exit(ret); From 17d11ff74423433156be8891f0ac75bf509a5720 Mon Sep 17 00:00:00 2001 From: 2xsec Date: Tue, 3 Jul 2018 18:15:45 +0900 Subject: [PATCH 08/25] tests: cleanup criu_check_feature.c Signed-off-by: 2xsec --- src/tests/criu_check_feature.c | 1 + 1 file changed, 1 insertion(+) diff --git a/src/tests/criu_check_feature.c b/src/tests/criu_check_feature.c index a5e0c34ebd..8d20035366 100644 --- a/src/tests/criu_check_feature.c +++ b/src/tests/criu_check_feature.c @@ -86,5 +86,6 @@ int main(int argc, char *argv[]) lxc_container_put(c); if (ret == EXIT_SUCCESS) lxc_debug("%s\n", "All criu feature check tests passed"); + exit(ret); } From 8d72e58a24a94eacaf17e131499bf53e546b4c49 Mon Sep 17 00:00:00 2001 From: 2xsec Date: Tue, 3 Jul 2018 18:16:30 +0900 Subject: [PATCH 09/25] tests: cleanup destroytest.c Signed-off-by: 2xsec --- src/tests/destroytest.c | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/src/tests/destroytest.c b/src/tests/destroytest.c index b8ba8055d7..79549120e4 100644 --- a/src/tests/destroytest.c +++ b/src/tests/destroytest.c @@ -37,24 +37,30 @@ static int create_container(void) perror("fork"); return -1; } + if (pid == 0) { execlp("lxc-create", "lxc-create", "-t", "busybox", "-n", MYNAME, NULL); exit(EXIT_FAILURE); } + again: ret = waitpid(pid, &status, 0); if (ret == -1) { if (errno == EINTR) goto again; + perror("waitpid"); return -1; } + if (ret != pid) goto again; + if (!WIFEXITED(status)) { // did not exit normally fprintf(stderr, "%d: lxc-create exited abnormally\n", __LINE__); return -1; } + return WEXITSTATUS(status); } @@ -96,6 +102,7 @@ int main(int argc, char *argv[]) fprintf(stderr, "all lxc_container tests passed for %s\n", c->name); ret = 0; + out: lxc_container_put(c); exit(ret); From e9432dfc50591a4d0048fd70b8e6cec49f57bb30 Mon Sep 17 00:00:00 2001 From: 2xsec Date: Tue, 3 Jul 2018 18:17:03 +0900 Subject: [PATCH 10/25] tests: cleanup device_add_remove.c Signed-off-by: 2xsec --- src/tests/device_add_remove.c | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/tests/device_add_remove.c b/src/tests/device_add_remove.c index c776729bf4..4a2e95138d 100644 --- a/src/tests/device_add_remove.c +++ b/src/tests/device_add_remove.c @@ -50,6 +50,7 @@ int main(int argc, char *argv[]) fprintf(stderr, "Adding %s to the container (%s) failed...\n", DEVICE, NAME); goto out; } + if (!c->remove_device_node(c, DEVICE, DEVICE)) { fprintf(stderr, "Removing %s from the container (%s) failed...\n", DEVICE, NAME); goto out; @@ -64,6 +65,7 @@ int main(int argc, char *argv[]) fprintf(stderr, "Destroying the container (%s) failed...\n", NAME); goto out; } + ret = 0; out: From b947e65737c934ab2d8f27e6933349040123c815 Mon Sep 17 00:00:00 2001 From: 2xsec Date: Tue, 3 Jul 2018 18:18:17 +0900 Subject: [PATCH 11/25] tests: cleanup get_item.c Signed-off-by: 2xsec --- src/tests/get_item.c | 51 +++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 50 insertions(+), 1 deletion(-) diff --git a/src/tests/get_item.c b/src/tests/get_item.c index a1a6b67055..f4c8d92286 100644 --- a/src/tests/get_item.c +++ b/src/tests/get_item.c @@ -49,11 +49,13 @@ int main(int argc, char *argv[]) lxc_error("%s\n", "Failed to set lxc.log.syslog.\n"); goto out; } + ret = c->get_config_item(c, "lxc.log.syslog", v2, 255); if (ret < 0) { lxc_error("Failed to retrieve lxc.log.syslog: %d.\n", ret); goto out; } + if (strcmp(v2, "local0") != 0) { lxc_error("Expected: local0 == %s.\n", v2); goto out; @@ -71,6 +73,7 @@ int main(int argc, char *argv[]) fprintf(stderr, "%d: failed to set hook.pre-start\n", __LINE__); goto out; } + ret = c->get_config_item(c, "lxc.hook.pre-start", v2, 255); if (ret < 0) { fprintf(stderr, "%d: get_config_item(lxc.hook.pre-start) returned %d\n", __LINE__, ret); @@ -89,6 +92,7 @@ int main(int argc, char *argv[]) fprintf(stderr, "%d: failed to set tty\n", __LINE__); goto out; } + ret = c->get_config_item(c, "lxc.tty.max", v2, 255); if (ret < 0) { fprintf(stderr, "%d: get_config_item(lxc.tty) returned %d\n", __LINE__, ret); @@ -100,6 +104,7 @@ int main(int argc, char *argv[]) fprintf(stderr, "%d: failed to set arch\n", __LINE__); goto out; } + ret = c->get_config_item(c, "lxc.arch", v2, 255); if (ret < 0) { fprintf(stderr, "%d: get_config_item(lxc.arch) returned %d\n", __LINE__, ret); @@ -111,6 +116,7 @@ int main(int argc, char *argv[]) fprintf(stderr, "%d: failed to set init_uid\n", __LINE__); goto out; } + ret = c->get_config_item(c, "lxc.init.uid", v2, 255); if (ret < 0) { fprintf(stderr, "%d: get_config_item(lxc.init_uid) returned %d\n", __LINE__, ret); @@ -122,6 +128,7 @@ int main(int argc, char *argv[]) fprintf(stderr, "%d: failed to set init_gid\n", __LINE__); goto out; } + ret = c->get_config_item(c, "lxc.init.gid", v2, 255); if (ret < 0) { fprintf(stderr, "%d: get_config_item(lxc.init_gid) returned %d\n", __LINE__, ret); @@ -132,12 +139,13 @@ int main(int argc, char *argv[]) #define HNAME "hostname1" // demonstrate proper usage: char *alloced; + int len; + if (!c->set_config_item(c, "lxc.uts.name", HNAME)) { fprintf(stderr, "%d: failed to set utsname\n", __LINE__); goto out; } - int len; len = c->get_config_item(c, "lxc.uts.name", NULL, 0); // query the size of the string if (len < 0) { fprintf(stderr, "%d: get_config_item(lxc.utsname) returned %d\n", __LINE__, len); @@ -151,6 +159,7 @@ int main(int argc, char *argv[]) fprintf(stderr, "%d: failed to allocate %d bytes for utsname\n", __LINE__, len); goto out; } + // now pass in the malloc'd array, and pass in length of string + 1: again // because we need room for the trailing \0 ret = c->get_config_item(c, "lxc.uts.name", alloced, len+1); @@ -158,6 +167,7 @@ int main(int argc, char *argv[]) fprintf(stderr, "%d: get_config_item(lxc.utsname) returned %d\n", __LINE__, ret); goto out; } + if (strcmp(alloced, HNAME) != 0 || ret != len) { fprintf(stderr, "lxc.utsname returned wrong value: %d %s not %d %s\n", ret, alloced, len, HNAME); goto out; @@ -169,6 +179,7 @@ int main(int argc, char *argv[]) fprintf(stderr, "%d: failed to set mount.entry\n", __LINE__); goto out; } + ret = c->get_config_item(c, "lxc.mount.entry", v2, 255); if (ret < 0) { fprintf(stderr, "%d: get_config_item(lxc.mount.entry) returned %d\n", __LINE__, ret); @@ -186,11 +197,13 @@ int main(int argc, char *argv[]) fprintf(stderr, "%d: failed to set limit.nofile\n", __LINE__); goto out; } + ret = c->get_config_item(c, "lxc.prlimit.nofile", v2, 255); if (ret < 0) { fprintf(stderr, "%d: get_config_item(lxc.prlimit.nofile) returned %d\n", __LINE__, ret); goto out; } + if (strcmp(v2, "1234:unlimited")) { fprintf(stderr, "%d: lxc.prlimit.nofile returned wrong value: %d %s not 14 1234:unlimited\n", __LINE__, ret, v2); goto out; @@ -201,11 +214,13 @@ int main(int argc, char *argv[]) fprintf(stderr, "%d: failed to set limit.stack\n", __LINE__); goto out; } + ret = c->get_config_item(c, "lxc.prlimit.stack", v2, 255); if (ret < 0) { fprintf(stderr, "%d: get_config_item(lxc.prlimit.stack) returned %d\n", __LINE__, ret); goto out; } + if (strcmp(v2, "unlimited")) { fprintf(stderr, "%d: lxc.prlimit.stack returned wrong value: %d %s not 9 unlimited\n", __LINE__, ret, v2); goto out; @@ -219,6 +234,7 @@ int main(int argc, char *argv[]) fprintf(stderr, "%d: get_config_item(limit) returned %d\n", __LINE__, ret); goto out; } + if (strcmp(v3, ALL_LIMITS)) { fprintf(stderr, "%d: lxc.prlimit returned wrong value: %d %s not %d %s\n", __LINE__, ret, v3, (int)sizeof(ALL_LIMITS)-1, ALL_LIMITS); goto out; @@ -229,11 +245,13 @@ int main(int argc, char *argv[]) fprintf(stderr, "%d: failed clearing limit.nofile\n", __LINE__); goto out; } + ret = c->get_config_item(c, "lxc.prlimit", v3, 2047); if (ret != sizeof(LIMIT_STACK)-1) { fprintf(stderr, "%d: get_config_item(limit) returned %d\n", __LINE__, ret); goto out; } + if (strcmp(v3, LIMIT_STACK)) { fprintf(stderr, "%d: lxc.prlimit returned wrong value: %d %s not %d %s\n", __LINE__, ret, v3, (int)sizeof(LIMIT_STACK)-1, LIMIT_STACK); goto out; @@ -253,11 +271,13 @@ int main(int argc, char *argv[]) fprintf(stderr, "%d: failed to set lxc.sysctl.net.ipv4.ip_forward\n", __LINE__); goto out; } + ret = c->get_config_item(c, "lxc.sysctl.net.ipv4.ip_forward", v2, 255); if (ret < 0) { fprintf(stderr, "%d: get_config_item(lxc.sysctl.net.ipv4.ip_forward) returned %d\n", __LINE__, ret); goto out; } + if (strcmp(v2, "1")) { fprintf(stderr, "%d: lxc.sysctl.net.ipv4.ip_forward returned wrong value: %d %s not 1\n", __LINE__, ret, v2); goto out; @@ -268,11 +288,13 @@ int main(int argc, char *argv[]) fprintf(stderr, "%d: failed to set lxc.sysctl.net.core.somaxconn\n", __LINE__); goto out; } + ret = c->get_config_item(c, "lxc.sysctl.net.core.somaxconn", v2, 255); if (ret < 0) { fprintf(stderr, "%d: get_config_item(lxc.sysctl.net.core.somaxconn) returned %d\n", __LINE__, ret); goto out; } + if (strcmp(v2, "256")) { fprintf(stderr, "%d: lxc.sysctl.net.core.somaxconn returned wrong value: %d %s not 256\n", __LINE__, ret, v2); goto out; @@ -284,6 +306,7 @@ int main(int argc, char *argv[]) fprintf(stderr, "%d: get_config_item(sysctl) returned %d\n", __LINE__, ret); goto out; } + if (strcmp(v3, ALL_SYSCTLS)) { fprintf(stderr, "%d: lxc.sysctl returned wrong value: %d %s not %d %s\n", __LINE__, ret, v3, (int)sizeof(ALL_SYSCTLS) - 1, ALL_SYSCTLS); goto out; @@ -294,11 +317,13 @@ int main(int argc, char *argv[]) fprintf(stderr, "%d: failed clearing lxc.sysctl.net.ipv4.ip_forward\n", __LINE__); goto out; } + ret = c->get_config_item(c, "lxc.sysctl", v3, 2047); if (ret != sizeof(SYSCTL_SOMAXCONN) - 1) { fprintf(stderr, "%d: get_config_item(sysctl) returned %d\n", __LINE__, ret); goto out; } + if (strcmp(v3, SYSCTL_SOMAXCONN)) { fprintf(stderr, "%d: lxc.sysctl returned wrong value: %d %s not %d %s\n", __LINE__, ret, v3, (int)sizeof(SYSCTL_SOMAXCONN) - 1, SYSCTL_SOMAXCONN); goto out; @@ -324,6 +349,7 @@ int main(int argc, char *argv[]) fprintf(stderr, "%d: get_config_item(lxc.proc.setgroups) returned %d\n", __LINE__, ret); goto out; } + if (strcmp(v2, "allow")) { fprintf(stderr, "%d: lxc.proc.setgroups returned wrong value: %d %s not 10\n", __LINE__, ret, v2); goto out; @@ -340,6 +366,7 @@ int main(int argc, char *argv[]) fprintf(stderr, "%d: get_config_item(lxc.proc.oom_score_adj) returned %d\n", __LINE__, ret); goto out; } + if (strcmp(v2, "10")) { fprintf(stderr, "%d: lxc.proc.oom_score_adj returned wrong value: %d %s not 10\n", __LINE__, ret, v2); goto out; @@ -351,6 +378,7 @@ int main(int argc, char *argv[]) fprintf(stderr, "%d: get_config_item(proc) returned %d\n", __LINE__, ret); goto out; } + if (strcmp(v3, ALL_PROCS)) { fprintf(stderr, "%d: lxc.proc returned wrong value: %d %s not %d %s\n", __LINE__, ret, v3, (int)sizeof(ALL_PROCS) - 1, ALL_PROCS); goto out; @@ -361,11 +389,13 @@ int main(int argc, char *argv[]) fprintf(stderr, "%d: failed clearing lxc.proc.setgroups\n", __LINE__); goto out; } + ret = c->get_config_item(c, "lxc.proc", v3, 2047); if (ret < 0) { fprintf(stderr, "%d: get_config_item(proc) returned %d\n", __LINE__, ret); goto out; } + if (strcmp(v3, PROC_OOM_SCORE_ADJ)) { fprintf(stderr, "%d: lxc.proc returned wrong value: %d %s not %d %s\n", __LINE__, ret, v3, (int)sizeof(PROC_OOM_SCORE_ADJ) - 1, PROC_OOM_SCORE_ADJ); goto out; @@ -376,6 +406,7 @@ int main(int argc, char *argv[]) fprintf(stderr, "%d: failed to set aa_profile\n", __LINE__); goto out; } + ret = c->get_config_item(c, "lxc.apparmor.profile", v2, 255); if (ret < 0) { fprintf(stderr, "%d: get_config_item(lxc.aa_profile) returned %d\n", __LINE__, ret); @@ -397,6 +428,7 @@ int main(int argc, char *argv[]) fprintf(stderr, "%d: error opening lxc_container %s\n", __LINE__, MYNAME); goto out; } + if (!c->createl(c, "busybox", NULL, NULL, 0, NULL)) { fprintf(stderr, "%d: failed to create a trusty container\n", __LINE__); goto out; @@ -414,17 +446,20 @@ int main(int argc, char *argv[]) fprintf(stderr, "%d: get_config_item(lxc.cap.drop) with NULL returned %d\n", __LINE__, ret); goto out; } + ret = c->get_config_item(c, "lxc.cap.drop", v1, 1); if (ret < 5 || ret > 255) { fprintf(stderr, "%d: get_config_item(lxc.cap.drop) returned %d\n", __LINE__, ret); goto out; } + ret = c->get_config_item(c, "lxc.cap.drop", v2, 255); if (ret < 0) { fprintf(stderr, "%d: get_config_item(lxc.cap.drop) returned %d %s\n", __LINE__, ret, v2); goto out; } printf("%d: get_config_item(lxc.cap.drop) returned %d %s\n", __LINE__, ret, v2); + ret = c->get_config_item(c, "lxc.net", v2, 255); if (ret < 0) { fprintf(stderr, "%d: get_config_item(lxc.net) returned %d\n", __LINE__, ret); @@ -436,18 +471,22 @@ int main(int argc, char *argv[]) fprintf(stderr, "%d: failed to set lxc.net.0.type\n", __LINE__); goto out; } + if (!c->set_config_item(c, "lxc.net.0.link", "lxcbr0")) { fprintf(stderr, "%d: failed to set network.link\n", __LINE__); goto out; } + if (!c->set_config_item(c, "lxc.net.0.flags", "up")) { fprintf(stderr, "%d: failed to set network.flags\n", __LINE__); goto out; } + if (!c->set_config_item(c, "lxc.net.0.hwaddr", "00:16:3e:xx:xx:xx")) { fprintf(stderr, "%d: failed to set network.hwaddr\n", __LINE__); goto out; } + if (!c->set_config_item(c, "lxc.net.0.ipv4.address", "10.2.3.4")) { fprintf(stderr, "%d: failed to set ipv4\n", __LINE__); goto out; @@ -458,10 +497,12 @@ int main(int argc, char *argv[]) fprintf(stderr, "%d: lxc.net.0.ipv4 returned %d\n", __LINE__, ret); goto out; } + if (!c->clear_config_item(c, "lxc.net.0.ipv4.address")) { fprintf(stderr, "%d: failed clearing all ipv4 entries\n", __LINE__); goto out; } + ret = c->get_config_item(c, "lxc.net.0.ipv4.address", v2, 255); if (ret != 0) { fprintf(stderr, "%d: after clearing ipv4 entries get_item(lxc.network.0.ipv4 returned %d\n", __LINE__, ret); @@ -478,10 +519,12 @@ int main(int argc, char *argv[]) fprintf(stderr, "%d: lxc.net.0.ipv4.gateway returned %d\n", __LINE__, ret); goto out; } + if (!c->set_config_item(c, "lxc.net.0.ipv4.gateway", "")) { fprintf(stderr, "%d: failed clearing ipv4.gateway\n", __LINE__); goto out; } + ret = c->get_config_item(c, "lxc.net.0.ipv4.gateway", v2, 255); if (ret != 0) { fprintf(stderr, "%d: after clearing ipv4.gateway get_item(lxc.network.0.ipv4.gateway returned %d\n", __LINE__, ret); @@ -494,6 +537,7 @@ int main(int argc, char *argv[]) goto out; } printf("%d: get_config_item (link) returned %d %s\n", __LINE__, ret, v2); + ret = c->get_config_item(c, "lxc.net.0.name", v2, 255); if (ret < 0) { fprintf(stderr, "%d: get_config_item returned %d\n", __LINE__, ret); @@ -505,6 +549,7 @@ int main(int argc, char *argv[]) fprintf(stderr, "%d: clear_config_item failed\n", __LINE__); goto out; } + ret = c->get_config_item(c, "lxc.net", v2, 255); if (ret != 0) { fprintf(stderr, "%d: network was not actually cleared (get_network returned %d)\n", __LINE__, ret); @@ -529,14 +574,17 @@ int main(int argc, char *argv[]) fprintf(stderr, "%d: failed clearing lxc.cgroup\n", __LINE__); goto out; } + if (!c->clear_config_item(c, "lxc.cap.drop")) { fprintf(stderr, "%d: failed clearing lxc.cap.drop\n", __LINE__); goto out; } + if (!c->clear_config_item(c, "lxc.mount.entry")) { fprintf(stderr, "%d: failed clearing lxc.mount.entry\n", __LINE__); goto out; } + if (!c->clear_config_item(c, "lxc.hook")) { fprintf(stderr, "%d: failed clearing lxc.hook\n", __LINE__); goto out; @@ -554,6 +602,7 @@ int main(int argc, char *argv[]) printf("All get_item tests passed\n"); fret = EXIT_SUCCESS; + out: if (c) { c->destroy(c); From af8660599a8fd983c5773dd2cc0574b6ff068d19 Mon Sep 17 00:00:00 2001 From: 2xsec Date: Tue, 3 Jul 2018 18:18:47 +0900 Subject: [PATCH 12/25] tests: cleanup getkeys.c Signed-off-by: 2xsec --- src/tests/getkeys.c | 1 + 1 file changed, 1 insertion(+) diff --git a/src/tests/getkeys.c b/src/tests/getkeys.c index a9299de311..c9e240dfdb 100644 --- a/src/tests/getkeys.c +++ b/src/tests/getkeys.c @@ -51,6 +51,7 @@ int main(int argc, char *argv[]) ret = 1; goto out; } + ret = c->get_keys(c, NULL, v3, len+1); if (ret != len) { fprintf(stderr, "%d: failed to get keys (%d)\n", __LINE__, ret); From f0353f8b0b30feb52609274865aac658f74e5f28 Mon Sep 17 00:00:00 2001 From: 2xsec Date: Tue, 3 Jul 2018 18:19:50 +0900 Subject: [PATCH 13/25] tests: cleanup list.c Signed-off-by: 2xsec --- src/tests/list.c | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/src/tests/list.c b/src/tests/list.c index 9641dccbb1..37f910e61f 100644 --- a/src/tests/list.c +++ b/src/tests/list.c @@ -31,17 +31,21 @@ static void test_list_func(const char *lxcpath, const char *type, char **names; printf("%-10s Counting containers\n", type); + n = func(lxcpath, NULL, NULL); printf("%-10s Counted %d containers\n", type, n); printf("%-10s Get container struct only\n", type); + n2 = func(lxcpath, NULL, &clist); if (n2 != n) printf("Warning: first call returned %d, second %d\n", n, n2); + for (i = 0; i < n2; i++) { struct lxc_container *c = clist[i]; printf("%-10s Got container struct %s\n", type, c->name); lxc_container_put(c); } + if (n2 > 0) { free(clist); clist = NULL; @@ -51,10 +55,12 @@ static void test_list_func(const char *lxcpath, const char *type, n2 = func(lxcpath, &names, NULL); if (n2 != n) printf("Warning: first call returned %d, second %d\n", n, n2); + for (i = 0; i < n2; i++) { printf("%-10s Got container name %s\n", type, names[i]); free(names[i]); } + if (n2 > 0) { free(names); names = NULL; @@ -64,14 +70,18 @@ static void test_list_func(const char *lxcpath, const char *type, n2 = func(lxcpath, &names, &clist); if (n2 != n) printf("Warning: first call returned %d, second %d\n", n, n2); + for (i = 0; i < n2; i++) { struct lxc_container *c = clist[i]; printf("%-10s Got container struct %s, name %s\n", type, c->name, names[i]); + if (strcmp(c->name, names[i])) fprintf(stderr, "ERROR: name mismatch!\n"); + free(names[i]); lxc_container_put(c); } + if (n2 > 0) { free(names); free(clist); From 3cc076dca1e59df26c0832e3970a1fff025257a3 Mon Sep 17 00:00:00 2001 From: 2xsec Date: Tue, 3 Jul 2018 18:20:44 +0900 Subject: [PATCH 14/25] tests: cleanup locktests.c Signed-off-by: 2xsec --- src/tests/locktests.c | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/src/tests/locktests.c b/src/tests/locktests.c index e2b8914dcf..cfec5f1bad 100644 --- a/src/tests/locktests.c +++ b/src/tests/locktests.c @@ -38,39 +38,49 @@ static void test_two_locks(void) if (pipe(p) < 0) exit(1); + if ((pid = fork()) < 0) exit(1); + if (pid == 0) { if (read(p[0], &c, 1) < 0) { perror("read"); exit(1); } + l = lxc_newlock("/tmp", "lxctest-sem"); if (!l) { fprintf(stderr, "%d: child: failed to create lock\n", __LINE__); exit(1); } + if (lxclock(l, 0) < 0) { fprintf(stderr, "%d: child: failed to grab lock\n", __LINE__); exit(1); } + fprintf(stderr, "%d: child: grabbed lock\n", __LINE__); exit(0); } + l = lxc_newlock("/tmp", "lxctest-sem"); if (!l) { fprintf(stderr, "%d: failed to create lock\n", __LINE__); exit(1); } + if (lxclock(l, 0) < 0) { fprintf(stderr, "%d; failed to get lock\n", __LINE__); exit(1); } + if (write(p[1], "a", 1) < 0) { perror("write"); exit(1); } + sleep(3); + ret = waitpid(pid, &status, WNOHANG); if (ret == pid) { // task exited if (WIFEXITED(status)) { @@ -85,6 +95,7 @@ static void test_two_locks(void) perror("waitpid"); exit(1); } + kill(pid, SIGKILL); wait(&status); close(p[1]); @@ -103,6 +114,7 @@ int main(int argc, char *argv[]) fprintf(stderr, "%d: failed to get unnamed lock\n", __LINE__); exit(1); } + ret = lxclock(lock, 0); if (ret) { fprintf(stderr, "%d: failed to take unnamed lock (%d)\n", __LINE__, ret); @@ -121,8 +133,10 @@ int main(int argc, char *argv[]) fprintf(stderr, "%d: failed to get lock\n", __LINE__); exit(1); } + struct stat sb; char *pathname = RUNTIME_PATH "/lxc/lock/var/lib/lxc/"; + ret = stat(pathname, &sb); if (ret != 0) { fprintf(stderr, "%d: filename %s not created\n", __LINE__, From b477d8303215ee163a3e3c119f4dbe549608cbad Mon Sep 17 00:00:00 2001 From: 2xsec Date: Tue, 3 Jul 2018 18:21:36 +0900 Subject: [PATCH 15/25] tests: cleanup lxc-test-utils.c Signed-off-by: 2xsec --- src/tests/lxc-test-utils.c | 24 ++++++++++++++++++++++++ 1 file changed, 24 insertions(+) diff --git a/src/tests/lxc-test-utils.c b/src/tests/lxc-test-utils.c index 4c628b063e..8a1ecc1dd7 100644 --- a/src/tests/lxc-test-utils.c +++ b/src/tests/lxc-test-utils.c @@ -49,6 +49,7 @@ void test_lxc_deslashify(void) t = lxc_deslashify(s); if (!t) exit(EXIT_FAILURE); + lxc_test_assert_abort(strcmp(t, "/A/B/C/D/E") == 0); free(t); @@ -57,6 +58,7 @@ void test_lxc_deslashify(void) t = lxc_deslashify(s); if (!t) exit(EXIT_FAILURE); + lxc_test_assert_abort(strcmp(t, "/A") == 0); free(t); @@ -64,6 +66,7 @@ void test_lxc_deslashify(void) t = lxc_deslashify(s); if (!t) exit(EXIT_FAILURE); + lxc_test_assert_abort(strcmp(t, "") == 0); free(t); @@ -72,6 +75,7 @@ void test_lxc_deslashify(void) t = lxc_deslashify(s); if (!t) exit(EXIT_FAILURE); + lxc_test_assert_abort(strcmp(t, "/") == 0); free(t); } @@ -188,6 +192,7 @@ void test_detect_ramfs_rootfs(void) for (i = 0; i < sizeof(mountinfo) / sizeof(mountinfo[0]); i++) { if (strcmp(mountinfo[i], "24 0 8:2 / / rw - rootfs rootfs rw,size=1004396k,nr_inodes=251099") == 0) continue; + if (fprintf(fp2, "%s\n", mountinfo[i]) < 0) { lxc_error("Could not write \"%s\" to temporary file.", mountinfo[i]); goto non_test_error; @@ -217,6 +222,7 @@ void test_detect_ramfs_rootfs(void) fclose(fp1); else if (fd1 > 0) close(fd1); + if (fp2) fclose(fp2); else if (fd2 > 0) @@ -229,8 +235,10 @@ void test_detect_ramfs_rootfs(void) } close(init_ns); } + if (fret == EXIT_SUCCESS) return; + exit(fret); } @@ -246,11 +254,13 @@ void test_lxc_safe_uint(void) ret = snprintf(numstr, LXC_NUMSTRLEN64, "%" PRIu64, (uint64_t)UINT_MAX); if (ret < 0 || ret >= LXC_NUMSTRLEN64) exit(EXIT_FAILURE); + lxc_test_assert_abort((0 == lxc_safe_uint(numstr, &n)) && n == UINT_MAX); ret = snprintf(numstr, LXC_NUMSTRLEN64, "%" PRIu64, (uint64_t)UINT_MAX + 1); if (ret < 0 || ret >= LXC_NUMSTRLEN64) exit(EXIT_FAILURE); + lxc_test_assert_abort((-ERANGE == lxc_safe_uint(numstr, &n))); lxc_test_assert_abort((0 == lxc_safe_uint("1234345", &n)) && n == 1234345); @@ -277,21 +287,25 @@ void test_lxc_safe_int(void) ret = snprintf(numstr, LXC_NUMSTRLEN64, "%" PRIu64, (uint64_t)INT_MAX); if (ret < 0 || ret >= LXC_NUMSTRLEN64) exit(EXIT_FAILURE); + lxc_test_assert_abort((0 == lxc_safe_int(numstr, &n)) && n == INT_MAX); ret = snprintf(numstr, LXC_NUMSTRLEN64, "%" PRIu64, (uint64_t)INT_MAX + 1); if (ret < 0 || ret >= LXC_NUMSTRLEN64) exit(EXIT_FAILURE); + lxc_test_assert_abort((-ERANGE == lxc_safe_int(numstr, &n))); ret = snprintf(numstr, LXC_NUMSTRLEN64, "%" PRId64, (int64_t)INT_MIN); if (ret < 0 || ret >= LXC_NUMSTRLEN64) exit(EXIT_FAILURE); + lxc_test_assert_abort((0 == lxc_safe_int(numstr, &n)) && n == INT_MIN); ret = snprintf(numstr, LXC_NUMSTRLEN64, "%" PRId64, (int64_t)INT_MIN - 1); if (ret < 0 || ret >= LXC_NUMSTRLEN64) exit(EXIT_FAILURE); + lxc_test_assert_abort((-ERANGE == lxc_safe_int(numstr, &n))); lxc_test_assert_abort((0 == lxc_safe_int("1234345", &n)) && n == 1234345); @@ -394,6 +408,7 @@ void test_parse_byte_size_string(void) lxc_error("%s\n", "Failed to parse \"0\""); exit(EXIT_FAILURE); } + if (n != 0) { lxc_error("%s\n", "Failed to parse \"0\""); exit(EXIT_FAILURE); @@ -404,6 +419,7 @@ void test_parse_byte_size_string(void) lxc_error("%s\n", "Failed to parse \"1\""); exit(EXIT_FAILURE); } + if (n != 1) { lxc_error("%s\n", "Failed to parse \"1\""); exit(EXIT_FAILURE); @@ -420,6 +436,7 @@ void test_parse_byte_size_string(void) lxc_error("%s\n", "Failed to parse \"1B\""); exit(EXIT_FAILURE); } + if (n != 1) { lxc_error("%s\n", "Failed to parse \"1B\""); exit(EXIT_FAILURE); @@ -430,6 +447,7 @@ void test_parse_byte_size_string(void) lxc_error("%s\n", "Failed to parse \"1kB\""); exit(EXIT_FAILURE); } + if (n != 1024) { lxc_error("%s\n", "Failed to parse \"1kB\""); exit(EXIT_FAILURE); @@ -440,6 +458,7 @@ void test_parse_byte_size_string(void) lxc_error("%s\n", "Failed to parse \"1MB\""); exit(EXIT_FAILURE); } + if (n != 1048576) { lxc_error("%s\n", "Failed to parse \"1MB\""); exit(EXIT_FAILURE); @@ -456,6 +475,7 @@ void test_parse_byte_size_string(void) lxc_error("%s\n", "Failed to parse \"1 B\""); exit(EXIT_FAILURE); } + if (n != 1) { lxc_error("%s\n", "Failed to parse \"1 B\""); exit(EXIT_FAILURE); @@ -466,6 +486,7 @@ void test_parse_byte_size_string(void) lxc_error("%s\n", "Failed to parse \"1 kB\""); exit(EXIT_FAILURE); } + if (n != 1024) { lxc_error("%s\n", "Failed to parse \"1 kB\""); exit(EXIT_FAILURE); @@ -476,6 +497,7 @@ void test_parse_byte_size_string(void) lxc_error("%s\n", "Failed to parse \"1 MB\""); exit(EXIT_FAILURE); } + if (n != 1048576) { lxc_error("%s\n", "Failed to parse \"1 MB\""); exit(EXIT_FAILURE); @@ -503,8 +525,10 @@ void test_lxc_config_net_hwaddr(void) if (lxc_config_net_hwaddr("lxc.net")) exit(EXIT_FAILURE); + if (lxc_config_net_hwaddr("lxc.net.")) exit(EXIT_FAILURE); + if (lxc_config_net_hwaddr("lxc.net.0.")) exit(EXIT_FAILURE); } From c3c504a8a9ccd0fe12163746d508508d9ebbac6e Mon Sep 17 00:00:00 2001 From: 2xsec Date: Tue, 3 Jul 2018 18:22:01 +0900 Subject: [PATCH 16/25] tests: cleanup lxc_raw_clone.c Signed-off-by: 2xsec --- src/tests/lxc_raw_clone.c | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/src/tests/lxc_raw_clone.c b/src/tests/lxc_raw_clone.c index 7790231411..ae38880a46 100644 --- a/src/tests/lxc_raw_clone.c +++ b/src/tests/lxc_raw_clone.c @@ -125,6 +125,7 @@ int main(int argc, char *argv[]) flags |= CLONE_NEWIPC; flags |= CLONE_NEWPID; flags |= CLONE_NEWUTS; + pid = lxc_raw_clone(flags); if (pid < 0) { lxc_error("%s\n", "Failed to call lxc_raw_clone(CLONE_NEWUSER " @@ -172,7 +173,6 @@ int main(int argc, char *argv[]) exit(EXIT_FAILURE); } - if (pid == 0) { lxc_error("%s\n", "Child will exit(EXIT_SUCCESS)"); exit(EXIT_SUCCESS); @@ -190,7 +190,6 @@ int main(int argc, char *argv[]) exit(EXIT_FAILURE); } - if (pid == 0) { lxc_error("%s\n", "Child will exit(EXIT_FAILURE)"); exit(EXIT_FAILURE); @@ -208,7 +207,6 @@ int main(int argc, char *argv[]) exit(EXIT_FAILURE); } - if (pid == 0) { lxc_error("%s\n", "Child will exit(EXIT_SUCCESS)"); exit(EXIT_SUCCESS); @@ -226,7 +224,6 @@ int main(int argc, char *argv[]) exit(EXIT_FAILURE); } - if (pid == 0) { lxc_error("%s\n", "Child will exit(EXIT_FAILURE)"); exit(EXIT_FAILURE); From 915af839db145bc0f56e6d0b3bd6da056d56b325 Mon Sep 17 00:00:00 2001 From: 2xsec Date: Tue, 3 Jul 2018 18:22:27 +0900 Subject: [PATCH 17/25] tests: cleanup lxcpath.c Signed-off-by: 2xsec --- src/tests/lxcpath.c | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/tests/lxcpath.c b/src/tests/lxcpath.c index 60189901c0..b5141b4644 100644 --- a/src/tests/lxcpath.c +++ b/src/tests/lxcpath.c @@ -44,6 +44,7 @@ int main() TSTERR("create using default path"); goto err; } + p1 = c->get_config_path(c); p2 = c->config_file_name(c); if (!p1 || !p2 || strncmp(p1, p2, strlen(p1))) { @@ -57,6 +58,7 @@ int main() TSTERR("Error setting custom path"); goto err; } + p1 = c->get_config_path(c); p2 = c->config_file_name(c); if (strcmp(p1, CPATH) || strcmp(p2, FPATH)) { From fe142896b622ceb4e4bdec834cb793e1d1ee07d6 Mon Sep 17 00:00:00 2001 From: 2xsec Date: Tue, 3 Jul 2018 18:22:48 +0900 Subject: [PATCH 18/25] tests: clenaup may_control.c Signed-off-by: 2xsec --- src/tests/may_control.c | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/tests/may_control.c b/src/tests/may_control.c index bb7000caac..2930deb2ad 100644 --- a/src/tests/may_control.c +++ b/src/tests/may_control.c @@ -35,12 +35,16 @@ int main(int argc, char *argv[]) if (argc < 2) usage(argv[0]); + name = argv[1]; + if (argc == 3) lxcpath = argv[2]; + c = lxc_container_new(name, lxcpath); if (c) may = c->may_control(c); + printf("You may%s control %s\n", may ? "" : " not", name); exit(may ? 0 : 1); } From 733666f840e8eecc4667db4afb2fa2935844ece7 Mon Sep 17 00:00:00 2001 From: 2xsec Date: Tue, 3 Jul 2018 18:23:12 +0900 Subject: [PATCH 19/25] tests: cleanup reboot.c Signed-off-by: 2xsec --- src/tests/reboot.c | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/tests/reboot.c b/src/tests/reboot.c index 1f059e0d78..9e9db2277e 100644 --- a/src/tests/reboot.c +++ b/src/tests/reboot.c @@ -41,6 +41,7 @@ static int do_reboot(void *arg) if (reboot(*cmd)) printf("failed to reboot(%d): %s\n", *cmd, strerror(errno)); + return 0; } @@ -65,6 +66,7 @@ static int test_reboot(int cmd, int sig) if (!WIFSIGNALED(status)) { if (sig != -1) printf("child process exited but was not signaled\n"); + return -1; } @@ -89,9 +91,11 @@ static int have_reboot_patch(void) fclose(f); if (ret != 1) return 0; + ret = reboot(v ? LINUX_REBOOT_CMD_CAD_ON : LINUX_REBOOT_CMD_CAD_OFF); if (ret != -1) return 0; + return 1; } From b4edca7c7c98363f56f21acde9024cded99b8914 Mon Sep 17 00:00:00 2001 From: 2xsec Date: Tue, 3 Jul 2018 18:23:48 +0900 Subject: [PATCH 20/25] tests: cleanup saveconfig.c Signed-off-by: 2xsec --- src/tests/saveconfig.c | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/src/tests/saveconfig.c b/src/tests/saveconfig.c index 58f4d24b6f..c73240223d 100644 --- a/src/tests/saveconfig.c +++ b/src/tests/saveconfig.c @@ -37,24 +37,30 @@ static int create_container(void) perror("fork"); return -1; } + if (pid == 0) { execlp("lxc-create", "lxc-create", "-t", "busybox", "-n", MYNAME, NULL); exit(EXIT_FAILURE); } + again: ret = waitpid(pid, &status, 0); if (ret == -1) { if (errno == EINTR) goto again; + perror("waitpid"); return -1; } + if (ret != pid) goto again; + if (!WIFEXITED(status)) { // did not exit normally fprintf(stderr, "%d: lxc-create exited abnormally\n", __LINE__); return -1; } + return WEXITSTATUS(status); } @@ -90,6 +96,7 @@ int main(int argc, char *argv[]) fprintf(stderr, "%d: failed writing config file /tmp/lxctest1\n", __LINE__); goto out; } + rename(LXCPATH "/" MYNAME "/config", LXCPATH "/" MYNAME "/config.bak"); if (!c->save_config(c, NULL)) { fprintf(stderr, "%d: failed writing config file\n", __LINE__); @@ -108,6 +115,7 @@ int main(int argc, char *argv[]) fprintf(stderr, "all lxc_container tests passed for %s\n", c->name); ret = 0; + out: lxc_container_put(c); exit(ret); From 0ce5c91e606070f8d01dbe4e362337708a690290 Mon Sep 17 00:00:00 2001 From: 2xsec Date: Tue, 3 Jul 2018 18:24:26 +0900 Subject: [PATCH 21/25] tests: cleanup shortlived.c Signed-off-by: 2xsec --- src/tests/shortlived.c | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/src/tests/shortlived.c b/src/tests/shortlived.c index 2a039a2f39..da2f04f769 100644 --- a/src/tests/shortlived.c +++ b/src/tests/shortlived.c @@ -46,10 +46,12 @@ static int destroy_container(void) perror("fork"); return -1; } + if (pid == 0) { execlp("lxc-destroy", "lxc-destroy", "-f", "-n", MYNAME, NULL); exit(EXIT_FAILURE); } + again: ret = waitpid(pid, &status, 0); if (ret == -1) { @@ -58,12 +60,15 @@ static int destroy_container(void) perror("waitpid"); return -1; } + if (ret != pid) goto again; + if (!WIFEXITED(status)) { // did not exit normally fprintf(stderr, "%d: lxc-create exited abnormally\n", __LINE__); return -1; } + return WEXITSTATUS(status); } @@ -76,24 +81,30 @@ static int create_container(void) perror("fork"); return -1; } + if (pid == 0) { execlp("lxc-create", "lxc-create", "-t", "busybox", "-n", MYNAME, NULL); exit(EXIT_FAILURE); } + again: ret = waitpid(pid, &status, 0); if (ret == -1) { if (errno == EINTR) goto again; + perror("waitpid"); return -1; } + if (ret != pid) goto again; + if (!WIFEXITED(status)) { // did not exit normally fprintf(stderr, "%d: lxc-create exited abnormally\n", __LINE__); return -1; } + return WEXITSTATUS(status); } @@ -124,6 +135,7 @@ int main(int argc, char *argv[]) log.prefix = "shortlived"; log.quiet = false; log.lxcpath = NULL; + if (lxc_log_init(&log)) exit(EXIT_FAILURE); @@ -256,11 +268,13 @@ int main(int argc, char *argv[]) if (fd >= 0) { char buf[4096]; ssize_t buflen; + while ((buflen = read(fd, buf, 1024)) > 0) { buflen = write(STDERR_FILENO, buf, buflen); if (buflen <= 0) break; } + close(fd); } } From 70b12b4a839d80d26bc84e9b0e236735c377ed2f Mon Sep 17 00:00:00 2001 From: 2xsec Date: Tue, 3 Jul 2018 18:25:02 +0900 Subject: [PATCH 22/25] tests: cleanup shutdowntest.c Signed-off-by: 2xsec --- src/tests/shutdowntest.c | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/src/tests/shutdowntest.c b/src/tests/shutdowntest.c index 00b18a45f7..cec6efc7bf 100644 --- a/src/tests/shutdowntest.c +++ b/src/tests/shutdowntest.c @@ -49,8 +49,10 @@ int main(int argc, char *argv[]) fprintf(stderr, "%d: failed to set network type\n", __LINE__); goto out; } + c->set_config_item(c, "lxc.net.0.link", "lxcbr0"); c->set_config_item(c, "lxc.net.0.flags", "up"); + if (!c->createl(c, "busybox", NULL, NULL, 0, NULL)) { fprintf(stderr, "%d: failed to create a container\n", __LINE__); goto out; @@ -64,6 +66,7 @@ int main(int argc, char *argv[]) c->clear_config(c); c->load_config(c, NULL); c->want_daemonize(c, true); + if (!c->startl(c, 0, NULL)) { fprintf(stderr, "%d: failed to start %s\n", __LINE__, MYNAME); goto out; @@ -74,9 +77,9 @@ int main(int argc, char *argv[]) if (!c->shutdown(c, 120)) { fprintf(stderr, "%d: failed to shut down %s\n", __LINE__, MYNAME); - if (!c->stop(c)) { + if (!c->stop(c)) fprintf(stderr, "%d: failed to kill %s\n", __LINE__, MYNAME); - } + goto out; } @@ -92,10 +95,10 @@ int main(int argc, char *argv[]) fprintf(stderr, "all lxc_container tests passed for %s\n", c->name); ret = 0; + out: - if (c && c->is_defined(c)) { + if (c && c->is_defined(c)) c->destroy(c); - } lxc_container_put(c); exit(ret); From 63f769f9c52d0a094ad1a93c47678c8a68ab4506 Mon Sep 17 00:00:00 2001 From: 2xsec Date: Tue, 3 Jul 2018 18:25:54 +0900 Subject: [PATCH 23/25] tests: cleanup snapshot.c Signed-off-by: 2xsec --- src/tests/snapshot.c | 21 +++++++++++++++++---- 1 file changed, 17 insertions(+), 4 deletions(-) diff --git a/src/tests/snapshot.c b/src/tests/snapshot.c index ed5643a7ab..1b7d7ab448 100644 --- a/src/tests/snapshot.c +++ b/src/tests/snapshot.c @@ -32,23 +32,28 @@ static void try_to_remove(void) { struct lxc_container *c; + c = lxc_container_new(RESTNAME, NULL); if (c) { c->snapshot_destroy_all(c); if (c->is_defined(c)) c->destroy(c); + lxc_container_put(c); } + c = lxc_container_new(MYNAME2, NULL); if (c) { c->destroy_with_snapshots(c); lxc_container_put(c); } + c = lxc_container_new(MYNAME, NULL); if (c) { c->snapshot_destroy_all(c); if (c->is_defined(c)) c->destroy(c); + lxc_container_put(c); } } @@ -66,6 +71,7 @@ int main(int argc, char *argv[]) template = argv[1]; try_to_remove(); + c = lxc_container_new(MYNAME, NULL); if (!c) { fprintf(stderr, "%s: %d: failed to load first container\n", __FILE__, __LINE__); @@ -76,15 +82,19 @@ int main(int argc, char *argv[]) fprintf(stderr, "%d: %s thought it was defined\n", __LINE__, MYNAME); (void) c->destroy_with_snapshots(c); } + if (!c->set_config_item(c, "lxc.net.0.type", "empty")) { fprintf(stderr, "%s: %d: failed to set network type\n", __FILE__, __LINE__); goto err; } + c->save_config(c, NULL); + if (!c->createl(c, template, NULL, NULL, 0, NULL)) { fprintf(stderr, "%s: %d: failed to create %s container\n", __FILE__, __LINE__, template); goto err; } + c->load_config(c, NULL); if (c->snapshot(c, NULL) != 0) { @@ -110,13 +120,14 @@ int main(int argc, char *argv[]) fprintf(stderr, "%s: %d: failed listing containers\n", __FILE__, __LINE__); goto err; } + if (strcmp(s->name, "snap0") != 0) { fprintf(stderr, "%s: %d: snapshot had bad name\n", __FILE__, __LINE__); goto err; } - for (i=0; isnapshot_restore(c, "snap0", RESTNAME)) { @@ -152,13 +163,14 @@ int main(int argc, char *argv[]) fprintf(stderr, "%s: %d: failed listing containers\n", __FILE__, __LINE__); goto err; } + if (strcmp(s->name, "snap0") != 0) { fprintf(stderr, "%s: %d: snapshot had bad name\n", __FILE__, __LINE__); goto err; } - for (i=0; isnapshot_restore(c2, "snap0", NULL)) { @@ -177,6 +189,7 @@ int main(int argc, char *argv[]) printf("All tests passed\n"); exit(0); + err: lxc_container_put(c); try_to_remove(); From dcfbd1c07b988cfbd690b3bc9491f1bb7ab6fd52 Mon Sep 17 00:00:00 2001 From: 2xsec Date: Tue, 3 Jul 2018 18:26:40 +0900 Subject: [PATCH 24/25] tests: cleanup startone.c Signed-off-by: 2xsec --- src/tests/startone.c | 16 +++++++++++++++- 1 file changed, 15 insertions(+), 1 deletion(-) diff --git a/src/tests/startone.c b/src/tests/startone.c index d8e82be813..86cdf4d586 100644 --- a/src/tests/startone.c +++ b/src/tests/startone.c @@ -39,24 +39,30 @@ static int destroy_container(void) perror("fork"); return -1; } + if (pid == 0) { execlp("lxc-destroy", "lxc-destroy", "-f", "-n", MYNAME, NULL); exit(EXIT_FAILURE); } + again: ret = waitpid(pid, &status, 0); if (ret == -1) { if (errno == EINTR) goto again; + perror("waitpid"); return -1; } + if (ret != pid) goto again; + if (!WIFEXITED(status)) { // did not exit normally fprintf(stderr, "%d: lxc-create exited abnormally\n", __LINE__); return -1; } + return WEXITSTATUS(status); } @@ -69,24 +75,30 @@ static int create_container(void) perror("fork"); return -1; } + if (pid == 0) { execlp("lxc-create", "lxc-create", "-t", "busybox", "-n", MYNAME, NULL); exit(EXIT_FAILURE); } + again: ret = waitpid(pid, &status, 0); if (ret == -1) { if (errno == EINTR) goto again; + perror("waitpid"); return -1; } + if (ret != pid) goto again; + if (!WIFEXITED(status)) { // did not exit normally fprintf(stderr, "%d: lxc-create exited abnormally\n", __LINE__); return -1; } + return WEXITSTATUS(status); } @@ -100,6 +112,7 @@ int main(int argc, char *argv[]) int len; ret = 1; + /* test a real container */ c = lxc_container_new(MYNAME, NULL); if (!c) { @@ -167,6 +180,7 @@ int main(int argc, char *argv[]) } sleep(3); + s = c->state(c); if (!s || strcmp(s, "RUNNING")) { fprintf(stderr, "%d: %s is in state %s, not in RUNNING.\n", __LINE__, c->name, s ? s : "undefined"); @@ -192,7 +206,7 @@ int main(int argc, char *argv[]) goto out; } - sprintf(buf, "XXX"); + sprintf(buf, "XXX"); len = c->get_cgroup_item(c, "freezer.state", buf, 200); if (len <= 0 || (strcmp(buf, "FREEZING\n") && strcmp(buf, "FROZEN\n"))) { fprintf(stderr, "%d: not able to get freezer.state (len %d buf %s)\n", __LINE__, len, buf); From 6ea8a4365bb265264bf2b0218efcd084df79b187 Mon Sep 17 00:00:00 2001 From: 2xsec Date: Tue, 3 Jul 2018 18:27:11 +0900 Subject: [PATCH 25/25] tests: cleanup state_server.c Signed-off-by: 2xsec --- src/tests/state_server.c | 1 + 1 file changed, 1 insertion(+) diff --git a/src/tests/state_server.c b/src/tests/state_server.c index c59da12d67..a814227ea0 100644 --- a/src/tests/state_server.c +++ b/src/tests/state_server.c @@ -149,5 +149,6 @@ int main(int argc, char *argv[]) lxc_container_put(c); if (ret == EXIT_SUCCESS) lxc_debug("%s\n", "All state server tests passed"); + exit(ret); }