From: Josh Law <objecting@objecting.org>
To: Andrew Morton <akpm@linux-foundation.org>,
Josh Law <objecting@objecting.org>
Cc: linux-kernel@vger.kernel.org
Subject: [PATCH 6/7] lib/tests: add glob test cases for escapes, edge cases, and new features
Date: Sun, 15 Mar 2026 17:11:03 +0000 [thread overview]
Message-ID: <20260315171104.268944-7-objecting@objecting.org> (raw)
In-Reply-To: <20260315171104.268944-1-objecting@objecting.org>
The glob kunit test suite had no coverage for backslash escape
sequences, and was missing edge cases around wildcards with empty
strings, inverted ranges, unclosed brackets, and consecutive
wildcards.
Add test cases covering:
- Backslash escapes: \*, \?, \[, \\, non-metachar after backslash,
and trailing backslash matching a literal '\' character.
- Wildcards matching special characters in the string (*, [, \, ?).
- Wildcards with empty strings: * matches empty, ** matches empty,
? does not match empty.
- Inverted (backwards) ranges: [z-a] and [9-0] now match thanks to
endpoint normalization.
- Single-character ranges: [a-a] matches 'a'.
- Caret negation: [^a] and [^a-z] as alias for [!...].
- Unclosed bracket: [ treated as literal.
- Consecutive wildcards: ***a, *?*, *?*?* patterns.
Signed-off-by: Josh Law <objecting@objecting.org>
---
lib/tests/glob_kunit.c | 47 ++++++++++++++++++++++++++++++++++++++++++
1 file changed, 47 insertions(+)
diff --git a/lib/tests/glob_kunit.c b/lib/tests/glob_kunit.c
index 362b1eda8e5b..9b53060e7c8e 100644
--- a/lib/tests/glob_kunit.c
+++ b/lib/tests/glob_kunit.c
@@ -80,6 +80,53 @@ static const struct glob_test_case glob_test_cases[] = {
{ .pat = "*bc", .str = "bc", .expected = true },
{ .pat = "*bc", .str = "bbc", .expected = true },
{ .pat = "*bc", .str = "bcbc", .expected = true },
+ /* Backslash escape sequences */
+ { .pat = "\\*", .str = "*", .expected = true },
+ { .pat = "\\*", .str = "a", .expected = false },
+ { .pat = "\\?", .str = "?", .expected = true },
+ { .pat = "\\?", .str = "a", .expected = false },
+ { .pat = "\\[", .str = "[", .expected = true },
+ { .pat = "\\[", .str = "a", .expected = false },
+ { .pat = "a\\bc", .str = "abc", .expected = true },
+ { .pat = "\\\\", .str = "\\", .expected = true },
+ { .pat = "\\\\", .str = "a", .expected = false },
+ /* Trailing backslash (matches literal backslash) */
+ { .pat = "a\\", .str = "a\\", .expected = true },
+ { .pat = "a\\", .str = "a", .expected = false },
+ /* Wildcards matching special characters in string */
+ { .pat = "?", .str = "*", .expected = true },
+ { .pat = "?", .str = "[", .expected = true },
+ { .pat = "?", .str = "\\", .expected = true },
+ { .pat = "?", .str = "?", .expected = true },
+ /* Wildcards with empty strings */
+ { .pat = "*", .str = "", .expected = true },
+ { .pat = "*", .str = "a", .expected = true },
+ { .pat = "**", .str = "", .expected = true },
+ { .pat = "**", .str = "abc", .expected = true },
+ { .pat = "?", .str = "", .expected = false },
+ /* Inverted (backwards) ranges */
+ { .pat = "[z-a]", .str = "m", .expected = true },
+ { .pat = "[z-a]", .str = "z", .expected = true },
+ { .pat = "[z-a]", .str = "a", .expected = true },
+ { .pat = "[9-0]", .str = "5", .expected = true },
+ { .pat = "[9-0]", .str = "a", .expected = false },
+ /* Single-character range */
+ { .pat = "[a-a]", .str = "a", .expected = true },
+ { .pat = "[a-a]", .str = "b", .expected = false },
+ /* Caret negation syntax */
+ { .pat = "[^a]", .str = "b", .expected = true },
+ { .pat = "[^a]", .str = "a", .expected = false },
+ { .pat = "[^a-z]", .str = "0", .expected = true },
+ { .pat = "[^a-z]", .str = "m", .expected = false },
+ /* Unclosed bracket (treated as literal) */
+ { .pat = "[", .str = "[", .expected = true },
+ { .pat = "[", .str = "a", .expected = false },
+ { .pat = "[abc", .str = "[abc", .expected = true },
+ /* Consecutive wildcards */
+ { .pat = "***a", .str = "a", .expected = true },
+ { .pat = "*?*", .str = "a", .expected = true },
+ { .pat = "*?*?*", .str = "ab", .expected = true },
+ { .pat = "*?*?*", .str = "a", .expected = false },
/* Multiple asterisks (complex backtracking) */
{ .pat = "*ac*", .str = "abacadaeafag", .expected = true },
{ .pat = "*ac*ae*ag*", .str = "abacadaeafag", .expected = true },
--
2.34.1
next prev parent reply other threads:[~2026-03-15 17:11 UTC|newest]
Thread overview: 8+ messages / expand[flat|nested] mbox.gz Atom feed top
2026-03-15 17:10 [PATCH 0/7] lib/glob: fixes, new features, and test coverage Josh Law
2026-03-15 17:10 ` [PATCH 1/7] lib/glob: normalize inverted character class ranges Josh Law
2026-03-15 17:10 ` [PATCH 2/7] lib/glob: treat trailing backslash as literal character Josh Law
2026-03-15 17:11 ` [PATCH 3/7] lib/glob: accept [^...] as character class negation syntax Josh Law
2026-03-15 17:11 ` [PATCH 4/7] lib/glob: add case-insensitive glob_match_nocase() Josh Law
2026-03-15 17:11 ` [PATCH 5/7] lib/glob: add glob_validate() for pattern syntax checking Josh Law
2026-03-15 17:11 ` Josh Law [this message]
2026-03-15 17:11 ` [PATCH 7/7] lib/tests: add kunit tests for glob_match_nocase() and glob_validate() Josh Law
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20260315171104.268944-7-objecting@objecting.org \
--to=objecting@objecting.org \
--cc=akpm@linux-foundation.org \
--cc=linux-kernel@vger.kernel.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox