xref: /aosp_15_r20/external/openscreen/util/trace_logging_unittest.cc (revision 3f982cf4871df8771c9d4abe6e9a6f8d829b2736)
1*3f982cf4SFabien Sanglard // Copyright 2019 The Chromium Authors. All rights reserved.
2*3f982cf4SFabien Sanglard // Use of this source code is governed by a BSD-style license that can be
3*3f982cf4SFabien Sanglard // found in the LICENSE file.
4*3f982cf4SFabien Sanglard 
5*3f982cf4SFabien Sanglard #include "util/trace_logging.h"
6*3f982cf4SFabien Sanglard 
7*3f982cf4SFabien Sanglard #include <chrono>
8*3f982cf4SFabien Sanglard #include <thread>
9*3f982cf4SFabien Sanglard 
10*3f982cf4SFabien Sanglard #include "absl/types/optional.h"
11*3f982cf4SFabien Sanglard #include "gmock/gmock.h"
12*3f982cf4SFabien Sanglard #include "gtest/gtest.h"
13*3f982cf4SFabien Sanglard #include "platform/test/trace_logging_helpers.h"
14*3f982cf4SFabien Sanglard 
15*3f982cf4SFabien Sanglard namespace openscreen {
16*3f982cf4SFabien Sanglard namespace {
17*3f982cf4SFabien Sanglard 
18*3f982cf4SFabien Sanglard #if defined(ENABLE_TRACE_LOGGING)
19*3f982cf4SFabien Sanglard constexpr TraceHierarchyParts kAllParts = static_cast<TraceHierarchyParts>(
20*3f982cf4SFabien Sanglard     TraceHierarchyParts::kRoot | TraceHierarchyParts::kParent |
21*3f982cf4SFabien Sanglard     TraceHierarchyParts::kCurrent);
22*3f982cf4SFabien Sanglard constexpr TraceHierarchyParts kParentAndRoot = static_cast<TraceHierarchyParts>(
23*3f982cf4SFabien Sanglard     TraceHierarchyParts::kRoot | TraceHierarchyParts::kParent);
24*3f982cf4SFabien Sanglard constexpr TraceId kEmptyId = TraceId{0};
25*3f982cf4SFabien Sanglard #endif
26*3f982cf4SFabien Sanglard 
27*3f982cf4SFabien Sanglard using ::testing::_;
28*3f982cf4SFabien Sanglard using ::testing::AtLeast;
29*3f982cf4SFabien Sanglard using ::testing::DoAll;
30*3f982cf4SFabien Sanglard using ::testing::Invoke;
31*3f982cf4SFabien Sanglard 
32*3f982cf4SFabien Sanglard // All the unit tests below should use TestTraceLoggingPlatform for the
33*3f982cf4SFabien Sanglard // library's tracing output mock. This is a StrictMock to ensure that, when not
34*3f982cf4SFabien Sanglard // compiling with ENABLE_TRACE_LOGGING, the mock receives no method calls.
35*3f982cf4SFabien Sanglard using StrictMockLoggingPlatform = ::testing::StrictMock<MockLoggingPlatform>;
36*3f982cf4SFabien Sanglard 
TEST(TraceLoggingTest,MacroCallScopedDoesNotSegFault)37*3f982cf4SFabien Sanglard TEST(TraceLoggingTest, MacroCallScopedDoesNotSegFault) {
38*3f982cf4SFabien Sanglard   StrictMockLoggingPlatform platform;
39*3f982cf4SFabien Sanglard #if defined(ENABLE_TRACE_LOGGING)
40*3f982cf4SFabien Sanglard   EXPECT_CALL(platform, IsTraceLoggingEnabled(TraceCategory::Value::kAny))
41*3f982cf4SFabien Sanglard       .Times(AtLeast(1));
42*3f982cf4SFabien Sanglard   EXPECT_CALL(platform, LogTrace(_, _, _, _, _, _, _)).Times(1);
43*3f982cf4SFabien Sanglard #endif
44*3f982cf4SFabien Sanglard   { TRACE_SCOPED(TraceCategory::Value::kAny, "test"); }
45*3f982cf4SFabien Sanglard }
46*3f982cf4SFabien Sanglard 
TEST(TraceLoggingTest,MacroCallDefaultScopedDoesNotSegFault)47*3f982cf4SFabien Sanglard TEST(TraceLoggingTest, MacroCallDefaultScopedDoesNotSegFault) {
48*3f982cf4SFabien Sanglard   StrictMockLoggingPlatform platform;
49*3f982cf4SFabien Sanglard #if defined(ENABLE_TRACE_LOGGING)
50*3f982cf4SFabien Sanglard   EXPECT_CALL(platform, IsTraceLoggingEnabled(TraceCategory::Value::kAny))
51*3f982cf4SFabien Sanglard       .Times(AtLeast(1));
52*3f982cf4SFabien Sanglard   EXPECT_CALL(platform, LogTrace(_, _, _, _, _, _, _)).Times(1);
53*3f982cf4SFabien Sanglard #endif
54*3f982cf4SFabien Sanglard   { TRACE_DEFAULT_SCOPED(TraceCategory::Value::kAny); }
55*3f982cf4SFabien Sanglard }
56*3f982cf4SFabien Sanglard 
TEST(TraceLoggingTest,MacroCallUnscopedDoesNotSegFault)57*3f982cf4SFabien Sanglard TEST(TraceLoggingTest, MacroCallUnscopedDoesNotSegFault) {
58*3f982cf4SFabien Sanglard   StrictMockLoggingPlatform platform;
59*3f982cf4SFabien Sanglard #if defined(ENABLE_TRACE_LOGGING)
60*3f982cf4SFabien Sanglard   EXPECT_CALL(platform, IsTraceLoggingEnabled(TraceCategory::Value::kAny))
61*3f982cf4SFabien Sanglard       .Times(AtLeast(1));
62*3f982cf4SFabien Sanglard   EXPECT_CALL(platform, LogAsyncStart(_, _, _, _, _)).Times(1);
63*3f982cf4SFabien Sanglard #endif
64*3f982cf4SFabien Sanglard   { TRACE_ASYNC_START(TraceCategory::Value::kAny, "test"); }
65*3f982cf4SFabien Sanglard }
66*3f982cf4SFabien Sanglard 
TEST(TraceLoggingTest,MacroVariablesUniquelyNames)67*3f982cf4SFabien Sanglard TEST(TraceLoggingTest, MacroVariablesUniquelyNames) {
68*3f982cf4SFabien Sanglard   StrictMockLoggingPlatform platform;
69*3f982cf4SFabien Sanglard #if defined(ENABLE_TRACE_LOGGING)
70*3f982cf4SFabien Sanglard   EXPECT_CALL(platform, IsTraceLoggingEnabled(TraceCategory::Value::kAny))
71*3f982cf4SFabien Sanglard       .Times(AtLeast(1));
72*3f982cf4SFabien Sanglard   EXPECT_CALL(platform, LogTrace(_, _, _, _, _, _, _)).Times(3);
73*3f982cf4SFabien Sanglard   EXPECT_CALL(platform, LogAsyncStart(_, _, _, _, _)).Times(2);
74*3f982cf4SFabien Sanglard #endif
75*3f982cf4SFabien Sanglard 
76*3f982cf4SFabien Sanglard   {
77*3f982cf4SFabien Sanglard     TRACE_SCOPED(TraceCategory::Value::kAny, "test1");
78*3f982cf4SFabien Sanglard     TRACE_SCOPED(TraceCategory::Value::kAny, "test2");
79*3f982cf4SFabien Sanglard     TRACE_ASYNC_START(TraceCategory::Value::kAny, "test3");
80*3f982cf4SFabien Sanglard     TRACE_ASYNC_START(TraceCategory::Value::kAny, "test4");
81*3f982cf4SFabien Sanglard     TRACE_DEFAULT_SCOPED(TraceCategory::Value::kAny);
82*3f982cf4SFabien Sanglard   }
83*3f982cf4SFabien Sanglard }
84*3f982cf4SFabien Sanglard 
TEST(TraceLoggingTest,ExpectTimestampsReflectDelay)85*3f982cf4SFabien Sanglard TEST(TraceLoggingTest, ExpectTimestampsReflectDelay) {
86*3f982cf4SFabien Sanglard   constexpr uint32_t delay_in_ms = 50;
87*3f982cf4SFabien Sanglard   StrictMockLoggingPlatform platform;
88*3f982cf4SFabien Sanglard #if defined(ENABLE_TRACE_LOGGING)
89*3f982cf4SFabien Sanglard   EXPECT_CALL(platform, IsTraceLoggingEnabled(TraceCategory::Value::kAny))
90*3f982cf4SFabien Sanglard       .Times(AtLeast(1));
91*3f982cf4SFabien Sanglard   EXPECT_CALL(platform, LogTrace(_, _, _, _, _, _, _))
92*3f982cf4SFabien Sanglard       .WillOnce(DoAll(Invoke(ValidateTraceTimestampDiff<delay_in_ms>),
93*3f982cf4SFabien Sanglard                       Invoke(ValidateTraceErrorCode<Error::Code::kNone>)));
94*3f982cf4SFabien Sanglard #endif
95*3f982cf4SFabien Sanglard 
96*3f982cf4SFabien Sanglard   {
97*3f982cf4SFabien Sanglard     TRACE_SCOPED(TraceCategory::Value::kAny, "Name");
98*3f982cf4SFabien Sanglard     std::this_thread::sleep_for(std::chrono::milliseconds(delay_in_ms));
99*3f982cf4SFabien Sanglard   }
100*3f982cf4SFabien Sanglard }
101*3f982cf4SFabien Sanglard 
TEST(TraceLoggingTest,ExpectErrorsPassedToResult)102*3f982cf4SFabien Sanglard TEST(TraceLoggingTest, ExpectErrorsPassedToResult) {
103*3f982cf4SFabien Sanglard   constexpr Error::Code result_code = Error::Code::kParseError;
104*3f982cf4SFabien Sanglard   StrictMockLoggingPlatform platform;
105*3f982cf4SFabien Sanglard #if defined(ENABLE_TRACE_LOGGING)
106*3f982cf4SFabien Sanglard   EXPECT_CALL(platform, IsTraceLoggingEnabled(TraceCategory::Value::kAny))
107*3f982cf4SFabien Sanglard       .Times(AtLeast(1));
108*3f982cf4SFabien Sanglard   EXPECT_CALL(platform, LogTrace(_, _, _, _, _, _, _))
109*3f982cf4SFabien Sanglard       .WillOnce(Invoke(ValidateTraceErrorCode<result_code>));
110*3f982cf4SFabien Sanglard #endif
111*3f982cf4SFabien Sanglard 
112*3f982cf4SFabien Sanglard   {
113*3f982cf4SFabien Sanglard     TRACE_SCOPED(TraceCategory::Value::kAny, "Name");
114*3f982cf4SFabien Sanglard     TRACE_SET_RESULT(result_code);
115*3f982cf4SFabien Sanglard   }
116*3f982cf4SFabien Sanglard }
117*3f982cf4SFabien Sanglard 
TEST(TraceLoggingTest,ExpectUnsetTraceIdNotSet)118*3f982cf4SFabien Sanglard TEST(TraceLoggingTest, ExpectUnsetTraceIdNotSet) {
119*3f982cf4SFabien Sanglard   StrictMockLoggingPlatform platform;
120*3f982cf4SFabien Sanglard #if defined(ENABLE_TRACE_LOGGING)
121*3f982cf4SFabien Sanglard   EXPECT_CALL(platform, IsTraceLoggingEnabled(TraceCategory::Value::kAny))
122*3f982cf4SFabien Sanglard       .Times(AtLeast(1));
123*3f982cf4SFabien Sanglard   EXPECT_CALL(platform, LogTrace(_, _, _, _, _, _, _)).Times(1);
124*3f982cf4SFabien Sanglard #endif
125*3f982cf4SFabien Sanglard 
126*3f982cf4SFabien Sanglard   TraceIdHierarchy h = {kUnsetTraceId, kUnsetTraceId, kUnsetTraceId};
127*3f982cf4SFabien Sanglard   {
128*3f982cf4SFabien Sanglard     TRACE_SCOPED(TraceCategory::Value::kAny, "Name", h);
129*3f982cf4SFabien Sanglard 
130*3f982cf4SFabien Sanglard     auto ids = TRACE_HIERARCHY;
131*3f982cf4SFabien Sanglard     EXPECT_NE(ids.current, kUnsetTraceId);
132*3f982cf4SFabien Sanglard     EXPECT_NE(ids.parent, kUnsetTraceId);
133*3f982cf4SFabien Sanglard     EXPECT_NE(ids.root, kUnsetTraceId);
134*3f982cf4SFabien Sanglard   }
135*3f982cf4SFabien Sanglard }
136*3f982cf4SFabien Sanglard 
TEST(TraceLoggingTest,ExpectCreationWithIdsToWork)137*3f982cf4SFabien Sanglard TEST(TraceLoggingTest, ExpectCreationWithIdsToWork) {
138*3f982cf4SFabien Sanglard   constexpr TraceId current = 0x32;
139*3f982cf4SFabien Sanglard   constexpr TraceId parent = 0x47;
140*3f982cf4SFabien Sanglard   constexpr TraceId root = 0x84;
141*3f982cf4SFabien Sanglard   StrictMockLoggingPlatform platform;
142*3f982cf4SFabien Sanglard #if defined(ENABLE_TRACE_LOGGING)
143*3f982cf4SFabien Sanglard   EXPECT_CALL(platform, IsTraceLoggingEnabled(TraceCategory::Value::kAny))
144*3f982cf4SFabien Sanglard       .Times(AtLeast(1));
145*3f982cf4SFabien Sanglard   EXPECT_CALL(platform, LogTrace(_, _, _, _, _, _, _))
146*3f982cf4SFabien Sanglard       .WillOnce(
147*3f982cf4SFabien Sanglard           DoAll(Invoke(ValidateTraceErrorCode<Error::Code::kNone>),
148*3f982cf4SFabien Sanglard                 Invoke(ValidateTraceIdHierarchyOnSyncTrace<current, parent,
149*3f982cf4SFabien Sanglard                                                            root, kAllParts>)));
150*3f982cf4SFabien Sanglard #endif
151*3f982cf4SFabien Sanglard 
152*3f982cf4SFabien Sanglard   {
153*3f982cf4SFabien Sanglard     TraceIdHierarchy h = {current, parent, root};
154*3f982cf4SFabien Sanglard     TRACE_SCOPED(TraceCategory::Value::kAny, "Name", h);
155*3f982cf4SFabien Sanglard 
156*3f982cf4SFabien Sanglard #if defined(ENABLE_TRACE_LOGGING)
157*3f982cf4SFabien Sanglard     auto ids = TRACE_HIERARCHY;
158*3f982cf4SFabien Sanglard     EXPECT_EQ(ids.current, current);
159*3f982cf4SFabien Sanglard     EXPECT_EQ(ids.parent, parent);
160*3f982cf4SFabien Sanglard     EXPECT_EQ(ids.root, root);
161*3f982cf4SFabien Sanglard 
162*3f982cf4SFabien Sanglard     EXPECT_EQ(TRACE_CURRENT_ID, current);
163*3f982cf4SFabien Sanglard     EXPECT_EQ(TRACE_ROOT_ID, root);
164*3f982cf4SFabien Sanglard #endif
165*3f982cf4SFabien Sanglard   }
166*3f982cf4SFabien Sanglard }
167*3f982cf4SFabien Sanglard 
TEST(TraceLoggingTest,ExpectHirearchyToBeApplied)168*3f982cf4SFabien Sanglard TEST(TraceLoggingTest, ExpectHirearchyToBeApplied) {
169*3f982cf4SFabien Sanglard   constexpr TraceId current = 0x32;
170*3f982cf4SFabien Sanglard   constexpr TraceId parent = 0x47;
171*3f982cf4SFabien Sanglard   constexpr TraceId root = 0x84;
172*3f982cf4SFabien Sanglard   StrictMockLoggingPlatform platform;
173*3f982cf4SFabien Sanglard #if defined(ENABLE_TRACE_LOGGING)
174*3f982cf4SFabien Sanglard   EXPECT_CALL(platform, IsTraceLoggingEnabled(TraceCategory::Value::kAny))
175*3f982cf4SFabien Sanglard       .Times(AtLeast(1));
176*3f982cf4SFabien Sanglard   EXPECT_CALL(platform, LogTrace(_, _, _, _, _, _, _))
177*3f982cf4SFabien Sanglard       .WillOnce(DoAll(
178*3f982cf4SFabien Sanglard           Invoke(ValidateTraceErrorCode<Error::Code::kNone>),
179*3f982cf4SFabien Sanglard           Invoke(ValidateTraceIdHierarchyOnSyncTrace<kEmptyId, current, root,
180*3f982cf4SFabien Sanglard                                                      kParentAndRoot>)))
181*3f982cf4SFabien Sanglard       .WillOnce(
182*3f982cf4SFabien Sanglard           DoAll(Invoke(ValidateTraceErrorCode<Error::Code::kNone>),
183*3f982cf4SFabien Sanglard                 Invoke(ValidateTraceIdHierarchyOnSyncTrace<current, parent,
184*3f982cf4SFabien Sanglard                                                            root, kAllParts>)));
185*3f982cf4SFabien Sanglard #endif
186*3f982cf4SFabien Sanglard 
187*3f982cf4SFabien Sanglard   {
188*3f982cf4SFabien Sanglard     TraceIdHierarchy h = {current, parent, root};
189*3f982cf4SFabien Sanglard     TRACE_SCOPED(TraceCategory::Value::kAny, "Name", h);
190*3f982cf4SFabien Sanglard #if defined(ENABLE_TRACE_LOGGING)
191*3f982cf4SFabien Sanglard     auto ids = TRACE_HIERARCHY;
192*3f982cf4SFabien Sanglard     EXPECT_EQ(ids.current, current);
193*3f982cf4SFabien Sanglard     EXPECT_EQ(ids.parent, parent);
194*3f982cf4SFabien Sanglard     EXPECT_EQ(ids.root, root);
195*3f982cf4SFabien Sanglard #endif
196*3f982cf4SFabien Sanglard 
197*3f982cf4SFabien Sanglard     TRACE_SCOPED(TraceCategory::Value::kAny, "Name");
198*3f982cf4SFabien Sanglard #if defined(ENABLE_TRACE_LOGGING)
199*3f982cf4SFabien Sanglard     ids = TRACE_HIERARCHY;
200*3f982cf4SFabien Sanglard     EXPECT_NE(ids.current, current);
201*3f982cf4SFabien Sanglard     EXPECT_EQ(ids.parent, current);
202*3f982cf4SFabien Sanglard     EXPECT_EQ(ids.root, root);
203*3f982cf4SFabien Sanglard #endif
204*3f982cf4SFabien Sanglard   }
205*3f982cf4SFabien Sanglard }
206*3f982cf4SFabien Sanglard 
TEST(TraceLoggingTest,ExpectHirearchyToEndAfterScopeWhenSetWithSetter)207*3f982cf4SFabien Sanglard TEST(TraceLoggingTest, ExpectHirearchyToEndAfterScopeWhenSetWithSetter) {
208*3f982cf4SFabien Sanglard   constexpr TraceId current = 0x32;
209*3f982cf4SFabien Sanglard   constexpr TraceId parent = 0x47;
210*3f982cf4SFabien Sanglard   constexpr TraceId root = 0x84;
211*3f982cf4SFabien Sanglard   StrictMockLoggingPlatform platform;
212*3f982cf4SFabien Sanglard #if defined(ENABLE_TRACE_LOGGING)
213*3f982cf4SFabien Sanglard   EXPECT_CALL(platform, IsTraceLoggingEnabled(TraceCategory::Value::kAny))
214*3f982cf4SFabien Sanglard       .Times(AtLeast(1));
215*3f982cf4SFabien Sanglard   EXPECT_CALL(platform, LogTrace(_, _, _, _, _, _, _))
216*3f982cf4SFabien Sanglard       .WillOnce(DoAll(
217*3f982cf4SFabien Sanglard           Invoke(ValidateTraceErrorCode<Error::Code::kNone>),
218*3f982cf4SFabien Sanglard           Invoke(ValidateTraceIdHierarchyOnSyncTrace<kEmptyId, current, root,
219*3f982cf4SFabien Sanglard                                                      kParentAndRoot>)));
220*3f982cf4SFabien Sanglard #endif
221*3f982cf4SFabien Sanglard 
222*3f982cf4SFabien Sanglard   {
223*3f982cf4SFabien Sanglard     TraceIdHierarchy ids = {current, parent, root};
224*3f982cf4SFabien Sanglard     TRACE_SET_HIERARCHY(ids);
225*3f982cf4SFabien Sanglard     {
226*3f982cf4SFabien Sanglard       TRACE_SCOPED(TraceCategory::Value::kAny, "Name");
227*3f982cf4SFabien Sanglard       ids = TRACE_HIERARCHY;
228*3f982cf4SFabien Sanglard #if defined(ENABLE_TRACE_LOGGING)
229*3f982cf4SFabien Sanglard       EXPECT_NE(ids.current, current);
230*3f982cf4SFabien Sanglard       EXPECT_EQ(ids.parent, current);
231*3f982cf4SFabien Sanglard       EXPECT_EQ(ids.root, root);
232*3f982cf4SFabien Sanglard #endif
233*3f982cf4SFabien Sanglard     }
234*3f982cf4SFabien Sanglard 
235*3f982cf4SFabien Sanglard     ids = TRACE_HIERARCHY;
236*3f982cf4SFabien Sanglard #if defined(ENABLE_TRACE_LOGGING)
237*3f982cf4SFabien Sanglard     EXPECT_EQ(ids.current, current);
238*3f982cf4SFabien Sanglard     EXPECT_EQ(ids.parent, parent);
239*3f982cf4SFabien Sanglard     EXPECT_EQ(ids.root, root);
240*3f982cf4SFabien Sanglard #endif
241*3f982cf4SFabien Sanglard   }
242*3f982cf4SFabien Sanglard }
243*3f982cf4SFabien Sanglard 
TEST(TraceLoggingTest,ExpectHierarchyToEndAfterScope)244*3f982cf4SFabien Sanglard TEST(TraceLoggingTest, ExpectHierarchyToEndAfterScope) {
245*3f982cf4SFabien Sanglard   constexpr TraceId current = 0x32;
246*3f982cf4SFabien Sanglard   constexpr TraceId parent = 0x47;
247*3f982cf4SFabien Sanglard   constexpr TraceId root = 0x84;
248*3f982cf4SFabien Sanglard   StrictMockLoggingPlatform platform;
249*3f982cf4SFabien Sanglard #if defined(ENABLE_TRACE_LOGGING)
250*3f982cf4SFabien Sanglard   EXPECT_CALL(platform, IsTraceLoggingEnabled(TraceCategory::Value::kAny))
251*3f982cf4SFabien Sanglard       .Times(AtLeast(1));
252*3f982cf4SFabien Sanglard   EXPECT_CALL(platform, LogTrace(_, _, _, _, _, _, _))
253*3f982cf4SFabien Sanglard       .WillOnce(DoAll(
254*3f982cf4SFabien Sanglard           Invoke(ValidateTraceErrorCode<Error::Code::kNone>),
255*3f982cf4SFabien Sanglard           Invoke(ValidateTraceIdHierarchyOnSyncTrace<kEmptyId, current, root,
256*3f982cf4SFabien Sanglard                                                      kParentAndRoot>)))
257*3f982cf4SFabien Sanglard       .WillOnce(
258*3f982cf4SFabien Sanglard           DoAll(Invoke(ValidateTraceErrorCode<Error::Code::kNone>),
259*3f982cf4SFabien Sanglard                 Invoke(ValidateTraceIdHierarchyOnSyncTrace<current, parent,
260*3f982cf4SFabien Sanglard                                                            root, kAllParts>)));
261*3f982cf4SFabien Sanglard #endif
262*3f982cf4SFabien Sanglard 
263*3f982cf4SFabien Sanglard   {
264*3f982cf4SFabien Sanglard     TraceIdHierarchy ids = {current, parent, root};
265*3f982cf4SFabien Sanglard     TRACE_SCOPED(TraceCategory::Value::kAny, "Name", ids);
266*3f982cf4SFabien Sanglard     {
267*3f982cf4SFabien Sanglard       TRACE_SCOPED(TraceCategory::Value::kAny, "Name");
268*3f982cf4SFabien Sanglard       ids = TRACE_HIERARCHY;
269*3f982cf4SFabien Sanglard #if defined(ENABLE_TRACE_LOGGING)
270*3f982cf4SFabien Sanglard       EXPECT_NE(ids.current, current);
271*3f982cf4SFabien Sanglard       EXPECT_EQ(ids.parent, current);
272*3f982cf4SFabien Sanglard       EXPECT_EQ(ids.root, root);
273*3f982cf4SFabien Sanglard #endif
274*3f982cf4SFabien Sanglard     }
275*3f982cf4SFabien Sanglard 
276*3f982cf4SFabien Sanglard     ids = TRACE_HIERARCHY;
277*3f982cf4SFabien Sanglard #if defined(ENABLE_TRACE_LOGGING)
278*3f982cf4SFabien Sanglard     EXPECT_EQ(ids.current, current);
279*3f982cf4SFabien Sanglard     EXPECT_EQ(ids.parent, parent);
280*3f982cf4SFabien Sanglard     EXPECT_EQ(ids.root, root);
281*3f982cf4SFabien Sanglard #endif
282*3f982cf4SFabien Sanglard   }
283*3f982cf4SFabien Sanglard }
284*3f982cf4SFabien Sanglard 
TEST(TraceLoggingTest,ExpectSetHierarchyToApply)285*3f982cf4SFabien Sanglard TEST(TraceLoggingTest, ExpectSetHierarchyToApply) {
286*3f982cf4SFabien Sanglard   constexpr TraceId current = 0x32;
287*3f982cf4SFabien Sanglard   constexpr TraceId parent = 0x47;
288*3f982cf4SFabien Sanglard   constexpr TraceId root = 0x84;
289*3f982cf4SFabien Sanglard   StrictMockLoggingPlatform platform;
290*3f982cf4SFabien Sanglard #if defined(ENABLE_TRACE_LOGGING)
291*3f982cf4SFabien Sanglard   EXPECT_CALL(platform, IsTraceLoggingEnabled(TraceCategory::Value::kAny))
292*3f982cf4SFabien Sanglard       .Times(AtLeast(1));
293*3f982cf4SFabien Sanglard   EXPECT_CALL(platform, LogTrace(_, _, _, _, _, _, _))
294*3f982cf4SFabien Sanglard       .WillOnce(DoAll(
295*3f982cf4SFabien Sanglard           Invoke(ValidateTraceErrorCode<Error::Code::kNone>),
296*3f982cf4SFabien Sanglard           Invoke(ValidateTraceIdHierarchyOnSyncTrace<kEmptyId, current, root,
297*3f982cf4SFabien Sanglard                                                      kParentAndRoot>)));
298*3f982cf4SFabien Sanglard #endif
299*3f982cf4SFabien Sanglard 
300*3f982cf4SFabien Sanglard   {
301*3f982cf4SFabien Sanglard     TraceIdHierarchy ids = {current, parent, root};
302*3f982cf4SFabien Sanglard     TRACE_SET_HIERARCHY(ids);
303*3f982cf4SFabien Sanglard     ids = TRACE_HIERARCHY;
304*3f982cf4SFabien Sanglard #if defined(ENABLE_TRACE_LOGGING)
305*3f982cf4SFabien Sanglard     EXPECT_EQ(ids.current, current);
306*3f982cf4SFabien Sanglard     EXPECT_EQ(ids.parent, parent);
307*3f982cf4SFabien Sanglard     EXPECT_EQ(ids.root, root);
308*3f982cf4SFabien Sanglard #endif
309*3f982cf4SFabien Sanglard 
310*3f982cf4SFabien Sanglard     TRACE_SCOPED(TraceCategory::Value::kAny, "Name");
311*3f982cf4SFabien Sanglard     ids = TRACE_HIERARCHY;
312*3f982cf4SFabien Sanglard #if defined(ENABLE_TRACE_LOGGING)
313*3f982cf4SFabien Sanglard     EXPECT_NE(ids.current, current);
314*3f982cf4SFabien Sanglard     EXPECT_EQ(ids.parent, current);
315*3f982cf4SFabien Sanglard     EXPECT_EQ(ids.root, root);
316*3f982cf4SFabien Sanglard #endif
317*3f982cf4SFabien Sanglard   }
318*3f982cf4SFabien Sanglard }
319*3f982cf4SFabien Sanglard 
TEST(TraceLoggingTest,CheckTraceAsyncStartLogsCorrectly)320*3f982cf4SFabien Sanglard TEST(TraceLoggingTest, CheckTraceAsyncStartLogsCorrectly) {
321*3f982cf4SFabien Sanglard   StrictMockLoggingPlatform platform;
322*3f982cf4SFabien Sanglard #if defined(ENABLE_TRACE_LOGGING)
323*3f982cf4SFabien Sanglard   EXPECT_CALL(platform, IsTraceLoggingEnabled(TraceCategory::Value::kAny))
324*3f982cf4SFabien Sanglard       .Times(AtLeast(1));
325*3f982cf4SFabien Sanglard   EXPECT_CALL(platform, LogAsyncStart(_, _, _, _, _)).Times(1);
326*3f982cf4SFabien Sanglard #endif
327*3f982cf4SFabien Sanglard 
328*3f982cf4SFabien Sanglard   { TRACE_ASYNC_START(TraceCategory::Value::kAny, "Name"); }
329*3f982cf4SFabien Sanglard }
330*3f982cf4SFabien Sanglard 
TEST(TraceLoggingTest,CheckTraceAsyncStartSetsHierarchy)331*3f982cf4SFabien Sanglard TEST(TraceLoggingTest, CheckTraceAsyncStartSetsHierarchy) {
332*3f982cf4SFabien Sanglard   constexpr TraceId current = 32;
333*3f982cf4SFabien Sanglard   constexpr TraceId parent = 47;
334*3f982cf4SFabien Sanglard   constexpr TraceId root = 84;
335*3f982cf4SFabien Sanglard   StrictMockLoggingPlatform platform;
336*3f982cf4SFabien Sanglard #if defined(ENABLE_TRACE_LOGGING)
337*3f982cf4SFabien Sanglard   EXPECT_CALL(platform, IsTraceLoggingEnabled(TraceCategory::Value::kAny))
338*3f982cf4SFabien Sanglard       .Times(AtLeast(1));
339*3f982cf4SFabien Sanglard   EXPECT_CALL(platform, LogAsyncStart(_, _, _, _, _))
340*3f982cf4SFabien Sanglard       .WillOnce(
341*3f982cf4SFabien Sanglard           Invoke(ValidateTraceIdHierarchyOnAsyncTrace<kEmptyId, current, root,
342*3f982cf4SFabien Sanglard                                                       kParentAndRoot>));
343*3f982cf4SFabien Sanglard #endif
344*3f982cf4SFabien Sanglard 
345*3f982cf4SFabien Sanglard   {
346*3f982cf4SFabien Sanglard     TraceIdHierarchy ids = {current, parent, root};
347*3f982cf4SFabien Sanglard     TRACE_SET_HIERARCHY(ids);
348*3f982cf4SFabien Sanglard     {
349*3f982cf4SFabien Sanglard       TRACE_ASYNC_START(TraceCategory::Value::kAny, "Name");
350*3f982cf4SFabien Sanglard       ids = TRACE_HIERARCHY;
351*3f982cf4SFabien Sanglard #if defined(ENABLE_TRACE_LOGGING)
352*3f982cf4SFabien Sanglard       EXPECT_NE(ids.current, current);
353*3f982cf4SFabien Sanglard       EXPECT_EQ(ids.parent, current);
354*3f982cf4SFabien Sanglard       EXPECT_EQ(ids.root, root);
355*3f982cf4SFabien Sanglard #endif
356*3f982cf4SFabien Sanglard     }
357*3f982cf4SFabien Sanglard 
358*3f982cf4SFabien Sanglard     ids = TRACE_HIERARCHY;
359*3f982cf4SFabien Sanglard #if defined(ENABLE_TRACE_LOGGING)
360*3f982cf4SFabien Sanglard     EXPECT_EQ(ids.current, current);
361*3f982cf4SFabien Sanglard     EXPECT_EQ(ids.parent, parent);
362*3f982cf4SFabien Sanglard     EXPECT_EQ(ids.root, root);
363*3f982cf4SFabien Sanglard #endif
364*3f982cf4SFabien Sanglard   }
365*3f982cf4SFabien Sanglard }
366*3f982cf4SFabien Sanglard 
TEST(TraceLoggingTest,CheckTraceAsyncEndLogsCorrectly)367*3f982cf4SFabien Sanglard TEST(TraceLoggingTest, CheckTraceAsyncEndLogsCorrectly) {
368*3f982cf4SFabien Sanglard   constexpr TraceId id = 12345;
369*3f982cf4SFabien Sanglard   constexpr Error::Code result = Error::Code::kAgain;
370*3f982cf4SFabien Sanglard   StrictMockLoggingPlatform platform;
371*3f982cf4SFabien Sanglard #if defined(ENABLE_TRACE_LOGGING)
372*3f982cf4SFabien Sanglard   EXPECT_CALL(platform, IsTraceLoggingEnabled(TraceCategory::Value::kAny))
373*3f982cf4SFabien Sanglard       .Times(AtLeast(1));
374*3f982cf4SFabien Sanglard   EXPECT_CALL(platform, LogAsyncEnd(_, _, _, id, result)).Times(1);
375*3f982cf4SFabien Sanglard #endif
376*3f982cf4SFabien Sanglard 
377*3f982cf4SFabien Sanglard   TRACE_ASYNC_END(TraceCategory::Value::kAny, id, result);
378*3f982cf4SFabien Sanglard }
379*3f982cf4SFabien Sanglard 
380*3f982cf4SFabien Sanglard }  // namespace
381*3f982cf4SFabien Sanglard }  // namespace openscreen
382