blob: 89cd39b1c256b1caaa8cf01462d40a63329d9eaa [file] [log] [blame]
Keir Mierle3cee8792020-01-22 17:08:13 -08001// 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 mostly a compile test to verify that the log backend is able to
16// compile the constructs promised by the logging facade; and that when run,
17// there is no crash.
18//
19// TODO(pwbug/88): Add verification of the actually logged statements.
20
21// clang-format off
22#include "pw_assert/assert.h"
23// clang-format on
24
25#include "gtest/gtest.h"
26
27// This is a global constant to feed into the formatter for tests.
28// Intended to pair with FAIL_IF_DISPLAYED_ARGS or FAIL_IF_HIDDEN_ARGS.
29static const int z = 10;
30
31// At some point in the future when there is a proper test system in place for
32// crashing, the below strings can help indicate pass/fail for a check.
33
34#define FAIL_IF_DISPLAYED "FAIL IF DISPLAYED"
35#define FAIL_IF_DISPLAYED_ARGS "FAIL IF DISPLAYED: %d"
36
37#define FAIL_IF_HIDDEN "FAIL IF HIDDEN"
38#define FAIL_IF_HIDDEN_ARGS "FAIL IF HIDDEN: %d"
39
40// This switch exists to support compiling and/or running the tests.
41#define DISABLE_ASSERT_TEST_EXECUTION 1
42#if DISABLE_ASSERT_TEST_EXECUTION
43#define MAYBE_SKIP_TEST return
44#else
45#define MAYBE_SKIP_TEST ;
46#endif
47
48namespace {
49
50TEST(Crash, WithAndWithoutMessageArguments) {
51 MAYBE_SKIP_TEST;
52 PW_CRASH(FAIL_IF_HIDDEN);
53 PW_CRASH(FAIL_IF_HIDDEN_ARGS, z);
54}
55
56TEST(Check, NoMessage) {
57 MAYBE_SKIP_TEST;
58 PW_CHECK(true);
59 PW_CHECK(false);
60}
61
62TEST(Check, WithMessageAndArgs) {
63 MAYBE_SKIP_TEST;
64 PW_CHECK(true, FAIL_IF_DISPLAYED);
65 PW_CHECK(true, FAIL_IF_DISPLAYED_ARGS, z);
66
67 PW_CHECK(false, FAIL_IF_HIDDEN);
68 PW_CHECK(false, FAIL_IF_HIDDEN_ARGS, z);
69}
70
71TEST(Check, IntComparison) {
72 MAYBE_SKIP_TEST;
73 int x_int = 50;
74 int y_int = 66;
75
76 PW_CHECK_INT_LE(x_int, y_int);
77 PW_CHECK_INT_LE(x_int, y_int, "INT: " FAIL_IF_DISPLAYED);
78 PW_CHECK_INT_LE(x_int, y_int, "INT: " FAIL_IF_DISPLAYED_ARGS, z);
79
80 PW_CHECK_INT_GE(x_int, y_int);
81 PW_CHECK_INT_GE(x_int, y_int, "INT: " FAIL_IF_HIDDEN);
82 PW_CHECK_INT_GE(x_int, y_int, "INT: " FAIL_IF_HIDDEN_ARGS, z);
83}
84
85TEST(Check, UintComparison) {
86 MAYBE_SKIP_TEST;
87 unsigned int x_uint = 50;
88 unsigned int y_uint = 66;
89
90 PW_CHECK_UINT_LE(x_uint, y_uint);
91 PW_CHECK_UINT_LE(x_uint, y_uint, "UINT: " FAIL_IF_DISPLAYED);
92 PW_CHECK_UINT_LE(x_uint, y_uint, "UINT: " FAIL_IF_DISPLAYED_ARGS, z);
93
94 PW_CHECK_UINT_GE(x_uint, y_uint);
95 PW_CHECK_UINT_GE(x_uint, y_uint, "UINT: " FAIL_IF_HIDDEN);
96 PW_CHECK_UINT_GE(x_uint, y_uint, "UINT: " FAIL_IF_HIDDEN_ARGS, z);
97}
98
99TEST(Check, FloatComparison) {
100 MAYBE_SKIP_TEST;
101 float x_float = 50.5;
102 float y_float = 66.5;
103
104 PW_CHECK_FLOAT_LE(x_float, y_float);
105 PW_CHECK_FLOAT_LE(x_float, y_float, "FLOAT: " FAIL_IF_DISPLAYED);
106 PW_CHECK_FLOAT_LE(x_float, y_float, "FLOAT: " FAIL_IF_DISPLAYED_ARGS, z);
107
108 PW_CHECK_FLOAT_GE(x_float, y_float);
109 PW_CHECK_FLOAT_GE(x_float, y_float, "FLOAT: " FAIL_IF_HIDDEN);
110 PW_CHECK_FLOAT_GE(x_float, y_float, "FLOAT: " FAIL_IF_HIDDEN_ARGS, z);
111}
112
113static int Add3(int a, int b, int c) { return a + b + c; }
114
115TEST(Check, ComparisonArgumentsWithCommas) {
116 MAYBE_SKIP_TEST;
117 int x_int = 50;
118 int y_int = 66;
119
120 PW_CHECK_INT_LE(Add3(1, 2, 3), y_int);
121 PW_CHECK_INT_LE(x_int, Add3(1, 2, 3));
122
123 PW_CHECK_INT_LE(Add3(1, 2, 3), y_int, FAIL_IF_DISPLAYED);
124 PW_CHECK_INT_LE(x_int, Add3(1, 2, 3), FAIL_IF_DISPLAYED_ARGS, z);
125
126 PW_CHECK_INT_LE(Add3(1, 2, 3), Add3(1, 2, 3), "INT: " FAIL_IF_DISPLAYED);
127 PW_CHECK_INT_LE(x_int, y_int, "INT: " FAIL_IF_DISPLAYED_ARGS, z);
128}
129
130// These are defined in assert_test.c, to test C compatibility.
131extern "C" {
132void AssertTestsInC();
133} // extern "C"
134
135TEST(Check, AssertTestsInC) {
136 MAYBE_SKIP_TEST;
137 AssertTestsInC();
138}
139
140static int global_state_for_multi_evaluate_test;
141static int IncrementsGlobal() {
142 global_state_for_multi_evaluate_test++;
143 return 0;
144}
145
146// This test verifies that the binary CHECK_*(x,y) macros only
147// evaluate their arguments once.
148TEST(Check, BinaryOpOnlyEvaluatesOnce) {
149 MAYBE_SKIP_TEST;
150
151 global_state_for_multi_evaluate_test = 0;
152 PW_CHECK_INT_EQ(0, IncrementsGlobal());
153 EXPECT_EQ(global_state_for_multi_evaluate_test, 1);
154
155 global_state_for_multi_evaluate_test = 0;
156 PW_CHECK_INT_EQ(IncrementsGlobal(), IncrementsGlobal());
157 EXPECT_EQ(global_state_for_multi_evaluate_test, 2);
158
159 // Fails; should only evaluate IncrementGlobal() once.
160 global_state_for_multi_evaluate_test = 0;
161 PW_CHECK_INT_EQ(1, IncrementsGlobal());
162 EXPECT_EQ(global_state_for_multi_evaluate_test, 1);
163
164 global_state_for_multi_evaluate_test = 0;
165 PW_CHECK_INT_EQ(IncrementsGlobal(), 1 + IncrementsGlobal());
166 EXPECT_EQ(global_state_for_multi_evaluate_test, 2);
167}
168
169} // namespace