[PATCH v5 05/10] app/test: define unit tests suites based on test macros
Bruce Richardson
bruce.richardson at intel.com
Wed Aug 16 17:06:51 CEST 2023
On Wed, Aug 16, 2023 at 04:57:07PM +0200, David Marchand wrote:
> On Tue, Aug 15, 2023 at 5:24 PM Bruce Richardson
> <bruce.richardson at intel.com> wrote:
> >
> > Rather than having the test suites listed out in the meson.build files
> > and having to have them enabled/disabled selectively based on what libs
> > are being built, pull the tests to run from the source files which were
> > added to the build.
> >
> > Most test suites require no additional info other than the list of test
> > names in the suite. However the fast-test are special that they have
> > additional parameters associated with them. This requires some
> > additional work in the test extraction script and in the meson.build
> > file for processing the output.
> >
> > Signed-off-by: Bruce Richardson <bruce.richardson at intel.com>
> > Acked-by: Morten Brørup <mb at smartsharesystems.com>
> > ---
> > app/meson.build | 7 +-
> > app/test/suites/meson.build | 74 +++++++++++++++++++
> > buildtools/get-test-suites.py | 33 +++++++++
> > .../has-hugepages.py | 0
> > buildtools/meson.build | 2 +
> > 5 files changed, 115 insertions(+), 1 deletion(-)
> > create mode 100644 app/test/suites/meson.build
> > create mode 100644 buildtools/get-test-suites.py
> > rename app/test/has_hugepage.py => buildtools/has-hugepages.py (100%)
> >
> > diff --git a/app/meson.build b/app/meson.build
> > index 0d8b618e7f..c14dc80892 100644
> > --- a/app/meson.build
> > +++ b/app/meson.build
> > @@ -101,7 +101,7 @@ foreach app:apps
> > link_libs = dpdk_static_libraries + dpdk_drivers
> > endif
> >
> > - executable('dpdk-' + name,
> > + exec = executable('dpdk-' + name,
> > sources,
> > c_args: cflags,
> > link_args: ldflags,
> > @@ -110,4 +110,9 @@ foreach app:apps
> > include_directories: includes,
> > install_rpath: join_paths(get_option('prefix'), driver_install_path),
> > install: true)
> > + if name == 'test'
> > + dpdk_test = exec
> > + autotest_sources = sources
> > + subdir('test/suites') # define the pre-canned test suites
> > + endif
> > endforeach
> > diff --git a/app/test/suites/meson.build b/app/test/suites/meson.build
> > new file mode 100644
> > index 0000000000..ec74d8adf2
> > --- /dev/null
> > +++ b/app/test/suites/meson.build
> > @@ -0,0 +1,74 @@
> > +# SPDX-License-Identifier: BSD-3-Clause
> > +# Copyright(c) 2023 Intel Corporation
> > +
> > +# some perf tests (eg: memcpy perf autotest)take very long
>
> s/)take/) take/
>
Ack
> > +# to complete, so timeout to 10 minutes
> > +timeout_seconds = 600
> > +timeout_seconds_fast = 10
> > +
> > +test_no_huge_args = ['--no-huge', '-m', '2048']
> > +has_hugepage = run_command(has_hugepages_cmd, check: true).stdout().strip() != '0'
> > +message('hugepage availability: @0@'.format(has_hugepage))
> > +
> > +# process source files to determine the different unit test suites
> > +# - fast_tests
> > +# - perf_tests
> > +# - driver_tests
> > +test_suites = run_command(get_test_suites_cmd, autotest_sources,
> > + check: true).stdout().strip().split()
> > +foreach suite:test_suites
> > + # simple cases - tests without parameters or special handling
> > + suite = suite.split('=')
> > + suite_name = suite[0]
> > + suite_tests = suite[1].split(',')
> > + if suite_name != 'fast-tests'
> > + # simple cases - tests without parameters or special handling
> > + foreach t: suite_tests
> > + test(t, dpdk_test,
> > + env: ['DPDK_TEST=' + t],
> > + timeout: timeout_seconds,
> > + is_parallel: false,
> > + suite: suite_name)
> > + endforeach
> > + else
> > + # special fast-test handling here
>
> Indentation of this comment is off.
>
Ack
> > + foreach t: suite_tests
> > + params = t.split(':')
> > + test_name = params[0]
> > + nohuge = params[1] == 'true'
> > + asan = params[2] == 'true'
> > +
> > + test_args = []
> > + if nohuge
> > + test_args += test_no_huge_args
> > + elif not has_hugepage
> > + continue #skip this tests
> > + endif
> > + if not asan and (get_option('b_sanitize') == 'address'
> > + or get_option('b_sanitize') == 'address,undefined')
> > + continue # skip this test
> > + endif
> > +
> > + if get_option('default_library') == 'shared'
> > + test_args += ['-d', dpdk_drivers_build_dir]
> > + endif
> > +
> > + test(test_name, dpdk_test,
> > + args : test_args,
> > + env: ['DPDK_TEST=' + test_name],
> > + timeout : timeout_seconds_fast,
> > + is_parallel : false,
> > + suite : 'fast-tests')
> > + if not is_windows and test_name == 'trace_autotest'
> > + test_args += ['--trace=.*']
> > + test_args += ['--trace-dir=@0@'.format(meson.current_build_dir())]
> > + test(test_name + '_with_traces', dpdk_test,
> > + args : test_args,
> > + env: ['DPDK_TEST=' + test_name],
> > + timeout : timeout_seconds_fast,
> > + is_parallel : false,
> > + suite : 'fast-tests')
> > + endif
> > + endforeach
> > + endif
> > +endforeach
> > diff --git a/buildtools/get-test-suites.py b/buildtools/get-test-suites.py
> > new file mode 100644
> > index 0000000000..95a9cad4c8
> > --- /dev/null
> > +++ b/buildtools/get-test-suites.py
> > @@ -0,0 +1,33 @@
> > +#! /usr/bin/env python3
> > +# SPDX-License-Identifier: BSD-3-Clause
> > +# Copyright(c) 2023 Intel Corporation
> > +
> > +import sys
> > +import re
> > +
> > +input_list = sys.argv[1:]
> > +test_def_regex = re.compile("REGISTER_([A-Z]+)_TEST\s*\(\s*([a-z0-9_]+)")
> > +test_suites = {}
> > +
> > +def get_fast_test_params(test_name, ln):
> > + "Extract the extra fast-test parameters from the line"
> > + #print(f"ln: {ln.rstrip()}, test_name: {test_name}, split: {ln.split(test_name, 1)}")
> > + (_, rest_of_line) = ln.split(test_name, 1)
> > + (_, nohuge, asan, _func) = rest_of_line.split(',', 3)
> > + return f":{nohuge.strip().lower()}:{asan.strip().lower()}"
> > +
> > +for fname in input_list:
> > + with open(fname) as f:
> > + contents = [ln for ln in f.readlines() if test_def_regex.match(ln.strip())]
> > + for ln in contents:
> > + (test_suite, test_name) = test_def_regex.match(ln).group(1, 2)
> > + suite_name = f"{test_suite.lower()}-tests"
> > + if suite_name in test_suites:
> > + test_suites[suite_name].append(test_name)
> > + else:
> > + test_suites[suite_name] = [test_name]
> > + if suite_name == "fast-tests":
> > + test_suites["fast-tests"][-1] += get_fast_test_params(test_name, ln)
> > +
> > +for suite in test_suites.keys():
> > + print(f"{suite}={','.join(test_suites[suite])}")
> > diff --git a/app/test/has_hugepage.py b/buildtools/has-hugepages.py
> > similarity index 100%
> > rename from app/test/has_hugepage.py
> > rename to buildtools/has-hugepages.py
>
> app/test/has_hugepage.py is still referenced in MAINTAINERS.
> And new files (in this patch, and later patches) are not affiliated to someone.
>
Will look to fix in V6.
More information about the dev
mailing list