diff mbox series

[PULL,v3,3/6] tests/9pfs: introduce local tests

Message ID 3a565c641a5c50bd6d0cb4df881b607a279505f6.1603111175.git.qemu_oss@crudebyte.com
State Superseded
Headers show
Series 9p queue (previous 2020-10-17) | expand

Commit Message

Christian Schoenebeck Oct. 8, 2020, 6:34 p.m. UTC
This patch introduces 9pfs test cases using the 9pfs 'local'
filesystem driver which reads/writes/creates/deletes real files
and directories.

In this initial version, there is only one local test which actually
only checks if the 9pfs 'local' device was created successfully.

Before the 9pfs 'local' tests are run, a test directory 'qtest-9p-local'
is created (with world rwx permissions) under the current working
directory. At this point that test directory is not auto deleted yet.

Signed-off-by: Christian Schoenebeck <qemu_oss@crudebyte.com>
Message-Id: <81fc4b3b6b6c9bf7999e79f5e7cbc364a5f09ddb.1602182956.git.qemu_oss@crudebyte.com>
Signed-off-by: Christian Schoenebeck <qemu_oss@crudebyte.com>
---
 tests/qtest/libqos/virtio-9p.c | 81 ++++++++++++++++++++++++++++++++++
 tests/qtest/libqos/virtio-9p.h |  5 +++
 tests/qtest/virtio-9p-test.c   | 44 ++++++++++++------
 3 files changed, 116 insertions(+), 14 deletions(-)

Comments

Greg Kurz Oct. 29, 2020, 6:02 p.m. UTC | #1
On Thu, 8 Oct 2020 20:34:56 +0200
Christian Schoenebeck <qemu_oss@crudebyte.com> wrote:

> This patch introduces 9pfs test cases using the 9pfs 'local'
> filesystem driver which reads/writes/creates/deletes real files
> and directories.
> 
> In this initial version, there is only one local test which actually
> only checks if the 9pfs 'local' device was created successfully.
> 
> Before the 9pfs 'local' tests are run, a test directory 'qtest-9p-local'
> is created (with world rwx permissions) under the current working
> directory. At this point that test directory is not auto deleted yet.
> 
> Signed-off-by: Christian Schoenebeck <qemu_oss@crudebyte.com>
> Message-Id: <81fc4b3b6b6c9bf7999e79f5e7cbc364a5f09ddb.1602182956.git.qemu_oss@crudebyte.com>
> Signed-off-by: Christian Schoenebeck <qemu_oss@crudebyte.com>
> ---
>  tests/qtest/libqos/virtio-9p.c | 81 ++++++++++++++++++++++++++++++++++
>  tests/qtest/libqos/virtio-9p.h |  5 +++
>  tests/qtest/virtio-9p-test.c   | 44 ++++++++++++------
>  3 files changed, 116 insertions(+), 14 deletions(-)
> 
> diff --git a/tests/qtest/libqos/virtio-9p.c b/tests/qtest/libqos/virtio-9p.c
> index 2e300063e3..ee331166de 100644
> --- a/tests/qtest/libqos/virtio-9p.c
> +++ b/tests/qtest/libqos/virtio-9p.c
> @@ -24,6 +24,34 @@
>  #include "qgraph.h"
>  
>  static QGuestAllocator *alloc;
> +static char *local_test_path;
> +
> +/* Concatenates the passed 2 pathes. Returned result must be freed. */
> +static char *concat_path(const char* a, const char* b)
> +{
> +    return g_build_filename(a, b, NULL);
> +}
> +
> +static void init_local_test_path(void)
> +{
> +    char *pwd = g_get_current_dir();
> +    local_test_path = concat_path(pwd, "qtest-9p-local");
> +    g_free(pwd);
> +}
> +
> +/* Creates the directory for the 9pfs 'local' filesystem driver to access. */
> +static void create_local_test_dir(void)
> +{
> +    struct stat st;
> +
> +    g_assert(local_test_path != NULL);
> +    mkdir(local_test_path, 0777);
> +

This makes coverity unhappy...

*** CID 1435963:  Error handling issues  (CHECKED_RETURN)
/qemu/tests/qtest/libqos/virtio-9p.c: 48 in create_local_test_dir()
42     /* Creates the directory for the 9pfs 'local' filesystem driver to access. */
43     static void create_local_test_dir(void)
44     {
45         struct stat st;
46     
47         g_assert(local_test_path != NULL);
>>>     CID 1435963:  Error handling issues  (CHECKED_RETURN)
>>>     Calling "mkdir(local_test_path, 511U)" without checking return value. This library function may fail and return an error code.  
48         mkdir(local_test_path, 0777);
49     
50         /* ensure test directory exists now ... */
51         g_assert(stat(local_test_path, &st) == 0);
52         /* ... and is actually a directory */
53         g_assert((st.st_mode & S_IFMT) == S_IFDIR);

> +    /* ensure test directory exists now ... */
> +    g_assert(stat(local_test_path, &st) == 0);
> +    /* ... and is actually a directory */
> +    g_assert((st.st_mode & S_IFMT) == S_IFDIR);
> +}
>  
>  static void virtio_9p_cleanup(QVirtio9P *interface)
>  {
> @@ -146,11 +174,64 @@ static void *virtio_9p_pci_create(void *pci_bus, QGuestAllocator *t_alloc,
>      return obj;
>  }
>  
> +/**
> + * Performs regular expression based search and replace on @a haystack.
> + *
> + * @param haystack - input string to be parsed, result of replacement is
> + *                   stored back to @a haystack
> + * @param pattern - the regular expression pattern for scanning @a haystack
> + * @param replace_fmt - matches of supplied @a pattern are replaced by this,
> + *                      if necessary glib printf format can be used to add
> + *                      variable arguments of this function to this
> + *                      replacement string
> + */
> +static void regex_replace(GString *haystack, const char *pattern,
> +                          const char *replace_fmt, ...)
> +{
> +    GRegex *regex;
> +    char *replace, *s;
> +    va_list argp;
> +
> +    va_start(argp, replace_fmt);
> +    replace = g_strdup_vprintf(replace_fmt, argp);
> +    va_end(argp);
> +
> +    regex = g_regex_new(pattern, 0, 0, NULL);
> +    s = g_regex_replace(regex, haystack->str, -1, 0, replace, 0, NULL);
> +    g_string_assign(haystack, s);
> +    g_free(s);
> +    g_regex_unref(regex);
> +    g_free(replace);
> +}
> +
> +void virtio_9p_assign_local_driver(GString *cmd_line, const char *args)
> +{
> +    g_assert_nonnull(local_test_path);
> +
> +    /* replace 'synth' driver by 'local' driver */
> +    regex_replace(cmd_line, "-fsdev synth,", "-fsdev local,");
> +
> +    /* append 'path=...' to '-fsdev ...' group */
> +    regex_replace(cmd_line, "(-fsdev \\w[^ ]*)", "\\1,path='%s'",
> +                  local_test_path);
> +
> +    if (!args) {
> +        return;
> +    }
> +
> +    /* append passed args to '-fsdev ...' group */
> +    regex_replace(cmd_line, "(-fsdev \\w[^ ]*)", "\\1,%s", args);
> +}
> +
>  static void virtio_9p_register_nodes(void)
>  {
>      const char *str_simple = "fsdev=fsdev0,mount_tag=" MOUNT_TAG;
>      const char *str_addr = "fsdev=fsdev0,addr=04.0,mount_tag=" MOUNT_TAG;
>  
> +    /* make sure test dir for the 'local' tests exists and is clean */
> +    init_local_test_path();
> +    create_local_test_dir();
> +
>      QPCIAddress addr = {
>          .devfn = QPCI_DEVFN(4, 0),
>      };
> diff --git a/tests/qtest/libqos/virtio-9p.h b/tests/qtest/libqos/virtio-9p.h
> index b1e6badc4a..326a603f72 100644
> --- a/tests/qtest/libqos/virtio-9p.h
> +++ b/tests/qtest/libqos/virtio-9p.h
> @@ -44,4 +44,9 @@ struct QVirtio9PDevice {
>      QVirtio9P v9p;
>  };
>  
> +/**
> + * Prepares QEMU command line for 9pfs tests using the 'local' fs driver.
> + */
> +void virtio_9p_assign_local_driver(GString *cmd_line, const char *args);
> +
>  #endif
> diff --git a/tests/qtest/virtio-9p-test.c b/tests/qtest/virtio-9p-test.c
> index 3281153b9c..af7e169d3a 100644
> --- a/tests/qtest/virtio-9p-test.c
> +++ b/tests/qtest/virtio-9p-test.c
> @@ -895,29 +895,45 @@ static void fs_readdir_split_512(void *obj, void *data,
>      fs_readdir_split(obj, data, t_alloc, 512);
>  }
>  
> +static void *assign_9p_local_driver(GString *cmd_line, void *arg)
> +{
> +    virtio_9p_assign_local_driver(cmd_line, "security_model=mapped-xattr");
> +    return arg;
> +}
> +
>  static void register_virtio_9p_test(void)
>  {
> -    qos_add_test("synth/config", "virtio-9p", pci_config, NULL);
> -    qos_add_test("synth/version/basic", "virtio-9p", fs_version, NULL);
> -    qos_add_test("synth/attach/basic", "virtio-9p", fs_attach, NULL);
> -    qos_add_test("synth/walk/basic", "virtio-9p", fs_walk, NULL);
> +
> +    QOSGraphTestOptions opts = {
> +    };
> +
> +    /* 9pfs test cases using the 'synth' filesystem driver */
> +    qos_add_test("synth/config", "virtio-9p", pci_config, &opts);
> +    qos_add_test("synth/version/basic", "virtio-9p", fs_version,  &opts);
> +    qos_add_test("synth/attach/basic", "virtio-9p", fs_attach,  &opts);
> +    qos_add_test("synth/walk/basic", "virtio-9p", fs_walk,  &opts);
>      qos_add_test("synth/walk/no_slash", "virtio-9p", fs_walk_no_slash,
> -                 NULL);
> +                  &opts);
>      qos_add_test("synth/walk/dotdot_from_root", "virtio-9p",
> -                 fs_walk_dotdot, NULL);
> -    qos_add_test("synth/lopen/basic", "virtio-9p", fs_lopen, NULL);
> -    qos_add_test("synth/write/basic", "virtio-9p", fs_write, NULL);
> +                 fs_walk_dotdot,  &opts);
> +    qos_add_test("synth/lopen/basic", "virtio-9p", fs_lopen,  &opts);
> +    qos_add_test("synth/write/basic", "virtio-9p", fs_write,  &opts);
>      qos_add_test("synth/flush/success", "virtio-9p", fs_flush_success,
> -                 NULL);
> +                  &opts);
>      qos_add_test("synth/flush/ignored", "virtio-9p", fs_flush_ignored,
> -                 NULL);
> -    qos_add_test("synth/readdir/basic", "virtio-9p", fs_readdir, NULL);
> +                  &opts);
> +    qos_add_test("synth/readdir/basic", "virtio-9p", fs_readdir,  &opts);
>      qos_add_test("synth/readdir/split_512", "virtio-9p",
> -                 fs_readdir_split_512, NULL);
> +                 fs_readdir_split_512,  &opts);
>      qos_add_test("synth/readdir/split_256", "virtio-9p",
> -                 fs_readdir_split_256, NULL);
> +                 fs_readdir_split_256,  &opts);
>      qos_add_test("synth/readdir/split_128", "virtio-9p",
> -                 fs_readdir_split_128, NULL);
> +                 fs_readdir_split_128,  &opts);
> +
> +
> +    /* 9pfs test cases using the 'local' filesystem driver */
> +    opts.before = assign_9p_local_driver;
> +    qos_add_test("local/config", "virtio-9p", pci_config,  &opts);
>  }
>  
>  libqos_init(register_virtio_9p_test);
Christian Schoenebeck Oct. 29, 2020, 6:16 p.m. UTC | #2
On Donnerstag, 29. Oktober 2020 19:02:34 CET Greg Kurz wrote:
> On Thu, 8 Oct 2020 20:34:56 +0200

> 

> Christian Schoenebeck <qemu_oss@crudebyte.com> wrote:

> > This patch introduces 9pfs test cases using the 9pfs 'local'

> > filesystem driver which reads/writes/creates/deletes real files

> > and directories.

> > 

> > In this initial version, there is only one local test which actually

> > only checks if the 9pfs 'local' device was created successfully.

> > 

> > Before the 9pfs 'local' tests are run, a test directory 'qtest-9p-local'

> > is created (with world rwx permissions) under the current working

> > directory. At this point that test directory is not auto deleted yet.

> > 

> > Signed-off-by: Christian Schoenebeck <qemu_oss@crudebyte.com>

> > Message-Id:

> > <81fc4b3b6b6c9bf7999e79f5e7cbc364a5f09ddb.1602182956.git.qemu_oss@crudeby

> > te.com> Signed-off-by: Christian Schoenebeck <qemu_oss@crudebyte.com>

> > ---

> > 

> >  tests/qtest/libqos/virtio-9p.c | 81 ++++++++++++++++++++++++++++++++++

> >  tests/qtest/libqos/virtio-9p.h |  5 +++

> >  tests/qtest/virtio-9p-test.c   | 44 ++++++++++++------

> >  3 files changed, 116 insertions(+), 14 deletions(-)

> > 

> > diff --git a/tests/qtest/libqos/virtio-9p.c

> > b/tests/qtest/libqos/virtio-9p.c index 2e300063e3..ee331166de 100644

> > --- a/tests/qtest/libqos/virtio-9p.c

> > +++ b/tests/qtest/libqos/virtio-9p.c

> > @@ -24,6 +24,34 @@

> > 

> >  #include "qgraph.h"

> >  

> >  static QGuestAllocator *alloc;

> > 

> > +static char *local_test_path;

> > +

> > +/* Concatenates the passed 2 pathes. Returned result must be freed. */

> > +static char *concat_path(const char* a, const char* b)

> > +{

> > +    return g_build_filename(a, b, NULL);

> > +}

> > +

> > +static void init_local_test_path(void)

> > +{

> > +    char *pwd = g_get_current_dir();

> > +    local_test_path = concat_path(pwd, "qtest-9p-local");

> > +    g_free(pwd);

> > +}

> > +

> > +/* Creates the directory for the 9pfs 'local' filesystem driver to

> > access. */ +static void create_local_test_dir(void)

> > +{

> > +    struct stat st;

> > +

> > +    g_assert(local_test_path != NULL);

> > +    mkdir(local_test_path, 0777);

> > +

> 

> This makes coverity unhappy...

> 

> *** CID 1435963:  Error handling issues  (CHECKED_RETURN)

> /qemu/tests/qtest/libqos/virtio-9p.c: 48 in create_local_test_dir()

> 42     /* Creates the directory for the 9pfs 'local' filesystem driver to

> access. */ 43     static void create_local_test_dir(void)

> 44     {

> 45         struct stat st;

> 46

> 47         g_assert(local_test_path != NULL);

> 

> >>>     CID 1435963:  Error handling issues  (CHECKED_RETURN)

> >>>     Calling "mkdir(local_test_path, 511U)" without checking return

> >>>     value. This library function may fail and return an error code.

> 48         mkdir(local_test_path, 0777);

> 49

> 50         /* ensure test directory exists now ... */

> 51         g_assert(stat(local_test_path, &st) == 0);

> 52         /* ... and is actually a directory */

> 53         g_assert((st.st_mode & S_IFMT) == S_IFDIR);

> 

> > +    /* ensure test directory exists now ... */

> > +    g_assert(stat(local_test_path, &st) == 0);

> > +    /* ... and is actually a directory */

> > +    g_assert((st.st_mode & S_IFMT) == S_IFDIR);

> > +}

> > 


Ok, I'll fix that with tomorrow's patch(es) as well.

Best regards,
Christian Schoenebeck
diff mbox series

Patch

diff --git a/tests/qtest/libqos/virtio-9p.c b/tests/qtest/libqos/virtio-9p.c
index 2e300063e3..ee331166de 100644
--- a/tests/qtest/libqos/virtio-9p.c
+++ b/tests/qtest/libqos/virtio-9p.c
@@ -24,6 +24,34 @@ 
 #include "qgraph.h"
 
 static QGuestAllocator *alloc;
+static char *local_test_path;
+
+/* Concatenates the passed 2 pathes. Returned result must be freed. */
+static char *concat_path(const char* a, const char* b)
+{
+    return g_build_filename(a, b, NULL);
+}
+
+static void init_local_test_path(void)
+{
+    char *pwd = g_get_current_dir();
+    local_test_path = concat_path(pwd, "qtest-9p-local");
+    g_free(pwd);
+}
+
+/* Creates the directory for the 9pfs 'local' filesystem driver to access. */
+static void create_local_test_dir(void)
+{
+    struct stat st;
+
+    g_assert(local_test_path != NULL);
+    mkdir(local_test_path, 0777);
+
+    /* ensure test directory exists now ... */
+    g_assert(stat(local_test_path, &st) == 0);
+    /* ... and is actually a directory */
+    g_assert((st.st_mode & S_IFMT) == S_IFDIR);
+}
 
 static void virtio_9p_cleanup(QVirtio9P *interface)
 {
@@ -146,11 +174,64 @@  static void *virtio_9p_pci_create(void *pci_bus, QGuestAllocator *t_alloc,
     return obj;
 }
 
+/**
+ * Performs regular expression based search and replace on @a haystack.
+ *
+ * @param haystack - input string to be parsed, result of replacement is
+ *                   stored back to @a haystack
+ * @param pattern - the regular expression pattern for scanning @a haystack
+ * @param replace_fmt - matches of supplied @a pattern are replaced by this,
+ *                      if necessary glib printf format can be used to add
+ *                      variable arguments of this function to this
+ *                      replacement string
+ */
+static void regex_replace(GString *haystack, const char *pattern,
+                          const char *replace_fmt, ...)
+{
+    GRegex *regex;
+    char *replace, *s;
+    va_list argp;
+
+    va_start(argp, replace_fmt);
+    replace = g_strdup_vprintf(replace_fmt, argp);
+    va_end(argp);
+
+    regex = g_regex_new(pattern, 0, 0, NULL);
+    s = g_regex_replace(regex, haystack->str, -1, 0, replace, 0, NULL);
+    g_string_assign(haystack, s);
+    g_free(s);
+    g_regex_unref(regex);
+    g_free(replace);
+}
+
+void virtio_9p_assign_local_driver(GString *cmd_line, const char *args)
+{
+    g_assert_nonnull(local_test_path);
+
+    /* replace 'synth' driver by 'local' driver */
+    regex_replace(cmd_line, "-fsdev synth,", "-fsdev local,");
+
+    /* append 'path=...' to '-fsdev ...' group */
+    regex_replace(cmd_line, "(-fsdev \\w[^ ]*)", "\\1,path='%s'",
+                  local_test_path);
+
+    if (!args) {
+        return;
+    }
+
+    /* append passed args to '-fsdev ...' group */
+    regex_replace(cmd_line, "(-fsdev \\w[^ ]*)", "\\1,%s", args);
+}
+
 static void virtio_9p_register_nodes(void)
 {
     const char *str_simple = "fsdev=fsdev0,mount_tag=" MOUNT_TAG;
     const char *str_addr = "fsdev=fsdev0,addr=04.0,mount_tag=" MOUNT_TAG;
 
+    /* make sure test dir for the 'local' tests exists and is clean */
+    init_local_test_path();
+    create_local_test_dir();
+
     QPCIAddress addr = {
         .devfn = QPCI_DEVFN(4, 0),
     };
diff --git a/tests/qtest/libqos/virtio-9p.h b/tests/qtest/libqos/virtio-9p.h
index b1e6badc4a..326a603f72 100644
--- a/tests/qtest/libqos/virtio-9p.h
+++ b/tests/qtest/libqos/virtio-9p.h
@@ -44,4 +44,9 @@  struct QVirtio9PDevice {
     QVirtio9P v9p;
 };
 
+/**
+ * Prepares QEMU command line for 9pfs tests using the 'local' fs driver.
+ */
+void virtio_9p_assign_local_driver(GString *cmd_line, const char *args);
+
 #endif
diff --git a/tests/qtest/virtio-9p-test.c b/tests/qtest/virtio-9p-test.c
index 3281153b9c..af7e169d3a 100644
--- a/tests/qtest/virtio-9p-test.c
+++ b/tests/qtest/virtio-9p-test.c
@@ -895,29 +895,45 @@  static void fs_readdir_split_512(void *obj, void *data,
     fs_readdir_split(obj, data, t_alloc, 512);
 }
 
+static void *assign_9p_local_driver(GString *cmd_line, void *arg)
+{
+    virtio_9p_assign_local_driver(cmd_line, "security_model=mapped-xattr");
+    return arg;
+}
+
 static void register_virtio_9p_test(void)
 {
-    qos_add_test("synth/config", "virtio-9p", pci_config, NULL);
-    qos_add_test("synth/version/basic", "virtio-9p", fs_version, NULL);
-    qos_add_test("synth/attach/basic", "virtio-9p", fs_attach, NULL);
-    qos_add_test("synth/walk/basic", "virtio-9p", fs_walk, NULL);
+
+    QOSGraphTestOptions opts = {
+    };
+
+    /* 9pfs test cases using the 'synth' filesystem driver */
+    qos_add_test("synth/config", "virtio-9p", pci_config, &opts);
+    qos_add_test("synth/version/basic", "virtio-9p", fs_version,  &opts);
+    qos_add_test("synth/attach/basic", "virtio-9p", fs_attach,  &opts);
+    qos_add_test("synth/walk/basic", "virtio-9p", fs_walk,  &opts);
     qos_add_test("synth/walk/no_slash", "virtio-9p", fs_walk_no_slash,
-                 NULL);
+                  &opts);
     qos_add_test("synth/walk/dotdot_from_root", "virtio-9p",
-                 fs_walk_dotdot, NULL);
-    qos_add_test("synth/lopen/basic", "virtio-9p", fs_lopen, NULL);
-    qos_add_test("synth/write/basic", "virtio-9p", fs_write, NULL);
+                 fs_walk_dotdot,  &opts);
+    qos_add_test("synth/lopen/basic", "virtio-9p", fs_lopen,  &opts);
+    qos_add_test("synth/write/basic", "virtio-9p", fs_write,  &opts);
     qos_add_test("synth/flush/success", "virtio-9p", fs_flush_success,
-                 NULL);
+                  &opts);
     qos_add_test("synth/flush/ignored", "virtio-9p", fs_flush_ignored,
-                 NULL);
-    qos_add_test("synth/readdir/basic", "virtio-9p", fs_readdir, NULL);
+                  &opts);
+    qos_add_test("synth/readdir/basic", "virtio-9p", fs_readdir,  &opts);
     qos_add_test("synth/readdir/split_512", "virtio-9p",
-                 fs_readdir_split_512, NULL);
+                 fs_readdir_split_512,  &opts);
     qos_add_test("synth/readdir/split_256", "virtio-9p",
-                 fs_readdir_split_256, NULL);
+                 fs_readdir_split_256,  &opts);
     qos_add_test("synth/readdir/split_128", "virtio-9p",
-                 fs_readdir_split_128, NULL);
+                 fs_readdir_split_128,  &opts);
+
+
+    /* 9pfs test cases using the 'local' filesystem driver */
+    opts.before = assign_9p_local_driver;
+    qos_add_test("local/config", "virtio-9p", pci_config,  &opts);
 }
 
 libqos_init(register_virtio_9p_test);