1 // SPDX-License-Identifier: GPL-2.0-or-later
3 * KUnit test for the assertion formatting functions.
6 #include <kunit/test.h>
7 #include "string-stream.h"
9 #define TEST_PTR_EXPECTED_BUF_SIZE 32
10 #define HEXDUMP_TEST_BUF_LEN 5
11 #define ASSERT_TEST_EXPECT_CONTAIN(test, str, substr) KUNIT_EXPECT_TRUE(test, strstr(str, substr))
12 #define ASSERT_TEST_EXPECT_NCONTAIN(test, str, substr) KUNIT_EXPECT_FALSE(test, strstr(str, substr))
14 static void kunit_test_is_literal(struct kunit *test)
16 KUNIT_EXPECT_TRUE(test, is_literal("5", 5));
17 KUNIT_EXPECT_TRUE(test, is_literal("0", 0));
18 KUNIT_EXPECT_TRUE(test, is_literal("1234567890", 1234567890));
19 KUNIT_EXPECT_TRUE(test, is_literal("-1234567890", -1234567890));
20 KUNIT_EXPECT_FALSE(test, is_literal("05", 5));
21 KUNIT_EXPECT_FALSE(test, is_literal("", 0));
22 KUNIT_EXPECT_FALSE(test, is_literal("-0", 0));
23 KUNIT_EXPECT_FALSE(test, is_literal("12#45", 1245));
26 static void kunit_test_is_str_literal(struct kunit *test)
28 KUNIT_EXPECT_TRUE(test, is_str_literal("\"Hello, World!\"", "Hello, World!"));
29 KUNIT_EXPECT_TRUE(test, is_str_literal("\"\"", ""));
30 KUNIT_EXPECT_TRUE(test, is_str_literal("\"\"\"", "\""));
31 KUNIT_EXPECT_FALSE(test, is_str_literal("", ""));
32 KUNIT_EXPECT_FALSE(test, is_str_literal("\"", "\""));
33 KUNIT_EXPECT_FALSE(test, is_str_literal("\"Abacaba", "Abacaba"));
34 KUNIT_EXPECT_FALSE(test, is_str_literal("Abacaba\"", "Abacaba"));
35 KUNIT_EXPECT_FALSE(test, is_str_literal("\"Abacaba\"", "\"Abacaba\""));
38 KUNIT_DEFINE_ACTION_WRAPPER(kfree_wrapper, kfree, const void *);
40 /* this function is used to get a "char *" string from the string stream and defer its cleanup */
41 static char *get_str_from_stream(struct kunit *test, struct string_stream *stream)
43 char *str = string_stream_get_string(stream);
45 KUNIT_ASSERT_NOT_ERR_OR_NULL(test, str);
46 kunit_add_action(test, kfree_wrapper, (void *)str);
51 static void kunit_test_assert_prologue(struct kunit *test)
53 struct string_stream *stream;
55 const struct kunit_loc location = {
60 stream = kunit_alloc_string_stream(test, GFP_KERNEL);
61 KUNIT_ASSERT_NOT_ERR_OR_NULL(test, stream);
63 /* Test an expectation fail prologue */
64 kunit_assert_prologue(&location, KUNIT_EXPECTATION, stream);
65 str = get_str_from_stream(test, stream);
66 ASSERT_TEST_EXPECT_CONTAIN(test, str, "EXPECTATION");
67 ASSERT_TEST_EXPECT_CONTAIN(test, str, "testfile.c");
68 ASSERT_TEST_EXPECT_CONTAIN(test, str, "1337");
70 /* Test an assertion fail prologue */
71 string_stream_clear(stream);
72 kunit_assert_prologue(&location, KUNIT_ASSERTION, stream);
73 str = get_str_from_stream(test, stream);
74 ASSERT_TEST_EXPECT_CONTAIN(test, str, "ASSERTION");
75 ASSERT_TEST_EXPECT_CONTAIN(test, str, "testfile.c");
76 ASSERT_TEST_EXPECT_CONTAIN(test, str, "1337");
80 * This function accepts an arbitrary count of parameters and generates a va_format struct,
81 * which can be used to validate kunit_assert_print_msg function
83 static void verify_assert_print_msg(struct kunit *test,
84 struct string_stream *stream,
85 char *expected, const char *format, ...)
88 const struct va_format vformat = {
93 va_start(list, format);
94 string_stream_clear(stream);
95 kunit_assert_print_msg(&vformat, stream);
96 KUNIT_EXPECT_STREQ(test, get_str_from_stream(test, stream), expected);
99 static void kunit_test_assert_print_msg(struct kunit *test)
101 struct string_stream *stream;
103 stream = kunit_alloc_string_stream(test, GFP_KERNEL);
104 KUNIT_ASSERT_NOT_ERR_OR_NULL(test, stream);
106 verify_assert_print_msg(test, stream, "\nTest", "Test");
107 verify_assert_print_msg(test, stream, "\nAbacaba -123 234", "%s %d %u",
108 "Abacaba", -123, 234U);
109 verify_assert_print_msg(test, stream, "", NULL);
113 * Further code contains the tests for different assert format functions.
114 * This helper function accepts the assert format function, executes it and
115 * validates the result string from the stream by checking that all of the
116 * substrings exist in the output.
118 static void validate_assert(assert_format_t format_func, struct kunit *test,
119 const struct kunit_assert *assert,
120 struct string_stream *stream, int num_checks, ...)
124 char *cur_substr_exp;
125 struct va_format message = { NULL, NULL };
127 va_start(checks, num_checks);
128 string_stream_clear(stream);
129 format_func(assert, &message, stream);
131 for (i = 0; i < num_checks; i++) {
132 cur_substr_exp = va_arg(checks, char *);
133 ASSERT_TEST_EXPECT_CONTAIN(test, get_str_from_stream(test, stream), cur_substr_exp);
137 static void kunit_test_unary_assert_format(struct kunit *test)
139 struct string_stream *stream;
140 struct kunit_assert assert = {};
141 struct kunit_unary_assert un_assert = {
144 .expected_true = true,
147 stream = kunit_alloc_string_stream(test, GFP_KERNEL);
148 KUNIT_ASSERT_NOT_ERR_OR_NULL(test, stream);
150 validate_assert(kunit_unary_assert_format, test, &un_assert.assert,
151 stream, 2, "true", "is false");
153 un_assert.expected_true = false;
154 validate_assert(kunit_unary_assert_format, test, &un_assert.assert,
155 stream, 2, "false", "is true");
158 static void kunit_test_ptr_not_err_assert_format(struct kunit *test)
160 struct string_stream *stream;
161 struct kunit_assert assert = {};
162 struct kunit_ptr_not_err_assert not_err_assert = {
168 stream = kunit_alloc_string_stream(test, GFP_KERNEL);
169 KUNIT_ASSERT_NOT_ERR_OR_NULL(test, stream);
171 /* Value is NULL. The corresponding message should be printed out */
172 validate_assert(kunit_ptr_not_err_assert_format, test,
173 ¬_err_assert.assert,
176 /* Value is not NULL, but looks like an error pointer. Error should be printed out */
177 not_err_assert.value = (void *)-12;
178 validate_assert(kunit_ptr_not_err_assert_format, test,
179 ¬_err_assert.assert, stream, 2,
183 static void kunit_test_binary_assert_format(struct kunit *test)
185 struct string_stream *stream;
186 struct kunit_assert assert = {};
187 struct kunit_binary_assert_text text = {
188 .left_text = "1 + 2",
192 const struct kunit_binary_assert binary_assert = {
199 stream = kunit_alloc_string_stream(test, GFP_KERNEL);
200 KUNIT_ASSERT_NOT_ERR_OR_NULL(test, stream);
203 * Printed values should depend on the input we provide: the left text, right text, left
204 * value and the right value.
206 validate_assert(kunit_binary_assert_format, test, &binary_assert.assert,
207 stream, 4, "1 + 2", "2", "3", "==");
209 text.right_text = "4 - 2";
210 validate_assert(kunit_binary_assert_format, test, &binary_assert.assert,
211 stream, 3, "==", "1 + 2", "4 - 2");
213 text.left_text = "3";
214 validate_assert(kunit_binary_assert_format, test, &binary_assert.assert,
215 stream, 4, "3", "4 - 2", "2", "==");
217 text.right_text = "2";
218 validate_assert(kunit_binary_assert_format, test, &binary_assert.assert,
219 stream, 3, "3", "2", "==");
222 static void kunit_test_binary_ptr_assert_format(struct kunit *test)
224 struct string_stream *stream;
225 struct kunit_assert assert = {};
226 char *addr_var_a, *addr_var_b;
227 static const void *var_a = (void *)0xDEADBEEF;
228 static const void *var_b = (void *)0xBADDCAFE;
229 struct kunit_binary_assert_text text = {
230 .left_text = "var_a",
232 .right_text = "var_b",
234 struct kunit_binary_ptr_assert binary_ptr_assert = {
238 .right_value = var_b,
241 addr_var_a = kunit_kzalloc(test, TEST_PTR_EXPECTED_BUF_SIZE, GFP_KERNEL);
242 KUNIT_ASSERT_NOT_ERR_OR_NULL(test, addr_var_a);
243 addr_var_b = kunit_kzalloc(test, TEST_PTR_EXPECTED_BUF_SIZE, GFP_KERNEL);
244 KUNIT_ASSERT_NOT_ERR_OR_NULL(test, addr_var_b);
246 * Print the addresses to the buffers first.
247 * This is necessary as we may have different count of leading zeros in the pointer
248 * on different architectures.
250 snprintf(addr_var_a, TEST_PTR_EXPECTED_BUF_SIZE, "%px", var_a);
251 snprintf(addr_var_b, TEST_PTR_EXPECTED_BUF_SIZE, "%px", var_b);
253 stream = kunit_alloc_string_stream(test, GFP_KERNEL);
254 KUNIT_ASSERT_NOT_ERR_OR_NULL(test, stream);
255 validate_assert(kunit_binary_ptr_assert_format, test, &binary_ptr_assert.assert,
256 stream, 3, addr_var_a, addr_var_b, "==");
259 static void kunit_test_binary_str_assert_format(struct kunit *test)
261 struct string_stream *stream;
262 struct kunit_assert assert = {};
263 static const char *var_a = "abacaba";
264 static const char *var_b = "kernel";
265 struct kunit_binary_assert_text text = {
266 .left_text = "var_a",
268 .right_text = "var_b",
270 struct kunit_binary_str_assert binary_str_assert = {
274 .right_value = var_b,
277 stream = kunit_alloc_string_stream(test, GFP_KERNEL);
278 KUNIT_ASSERT_NOT_ERR_OR_NULL(test, stream);
280 validate_assert(kunit_binary_str_assert_format, test,
281 &binary_str_assert.assert,
282 stream, 5, "var_a", "var_b", "\"abacaba\"",
285 text.left_text = "\"abacaba\"";
286 validate_assert(kunit_binary_str_assert_format, test, &binary_str_assert.assert,
287 stream, 4, "\"abacaba\"", "var_b", "\"kernel\"", "==");
289 text.right_text = "\"kernel\"";
290 validate_assert(kunit_binary_str_assert_format, test, &binary_str_assert.assert,
291 stream, 3, "\"abacaba\"", "\"kernel\"", "==");
294 static const u8 hex_testbuf1[] = { 0x26, 0x74, 0x6b, 0x9c, 0x55,
295 0x45, 0x9d, 0x47, 0xd6, 0x47,
296 0x2, 0x89, 0x8c, 0x81, 0x94,
298 static const u8 hex_testbuf2[] = { 0x26, 0x74, 0x6b, 0x9c, 0x55,
299 0x45, 0x9d, 0x47, 0x21, 0x47,
300 0xcd, 0x89, 0x24, 0x50, 0x94,
302 static void kunit_test_assert_hexdump(struct kunit *test)
304 struct string_stream *stream;
307 char buf[HEXDUMP_TEST_BUF_LEN];
309 stream = kunit_alloc_string_stream(test, GFP_KERNEL);
310 KUNIT_ASSERT_NOT_ERR_OR_NULL(test, stream);
311 /* Check that we are getting output like <xx> for non-matching numbers. */
312 kunit_assert_hexdump(stream, hex_testbuf1, hex_testbuf2, sizeof(hex_testbuf1));
313 str = get_str_from_stream(test, stream);
314 for (i = 0; i < sizeof(hex_testbuf1); i++) {
315 snprintf(buf, HEXDUMP_TEST_BUF_LEN, "<%02x>", hex_testbuf1[i]);
316 if (hex_testbuf1[i] != hex_testbuf2[i])
317 ASSERT_TEST_EXPECT_CONTAIN(test, str, buf);
319 /* We shouldn't get any <xx> numbers when comparing the buffer with itself. */
320 string_stream_clear(stream);
321 kunit_assert_hexdump(stream, hex_testbuf1, hex_testbuf1, sizeof(hex_testbuf1));
322 str = get_str_from_stream(test, stream);
323 ASSERT_TEST_EXPECT_NCONTAIN(test, str, "<");
324 ASSERT_TEST_EXPECT_NCONTAIN(test, str, ">");
327 static void kunit_test_mem_assert_format(struct kunit *test)
329 struct string_stream *stream;
330 struct string_stream *expected_stream;
331 struct kunit_assert assert = {};
332 static const struct kunit_binary_assert_text text = {
333 .left_text = "hex_testbuf1",
335 .right_text = "hex_testbuf2",
337 struct kunit_mem_assert mem_assert = {
341 .right_value = hex_testbuf2,
342 .size = sizeof(hex_testbuf1),
345 expected_stream = kunit_alloc_string_stream(test, GFP_KERNEL);
346 KUNIT_ASSERT_NOT_ERR_OR_NULL(test, expected_stream);
347 stream = kunit_alloc_string_stream(test, GFP_KERNEL);
348 KUNIT_ASSERT_NOT_ERR_OR_NULL(test, stream);
350 /* The left value is NULL */
351 validate_assert(kunit_mem_assert_format, test, &mem_assert.assert,
352 stream, 2, "hex_testbuf1", "is not null");
354 /* The right value is NULL, the left value is not NULL */
355 mem_assert.left_value = hex_testbuf1;
356 mem_assert.right_value = NULL;
357 validate_assert(kunit_mem_assert_format, test, &mem_assert.assert,
358 stream, 2, "hex_testbuf2", "is not null");
360 /* Both arguments are not null */
361 mem_assert.left_value = hex_testbuf1;
362 mem_assert.right_value = hex_testbuf2;
364 validate_assert(kunit_mem_assert_format, test, &mem_assert.assert,
365 stream, 3, "hex_testbuf1", "hex_testbuf2", "==");
368 static struct kunit_case assert_test_cases[] = {
369 KUNIT_CASE(kunit_test_is_literal),
370 KUNIT_CASE(kunit_test_is_str_literal),
371 KUNIT_CASE(kunit_test_assert_prologue),
372 KUNIT_CASE(kunit_test_assert_print_msg),
373 KUNIT_CASE(kunit_test_unary_assert_format),
374 KUNIT_CASE(kunit_test_ptr_not_err_assert_format),
375 KUNIT_CASE(kunit_test_binary_assert_format),
376 KUNIT_CASE(kunit_test_binary_ptr_assert_format),
377 KUNIT_CASE(kunit_test_binary_str_assert_format),
378 KUNIT_CASE(kunit_test_assert_hexdump),
379 KUNIT_CASE(kunit_test_mem_assert_format),
383 static struct kunit_suite assert_test_suite = {
384 .name = "kunit-assert",
385 .test_cases = assert_test_cases,
388 kunit_test_suites(&assert_test_suite);