1*61c4878aSAndroid Build Coastguard Worker // Copyright 2020 The Pigweed Authors
2*61c4878aSAndroid Build Coastguard Worker //
3*61c4878aSAndroid Build Coastguard Worker // Licensed under the Apache License, Version 2.0 (the "License"); you may not
4*61c4878aSAndroid Build Coastguard Worker // use this file except in compliance with the License. You may obtain a copy of
5*61c4878aSAndroid Build Coastguard Worker // the License at
6*61c4878aSAndroid Build Coastguard Worker //
7*61c4878aSAndroid Build Coastguard Worker // https://www.apache.org/licenses/LICENSE-2.0
8*61c4878aSAndroid Build Coastguard Worker //
9*61c4878aSAndroid Build Coastguard Worker // Unless required by applicable law or agreed to in writing, software
10*61c4878aSAndroid Build Coastguard Worker // distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
11*61c4878aSAndroid Build Coastguard Worker // WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
12*61c4878aSAndroid Build Coastguard Worker // License for the specific language governing permissions and limitations under
13*61c4878aSAndroid Build Coastguard Worker // the License.
14*61c4878aSAndroid Build Coastguard Worker
15*61c4878aSAndroid Build Coastguard Worker // This is mostly a compile test to verify that the log backend is able to
16*61c4878aSAndroid Build Coastguard Worker // compile the constructs promised by the logging facade; and that when run,
17*61c4878aSAndroid Build Coastguard Worker // there is no crash.
18*61c4878aSAndroid Build Coastguard Worker //
19*61c4878aSAndroid Build Coastguard Worker // TODO: b/235289499 - Add verification of the actually logged statements.
20*61c4878aSAndroid Build Coastguard Worker
21*61c4878aSAndroid Build Coastguard Worker // clang-format off
22*61c4878aSAndroid Build Coastguard Worker #define PW_LOG_MODULE_NAME "TST"
23*61c4878aSAndroid Build Coastguard Worker #define PW_LOG_LEVEL PW_LOG_LEVEL_DEBUG
24*61c4878aSAndroid Build Coastguard Worker #include "pw_log/log.h"
25*61c4878aSAndroid Build Coastguard Worker #include "pw_log/short.h"
26*61c4878aSAndroid Build Coastguard Worker #include "pw_log/shorter.h"
27*61c4878aSAndroid Build Coastguard Worker // clang-format on
28*61c4878aSAndroid Build Coastguard Worker
29*61c4878aSAndroid Build Coastguard Worker #include "pw_unit_test/framework.h"
30*61c4878aSAndroid Build Coastguard Worker
31*61c4878aSAndroid Build Coastguard Worker namespace {
32*61c4878aSAndroid Build Coastguard Worker
33*61c4878aSAndroid Build Coastguard Worker // TODO: b/235291136 - Test unsigned integer logging (32 and 64 bit); test
34*61c4878aSAndroid Build Coastguard Worker // pointer logging.
35*61c4878aSAndroid Build Coastguard Worker
LoggingFromFunction()36*61c4878aSAndroid Build Coastguard Worker void LoggingFromFunction() { PW_LOG_INFO("From a function!"); }
37*61c4878aSAndroid Build Coastguard Worker
38*61c4878aSAndroid Build Coastguard Worker const int N = 3;
39*61c4878aSAndroid Build Coastguard Worker
TEST(BasicLog,DebugLevel)40*61c4878aSAndroid Build Coastguard Worker TEST(BasicLog, DebugLevel) {
41*61c4878aSAndroid Build Coastguard Worker PW_LOG_DEBUG("This log statement should be at DEBUG level; no args");
42*61c4878aSAndroid Build Coastguard Worker for (int i = 0; i < N; ++i) {
43*61c4878aSAndroid Build Coastguard Worker PW_LOG_DEBUG("Counting: %d", i);
44*61c4878aSAndroid Build Coastguard Worker }
45*61c4878aSAndroid Build Coastguard Worker PW_LOG_DEBUG("Here is a string: %s; with another string %s", "foo", "bar");
46*61c4878aSAndroid Build Coastguard Worker }
47*61c4878aSAndroid Build Coastguard Worker
TEST(BasicLog,InfoLevel)48*61c4878aSAndroid Build Coastguard Worker TEST(BasicLog, InfoLevel) {
49*61c4878aSAndroid Build Coastguard Worker PW_LOG_INFO("This log statement should be at INFO level; no args");
50*61c4878aSAndroid Build Coastguard Worker for (int i = 0; i < N; ++i) {
51*61c4878aSAndroid Build Coastguard Worker PW_LOG_INFO("Counting: %d", i);
52*61c4878aSAndroid Build Coastguard Worker }
53*61c4878aSAndroid Build Coastguard Worker PW_LOG_INFO("Here is a string: %s; with another string %s", "foo", "bar");
54*61c4878aSAndroid Build Coastguard Worker }
55*61c4878aSAndroid Build Coastguard Worker
TEST(BasicLog,WarnLevel)56*61c4878aSAndroid Build Coastguard Worker TEST(BasicLog, WarnLevel) {
57*61c4878aSAndroid Build Coastguard Worker PW_LOG_WARN("This log statement should be at WARN level; no args");
58*61c4878aSAndroid Build Coastguard Worker for (int i = 0; i < N; ++i) {
59*61c4878aSAndroid Build Coastguard Worker PW_LOG_WARN("Counting: %d", i);
60*61c4878aSAndroid Build Coastguard Worker }
61*61c4878aSAndroid Build Coastguard Worker PW_LOG_WARN("Here is a string: %s; with another string %s", "foo", "bar");
62*61c4878aSAndroid Build Coastguard Worker }
63*61c4878aSAndroid Build Coastguard Worker
TEST(BasicLog,ErrorLevel)64*61c4878aSAndroid Build Coastguard Worker TEST(BasicLog, ErrorLevel) {
65*61c4878aSAndroid Build Coastguard Worker PW_LOG_ERROR("This log statement should be at ERROR level; no args");
66*61c4878aSAndroid Build Coastguard Worker for (int i = 0; i < N; ++i) {
67*61c4878aSAndroid Build Coastguard Worker PW_LOG_ERROR("Counting: %d", i);
68*61c4878aSAndroid Build Coastguard Worker }
69*61c4878aSAndroid Build Coastguard Worker PW_LOG_ERROR("Here is a string: %s; with another string %s", "foo", "bar");
70*61c4878aSAndroid Build Coastguard Worker }
71*61c4878aSAndroid Build Coastguard Worker
TEST(BasicLog,CriticalLevel)72*61c4878aSAndroid Build Coastguard Worker TEST(BasicLog, CriticalLevel) {
73*61c4878aSAndroid Build Coastguard Worker PW_LOG_CRITICAL("Critical, emergency log. Device should not reboot");
74*61c4878aSAndroid Build Coastguard Worker }
75*61c4878aSAndroid Build Coastguard Worker
TEST(BasicLog,ManualLevel)76*61c4878aSAndroid Build Coastguard Worker TEST(BasicLog, ManualLevel) {
77*61c4878aSAndroid Build Coastguard Worker PW_LOG(PW_LOG_LEVEL_DEBUG,
78*61c4878aSAndroid Build Coastguard Worker PW_LOG_LEVEL,
79*61c4878aSAndroid Build Coastguard Worker PW_LOG_MODULE_NAME,
80*61c4878aSAndroid Build Coastguard Worker 0,
81*61c4878aSAndroid Build Coastguard Worker "A manual DEBUG-level message");
82*61c4878aSAndroid Build Coastguard Worker PW_LOG(PW_LOG_LEVEL_DEBUG,
83*61c4878aSAndroid Build Coastguard Worker PW_LOG_LEVEL,
84*61c4878aSAndroid Build Coastguard Worker PW_LOG_MODULE_NAME,
85*61c4878aSAndroid Build Coastguard Worker 1,
86*61c4878aSAndroid Build Coastguard Worker "A manual DEBUG-level message; with a flag");
87*61c4878aSAndroid Build Coastguard Worker
88*61c4878aSAndroid Build Coastguard Worker PW_LOG(PW_LOG_LEVEL_INFO,
89*61c4878aSAndroid Build Coastguard Worker PW_LOG_LEVEL,
90*61c4878aSAndroid Build Coastguard Worker PW_LOG_MODULE_NAME,
91*61c4878aSAndroid Build Coastguard Worker 0,
92*61c4878aSAndroid Build Coastguard Worker "A manual INFO-level message");
93*61c4878aSAndroid Build Coastguard Worker PW_LOG(PW_LOG_LEVEL_INFO,
94*61c4878aSAndroid Build Coastguard Worker PW_LOG_LEVEL,
95*61c4878aSAndroid Build Coastguard Worker PW_LOG_MODULE_NAME,
96*61c4878aSAndroid Build Coastguard Worker 1,
97*61c4878aSAndroid Build Coastguard Worker "A manual INFO-level message; with a flag");
98*61c4878aSAndroid Build Coastguard Worker
99*61c4878aSAndroid Build Coastguard Worker PW_LOG(PW_LOG_LEVEL_WARN,
100*61c4878aSAndroid Build Coastguard Worker PW_LOG_LEVEL,
101*61c4878aSAndroid Build Coastguard Worker PW_LOG_MODULE_NAME,
102*61c4878aSAndroid Build Coastguard Worker 0,
103*61c4878aSAndroid Build Coastguard Worker "A manual WARN-level message");
104*61c4878aSAndroid Build Coastguard Worker PW_LOG(PW_LOG_LEVEL_WARN,
105*61c4878aSAndroid Build Coastguard Worker PW_LOG_LEVEL,
106*61c4878aSAndroid Build Coastguard Worker PW_LOG_MODULE_NAME,
107*61c4878aSAndroid Build Coastguard Worker 1,
108*61c4878aSAndroid Build Coastguard Worker "A manual WARN-level message; with a flag");
109*61c4878aSAndroid Build Coastguard Worker
110*61c4878aSAndroid Build Coastguard Worker PW_LOG(PW_LOG_LEVEL_ERROR,
111*61c4878aSAndroid Build Coastguard Worker PW_LOG_LEVEL,
112*61c4878aSAndroid Build Coastguard Worker PW_LOG_MODULE_NAME,
113*61c4878aSAndroid Build Coastguard Worker 0,
114*61c4878aSAndroid Build Coastguard Worker "A manual ERROR-level message");
115*61c4878aSAndroid Build Coastguard Worker PW_LOG(PW_LOG_LEVEL_ERROR,
116*61c4878aSAndroid Build Coastguard Worker PW_LOG_LEVEL,
117*61c4878aSAndroid Build Coastguard Worker PW_LOG_MODULE_NAME,
118*61c4878aSAndroid Build Coastguard Worker 1,
119*61c4878aSAndroid Build Coastguard Worker "A manual ERROR-level message; with a flag");
120*61c4878aSAndroid Build Coastguard Worker
121*61c4878aSAndroid Build Coastguard Worker PW_LOG(PW_LOG_LEVEL_CRITICAL,
122*61c4878aSAndroid Build Coastguard Worker PW_LOG_LEVEL,
123*61c4878aSAndroid Build Coastguard Worker PW_LOG_MODULE_NAME,
124*61c4878aSAndroid Build Coastguard Worker 0,
125*61c4878aSAndroid Build Coastguard Worker "A manual CRITICAL-level message");
126*61c4878aSAndroid Build Coastguard Worker PW_LOG(PW_LOG_LEVEL_CRITICAL,
127*61c4878aSAndroid Build Coastguard Worker PW_LOG_LEVEL,
128*61c4878aSAndroid Build Coastguard Worker PW_LOG_MODULE_NAME,
129*61c4878aSAndroid Build Coastguard Worker 1,
130*61c4878aSAndroid Build Coastguard Worker "A manual CRITICAL-level message; with a flag");
131*61c4878aSAndroid Build Coastguard Worker }
132*61c4878aSAndroid Build Coastguard Worker
TEST(BasicLog,FromAFunction)133*61c4878aSAndroid Build Coastguard Worker TEST(BasicLog, FromAFunction) { LoggingFromFunction(); }
134*61c4878aSAndroid Build Coastguard Worker
TEST(BasicLog,CustomLogLevels)135*61c4878aSAndroid Build Coastguard Worker TEST(BasicLog, CustomLogLevels) {
136*61c4878aSAndroid Build Coastguard Worker // Log levels other than the standard ones work; what each backend does is
137*61c4878aSAndroid Build Coastguard Worker // implementation defined.
138*61c4878aSAndroid Build Coastguard Worker PW_LOG(0, PW_LOG_LEVEL, "", 0, "Custom log level: 0");
139*61c4878aSAndroid Build Coastguard Worker PW_LOG(1, PW_LOG_LEVEL, "", 0, "Custom log level: 1");
140*61c4878aSAndroid Build Coastguard Worker PW_LOG(2, PW_LOG_LEVEL, "", 0, "Custom log level: 2");
141*61c4878aSAndroid Build Coastguard Worker PW_LOG(3, PW_LOG_LEVEL, "", 0, "Custom log level: 3");
142*61c4878aSAndroid Build Coastguard Worker PW_LOG(100, PW_LOG_LEVEL, "", 0, "Custom log level: 100");
143*61c4878aSAndroid Build Coastguard Worker }
144*61c4878aSAndroid Build Coastguard Worker
145*61c4878aSAndroid Build Coastguard Worker #define TEST_FAILED_LOG "IF THIS MESSAGE WAS LOGGED, THE TEST FAILED"
146*61c4878aSAndroid Build Coastguard Worker
TEST(BasicLog,FilteringByLevel)147*61c4878aSAndroid Build Coastguard Worker TEST(BasicLog, FilteringByLevel) {
148*61c4878aSAndroid Build Coastguard Worker #undef PW_LOG_SKIP_LOGS_WITH_LEVEL_LT
149*61c4878aSAndroid Build Coastguard Worker #define PW_LOG_SKIP_LOGS_WITH_LEVEL_LT PW_LOG_LEVEL_ERROR
150*61c4878aSAndroid Build Coastguard Worker
151*61c4878aSAndroid Build Coastguard Worker PW_LOG_DEBUG(TEST_FAILED_LOG);
152*61c4878aSAndroid Build Coastguard Worker PW_LOG_INFO(TEST_FAILED_LOG);
153*61c4878aSAndroid Build Coastguard Worker PW_LOG_WARN(TEST_FAILED_LOG);
154*61c4878aSAndroid Build Coastguard Worker
155*61c4878aSAndroid Build Coastguard Worker PW_LOG_ERROR("This log should appear as error status (and that's good)");
156*61c4878aSAndroid Build Coastguard Worker
157*61c4878aSAndroid Build Coastguard Worker #undef PW_LOG_SKIP_LOGS_WITH_LEVEL_LT
158*61c4878aSAndroid Build Coastguard Worker #define PW_LOG_SKIP_LOGS_WITH_LEVEL_LT 0
159*61c4878aSAndroid Build Coastguard Worker }
160*61c4878aSAndroid Build Coastguard Worker
TEST(BasicLog,FilteringByFlags)161*61c4878aSAndroid Build Coastguard Worker TEST(BasicLog, FilteringByFlags) {
162*61c4878aSAndroid Build Coastguard Worker #undef PW_LOG_SKIP_LOGS_WITH_FLAGS
163*61c4878aSAndroid Build Coastguard Worker #define PW_LOG_SKIP_LOGS_WITH_FLAGS 1
164*61c4878aSAndroid Build Coastguard Worker
165*61c4878aSAndroid Build Coastguard Worker // Flag is set so these should all get zapped.
166*61c4878aSAndroid Build Coastguard Worker PW_LOG(
167*61c4878aSAndroid Build Coastguard Worker PW_LOG_LEVEL_INFO, PW_LOG_LEVEL, PW_LOG_MODULE_NAME, 1, TEST_FAILED_LOG);
168*61c4878aSAndroid Build Coastguard Worker PW_LOG(
169*61c4878aSAndroid Build Coastguard Worker PW_LOG_LEVEL_ERROR, PW_LOG_LEVEL, PW_LOG_MODULE_NAME, 1, TEST_FAILED_LOG);
170*61c4878aSAndroid Build Coastguard Worker
171*61c4878aSAndroid Build Coastguard Worker // However, a different flag bit should still log.
172*61c4878aSAndroid Build Coastguard Worker PW_LOG(PW_LOG_LEVEL_INFO,
173*61c4878aSAndroid Build Coastguard Worker PW_LOG_LEVEL,
174*61c4878aSAndroid Build Coastguard Worker PW_LOG_MODULE_NAME,
175*61c4878aSAndroid Build Coastguard Worker 1 << 1,
176*61c4878aSAndroid Build Coastguard Worker "This flagged log is intended to appear");
177*61c4878aSAndroid Build Coastguard Worker PW_LOG(PW_LOG_LEVEL_ERROR,
178*61c4878aSAndroid Build Coastguard Worker PW_LOG_LEVEL,
179*61c4878aSAndroid Build Coastguard Worker PW_LOG_MODULE_NAME,
180*61c4878aSAndroid Build Coastguard Worker 1 << 1,
181*61c4878aSAndroid Build Coastguard Worker "This flagged log is intended to appear");
182*61c4878aSAndroid Build Coastguard Worker
183*61c4878aSAndroid Build Coastguard Worker #undef PW_LOG_SKIP_LOGS_WITH_FLAGS
184*61c4878aSAndroid Build Coastguard Worker #define PW_LOG_SKIP_LOGS_WITH_FLAGS 0
185*61c4878aSAndroid Build Coastguard Worker }
186*61c4878aSAndroid Build Coastguard Worker
TEST(BasicLog,ChangingTheModuleName)187*61c4878aSAndroid Build Coastguard Worker TEST(BasicLog, ChangingTheModuleName) {
188*61c4878aSAndroid Build Coastguard Worker #undef PW_LOG_MODULE_NAME
189*61c4878aSAndroid Build Coastguard Worker #define PW_LOG_MODULE_NAME "PQR"
190*61c4878aSAndroid Build Coastguard Worker PW_LOG_INFO("This has a custom module name");
191*61c4878aSAndroid Build Coastguard Worker PW_LOG_INFO("So does this");
192*61c4878aSAndroid Build Coastguard Worker }
193*61c4878aSAndroid Build Coastguard Worker
TEST(BasicLog,ShortNames)194*61c4878aSAndroid Build Coastguard Worker TEST(BasicLog, ShortNames) {
195*61c4878aSAndroid Build Coastguard Worker LOG(PW_LOG_LEVEL_INFO, PW_LOG_LEVEL, PW_LOG_MODULE_NAME, 0, "Shrt lg");
196*61c4878aSAndroid Build Coastguard Worker LOG_DEBUG("A debug log: %d", 1);
197*61c4878aSAndroid Build Coastguard Worker LOG_INFO("An info log: %d", 2);
198*61c4878aSAndroid Build Coastguard Worker LOG_WARN("A warning log: %d", 3);
199*61c4878aSAndroid Build Coastguard Worker LOG_ERROR("An error log: %d", 4);
200*61c4878aSAndroid Build Coastguard Worker LOG_CRITICAL("A critical log: %d", 4);
201*61c4878aSAndroid Build Coastguard Worker }
202*61c4878aSAndroid Build Coastguard Worker
TEST(BasicLog,UltraShortNames)203*61c4878aSAndroid Build Coastguard Worker TEST(BasicLog, UltraShortNames) {
204*61c4878aSAndroid Build Coastguard Worker LOG(PW_LOG_LEVEL_INFO, PW_LOG_LEVEL, PW_LOG_MODULE_NAME, 0, "Shrt lg");
205*61c4878aSAndroid Build Coastguard Worker DBG("A debug log: %d", 1);
206*61c4878aSAndroid Build Coastguard Worker INF("An info log: %d", 2);
207*61c4878aSAndroid Build Coastguard Worker WRN("A warning log: %d", 3);
208*61c4878aSAndroid Build Coastguard Worker ERR("An error log: %d", 4);
209*61c4878aSAndroid Build Coastguard Worker CRT("A critical log: %d", 4);
210*61c4878aSAndroid Build Coastguard Worker }
211*61c4878aSAndroid Build Coastguard Worker
212*61c4878aSAndroid Build Coastguard Worker extern "C" void BasicLogTestPlainC();
213*61c4878aSAndroid Build Coastguard Worker
TEST(BasicLog,FromPlainC)214*61c4878aSAndroid Build Coastguard Worker TEST(BasicLog, FromPlainC) { BasicLogTestPlainC(); }
215*61c4878aSAndroid Build Coastguard Worker
216*61c4878aSAndroid Build Coastguard Worker // Test that adding to the format string compiles correctly. If PW_COMMA_ARGS is
217*61c4878aSAndroid Build Coastguard Worker // used in PW_LOG_INFO and the other wrappers in pw_log/log.h, then these
218*61c4878aSAndroid Build Coastguard Worker // functions tests fail to compile, because the arguments end up out-of-order.
219*61c4878aSAndroid Build Coastguard Worker
220*61c4878aSAndroid Build Coastguard Worker #undef PW_LOG
221*61c4878aSAndroid Build Coastguard Worker #define PW_LOG(level, verbosity, module, flags, message, ...) \
222*61c4878aSAndroid Build Coastguard Worker DoNothingFakeFunction(module, \
223*61c4878aSAndroid Build Coastguard Worker "%d/%d/%d: incoming transmission [" message "]", \
224*61c4878aSAndroid Build Coastguard Worker level, \
225*61c4878aSAndroid Build Coastguard Worker __LINE__, \
226*61c4878aSAndroid Build Coastguard Worker flags PW_COMMA_ARGS(__VA_ARGS__))
227*61c4878aSAndroid Build Coastguard Worker
228*61c4878aSAndroid Build Coastguard Worker void DoNothingFakeFunction(const char*, const char*, ...)
229*61c4878aSAndroid Build Coastguard Worker PW_PRINTF_FORMAT(2, 3);
230*61c4878aSAndroid Build Coastguard Worker
DoNothingFakeFunction(const char *,const char *,...)231*61c4878aSAndroid Build Coastguard Worker void DoNothingFakeFunction(const char*, const char*, ...) {}
232*61c4878aSAndroid Build Coastguard Worker
TEST(CustomFormatString,DebugLevel)233*61c4878aSAndroid Build Coastguard Worker TEST(CustomFormatString, DebugLevel) {
234*61c4878aSAndroid Build Coastguard Worker PW_LOG_DEBUG("This log statement should be at DEBUG level; no args");
235*61c4878aSAndroid Build Coastguard Worker for (int i = 0; i < N; ++i) {
236*61c4878aSAndroid Build Coastguard Worker PW_LOG_DEBUG("Counting: %d", i);
237*61c4878aSAndroid Build Coastguard Worker }
238*61c4878aSAndroid Build Coastguard Worker PW_LOG_DEBUG("Here is a string: %s; with another string %s", "foo", "bar");
239*61c4878aSAndroid Build Coastguard Worker }
240*61c4878aSAndroid Build Coastguard Worker
TEST(CustomFormatString,InfoLevel)241*61c4878aSAndroid Build Coastguard Worker TEST(CustomFormatString, InfoLevel) {
242*61c4878aSAndroid Build Coastguard Worker PW_LOG_INFO("This log statement should be at INFO level; no args");
243*61c4878aSAndroid Build Coastguard Worker for (int i = 0; i < N; ++i) {
244*61c4878aSAndroid Build Coastguard Worker PW_LOG_INFO("Counting: %d", i);
245*61c4878aSAndroid Build Coastguard Worker }
246*61c4878aSAndroid Build Coastguard Worker PW_LOG_INFO("Here is a string: %s; with another string %s", "foo", "bar");
247*61c4878aSAndroid Build Coastguard Worker }
248*61c4878aSAndroid Build Coastguard Worker
TEST(CustomFormatString,WarnLevel)249*61c4878aSAndroid Build Coastguard Worker TEST(CustomFormatString, WarnLevel) {
250*61c4878aSAndroid Build Coastguard Worker PW_LOG_WARN("This log statement should be at WARN level; no args");
251*61c4878aSAndroid Build Coastguard Worker for (int i = 0; i < N; ++i) {
252*61c4878aSAndroid Build Coastguard Worker PW_LOG_WARN("Counting: %d", i);
253*61c4878aSAndroid Build Coastguard Worker }
254*61c4878aSAndroid Build Coastguard Worker PW_LOG_WARN("Here is a string: %s; with another string %s", "foo", "bar");
255*61c4878aSAndroid Build Coastguard Worker }
256*61c4878aSAndroid Build Coastguard Worker
TEST(CustomFormatString,ErrorLevel)257*61c4878aSAndroid Build Coastguard Worker TEST(CustomFormatString, ErrorLevel) {
258*61c4878aSAndroid Build Coastguard Worker PW_LOG_ERROR("This log statement should be at ERROR level; no args");
259*61c4878aSAndroid Build Coastguard Worker for (int i = 0; i < N; ++i) {
260*61c4878aSAndroid Build Coastguard Worker PW_LOG_ERROR("Counting: %d", i);
261*61c4878aSAndroid Build Coastguard Worker }
262*61c4878aSAndroid Build Coastguard Worker PW_LOG_ERROR("Here is a string: %s; with another string %s", "foo", "bar");
263*61c4878aSAndroid Build Coastguard Worker }
264*61c4878aSAndroid Build Coastguard Worker
TEST(CustomFormatString,CriticalLevel)265*61c4878aSAndroid Build Coastguard Worker TEST(CustomFormatString, CriticalLevel) {
266*61c4878aSAndroid Build Coastguard Worker PW_LOG_CRITICAL("Critical, emergency log. Device should not reboot");
267*61c4878aSAndroid Build Coastguard Worker }
268*61c4878aSAndroid Build Coastguard Worker
269*61c4878aSAndroid Build Coastguard Worker } // namespace
270