1*6dbdd20aSAndroid Build Coastguard Worker /*
2*6dbdd20aSAndroid Build Coastguard Worker * Copyright (C) 2021 The Android Open Source Project
3*6dbdd20aSAndroid Build Coastguard Worker *
4*6dbdd20aSAndroid Build Coastguard Worker * Licensed under the Apache License, Version 2.0 (the "License");
5*6dbdd20aSAndroid Build Coastguard Worker * you may not use this file except in compliance with the License.
6*6dbdd20aSAndroid Build Coastguard Worker * You may obtain a copy of the License at
7*6dbdd20aSAndroid Build Coastguard Worker *
8*6dbdd20aSAndroid Build Coastguard Worker * http://www.apache.org/licenses/LICENSE-2.0
9*6dbdd20aSAndroid Build Coastguard Worker *
10*6dbdd20aSAndroid Build Coastguard Worker * Unless required by applicable law or agreed to in writing, software
11*6dbdd20aSAndroid Build Coastguard Worker * distributed under the License is distributed on an "AS IS" BASIS,
12*6dbdd20aSAndroid Build Coastguard Worker * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13*6dbdd20aSAndroid Build Coastguard Worker * See the License for the specific language governing permissions and
14*6dbdd20aSAndroid Build Coastguard Worker * limitations under the License.
15*6dbdd20aSAndroid Build Coastguard Worker */
16*6dbdd20aSAndroid Build Coastguard Worker
17*6dbdd20aSAndroid Build Coastguard Worker #include "perfetto/tracing/traced_proto.h"
18*6dbdd20aSAndroid Build Coastguard Worker
19*6dbdd20aSAndroid Build Coastguard Worker #include "perfetto/test/traced_value_test_support.h"
20*6dbdd20aSAndroid Build Coastguard Worker #include "perfetto/tracing/track_event.h"
21*6dbdd20aSAndroid Build Coastguard Worker #include "protos/perfetto/trace/test_event.gen.h"
22*6dbdd20aSAndroid Build Coastguard Worker #include "protos/perfetto/trace/test_event.pb.h"
23*6dbdd20aSAndroid Build Coastguard Worker #include "protos/perfetto/trace/test_event.pbzero.h"
24*6dbdd20aSAndroid Build Coastguard Worker #include "protos/perfetto/trace/track_event/track_event.gen.h"
25*6dbdd20aSAndroid Build Coastguard Worker #include "protos/perfetto/trace/track_event/track_event.pb.h"
26*6dbdd20aSAndroid Build Coastguard Worker #include "test/gtest_and_gmock.h"
27*6dbdd20aSAndroid Build Coastguard Worker
28*6dbdd20aSAndroid Build Coastguard Worker namespace perfetto {
29*6dbdd20aSAndroid Build Coastguard Worker
30*6dbdd20aSAndroid Build Coastguard Worker class TracedProtoTest : public ::testing::Test {
31*6dbdd20aSAndroid Build Coastguard Worker public:
TracedProtoTest()32*6dbdd20aSAndroid Build Coastguard Worker TracedProtoTest() : context_(track_event_.get(), &incremental_state_) {}
33*6dbdd20aSAndroid Build Coastguard Worker
context()34*6dbdd20aSAndroid Build Coastguard Worker EventContext& context() { return context_; }
35*6dbdd20aSAndroid Build Coastguard Worker
36*6dbdd20aSAndroid Build Coastguard Worker private:
37*6dbdd20aSAndroid Build Coastguard Worker protozero::HeapBuffered<protos::pbzero::TrackEvent> track_event_;
38*6dbdd20aSAndroid Build Coastguard Worker internal::TrackEventIncrementalState incremental_state_;
39*6dbdd20aSAndroid Build Coastguard Worker EventContext context_;
40*6dbdd20aSAndroid Build Coastguard Worker };
41*6dbdd20aSAndroid Build Coastguard Worker
42*6dbdd20aSAndroid Build Coastguard Worker using TestPayload = protos::pbzero::TestEvent::TestPayload;
43*6dbdd20aSAndroid Build Coastguard Worker
TEST_F(TracedProtoTest,SingleInt_WriteField)44*6dbdd20aSAndroid Build Coastguard Worker TEST_F(TracedProtoTest, SingleInt_WriteField) {
45*6dbdd20aSAndroid Build Coastguard Worker protozero::HeapBuffered<TestPayload> event;
46*6dbdd20aSAndroid Build Coastguard Worker perfetto::TracedProto<TestPayload> proto = context().Wrap(event.get());
47*6dbdd20aSAndroid Build Coastguard Worker WriteTracedProtoField(proto, TestPayload::kSingleInt, 42);
48*6dbdd20aSAndroid Build Coastguard Worker
49*6dbdd20aSAndroid Build Coastguard Worker protos::TestEvent::TestPayload result;
50*6dbdd20aSAndroid Build Coastguard Worker result.ParseFromString(event.SerializeAsString());
51*6dbdd20aSAndroid Build Coastguard Worker EXPECT_TRUE(result.has_single_int());
52*6dbdd20aSAndroid Build Coastguard Worker EXPECT_EQ(result.single_int(), 42);
53*6dbdd20aSAndroid Build Coastguard Worker }
54*6dbdd20aSAndroid Build Coastguard Worker
TEST_F(TracedProtoTest,SingleInt_Set)55*6dbdd20aSAndroid Build Coastguard Worker TEST_F(TracedProtoTest, SingleInt_Set) {
56*6dbdd20aSAndroid Build Coastguard Worker protozero::HeapBuffered<TestPayload> event;
57*6dbdd20aSAndroid Build Coastguard Worker perfetto::TracedProto<TestPayload> proto = context().Wrap(event.get());
58*6dbdd20aSAndroid Build Coastguard Worker proto.Set(TestPayload::kSingleInt, 42);
59*6dbdd20aSAndroid Build Coastguard Worker
60*6dbdd20aSAndroid Build Coastguard Worker protos::TestEvent::TestPayload result;
61*6dbdd20aSAndroid Build Coastguard Worker result.ParseFromString(event.SerializeAsString());
62*6dbdd20aSAndroid Build Coastguard Worker EXPECT_TRUE(result.has_single_int());
63*6dbdd20aSAndroid Build Coastguard Worker EXPECT_EQ(result.single_int(), 42);
64*6dbdd20aSAndroid Build Coastguard Worker }
65*6dbdd20aSAndroid Build Coastguard Worker
TEST_F(TracedProtoTest,RepeatedInt_WriteField)66*6dbdd20aSAndroid Build Coastguard Worker TEST_F(TracedProtoTest, RepeatedInt_WriteField) {
67*6dbdd20aSAndroid Build Coastguard Worker protozero::HeapBuffered<TestPayload> event;
68*6dbdd20aSAndroid Build Coastguard Worker perfetto::TracedProto<TestPayload> proto = context().Wrap(event.get());
69*6dbdd20aSAndroid Build Coastguard Worker WriteTracedProtoField(proto, TestPayload::kRepeatedInts,
70*6dbdd20aSAndroid Build Coastguard Worker std::vector<int>{1, 2, 3});
71*6dbdd20aSAndroid Build Coastguard Worker
72*6dbdd20aSAndroid Build Coastguard Worker protos::TestEvent::TestPayload result;
73*6dbdd20aSAndroid Build Coastguard Worker result.ParseFromString(event.SerializeAsString());
74*6dbdd20aSAndroid Build Coastguard Worker EXPECT_THAT(result.repeated_ints(), ::testing::ElementsAre(1, 2, 3));
75*6dbdd20aSAndroid Build Coastguard Worker }
76*6dbdd20aSAndroid Build Coastguard Worker
TEST_F(TracedProtoTest,RepeatedInt_AppendValue)77*6dbdd20aSAndroid Build Coastguard Worker TEST_F(TracedProtoTest, RepeatedInt_AppendValue) {
78*6dbdd20aSAndroid Build Coastguard Worker protozero::HeapBuffered<TestPayload> event;
79*6dbdd20aSAndroid Build Coastguard Worker perfetto::TracedProto<TestPayload> proto = context().Wrap(event.get());
80*6dbdd20aSAndroid Build Coastguard Worker proto.AppendValue(TestPayload::kRepeatedInts, 1);
81*6dbdd20aSAndroid Build Coastguard Worker
82*6dbdd20aSAndroid Build Coastguard Worker protos::TestEvent::TestPayload result;
83*6dbdd20aSAndroid Build Coastguard Worker result.ParseFromString(event.SerializeAsString());
84*6dbdd20aSAndroid Build Coastguard Worker EXPECT_THAT(result.repeated_ints(), ::testing::ElementsAre(1));
85*6dbdd20aSAndroid Build Coastguard Worker }
86*6dbdd20aSAndroid Build Coastguard Worker
TEST_F(TracedProtoTest,RepeatedInt_AppendFrom)87*6dbdd20aSAndroid Build Coastguard Worker TEST_F(TracedProtoTest, RepeatedInt_AppendFrom) {
88*6dbdd20aSAndroid Build Coastguard Worker protozero::HeapBuffered<TestPayload> event;
89*6dbdd20aSAndroid Build Coastguard Worker perfetto::TracedProto<TestPayload> proto = context().Wrap(event.get());
90*6dbdd20aSAndroid Build Coastguard Worker proto.AppendFrom(TestPayload::kRepeatedInts, std::vector<int>{1, 2, 3});
91*6dbdd20aSAndroid Build Coastguard Worker
92*6dbdd20aSAndroid Build Coastguard Worker protos::TestEvent::TestPayload result;
93*6dbdd20aSAndroid Build Coastguard Worker result.ParseFromString(event.SerializeAsString());
94*6dbdd20aSAndroid Build Coastguard Worker EXPECT_THAT(result.repeated_ints(), ::testing::ElementsAre(1, 2, 3));
95*6dbdd20aSAndroid Build Coastguard Worker }
96*6dbdd20aSAndroid Build Coastguard Worker
TEST_F(TracedProtoTest,SingleString_WriteField)97*6dbdd20aSAndroid Build Coastguard Worker TEST_F(TracedProtoTest, SingleString_WriteField) {
98*6dbdd20aSAndroid Build Coastguard Worker protozero::HeapBuffered<TestPayload> event;
99*6dbdd20aSAndroid Build Coastguard Worker perfetto::TracedProto<TestPayload> proto = context().Wrap(event.get());
100*6dbdd20aSAndroid Build Coastguard Worker WriteTracedProtoField(proto, TestPayload::kSingleString, "foo");
101*6dbdd20aSAndroid Build Coastguard Worker
102*6dbdd20aSAndroid Build Coastguard Worker protos::TestEvent::TestPayload result;
103*6dbdd20aSAndroid Build Coastguard Worker result.ParseFromString(event.SerializeAsString());
104*6dbdd20aSAndroid Build Coastguard Worker EXPECT_TRUE(result.has_single_string());
105*6dbdd20aSAndroid Build Coastguard Worker EXPECT_EQ(result.single_string(), "foo");
106*6dbdd20aSAndroid Build Coastguard Worker }
107*6dbdd20aSAndroid Build Coastguard Worker
TEST_F(TracedProtoTest,SingleString_Set)108*6dbdd20aSAndroid Build Coastguard Worker TEST_F(TracedProtoTest, SingleString_Set) {
109*6dbdd20aSAndroid Build Coastguard Worker protozero::HeapBuffered<TestPayload> event;
110*6dbdd20aSAndroid Build Coastguard Worker perfetto::TracedProto<TestPayload> proto = context().Wrap(event.get());
111*6dbdd20aSAndroid Build Coastguard Worker proto.Set(TestPayload::kSingleString, "foo");
112*6dbdd20aSAndroid Build Coastguard Worker
113*6dbdd20aSAndroid Build Coastguard Worker protos::TestEvent::TestPayload result;
114*6dbdd20aSAndroid Build Coastguard Worker result.ParseFromString(event.SerializeAsString());
115*6dbdd20aSAndroid Build Coastguard Worker EXPECT_TRUE(result.has_single_string());
116*6dbdd20aSAndroid Build Coastguard Worker EXPECT_EQ(result.single_string(), "foo");
117*6dbdd20aSAndroid Build Coastguard Worker }
118*6dbdd20aSAndroid Build Coastguard Worker
TEST_F(TracedProtoTest,RepeatedString_WriteField)119*6dbdd20aSAndroid Build Coastguard Worker TEST_F(TracedProtoTest, RepeatedString_WriteField) {
120*6dbdd20aSAndroid Build Coastguard Worker protozero::HeapBuffered<TestPayload> event;
121*6dbdd20aSAndroid Build Coastguard Worker perfetto::TracedProto<TestPayload> proto = context().Wrap(event.get());
122*6dbdd20aSAndroid Build Coastguard Worker WriteTracedProtoField(proto, TestPayload::kStr,
123*6dbdd20aSAndroid Build Coastguard Worker std::vector<std::string>{"foo", "bar"});
124*6dbdd20aSAndroid Build Coastguard Worker
125*6dbdd20aSAndroid Build Coastguard Worker protos::TestEvent::TestPayload result;
126*6dbdd20aSAndroid Build Coastguard Worker result.ParseFromString(event.SerializeAsString());
127*6dbdd20aSAndroid Build Coastguard Worker EXPECT_THAT(result.str(), ::testing::ElementsAre("foo", "bar"));
128*6dbdd20aSAndroid Build Coastguard Worker }
129*6dbdd20aSAndroid Build Coastguard Worker
TEST_F(TracedProtoTest,RepeatedString_AppendFrom)130*6dbdd20aSAndroid Build Coastguard Worker TEST_F(TracedProtoTest, RepeatedString_AppendFrom) {
131*6dbdd20aSAndroid Build Coastguard Worker protozero::HeapBuffered<TestPayload> event;
132*6dbdd20aSAndroid Build Coastguard Worker perfetto::TracedProto<TestPayload> proto = context().Wrap(event.get());
133*6dbdd20aSAndroid Build Coastguard Worker proto.AppendFrom(TestPayload::kStr, std::vector<std::string>{"foo", "bar"});
134*6dbdd20aSAndroid Build Coastguard Worker
135*6dbdd20aSAndroid Build Coastguard Worker protos::TestEvent::TestPayload result;
136*6dbdd20aSAndroid Build Coastguard Worker result.ParseFromString(event.SerializeAsString());
137*6dbdd20aSAndroid Build Coastguard Worker EXPECT_THAT(result.str(), ::testing::ElementsAre("foo", "bar"));
138*6dbdd20aSAndroid Build Coastguard Worker }
139*6dbdd20aSAndroid Build Coastguard Worker
TEST_F(TracedProtoTest,RepeatedString_AppendValue)140*6dbdd20aSAndroid Build Coastguard Worker TEST_F(TracedProtoTest, RepeatedString_AppendValue) {
141*6dbdd20aSAndroid Build Coastguard Worker protozero::HeapBuffered<TestPayload> event;
142*6dbdd20aSAndroid Build Coastguard Worker perfetto::TracedProto<TestPayload> proto = context().Wrap(event.get());
143*6dbdd20aSAndroid Build Coastguard Worker proto.AppendValue(TestPayload::kStr, "foo");
144*6dbdd20aSAndroid Build Coastguard Worker
145*6dbdd20aSAndroid Build Coastguard Worker protos::TestEvent::TestPayload result;
146*6dbdd20aSAndroid Build Coastguard Worker result.ParseFromString(event.SerializeAsString());
147*6dbdd20aSAndroid Build Coastguard Worker EXPECT_THAT(result.str(), ::testing::ElementsAre("foo"));
148*6dbdd20aSAndroid Build Coastguard Worker }
149*6dbdd20aSAndroid Build Coastguard Worker
150*6dbdd20aSAndroid Build Coastguard Worker namespace {
151*6dbdd20aSAndroid Build Coastguard Worker
152*6dbdd20aSAndroid Build Coastguard Worker struct Foo {
WriteIntoTraceperfetto::__anone69dc3860111::Foo153*6dbdd20aSAndroid Build Coastguard Worker void WriteIntoTrace(TracedProto<TestPayload> message) const {
154*6dbdd20aSAndroid Build Coastguard Worker message->set_single_int(42);
155*6dbdd20aSAndroid Build Coastguard Worker
156*6dbdd20aSAndroid Build Coastguard Worker auto dict = std::move(message).AddDebugAnnotations();
157*6dbdd20aSAndroid Build Coastguard Worker dict.Add("arg", "value");
158*6dbdd20aSAndroid Build Coastguard Worker }
159*6dbdd20aSAndroid Build Coastguard Worker };
160*6dbdd20aSAndroid Build Coastguard Worker
161*6dbdd20aSAndroid Build Coastguard Worker struct Bar {};
162*6dbdd20aSAndroid Build Coastguard Worker
163*6dbdd20aSAndroid Build Coastguard Worker } // namespace
164*6dbdd20aSAndroid Build Coastguard Worker
165*6dbdd20aSAndroid Build Coastguard Worker template <>
166*6dbdd20aSAndroid Build Coastguard Worker struct TraceFormatTraits<Bar> {
WriteIntoTraceperfetto::TraceFormatTraits167*6dbdd20aSAndroid Build Coastguard Worker static void WriteIntoTrace(
168*6dbdd20aSAndroid Build Coastguard Worker TracedProto<protos::pbzero::TestEvent::TestPayload> message,
169*6dbdd20aSAndroid Build Coastguard Worker const Bar&) {
170*6dbdd20aSAndroid Build Coastguard Worker message->set_single_string("value");
171*6dbdd20aSAndroid Build Coastguard Worker }
172*6dbdd20aSAndroid Build Coastguard Worker };
173*6dbdd20aSAndroid Build Coastguard Worker
TEST_F(TracedProtoTest,SingleNestedMessage_Method)174*6dbdd20aSAndroid Build Coastguard Worker TEST_F(TracedProtoTest, SingleNestedMessage_Method) {
175*6dbdd20aSAndroid Build Coastguard Worker protozero::HeapBuffered<protos::pbzero::TestEvent> event;
176*6dbdd20aSAndroid Build Coastguard Worker perfetto::TracedProto<protos::pbzero::TestEvent> proto =
177*6dbdd20aSAndroid Build Coastguard Worker context().Wrap(event.get());
178*6dbdd20aSAndroid Build Coastguard Worker WriteTracedProtoField(proto, protos::pbzero::TestEvent::kPayload, Foo());
179*6dbdd20aSAndroid Build Coastguard Worker
180*6dbdd20aSAndroid Build Coastguard Worker protos::TestEvent result;
181*6dbdd20aSAndroid Build Coastguard Worker result.ParseFromString(event.SerializeAsString());
182*6dbdd20aSAndroid Build Coastguard Worker EXPECT_EQ(result.payload().single_int(), 42);
183*6dbdd20aSAndroid Build Coastguard Worker }
184*6dbdd20aSAndroid Build Coastguard Worker
TEST_F(TracedProtoTest,SingleNestedMessage_TraceFormatTraits)185*6dbdd20aSAndroid Build Coastguard Worker TEST_F(TracedProtoTest, SingleNestedMessage_TraceFormatTraits) {
186*6dbdd20aSAndroid Build Coastguard Worker protozero::HeapBuffered<protos::pbzero::TestEvent> event;
187*6dbdd20aSAndroid Build Coastguard Worker perfetto::TracedProto<protos::pbzero::TestEvent> proto =
188*6dbdd20aSAndroid Build Coastguard Worker context().Wrap(event.get());
189*6dbdd20aSAndroid Build Coastguard Worker WriteTracedProtoField(proto, protos::pbzero::TestEvent::kPayload, Bar());
190*6dbdd20aSAndroid Build Coastguard Worker
191*6dbdd20aSAndroid Build Coastguard Worker protos::TestEvent result;
192*6dbdd20aSAndroid Build Coastguard Worker result.ParseFromString(event.SerializeAsString());
193*6dbdd20aSAndroid Build Coastguard Worker EXPECT_EQ(result.payload().single_string(), "value");
194*6dbdd20aSAndroid Build Coastguard Worker }
195*6dbdd20aSAndroid Build Coastguard Worker
TEST_F(TracedProtoTest,SingleNestedMessage_Pointer)196*6dbdd20aSAndroid Build Coastguard Worker TEST_F(TracedProtoTest, SingleNestedMessage_Pointer) {
197*6dbdd20aSAndroid Build Coastguard Worker protozero::HeapBuffered<protos::pbzero::TestEvent> event;
198*6dbdd20aSAndroid Build Coastguard Worker perfetto::TracedProto<protos::pbzero::TestEvent> proto =
199*6dbdd20aSAndroid Build Coastguard Worker context().Wrap(event.get());
200*6dbdd20aSAndroid Build Coastguard Worker Bar bar;
201*6dbdd20aSAndroid Build Coastguard Worker WriteTracedProtoField(proto, protos::pbzero::TestEvent::kPayload, &bar);
202*6dbdd20aSAndroid Build Coastguard Worker
203*6dbdd20aSAndroid Build Coastguard Worker protos::TestEvent result;
204*6dbdd20aSAndroid Build Coastguard Worker result.ParseFromString(event.SerializeAsString());
205*6dbdd20aSAndroid Build Coastguard Worker EXPECT_EQ(result.payload().single_string(), "value");
206*6dbdd20aSAndroid Build Coastguard Worker }
207*6dbdd20aSAndroid Build Coastguard Worker
TEST_F(TracedProtoTest,SingleNestedMessage_UniquePtr)208*6dbdd20aSAndroid Build Coastguard Worker TEST_F(TracedProtoTest, SingleNestedMessage_UniquePtr) {
209*6dbdd20aSAndroid Build Coastguard Worker protozero::HeapBuffered<protos::pbzero::TestEvent> event;
210*6dbdd20aSAndroid Build Coastguard Worker perfetto::TracedProto<protos::pbzero::TestEvent> proto =
211*6dbdd20aSAndroid Build Coastguard Worker context().Wrap(event.get());
212*6dbdd20aSAndroid Build Coastguard Worker std::unique_ptr<Bar> bar(new Bar);
213*6dbdd20aSAndroid Build Coastguard Worker WriteTracedProtoField(proto, protos::pbzero::TestEvent::kPayload, bar);
214*6dbdd20aSAndroid Build Coastguard Worker
215*6dbdd20aSAndroid Build Coastguard Worker protos::TestEvent result;
216*6dbdd20aSAndroid Build Coastguard Worker result.ParseFromString(event.SerializeAsString());
217*6dbdd20aSAndroid Build Coastguard Worker EXPECT_EQ(result.payload().single_string(), "value");
218*6dbdd20aSAndroid Build Coastguard Worker }
219*6dbdd20aSAndroid Build Coastguard Worker
TEST_F(TracedProtoTest,SingleNestedMessage_EmptyUniquePtr)220*6dbdd20aSAndroid Build Coastguard Worker TEST_F(TracedProtoTest, SingleNestedMessage_EmptyUniquePtr) {
221*6dbdd20aSAndroid Build Coastguard Worker protozero::HeapBuffered<protos::pbzero::TestEvent> event;
222*6dbdd20aSAndroid Build Coastguard Worker perfetto::TracedProto<protos::pbzero::TestEvent> proto =
223*6dbdd20aSAndroid Build Coastguard Worker context().Wrap(event.get());
224*6dbdd20aSAndroid Build Coastguard Worker std::unique_ptr<Bar> bar;
225*6dbdd20aSAndroid Build Coastguard Worker WriteTracedProtoField(proto, protos::pbzero::TestEvent::kPayload, bar);
226*6dbdd20aSAndroid Build Coastguard Worker
227*6dbdd20aSAndroid Build Coastguard Worker protos::TestEvent result;
228*6dbdd20aSAndroid Build Coastguard Worker result.ParseFromString(event.SerializeAsString());
229*6dbdd20aSAndroid Build Coastguard Worker EXPECT_FALSE(result.payload().has_single_string());
230*6dbdd20aSAndroid Build Coastguard Worker }
231*6dbdd20aSAndroid Build Coastguard Worker
TEST_F(TracedProtoTest,SingleNestedMessage_Nullptr)232*6dbdd20aSAndroid Build Coastguard Worker TEST_F(TracedProtoTest, SingleNestedMessage_Nullptr) {
233*6dbdd20aSAndroid Build Coastguard Worker protozero::HeapBuffered<protos::pbzero::TestEvent> event;
234*6dbdd20aSAndroid Build Coastguard Worker perfetto::TracedProto<protos::pbzero::TestEvent> proto =
235*6dbdd20aSAndroid Build Coastguard Worker context().Wrap(event.get());
236*6dbdd20aSAndroid Build Coastguard Worker WriteTracedProtoField(proto, protos::pbzero::TestEvent::kPayload, nullptr);
237*6dbdd20aSAndroid Build Coastguard Worker
238*6dbdd20aSAndroid Build Coastguard Worker protos::TestEvent result;
239*6dbdd20aSAndroid Build Coastguard Worker result.ParseFromString(event.SerializeAsString());
240*6dbdd20aSAndroid Build Coastguard Worker EXPECT_FALSE(result.payload().has_single_string());
241*6dbdd20aSAndroid Build Coastguard Worker }
242*6dbdd20aSAndroid Build Coastguard Worker
TEST_F(TracedProtoTest,SingleNestedMessage_Method_Set)243*6dbdd20aSAndroid Build Coastguard Worker TEST_F(TracedProtoTest, SingleNestedMessage_Method_Set) {
244*6dbdd20aSAndroid Build Coastguard Worker protozero::HeapBuffered<protos::pbzero::TestEvent> event;
245*6dbdd20aSAndroid Build Coastguard Worker perfetto::TracedProto<protos::pbzero::TestEvent> proto =
246*6dbdd20aSAndroid Build Coastguard Worker context().Wrap(event.get());
247*6dbdd20aSAndroid Build Coastguard Worker WriteTracedProtoField(proto, protos::pbzero::TestEvent::kPayload, Foo());
248*6dbdd20aSAndroid Build Coastguard Worker
249*6dbdd20aSAndroid Build Coastguard Worker protos::TestEvent result;
250*6dbdd20aSAndroid Build Coastguard Worker result.ParseFromString(event.SerializeAsString());
251*6dbdd20aSAndroid Build Coastguard Worker EXPECT_EQ(result.payload().single_int(), 42);
252*6dbdd20aSAndroid Build Coastguard Worker }
253*6dbdd20aSAndroid Build Coastguard Worker
TEST_F(TracedProtoTest,SingleNestedMessage_TraceFormatTraits_Set)254*6dbdd20aSAndroid Build Coastguard Worker TEST_F(TracedProtoTest, SingleNestedMessage_TraceFormatTraits_Set) {
255*6dbdd20aSAndroid Build Coastguard Worker protozero::HeapBuffered<protos::pbzero::TestEvent> event;
256*6dbdd20aSAndroid Build Coastguard Worker perfetto::TracedProto<protos::pbzero::TestEvent> proto =
257*6dbdd20aSAndroid Build Coastguard Worker context().Wrap(event.get());
258*6dbdd20aSAndroid Build Coastguard Worker proto.Set(protos::pbzero::TestEvent::kPayload, Bar());
259*6dbdd20aSAndroid Build Coastguard Worker
260*6dbdd20aSAndroid Build Coastguard Worker protos::TestEvent result;
261*6dbdd20aSAndroid Build Coastguard Worker result.ParseFromString(event.SerializeAsString());
262*6dbdd20aSAndroid Build Coastguard Worker EXPECT_EQ(result.payload().single_string(), "value");
263*6dbdd20aSAndroid Build Coastguard Worker }
264*6dbdd20aSAndroid Build Coastguard Worker
TEST_F(TracedProtoTest,SingleNestedMessage_Pointer_Set)265*6dbdd20aSAndroid Build Coastguard Worker TEST_F(TracedProtoTest, SingleNestedMessage_Pointer_Set) {
266*6dbdd20aSAndroid Build Coastguard Worker protozero::HeapBuffered<protos::pbzero::TestEvent> event;
267*6dbdd20aSAndroid Build Coastguard Worker perfetto::TracedProto<protos::pbzero::TestEvent> proto =
268*6dbdd20aSAndroid Build Coastguard Worker context().Wrap(event.get());
269*6dbdd20aSAndroid Build Coastguard Worker Bar bar;
270*6dbdd20aSAndroid Build Coastguard Worker proto.Set(protos::pbzero::TestEvent::kPayload, &bar);
271*6dbdd20aSAndroid Build Coastguard Worker
272*6dbdd20aSAndroid Build Coastguard Worker protos::TestEvent result;
273*6dbdd20aSAndroid Build Coastguard Worker result.ParseFromString(event.SerializeAsString());
274*6dbdd20aSAndroid Build Coastguard Worker EXPECT_EQ(result.payload().single_string(), "value");
275*6dbdd20aSAndroid Build Coastguard Worker }
276*6dbdd20aSAndroid Build Coastguard Worker
TEST_F(TracedProtoTest,SingleNestedMessage_UniquePtr_Set)277*6dbdd20aSAndroid Build Coastguard Worker TEST_F(TracedProtoTest, SingleNestedMessage_UniquePtr_Set) {
278*6dbdd20aSAndroid Build Coastguard Worker protozero::HeapBuffered<protos::pbzero::TestEvent> event;
279*6dbdd20aSAndroid Build Coastguard Worker perfetto::TracedProto<protos::pbzero::TestEvent> proto =
280*6dbdd20aSAndroid Build Coastguard Worker context().Wrap(event.get());
281*6dbdd20aSAndroid Build Coastguard Worker std::unique_ptr<Bar> bar(new Bar);
282*6dbdd20aSAndroid Build Coastguard Worker proto.Set(protos::pbzero::TestEvent::kPayload, bar);
283*6dbdd20aSAndroid Build Coastguard Worker
284*6dbdd20aSAndroid Build Coastguard Worker protos::TestEvent result;
285*6dbdd20aSAndroid Build Coastguard Worker result.ParseFromString(event.SerializeAsString());
286*6dbdd20aSAndroid Build Coastguard Worker EXPECT_EQ(result.payload().single_string(), "value");
287*6dbdd20aSAndroid Build Coastguard Worker }
288*6dbdd20aSAndroid Build Coastguard Worker
TEST_F(TracedProtoTest,SingleNestedMessage_EmptyUniquePtr_Set)289*6dbdd20aSAndroid Build Coastguard Worker TEST_F(TracedProtoTest, SingleNestedMessage_EmptyUniquePtr_Set) {
290*6dbdd20aSAndroid Build Coastguard Worker protozero::HeapBuffered<protos::pbzero::TestEvent> event;
291*6dbdd20aSAndroid Build Coastguard Worker perfetto::TracedProto<protos::pbzero::TestEvent> proto =
292*6dbdd20aSAndroid Build Coastguard Worker context().Wrap(event.get());
293*6dbdd20aSAndroid Build Coastguard Worker std::unique_ptr<Bar> bar;
294*6dbdd20aSAndroid Build Coastguard Worker proto.Set(protos::pbzero::TestEvent::kPayload, bar);
295*6dbdd20aSAndroid Build Coastguard Worker
296*6dbdd20aSAndroid Build Coastguard Worker protos::TestEvent result;
297*6dbdd20aSAndroid Build Coastguard Worker result.ParseFromString(event.SerializeAsString());
298*6dbdd20aSAndroid Build Coastguard Worker EXPECT_FALSE(result.payload().has_single_string());
299*6dbdd20aSAndroid Build Coastguard Worker }
300*6dbdd20aSAndroid Build Coastguard Worker
TEST_F(TracedProtoTest,SingleNestedMessage_Nullptr_Set)301*6dbdd20aSAndroid Build Coastguard Worker TEST_F(TracedProtoTest, SingleNestedMessage_Nullptr_Set) {
302*6dbdd20aSAndroid Build Coastguard Worker protozero::HeapBuffered<protos::pbzero::TestEvent> event;
303*6dbdd20aSAndroid Build Coastguard Worker perfetto::TracedProto<protos::pbzero::TestEvent> proto =
304*6dbdd20aSAndroid Build Coastguard Worker context().Wrap(event.get());
305*6dbdd20aSAndroid Build Coastguard Worker proto.Set(protos::pbzero::TestEvent::kPayload, nullptr);
306*6dbdd20aSAndroid Build Coastguard Worker
307*6dbdd20aSAndroid Build Coastguard Worker protos::TestEvent result;
308*6dbdd20aSAndroid Build Coastguard Worker result.ParseFromString(event.SerializeAsString());
309*6dbdd20aSAndroid Build Coastguard Worker EXPECT_FALSE(result.payload().has_single_string());
310*6dbdd20aSAndroid Build Coastguard Worker }
311*6dbdd20aSAndroid Build Coastguard Worker
TEST_F(TracedProtoTest,RepeatedNestedMessage_Method)312*6dbdd20aSAndroid Build Coastguard Worker TEST_F(TracedProtoTest, RepeatedNestedMessage_Method) {
313*6dbdd20aSAndroid Build Coastguard Worker protozero::HeapBuffered<TestPayload> event;
314*6dbdd20aSAndroid Build Coastguard Worker perfetto::TracedProto<TestPayload> proto = context().Wrap(event.get());
315*6dbdd20aSAndroid Build Coastguard Worker WriteTracedProtoField(proto, TestPayload::kNested,
316*6dbdd20aSAndroid Build Coastguard Worker std::vector<Foo>{Foo(), Foo()});
317*6dbdd20aSAndroid Build Coastguard Worker
318*6dbdd20aSAndroid Build Coastguard Worker protos::TestEvent::TestPayload result;
319*6dbdd20aSAndroid Build Coastguard Worker result.ParseFromString(event.SerializeAsString());
320*6dbdd20aSAndroid Build Coastguard Worker EXPECT_EQ(result.nested_size(), 2);
321*6dbdd20aSAndroid Build Coastguard Worker EXPECT_EQ(result.nested(0).single_int(), 42);
322*6dbdd20aSAndroid Build Coastguard Worker EXPECT_EQ(result.nested(1).single_int(), 42);
323*6dbdd20aSAndroid Build Coastguard Worker }
324*6dbdd20aSAndroid Build Coastguard Worker
TEST_F(TracedProtoTest,RepeatedNestedMessage_TraceFormatTraits)325*6dbdd20aSAndroid Build Coastguard Worker TEST_F(TracedProtoTest, RepeatedNestedMessage_TraceFormatTraits) {
326*6dbdd20aSAndroid Build Coastguard Worker protozero::HeapBuffered<TestPayload> event;
327*6dbdd20aSAndroid Build Coastguard Worker perfetto::TracedProto<TestPayload> proto = context().Wrap(event.get());
328*6dbdd20aSAndroid Build Coastguard Worker WriteTracedProtoField(proto, TestPayload::kNested,
329*6dbdd20aSAndroid Build Coastguard Worker std::vector<Bar>{Bar(), Bar()});
330*6dbdd20aSAndroid Build Coastguard Worker
331*6dbdd20aSAndroid Build Coastguard Worker protos::TestEvent::TestPayload result;
332*6dbdd20aSAndroid Build Coastguard Worker result.ParseFromString(event.SerializeAsString());
333*6dbdd20aSAndroid Build Coastguard Worker EXPECT_EQ(result.nested_size(), 2);
334*6dbdd20aSAndroid Build Coastguard Worker EXPECT_EQ(result.nested(0).single_string(), "value");
335*6dbdd20aSAndroid Build Coastguard Worker EXPECT_EQ(result.nested(1).single_string(), "value");
336*6dbdd20aSAndroid Build Coastguard Worker }
337*6dbdd20aSAndroid Build Coastguard Worker
TEST_F(TracedProtoTest,RepeatedNestedMessage_Pointer)338*6dbdd20aSAndroid Build Coastguard Worker TEST_F(TracedProtoTest, RepeatedNestedMessage_Pointer) {
339*6dbdd20aSAndroid Build Coastguard Worker protozero::HeapBuffered<TestPayload> event;
340*6dbdd20aSAndroid Build Coastguard Worker perfetto::TracedProto<TestPayload> proto = context().Wrap(event.get());
341*6dbdd20aSAndroid Build Coastguard Worker Bar bar;
342*6dbdd20aSAndroid Build Coastguard Worker std::vector<Bar*> bars;
343*6dbdd20aSAndroid Build Coastguard Worker bars.push_back(&bar);
344*6dbdd20aSAndroid Build Coastguard Worker bars.push_back(nullptr);
345*6dbdd20aSAndroid Build Coastguard Worker WriteTracedProtoField(proto, TestPayload::kNested, bars);
346*6dbdd20aSAndroid Build Coastguard Worker
347*6dbdd20aSAndroid Build Coastguard Worker protos::TestEvent::TestPayload result;
348*6dbdd20aSAndroid Build Coastguard Worker result.ParseFromString(event.SerializeAsString());
349*6dbdd20aSAndroid Build Coastguard Worker EXPECT_EQ(result.nested_size(), 2);
350*6dbdd20aSAndroid Build Coastguard Worker EXPECT_EQ(result.nested(0).single_string(), "value");
351*6dbdd20aSAndroid Build Coastguard Worker EXPECT_FALSE(result.nested(1).has_single_string());
352*6dbdd20aSAndroid Build Coastguard Worker }
353*6dbdd20aSAndroid Build Coastguard Worker
TEST_F(TracedProtoTest,RepeatedNestedMessage_Method_AppendValue)354*6dbdd20aSAndroid Build Coastguard Worker TEST_F(TracedProtoTest, RepeatedNestedMessage_Method_AppendValue) {
355*6dbdd20aSAndroid Build Coastguard Worker protozero::HeapBuffered<TestPayload> event;
356*6dbdd20aSAndroid Build Coastguard Worker perfetto::TracedProto<TestPayload> proto = context().Wrap(event.get());
357*6dbdd20aSAndroid Build Coastguard Worker proto.AppendValue(TestPayload::kNested, Foo());
358*6dbdd20aSAndroid Build Coastguard Worker
359*6dbdd20aSAndroid Build Coastguard Worker protos::TestEvent::TestPayload result;
360*6dbdd20aSAndroid Build Coastguard Worker result.ParseFromString(event.SerializeAsString());
361*6dbdd20aSAndroid Build Coastguard Worker EXPECT_EQ(result.nested_size(), 1);
362*6dbdd20aSAndroid Build Coastguard Worker EXPECT_EQ(result.nested(0).single_int(), 42);
363*6dbdd20aSAndroid Build Coastguard Worker }
364*6dbdd20aSAndroid Build Coastguard Worker
TEST_F(TracedProtoTest,RepeatedNestedMessage_TraceFormatTraits_AppendValue)365*6dbdd20aSAndroid Build Coastguard Worker TEST_F(TracedProtoTest, RepeatedNestedMessage_TraceFormatTraits_AppendValue) {
366*6dbdd20aSAndroid Build Coastguard Worker protozero::HeapBuffered<TestPayload> event;
367*6dbdd20aSAndroid Build Coastguard Worker perfetto::TracedProto<TestPayload> proto = context().Wrap(event.get());
368*6dbdd20aSAndroid Build Coastguard Worker proto.AppendValue(TestPayload::kNested, Bar());
369*6dbdd20aSAndroid Build Coastguard Worker
370*6dbdd20aSAndroid Build Coastguard Worker protos::TestEvent::TestPayload result;
371*6dbdd20aSAndroid Build Coastguard Worker result.ParseFromString(event.SerializeAsString());
372*6dbdd20aSAndroid Build Coastguard Worker EXPECT_EQ(result.nested_size(), 1);
373*6dbdd20aSAndroid Build Coastguard Worker EXPECT_EQ(result.nested(0).single_string(), "value");
374*6dbdd20aSAndroid Build Coastguard Worker }
375*6dbdd20aSAndroid Build Coastguard Worker
TEST_F(TracedProtoTest,RepeatedNestedMessage_Pointer_AppendValue)376*6dbdd20aSAndroid Build Coastguard Worker TEST_F(TracedProtoTest, RepeatedNestedMessage_Pointer_AppendValue) {
377*6dbdd20aSAndroid Build Coastguard Worker protozero::HeapBuffered<TestPayload> event;
378*6dbdd20aSAndroid Build Coastguard Worker perfetto::TracedProto<TestPayload> proto = context().Wrap(event.get());
379*6dbdd20aSAndroid Build Coastguard Worker Bar bar;
380*6dbdd20aSAndroid Build Coastguard Worker proto.AppendValue(TestPayload::kNested, &bar);
381*6dbdd20aSAndroid Build Coastguard Worker proto.AppendValue(TestPayload::kNested, nullptr);
382*6dbdd20aSAndroid Build Coastguard Worker
383*6dbdd20aSAndroid Build Coastguard Worker protos::TestEvent::TestPayload result;
384*6dbdd20aSAndroid Build Coastguard Worker result.ParseFromString(event.SerializeAsString());
385*6dbdd20aSAndroid Build Coastguard Worker EXPECT_EQ(result.nested_size(), 2);
386*6dbdd20aSAndroid Build Coastguard Worker EXPECT_EQ(result.nested(0).single_string(), "value");
387*6dbdd20aSAndroid Build Coastguard Worker EXPECT_FALSE(result.nested(1).has_single_string());
388*6dbdd20aSAndroid Build Coastguard Worker }
389*6dbdd20aSAndroid Build Coastguard Worker
TEST_F(TracedProtoTest,RepeatedNestedMessage_Method_AppendFrom)390*6dbdd20aSAndroid Build Coastguard Worker TEST_F(TracedProtoTest, RepeatedNestedMessage_Method_AppendFrom) {
391*6dbdd20aSAndroid Build Coastguard Worker protozero::HeapBuffered<TestPayload> event;
392*6dbdd20aSAndroid Build Coastguard Worker perfetto::TracedProto<TestPayload> proto = context().Wrap(event.get());
393*6dbdd20aSAndroid Build Coastguard Worker proto.AppendFrom(TestPayload::kNested, std::vector<Foo>{Foo(), Foo()});
394*6dbdd20aSAndroid Build Coastguard Worker
395*6dbdd20aSAndroid Build Coastguard Worker protos::TestEvent::TestPayload result;
396*6dbdd20aSAndroid Build Coastguard Worker result.ParseFromString(event.SerializeAsString());
397*6dbdd20aSAndroid Build Coastguard Worker EXPECT_EQ(result.nested_size(), 2);
398*6dbdd20aSAndroid Build Coastguard Worker EXPECT_EQ(result.nested(0).single_int(), 42);
399*6dbdd20aSAndroid Build Coastguard Worker EXPECT_EQ(result.nested(1).single_int(), 42);
400*6dbdd20aSAndroid Build Coastguard Worker }
401*6dbdd20aSAndroid Build Coastguard Worker
TEST_F(TracedProtoTest,RepeatedNestedMessage_TraceFormatTraits_AppendFrom)402*6dbdd20aSAndroid Build Coastguard Worker TEST_F(TracedProtoTest, RepeatedNestedMessage_TraceFormatTraits_AppendFrom) {
403*6dbdd20aSAndroid Build Coastguard Worker protozero::HeapBuffered<TestPayload> event;
404*6dbdd20aSAndroid Build Coastguard Worker perfetto::TracedProto<TestPayload> proto = context().Wrap(event.get());
405*6dbdd20aSAndroid Build Coastguard Worker proto.AppendFrom(TestPayload::kNested, std::vector<Bar>{Bar(), Bar()});
406*6dbdd20aSAndroid Build Coastguard Worker
407*6dbdd20aSAndroid Build Coastguard Worker protos::TestEvent::TestPayload result;
408*6dbdd20aSAndroid Build Coastguard Worker result.ParseFromString(event.SerializeAsString());
409*6dbdd20aSAndroid Build Coastguard Worker EXPECT_EQ(result.nested_size(), 2);
410*6dbdd20aSAndroid Build Coastguard Worker EXPECT_EQ(result.nested(0).single_string(), "value");
411*6dbdd20aSAndroid Build Coastguard Worker EXPECT_EQ(result.nested(1).single_string(), "value");
412*6dbdd20aSAndroid Build Coastguard Worker }
413*6dbdd20aSAndroid Build Coastguard Worker
TEST_F(TracedProtoTest,RepeatedNestedMessage_Pointer_AppendFrom)414*6dbdd20aSAndroid Build Coastguard Worker TEST_F(TracedProtoTest, RepeatedNestedMessage_Pointer_AppendFrom) {
415*6dbdd20aSAndroid Build Coastguard Worker protozero::HeapBuffered<TestPayload> event;
416*6dbdd20aSAndroid Build Coastguard Worker perfetto::TracedProto<TestPayload> proto = context().Wrap(event.get());
417*6dbdd20aSAndroid Build Coastguard Worker Bar bar;
418*6dbdd20aSAndroid Build Coastguard Worker std::vector<Bar*> bars;
419*6dbdd20aSAndroid Build Coastguard Worker bars.push_back(&bar);
420*6dbdd20aSAndroid Build Coastguard Worker bars.push_back(nullptr);
421*6dbdd20aSAndroid Build Coastguard Worker proto.AppendFrom(TestPayload::kNested, bars);
422*6dbdd20aSAndroid Build Coastguard Worker
423*6dbdd20aSAndroid Build Coastguard Worker protos::TestEvent::TestPayload result;
424*6dbdd20aSAndroid Build Coastguard Worker result.ParseFromString(event.SerializeAsString());
425*6dbdd20aSAndroid Build Coastguard Worker EXPECT_EQ(result.nested_size(), 2);
426*6dbdd20aSAndroid Build Coastguard Worker EXPECT_EQ(result.nested(0).single_string(), "value");
427*6dbdd20aSAndroid Build Coastguard Worker EXPECT_FALSE(result.nested(1).has_single_string());
428*6dbdd20aSAndroid Build Coastguard Worker }
429*6dbdd20aSAndroid Build Coastguard Worker
TEST_F(TracedProtoTest,WriteDebugAnnotations)430*6dbdd20aSAndroid Build Coastguard Worker TEST_F(TracedProtoTest, WriteDebugAnnotations) {
431*6dbdd20aSAndroid Build Coastguard Worker protozero::HeapBuffered<protos::pbzero::TestEvent> event;
432*6dbdd20aSAndroid Build Coastguard Worker perfetto::TracedProto<protos::pbzero::TestEvent> proto =
433*6dbdd20aSAndroid Build Coastguard Worker context().Wrap(event.get());
434*6dbdd20aSAndroid Build Coastguard Worker WriteTracedProtoField(proto, protos::pbzero::TestEvent::kPayload, Foo());
435*6dbdd20aSAndroid Build Coastguard Worker
436*6dbdd20aSAndroid Build Coastguard Worker protos::TestEvent result;
437*6dbdd20aSAndroid Build Coastguard Worker result.ParseFromString(event.SerializeAsString());
438*6dbdd20aSAndroid Build Coastguard Worker
439*6dbdd20aSAndroid Build Coastguard Worker protos::DebugAnnotation dict;
440*6dbdd20aSAndroid Build Coastguard Worker for (const auto& annotation : result.payload().debug_annotations()) {
441*6dbdd20aSAndroid Build Coastguard Worker *dict.add_dict_entries() = annotation;
442*6dbdd20aSAndroid Build Coastguard Worker }
443*6dbdd20aSAndroid Build Coastguard Worker
444*6dbdd20aSAndroid Build Coastguard Worker EXPECT_EQ(internal::DebugAnnotationToString(dict.SerializeAsString()),
445*6dbdd20aSAndroid Build Coastguard Worker "{arg:value}");
446*6dbdd20aSAndroid Build Coastguard Worker }
447*6dbdd20aSAndroid Build Coastguard Worker
448*6dbdd20aSAndroid Build Coastguard Worker } // namespace perfetto
449