On Tue, 6 Jan 2026 at 22:11, Kir Chou <[email protected]> wrote:
>
> This patch converts the existing glob selftest (lib/globtest.c) to use
> the KUnit framework (lib/glob_kunit.c).
>
> The new test:
>
> - Migrates all 64 test cases from the original test to the KUnit suite.
> - Removes the custom 'verbose' module parameter as KUnit handles logging.
> - Updates Kconfig.debug and Makefile to support the new KUnit test.
> - Updates Kconfig and Makefile to remove the original selftest.
> - Updates GLOB_SELFTEST to GLOB_KUNIT_TEST for arch/m68k/configs.
>
> This commit is verified by `./tools/testing/kunit/kunit.py run`
> with the .kunit/.kunitconfig:
>
> ```
> CONFIG_KUNIT=y
> CONFIG_GLOB_KUNIT_TEST=y
> ```
>
> Signed-off-by: Kir Chou <[email protected]>
> ---
> v2:
>  - Remove CONFIG_GLOB_KUNIT_TEST from defconfigs as it's implicitly enabled
>    by CONFIG_KUNIT_ALL_TESTS. (Suggested by Geert)
> ---

Thanks -- this works well here.

One suggestion would be to move the test file into lib/tests/ -- this
is where we're keeping most of the KUnit tests for lib/ in order to
avoid cluttering up lib/ and to make it possible to tab complete all
of lib/glob.c. (Since the old file already started with lib/glob, this
wouldn't be a regression, though, so if there's a particularly good
reason to keep it there, it'd be okay. But otherwise, putting it in
lib/tests/ would be best.)

With that changed, this is:
Reviewed-by: David Gow <[email protected]>

Cheers,
-- David

>  arch/m68k/configs/amiga_defconfig    |   1 -
>  arch/m68k/configs/apollo_defconfig   |   1 -
>  arch/m68k/configs/atari_defconfig    |   1 -
>  arch/m68k/configs/bvme6000_defconfig |   1 -
>  arch/m68k/configs/hp300_defconfig    |   1 -
>  arch/m68k/configs/mac_defconfig      |   1 -
>  arch/m68k/configs/multi_defconfig    |   1 -
>  arch/m68k/configs/mvme147_defconfig  |   1 -
>  arch/m68k/configs/mvme16x_defconfig  |   1 -
>  arch/m68k/configs/q40_defconfig      |   1 -
>  arch/m68k/configs/sun3_defconfig     |   1 -
>  arch/m68k/configs/sun3x_defconfig    |   1 -
>  lib/Kconfig                          |  13 ---
>  lib/Kconfig.debug                    |  13 +++
>  lib/Makefile                         |   2 +-
>  lib/glob_kunit.c                     | 122 +++++++++++++++++++
>  lib/globtest.c                       | 167 ---------------------------
>  17 files changed, 136 insertions(+), 193 deletions(-)
>  create mode 100644 lib/glob_kunit.c
>  delete mode 100644 lib/globtest.c
>
> diff --git a/arch/m68k/configs/amiga_defconfig 
> b/arch/m68k/configs/amiga_defconfig
> index bfc1ee7c8..b51e22dea 100644
> --- a/arch/m68k/configs/amiga_defconfig
> +++ b/arch/m68k/configs/amiga_defconfig
> @@ -600,7 +600,6 @@ CONFIG_CRYPTO_USER_API_AEAD=m
>  CONFIG_PRIME_NUMBERS=m
>  CONFIG_CRC_BENCHMARK=y
>  CONFIG_XZ_DEC_TEST=m
> -CONFIG_GLOB_SELFTEST=m
>  # CONFIG_SECTION_MISMATCH_WARN_ONLY is not set
>  CONFIG_MAGIC_SYSRQ=y
>  CONFIG_TEST_LOCKUP=m
> diff --git a/arch/m68k/configs/apollo_defconfig 
> b/arch/m68k/configs/apollo_defconfig
> index d9d1f3c4c..bb326aabe 100644
> --- a/arch/m68k/configs/apollo_defconfig
> +++ b/arch/m68k/configs/apollo_defconfig
> @@ -557,7 +557,6 @@ CONFIG_CRYPTO_USER_API_AEAD=m
>  CONFIG_PRIME_NUMBERS=m
>  CONFIG_CRC_BENCHMARK=y
>  CONFIG_XZ_DEC_TEST=m
> -CONFIG_GLOB_SELFTEST=m
>  # CONFIG_SECTION_MISMATCH_WARN_ONLY is not set
>  CONFIG_MAGIC_SYSRQ=y
>  CONFIG_TEST_LOCKUP=m
> diff --git a/arch/m68k/configs/atari_defconfig 
> b/arch/m68k/configs/atari_defconfig
> index 523205adc..66af496e0 100644
> --- a/arch/m68k/configs/atari_defconfig
> +++ b/arch/m68k/configs/atari_defconfig
> @@ -577,7 +577,6 @@ CONFIG_CRYPTO_USER_API_AEAD=m
>  CONFIG_PRIME_NUMBERS=m
>  CONFIG_CRC_BENCHMARK=y
>  CONFIG_XZ_DEC_TEST=m
> -CONFIG_GLOB_SELFTEST=m
>  # CONFIG_SECTION_MISMATCH_WARN_ONLY is not set
>  CONFIG_MAGIC_SYSRQ=y
>  CONFIG_TEST_LOCKUP=m
> diff --git a/arch/m68k/configs/bvme6000_defconfig 
> b/arch/m68k/configs/bvme6000_defconfig
> index 7b0a4ef0b..935282b27 100644
> --- a/arch/m68k/configs/bvme6000_defconfig
> +++ b/arch/m68k/configs/bvme6000_defconfig
> @@ -549,7 +549,6 @@ CONFIG_CRYPTO_USER_API_AEAD=m
>  CONFIG_PRIME_NUMBERS=m
>  CONFIG_CRC_BENCHMARK=y
>  CONFIG_XZ_DEC_TEST=m
> -CONFIG_GLOB_SELFTEST=m
>  # CONFIG_SECTION_MISMATCH_WARN_ONLY is not set
>  CONFIG_MAGIC_SYSRQ=y
>  CONFIG_TEST_LOCKUP=m
> diff --git a/arch/m68k/configs/hp300_defconfig 
> b/arch/m68k/configs/hp300_defconfig
> index 089c5c394..31f5220be 100644
> --- a/arch/m68k/configs/hp300_defconfig
> +++ b/arch/m68k/configs/hp300_defconfig
> @@ -559,7 +559,6 @@ CONFIG_CRYPTO_USER_API_AEAD=m
>  CONFIG_PRIME_NUMBERS=m
>  CONFIG_CRC_BENCHMARK=y
>  CONFIG_XZ_DEC_TEST=m
> -CONFIG_GLOB_SELFTEST=m
>  # CONFIG_SECTION_MISMATCH_WARN_ONLY is not set
>  CONFIG_MAGIC_SYSRQ=y
>  CONFIG_TEST_LOCKUP=m
> diff --git a/arch/m68k/configs/mac_defconfig b/arch/m68k/configs/mac_defconfig
> index 5f2484c36..99fa2286a 100644
> --- a/arch/m68k/configs/mac_defconfig
> +++ b/arch/m68k/configs/mac_defconfig
> @@ -576,7 +576,6 @@ CONFIG_CRYPTO_USER_API_AEAD=m
>  CONFIG_PRIME_NUMBERS=m
>  CONFIG_CRC_BENCHMARK=y
>  CONFIG_XZ_DEC_TEST=m
> -CONFIG_GLOB_SELFTEST=m
>  # CONFIG_SECTION_MISMATCH_WARN_ONLY is not set
>  CONFIG_MAGIC_SYSRQ=y
>  CONFIG_TEST_LOCKUP=m
> diff --git a/arch/m68k/configs/multi_defconfig 
> b/arch/m68k/configs/multi_defconfig
> index 74f0a1f6d..9332c00bc 100644
> --- a/arch/m68k/configs/multi_defconfig
> +++ b/arch/m68k/configs/multi_defconfig
> @@ -663,7 +663,6 @@ CONFIG_CRYPTO_USER_API_AEAD=m
>  CONFIG_PRIME_NUMBERS=m
>  CONFIG_CRC_BENCHMARK=y
>  CONFIG_XZ_DEC_TEST=m
> -CONFIG_GLOB_SELFTEST=m
>  # CONFIG_SECTION_MISMATCH_WARN_ONLY is not set
>  CONFIG_MAGIC_SYSRQ=y
>  CONFIG_TEST_LOCKUP=m
> diff --git a/arch/m68k/configs/mvme147_defconfig 
> b/arch/m68k/configs/mvme147_defconfig
> index 4bee18c82..e5ba3e899 100644
> --- a/arch/m68k/configs/mvme147_defconfig
> +++ b/arch/m68k/configs/mvme147_defconfig
> @@ -549,7 +549,6 @@ CONFIG_CRYPTO_USER_API_AEAD=m
>  CONFIG_PRIME_NUMBERS=m
>  CONFIG_CRC_BENCHMARK=y
>  CONFIG_XZ_DEC_TEST=m
> -CONFIG_GLOB_SELFTEST=m
>  # CONFIG_SECTION_MISMATCH_WARN_ONLY is not set
>  CONFIG_MAGIC_SYSRQ=y
>  CONFIG_TEST_LOCKUP=m
> diff --git a/arch/m68k/configs/mvme16x_defconfig 
> b/arch/m68k/configs/mvme16x_defconfig
> index 322c17e55..282900b7e 100644
> --- a/arch/m68k/configs/mvme16x_defconfig
> +++ b/arch/m68k/configs/mvme16x_defconfig
> @@ -550,7 +550,6 @@ CONFIG_CRYPTO_USER_API_AEAD=m
>  CONFIG_PRIME_NUMBERS=m
>  CONFIG_CRC_BENCHMARK=y
>  CONFIG_XZ_DEC_TEST=m
> -CONFIG_GLOB_SELFTEST=m
>  # CONFIG_SECTION_MISMATCH_WARN_ONLY is not set
>  CONFIG_MAGIC_SYSRQ=y
>  CONFIG_TEST_LOCKUP=m
> diff --git a/arch/m68k/configs/q40_defconfig b/arch/m68k/configs/q40_defconfig
> index 82f9baab8..e572c7df1 100644
> --- a/arch/m68k/configs/q40_defconfig
> +++ b/arch/m68k/configs/q40_defconfig
> @@ -566,7 +566,6 @@ CONFIG_CRYPTO_USER_API_AEAD=m
>  CONFIG_PRIME_NUMBERS=m
>  CONFIG_CRC_BENCHMARK=y
>  CONFIG_XZ_DEC_TEST=m
> -CONFIG_GLOB_SELFTEST=m
>  # CONFIG_SECTION_MISMATCH_WARN_ONLY is not set
>  CONFIG_MAGIC_SYSRQ=y
>  CONFIG_TEST_LOCKUP=m
> diff --git a/arch/m68k/configs/sun3_defconfig 
> b/arch/m68k/configs/sun3_defconfig
> index f94ad226c..03bd60c5b 100644
> --- a/arch/m68k/configs/sun3_defconfig
> +++ b/arch/m68k/configs/sun3_defconfig
> @@ -547,7 +547,6 @@ CONFIG_CRYPTO_USER_API_AEAD=m
>  CONFIG_PRIME_NUMBERS=m
>  CONFIG_CRC_BENCHMARK=y
>  CONFIG_XZ_DEC_TEST=m
> -CONFIG_GLOB_SELFTEST=m
>  # CONFIG_SECTION_MISMATCH_WARN_ONLY is not set
>  CONFIG_MAGIC_SYSRQ=y
>  CONFIG_TEST_LOCKUP=m
> diff --git a/arch/m68k/configs/sun3x_defconfig 
> b/arch/m68k/configs/sun3x_defconfig
> index a5ecfc505..0fba766ce 100644
> --- a/arch/m68k/configs/sun3x_defconfig
> +++ b/arch/m68k/configs/sun3x_defconfig
> @@ -547,7 +547,6 @@ CONFIG_CRYPTO_USER_API_AEAD=m
>  CONFIG_PRIME_NUMBERS=m
>  CONFIG_CRC_BENCHMARK=y
>  CONFIG_XZ_DEC_TEST=m
> -CONFIG_GLOB_SELFTEST=m
>  # CONFIG_SECTION_MISMATCH_WARN_ONLY is not set
>  CONFIG_MAGIC_SYSRQ=y
>  CONFIG_TEST_LOCKUP=m
> diff --git a/lib/Kconfig b/lib/Kconfig
> index 2923924be..0f2fb9610 100644
> --- a/lib/Kconfig
> +++ b/lib/Kconfig
> @@ -430,19 +430,6 @@ config GLOB
>           are compiling an out-of tree driver which tells you that it
>           depends on this.
>
> -config GLOB_SELFTEST
> -       tristate "glob self-test on init"
> -       depends on GLOB
> -       help
> -         This option enables a simple self-test of the glob_match
> -         function on startup.  It is primarily useful for people
> -         working on the code to ensure they haven't introduced any
> -         regressions.
> -
> -         It only adds a little bit of code and slows kernel boot (or
> -         module load) by a small amount, so you're welcome to play with
> -         it, but you probably don't need it.
> -
>  #
>  # Netlink attribute parsing support is select'ed if needed
>  #
> diff --git a/lib/Kconfig.debug b/lib/Kconfig.debug
> index ba36939fd..e4347e145 100644
> --- a/lib/Kconfig.debug
> +++ b/lib/Kconfig.debug
> @@ -3354,6 +3354,19 @@ config PRIME_NUMBERS_KUNIT_TEST
>
>           If unsure, say N
>
> +config GLOB_KUNIT_TEST
> +       tristate "Glob matching test" if !KUNIT_ALL_TESTS
> +       depends on KUNIT
> +       default KUNIT_ALL_TESTS
> +       select GLOB
> +       help
> +         Enable this option to test the glob functions at runtime.
> +
> +         This test suite verifies the correctness of glob_match() across 
> various
> +         scenarios, including edge cases.
> +
> +         If unsure, say N
> +
>  endif # RUNTIME_TESTING_MENU
>
>  config ARCH_USE_MEMTEST
> diff --git a/lib/Makefile b/lib/Makefile
> index aaf677cf4..78d7deabe 100644
> --- a/lib/Makefile
> +++ b/lib/Makefile
> @@ -226,7 +226,7 @@ obj-$(CONFIG_CLOSURES) += closure.o
>  obj-$(CONFIG_DQL) += dynamic_queue_limits.o
>
>  obj-$(CONFIG_GLOB) += glob.o
> -obj-$(CONFIG_GLOB_SELFTEST) += globtest.o
> +obj-$(CONFIG_GLOB_KUNIT_TEST) += glob_kunit.o
>
>  obj-$(CONFIG_DIMLIB) += dim/
>  obj-$(CONFIG_SIGNATURE) += digsig.o
> diff --git a/lib/glob_kunit.c b/lib/glob_kunit.c
> new file mode 100644
> index 000000000..797e32a8c
> --- /dev/null
> +++ b/lib/glob_kunit.c
> @@ -0,0 +1,122 @@
> +// SPDX-License-Identifier: GPL-2.0
> +/*
> + * Test cases for glob functions.
> + */
> +
> +#include <kunit/test.h>
> +#include <linux/glob.h>
> +#include <linux/module.h>
> +
> +struct glob_test_case {
> +       // Pattern to match.
> +       const char *pat;
> +       // String to match against.
> +       const char *str;
> +       // Expected glob_match result, true is matched.
> +       bool expected;
> +};
> +
> +static const struct glob_test_case glob_test_cases[] = {
> +       /* Some basic tests */
> +       { .pat = "a", .str = "a", .expected = true },
> +       { .pat = "a", .str = "b", .expected = false },
> +       { .pat = "a", .str = "aa", .expected = false },
> +       { .pat = "a", .str = "", .expected = false },
> +       { .pat = "", .str = "", .expected = true },
> +       { .pat = "", .str = "a", .expected = false },
> +       /* Simple character class tests */
> +       { .pat = "[a]", .str = "a", .expected = true },
> +       { .pat = "[a]", .str = "b", .expected = false },
> +       { .pat = "[!a]", .str = "a", .expected = false },
> +       { .pat = "[!a]", .str = "b", .expected = true },
> +       { .pat = "[ab]", .str = "a", .expected = true },
> +       { .pat = "[ab]", .str = "b", .expected = true },
> +       { .pat = "[ab]", .str = "c", .expected = false },
> +       { .pat = "[!ab]", .str = "c", .expected = true },
> +       { .pat = "[a-c]", .str = "b", .expected = true },
> +       { .pat = "[a-c]", .str = "d", .expected = false },
> +       /* Corner cases in character class parsing */
> +       { .pat = "[a-c-e-g]", .str = "-", .expected = true },
> +       { .pat = "[a-c-e-g]", .str = "d", .expected = false },
> +       { .pat = "[a-c-e-g]", .str = "f", .expected = true },
> +       { .pat = "[]a-ceg-ik[]", .str = "a", .expected = true },
> +       { .pat = "[]a-ceg-ik[]", .str = "]", .expected = true },
> +       { .pat = "[]a-ceg-ik[]", .str = "[", .expected = true },
> +       { .pat = "[]a-ceg-ik[]", .str = "h", .expected = true },
> +       { .pat = "[]a-ceg-ik[]", .str = "f", .expected = false },
> +       { .pat = "[!]a-ceg-ik[]", .str = "h", .expected = false },
> +       { .pat = "[!]a-ceg-ik[]", .str = "]", .expected = false },
> +       { .pat = "[!]a-ceg-ik[]", .str = "f", .expected = true },
> +       /* Simple wild cards */
> +       { .pat = "?", .str = "a", .expected = true },
> +       { .pat = "?", .str = "aa", .expected = false },
> +       { .pat = "??", .str = "a", .expected = false },
> +       { .pat = "?x?", .str = "axb", .expected = true },
> +       { .pat = "?x?", .str = "abx", .expected = false },
> +       { .pat = "?x?", .str = "xab", .expected = false },
> +       /* Asterisk wild cards (backtracking) */
> +       { .pat = "*??", .str = "a", .expected = false },
> +       { .pat = "*??", .str = "ab", .expected = true },
> +       { .pat = "*??", .str = "abc", .expected = true },
> +       { .pat = "*??", .str = "abcd", .expected = true },
> +       { .pat = "??*", .str = "a", .expected = false },
> +       { .pat = "??*", .str = "ab", .expected = true },
> +       { .pat = "??*", .str = "abc", .expected = true },
> +       { .pat = "??*", .str = "abcd", .expected = true },
> +       { .pat = "?*?", .str = "a", .expected = false },
> +       { .pat = "?*?", .str = "ab", .expected = true },
> +       { .pat = "?*?", .str = "abc", .expected = true },
> +       { .pat = "?*?", .str = "abcd", .expected = true },
> +       { .pat = "*b", .str = "b", .expected = true },
> +       { .pat = "*b", .str = "ab", .expected = true },
> +       { .pat = "*b", .str = "ba", .expected = false },
> +       { .pat = "*b", .str = "bb", .expected = true },
> +       { .pat = "*b", .str = "abb", .expected = true },
> +       { .pat = "*b", .str = "bab", .expected = true },
> +       { .pat = "*bc", .str = "abbc", .expected = true },
> +       { .pat = "*bc", .str = "bc", .expected = true },
> +       { .pat = "*bc", .str = "bbc", .expected = true },
> +       { .pat = "*bc", .str = "bcbc", .expected = true },
> +       /* Multiple asterisks (complex backtracking) */
> +       { .pat = "*ac*", .str = "abacadaeafag", .expected = true },
> +       { .pat = "*ac*ae*ag*", .str = "abacadaeafag", .expected = true },
> +       { .pat = "*a*b*[bc]*[ef]*g*", .str = "abacadaeafag", .expected = true 
> },
> +       { .pat = "*a*b*[ef]*[cd]*g*", .str = "abacadaeafag", .expected = 
> false },
> +       { .pat = "*abcd*", .str = "abcabcabcabcdefg", .expected = true },
> +       { .pat = "*ab*cd*", .str = "abcabcabcabcdefg", .expected = true },
> +       { .pat = "*abcd*abcdef*", .str = "abcabcdabcdeabcdefg", .expected = 
> true },
> +       { .pat = "*abcd*", .str = "abcabcabcabcefg", .expected = false },
> +       { .pat = "*ab*cd*", .str = "abcabcabcabcefg", .expected = false },
> +};
> +
> +static void glob_case_to_desc(const struct glob_test_case *t, char *desc)
> +{
> +       snprintf(desc, KUNIT_PARAM_DESC_SIZE, "pat:\"%s\" str:\"%s\"", 
> t->pat, t->str);
> +}
> +
> +KUNIT_ARRAY_PARAM(glob, glob_test_cases, glob_case_to_desc);
> +
> +static void glob_test_match(struct kunit *test)
> +{
> +       const struct glob_test_case *params = test->param_value;
> +
> +       KUNIT_EXPECT_EQ_MSG(test,
> +               glob_match(params->pat, params->str),
> +               params->expected,
> +               "Pattern: \"%s\", String: \"%s\", Expected: %d",
> +               params->pat, params->str, params->expected);
> +}
> +
> +static struct kunit_case glob_kunit_test_cases[] = {
> +       KUNIT_CASE_PARAM(glob_test_match, glob_gen_params),
> +       {}
> +};
> +
> +static struct kunit_suite glob_test_suite = {
> +       .name = "glob",
> +       .test_cases = glob_kunit_test_cases,
> +};
> +
> +kunit_test_suite(glob_test_suite);
> +MODULE_DESCRIPTION("Test cases for glob functions");
> +MODULE_LICENSE("Dual MIT/GPL");
> diff --git a/lib/globtest.c b/lib/globtest.c
> deleted file mode 100644
> index d8e97d43b..000000000
> --- a/lib/globtest.c
> +++ /dev/null
> @@ -1,167 +0,0 @@
> -/*
> - * Extracted fronm glob.c
> - */
> -
> -#include <linux/module.h>
> -#include <linux/moduleparam.h>
> -#include <linux/glob.h>
> -#include <linux/printk.h>
> -
> -/* Boot with "glob.verbose=1" to show successful tests, too */
> -static bool verbose = false;
> -module_param(verbose, bool, 0);
> -
> -struct glob_test {
> -       char const *pat, *str;
> -       bool expected;
> -};
> -
> -static bool __pure __init test(char const *pat, char const *str, bool 
> expected)
> -{
> -       bool match = glob_match(pat, str);
> -       bool success = match == expected;
> -
> -       /* Can't get string literals into a particular section, so... */
> -       static char const msg_error[] __initconst =
> -               KERN_ERR "glob: \"%s\" vs. \"%s\": %s *** ERROR ***\n";
> -       static char const msg_ok[] __initconst =
> -               KERN_DEBUG "glob: \"%s\" vs. \"%s\": %s OK\n";
> -       static char const mismatch[] __initconst = "mismatch";
> -       char const *message;
> -
> -       if (!success)
> -               message = msg_error;
> -       else if (verbose)
> -               message = msg_ok;
> -       else
> -               return success;
> -
> -       printk(message, pat, str, mismatch + 3*match);
> -       return success;
> -}
> -
> -/*
> - * The tests are all jammed together in one array to make it simpler
> - * to place that array in the .init.rodata section.  The obvious
> - * "array of structures containing char *" has no way to force the
> - * pointed-to strings to be in a particular section.
> - *
> - * Anyway, a test consists of:
> - * 1. Expected glob_match result: '1' or '0'.
> - * 2. Pattern to match: null-terminated string
> - * 3. String to match against: null-terminated string
> - *
> - * The list of tests is terminated with a final '\0' instead of
> - * a glob_match result character.
> - */
> -static char const glob_tests[] __initconst =
> -       /* Some basic tests */
> -       "1" "a\0" "a\0"
> -       "0" "a\0" "b\0"
> -       "0" "a\0" "aa\0"
> -       "0" "a\0" "\0"
> -       "1" "\0" "\0"
> -       "0" "\0" "a\0"
> -       /* Simple character class tests */
> -       "1" "[a]\0" "a\0"
> -       "0" "[a]\0" "b\0"
> -       "0" "[!a]\0" "a\0"
> -       "1" "[!a]\0" "b\0"
> -       "1" "[ab]\0" "a\0"
> -       "1" "[ab]\0" "b\0"
> -       "0" "[ab]\0" "c\0"
> -       "1" "[!ab]\0" "c\0"
> -       "1" "[a-c]\0" "b\0"
> -       "0" "[a-c]\0" "d\0"
> -       /* Corner cases in character class parsing */
> -       "1" "[a-c-e-g]\0" "-\0"
> -       "0" "[a-c-e-g]\0" "d\0"
> -       "1" "[a-c-e-g]\0" "f\0"
> -       "1" "[]a-ceg-ik[]\0" "a\0"
> -       "1" "[]a-ceg-ik[]\0" "]\0"
> -       "1" "[]a-ceg-ik[]\0" "[\0"
> -       "1" "[]a-ceg-ik[]\0" "h\0"
> -       "0" "[]a-ceg-ik[]\0" "f\0"
> -       "0" "[!]a-ceg-ik[]\0" "h\0"
> -       "0" "[!]a-ceg-ik[]\0" "]\0"
> -       "1" "[!]a-ceg-ik[]\0" "f\0"
> -       /* Simple wild cards */
> -       "1" "?\0" "a\0"
> -       "0" "?\0" "aa\0"
> -       "0" "??\0" "a\0"
> -       "1" "?x?\0" "axb\0"
> -       "0" "?x?\0" "abx\0"
> -       "0" "?x?\0" "xab\0"
> -       /* Asterisk wild cards (backtracking) */
> -       "0" "*??\0" "a\0"
> -       "1" "*??\0" "ab\0"
> -       "1" "*??\0" "abc\0"
> -       "1" "*??\0" "abcd\0"
> -       "0" "??*\0" "a\0"
> -       "1" "??*\0" "ab\0"
> -       "1" "??*\0" "abc\0"
> -       "1" "??*\0" "abcd\0"
> -       "0" "?*?\0" "a\0"
> -       "1" "?*?\0" "ab\0"
> -       "1" "?*?\0" "abc\0"
> -       "1" "?*?\0" "abcd\0"
> -       "1" "*b\0" "b\0"
> -       "1" "*b\0" "ab\0"
> -       "0" "*b\0" "ba\0"
> -       "1" "*b\0" "bb\0"
> -       "1" "*b\0" "abb\0"
> -       "1" "*b\0" "bab\0"
> -       "1" "*bc\0" "abbc\0"
> -       "1" "*bc\0" "bc\0"
> -       "1" "*bc\0" "bbc\0"
> -       "1" "*bc\0" "bcbc\0"
> -       /* Multiple asterisks (complex backtracking) */
> -       "1" "*ac*\0" "abacadaeafag\0"
> -       "1" "*ac*ae*ag*\0" "abacadaeafag\0"
> -       "1" "*a*b*[bc]*[ef]*g*\0" "abacadaeafag\0"
> -       "0" "*a*b*[ef]*[cd]*g*\0" "abacadaeafag\0"
> -       "1" "*abcd*\0" "abcabcabcabcdefg\0"
> -       "1" "*ab*cd*\0" "abcabcabcabcdefg\0"
> -       "1" "*abcd*abcdef*\0" "abcabcdabcdeabcdefg\0"
> -       "0" "*abcd*\0" "abcabcabcabcefg\0"
> -       "0" "*ab*cd*\0" "abcabcabcabcefg\0";
> -
> -static int __init glob_init(void)
> -{
> -       unsigned successes = 0;
> -       unsigned n = 0;
> -       char const *p = glob_tests;
> -       static char const message[] __initconst =
> -               KERN_INFO "glob: %u self-tests passed, %u failed\n";
> -
> -       /*
> -        * Tests are jammed together in a string.  The first byte is '1'
> -        * or '0' to indicate the expected outcome, or '\0' to indicate the
> -        * end of the tests.  Then come two null-terminated strings: the
> -        * pattern and the string to match it against.
> -        */
> -       while (*p) {
> -               bool expected = *p++ & 1;
> -               char const *pat = p;
> -
> -               p += strlen(p) + 1;
> -               successes += test(pat, p, expected);
> -               p += strlen(p) + 1;
> -               n++;
> -       }
> -
> -       n -= successes;
> -       printk(message, successes, n);
> -
> -       /* What's the errno for "kernel bug detected"?  Guess... */
> -       return n ? -ECANCELED : 0;
> -}
> -
> -/* We need a dummy exit function to allow unload */
> -static void __exit glob_fini(void) { }
> -
> -module_init(glob_init);
> -module_exit(glob_fini);
> -
> -MODULE_DESCRIPTION("glob(7) matching tests");
> -MODULE_LICENSE("Dual MIT/GPL");
> --
> 2.52.0.351.gbe84eed79e-goog
>

Attachment: smime.p7s
Description: S/MIME Cryptographic Signature

Reply via email to