]> git.ipfire.org Git - thirdparty/lxc.git/commitdiff
tests: add tests for umount
authorLiza Tretyakova <elizabet.tretyakova@gmail.com>
Sat, 12 May 2018 10:59:22 +0000 (13:59 +0300)
committerChristian Brauner <christian.brauner@ubuntu.com>
Sun, 22 Jul 2018 13:33:01 +0000 (15:33 +0200)
Signed-off-by: Liza Tretyakova <elizabet.tretyakova@gmail.com>
src/tests/mount_injection.c

index 677fd937bc4bda7638ddeb725b9509ed36c3e094..7f999ebe35c6e8f9a770055241e025a6dfe4bd8b 100644 (file)
 #define NAME "mount_injection_test-"
 #define TEMPLATE P_tmpdir"/mount_injection_XXXXXX"
 
-struct mountinfo_strings {
+struct mountinfo_data {
        const char *mount_root;
        const char *mount_point;
        const char *fstype;
        const char *mount_source;
        const char *message;
+       bool should_be_present;
 };
 
 static int comp_field(char *line, const char *str, int nfields)
@@ -72,29 +73,33 @@ static int find_in_proc_mounts(void *data)
 {
        char buf[LXC_LINELEN];
        FILE *f;
-       struct mountinfo_strings *strs = (struct mountinfo_strings *) data;
+       struct mountinfo_data *mdata = (struct mountinfo_data *) data;
 
-       fprintf(stderr, "%s", strs->message);
+       fprintf(stderr, "%s", mdata->message);
 
        f = fopen("/proc/self/mountinfo", "r");
        if (!f)
                return 0;
        while (fgets(buf, LXC_LINELEN, f)) {
-               if (comp_field(buf, strs->mount_root, 3) == 0 && comp_field(buf, strs->mount_point, 4) == 0) {
+               if (comp_field(buf, mdata->mount_root, 3) == 0 && comp_field(buf, mdata->mount_point, 4) == 0) {
                        char *buf2 = strchr(buf, '-');
-                       if (comp_field(buf2, strs->fstype, 1) == 0 && comp_field(buf2, strs->mount_source, 2) == 0) {
+                       if (comp_field(buf2, mdata->fstype, 1) == 0 && comp_field(buf2, mdata->mount_source, 2) == 0) {
                                fclose(f);
-                               fprintf(stderr, "OK\n");
-                               _exit(EXIT_SUCCESS);
+                               fprintf(stderr, "PRESENT\n");
+                               if (mdata->should_be_present)
+                                       _exit(EXIT_SUCCESS);
+                               _exit(EXIT_FAILURE);
                        }
                }
        }
        fclose(f);
-       fprintf(stderr, "ERR\n");
+       fprintf(stderr, "MISSING\n");
+       if (!mdata->should_be_present)
+               _exit(EXIT_SUCCESS);
        _exit(EXIT_FAILURE);
 }
 
-static int check_containers_mountinfo(struct lxc_container *c, struct mountinfo_strings *d)
+static int check_containers_mountinfo(struct lxc_container *c, struct mountinfo_data *d)
 {
        pid_t pid;
        int ret = -1;
@@ -126,18 +131,20 @@ static int perform_container_test(const char *name, const char *config_items[])
        struct lxc_log log;
        int ret = -1, dev_msg_size = sizeof("Check urandom device injected into "" - ") - 1 + strlen(name) + 1,
                        dir_msg_size = sizeof("Check dir "" injected into "" - ") - 1 + sizeof(TEMPLATE) - 1 + strlen(name) + 1;
-       struct mountinfo_strings device = {
+       struct mountinfo_data device = {
                .mount_root = "/",
                .mount_point = "/mnt/mount_injection_test_urandom",
                .fstype = "devtmpfs",
                .mount_source = "/dev/urandom",
-               .message = ""
+               .message = "",
+               .should_be_present = true
        }, dir = {
                .mount_root = template_dir,
                .mount_point = template_dir,
                .fstype = "ext4",
                .mount_source = NULL,
-               .message = ""
+               .message = "",
+               .should_be_present = true
        };
 
        /* Temp paths and messages setup */
@@ -222,6 +229,20 @@ static int perform_container_test(const char *name, const char *config_items[])
                goto out;
        }
 
+       ret = check_containers_mountinfo(c, &device);
+       if (ret < 0)
+               goto out;
+
+       /* Check device unmounted */
+       /* TODO: what about other umount flags? */
+       ret = c->umount(c, "/mnt/mount_injection_test_urandom", MNT_DETACH, &mnt);
+       if (ret < 0) {
+               fprintf(stderr, "Failed to umount2 \"/dev/urandom\"\n");
+               goto out;
+       }
+
+       device.message = "Unmounted \"/mnt/mount_injection_test_urandom\" -- should be missing now: ";
+       device.should_be_present = false;
        ret = check_containers_mountinfo(c, &device);
        if (ret < 0)
                goto out;
@@ -237,6 +258,21 @@ static int perform_container_test(const char *name, const char *config_items[])
        if (ret < 0)
                goto out;
 
+       /* Check dir unmounted */
+       /* TODO: what about other umount flags? */
+       ret = c->umount(c, template_dir, MNT_DETACH, &mnt);
+       if (ret < 0) {
+               fprintf(stderr, "Failed to umount2 \"%s\"\n", template_dir);
+               goto out;
+       }
+
+       dir.message = "Unmounted dir -- should be missing now: ";
+       dir.should_be_present = false;
+       ret = check_containers_mountinfo(c, &dir);
+       if (ret < 0)
+               goto out;
+
+       /* Finalize the container */
        if (!c->stop(c)) {
                fprintf(stderr, "Stopping the container (%s) failed...\n", name);
                goto out;