xref: /linux-6.15/lib/kunit/assert.c (revision 109fb06f)
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 <[email protected]>
7  */
8 #include <kunit/assert.h>
9 
10 #include "string-stream.h"
11 
12 void kunit_base_assert_format(const struct kunit_assert *assert,
13 			      struct string_stream *stream)
14 {
15 	const char *expect_or_assert = NULL;
16 
17 	switch (assert->type) {
18 	case KUNIT_EXPECTATION:
19 		expect_or_assert = "EXPECTATION";
20 		break;
21 	case KUNIT_ASSERTION:
22 		expect_or_assert = "ASSERTION";
23 		break;
24 	}
25 
26 	string_stream_add(stream, "%s FAILED at %s:%d\n",
27 			 expect_or_assert, assert->file, assert->line);
28 }
29 
30 void kunit_assert_print_msg(const struct kunit_assert *assert,
31 			    struct string_stream *stream)
32 {
33 	if (assert->message.fmt)
34 		string_stream_add(stream, "\n%pV", &assert->message);
35 }
36 
37 void kunit_fail_assert_format(const struct kunit_assert *assert,
38 			      struct string_stream *stream)
39 {
40 	kunit_base_assert_format(assert, stream);
41 	string_stream_add(stream, "%pV", &assert->message);
42 }
43 
44 void kunit_unary_assert_format(const struct kunit_assert *assert,
45 			       struct string_stream *stream)
46 {
47 	struct kunit_unary_assert *unary_assert = container_of(
48 			assert, struct kunit_unary_assert, assert);
49 
50 	kunit_base_assert_format(assert, stream);
51 	if (unary_assert->expected_true)
52 		string_stream_add(stream,
53 				 "\tExpected %s to be true, but is false\n",
54 				 unary_assert->condition);
55 	else
56 		string_stream_add(stream,
57 				 "\tExpected %s to be false, but is true\n",
58 				 unary_assert->condition);
59 	kunit_assert_print_msg(assert, stream);
60 }
61 
62 void kunit_ptr_not_err_assert_format(const struct kunit_assert *assert,
63 				     struct string_stream *stream)
64 {
65 	struct kunit_ptr_not_err_assert *ptr_assert = container_of(
66 			assert, struct kunit_ptr_not_err_assert, assert);
67 
68 	kunit_base_assert_format(assert, stream);
69 	if (!ptr_assert->value) {
70 		string_stream_add(stream,
71 				 "\tExpected %s is not null, but is\n",
72 				 ptr_assert->text);
73 	} else if (IS_ERR(ptr_assert->value)) {
74 		string_stream_add(stream,
75 				 "\tExpected %s is not error, but is: %ld\n",
76 				 ptr_assert->text,
77 				 PTR_ERR(ptr_assert->value));
78 	}
79 	kunit_assert_print_msg(assert, stream);
80 }
81 
82 void kunit_binary_assert_format(const struct kunit_assert *assert,
83 				struct string_stream *stream)
84 {
85 	struct kunit_binary_assert *binary_assert = container_of(
86 			assert, struct kunit_binary_assert, assert);
87 
88 	kunit_base_assert_format(assert, stream);
89 	string_stream_add(stream,
90 			 "\tExpected %s %s %s, but\n",
91 			 binary_assert->left_text,
92 			 binary_assert->operation,
93 			 binary_assert->right_text);
94 	string_stream_add(stream, "\t\t%s == %lld\n",
95 			 binary_assert->left_text,
96 			 binary_assert->left_value);
97 	string_stream_add(stream, "\t\t%s == %lld",
98 			 binary_assert->right_text,
99 			 binary_assert->right_value);
100 	kunit_assert_print_msg(assert, stream);
101 }
102 
103 void kunit_binary_ptr_assert_format(const struct kunit_assert *assert,
104 				    struct string_stream *stream)
105 {
106 	struct kunit_binary_ptr_assert *binary_assert = container_of(
107 			assert, struct kunit_binary_ptr_assert, assert);
108 
109 	kunit_base_assert_format(assert, stream);
110 	string_stream_add(stream,
111 			 "\tExpected %s %s %s, but\n",
112 			 binary_assert->left_text,
113 			 binary_assert->operation,
114 			 binary_assert->right_text);
115 	string_stream_add(stream, "\t\t%s == %pK\n",
116 			 binary_assert->left_text,
117 			 binary_assert->left_value);
118 	string_stream_add(stream, "\t\t%s == %pK",
119 			 binary_assert->right_text,
120 			 binary_assert->right_value);
121 	kunit_assert_print_msg(assert, stream);
122 }
123 
124 void kunit_binary_str_assert_format(const struct kunit_assert *assert,
125 				    struct string_stream *stream)
126 {
127 	struct kunit_binary_str_assert *binary_assert = container_of(
128 			assert, struct kunit_binary_str_assert, assert);
129 
130 	kunit_base_assert_format(assert, stream);
131 	string_stream_add(stream,
132 			 "\tExpected %s %s %s, but\n",
133 			 binary_assert->left_text,
134 			 binary_assert->operation,
135 			 binary_assert->right_text);
136 	string_stream_add(stream, "\t\t%s == %s\n",
137 			 binary_assert->left_text,
138 			 binary_assert->left_value);
139 	string_stream_add(stream, "\t\t%s == %s",
140 			 binary_assert->right_text,
141 			 binary_assert->right_value);
142 	kunit_assert_print_msg(assert, stream);
143 }
144