[LTP] [PATCH v9 1/2] lib: Extend tst_assert_ulong() with enum flags
Wei Gao
wegao@suse.com
Mon Aug 31 10:16:33 CEST 2026
Introduce enum tst_assert_flags (including TST_ASSERT_NONE,
TST_ASSERT_SATURATED_INT, and TST_ASSERT_TRUNC_32BIT) to
tst_assert_ulong(). This enables type-safe handling of 32-bit
compat-mode truncation and clamping behaviors on 64-bit kernels
when verifying sysfs/procfs limits.
Signed-off-by: Wei Gao <wegao@suse.com>
---
include/tst_assert.h | 36 +++++++++++++++++++++++++++++++-----
lib/tst_assert.c | 26 ++++++++++++++++++++------
2 files changed, 51 insertions(+), 11 deletions(-)
diff --git a/include/tst_assert.h b/include/tst_assert.h
index dcb62dfea..9154b7249 100644
--- a/include/tst_assert.h
+++ b/include/tst_assert.h
@@ -21,14 +21,40 @@ void tst_assert_int(const char *file, const int lineno,
#define TST_ASSERT_FILE_INT(path, prefix, val) \
tst_assert_file_int(__FILE__, __LINE__, path, prefix, val)
-/*
- * Same as tst_assert_int() but for unsigned long.
+/**
+ * enum tst_assert_flags - Flags for tst_assert_ulong().
+ *
+ * @TST_ASSERT_NONE: No flags, default direct comparison.
+ * @TST_ASSERT_SATURATED_INT: Clamps the value at %INT_MAX if it exceeds it.
+ * @TST_ASSERT_TRUNC_32BIT: Keeps only the low 32 bits of the read value,
+ * truncating any higher bits.
+ */
+enum tst_assert_flags {
+ TST_ASSERT_NONE = 0x00,
+ TST_ASSERT_SATURATED_INT = 0x01,
+ TST_ASSERT_TRUNC_32BIT = 0x02,
+};
+
+/**
+ * tst_assert_ulong() - Assert that an unsigned long value in a file matches.
+ * @file: The source file of the assertion (usually __FILE__).
+ * @lineno: The source line number of the assertion (usually __LINE__).
+ * @path: Path to the sysfs or procfs file to read from.
+ * @val: The expected unsigned long value to compare against.
+ * @flags: Bitwise flags controlling how the read value is processed.
+ * See &enum tst_assert_flags.
+ *
+ * This function reads an integer value from the file specified by @path
+ * and compares it with @val. It allows handling of 32-bit compat mode
+ * truncation/clamping on 64-bit systems via @flags.
*/
void tst_assert_ulong(const char *file, const int lineno,
- const char *path, unsigned long val);
+ const char *path, unsigned long val,
+ enum tst_assert_flags flags);
-#define TST_ASSERT_ULONG(path, val) \
- tst_assert_ulong(__FILE__, __LINE__, path, val)
+#define TST_ASSERT_ULONG(path, val, ...) \
+ tst_assert_ulong(__FILE__, __LINE__, path, val, \
+ TST_2_(dummy, ##__VA_ARGS__, TST_ASSERT_NONE))
/*
* Asserts that integer value stored in the prefix field of file pointed by path
diff --git a/lib/tst_assert.c b/lib/tst_assert.c
index b68bd5d39..04241d31b 100644
--- a/lib/tst_assert.c
+++ b/lib/tst_assert.c
@@ -23,18 +23,32 @@ void tst_assert_int(const char *file, const int lineno, const char *path, int va
tst_res_(file, lineno, TFAIL, "%s != %d got %d", path, val, sys_val);
}
-void tst_assert_ulong(const char *file, const int lineno, const char *path, unsigned long val)
+void tst_assert_ulong(const char *file, const int lineno, const char *path,
+ unsigned long val, enum tst_assert_flags flags)
{
- unsigned long sys_val;
-
- safe_file_scanf(file, lineno, NULL, path, "%lu", &sys_val);
+ unsigned long long sys_val_64;
+ unsigned long expected_val;
+
+ safe_file_scanf(file, lineno, NULL, path, "%llu", &sys_val_64);
+
+ if (flags & TST_ASSERT_SATURATED_INT) {
+ if (sys_val_64 > (unsigned long long)INT_MAX)
+ expected_val = (unsigned long)INT_MAX;
+ else
+ expected_val = (unsigned long)sys_val_64;
+ } else if (flags & TST_ASSERT_TRUNC_32BIT) {
+ expected_val = (unsigned long)(sys_val_64 & 0xFFFFFFFFULL);
+ } else {
+ expected_val = (unsigned long)sys_val_64;
+ }
- if (val == sys_val) {
+ if (val == expected_val) {
tst_res_(file, lineno, TPASS, "%s = %lu", path, val);
return;
}
- tst_res_(file, lineno, TFAIL, "%s != %lu got %lu", path, val, sys_val);
+ tst_res_(file, lineno, TFAIL, "%s != %lu got %lu (raw: %llu)",
+ path, val, expected_val, sys_val_64);
}
void tst_assert_file_int(const char *file, const int lineno, const char *path, const char *prefix, int val)
--
2.55.0
More information about the ltp
mailing list