1 // Copyright 2020 The Pigweed Authors
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
7 // https://www.apache.org/licenses/LICENSE-2.0
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
15 #define PW_TRACE_MODULE_NAME "TST"
16 #include "gtest/gtest.h"
17 #include "pw_trace/trace.h"
18 #include "pw_trace_test/fake_backend.h"
20 using namespace trace_fake_backend;
22 // Used by fake backend
23 LastEvent LastEvent::instance_;
27 void TraceFunction() {
29 // Can't check label, since might change depending on compiler.
30 EXPECT_TRUE(LastEvent::Instance().Get().IsEqualIgnoreLabel(
32 PW_TRACE_FLAGS_DEFAULT,
34 PW_TRACE_GROUP_LABEL_DEFAULT,
35 PW_TRACE_TRACE_ID_DEFAULT)));
38 void TraceFunctionGroup() {
39 PW_TRACE_FUNCTION("FunctionGroup");
40 // Can't check label, since might change depending on compiler.
41 EXPECT_TRUE(LastEvent::Instance().Get().IsEqualIgnoreLabel(
42 Event(DurationGroupStart,
43 PW_TRACE_FLAGS_DEFAULT,
46 PW_TRACE_TRACE_ID_DEFAULT)));
49 const char kSomeData[] = "SOME DATA";
53 TEST(BasicTrace, Instant) {
54 PW_TRACE_INSTANT("Test");
55 EXPECT_EQ(LastEvent::Instance().Get(),
57 PW_TRACE_FLAGS_DEFAULT,
59 PW_TRACE_GROUP_LABEL_DEFAULT,
60 PW_TRACE_TRACE_ID_DEFAULT));
63 TEST(BasicTrace, InstantGroup) {
64 PW_TRACE_INSTANT("Test", "group");
65 EXPECT_EQ(LastEvent::Instance().Get(),
66 Event(InstantaneousGroup,
67 PW_TRACE_FLAGS_DEFAULT,
70 PW_TRACE_TRACE_ID_DEFAULT));
73 TEST(BasicTrace, Duration) {
74 PW_TRACE_START("Test");
75 EXPECT_EQ(LastEvent::Instance().Get(),
77 PW_TRACE_FLAGS_DEFAULT,
79 PW_TRACE_GROUP_LABEL_DEFAULT,
80 PW_TRACE_TRACE_ID_DEFAULT));
82 EXPECT_EQ(LastEvent::Instance().Get(),
84 PW_TRACE_FLAGS_DEFAULT,
86 PW_TRACE_GROUP_LABEL_DEFAULT,
87 PW_TRACE_TRACE_ID_DEFAULT));
90 TEST(BasicTrace, DurationGroup) {
91 PW_TRACE_START("Parent", "group");
92 EXPECT_EQ(LastEvent::Instance().Get(),
93 Event(DurationGroupStart,
94 PW_TRACE_FLAGS_DEFAULT,
97 PW_TRACE_TRACE_ID_DEFAULT));
98 PW_TRACE_START("Child", "group");
99 EXPECT_EQ(LastEvent::Instance().Get(),
100 Event(DurationGroupStart,
101 PW_TRACE_FLAGS_DEFAULT,
104 PW_TRACE_TRACE_ID_DEFAULT));
105 PW_TRACE_END("Child", "group");
106 EXPECT_EQ(LastEvent::Instance().Get(),
107 Event(DurationGroupEnd,
108 PW_TRACE_FLAGS_DEFAULT,
111 PW_TRACE_TRACE_ID_DEFAULT));
112 PW_TRACE_START("Other Child", "group");
113 EXPECT_EQ(LastEvent::Instance().Get(),
114 Event(DurationGroupStart,
115 PW_TRACE_FLAGS_DEFAULT,
118 PW_TRACE_TRACE_ID_DEFAULT));
119 PW_TRACE_END("Other Child", "group");
120 EXPECT_EQ(LastEvent::Instance().Get(),
121 Event(DurationGroupEnd,
122 PW_TRACE_FLAGS_DEFAULT,
125 PW_TRACE_TRACE_ID_DEFAULT));
126 PW_TRACE_END("Parent", "group");
127 EXPECT_EQ(LastEvent::Instance().Get(),
128 Event(DurationGroupEnd,
129 PW_TRACE_FLAGS_DEFAULT,
132 PW_TRACE_TRACE_ID_DEFAULT));
135 TEST(BasicTrace, Async) {
136 uint32_t trace_id = 1;
137 PW_TRACE_START("async", "group", trace_id);
139 LastEvent::Instance().Get(),
140 Event(AsyncStart, PW_TRACE_FLAGS_DEFAULT, "async", "group", trace_id));
141 PW_TRACE_INSTANT("step", "group", trace_id);
143 LastEvent::Instance().Get(),
144 Event(AsyncStep, PW_TRACE_FLAGS_DEFAULT, "step", "group", trace_id));
145 PW_TRACE_END("async", "group", trace_id);
147 LastEvent::Instance().Get(),
148 Event(AsyncEnd, PW_TRACE_FLAGS_DEFAULT, "async", "group", trace_id));
151 TEST(BasicTrace, Scope) {
153 PW_TRACE_SCOPE("scoped trace");
154 EXPECT_EQ(LastEvent::Instance().Get(),
156 PW_TRACE_FLAGS_DEFAULT,
158 PW_TRACE_GROUP_LABEL_DEFAULT,
159 PW_TRACE_TRACE_ID_DEFAULT));
161 EXPECT_EQ(LastEvent::Instance().Get(),
163 PW_TRACE_FLAGS_DEFAULT,
165 PW_TRACE_GROUP_LABEL_DEFAULT,
166 PW_TRACE_TRACE_ID_DEFAULT));
169 TEST(BasicTrace, ScopeGroup) {
171 PW_TRACE_SCOPE("scoped group trace", "group");
172 EXPECT_EQ(LastEvent::Instance().Get(),
173 Event(DurationGroupStart,
174 PW_TRACE_FLAGS_DEFAULT,
175 "scoped group trace",
177 PW_TRACE_TRACE_ID_DEFAULT));
179 PW_TRACE_SCOPE("sub scoped group trace", "group");
180 EXPECT_EQ(LastEvent::Instance().Get(),
181 Event(DurationGroupStart,
182 PW_TRACE_FLAGS_DEFAULT,
183 "sub scoped group trace",
185 PW_TRACE_TRACE_ID_DEFAULT));
187 EXPECT_EQ(LastEvent::Instance().Get(),
188 Event(DurationGroupEnd,
189 PW_TRACE_FLAGS_DEFAULT,
190 "sub scoped group trace",
192 PW_TRACE_TRACE_ID_DEFAULT));
194 EXPECT_EQ(LastEvent::Instance().Get(),
195 Event(DurationGroupEnd,
196 PW_TRACE_FLAGS_DEFAULT,
197 "scoped group trace",
199 PW_TRACE_TRACE_ID_DEFAULT));
202 TEST(BasicTrace, ScopeTraceId) {
203 static constexpr uint32_t kTraceId = 5;
205 PW_TRACE_SCOPE("scoped trace id", "group", kTraceId);
206 EXPECT_EQ(LastEvent::Instance().Get(),
208 PW_TRACE_FLAGS_DEFAULT,
213 EXPECT_EQ(LastEvent::Instance().Get(),
215 PW_TRACE_FLAGS_DEFAULT,
221 TEST(BasicTrace, Function) {
223 // Can't check label, since might change depending on compiler.
224 EXPECT_TRUE(LastEvent::Instance().Get().IsEqualIgnoreLabel(
226 PW_TRACE_FLAGS_DEFAULT,
228 PW_TRACE_GROUP_LABEL_DEFAULT,
229 PW_TRACE_TRACE_ID_DEFAULT)));
232 TEST(BasicTrace, FunctionGroup) {
233 TraceFunctionGroup();
234 // Can't check label, since might change depending on compiler.
235 EXPECT_TRUE(LastEvent::Instance().Get().IsEqualIgnoreLabel(
236 Event(DurationGroupEnd,
237 PW_TRACE_FLAGS_DEFAULT,
240 PW_TRACE_TRACE_ID_DEFAULT)));
243 TEST(BasicTrace, InstantData) {
244 PW_TRACE_INSTANT_DATA("Test", "s", kSomeData, sizeof(kSomeData));
245 EXPECT_EQ(LastEvent::Instance().Get(),
247 PW_TRACE_FLAGS_DEFAULT,
249 PW_TRACE_GROUP_LABEL_DEFAULT,
250 PW_TRACE_TRACE_ID_DEFAULT,
256 TEST(BasicTrace, InstantGroupData) {
257 PW_TRACE_INSTANT_DATA("Test", "Group", "s", kSomeData, sizeof(kSomeData));
258 EXPECT_EQ(LastEvent::Instance().Get(),
259 Event(InstantaneousGroup,
260 PW_TRACE_FLAGS_DEFAULT,
263 PW_TRACE_TRACE_ID_DEFAULT,
269 TEST(BasicTrace, DurationData) {
270 PW_TRACE_START_DATA("Test", "s", kSomeData, sizeof(kSomeData));
271 EXPECT_EQ(LastEvent::Instance().Get(),
273 PW_TRACE_FLAGS_DEFAULT,
275 PW_TRACE_GROUP_LABEL_DEFAULT,
276 PW_TRACE_TRACE_ID_DEFAULT,
280 PW_TRACE_END_DATA("Test", "s", kSomeData, sizeof(kSomeData));
281 EXPECT_EQ(LastEvent::Instance().Get(),
283 PW_TRACE_FLAGS_DEFAULT,
285 PW_TRACE_GROUP_LABEL_DEFAULT,
286 PW_TRACE_TRACE_ID_DEFAULT,
292 TEST(BasicTrace, DurationGroupData) {
293 PW_TRACE_START_DATA("Parent", "group", "s", kSomeData, sizeof(kSomeData));
294 EXPECT_EQ(LastEvent::Instance().Get(),
295 Event(DurationGroupStart,
296 PW_TRACE_FLAGS_DEFAULT,
299 PW_TRACE_TRACE_ID_DEFAULT,
303 PW_TRACE_START_DATA("Child", "group", "s", kSomeData, sizeof(kSomeData));
304 EXPECT_EQ(LastEvent::Instance().Get(),
305 Event(DurationGroupStart,
306 PW_TRACE_FLAGS_DEFAULT,
309 PW_TRACE_TRACE_ID_DEFAULT,
313 PW_TRACE_END_DATA("Child", "group", "s", kSomeData, sizeof(kSomeData));
314 EXPECT_EQ(LastEvent::Instance().Get(),
315 Event(DurationGroupEnd,
316 PW_TRACE_FLAGS_DEFAULT,
319 PW_TRACE_TRACE_ID_DEFAULT,
323 PW_TRACE_END_DATA("Parent", "group", "s", kSomeData, sizeof(kSomeData));
324 EXPECT_EQ(LastEvent::Instance().Get(),
325 Event(DurationGroupEnd,
326 PW_TRACE_FLAGS_DEFAULT,
329 PW_TRACE_TRACE_ID_DEFAULT,
335 TEST(BasicTrace, AsyncData) {
336 uint32_t trace_id = 1;
338 "label for start", "group", trace_id, "s", kSomeData, sizeof(kSomeData));
339 EXPECT_EQ(LastEvent::Instance().Get(),
341 PW_TRACE_FLAGS_DEFAULT,
348 PW_TRACE_INSTANT_DATA(
349 "label for step", "group", trace_id, "s", kSomeData, sizeof(kSomeData));
350 EXPECT_EQ(LastEvent::Instance().Get(),
352 PW_TRACE_FLAGS_DEFAULT,
360 "label for end", "group", trace_id, "s", kSomeData, sizeof(kSomeData));
361 EXPECT_EQ(LastEvent::Instance().Get(),
363 PW_TRACE_FLAGS_DEFAULT,
372 TEST(BasicTrace, ProvideFlag) {
373 PW_TRACE_INSTANT_FLAG(5, "Test");
374 EXPECT_EQ(LastEvent::Instance().Get(),
378 PW_TRACE_GROUP_LABEL_DEFAULT,
379 PW_TRACE_TRACE_ID_DEFAULT));
382 TEST(BasicTrace, MacroFlag) {
383 #undef PW_TRACE_FLAGS
384 #define PW_TRACE_FLAGS 6
385 PW_TRACE_INSTANT("Test");
386 EXPECT_EQ(LastEvent::Instance().Get(),
390 PW_TRACE_GROUP_LABEL_DEFAULT,
391 PW_TRACE_TRACE_ID_DEFAULT));
392 #undef PW_TRACE_FLAGS
393 #define PW_TRACE_FLAGS PW_TRACE_FLAGS_DEFAULT
394 PW_TRACE_INSTANT("Test");
395 EXPECT_EQ(LastEvent::Instance().Get(),
397 PW_TRACE_FLAGS_DEFAULT,
399 PW_TRACE_GROUP_LABEL_DEFAULT,
400 PW_TRACE_TRACE_ID_DEFAULT));