[PATCH v2 01/12] test: Add ut_asserteq_regex() for regex pattern matching
Simon Glass
sjg at chromium.org
Sun Apr 12 13:19:38 CEST 2026
Add a new assertion macro ut_asserteq_regex() that checks if a string
matches a regular expression pattern using the SLRE library.
This is useful for tests where exact string-matching is difficult, such
as when output contains line numbers or other variable content.
Use a helper function ut_check_regex() to avoid including slre.h in the
header.
Signed-off-by: Simon Glass <sjg at chromium.org>
---
(no changes since v1)
include/test/ut.h | 36 +++++++++++++++++++++++++++++-------
test/ut.c | 30 ++++++++++++++++++++++++++++++
2 files changed, 59 insertions(+), 7 deletions(-)
diff --git a/include/test/ut.h b/include/test/ut.h
index 6510c35997f..cda15f3a7a9 100644
--- a/include/test/ut.h
+++ b/include/test/ut.h
@@ -13,6 +13,9 @@
#include <linux/err.h>
#include <test/test.h>
+/* Size of error buffer for ut_check_regex() */
+#define UT_REGEX_ERR_SIZE 256
+
struct unit_test_state;
/**
@@ -41,6 +44,16 @@ void ut_failf(struct unit_test_state *uts, const char *fname, int line,
const char *func, const char *cond, const char *fmt, ...)
__attribute__ ((format (__printf__, 6, 7)));
+/**
+ * ut_check_regex() - Check if a string matches a regex pattern
+ *
+ * @pattern: Regular expression pattern
+ * @str: String to match against
+ * @err: Buffer to hold error message on failure (UT_REGEX_ERR_SIZE bytes)
+ * Return: 0 if match, -EINVAL if pattern is invalid, -ENOENT if no match
+ */
+int ut_check_regex(const char *pattern, const char *str, char *err);
+
/**
* ut_check_console_line() - Check the next console line against expectations
*
@@ -264,13 +277,22 @@ int ut_check_console_dump(struct unit_test_state *uts, int total_bytes);
__ret; \
})
-/**
- * ut_asserteq_mem() - Assert that two memory areas are equal
- *
- * @expr1: expected value
- * @expr2: actual value
- * @len: length of the memory areas
- */
+/* Assert that a string matches a regex pattern */
+#define ut_asserteq_regex(pattern, str) ({ \
+ const char *_pattern = (pattern), *_str = (str); \
+ char _err[UT_REGEX_ERR_SIZE]; \
+ int __ret = 0; \
+ \
+ __ret = ut_check_regex(_pattern, _str, _err); \
+ if (__ret) { \
+ ut_failf(uts, __FILE__, __LINE__, __func__, \
+ #pattern " matches " #str, "%s", _err); \
+ return CMD_RET_FAILURE; \
+ } \
+ __ret; \
+})
+
+/* Assert that two memory areas are equal */
#define ut_asserteq_mem(expr1, expr2, len) ({ \
const u8 *_val1 = (u8 *)(expr1), *_val2 = (u8 *)(expr2); \
const uint __len = len; \
diff --git a/test/ut.c b/test/ut.c
index a16fdfb3a93..b4f2a8bf40f 100644
--- a/test/ut.c
+++ b/test/ut.c
@@ -6,7 +6,10 @@
*/
#include <console.h>
+#include <errno.h>
#include <malloc.h>
+#include <slre.h>
+#include <vsprintf.h>
#ifdef CONFIG_SANDBOX
#include <asm/state.h>
#endif
@@ -38,6 +41,33 @@ void ut_failf(struct unit_test_state *uts, const char *fname, int line,
uts->cur.fail_count++;
}
+int ut_check_regex(const char *pattern, const char *str, char *err)
+{
+ struct slre slre;
+
+ if (!pattern || !str) {
+ snprintf(err, UT_REGEX_ERR_SIZE,
+ "NULL value: pattern=%s, str=%s",
+ pattern ? pattern : "(null)",
+ str ? str : "(null)");
+ return -EINVAL;
+ }
+
+ if (!slre_compile(&slre, pattern)) {
+ snprintf(err, UT_REGEX_ERR_SIZE,
+ "Invalid regex '%s': %s", pattern, slre.err_str);
+ return -EINVAL;
+ }
+
+ if (!slre_match(&slre, str, strlen(str), NULL)) {
+ snprintf(err, UT_REGEX_ERR_SIZE,
+ "No match: pattern '%s', str '%s'", pattern, str);
+ return -ENOENT;
+ }
+
+ return 0;
+}
+
ulong ut_check_free(void)
{
struct mallinfo info = mallinfo();
--
2.43.0
More information about the U-Boot
mailing list