xref: /aosp_15_r20/external/pigweed/pw_assert/assert_backend_compile_test_c.c (revision 61c4878ac05f98d0ceed94b57d316916de578985)
1 // Copyright 2020 The Pigweed Authors
2 //
3 // Licensed under the Apache License, Version 2.0 (the "License"); you may not
4 // use this file except in compliance with the License. You may obtain a copy of
5 // the License at
6 //
7 //     https://www.apache.org/licenses/LICENSE-2.0
8 //
9 // Unless required by applicable law or agreed to in writing, software
10 // distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
11 // WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
12 // License for the specific language governing permissions and limitations under
13 // the License.
14 
15 // This is a compile test that verifies that the assert macros compile in a C
16 // context. They are not correctness checks.
17 //
18 // Note: These tests cannot be run with a normal assert backend, since they
19 // will abort. However, the assert_basic backend supports non-aborting assert;
20 // see the note in assert_backend_compile_test.cc.
21 
22 #include "pw_assert/check.h"
23 
EnsureNullIsIncluded(void)24 static void EnsureNullIsIncluded(void) {
25   // This is a compile check to ensure NULL is defined. It comes before the
26   // status.h include to ensure we don't accidentally get NULL from status.h.
27   PW_CHECK_NOTNULL(0xa);
28   PW_CHECK_NOTNULL(0x0);
29 }
30 
31 #include <stdbool.h>
32 
33 #include "pw_assert/assert.h"
34 #include "pw_assert/short.h"
35 #include "pw_status/status.h"
36 
37 #ifdef __cplusplus
38 #error "This file must be compiled as plain C to verify C compilation works."
39 #endif  // __cplusplus
40 
41 // This is a global constant to feed into the formatter for tests.
42 // Intended to pair with FAIL_IF_DISPLAYED_ARGS or FAIL_IF_HIDDEN_ARGS.
43 static const int z = 10;
44 
45 // At some point in the future when there is a proper test system in place for
46 // crashing, the below strings can help indicate pass/fail for a check.
47 
48 #define FAIL_IF_DISPLAYED "FAIL IF DISPLAYED"
49 #define FAIL_IF_DISPLAYED_ARGS "FAIL IF DISPLAYED: %d"
50 
51 #define FAIL_IF_HIDDEN "FAIL IF HIDDEN"
52 #define FAIL_IF_HIDDEN_ARGS "FAIL IF HIDDEN: %d"
53 
54 // This switch exists to support compiling and/or running the tests.
55 #define DISABLE_ASSERT_TEST_EXECUTION 1
56 #if DISABLE_ASSERT_TEST_EXECUTION
57 #define MAYBE_SKIP_TEST return
58 #else
59 #define MAYBE_SKIP_TEST ;
60 #endif
61 
Add3(int a,int b,int c)62 static int Add3(int a, int b, int c) { return a + b + c; }
63 
64 // NOLINTNEXTLINE(google-readability-function-size)
AssertBackendCompileTestsInC(void)65 void AssertBackendCompileTestsInC(void) {
66   {  // TEST(Crash, WithAndWithoutMessageArguments)
67     MAYBE_SKIP_TEST;
68     PW_CRASH(FAIL_IF_HIDDEN);
69     PW_CRASH(FAIL_IF_HIDDEN_ARGS, z);
70   }
71 
72   {  // TEST(Check, NoMessage)
73     MAYBE_SKIP_TEST;
74     PW_CHECK(1);
75     PW_CHECK(0);
76   }
77 
78   {  // TEST(Check, WithMessageAndArgs)
79     MAYBE_SKIP_TEST;
80     PW_CHECK(1, FAIL_IF_DISPLAYED);
81     PW_CHECK(1, FAIL_IF_DISPLAYED_ARGS, z);
82 
83     PW_CHECK(0, FAIL_IF_HIDDEN);
84     PW_CHECK(0, FAIL_IF_HIDDEN_ARGS, z);
85   }
86 
87   {  // TEST(Check, IntComparison)
88     MAYBE_SKIP_TEST;
89     int x_int = 50;
90     int y_int = 66;
91 
92     PW_CHECK_INT_LE(x_int, y_int);
93     PW_CHECK_INT_LE(x_int, y_int, "INT: " FAIL_IF_DISPLAYED);
94     PW_CHECK_INT_LE(x_int, y_int, "INT: " FAIL_IF_DISPLAYED_ARGS, z);
95 
96     PW_CHECK_INT_GE(x_int, y_int);
97     PW_CHECK_INT_GE(x_int, y_int, "INT: " FAIL_IF_HIDDEN);
98     PW_CHECK_INT_GE(x_int, y_int, "INT: " FAIL_IF_HIDDEN_ARGS, z);
99   }
100 
101   {  // TEST(Check, UintComparison)
102     MAYBE_SKIP_TEST;
103     unsigned int x_uint = 50;
104     unsigned int y_uint = 66;
105 
106     PW_CHECK_UINT_LE(x_uint, y_uint);
107     PW_CHECK_UINT_LE(x_uint, y_uint, "UINT: " FAIL_IF_DISPLAYED);
108     PW_CHECK_UINT_LE(x_uint, y_uint, "UINT: " FAIL_IF_DISPLAYED_ARGS, z);
109 
110     PW_CHECK_UINT_GE(x_uint, y_uint);
111     PW_CHECK_UINT_GE(x_uint, y_uint, "UINT: " FAIL_IF_HIDDEN);
112     PW_CHECK_UINT_GE(x_uint, y_uint, "UINT: " FAIL_IF_HIDDEN_ARGS, z);
113   }
114 
115   {  // TEST(Check, PtrComparison)
116     MAYBE_SKIP_TEST;
117     void* x_ptr = (void*)(50);
118     void* y_ptr = (void*)(66);
119 
120     PW_CHECK_PTR_EQ(x_ptr, y_ptr);
121     PW_CHECK_PTR_LE(x_ptr, y_ptr, "PTR: " FAIL_IF_DISPLAYED);
122     PW_CHECK_PTR_LE(x_ptr, y_ptr, "PTR: " FAIL_IF_DISPLAYED_ARGS, z);
123 
124     PW_CHECK_PTR_GE(x_ptr, y_ptr);
125     PW_CHECK_PTR_GE(x_ptr, y_ptr, "PTR: " FAIL_IF_HIDDEN);
126     PW_CHECK_PTR_GE(x_ptr, y_ptr, "PTR: " FAIL_IF_HIDDEN_ARGS, z);
127 
128     PW_CHECK_NOTNULL(0xa);
129     PW_CHECK_NOTNULL(0x0);
130   }
131 
132   {  // TEST(Check, FloatComparison)
133     MAYBE_SKIP_TEST;
134     float x_float = 50.5;
135     float y_float = 66.5;
136 
137     PW_CHECK_FLOAT_EXACT_LE(x_float, y_float);
138     PW_CHECK_FLOAT_EXACT_LE(x_float, y_float, "FLOAT: " FAIL_IF_DISPLAYED);
139     PW_CHECK_FLOAT_EXACT_LE(
140         x_float, y_float, "FLOAT: " FAIL_IF_DISPLAYED_ARGS, z);
141 
142     PW_CHECK_FLOAT_EXACT_GE(x_float, y_float);
143     PW_CHECK_FLOAT_EXACT_GE(x_float, y_float, "FLOAT: " FAIL_IF_HIDDEN);
144     PW_CHECK_FLOAT_EXACT_GE(x_float, y_float, "FLOAT: " FAIL_IF_HIDDEN_ARGS, z);
145   }
146 
147   // Don't exhaustively test the DCHECKs but have a sampling of them.
148   {  // TEST(DCheck, Sampling)
149     MAYBE_SKIP_TEST;
150     PW_DCHECK(5 == 10);
151     PW_DCHECK(5 == 10, "Message");
152     PW_DCHECK(5 == 10, "Message: %d", 5);
153     PW_DCHECK_INT_LE(5.4, 10.0);
154     PW_DCHECK_FLOAT_EXACT_EQ(5.4, 10.0, "Message");
155   }
156 
157   {  // TEST(Check, ComparisonArgumentsWithCommas)
158     MAYBE_SKIP_TEST;
159     int x_int = 50;
160     int y_int = 66;
161 
162     PW_CHECK_INT_LE(Add3(1, 2, 3), y_int);
163     PW_CHECK_INT_LE(x_int, Add3(1, 2, 3));
164 
165     PW_CHECK_INT_LE(Add3(1, 2, 3), y_int, FAIL_IF_DISPLAYED);
166     PW_CHECK_INT_LE(x_int, Add3(1, 2, 3), FAIL_IF_DISPLAYED_ARGS, z);
167 
168     PW_CHECK_INT_LE(Add3(1, 2, 3), Add3(1, 2, 3), "INT: " FAIL_IF_DISPLAYED);
169     PW_CHECK_INT_LE(x_int, y_int, "INT: " FAIL_IF_DISPLAYED_ARGS, z);
170   }
171 
172   {  // TEST(Check, ShortNamesWork) {
173     MAYBE_SKIP_TEST;
174 
175     // Crash
176     CRASH(FAIL_IF_HIDDEN);
177     CRASH(FAIL_IF_HIDDEN_ARGS, z);
178 
179     // Check
180     CHECK(1, FAIL_IF_DISPLAYED);
181     CHECK(1, FAIL_IF_DISPLAYED_ARGS, z);
182     CHECK(0, FAIL_IF_HIDDEN);
183     CHECK(0, FAIL_IF_HIDDEN_ARGS, z);
184 
185     // Check with binary comparison
186     int x_int = 50;
187     int y_int = 66;
188 
189     CHECK_INT_LE(Add3(1, 2, 3), y_int);
190     CHECK_INT_LE(x_int, Add3(1, 2, 3));
191 
192     CHECK_INT_LE(Add3(1, 2, 3), y_int, FAIL_IF_DISPLAYED);
193     CHECK_INT_LE(x_int, Add3(1, 2, 3), FAIL_IF_DISPLAYED_ARGS, z);
194 
195     CHECK_INT_LE(Add3(1, 2, 3), Add3(1, 2, 3), "INT: " FAIL_IF_DISPLAYED);
196     CHECK_INT_LE(x_int, y_int, "INT: " FAIL_IF_DISPLAYED_ARGS, z);
197   }
198 
199   {  // Compile tests for PW_CHECK_OK().
200     PW_CHECK_OK(PW_STATUS_OK);
201     PW_CHECK_OK(PW_STATUS_OK, "msg");
202     PW_CHECK_OK(PW_STATUS_OK, "msg: %d", 5);
203     PW_DCHECK_OK(PW_STATUS_OK);
204     PW_DCHECK_OK(PW_STATUS_OK, "msg");
205     PW_DCHECK_OK(PW_STATUS_OK, "msg: %d", 5);
206   }
207 
208   {  // TEST(Assert, Basic)
209     MAYBE_SKIP_TEST;
210     PW_ASSERT(false);
211     PW_ASSERT(123 == 456);
212   }
213 
214   {  // Compile tests for PW_ASSERT().
215     PW_ASSERT(true);
216     PW_ASSERT(123 != 456);
217 
218     PW_DASSERT(true);
219     PW_DASSERT(123 != 456);
220   }
221 
222   EnsureNullIsIncluded();
223 }
224