xref: /linux/include/kunit/assert.h (revision be58f7103700a68d5c7ca60a2bc0b309907599ab)
1 /* SPDX-License-Identifier: GPL-2.0 */
2 /*
3  * Assertion and expectation serialization API.
4  *
5  * Copyright (C) 2019, Google LLC.
6  * Author: Brendan Higgins <brendanhiggins@google.com>
7  */
8 
9 #ifndef _KUNIT_ASSERT_H
10 #define _KUNIT_ASSERT_H
11 
12 #include <linux/err.h>
13 #include <linux/kernel.h>
14 
15 struct kunit;
16 struct string_stream;
17 
18 /**
19  * enum kunit_assert_type - Type of expectation/assertion.
20  * @KUNIT_ASSERTION: Used to denote that a kunit_assert represents an assertion.
21  * @KUNIT_EXPECTATION: Denotes that a kunit_assert represents an expectation.
22  *
23  * Used in conjunction with a &struct kunit_assert to denote whether it
24  * represents an expectation or an assertion.
25  */
26 enum kunit_assert_type {
27 	KUNIT_ASSERTION,
28 	KUNIT_EXPECTATION,
29 };
30 
31 /**
32  * struct kunit_assert - Data for printing a failed assertion or expectation.
33  * @test: the test case this expectation/assertion is associated with.
34  * @type: the type (either an expectation or an assertion) of this kunit_assert.
35  * @line: the source code line number that the expectation/assertion is at.
36  * @file: the file path of the source file that the expectation/assertion is in.
37  * @message: an optional message to provide additional context.
38  * @format: a function which formats the data in this kunit_assert to a string.
39  *
40  * Represents a failed expectation/assertion. Contains all the data necessary to
41  * format a string to a user reporting the failure.
42  */
43 struct kunit_assert {
44 	struct kunit *test;
45 	enum kunit_assert_type type;
46 	int line;
47 	const char *file;
48 	struct va_format message;
49 	void (*format)(const struct kunit_assert *assert,
50 		       struct string_stream *stream);
51 };
52 
53 /**
54  * KUNIT_INIT_VA_FMT_NULL - Default initializer for struct va_format.
55  *
56  * Used inside a struct initialization block to initialize struct va_format to
57  * default values where fmt and va are null.
58  */
59 #define KUNIT_INIT_VA_FMT_NULL { .fmt = NULL, .va = NULL }
60 
61 /**
62  * KUNIT_INIT_ASSERT_STRUCT() - Initializer for a &struct kunit_assert.
63  * @kunit: The test case that this expectation/assertion is associated with.
64  * @assert_type: The type (assertion or expectation) of this kunit_assert.
65  * @fmt: The formatting function which builds a string out of this kunit_assert.
66  *
67  * The base initializer for a &struct kunit_assert.
68  */
69 #define KUNIT_INIT_ASSERT_STRUCT(kunit, assert_type, fmt) {		       \
70 	.test = kunit,							       \
71 	.type = assert_type,						       \
72 	.file = __FILE__,						       \
73 	.line = __LINE__,						       \
74 	.message = KUNIT_INIT_VA_FMT_NULL,				       \
75 	.format = fmt							       \
76 }
77 
78 void kunit_base_assert_format(const struct kunit_assert *assert,
79 			      struct string_stream *stream);
80 
81 void kunit_assert_print_msg(const struct kunit_assert *assert,
82 			    struct string_stream *stream);
83 
84 /**
85  * struct kunit_fail_assert - Represents a plain fail expectation/assertion.
86  * @assert: The parent of this type.
87  *
88  * Represents a simple KUNIT_FAIL/KUNIT_ASSERT_FAILURE that always fails.
89  */
90 struct kunit_fail_assert {
91 	struct kunit_assert assert;
92 };
93 
94 void kunit_fail_assert_format(const struct kunit_assert *assert,
95 			      struct string_stream *stream);
96 
97 /**
98  * KUNIT_INIT_FAIL_ASSERT_STRUCT() - Initializer for &struct kunit_fail_assert.
99  * @test: The test case that this expectation/assertion is associated with.
100  * @type: The type (assertion or expectation) of this kunit_assert.
101  *
102  * Initializes a &struct kunit_fail_assert. Intended to be used in
103  * KUNIT_EXPECT_* and KUNIT_ASSERT_* macros.
104  */
105 #define KUNIT_INIT_FAIL_ASSERT_STRUCT(test, type) {			       \
106 	.assert = KUNIT_INIT_ASSERT_STRUCT(test,			       \
107 					   type,			       \
108 					   kunit_fail_assert_format)	       \
109 }
110 
111 /**
112  * struct kunit_unary_assert - Represents a KUNIT_{EXPECT|ASSERT}_{TRUE|FALSE}
113  * @assert: The parent of this type.
114  * @condition: A string representation of a conditional expression.
115  * @expected_true: True if of type KUNIT_{EXPECT|ASSERT}_TRUE, false otherwise.
116  *
117  * Represents a simple expectation or assertion that simply asserts something is
118  * true or false. In other words, represents the expectations:
119  * KUNIT_{EXPECT|ASSERT}_{TRUE|FALSE}
120  */
121 struct kunit_unary_assert {
122 	struct kunit_assert assert;
123 	const char *condition;
124 	bool expected_true;
125 };
126 
127 void kunit_unary_assert_format(const struct kunit_assert *assert,
128 			       struct string_stream *stream);
129 
130 /**
131  * KUNIT_INIT_UNARY_ASSERT_STRUCT() - Initializes &struct kunit_unary_assert.
132  * @test: The test case that this expectation/assertion is associated with.
133  * @type: The type (assertion or expectation) of this kunit_assert.
134  * @cond: A string representation of the expression asserted true or false.
135  * @expect_true: True if of type KUNIT_{EXPECT|ASSERT}_TRUE, false otherwise.
136  *
137  * Initializes a &struct kunit_unary_assert. Intended to be used in
138  * KUNIT_EXPECT_* and KUNIT_ASSERT_* macros.
139  */
140 #define KUNIT_INIT_UNARY_ASSERT_STRUCT(test, type, cond, expect_true) {	       \
141 	.assert = KUNIT_INIT_ASSERT_STRUCT(test,			       \
142 					   type,			       \
143 					   kunit_unary_assert_format),	       \
144 	.condition = cond,						       \
145 	.expected_true = expect_true					       \
146 }
147 
148 /**
149  * struct kunit_ptr_not_err_assert - An expectation/assertion that a pointer is
150  *	not NULL and not a -errno.
151  * @assert: The parent of this type.
152  * @text: A string representation of the expression passed to the expectation.
153  * @value: The actual evaluated pointer value of the expression.
154  *
155  * Represents an expectation/assertion that a pointer is not null and is does
156  * not contain a -errno. (See IS_ERR_OR_NULL().)
157  */
158 struct kunit_ptr_not_err_assert {
159 	struct kunit_assert assert;
160 	const char *text;
161 	const void *value;
162 };
163 
164 void kunit_ptr_not_err_assert_format(const struct kunit_assert *assert,
165 				     struct string_stream *stream);
166 
167 /**
168  * KUNIT_INIT_PTR_NOT_ERR_ASSERT_STRUCT() - Initializes a
169  *	&struct kunit_ptr_not_err_assert.
170  * @test: The test case that this expectation/assertion is associated with.
171  * @type: The type (assertion or expectation) of this kunit_assert.
172  * @txt: A string representation of the expression passed to the expectation.
173  * @val: The actual evaluated pointer value of the expression.
174  *
175  * Initializes a &struct kunit_ptr_not_err_assert. Intended to be used in
176  * KUNIT_EXPECT_* and KUNIT_ASSERT_* macros.
177  */
178 #define KUNIT_INIT_PTR_NOT_ERR_STRUCT(test, type, txt, val) {		       \
179 	.assert = KUNIT_INIT_ASSERT_STRUCT(test,			       \
180 					   type,			       \
181 					   kunit_ptr_not_err_assert_format),   \
182 	.text = txt,							       \
183 	.value = val							       \
184 }
185 
186 /**
187  * struct kunit_binary_assert - An expectation/assertion that compares two
188  *	non-pointer values (for example, KUNIT_EXPECT_EQ(test, 1 + 1, 2)).
189  * @assert: The parent of this type.
190  * @operation: A string representation of the comparison operator (e.g. "==").
191  * @left_text: A string representation of the expression in the left slot.
192  * @left_value: The actual evaluated value of the expression in the left slot.
193  * @right_text: A string representation of the expression in the right slot.
194  * @right_value: The actual evaluated value of the expression in the right slot.
195  *
196  * Represents an expectation/assertion that compares two non-pointer values. For
197  * example, to expect that 1 + 1 == 2, you can use the expectation
198  * KUNIT_EXPECT_EQ(test, 1 + 1, 2);
199  */
200 struct kunit_binary_assert {
201 	struct kunit_assert assert;
202 	const char *operation;
203 	const char *left_text;
204 	long long left_value;
205 	const char *right_text;
206 	long long right_value;
207 };
208 
209 void kunit_binary_assert_format(const struct kunit_assert *assert,
210 				struct string_stream *stream);
211 
212 /**
213  * KUNIT_INIT_BINARY_ASSERT_STRUCT() - Initializes a
214  *	&struct kunit_binary_assert.
215  * @test: The test case that this expectation/assertion is associated with.
216  * @type: The type (assertion or expectation) of this kunit_assert.
217  * @op_str: A string representation of the comparison operator (e.g. "==").
218  * @left_str: A string representation of the expression in the left slot.
219  * @left_val: The actual evaluated value of the expression in the left slot.
220  * @right_str: A string representation of the expression in the right slot.
221  * @right_val: The actual evaluated value of the expression in the right slot.
222  *
223  * Initializes a &struct kunit_binary_assert. Intended to be used in
224  * KUNIT_EXPECT_* and KUNIT_ASSERT_* macros.
225  */
226 #define KUNIT_INIT_BINARY_ASSERT_STRUCT(test,				       \
227 					type,				       \
228 					op_str,				       \
229 					left_str,			       \
230 					left_val,			       \
231 					right_str,			       \
232 					right_val) {			       \
233 	.assert = KUNIT_INIT_ASSERT_STRUCT(test,			       \
234 					   type,			       \
235 					   kunit_binary_assert_format),	       \
236 	.operation = op_str,						       \
237 	.left_text = left_str,						       \
238 	.left_value = left_val,						       \
239 	.right_text = right_str,					       \
240 	.right_value = right_val					       \
241 }
242 
243 /**
244  * struct kunit_binary_ptr_assert - An expectation/assertion that compares two
245  *	pointer values (for example, KUNIT_EXPECT_PTR_EQ(test, foo, bar)).
246  * @assert: The parent of this type.
247  * @operation: A string representation of the comparison operator (e.g. "==").
248  * @left_text: A string representation of the expression in the left slot.
249  * @left_value: The actual evaluated value of the expression in the left slot.
250  * @right_text: A string representation of the expression in the right slot.
251  * @right_value: The actual evaluated value of the expression in the right slot.
252  *
253  * Represents an expectation/assertion that compares two pointer values. For
254  * example, to expect that foo and bar point to the same thing, you can use the
255  * expectation KUNIT_EXPECT_PTR_EQ(test, foo, bar);
256  */
257 struct kunit_binary_ptr_assert {
258 	struct kunit_assert assert;
259 	const char *operation;
260 	const char *left_text;
261 	const void *left_value;
262 	const char *right_text;
263 	const void *right_value;
264 };
265 
266 void kunit_binary_ptr_assert_format(const struct kunit_assert *assert,
267 				    struct string_stream *stream);
268 
269 /**
270  * KUNIT_INIT_BINARY_PTR_ASSERT_STRUCT() - Initializes a
271  *	&struct kunit_binary_ptr_assert.
272  * @test: The test case that this expectation/assertion is associated with.
273  * @type: The type (assertion or expectation) of this kunit_assert.
274  * @op_str: A string representation of the comparison operator (e.g. "==").
275  * @left_str: A string representation of the expression in the left slot.
276  * @left_val: The actual evaluated value of the expression in the left slot.
277  * @right_str: A string representation of the expression in the right slot.
278  * @right_val: The actual evaluated value of the expression in the right slot.
279  *
280  * Initializes a &struct kunit_binary_ptr_assert. Intended to be used in
281  * KUNIT_EXPECT_* and KUNIT_ASSERT_* macros.
282  */
283 #define KUNIT_INIT_BINARY_PTR_ASSERT_STRUCT(test,			       \
284 					    type,			       \
285 					    op_str,			       \
286 					    left_str,			       \
287 					    left_val,			       \
288 					    right_str,			       \
289 					    right_val) {		       \
290 	.assert = KUNIT_INIT_ASSERT_STRUCT(test,			       \
291 					   type,			       \
292 					   kunit_binary_ptr_assert_format),    \
293 	.operation = op_str,						       \
294 	.left_text = left_str,						       \
295 	.left_value = left_val,						       \
296 	.right_text = right_str,					       \
297 	.right_value = right_val					       \
298 }
299 
300 /**
301  * struct kunit_binary_str_assert - An expectation/assertion that compares two
302  *	string values (for example, KUNIT_EXPECT_STREQ(test, foo, "bar")).
303  * @assert: The parent of this type.
304  * @operation: A string representation of the comparison operator (e.g. "==").
305  * @left_text: A string representation of the expression in the left slot.
306  * @left_value: The actual evaluated value of the expression in the left slot.
307  * @right_text: A string representation of the expression in the right slot.
308  * @right_value: The actual evaluated value of the expression in the right slot.
309  *
310  * Represents an expectation/assertion that compares two string values. For
311  * example, to expect that the string in foo is equal to "bar", you can use the
312  * expectation KUNIT_EXPECT_STREQ(test, foo, "bar");
313  */
314 struct kunit_binary_str_assert {
315 	struct kunit_assert assert;
316 	const char *operation;
317 	const char *left_text;
318 	const char *left_value;
319 	const char *right_text;
320 	const char *right_value;
321 };
322 
323 void kunit_binary_str_assert_format(const struct kunit_assert *assert,
324 				    struct string_stream *stream);
325 
326 /**
327  * KUNIT_INIT_BINARY_STR_ASSERT_STRUCT() - Initializes a
328  *	&struct kunit_binary_str_assert.
329  * @test: The test case that this expectation/assertion is associated with.
330  * @type: The type (assertion or expectation) of this kunit_assert.
331  * @op_str: A string representation of the comparison operator (e.g. "==").
332  * @left_str: A string representation of the expression in the left slot.
333  * @left_val: The actual evaluated value of the expression in the left slot.
334  * @right_str: A string representation of the expression in the right slot.
335  * @right_val: The actual evaluated value of the expression in the right slot.
336  *
337  * Initializes a &struct kunit_binary_str_assert. Intended to be used in
338  * KUNIT_EXPECT_* and KUNIT_ASSERT_* macros.
339  */
340 #define KUNIT_INIT_BINARY_STR_ASSERT_STRUCT(test,			       \
341 					    type,			       \
342 					    op_str,			       \
343 					    left_str,			       \
344 					    left_val,			       \
345 					    right_str,			       \
346 					    right_val) {		       \
347 	.assert = KUNIT_INIT_ASSERT_STRUCT(test,			       \
348 					   type,			       \
349 					   kunit_binary_str_assert_format),    \
350 	.operation = op_str,						       \
351 	.left_text = left_str,						       \
352 	.left_value = left_val,						       \
353 	.right_text = right_str,					       \
354 	.right_value = right_val					       \
355 }
356 
357 #endif /*  _KUNIT_ASSERT_H */
358