xref: /OK3568_Linux_fs/kernel/lib/kunit/assert.c (revision 4882a59341e53eb6f0b4789bf948001014eff981)
1*4882a593Smuzhiyun // SPDX-License-Identifier: GPL-2.0
2*4882a593Smuzhiyun /*
3*4882a593Smuzhiyun  * Assertion and expectation serialization API.
4*4882a593Smuzhiyun  *
5*4882a593Smuzhiyun  * Copyright (C) 2019, Google LLC.
6*4882a593Smuzhiyun  * Author: Brendan Higgins <brendanhiggins@google.com>
7*4882a593Smuzhiyun  */
8*4882a593Smuzhiyun #include <kunit/assert.h>
9*4882a593Smuzhiyun #include <kunit/test.h>
10*4882a593Smuzhiyun 
11*4882a593Smuzhiyun #include "string-stream.h"
12*4882a593Smuzhiyun 
kunit_base_assert_format(const struct kunit_assert * assert,struct string_stream * stream)13*4882a593Smuzhiyun void kunit_base_assert_format(const struct kunit_assert *assert,
14*4882a593Smuzhiyun 			      struct string_stream *stream)
15*4882a593Smuzhiyun {
16*4882a593Smuzhiyun 	const char *expect_or_assert = NULL;
17*4882a593Smuzhiyun 
18*4882a593Smuzhiyun 	switch (assert->type) {
19*4882a593Smuzhiyun 	case KUNIT_EXPECTATION:
20*4882a593Smuzhiyun 		expect_or_assert = "EXPECTATION";
21*4882a593Smuzhiyun 		break;
22*4882a593Smuzhiyun 	case KUNIT_ASSERTION:
23*4882a593Smuzhiyun 		expect_or_assert = "ASSERTION";
24*4882a593Smuzhiyun 		break;
25*4882a593Smuzhiyun 	}
26*4882a593Smuzhiyun 
27*4882a593Smuzhiyun 	string_stream_add(stream, "%s FAILED at %s:%d\n",
28*4882a593Smuzhiyun 			 expect_or_assert, assert->file, assert->line);
29*4882a593Smuzhiyun }
30*4882a593Smuzhiyun EXPORT_SYMBOL_GPL(kunit_base_assert_format);
31*4882a593Smuzhiyun 
kunit_assert_print_msg(const struct kunit_assert * assert,struct string_stream * stream)32*4882a593Smuzhiyun void kunit_assert_print_msg(const struct kunit_assert *assert,
33*4882a593Smuzhiyun 			    struct string_stream *stream)
34*4882a593Smuzhiyun {
35*4882a593Smuzhiyun 	if (assert->message.fmt)
36*4882a593Smuzhiyun 		string_stream_add(stream, "\n%pV", &assert->message);
37*4882a593Smuzhiyun }
38*4882a593Smuzhiyun EXPORT_SYMBOL_GPL(kunit_assert_print_msg);
39*4882a593Smuzhiyun 
kunit_fail_assert_format(const struct kunit_assert * assert,struct string_stream * stream)40*4882a593Smuzhiyun void kunit_fail_assert_format(const struct kunit_assert *assert,
41*4882a593Smuzhiyun 			      struct string_stream *stream)
42*4882a593Smuzhiyun {
43*4882a593Smuzhiyun 	kunit_base_assert_format(assert, stream);
44*4882a593Smuzhiyun 	string_stream_add(stream, "%pV", &assert->message);
45*4882a593Smuzhiyun }
46*4882a593Smuzhiyun EXPORT_SYMBOL_GPL(kunit_fail_assert_format);
47*4882a593Smuzhiyun 
kunit_unary_assert_format(const struct kunit_assert * assert,struct string_stream * stream)48*4882a593Smuzhiyun void kunit_unary_assert_format(const struct kunit_assert *assert,
49*4882a593Smuzhiyun 			       struct string_stream *stream)
50*4882a593Smuzhiyun {
51*4882a593Smuzhiyun 	struct kunit_unary_assert *unary_assert = container_of(
52*4882a593Smuzhiyun 			assert, struct kunit_unary_assert, assert);
53*4882a593Smuzhiyun 
54*4882a593Smuzhiyun 	kunit_base_assert_format(assert, stream);
55*4882a593Smuzhiyun 	if (unary_assert->expected_true)
56*4882a593Smuzhiyun 		string_stream_add(stream,
57*4882a593Smuzhiyun 				  KUNIT_SUBTEST_INDENT "Expected %s to be true, but is false\n",
58*4882a593Smuzhiyun 				  unary_assert->condition);
59*4882a593Smuzhiyun 	else
60*4882a593Smuzhiyun 		string_stream_add(stream,
61*4882a593Smuzhiyun 				  KUNIT_SUBTEST_INDENT "Expected %s to be false, but is true\n",
62*4882a593Smuzhiyun 				  unary_assert->condition);
63*4882a593Smuzhiyun 	kunit_assert_print_msg(assert, stream);
64*4882a593Smuzhiyun }
65*4882a593Smuzhiyun EXPORT_SYMBOL_GPL(kunit_unary_assert_format);
66*4882a593Smuzhiyun 
kunit_ptr_not_err_assert_format(const struct kunit_assert * assert,struct string_stream * stream)67*4882a593Smuzhiyun void kunit_ptr_not_err_assert_format(const struct kunit_assert *assert,
68*4882a593Smuzhiyun 				     struct string_stream *stream)
69*4882a593Smuzhiyun {
70*4882a593Smuzhiyun 	struct kunit_ptr_not_err_assert *ptr_assert = container_of(
71*4882a593Smuzhiyun 			assert, struct kunit_ptr_not_err_assert, assert);
72*4882a593Smuzhiyun 
73*4882a593Smuzhiyun 	kunit_base_assert_format(assert, stream);
74*4882a593Smuzhiyun 	if (!ptr_assert->value) {
75*4882a593Smuzhiyun 		string_stream_add(stream,
76*4882a593Smuzhiyun 				  KUNIT_SUBTEST_INDENT "Expected %s is not null, but is\n",
77*4882a593Smuzhiyun 				  ptr_assert->text);
78*4882a593Smuzhiyun 	} else if (IS_ERR(ptr_assert->value)) {
79*4882a593Smuzhiyun 		string_stream_add(stream,
80*4882a593Smuzhiyun 				  KUNIT_SUBTEST_INDENT "Expected %s is not error, but is: %ld\n",
81*4882a593Smuzhiyun 				  ptr_assert->text,
82*4882a593Smuzhiyun 				  PTR_ERR(ptr_assert->value));
83*4882a593Smuzhiyun 	}
84*4882a593Smuzhiyun 	kunit_assert_print_msg(assert, stream);
85*4882a593Smuzhiyun }
86*4882a593Smuzhiyun EXPORT_SYMBOL_GPL(kunit_ptr_not_err_assert_format);
87*4882a593Smuzhiyun 
kunit_binary_assert_format(const struct kunit_assert * assert,struct string_stream * stream)88*4882a593Smuzhiyun void kunit_binary_assert_format(const struct kunit_assert *assert,
89*4882a593Smuzhiyun 				struct string_stream *stream)
90*4882a593Smuzhiyun {
91*4882a593Smuzhiyun 	struct kunit_binary_assert *binary_assert = container_of(
92*4882a593Smuzhiyun 			assert, struct kunit_binary_assert, assert);
93*4882a593Smuzhiyun 
94*4882a593Smuzhiyun 	kunit_base_assert_format(assert, stream);
95*4882a593Smuzhiyun 	string_stream_add(stream,
96*4882a593Smuzhiyun 			  KUNIT_SUBTEST_INDENT "Expected %s %s %s, but\n",
97*4882a593Smuzhiyun 			  binary_assert->left_text,
98*4882a593Smuzhiyun 			  binary_assert->operation,
99*4882a593Smuzhiyun 			  binary_assert->right_text);
100*4882a593Smuzhiyun 	string_stream_add(stream, KUNIT_SUBSUBTEST_INDENT "%s == %lld\n",
101*4882a593Smuzhiyun 			  binary_assert->left_text,
102*4882a593Smuzhiyun 			  binary_assert->left_value);
103*4882a593Smuzhiyun 	string_stream_add(stream, KUNIT_SUBSUBTEST_INDENT "%s == %lld",
104*4882a593Smuzhiyun 			  binary_assert->right_text,
105*4882a593Smuzhiyun 			  binary_assert->right_value);
106*4882a593Smuzhiyun 	kunit_assert_print_msg(assert, stream);
107*4882a593Smuzhiyun }
108*4882a593Smuzhiyun EXPORT_SYMBOL_GPL(kunit_binary_assert_format);
109*4882a593Smuzhiyun 
kunit_binary_ptr_assert_format(const struct kunit_assert * assert,struct string_stream * stream)110*4882a593Smuzhiyun void kunit_binary_ptr_assert_format(const struct kunit_assert *assert,
111*4882a593Smuzhiyun 				    struct string_stream *stream)
112*4882a593Smuzhiyun {
113*4882a593Smuzhiyun 	struct kunit_binary_ptr_assert *binary_assert = container_of(
114*4882a593Smuzhiyun 			assert, struct kunit_binary_ptr_assert, assert);
115*4882a593Smuzhiyun 
116*4882a593Smuzhiyun 	kunit_base_assert_format(assert, stream);
117*4882a593Smuzhiyun 	string_stream_add(stream,
118*4882a593Smuzhiyun 			  KUNIT_SUBTEST_INDENT "Expected %s %s %s, but\n",
119*4882a593Smuzhiyun 			  binary_assert->left_text,
120*4882a593Smuzhiyun 			  binary_assert->operation,
121*4882a593Smuzhiyun 			  binary_assert->right_text);
122*4882a593Smuzhiyun 	string_stream_add(stream, KUNIT_SUBSUBTEST_INDENT "%s == %px\n",
123*4882a593Smuzhiyun 			  binary_assert->left_text,
124*4882a593Smuzhiyun 			  binary_assert->left_value);
125*4882a593Smuzhiyun 	string_stream_add(stream, KUNIT_SUBSUBTEST_INDENT "%s == %px",
126*4882a593Smuzhiyun 			  binary_assert->right_text,
127*4882a593Smuzhiyun 			  binary_assert->right_value);
128*4882a593Smuzhiyun 	kunit_assert_print_msg(assert, stream);
129*4882a593Smuzhiyun }
130*4882a593Smuzhiyun EXPORT_SYMBOL_GPL(kunit_binary_ptr_assert_format);
131*4882a593Smuzhiyun 
kunit_binary_str_assert_format(const struct kunit_assert * assert,struct string_stream * stream)132*4882a593Smuzhiyun void kunit_binary_str_assert_format(const struct kunit_assert *assert,
133*4882a593Smuzhiyun 				    struct string_stream *stream)
134*4882a593Smuzhiyun {
135*4882a593Smuzhiyun 	struct kunit_binary_str_assert *binary_assert = container_of(
136*4882a593Smuzhiyun 			assert, struct kunit_binary_str_assert, assert);
137*4882a593Smuzhiyun 
138*4882a593Smuzhiyun 	kunit_base_assert_format(assert, stream);
139*4882a593Smuzhiyun 	string_stream_add(stream,
140*4882a593Smuzhiyun 			  KUNIT_SUBTEST_INDENT "Expected %s %s %s, but\n",
141*4882a593Smuzhiyun 			  binary_assert->left_text,
142*4882a593Smuzhiyun 			  binary_assert->operation,
143*4882a593Smuzhiyun 			  binary_assert->right_text);
144*4882a593Smuzhiyun 	string_stream_add(stream, KUNIT_SUBSUBTEST_INDENT "%s == %s\n",
145*4882a593Smuzhiyun 			  binary_assert->left_text,
146*4882a593Smuzhiyun 			  binary_assert->left_value);
147*4882a593Smuzhiyun 	string_stream_add(stream, KUNIT_SUBSUBTEST_INDENT "%s == %s",
148*4882a593Smuzhiyun 			  binary_assert->right_text,
149*4882a593Smuzhiyun 			  binary_assert->right_value);
150*4882a593Smuzhiyun 	kunit_assert_print_msg(assert, stream);
151*4882a593Smuzhiyun }
152*4882a593Smuzhiyun EXPORT_SYMBOL_GPL(kunit_binary_str_assert_format);
153