1*14675a02SAndroid Build Coastguard Worker // Copyright 2019 Google LLC
2*14675a02SAndroid Build Coastguard Worker //
3*14675a02SAndroid Build Coastguard Worker // Licensed under the Apache License, Version 2.0 (the "License");
4*14675a02SAndroid Build Coastguard Worker // you may not use this file except in compliance with the License.
5*14675a02SAndroid Build Coastguard Worker // You may obtain a copy of the License at
6*14675a02SAndroid Build Coastguard Worker //
7*14675a02SAndroid Build Coastguard Worker // http://www.apache.org/licenses/LICENSE-2.0
8*14675a02SAndroid Build Coastguard Worker //
9*14675a02SAndroid Build Coastguard Worker // Unless required by applicable law or agreed to in writing, software
10*14675a02SAndroid Build Coastguard Worker // distributed under the License is distributed on an "AS IS" BASIS,
11*14675a02SAndroid Build Coastguard Worker // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12*14675a02SAndroid Build Coastguard Worker // See the License for the specific language governing permissions and
13*14675a02SAndroid Build Coastguard Worker // limitations under the License.
14*14675a02SAndroid Build Coastguard Worker
15*14675a02SAndroid Build Coastguard Worker #include <memory>
16*14675a02SAndroid Build Coastguard Worker #include <string>
17*14675a02SAndroid Build Coastguard Worker #include <thread> // NOLINT(build/c++11)
18*14675a02SAndroid Build Coastguard Worker
19*14675a02SAndroid Build Coastguard Worker #include "gtest/gtest.h"
20*14675a02SAndroid Build Coastguard Worker #include "fcp/tracing/test/tracing_schema.h"
21*14675a02SAndroid Build Coastguard Worker #include "fcp/tracing/test_tracing_recorder.h"
22*14675a02SAndroid Build Coastguard Worker #include "fcp/tracing/tracing_severity.h"
23*14675a02SAndroid Build Coastguard Worker #include "flatbuffers/flatbuffers.h"
24*14675a02SAndroid Build Coastguard Worker
25*14675a02SAndroid Build Coastguard Worker namespace fcp {
26*14675a02SAndroid Build Coastguard Worker namespace {
27*14675a02SAndroid Build Coastguard Worker
28*14675a02SAndroid Build Coastguard Worker using flatbuffers::FlatBufferBuilder;
29*14675a02SAndroid Build Coastguard Worker using flatbuffers::GetRoot;
30*14675a02SAndroid Build Coastguard Worker using testing::_;
31*14675a02SAndroid Build Coastguard Worker using testing::ElementsAre;
32*14675a02SAndroid Build Coastguard Worker using testing::Eq;
33*14675a02SAndroid Build Coastguard Worker using testing::Gt;
34*14675a02SAndroid Build Coastguard Worker using testing::Not;
35*14675a02SAndroid Build Coastguard Worker using testing::SizeIs;
36*14675a02SAndroid Build Coastguard Worker using testing::UnorderedElementsAre;
37*14675a02SAndroid Build Coastguard Worker
TEST(Tracing,TraitsTag)38*14675a02SAndroid Build Coastguard Worker TEST(Tracing, TraitsTag) {
39*14675a02SAndroid Build Coastguard Worker EXPECT_EQ(TracingTraits<SpanWithId>::kTag.str(), "SWID");
40*14675a02SAndroid Build Coastguard Worker EXPECT_EQ(TracingTraits<EventBar>::kTag.str(), "EBAR");
41*14675a02SAndroid Build Coastguard Worker }
42*14675a02SAndroid Build Coastguard Worker
TEST(Tracing,TracingSeverity)43*14675a02SAndroid Build Coastguard Worker TEST(Tracing, TracingSeverity) {
44*14675a02SAndroid Build Coastguard Worker EXPECT_EQ(TracingTraits<SpanWithId>::kSeverity, fcp::TracingSeverity::kInfo);
45*14675a02SAndroid Build Coastguard Worker EXPECT_EQ(TracingTraits<ErrorEvent>::kSeverity, fcp::TracingSeverity::kError);
46*14675a02SAndroid Build Coastguard Worker EXPECT_EQ(TracingTraits<EventWithNoData>::kSeverity,
47*14675a02SAndroid Build Coastguard Worker fcp::TracingSeverity::kWarning);
48*14675a02SAndroid Build Coastguard Worker }
49*14675a02SAndroid Build Coastguard Worker
TEST(Tracing,TraitsCreate)50*14675a02SAndroid Build Coastguard Worker TEST(Tracing, TraitsCreate) {
51*14675a02SAndroid Build Coastguard Worker FlatBufferBuilder fbb_foo;
52*14675a02SAndroid Build Coastguard Worker fbb_foo.Finish(TracingTraits<EventFoo>::Create(222, 333, &fbb_foo));
53*14675a02SAndroid Build Coastguard Worker auto foo = GetRoot<EventFoo>(fbb_foo.GetBufferPointer());
54*14675a02SAndroid Build Coastguard Worker EXPECT_EQ(foo->first(), 222);
55*14675a02SAndroid Build Coastguard Worker EXPECT_EQ(foo->second(), 333);
56*14675a02SAndroid Build Coastguard Worker
57*14675a02SAndroid Build Coastguard Worker // Creating a flat buffer involving a string field has different codegen
58*14675a02SAndroid Build Coastguard Worker // path, testing this as well:
59*14675a02SAndroid Build Coastguard Worker FlatBufferBuilder fbb_bar;
60*14675a02SAndroid Build Coastguard Worker fbb_bar.Finish(
61*14675a02SAndroid Build Coastguard Worker TracingTraits<EventBar>::Create(444, "Hello world!", &fbb_bar));
62*14675a02SAndroid Build Coastguard Worker auto bar = GetRoot<EventBar>(fbb_bar.GetBufferPointer());
63*14675a02SAndroid Build Coastguard Worker EXPECT_EQ(bar->first(), 444);
64*14675a02SAndroid Build Coastguard Worker EXPECT_EQ(bar->second()->str(), "Hello world!");
65*14675a02SAndroid Build Coastguard Worker
66*14675a02SAndroid Build Coastguard Worker // Also make sure that a flatbuf involving a string field can be created using
67*14675a02SAndroid Build Coastguard Worker // a std::string.
68*14675a02SAndroid Build Coastguard Worker FlatBufferBuilder fbb_baz;
69*14675a02SAndroid Build Coastguard Worker std::string hello_str = "Hello world!";
70*14675a02SAndroid Build Coastguard Worker fbb_baz.Finish(TracingTraits<EventBar>::Create(444, hello_str, &fbb_baz));
71*14675a02SAndroid Build Coastguard Worker auto baz = GetRoot<EventBar>(fbb_baz.GetBufferPointer());
72*14675a02SAndroid Build Coastguard Worker EXPECT_EQ(baz->first(), 444);
73*14675a02SAndroid Build Coastguard Worker EXPECT_EQ(baz->second()->str(), "Hello world!");
74*14675a02SAndroid Build Coastguard Worker }
75*14675a02SAndroid Build Coastguard Worker
TEST(Tracing,TraitsCreateFieldOrder)76*14675a02SAndroid Build Coastguard Worker TEST(Tracing, TraitsCreateFieldOrder) {
77*14675a02SAndroid Build Coastguard Worker int first_i = -333;
78*14675a02SAndroid Build Coastguard Worker int second_i = 444;
79*14675a02SAndroid Build Coastguard Worker FlatBufferBuilder fbb_foo;
80*14675a02SAndroid Build Coastguard Worker fbb_foo.Finish(
81*14675a02SAndroid Build Coastguard Worker TracingTraits<FieldOrder>::Create(first_i, second_i, "hello", &fbb_foo));
82*14675a02SAndroid Build Coastguard Worker auto foo = GetRoot<FieldOrder>(fbb_foo.GetBufferPointer());
83*14675a02SAndroid Build Coastguard Worker EXPECT_EQ(foo->fieldz(), first_i);
84*14675a02SAndroid Build Coastguard Worker EXPECT_EQ(foo->fieldy(), second_i);
85*14675a02SAndroid Build Coastguard Worker EXPECT_EQ(foo->fieldx()->str(), "hello");
86*14675a02SAndroid Build Coastguard Worker
87*14675a02SAndroid Build Coastguard Worker FlatBufferBuilder fbb_bar;
88*14675a02SAndroid Build Coastguard Worker fbb_bar.Finish(TracingTraits<OrderWithIds>::Create("hello", first_i, second_i,
89*14675a02SAndroid Build Coastguard Worker &fbb_bar));
90*14675a02SAndroid Build Coastguard Worker auto bar = GetRoot<OrderWithIds>(fbb_bar.GetBufferPointer());
91*14675a02SAndroid Build Coastguard Worker EXPECT_EQ(bar->fieldz(), first_i);
92*14675a02SAndroid Build Coastguard Worker EXPECT_EQ(bar->fieldy(), second_i);
93*14675a02SAndroid Build Coastguard Worker EXPECT_EQ(bar->fieldx()->str(), "hello");
94*14675a02SAndroid Build Coastguard Worker }
95*14675a02SAndroid Build Coastguard Worker
TEST(Tracing,TraitsCreateAllTypes)96*14675a02SAndroid Build Coastguard Worker TEST(Tracing, TraitsCreateAllTypes) {
97*14675a02SAndroid Build Coastguard Worker FlatBufferBuilder fbb;
98*14675a02SAndroid Build Coastguard Worker std::int8_t byte = -1;
99*14675a02SAndroid Build Coastguard Worker std::uint8_t ubyte = 1;
100*14675a02SAndroid Build Coastguard Worker std::int16_t short_i = -256;
101*14675a02SAndroid Build Coastguard Worker std::uint16_t ushort_i = 256;
102*14675a02SAndroid Build Coastguard Worker int i = -333;
103*14675a02SAndroid Build Coastguard Worker unsigned int ui = 444;
104*14675a02SAndroid Build Coastguard Worker float f = 1.1;
105*14675a02SAndroid Build Coastguard Worker std::int64_t li = -4294967296;
106*14675a02SAndroid Build Coastguard Worker std::uint64_t uli = 4294967296;
107*14675a02SAndroid Build Coastguard Worker double d = 12312318.99999999;
108*14675a02SAndroid Build Coastguard Worker fbb.Finish(TracingTraits<AllTypes>::Create(byte, ubyte, true, short_i,
109*14675a02SAndroid Build Coastguard Worker ushort_i, i, ui, f, li, uli, d,
110*14675a02SAndroid Build Coastguard Worker "hello", &fbb));
111*14675a02SAndroid Build Coastguard Worker auto foo = GetRoot<AllTypes>(fbb.GetBufferPointer());
112*14675a02SAndroid Build Coastguard Worker EXPECT_EQ(foo->fieldz(), byte);
113*14675a02SAndroid Build Coastguard Worker EXPECT_EQ(foo->fieldy(), ubyte);
114*14675a02SAndroid Build Coastguard Worker EXPECT_EQ(foo->fieldx(), true);
115*14675a02SAndroid Build Coastguard Worker EXPECT_EQ(foo->fieldw(), short_i);
116*14675a02SAndroid Build Coastguard Worker EXPECT_EQ(foo->fieldv(), ushort_i);
117*14675a02SAndroid Build Coastguard Worker EXPECT_EQ(foo->fieldu(), i);
118*14675a02SAndroid Build Coastguard Worker EXPECT_EQ(foo->fieldt(), ui);
119*14675a02SAndroid Build Coastguard Worker EXPECT_EQ(foo->fields(), f);
120*14675a02SAndroid Build Coastguard Worker EXPECT_EQ(foo->fieldr(), li);
121*14675a02SAndroid Build Coastguard Worker EXPECT_EQ(foo->fieldq(), uli);
122*14675a02SAndroid Build Coastguard Worker EXPECT_EQ(foo->fieldp(), d);
123*14675a02SAndroid Build Coastguard Worker EXPECT_EQ(foo->fieldo()->str(), "hello");
124*14675a02SAndroid Build Coastguard Worker }
125*14675a02SAndroid Build Coastguard Worker
TEST(Tracing,TraitsCreateEnum)126*14675a02SAndroid Build Coastguard Worker TEST(Tracing, TraitsCreateEnum) {
127*14675a02SAndroid Build Coastguard Worker FlatBufferBuilder fbb;
128*14675a02SAndroid Build Coastguard Worker fbb.Finish(TracingTraits<ColorEnum>::Create(Color_Blue, &fbb));
129*14675a02SAndroid Build Coastguard Worker auto foo = GetRoot<ColorEnum>(fbb.GetBufferPointer());
130*14675a02SAndroid Build Coastguard Worker EXPECT_EQ(foo->color(), Color_Blue);
131*14675a02SAndroid Build Coastguard Worker }
132*14675a02SAndroid Build Coastguard Worker
TEST(Tracing,TraitsCreateDeprecatedField)133*14675a02SAndroid Build Coastguard Worker TEST(Tracing, TraitsCreateDeprecatedField) {
134*14675a02SAndroid Build Coastguard Worker FlatBufferBuilder fbb_foo;
135*14675a02SAndroid Build Coastguard Worker fbb_foo.Finish(TracingTraits<DeprecatedInt>::Create(222, &fbb_foo));
136*14675a02SAndroid Build Coastguard Worker auto foo = GetRoot<EventFoo>(fbb_foo.GetBufferPointer());
137*14675a02SAndroid Build Coastguard Worker EXPECT_EQ(foo->second(), 222);
138*14675a02SAndroid Build Coastguard Worker }
139*14675a02SAndroid Build Coastguard Worker
TEST(Tracing,LookupTraitByTag)140*14675a02SAndroid Build Coastguard Worker TEST(Tracing, LookupTraitByTag) {
141*14675a02SAndroid Build Coastguard Worker EXPECT_EQ(TracingTraitsBase::Lookup(TracingTag("SWID"))->Name(),
142*14675a02SAndroid Build Coastguard Worker "SpanWithId");
143*14675a02SAndroid Build Coastguard Worker EXPECT_EQ(TracingTraitsBase::Lookup(TracingTag("EBAR"))->Name(), "EventBar");
144*14675a02SAndroid Build Coastguard Worker }
145*14675a02SAndroid Build Coastguard Worker
TEST(Tracing,IntegrationTest)146*14675a02SAndroid Build Coastguard Worker TEST(Tracing, IntegrationTest) {
147*14675a02SAndroid Build Coastguard Worker TestTracingRecorder tracing_recorder;
148*14675a02SAndroid Build Coastguard Worker {
149*14675a02SAndroid Build Coastguard Worker TracingSpan<SpanWithId> inner(111);
150*14675a02SAndroid Build Coastguard Worker Trace<EventFoo>(222, 333);
151*14675a02SAndroid Build Coastguard Worker Trace<EventBar>(444, "Hello world!");
152*14675a02SAndroid Build Coastguard Worker Trace<EventFoo>(555, 666);
153*14675a02SAndroid Build Coastguard Worker }
154*14675a02SAndroid Build Coastguard Worker {
155*14675a02SAndroid Build Coastguard Worker TracingSpan<SpanWithNoData> inner;
156*14675a02SAndroid Build Coastguard Worker Trace<EventWithNoData>();
157*14675a02SAndroid Build Coastguard Worker }
158*14675a02SAndroid Build Coastguard Worker EXPECT_THAT(
159*14675a02SAndroid Build Coastguard Worker tracing_recorder.root(),
160*14675a02SAndroid Build Coastguard Worker ElementsAre(AllOf(IsSpan<SpanWithId>(),
161*14675a02SAndroid Build Coastguard Worker ElementsAre(IsEvent<EventFoo>(222, 333),
162*14675a02SAndroid Build Coastguard Worker IsEvent<EventBar>(444, "Hello world!"),
163*14675a02SAndroid Build Coastguard Worker IsEvent<EventFoo>(555, 666))),
164*14675a02SAndroid Build Coastguard Worker AllOf(IsSpan<SpanWithNoData>(),
165*14675a02SAndroid Build Coastguard Worker ElementsAre(IsEvent<EventWithNoData>()))))
166*14675a02SAndroid Build Coastguard Worker << "Tracing span/events structure and content must match";
167*14675a02SAndroid Build Coastguard Worker }
168*14675a02SAndroid Build Coastguard Worker
TEST(Tracing,UnscopedSpanIntegrationTest)169*14675a02SAndroid Build Coastguard Worker TEST(Tracing, UnscopedSpanIntegrationTest) {
170*14675a02SAndroid Build Coastguard Worker TestTracingRecorder tracing_recorder;
171*14675a02SAndroid Build Coastguard Worker auto outer = std::make_unique<UnscopedTracingSpan<SpanWithId>>(111);
172*14675a02SAndroid Build Coastguard Worker auto inner =
173*14675a02SAndroid Build Coastguard Worker std::make_unique<UnscopedTracingSpan<SpanWithId>>(outer->Ref(), 222);
174*14675a02SAndroid Build Coastguard Worker {
175*14675a02SAndroid Build Coastguard Worker TracingSpan<SpanWithNoData> child_of_inner(inner->Ref());
176*14675a02SAndroid Build Coastguard Worker Trace<EventFoo>(333, 444);
177*14675a02SAndroid Build Coastguard Worker }
178*14675a02SAndroid Build Coastguard Worker {
179*14675a02SAndroid Build Coastguard Worker TracingSpan<SpanWithNoData> another_child_of_inner(inner->Ref());
180*14675a02SAndroid Build Coastguard Worker Trace<EventFoo>(555, 666);
181*14675a02SAndroid Build Coastguard Worker Trace<EventBar>(inner->Ref(), 1, "Trace in unscoped span!");
182*14675a02SAndroid Build Coastguard Worker Trace<EventBar>(another_child_of_inner.Ref(), 1,
183*14675a02SAndroid Build Coastguard Worker "Trace in explicitly specified tracing span!");
184*14675a02SAndroid Build Coastguard Worker }
185*14675a02SAndroid Build Coastguard Worker TracingSpan<SpanWithNoData> unrelated_span;
186*14675a02SAndroid Build Coastguard Worker Trace<EventBar>(777, "Hello world!");
187*14675a02SAndroid Build Coastguard Worker
188*14675a02SAndroid Build Coastguard Worker EXPECT_THAT(
189*14675a02SAndroid Build Coastguard Worker tracing_recorder.root(),
190*14675a02SAndroid Build Coastguard Worker ElementsAre(
191*14675a02SAndroid Build Coastguard Worker AllOf(IsSpan<SpanWithId>(111),
192*14675a02SAndroid Build Coastguard Worker ElementsAre(AllOf(
193*14675a02SAndroid Build Coastguard Worker IsSpan<SpanWithId>(222),
194*14675a02SAndroid Build Coastguard Worker ElementsAre(
195*14675a02SAndroid Build Coastguard Worker AllOf(IsSpan<SpanWithNoData>(),
196*14675a02SAndroid Build Coastguard Worker ElementsAre(IsEvent<EventFoo>(333, 444))),
197*14675a02SAndroid Build Coastguard Worker AllOf(IsSpan<SpanWithNoData>(),
198*14675a02SAndroid Build Coastguard Worker ElementsAre(IsEvent<EventFoo>(555, 666),
199*14675a02SAndroid Build Coastguard Worker IsEvent<EventBar>(
200*14675a02SAndroid Build Coastguard Worker 1,
201*14675a02SAndroid Build Coastguard Worker "Trace in explicitly specified "
202*14675a02SAndroid Build Coastguard Worker "tracing span!"))),
203*14675a02SAndroid Build Coastguard Worker IsEvent<EventBar>(1, "Trace in unscoped span!"))))),
204*14675a02SAndroid Build Coastguard Worker AllOf(IsSpan<SpanWithNoData>(),
205*14675a02SAndroid Build Coastguard Worker ElementsAre(IsEvent<EventBar>(777, "Hello world!")))))
206*14675a02SAndroid Build Coastguard Worker << "Tracing span/events structure and content must match";
207*14675a02SAndroid Build Coastguard Worker }
208*14675a02SAndroid Build Coastguard Worker
TEST(Tracing,ThreadingUnscopedIntegrationTest)209*14675a02SAndroid Build Coastguard Worker TEST(Tracing, ThreadingUnscopedIntegrationTest) {
210*14675a02SAndroid Build Coastguard Worker TestTracingRecorder tracing_recorder;
211*14675a02SAndroid Build Coastguard Worker auto outer = std::make_unique<UnscopedTracingSpan<SpanWithId>>(111);
212*14675a02SAndroid Build Coastguard Worker std::thread thread1([ref = outer->Ref()]() {
213*14675a02SAndroid Build Coastguard Worker TracingSpan<SpanWithNoData> child_of_outer(ref);
214*14675a02SAndroid Build Coastguard Worker Trace<EventFoo>(333, 444);
215*14675a02SAndroid Build Coastguard Worker });
216*14675a02SAndroid Build Coastguard Worker std::thread thread2([ref = outer->Ref()]() {
217*14675a02SAndroid Build Coastguard Worker TracingSpan<SpanWithNoData> another_child_of_outer(ref);
218*14675a02SAndroid Build Coastguard Worker Trace<EventFoo>(555, 666);
219*14675a02SAndroid Build Coastguard Worker Trace<EventBar>(ref, 1, "Trace in unscoped span!");
220*14675a02SAndroid Build Coastguard Worker Trace<EventBar>(another_child_of_outer.Ref(), 1, "Trace in local span!");
221*14675a02SAndroid Build Coastguard Worker });
222*14675a02SAndroid Build Coastguard Worker TracingSpan<SpanWithNoData> unrelated_span;
223*14675a02SAndroid Build Coastguard Worker Trace<EventBar>(777, "Hello world!");
224*14675a02SAndroid Build Coastguard Worker thread1.join();
225*14675a02SAndroid Build Coastguard Worker thread2.join();
226*14675a02SAndroid Build Coastguard Worker
227*14675a02SAndroid Build Coastguard Worker EXPECT_THAT(
228*14675a02SAndroid Build Coastguard Worker tracing_recorder.root(),
229*14675a02SAndroid Build Coastguard Worker ElementsAre(AllOf(IsSpan<SpanWithId>(111),
230*14675a02SAndroid Build Coastguard Worker UnorderedElementsAre(
231*14675a02SAndroid Build Coastguard Worker AllOf(IsSpan<SpanWithNoData>(),
232*14675a02SAndroid Build Coastguard Worker ElementsAre(IsEvent<EventFoo>(333, 444))),
233*14675a02SAndroid Build Coastguard Worker AllOf(IsSpan<SpanWithNoData>(),
234*14675a02SAndroid Build Coastguard Worker ElementsAre(IsEvent<EventFoo>(555, 666),
235*14675a02SAndroid Build Coastguard Worker IsEvent<EventBar>(
236*14675a02SAndroid Build Coastguard Worker 1, "Trace in local span!"))),
237*14675a02SAndroid Build Coastguard Worker IsEvent<EventBar>(1, "Trace in unscoped span!"))),
238*14675a02SAndroid Build Coastguard Worker AllOf(IsSpan<SpanWithNoData>(),
239*14675a02SAndroid Build Coastguard Worker ElementsAre(IsEvent<EventBar>(777, "Hello world!")))))
240*14675a02SAndroid Build Coastguard Worker << "Tracing span/events structure and content must match";
241*14675a02SAndroid Build Coastguard Worker }
242*14675a02SAndroid Build Coastguard Worker
TEST(Tracing,ThreadingScopedIntegrationTest)243*14675a02SAndroid Build Coastguard Worker TEST(Tracing, ThreadingScopedIntegrationTest) {
244*14675a02SAndroid Build Coastguard Worker TestTracingRecorder tracing_recorder;
245*14675a02SAndroid Build Coastguard Worker TracingSpan<SpanWithId> outer(111);
246*14675a02SAndroid Build Coastguard Worker std::thread thread1([ref = outer.Ref()]() {
247*14675a02SAndroid Build Coastguard Worker TracingSpan<SpanWithNoData> child_of_outer(ref);
248*14675a02SAndroid Build Coastguard Worker Trace<EventFoo>(333, 444);
249*14675a02SAndroid Build Coastguard Worker });
250*14675a02SAndroid Build Coastguard Worker std::thread thread2([ref = outer.Ref()]() {
251*14675a02SAndroid Build Coastguard Worker TracingSpan<SpanWithNoData> another_child_of_outer(ref);
252*14675a02SAndroid Build Coastguard Worker Trace<EventFoo>(555, 666);
253*14675a02SAndroid Build Coastguard Worker Trace<EventBar>(ref, 1, "Trace in unscoped span!");
254*14675a02SAndroid Build Coastguard Worker Trace<EventBar>(1, "Trace in local span!");
255*14675a02SAndroid Build Coastguard Worker });
256*14675a02SAndroid Build Coastguard Worker TracingSpan<SpanWithNoData> unrelated_span;
257*14675a02SAndroid Build Coastguard Worker Trace<EventBar>(777, "Hello world!");
258*14675a02SAndroid Build Coastguard Worker thread1.join();
259*14675a02SAndroid Build Coastguard Worker thread2.join();
260*14675a02SAndroid Build Coastguard Worker
261*14675a02SAndroid Build Coastguard Worker EXPECT_THAT(
262*14675a02SAndroid Build Coastguard Worker tracing_recorder.root(),
263*14675a02SAndroid Build Coastguard Worker ElementsAre(AllOf(
264*14675a02SAndroid Build Coastguard Worker IsSpan<SpanWithId>(111),
265*14675a02SAndroid Build Coastguard Worker UnorderedElementsAre(
266*14675a02SAndroid Build Coastguard Worker AllOf(IsSpan<SpanWithNoData>(),
267*14675a02SAndroid Build Coastguard Worker ElementsAre(IsEvent<EventFoo>(333, 444))),
268*14675a02SAndroid Build Coastguard Worker AllOf(IsSpan<SpanWithNoData>(),
269*14675a02SAndroid Build Coastguard Worker ElementsAre(IsEvent<EventFoo>(555, 666),
270*14675a02SAndroid Build Coastguard Worker IsEvent<EventBar>(1, "Trace in local span!"))),
271*14675a02SAndroid Build Coastguard Worker IsEvent<EventBar>(1, "Trace in unscoped span!"),
272*14675a02SAndroid Build Coastguard Worker AllOf(IsSpan<SpanWithNoData>(),
273*14675a02SAndroid Build Coastguard Worker ElementsAre(IsEvent<EventBar>(777, "Hello world!")))))))
274*14675a02SAndroid Build Coastguard Worker << "Tracing span/events structure and content must match";
275*14675a02SAndroid Build Coastguard Worker }
276*14675a02SAndroid Build Coastguard Worker
TEST(Tracing,AdvancedMatching)277*14675a02SAndroid Build Coastguard Worker TEST(Tracing, AdvancedMatching) {
278*14675a02SAndroid Build Coastguard Worker TestTracingRecorder tracing_recorder;
279*14675a02SAndroid Build Coastguard Worker {
280*14675a02SAndroid Build Coastguard Worker TracingSpan<SpanWithId> span(111);
281*14675a02SAndroid Build Coastguard Worker Trace<EventBar>(222, "Hello world!");
282*14675a02SAndroid Build Coastguard Worker }
283*14675a02SAndroid Build Coastguard Worker
284*14675a02SAndroid Build Coastguard Worker auto span = tracing_recorder.root()[0];
285*14675a02SAndroid Build Coastguard Worker auto event = span[0];
286*14675a02SAndroid Build Coastguard Worker EXPECT_THAT(span, IsSpan<SpanWithId>());
287*14675a02SAndroid Build Coastguard Worker EXPECT_THAT(event, IsEvent<EventBar>());
288*14675a02SAndroid Build Coastguard Worker EXPECT_THAT(span,
289*14675a02SAndroid Build Coastguard Worker AllOf(IsSpan<SpanWithId>(), ElementsAre(IsEvent<EventBar>())));
290*14675a02SAndroid Build Coastguard Worker EXPECT_THAT(span, IsSpan<SpanWithId>(_));
291*14675a02SAndroid Build Coastguard Worker EXPECT_THAT(span, IsSpan<SpanWithId>(Eq(111)));
292*14675a02SAndroid Build Coastguard Worker EXPECT_THAT(span, IsSpan<SpanWithId>(Gt(100)));
293*14675a02SAndroid Build Coastguard Worker EXPECT_THAT(event, IsEvent<EventBar>(Eq(222), Eq("Hello world!")));
294*14675a02SAndroid Build Coastguard Worker EXPECT_THAT(event, IsEvent<EventBar>(_, Eq("Hello world!")));
295*14675a02SAndroid Build Coastguard Worker EXPECT_THAT(event, IsEvent<EventBar>(_, _));
296*14675a02SAndroid Build Coastguard Worker EXPECT_THAT(event, IsEvent<EventBar>(Eq(222), _));
297*14675a02SAndroid Build Coastguard Worker EXPECT_THAT(event, IsEvent<EventBar>(Not(Eq(666)), _));
298*14675a02SAndroid Build Coastguard Worker EXPECT_THAT(event, Not(IsEvent<EventBar>(Eq(666), _)));
299*14675a02SAndroid Build Coastguard Worker EXPECT_THAT(event, Not(IsEvent<EventFoo>()));
300*14675a02SAndroid Build Coastguard Worker }
301*14675a02SAndroid Build Coastguard Worker
TEST(Tracing,MultipleRecorders)302*14675a02SAndroid Build Coastguard Worker TEST(Tracing, MultipleRecorders) {
303*14675a02SAndroid Build Coastguard Worker // NOTE: it is not a recommended scenario to have multiple instances of
304*14675a02SAndroid Build Coastguard Worker // TestTracingRecorder per unit test, but this code path is enforced to
305*14675a02SAndroid Build Coastguard Worker // ensure correct behavior of cleaning up global state so it is not carried
306*14675a02SAndroid Build Coastguard Worker // over between tests.
307*14675a02SAndroid Build Coastguard Worker {
308*14675a02SAndroid Build Coastguard Worker TestTracingRecorder tracing_recorder;
309*14675a02SAndroid Build Coastguard Worker Trace<EventFoo>(222, 333);
310*14675a02SAndroid Build Coastguard Worker EXPECT_THAT(tracing_recorder.root()[0], IsEvent<EventFoo>(222, 333));
311*14675a02SAndroid Build Coastguard Worker }
312*14675a02SAndroid Build Coastguard Worker {
313*14675a02SAndroid Build Coastguard Worker TestTracingRecorder tracing_recorder;
314*14675a02SAndroid Build Coastguard Worker Trace<EventFoo>(444, 555);
315*14675a02SAndroid Build Coastguard Worker EXPECT_THAT(tracing_recorder.root()[0], IsEvent<EventFoo>(444, 555));
316*14675a02SAndroid Build Coastguard Worker }
317*14675a02SAndroid Build Coastguard Worker }
318*14675a02SAndroid Build Coastguard Worker
TEST(Tracing,TraceError)319*14675a02SAndroid Build Coastguard Worker TEST(Tracing, TraceError) {
320*14675a02SAndroid Build Coastguard Worker TestTracingRecorder tracing_recorder;
321*14675a02SAndroid Build Coastguard Worker tracing_recorder.ExpectError<ErrorEvent>();
322*14675a02SAndroid Build Coastguard Worker {
323*14675a02SAndroid Build Coastguard Worker TracingSpan<SpanWithId> inner(111);
324*14675a02SAndroid Build Coastguard Worker Error err = TraceError<ErrorEvent>("there was a bug");
325*14675a02SAndroid Build Coastguard Worker (void)err;
326*14675a02SAndroid Build Coastguard Worker }
327*14675a02SAndroid Build Coastguard Worker }
328*14675a02SAndroid Build Coastguard Worker
TEST(Tracing,FindOnlySpan)329*14675a02SAndroid Build Coastguard Worker TEST(Tracing, FindOnlySpan) {
330*14675a02SAndroid Build Coastguard Worker TestTracingRecorder tracing_recorder;
331*14675a02SAndroid Build Coastguard Worker {
332*14675a02SAndroid Build Coastguard Worker TracingSpan<SpanWithNoData> outer;
333*14675a02SAndroid Build Coastguard Worker { TracingSpan<SpanWithId> inner(111); }
334*14675a02SAndroid Build Coastguard Worker EXPECT_EQ(tracing_recorder.FindOnlySpan<SpanWithId>().data()->id(), 111);
335*14675a02SAndroid Build Coastguard Worker }
336*14675a02SAndroid Build Coastguard Worker }
337*14675a02SAndroid Build Coastguard Worker
TEST(Tracing,FindAllSpans)338*14675a02SAndroid Build Coastguard Worker TEST(Tracing, FindAllSpans) {
339*14675a02SAndroid Build Coastguard Worker TestTracingRecorder tracing_recorder;
340*14675a02SAndroid Build Coastguard Worker {
341*14675a02SAndroid Build Coastguard Worker TracingSpan<SpanWithNoData> outer;
342*14675a02SAndroid Build Coastguard Worker {
343*14675a02SAndroid Build Coastguard Worker TracingSpan<SpanWithId> inner1(111);
344*14675a02SAndroid Build Coastguard Worker { TracingSpan<SpanWithId> inner2(222); }
345*14675a02SAndroid Build Coastguard Worker }
346*14675a02SAndroid Build Coastguard Worker EXPECT_THAT(tracing_recorder.FindAllSpans<SpanWithId>(),
347*14675a02SAndroid Build Coastguard Worker ElementsAre(IsSpan<SpanWithId>(), IsSpan<SpanWithId>()));
348*14675a02SAndroid Build Coastguard Worker EXPECT_THAT(tracing_recorder.FindAllSpans<SpanNeverLogged>(), SizeIs(0));
349*14675a02SAndroid Build Coastguard Worker }
350*14675a02SAndroid Build Coastguard Worker }
351*14675a02SAndroid Build Coastguard Worker
TEST(Tracing,FindOnlyEvent)352*14675a02SAndroid Build Coastguard Worker TEST(Tracing, FindOnlyEvent) {
353*14675a02SAndroid Build Coastguard Worker TestTracingRecorder tracing_recorder;
354*14675a02SAndroid Build Coastguard Worker {
355*14675a02SAndroid Build Coastguard Worker TracingSpan<SpanWithNoData> outer;
356*14675a02SAndroid Build Coastguard Worker { Trace<EventFoo>(111, 222); }
357*14675a02SAndroid Build Coastguard Worker EXPECT_EQ(tracing_recorder.FindOnlyEvent<EventFoo>().data()->first(), 111);
358*14675a02SAndroid Build Coastguard Worker EXPECT_EQ(tracing_recorder.FindOnlyEvent<EventFoo>().data()->second(), 222);
359*14675a02SAndroid Build Coastguard Worker }
360*14675a02SAndroid Build Coastguard Worker }
361*14675a02SAndroid Build Coastguard Worker
TEST(Tracing,FindAllEvents)362*14675a02SAndroid Build Coastguard Worker TEST(Tracing, FindAllEvents) {
363*14675a02SAndroid Build Coastguard Worker TestTracingRecorder tracing_recorder;
364*14675a02SAndroid Build Coastguard Worker {
365*14675a02SAndroid Build Coastguard Worker TracingSpan<SpanWithNoData> outer;
366*14675a02SAndroid Build Coastguard Worker {
367*14675a02SAndroid Build Coastguard Worker Trace<EventFoo>(111, 222);
368*14675a02SAndroid Build Coastguard Worker TracingSpan<SpanWithNoData> inner;
369*14675a02SAndroid Build Coastguard Worker { Trace<EventFoo>(333, 444); }
370*14675a02SAndroid Build Coastguard Worker }
371*14675a02SAndroid Build Coastguard Worker EXPECT_THAT(tracing_recorder.FindAllEvents<EventFoo>(),
372*14675a02SAndroid Build Coastguard Worker ElementsAre(IsEvent<EventFoo>(), IsEvent<EventFoo>()));
373*14675a02SAndroid Build Coastguard Worker EXPECT_THAT(tracing_recorder.FindAllEvents<EventNeverLogged>(), SizeIs(0));
374*14675a02SAndroid Build Coastguard Worker }
375*14675a02SAndroid Build Coastguard Worker }
TEST(Tracing,CreateJsonString)376*14675a02SAndroid Build Coastguard Worker TEST(Tracing, CreateJsonString) {
377*14675a02SAndroid Build Coastguard Worker FlatBufferBuilder fbb_foo;
378*14675a02SAndroid Build Coastguard Worker fbb_foo.Finish(TracingTraits<EventFoo>::Create(222, 333, &fbb_foo));
379*14675a02SAndroid Build Coastguard Worker auto foo_buf = fbb_foo.GetBufferPointer();
380*14675a02SAndroid Build Coastguard Worker auto foo = GetRoot<EventFoo>(fbb_foo.GetBufferPointer());
381*14675a02SAndroid Build Coastguard Worker EXPECT_EQ(foo->first(), 222);
382*14675a02SAndroid Build Coastguard Worker EXPECT_EQ(foo->second(), 333);
383*14675a02SAndroid Build Coastguard Worker
384*14675a02SAndroid Build Coastguard Worker TracingTraits<EventFoo> tracing_traits;
385*14675a02SAndroid Build Coastguard Worker std::string expected = "{\n first: 222,\n second: 333\n}\n";
386*14675a02SAndroid Build Coastguard Worker std::string json_gen = tracing_traits.JsonStringFormat(foo_buf);
387*14675a02SAndroid Build Coastguard Worker EXPECT_EQ(expected, json_gen);
388*14675a02SAndroid Build Coastguard Worker }
389*14675a02SAndroid Build Coastguard Worker
390*14675a02SAndroid Build Coastguard Worker // TODO(team) Add Testing for when the flatbuf has a package name
391*14675a02SAndroid Build Coastguard Worker
392*14675a02SAndroid Build Coastguard Worker } // namespace
393*14675a02SAndroid Build Coastguard Worker } // namespace fcp
394