On Tue, 2021-10-19 at 17:07 +0200, Gaëtan Rivet wrote:
> On Tue, Oct 5, 2021, at 17:54, Xueming Li wrote:
> > Initial version to test Global devargs syntax.
> > 
> > Signed-off-by: Xueming Li <xuemi...@nvidia.com>
> 
> Hi,
> 
> The test is a very nice addition, absolutely required.
> I have however two remarks on the coverage and the implementation, below.
> 
> > ---
> >  app/test/autotest_data.py |   6 ++
> >  app/test/meson.build      |   2 +
> >  app/test/test_devargs.c   | 147 ++++++++++++++++++++++++++++++++++++++
> >  3 files changed, 155 insertions(+)
> >  create mode 100644 app/test/test_devargs.c
> > 
> > diff --git a/app/test/autotest_data.py b/app/test/autotest_data.py
> > index 302d6374c16..3b841e71918 100644
> > --- a/app/test/autotest_data.py
> > +++ b/app/test/autotest_data.py
> > @@ -785,6 +785,12 @@
> >          "Func":    default_autotest,
> >          "Report":  None,
> >      },
> > +    {
> > +        "Name":    "Devargs autotest",
> > +        "Command": "devargs_autotest",
> > +        "Func":    default_autotest,
> > +        "Report":  None,
> > +    },
> >      #
> >      # Please always make sure that ring_perf is the last test!
> >      #
> > diff --git a/app/test/meson.build b/app/test/meson.build
> > index f144d8b8ed6..de8540f6119 100644
> > --- a/app/test/meson.build
> > +++ b/app/test/meson.build
> > @@ -42,6 +42,7 @@ test_sources = files(
> >          'test_cryptodev_security_pdcp.c',
> >          'test_cycles.c',
> >          'test_debug.c',
> > +        'test_devargs.c',
> >          'test_distributor.c',
> >          'test_distributor_perf.c',
> >          'test_eal_flags.c',
> > @@ -201,6 +202,7 @@ fast_tests = [
> >          ['common_autotest', true],
> >          ['cpuflags_autotest', true],
> >          ['debug_autotest', true],
> > +        ['devargs_autotest', true],
> >          ['eal_flags_c_opt_autotest', false],
> >          ['eal_flags_main_opt_autotest', false],
> >          ['eal_flags_n_opt_autotest', false],
> > diff --git a/app/test/test_devargs.c b/app/test/test_devargs.c
> > new file mode 100644
> > index 00000000000..8a173368347
> > --- /dev/null
> > +++ b/app/test/test_devargs.c
> > @@ -0,0 +1,147 @@
> > +/* SPDX-License-Identifier: BSD-3-Clause
> > + * Copyright (c) 2021 NVIDIA Corporation & Affiliates
> > + */
> > +
> > +#include <stdlib.h>
> > +#include <stdio.h>
> > +#include <string.h>
> > +
> > +#include <rte_common.h>
> > +#include <rte_devargs.h>
> > +#include <rte_kvargs.h>
> > +
> > +#include "test.h"
> > +
> > +/* Check layer arguments. */
> > +static int
> > +test_args(const char *devargs, const char *layer, const char *args, 
> > const int n)
> > +{
> > +   struct rte_kvargs *kvlist;
> > +
> > +   if (n == 0) {
> > +           if (args != NULL && strlen(args) > 0) {
> > +                   printf("rte_devargs_parse(%s) %s args parsed (not 
> > expected)\n",
> > +                          devargs, layer);
> > +                   return -1;
> > +           } else {
> > +                   return 0;
> > +           }
> > +   }
> > +   if (args == NULL) {
> > +           printf("rte_devargs_parse(%s) %s args not parsed\n",
> > +                  devargs, layer);
> > +           return -1;
> > +   }
> > +   kvlist = rte_kvargs_parse(args, NULL);
> > +   if (kvlist == NULL) {
> > +           printf("rte_devargs_parse(%s) %s_str: %s not parsed\n",
> > +                  devargs, layer, args);
> > +           return -1;
> > +   }
> > +   if ((int)kvlist->count != n) {
> > +           printf("rte_devargs_parse(%s) %s_str: %s kv number %u, not 
> > %d\n",
> > +                  devargs, layer, args, kvlist->count, n);
> > +           return -1;
> > +   }
> > +   return 0;
> > +}
> > +
> > +/* Test several valid cases */
> > +static int
> > +test_valid_devargs(void)
> > +{
> > +   static const struct {
> > +           const char *devargs;
> > +           int bus_kv;
> > +           int class_kv;
> > +           int driver_kv;
> > +   } list[] = {
> > +           /* Global devargs syntax: */
> > +           { "bus=pci", 1, 0, 0 },
> > +           { "class=eth", 0, 1, 0 },
> > +           { "bus=pci,addr=1:2.3/class=eth/driver=abc,k0=v0", 2, 1, 2 },
> > +           { "bus=vdev,name=/dev/file/name/class=eth", 2, 1, 0 },
> > +           /* Legacy devargs syntax: */
> > +           { "1:2.3", 0, 0, 0 },
> > +           { "pci:1:2.3,k0=v0", 0, 0, 1 },
> > +           { "net_virtio_user0,iface=test,path=/dev/vhost-net,queues=1",
> > +             0, 0, 3 },
> 
> I would add here cases to verify that edge-case are properly parsed such as:
> 
> +               { "bus=vdev,name=/class/bus/path/class=eth", 2, 1, 0 },
> [...]
> +               { "net_virtio_user0,iface=test,path=/class/bus/,queues=1",
> +                 0, 0, 3 },
> 
> To check the /class or /bus parts cannot throw off the parser (it does not 
> currently).
> 
> Additionally, paths with multiple slashes are correct. Maybe add:
> 
> +               { "bus=vdev,name=///dblslsh/class=eth", 2, 1, 0 },
> 
> as well.
> 
> I tested all those cases without issue, it seems the parser is ok.
> 
> 
> A second point is that the test only verifies that the numbers of kv were 
> found.
> I think this is not robust enough. Instead, I think the 'expect' part of the 
> test
> should describe exactly what each layers should be within the devargs (which 
> bus,
> class and driver are expected to be found, and the associated string).
> 
> Right now the parser could mangle part of a key-value list within the string,
> recognize each layers and give incorrect strings to each layer parser.
> 
> It might be too much? I don't know. But it seems it could help ensure no error
> is introduced at some point by future changes.
> 

Good suggestion, will added them in v2, thanks!

Reply via email to