xref: /linux-6.15/lib/kunit/assert_test.c (revision 2c7afc2a)
1*2c7afc2aSIvan Orlov // SPDX-License-Identifier: GPL-2.0-or-later
2*2c7afc2aSIvan Orlov /*
3*2c7afc2aSIvan Orlov  * KUnit test for the assertion formatting functions.
4*2c7afc2aSIvan Orlov  * Author: Ivan Orlov <[email protected]>
5*2c7afc2aSIvan Orlov  */
6*2c7afc2aSIvan Orlov #include <kunit/test.h>
7*2c7afc2aSIvan Orlov #include "string-stream.h"
8*2c7afc2aSIvan Orlov 
9*2c7afc2aSIvan Orlov #define TEST_PTR_EXPECTED_BUF_SIZE 32
10*2c7afc2aSIvan Orlov #define HEXDUMP_TEST_BUF_LEN 5
11*2c7afc2aSIvan Orlov #define ASSERT_TEST_EXPECT_CONTAIN(test, str, substr) KUNIT_EXPECT_TRUE(test, strstr(str, substr))
12*2c7afc2aSIvan Orlov #define ASSERT_TEST_EXPECT_NCONTAIN(test, str, substr) KUNIT_EXPECT_FALSE(test, strstr(str, substr))
13*2c7afc2aSIvan Orlov 
kunit_test_is_literal(struct kunit * test)14*2c7afc2aSIvan Orlov static void kunit_test_is_literal(struct kunit *test)
15*2c7afc2aSIvan Orlov {
16*2c7afc2aSIvan Orlov 	KUNIT_EXPECT_TRUE(test, is_literal("5", 5));
17*2c7afc2aSIvan Orlov 	KUNIT_EXPECT_TRUE(test, is_literal("0", 0));
18*2c7afc2aSIvan Orlov 	KUNIT_EXPECT_TRUE(test, is_literal("1234567890", 1234567890));
19*2c7afc2aSIvan Orlov 	KUNIT_EXPECT_TRUE(test, is_literal("-1234567890", -1234567890));
20*2c7afc2aSIvan Orlov 	KUNIT_EXPECT_FALSE(test, is_literal("05", 5));
21*2c7afc2aSIvan Orlov 	KUNIT_EXPECT_FALSE(test, is_literal("", 0));
22*2c7afc2aSIvan Orlov 	KUNIT_EXPECT_FALSE(test, is_literal("-0", 0));
23*2c7afc2aSIvan Orlov 	KUNIT_EXPECT_FALSE(test, is_literal("12#45", 1245));
24*2c7afc2aSIvan Orlov }
25*2c7afc2aSIvan Orlov 
kunit_test_is_str_literal(struct kunit * test)26*2c7afc2aSIvan Orlov static void kunit_test_is_str_literal(struct kunit *test)
27*2c7afc2aSIvan Orlov {
28*2c7afc2aSIvan Orlov 	KUNIT_EXPECT_TRUE(test, is_str_literal("\"Hello, World!\"", "Hello, World!"));
29*2c7afc2aSIvan Orlov 	KUNIT_EXPECT_TRUE(test, is_str_literal("\"\"", ""));
30*2c7afc2aSIvan Orlov 	KUNIT_EXPECT_TRUE(test, is_str_literal("\"\"\"", "\""));
31*2c7afc2aSIvan Orlov 	KUNIT_EXPECT_FALSE(test, is_str_literal("", ""));
32*2c7afc2aSIvan Orlov 	KUNIT_EXPECT_FALSE(test, is_str_literal("\"", "\""));
33*2c7afc2aSIvan Orlov 	KUNIT_EXPECT_FALSE(test, is_str_literal("\"Abacaba", "Abacaba"));
34*2c7afc2aSIvan Orlov 	KUNIT_EXPECT_FALSE(test, is_str_literal("Abacaba\"", "Abacaba"));
35*2c7afc2aSIvan Orlov 	KUNIT_EXPECT_FALSE(test, is_str_literal("\"Abacaba\"", "\"Abacaba\""));
36*2c7afc2aSIvan Orlov }
37*2c7afc2aSIvan Orlov 
38*2c7afc2aSIvan Orlov KUNIT_DEFINE_ACTION_WRAPPER(kfree_wrapper, kfree, const void *);
39*2c7afc2aSIvan Orlov 
40*2c7afc2aSIvan Orlov /* this function is used to get a "char *" string from the string stream and defer its cleanup  */
get_str_from_stream(struct kunit * test,struct string_stream * stream)41*2c7afc2aSIvan Orlov static char *get_str_from_stream(struct kunit *test, struct string_stream *stream)
42*2c7afc2aSIvan Orlov {
43*2c7afc2aSIvan Orlov 	char *str = string_stream_get_string(stream);
44*2c7afc2aSIvan Orlov 
45*2c7afc2aSIvan Orlov 	KUNIT_ASSERT_NOT_ERR_OR_NULL(test, str);
46*2c7afc2aSIvan Orlov 	kunit_add_action(test, kfree_wrapper, (void *)str);
47*2c7afc2aSIvan Orlov 
48*2c7afc2aSIvan Orlov 	return str;
49*2c7afc2aSIvan Orlov }
50*2c7afc2aSIvan Orlov 
kunit_test_assert_prologue(struct kunit * test)51*2c7afc2aSIvan Orlov static void kunit_test_assert_prologue(struct kunit *test)
52*2c7afc2aSIvan Orlov {
53*2c7afc2aSIvan Orlov 	struct string_stream *stream;
54*2c7afc2aSIvan Orlov 	char *str;
55*2c7afc2aSIvan Orlov 	const struct kunit_loc location = {
56*2c7afc2aSIvan Orlov 		.file = "testfile.c",
57*2c7afc2aSIvan Orlov 		.line = 1337,
58*2c7afc2aSIvan Orlov 	};
59*2c7afc2aSIvan Orlov 
60*2c7afc2aSIvan Orlov 	stream = kunit_alloc_string_stream(test, GFP_KERNEL);
61*2c7afc2aSIvan Orlov 	KUNIT_ASSERT_NOT_ERR_OR_NULL(test, stream);
62*2c7afc2aSIvan Orlov 
63*2c7afc2aSIvan Orlov 	/* Test an expectation fail prologue */
64*2c7afc2aSIvan Orlov 	kunit_assert_prologue(&location, KUNIT_EXPECTATION, stream);
65*2c7afc2aSIvan Orlov 	str = get_str_from_stream(test, stream);
66*2c7afc2aSIvan Orlov 	ASSERT_TEST_EXPECT_CONTAIN(test, str, "EXPECTATION");
67*2c7afc2aSIvan Orlov 	ASSERT_TEST_EXPECT_CONTAIN(test, str, "testfile.c");
68*2c7afc2aSIvan Orlov 	ASSERT_TEST_EXPECT_CONTAIN(test, str, "1337");
69*2c7afc2aSIvan Orlov 
70*2c7afc2aSIvan Orlov 	/* Test an assertion fail prologue */
71*2c7afc2aSIvan Orlov 	string_stream_clear(stream);
72*2c7afc2aSIvan Orlov 	kunit_assert_prologue(&location, KUNIT_ASSERTION, stream);
73*2c7afc2aSIvan Orlov 	str = get_str_from_stream(test, stream);
74*2c7afc2aSIvan Orlov 	ASSERT_TEST_EXPECT_CONTAIN(test, str, "ASSERTION");
75*2c7afc2aSIvan Orlov 	ASSERT_TEST_EXPECT_CONTAIN(test, str, "testfile.c");
76*2c7afc2aSIvan Orlov 	ASSERT_TEST_EXPECT_CONTAIN(test, str, "1337");
77*2c7afc2aSIvan Orlov }
78*2c7afc2aSIvan Orlov 
79*2c7afc2aSIvan Orlov /*
80*2c7afc2aSIvan Orlov  * This function accepts an arbitrary count of parameters and generates a va_format struct,
81*2c7afc2aSIvan Orlov  * which can be used to validate kunit_assert_print_msg function
82*2c7afc2aSIvan Orlov  */
verify_assert_print_msg(struct kunit * test,struct string_stream * stream,char * expected,const char * format,...)83*2c7afc2aSIvan Orlov static void verify_assert_print_msg(struct kunit *test,
84*2c7afc2aSIvan Orlov 				    struct string_stream *stream,
85*2c7afc2aSIvan Orlov 				    char *expected, const char *format, ...)
86*2c7afc2aSIvan Orlov {
87*2c7afc2aSIvan Orlov 	va_list list;
88*2c7afc2aSIvan Orlov 	const struct va_format vformat = {
89*2c7afc2aSIvan Orlov 		.fmt = format,
90*2c7afc2aSIvan Orlov 		.va = &list,
91*2c7afc2aSIvan Orlov 	};
92*2c7afc2aSIvan Orlov 
93*2c7afc2aSIvan Orlov 	va_start(list, format);
94*2c7afc2aSIvan Orlov 	string_stream_clear(stream);
95*2c7afc2aSIvan Orlov 	kunit_assert_print_msg(&vformat, stream);
96*2c7afc2aSIvan Orlov 	KUNIT_EXPECT_STREQ(test, get_str_from_stream(test, stream), expected);
97*2c7afc2aSIvan Orlov }
98*2c7afc2aSIvan Orlov 
kunit_test_assert_print_msg(struct kunit * test)99*2c7afc2aSIvan Orlov static void kunit_test_assert_print_msg(struct kunit *test)
100*2c7afc2aSIvan Orlov {
101*2c7afc2aSIvan Orlov 	struct string_stream *stream;
102*2c7afc2aSIvan Orlov 
103*2c7afc2aSIvan Orlov 	stream = kunit_alloc_string_stream(test, GFP_KERNEL);
104*2c7afc2aSIvan Orlov 	KUNIT_ASSERT_NOT_ERR_OR_NULL(test, stream);
105*2c7afc2aSIvan Orlov 
106*2c7afc2aSIvan Orlov 	verify_assert_print_msg(test, stream, "\nTest", "Test");
107*2c7afc2aSIvan Orlov 	verify_assert_print_msg(test, stream, "\nAbacaba -123 234", "%s %d %u",
108*2c7afc2aSIvan Orlov 				"Abacaba", -123, 234U);
109*2c7afc2aSIvan Orlov 	verify_assert_print_msg(test, stream, "", NULL);
110*2c7afc2aSIvan Orlov }
111*2c7afc2aSIvan Orlov 
112*2c7afc2aSIvan Orlov /*
113*2c7afc2aSIvan Orlov  * Further code contains the tests for different assert format functions.
114*2c7afc2aSIvan Orlov  * This helper function accepts the assert format function, executes it and
115*2c7afc2aSIvan Orlov  * validates the result string from the stream by checking that all of the
116*2c7afc2aSIvan Orlov  * substrings exist in the output.
117*2c7afc2aSIvan Orlov  */
validate_assert(assert_format_t format_func,struct kunit * test,const struct kunit_assert * assert,struct string_stream * stream,int num_checks,...)118*2c7afc2aSIvan Orlov static void validate_assert(assert_format_t format_func, struct kunit *test,
119*2c7afc2aSIvan Orlov 			    const struct kunit_assert *assert,
120*2c7afc2aSIvan Orlov 			    struct string_stream *stream, int num_checks, ...)
121*2c7afc2aSIvan Orlov {
122*2c7afc2aSIvan Orlov 	size_t i;
123*2c7afc2aSIvan Orlov 	va_list checks;
124*2c7afc2aSIvan Orlov 	char *cur_substr_exp;
125*2c7afc2aSIvan Orlov 	struct va_format message = { NULL, NULL };
126*2c7afc2aSIvan Orlov 
127*2c7afc2aSIvan Orlov 	va_start(checks, num_checks);
128*2c7afc2aSIvan Orlov 	string_stream_clear(stream);
129*2c7afc2aSIvan Orlov 	format_func(assert, &message, stream);
130*2c7afc2aSIvan Orlov 
131*2c7afc2aSIvan Orlov 	for (i = 0; i < num_checks; i++) {
132*2c7afc2aSIvan Orlov 		cur_substr_exp = va_arg(checks, char *);
133*2c7afc2aSIvan Orlov 		ASSERT_TEST_EXPECT_CONTAIN(test, get_str_from_stream(test, stream), cur_substr_exp);
134*2c7afc2aSIvan Orlov 	}
135*2c7afc2aSIvan Orlov }
136*2c7afc2aSIvan Orlov 
kunit_test_unary_assert_format(struct kunit * test)137*2c7afc2aSIvan Orlov static void kunit_test_unary_assert_format(struct kunit *test)
138*2c7afc2aSIvan Orlov {
139*2c7afc2aSIvan Orlov 	struct string_stream *stream;
140*2c7afc2aSIvan Orlov 	struct kunit_assert assert = {};
141*2c7afc2aSIvan Orlov 	struct kunit_unary_assert un_assert = {
142*2c7afc2aSIvan Orlov 		.assert = assert,
143*2c7afc2aSIvan Orlov 		.condition = "expr",
144*2c7afc2aSIvan Orlov 		.expected_true = true,
145*2c7afc2aSIvan Orlov 	};
146*2c7afc2aSIvan Orlov 
147*2c7afc2aSIvan Orlov 	stream = kunit_alloc_string_stream(test, GFP_KERNEL);
148*2c7afc2aSIvan Orlov 	KUNIT_ASSERT_NOT_ERR_OR_NULL(test, stream);
149*2c7afc2aSIvan Orlov 
150*2c7afc2aSIvan Orlov 	validate_assert(kunit_unary_assert_format, test, &un_assert.assert,
151*2c7afc2aSIvan Orlov 			stream, 2, "true", "is false");
152*2c7afc2aSIvan Orlov 
153*2c7afc2aSIvan Orlov 	un_assert.expected_true = false;
154*2c7afc2aSIvan Orlov 	validate_assert(kunit_unary_assert_format, test, &un_assert.assert,
155*2c7afc2aSIvan Orlov 			stream, 2, "false", "is true");
156*2c7afc2aSIvan Orlov }
157*2c7afc2aSIvan Orlov 
kunit_test_ptr_not_err_assert_format(struct kunit * test)158*2c7afc2aSIvan Orlov static void kunit_test_ptr_not_err_assert_format(struct kunit *test)
159*2c7afc2aSIvan Orlov {
160*2c7afc2aSIvan Orlov 	struct string_stream *stream;
161*2c7afc2aSIvan Orlov 	struct kunit_assert assert = {};
162*2c7afc2aSIvan Orlov 	struct kunit_ptr_not_err_assert not_err_assert = {
163*2c7afc2aSIvan Orlov 		.assert = assert,
164*2c7afc2aSIvan Orlov 		.text = "expr",
165*2c7afc2aSIvan Orlov 		.value = NULL,
166*2c7afc2aSIvan Orlov 	};
167*2c7afc2aSIvan Orlov 
168*2c7afc2aSIvan Orlov 	stream = kunit_alloc_string_stream(test, GFP_KERNEL);
169*2c7afc2aSIvan Orlov 	KUNIT_ASSERT_NOT_ERR_OR_NULL(test, stream);
170*2c7afc2aSIvan Orlov 
171*2c7afc2aSIvan Orlov 	/* Value is NULL. The corresponding message should be printed out */
172*2c7afc2aSIvan Orlov 	validate_assert(kunit_ptr_not_err_assert_format, test,
173*2c7afc2aSIvan Orlov 			&not_err_assert.assert,
174*2c7afc2aSIvan Orlov 			stream, 1, "null");
175*2c7afc2aSIvan Orlov 
176*2c7afc2aSIvan Orlov 	/* Value is not NULL, but looks like an error pointer. Error should be printed out */
177*2c7afc2aSIvan Orlov 	not_err_assert.value = (void *)-12;
178*2c7afc2aSIvan Orlov 	validate_assert(kunit_ptr_not_err_assert_format, test,
179*2c7afc2aSIvan Orlov 			&not_err_assert.assert, stream, 2,
180*2c7afc2aSIvan Orlov 			"error", "-12");
181*2c7afc2aSIvan Orlov }
182*2c7afc2aSIvan Orlov 
kunit_test_binary_assert_format(struct kunit * test)183*2c7afc2aSIvan Orlov static void kunit_test_binary_assert_format(struct kunit *test)
184*2c7afc2aSIvan Orlov {
185*2c7afc2aSIvan Orlov 	struct string_stream *stream;
186*2c7afc2aSIvan Orlov 	struct kunit_assert assert = {};
187*2c7afc2aSIvan Orlov 	struct kunit_binary_assert_text text = {
188*2c7afc2aSIvan Orlov 		.left_text = "1 + 2",
189*2c7afc2aSIvan Orlov 		.operation = "==",
190*2c7afc2aSIvan Orlov 		.right_text = "2",
191*2c7afc2aSIvan Orlov 	};
192*2c7afc2aSIvan Orlov 	const struct kunit_binary_assert binary_assert = {
193*2c7afc2aSIvan Orlov 		.assert = assert,
194*2c7afc2aSIvan Orlov 		.text = &text,
195*2c7afc2aSIvan Orlov 		.left_value = 3,
196*2c7afc2aSIvan Orlov 		.right_value = 2,
197*2c7afc2aSIvan Orlov 	};
198*2c7afc2aSIvan Orlov 
199*2c7afc2aSIvan Orlov 	stream = kunit_alloc_string_stream(test, GFP_KERNEL);
200*2c7afc2aSIvan Orlov 	KUNIT_ASSERT_NOT_ERR_OR_NULL(test, stream);
201*2c7afc2aSIvan Orlov 
202*2c7afc2aSIvan Orlov 	/*
203*2c7afc2aSIvan Orlov 	 * Printed values should depend on the input we provide: the left text, right text, left
204*2c7afc2aSIvan Orlov 	 * value and the right value.
205*2c7afc2aSIvan Orlov 	 */
206*2c7afc2aSIvan Orlov 	validate_assert(kunit_binary_assert_format, test, &binary_assert.assert,
207*2c7afc2aSIvan Orlov 			stream, 4, "1 + 2", "2", "3", "==");
208*2c7afc2aSIvan Orlov 
209*2c7afc2aSIvan Orlov 	text.right_text = "4 - 2";
210*2c7afc2aSIvan Orlov 	validate_assert(kunit_binary_assert_format, test, &binary_assert.assert,
211*2c7afc2aSIvan Orlov 			stream, 3, "==", "1 + 2", "4 - 2");
212*2c7afc2aSIvan Orlov 
213*2c7afc2aSIvan Orlov 	text.left_text = "3";
214*2c7afc2aSIvan Orlov 	validate_assert(kunit_binary_assert_format, test, &binary_assert.assert,
215*2c7afc2aSIvan Orlov 			stream, 4, "3", "4 - 2", "2", "==");
216*2c7afc2aSIvan Orlov 
217*2c7afc2aSIvan Orlov 	text.right_text = "2";
218*2c7afc2aSIvan Orlov 	validate_assert(kunit_binary_assert_format, test, &binary_assert.assert,
219*2c7afc2aSIvan Orlov 			stream, 3, "3", "2", "==");
220*2c7afc2aSIvan Orlov }
221*2c7afc2aSIvan Orlov 
kunit_test_binary_ptr_assert_format(struct kunit * test)222*2c7afc2aSIvan Orlov static void kunit_test_binary_ptr_assert_format(struct kunit *test)
223*2c7afc2aSIvan Orlov {
224*2c7afc2aSIvan Orlov 	struct string_stream *stream;
225*2c7afc2aSIvan Orlov 	struct kunit_assert assert = {};
226*2c7afc2aSIvan Orlov 	char *addr_var_a, *addr_var_b;
227*2c7afc2aSIvan Orlov 	static const void *var_a = (void *)0xDEADBEEF;
228*2c7afc2aSIvan Orlov 	static const void *var_b = (void *)0xBADDCAFE;
229*2c7afc2aSIvan Orlov 	struct kunit_binary_assert_text text = {
230*2c7afc2aSIvan Orlov 		.left_text = "var_a",
231*2c7afc2aSIvan Orlov 		.operation = "==",
232*2c7afc2aSIvan Orlov 		.right_text = "var_b",
233*2c7afc2aSIvan Orlov 	};
234*2c7afc2aSIvan Orlov 	struct kunit_binary_ptr_assert binary_ptr_assert = {
235*2c7afc2aSIvan Orlov 		.assert = assert,
236*2c7afc2aSIvan Orlov 		.text = &text,
237*2c7afc2aSIvan Orlov 		.left_value = var_a,
238*2c7afc2aSIvan Orlov 		.right_value = var_b,
239*2c7afc2aSIvan Orlov 	};
240*2c7afc2aSIvan Orlov 
241*2c7afc2aSIvan Orlov 	addr_var_a = kunit_kzalloc(test, TEST_PTR_EXPECTED_BUF_SIZE, GFP_KERNEL);
242*2c7afc2aSIvan Orlov 	KUNIT_ASSERT_NOT_ERR_OR_NULL(test, addr_var_a);
243*2c7afc2aSIvan Orlov 	addr_var_b = kunit_kzalloc(test, TEST_PTR_EXPECTED_BUF_SIZE, GFP_KERNEL);
244*2c7afc2aSIvan Orlov 	KUNIT_ASSERT_NOT_ERR_OR_NULL(test, addr_var_b);
245*2c7afc2aSIvan Orlov 	/*
246*2c7afc2aSIvan Orlov 	 * Print the addresses to the buffers first.
247*2c7afc2aSIvan Orlov 	 * This is necessary as we may have different count of leading zeros in the pointer
248*2c7afc2aSIvan Orlov 	 * on different architectures.
249*2c7afc2aSIvan Orlov 	 */
250*2c7afc2aSIvan Orlov 	snprintf(addr_var_a, TEST_PTR_EXPECTED_BUF_SIZE, "%px", var_a);
251*2c7afc2aSIvan Orlov 	snprintf(addr_var_b, TEST_PTR_EXPECTED_BUF_SIZE, "%px", var_b);
252*2c7afc2aSIvan Orlov 
253*2c7afc2aSIvan Orlov 	stream = kunit_alloc_string_stream(test, GFP_KERNEL);
254*2c7afc2aSIvan Orlov 	KUNIT_ASSERT_NOT_ERR_OR_NULL(test, stream);
255*2c7afc2aSIvan Orlov 	validate_assert(kunit_binary_ptr_assert_format, test, &binary_ptr_assert.assert,
256*2c7afc2aSIvan Orlov 			stream, 3, addr_var_a, addr_var_b, "==");
257*2c7afc2aSIvan Orlov }
258*2c7afc2aSIvan Orlov 
kunit_test_binary_str_assert_format(struct kunit * test)259*2c7afc2aSIvan Orlov static void kunit_test_binary_str_assert_format(struct kunit *test)
260*2c7afc2aSIvan Orlov {
261*2c7afc2aSIvan Orlov 	struct string_stream *stream;
262*2c7afc2aSIvan Orlov 	struct kunit_assert assert = {};
263*2c7afc2aSIvan Orlov 	static const char *var_a = "abacaba";
264*2c7afc2aSIvan Orlov 	static const char *var_b = "kernel";
265*2c7afc2aSIvan Orlov 	struct kunit_binary_assert_text text = {
266*2c7afc2aSIvan Orlov 		.left_text = "var_a",
267*2c7afc2aSIvan Orlov 		.operation = "==",
268*2c7afc2aSIvan Orlov 		.right_text = "var_b",
269*2c7afc2aSIvan Orlov 	};
270*2c7afc2aSIvan Orlov 	struct kunit_binary_str_assert binary_str_assert = {
271*2c7afc2aSIvan Orlov 		.assert = assert,
272*2c7afc2aSIvan Orlov 		.text = &text,
273*2c7afc2aSIvan Orlov 		.left_value = var_a,
274*2c7afc2aSIvan Orlov 		.right_value = var_b,
275*2c7afc2aSIvan Orlov 	};
276*2c7afc2aSIvan Orlov 
277*2c7afc2aSIvan Orlov 	stream = kunit_alloc_string_stream(test, GFP_KERNEL);
278*2c7afc2aSIvan Orlov 	KUNIT_ASSERT_NOT_ERR_OR_NULL(test, stream);
279*2c7afc2aSIvan Orlov 
280*2c7afc2aSIvan Orlov 	validate_assert(kunit_binary_str_assert_format, test,
281*2c7afc2aSIvan Orlov 			&binary_str_assert.assert,
282*2c7afc2aSIvan Orlov 			stream, 5, "var_a", "var_b", "\"abacaba\"",
283*2c7afc2aSIvan Orlov 			"\"kernel\"", "==");
284*2c7afc2aSIvan Orlov 
285*2c7afc2aSIvan Orlov 	text.left_text = "\"abacaba\"";
286*2c7afc2aSIvan Orlov 	validate_assert(kunit_binary_str_assert_format, test, &binary_str_assert.assert,
287*2c7afc2aSIvan Orlov 			stream, 4, "\"abacaba\"", "var_b", "\"kernel\"", "==");
288*2c7afc2aSIvan Orlov 
289*2c7afc2aSIvan Orlov 	text.right_text = "\"kernel\"";
290*2c7afc2aSIvan Orlov 	validate_assert(kunit_binary_str_assert_format, test, &binary_str_assert.assert,
291*2c7afc2aSIvan Orlov 			stream, 3, "\"abacaba\"", "\"kernel\"", "==");
292*2c7afc2aSIvan Orlov }
293*2c7afc2aSIvan Orlov 
294*2c7afc2aSIvan Orlov static const u8 hex_testbuf1[] = { 0x26, 0x74, 0x6b, 0x9c, 0x55,
295*2c7afc2aSIvan Orlov 				   0x45, 0x9d, 0x47, 0xd6, 0x47,
296*2c7afc2aSIvan Orlov 				   0x2,  0x89, 0x8c, 0x81, 0x94,
297*2c7afc2aSIvan Orlov 				   0x12, 0xfe, 0x01 };
298*2c7afc2aSIvan Orlov static const u8 hex_testbuf2[] = { 0x26, 0x74, 0x6b, 0x9c, 0x55,
299*2c7afc2aSIvan Orlov 				   0x45, 0x9d, 0x47, 0x21, 0x47,
300*2c7afc2aSIvan Orlov 				   0xcd, 0x89, 0x24, 0x50, 0x94,
301*2c7afc2aSIvan Orlov 				   0x12, 0xba, 0x01 };
kunit_test_assert_hexdump(struct kunit * test)302*2c7afc2aSIvan Orlov static void kunit_test_assert_hexdump(struct kunit *test)
303*2c7afc2aSIvan Orlov {
304*2c7afc2aSIvan Orlov 	struct string_stream *stream;
305*2c7afc2aSIvan Orlov 	char *str;
306*2c7afc2aSIvan Orlov 	size_t i;
307*2c7afc2aSIvan Orlov 	char buf[HEXDUMP_TEST_BUF_LEN];
308*2c7afc2aSIvan Orlov 
309*2c7afc2aSIvan Orlov 	stream = kunit_alloc_string_stream(test, GFP_KERNEL);
310*2c7afc2aSIvan Orlov 	KUNIT_ASSERT_NOT_ERR_OR_NULL(test, stream);
311*2c7afc2aSIvan Orlov 	/* Check that we are getting output like <xx> for non-matching numbers. */
312*2c7afc2aSIvan Orlov 	kunit_assert_hexdump(stream, hex_testbuf1, hex_testbuf2, sizeof(hex_testbuf1));
313*2c7afc2aSIvan Orlov 	str = get_str_from_stream(test, stream);
314*2c7afc2aSIvan Orlov 	for (i = 0; i < sizeof(hex_testbuf1); i++) {
315*2c7afc2aSIvan Orlov 		snprintf(buf, HEXDUMP_TEST_BUF_LEN, "<%02x>", hex_testbuf1[i]);
316*2c7afc2aSIvan Orlov 		if (hex_testbuf1[i] != hex_testbuf2[i])
317*2c7afc2aSIvan Orlov 			ASSERT_TEST_EXPECT_CONTAIN(test, str, buf);
318*2c7afc2aSIvan Orlov 	}
319*2c7afc2aSIvan Orlov 	/* We shouldn't get any <xx> numbers when comparing the buffer with itself. */
320*2c7afc2aSIvan Orlov 	string_stream_clear(stream);
321*2c7afc2aSIvan Orlov 	kunit_assert_hexdump(stream, hex_testbuf1, hex_testbuf1, sizeof(hex_testbuf1));
322*2c7afc2aSIvan Orlov 	str = get_str_from_stream(test, stream);
323*2c7afc2aSIvan Orlov 	ASSERT_TEST_EXPECT_NCONTAIN(test, str, "<");
324*2c7afc2aSIvan Orlov 	ASSERT_TEST_EXPECT_NCONTAIN(test, str, ">");
325*2c7afc2aSIvan Orlov }
326*2c7afc2aSIvan Orlov 
kunit_test_mem_assert_format(struct kunit * test)327*2c7afc2aSIvan Orlov static void kunit_test_mem_assert_format(struct kunit *test)
328*2c7afc2aSIvan Orlov {
329*2c7afc2aSIvan Orlov 	struct string_stream *stream;
330*2c7afc2aSIvan Orlov 	struct string_stream *expected_stream;
331*2c7afc2aSIvan Orlov 	struct kunit_assert assert = {};
332*2c7afc2aSIvan Orlov 	static const struct kunit_binary_assert_text text = {
333*2c7afc2aSIvan Orlov 		.left_text = "hex_testbuf1",
334*2c7afc2aSIvan Orlov 		.operation = "==",
335*2c7afc2aSIvan Orlov 		.right_text = "hex_testbuf2",
336*2c7afc2aSIvan Orlov 	};
337*2c7afc2aSIvan Orlov 	struct kunit_mem_assert mem_assert = {
338*2c7afc2aSIvan Orlov 		.assert = assert,
339*2c7afc2aSIvan Orlov 		.text = &text,
340*2c7afc2aSIvan Orlov 		.left_value = NULL,
341*2c7afc2aSIvan Orlov 		.right_value = hex_testbuf2,
342*2c7afc2aSIvan Orlov 		.size = sizeof(hex_testbuf1),
343*2c7afc2aSIvan Orlov 	};
344*2c7afc2aSIvan Orlov 
345*2c7afc2aSIvan Orlov 	expected_stream = kunit_alloc_string_stream(test, GFP_KERNEL);
346*2c7afc2aSIvan Orlov 	KUNIT_ASSERT_NOT_ERR_OR_NULL(test, expected_stream);
347*2c7afc2aSIvan Orlov 	stream = kunit_alloc_string_stream(test, GFP_KERNEL);
348*2c7afc2aSIvan Orlov 	KUNIT_ASSERT_NOT_ERR_OR_NULL(test, stream);
349*2c7afc2aSIvan Orlov 
350*2c7afc2aSIvan Orlov 	/* The left value is NULL */
351*2c7afc2aSIvan Orlov 	validate_assert(kunit_mem_assert_format, test, &mem_assert.assert,
352*2c7afc2aSIvan Orlov 			stream, 2, "hex_testbuf1", "is not null");
353*2c7afc2aSIvan Orlov 
354*2c7afc2aSIvan Orlov 	/* The right value is NULL, the left value is not NULL */
355*2c7afc2aSIvan Orlov 	mem_assert.left_value = hex_testbuf1;
356*2c7afc2aSIvan Orlov 	mem_assert.right_value = NULL;
357*2c7afc2aSIvan Orlov 	validate_assert(kunit_mem_assert_format, test, &mem_assert.assert,
358*2c7afc2aSIvan Orlov 			stream, 2, "hex_testbuf2", "is not null");
359*2c7afc2aSIvan Orlov 
360*2c7afc2aSIvan Orlov 	/* Both arguments are not null */
361*2c7afc2aSIvan Orlov 	mem_assert.left_value = hex_testbuf1;
362*2c7afc2aSIvan Orlov 	mem_assert.right_value = hex_testbuf2;
363*2c7afc2aSIvan Orlov 
364*2c7afc2aSIvan Orlov 	validate_assert(kunit_mem_assert_format, test, &mem_assert.assert,
365*2c7afc2aSIvan Orlov 			stream, 3, "hex_testbuf1", "hex_testbuf2", "==");
366*2c7afc2aSIvan Orlov }
367*2c7afc2aSIvan Orlov 
368*2c7afc2aSIvan Orlov static struct kunit_case assert_test_cases[] = {
369*2c7afc2aSIvan Orlov 	KUNIT_CASE(kunit_test_is_literal),
370*2c7afc2aSIvan Orlov 	KUNIT_CASE(kunit_test_is_str_literal),
371*2c7afc2aSIvan Orlov 	KUNIT_CASE(kunit_test_assert_prologue),
372*2c7afc2aSIvan Orlov 	KUNIT_CASE(kunit_test_assert_print_msg),
373*2c7afc2aSIvan Orlov 	KUNIT_CASE(kunit_test_unary_assert_format),
374*2c7afc2aSIvan Orlov 	KUNIT_CASE(kunit_test_ptr_not_err_assert_format),
375*2c7afc2aSIvan Orlov 	KUNIT_CASE(kunit_test_binary_assert_format),
376*2c7afc2aSIvan Orlov 	KUNIT_CASE(kunit_test_binary_ptr_assert_format),
377*2c7afc2aSIvan Orlov 	KUNIT_CASE(kunit_test_binary_str_assert_format),
378*2c7afc2aSIvan Orlov 	KUNIT_CASE(kunit_test_assert_hexdump),
379*2c7afc2aSIvan Orlov 	KUNIT_CASE(kunit_test_mem_assert_format),
380*2c7afc2aSIvan Orlov 	{}
381*2c7afc2aSIvan Orlov };
382*2c7afc2aSIvan Orlov 
383*2c7afc2aSIvan Orlov static struct kunit_suite assert_test_suite = {
384*2c7afc2aSIvan Orlov 	.name = "kunit-assert",
385*2c7afc2aSIvan Orlov 	.test_cases = assert_test_cases,
386*2c7afc2aSIvan Orlov };
387*2c7afc2aSIvan Orlov 
388*2c7afc2aSIvan Orlov kunit_test_suites(&assert_test_suite);
389