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_value.h"
18*6dbdd20aSAndroid Build Coastguard Worker
19*6dbdd20aSAndroid Build Coastguard Worker #include <array>
20*6dbdd20aSAndroid Build Coastguard Worker #include <deque>
21*6dbdd20aSAndroid Build Coastguard Worker #include <forward_list>
22*6dbdd20aSAndroid Build Coastguard Worker #include <list>
23*6dbdd20aSAndroid Build Coastguard Worker #include <map>
24*6dbdd20aSAndroid Build Coastguard Worker #include <queue>
25*6dbdd20aSAndroid Build Coastguard Worker #include <set>
26*6dbdd20aSAndroid Build Coastguard Worker #include <sstream>
27*6dbdd20aSAndroid Build Coastguard Worker #include <stack>
28*6dbdd20aSAndroid Build Coastguard Worker #include <unordered_map>
29*6dbdd20aSAndroid Build Coastguard Worker #include <unordered_set>
30*6dbdd20aSAndroid Build Coastguard Worker
31*6dbdd20aSAndroid Build Coastguard Worker #include "perfetto/base/template_util.h"
32*6dbdd20aSAndroid Build Coastguard Worker #include "perfetto/protozero/scattered_heap_buffer.h"
33*6dbdd20aSAndroid Build Coastguard Worker #include "perfetto/test/traced_value_test_support.h"
34*6dbdd20aSAndroid Build Coastguard Worker #include "perfetto/tracing/debug_annotation.h"
35*6dbdd20aSAndroid Build Coastguard Worker #include "perfetto/tracing/track_event.h"
36*6dbdd20aSAndroid Build Coastguard Worker #include "protos/perfetto/trace/test_event.pb.h"
37*6dbdd20aSAndroid Build Coastguard Worker #include "protos/perfetto/trace/test_event.pbzero.h"
38*6dbdd20aSAndroid Build Coastguard Worker #include "protos/perfetto/trace/track_event/debug_annotation.gen.h"
39*6dbdd20aSAndroid Build Coastguard Worker #include "protos/perfetto/trace/track_event/debug_annotation.pb.h"
40*6dbdd20aSAndroid Build Coastguard Worker #include "test/gtest_and_gmock.h"
41*6dbdd20aSAndroid Build Coastguard Worker
42*6dbdd20aSAndroid Build Coastguard Worker namespace perfetto {
43*6dbdd20aSAndroid Build Coastguard Worker
44*6dbdd20aSAndroid Build Coastguard Worker // static asserts checking for conversion support for known types.
45*6dbdd20aSAndroid Build Coastguard Worker
46*6dbdd20aSAndroid Build Coastguard Worker #define ASSERT_TYPE_SUPPORTED(T) \
47*6dbdd20aSAndroid Build Coastguard Worker static_assert(check_traced_value_support<T>::value, ""); \
48*6dbdd20aSAndroid Build Coastguard Worker static_assert(internal::has_traced_value_support<T>::value, "")
49*6dbdd20aSAndroid Build Coastguard Worker
50*6dbdd20aSAndroid Build Coastguard Worker #define ASSERT_TYPE_NOT_SUPPORTED(T) \
51*6dbdd20aSAndroid Build Coastguard Worker static_assert(!internal::has_traced_value_support<T>::value, "")
52*6dbdd20aSAndroid Build Coastguard Worker
53*6dbdd20aSAndroid Build Coastguard Worker struct NonSupportedType {};
54*6dbdd20aSAndroid Build Coastguard Worker
55*6dbdd20aSAndroid Build Coastguard Worker ASSERT_TYPE_SUPPORTED(bool);
56*6dbdd20aSAndroid Build Coastguard Worker
57*6dbdd20aSAndroid Build Coastguard Worker ASSERT_TYPE_NOT_SUPPORTED(NonSupportedType);
58*6dbdd20aSAndroid Build Coastguard Worker
59*6dbdd20aSAndroid Build Coastguard Worker // Integer types.
60*6dbdd20aSAndroid Build Coastguard Worker ASSERT_TYPE_SUPPORTED(short int);
61*6dbdd20aSAndroid Build Coastguard Worker ASSERT_TYPE_SUPPORTED(unsigned short int);
62*6dbdd20aSAndroid Build Coastguard Worker ASSERT_TYPE_SUPPORTED(int);
63*6dbdd20aSAndroid Build Coastguard Worker ASSERT_TYPE_SUPPORTED(unsigned int);
64*6dbdd20aSAndroid Build Coastguard Worker ASSERT_TYPE_SUPPORTED(long int);
65*6dbdd20aSAndroid Build Coastguard Worker ASSERT_TYPE_SUPPORTED(unsigned long int);
66*6dbdd20aSAndroid Build Coastguard Worker ASSERT_TYPE_SUPPORTED(long long int);
67*6dbdd20aSAndroid Build Coastguard Worker ASSERT_TYPE_SUPPORTED(unsigned long long int);
68*6dbdd20aSAndroid Build Coastguard Worker
69*6dbdd20aSAndroid Build Coastguard Worker // References and const references types.
70*6dbdd20aSAndroid Build Coastguard Worker ASSERT_TYPE_SUPPORTED(int&);
71*6dbdd20aSAndroid Build Coastguard Worker ASSERT_TYPE_SUPPORTED(const int&);
72*6dbdd20aSAndroid Build Coastguard Worker ASSERT_TYPE_NOT_SUPPORTED(NonSupportedType&);
73*6dbdd20aSAndroid Build Coastguard Worker ASSERT_TYPE_NOT_SUPPORTED(const NonSupportedType&);
74*6dbdd20aSAndroid Build Coastguard Worker
75*6dbdd20aSAndroid Build Coastguard Worker // Character types.
76*6dbdd20aSAndroid Build Coastguard Worker ASSERT_TYPE_SUPPORTED(signed char);
77*6dbdd20aSAndroid Build Coastguard Worker ASSERT_TYPE_SUPPORTED(unsigned char);
78*6dbdd20aSAndroid Build Coastguard Worker ASSERT_TYPE_SUPPORTED(char);
79*6dbdd20aSAndroid Build Coastguard Worker ASSERT_TYPE_SUPPORTED(wchar_t);
80*6dbdd20aSAndroid Build Coastguard Worker
81*6dbdd20aSAndroid Build Coastguard Worker // Float types.
82*6dbdd20aSAndroid Build Coastguard Worker ASSERT_TYPE_SUPPORTED(float);
83*6dbdd20aSAndroid Build Coastguard Worker ASSERT_TYPE_SUPPORTED(double);
84*6dbdd20aSAndroid Build Coastguard Worker ASSERT_TYPE_SUPPORTED(long double);
85*6dbdd20aSAndroid Build Coastguard Worker
86*6dbdd20aSAndroid Build Coastguard Worker // Strings.
87*6dbdd20aSAndroid Build Coastguard Worker ASSERT_TYPE_SUPPORTED(const char*);
88*6dbdd20aSAndroid Build Coastguard Worker ASSERT_TYPE_SUPPORTED(const char[]);
89*6dbdd20aSAndroid Build Coastguard Worker ASSERT_TYPE_SUPPORTED(const char[2]);
90*6dbdd20aSAndroid Build Coastguard Worker ASSERT_TYPE_SUPPORTED(std::string);
91*6dbdd20aSAndroid Build Coastguard Worker
92*6dbdd20aSAndroid Build Coastguard Worker // Pointers.
93*6dbdd20aSAndroid Build Coastguard Worker ASSERT_TYPE_SUPPORTED(int*);
94*6dbdd20aSAndroid Build Coastguard Worker ASSERT_TYPE_SUPPORTED(const int*);
95*6dbdd20aSAndroid Build Coastguard Worker ASSERT_TYPE_SUPPORTED(void*);
96*6dbdd20aSAndroid Build Coastguard Worker ASSERT_TYPE_SUPPORTED(const void*);
97*6dbdd20aSAndroid Build Coastguard Worker ASSERT_TYPE_SUPPORTED(std::nullptr_t);
98*6dbdd20aSAndroid Build Coastguard Worker ASSERT_TYPE_NOT_SUPPORTED(NonSupportedType*);
99*6dbdd20aSAndroid Build Coastguard Worker ASSERT_TYPE_NOT_SUPPORTED(const NonSupportedType*);
100*6dbdd20aSAndroid Build Coastguard Worker
101*6dbdd20aSAndroid Build Coastguard Worker // Arrays.
102*6dbdd20aSAndroid Build Coastguard Worker ASSERT_TYPE_NOT_SUPPORTED(int[]);
103*6dbdd20aSAndroid Build Coastguard Worker ASSERT_TYPE_NOT_SUPPORTED(const int[]);
104*6dbdd20aSAndroid Build Coastguard Worker ASSERT_TYPE_NOT_SUPPORTED(NonSupportedType[]);
105*6dbdd20aSAndroid Build Coastguard Worker ASSERT_TYPE_NOT_SUPPORTED(const NonSupportedType[]);
106*6dbdd20aSAndroid Build Coastguard Worker ASSERT_TYPE_SUPPORTED(int (&)[3]);
107*6dbdd20aSAndroid Build Coastguard Worker ASSERT_TYPE_SUPPORTED(const int (&)[3]);
108*6dbdd20aSAndroid Build Coastguard Worker ASSERT_TYPE_NOT_SUPPORTED(NonSupportedType (&)[3]);
109*6dbdd20aSAndroid Build Coastguard Worker ASSERT_TYPE_NOT_SUPPORTED(const NonSupportedType (&)[3]);
110*6dbdd20aSAndroid Build Coastguard Worker
111*6dbdd20aSAndroid Build Coastguard Worker // STL containers.
112*6dbdd20aSAndroid Build Coastguard Worker ASSERT_TYPE_SUPPORTED(std::vector<int>);
113*6dbdd20aSAndroid Build Coastguard Worker ASSERT_TYPE_NOT_SUPPORTED(std::vector<NonSupportedType>);
114*6dbdd20aSAndroid Build Coastguard Worker
115*6dbdd20aSAndroid Build Coastguard Worker using array_int_t = std::array<int, 4>;
116*6dbdd20aSAndroid Build Coastguard Worker ASSERT_TYPE_SUPPORTED(array_int_t);
117*6dbdd20aSAndroid Build Coastguard Worker ASSERT_TYPE_SUPPORTED(std::deque<int>);
118*6dbdd20aSAndroid Build Coastguard Worker ASSERT_TYPE_SUPPORTED(std::forward_list<int>);
119*6dbdd20aSAndroid Build Coastguard Worker ASSERT_TYPE_SUPPORTED(std::list<int>);
120*6dbdd20aSAndroid Build Coastguard Worker ASSERT_TYPE_NOT_SUPPORTED(std::stack<int>);
121*6dbdd20aSAndroid Build Coastguard Worker ASSERT_TYPE_NOT_SUPPORTED(std::queue<int>);
122*6dbdd20aSAndroid Build Coastguard Worker ASSERT_TYPE_NOT_SUPPORTED(std::priority_queue<int>);
123*6dbdd20aSAndroid Build Coastguard Worker ASSERT_TYPE_SUPPORTED(std::set<int>);
124*6dbdd20aSAndroid Build Coastguard Worker ASSERT_TYPE_SUPPORTED(std::multiset<int>);
125*6dbdd20aSAndroid Build Coastguard Worker using map_int_int_t = std::map<int, int>;
126*6dbdd20aSAndroid Build Coastguard Worker ASSERT_TYPE_NOT_SUPPORTED(map_int_int_t);
127*6dbdd20aSAndroid Build Coastguard Worker using multimap_int_int_t = std::multimap<int, int>;
128*6dbdd20aSAndroid Build Coastguard Worker ASSERT_TYPE_NOT_SUPPORTED(multimap_int_int_t);
129*6dbdd20aSAndroid Build Coastguard Worker ASSERT_TYPE_SUPPORTED(std::unordered_set<int>);
130*6dbdd20aSAndroid Build Coastguard Worker ASSERT_TYPE_SUPPORTED(std::unordered_multiset<int>);
131*6dbdd20aSAndroid Build Coastguard Worker using unordered_map_int_int_t = std::unordered_map<int, int>;
132*6dbdd20aSAndroid Build Coastguard Worker ASSERT_TYPE_NOT_SUPPORTED(unordered_map_int_int_t);
133*6dbdd20aSAndroid Build Coastguard Worker using unordered_multimap_int_int_t = std::unordered_multimap<int, int>;
134*6dbdd20aSAndroid Build Coastguard Worker ASSERT_TYPE_NOT_SUPPORTED(unordered_multimap_int_int_t);
135*6dbdd20aSAndroid Build Coastguard Worker
136*6dbdd20aSAndroid Build Coastguard Worker // unique_ptr.
137*6dbdd20aSAndroid Build Coastguard Worker ASSERT_TYPE_SUPPORTED(std::unique_ptr<int>);
138*6dbdd20aSAndroid Build Coastguard Worker ASSERT_TYPE_NOT_SUPPORTED(std::unique_ptr<NonSupportedType>);
139*6dbdd20aSAndroid Build Coastguard Worker
TEST(TracedValueTest,FlatDictionary_Explicit)140*6dbdd20aSAndroid Build Coastguard Worker TEST(TracedValueTest, FlatDictionary_Explicit) {
141*6dbdd20aSAndroid Build Coastguard Worker protozero::HeapBuffered<protos::pbzero::DebugAnnotation> message;
142*6dbdd20aSAndroid Build Coastguard Worker {
143*6dbdd20aSAndroid Build Coastguard Worker auto dict =
144*6dbdd20aSAndroid Build Coastguard Worker internal::CreateTracedValueFromProto(message.get()).WriteDictionary();
145*6dbdd20aSAndroid Build Coastguard Worker dict.AddItem("bool").WriteBoolean(true);
146*6dbdd20aSAndroid Build Coastguard Worker dict.AddItem("double").WriteDouble(0.0);
147*6dbdd20aSAndroid Build Coastguard Worker dict.AddItem("int").WriteInt64(2014);
148*6dbdd20aSAndroid Build Coastguard Worker dict.AddItem("string").WriteString("string");
149*6dbdd20aSAndroid Build Coastguard Worker dict.AddItem("truncated_string").WriteString("truncated_string", 9);
150*6dbdd20aSAndroid Build Coastguard Worker dict.AddItem("ptr").WritePointer(reinterpret_cast<void*>(0x1234));
151*6dbdd20aSAndroid Build Coastguard Worker }
152*6dbdd20aSAndroid Build Coastguard Worker EXPECT_EQ(
153*6dbdd20aSAndroid Build Coastguard Worker "{bool:true,double:0,int:2014,string:string,truncated_string:truncated,"
154*6dbdd20aSAndroid Build Coastguard Worker "ptr:0x1234}",
155*6dbdd20aSAndroid Build Coastguard Worker internal::DebugAnnotationToString(message.SerializeAsString()));
156*6dbdd20aSAndroid Build Coastguard Worker }
157*6dbdd20aSAndroid Build Coastguard Worker
TEST(TracedValueTest,FlatDictionary_Short)158*6dbdd20aSAndroid Build Coastguard Worker TEST(TracedValueTest, FlatDictionary_Short) {
159*6dbdd20aSAndroid Build Coastguard Worker protozero::HeapBuffered<protos::pbzero::DebugAnnotation> message;
160*6dbdd20aSAndroid Build Coastguard Worker {
161*6dbdd20aSAndroid Build Coastguard Worker auto dict =
162*6dbdd20aSAndroid Build Coastguard Worker internal::CreateTracedValueFromProto(message.get()).WriteDictionary();
163*6dbdd20aSAndroid Build Coastguard Worker dict.Add("bool", true);
164*6dbdd20aSAndroid Build Coastguard Worker dict.Add("double", 0.0);
165*6dbdd20aSAndroid Build Coastguard Worker dict.Add("int", 2014);
166*6dbdd20aSAndroid Build Coastguard Worker dict.Add("string", "string");
167*6dbdd20aSAndroid Build Coastguard Worker dict.Add("ptr", reinterpret_cast<void*>(0x1234));
168*6dbdd20aSAndroid Build Coastguard Worker }
169*6dbdd20aSAndroid Build Coastguard Worker EXPECT_EQ("{bool:true,double:0,int:2014,string:string,ptr:0x1234}",
170*6dbdd20aSAndroid Build Coastguard Worker internal::DebugAnnotationToString(message.SerializeAsString()));
171*6dbdd20aSAndroid Build Coastguard Worker }
172*6dbdd20aSAndroid Build Coastguard Worker
TEST(TracedValueTest,Hierarchy_Explicit)173*6dbdd20aSAndroid Build Coastguard Worker TEST(TracedValueTest, Hierarchy_Explicit) {
174*6dbdd20aSAndroid Build Coastguard Worker protozero::HeapBuffered<protos::pbzero::DebugAnnotation> message;
175*6dbdd20aSAndroid Build Coastguard Worker {
176*6dbdd20aSAndroid Build Coastguard Worker auto root_dict =
177*6dbdd20aSAndroid Build Coastguard Worker internal::CreateTracedValueFromProto(message.get()).WriteDictionary();
178*6dbdd20aSAndroid Build Coastguard Worker {
179*6dbdd20aSAndroid Build Coastguard Worker auto array = root_dict.AddItem("a1").WriteArray();
180*6dbdd20aSAndroid Build Coastguard Worker array.AppendItem().WriteInt64(1);
181*6dbdd20aSAndroid Build Coastguard Worker array.AppendItem().WriteBoolean(true);
182*6dbdd20aSAndroid Build Coastguard Worker {
183*6dbdd20aSAndroid Build Coastguard Worker auto dict = array.AppendItem().WriteDictionary();
184*6dbdd20aSAndroid Build Coastguard Worker dict.AddItem("i2").WriteInt64(3);
185*6dbdd20aSAndroid Build Coastguard Worker }
186*6dbdd20aSAndroid Build Coastguard Worker }
187*6dbdd20aSAndroid Build Coastguard Worker root_dict.AddItem("b0").WriteBoolean(true);
188*6dbdd20aSAndroid Build Coastguard Worker root_dict.AddItem("d0").WriteDouble(0.0);
189*6dbdd20aSAndroid Build Coastguard Worker {
190*6dbdd20aSAndroid Build Coastguard Worker auto dict1 = root_dict.AddItem("dict1").WriteDictionary();
191*6dbdd20aSAndroid Build Coastguard Worker {
192*6dbdd20aSAndroid Build Coastguard Worker auto dict2 = dict1.AddItem("dict2").WriteDictionary();
193*6dbdd20aSAndroid Build Coastguard Worker dict2.AddItem("b2").WriteBoolean(false);
194*6dbdd20aSAndroid Build Coastguard Worker }
195*6dbdd20aSAndroid Build Coastguard Worker dict1.AddItem("i1").WriteInt64(2014);
196*6dbdd20aSAndroid Build Coastguard Worker dict1.AddItem("s1").WriteString("foo");
197*6dbdd20aSAndroid Build Coastguard Worker }
198*6dbdd20aSAndroid Build Coastguard Worker root_dict.AddItem("i0").WriteInt64(2014);
199*6dbdd20aSAndroid Build Coastguard Worker root_dict.AddItem("s0").WriteString("foo");
200*6dbdd20aSAndroid Build Coastguard Worker }
201*6dbdd20aSAndroid Build Coastguard Worker
202*6dbdd20aSAndroid Build Coastguard Worker EXPECT_EQ(
203*6dbdd20aSAndroid Build Coastguard Worker "{"
204*6dbdd20aSAndroid Build Coastguard Worker "a1:[1,true,{i2:3}],"
205*6dbdd20aSAndroid Build Coastguard Worker "b0:true,"
206*6dbdd20aSAndroid Build Coastguard Worker "d0:0,"
207*6dbdd20aSAndroid Build Coastguard Worker "dict1:{dict2:{b2:false},i1:2014,s1:foo},"
208*6dbdd20aSAndroid Build Coastguard Worker "i0:2014,"
209*6dbdd20aSAndroid Build Coastguard Worker "s0:foo}",
210*6dbdd20aSAndroid Build Coastguard Worker internal::DebugAnnotationToString(message.SerializeAsString()));
211*6dbdd20aSAndroid Build Coastguard Worker }
212*6dbdd20aSAndroid Build Coastguard Worker
TEST(TracedValueTest,Hierarchy_Short)213*6dbdd20aSAndroid Build Coastguard Worker TEST(TracedValueTest, Hierarchy_Short) {
214*6dbdd20aSAndroid Build Coastguard Worker protozero::HeapBuffered<protos::pbzero::DebugAnnotation> message;
215*6dbdd20aSAndroid Build Coastguard Worker {
216*6dbdd20aSAndroid Build Coastguard Worker auto root_dict =
217*6dbdd20aSAndroid Build Coastguard Worker internal::CreateTracedValueFromProto(message.get()).WriteDictionary();
218*6dbdd20aSAndroid Build Coastguard Worker {
219*6dbdd20aSAndroid Build Coastguard Worker auto array = root_dict.AddArray("a1");
220*6dbdd20aSAndroid Build Coastguard Worker array.Append(1);
221*6dbdd20aSAndroid Build Coastguard Worker array.Append(true);
222*6dbdd20aSAndroid Build Coastguard Worker {
223*6dbdd20aSAndroid Build Coastguard Worker auto dict = array.AppendDictionary();
224*6dbdd20aSAndroid Build Coastguard Worker dict.Add("i2", 3);
225*6dbdd20aSAndroid Build Coastguard Worker }
226*6dbdd20aSAndroid Build Coastguard Worker }
227*6dbdd20aSAndroid Build Coastguard Worker root_dict.Add("b0", true);
228*6dbdd20aSAndroid Build Coastguard Worker root_dict.Add("d0", 0.0);
229*6dbdd20aSAndroid Build Coastguard Worker {
230*6dbdd20aSAndroid Build Coastguard Worker auto dict1 = root_dict.AddDictionary("dict1");
231*6dbdd20aSAndroid Build Coastguard Worker {
232*6dbdd20aSAndroid Build Coastguard Worker auto dict2 = dict1.AddDictionary("dict2");
233*6dbdd20aSAndroid Build Coastguard Worker dict2.Add("b2", false);
234*6dbdd20aSAndroid Build Coastguard Worker }
235*6dbdd20aSAndroid Build Coastguard Worker dict1.Add("i1", 2014);
236*6dbdd20aSAndroid Build Coastguard Worker dict1.Add("s1", "foo");
237*6dbdd20aSAndroid Build Coastguard Worker }
238*6dbdd20aSAndroid Build Coastguard Worker root_dict.Add("i0", 2014);
239*6dbdd20aSAndroid Build Coastguard Worker root_dict.Add("s0", "foo");
240*6dbdd20aSAndroid Build Coastguard Worker }
241*6dbdd20aSAndroid Build Coastguard Worker
242*6dbdd20aSAndroid Build Coastguard Worker EXPECT_EQ(
243*6dbdd20aSAndroid Build Coastguard Worker "{"
244*6dbdd20aSAndroid Build Coastguard Worker "a1:[1,true,{i2:3}],"
245*6dbdd20aSAndroid Build Coastguard Worker "b0:true,"
246*6dbdd20aSAndroid Build Coastguard Worker "d0:0,"
247*6dbdd20aSAndroid Build Coastguard Worker "dict1:{dict2:{b2:false},i1:2014,s1:foo},"
248*6dbdd20aSAndroid Build Coastguard Worker "i0:2014,"
249*6dbdd20aSAndroid Build Coastguard Worker "s0:foo}",
250*6dbdd20aSAndroid Build Coastguard Worker internal::DebugAnnotationToString(message.SerializeAsString()));
251*6dbdd20aSAndroid Build Coastguard Worker }
252*6dbdd20aSAndroid Build Coastguard Worker
253*6dbdd20aSAndroid Build Coastguard Worker namespace {
254*6dbdd20aSAndroid Build Coastguard Worker
255*6dbdd20aSAndroid Build Coastguard Worker class HasWriteIntoTracedValueConvertorMember {
256*6dbdd20aSAndroid Build Coastguard Worker public:
WriteIntoTracedValue(TracedValue context) const257*6dbdd20aSAndroid Build Coastguard Worker void WriteIntoTracedValue(TracedValue context) const {
258*6dbdd20aSAndroid Build Coastguard Worker auto dict = std::move(context).WriteDictionary();
259*6dbdd20aSAndroid Build Coastguard Worker dict.Add("int", 42);
260*6dbdd20aSAndroid Build Coastguard Worker dict.Add("bool", false);
261*6dbdd20aSAndroid Build Coastguard Worker }
262*6dbdd20aSAndroid Build Coastguard Worker };
263*6dbdd20aSAndroid Build Coastguard Worker
264*6dbdd20aSAndroid Build Coastguard Worker class HasWriteIntoTraceConvertorMember {
265*6dbdd20aSAndroid Build Coastguard Worker public:
WriteIntoTrace(TracedValue context) const266*6dbdd20aSAndroid Build Coastguard Worker void WriteIntoTrace(TracedValue context) const {
267*6dbdd20aSAndroid Build Coastguard Worker auto dict = std::move(context).WriteDictionary();
268*6dbdd20aSAndroid Build Coastguard Worker dict.Add("int", 42);
269*6dbdd20aSAndroid Build Coastguard Worker dict.Add("bool", false);
270*6dbdd20aSAndroid Build Coastguard Worker }
271*6dbdd20aSAndroid Build Coastguard Worker };
272*6dbdd20aSAndroid Build Coastguard Worker
273*6dbdd20aSAndroid Build Coastguard Worker class HasExternalWriteIntoTraceConvertor {};
274*6dbdd20aSAndroid Build Coastguard Worker class HasExternalWriteIntoTracedValueConvertor {};
275*6dbdd20aSAndroid Build Coastguard Worker
276*6dbdd20aSAndroid Build Coastguard Worker class HasAllConversionMethods {
277*6dbdd20aSAndroid Build Coastguard Worker public:
WriteIntoTracedValue(TracedValue context) const278*6dbdd20aSAndroid Build Coastguard Worker void WriteIntoTracedValue(TracedValue context) const {
279*6dbdd20aSAndroid Build Coastguard Worker std::move(context).WriteString("T::WriteIntoTracedValue");
280*6dbdd20aSAndroid Build Coastguard Worker }
281*6dbdd20aSAndroid Build Coastguard Worker
operator ()(TracedValue context) const282*6dbdd20aSAndroid Build Coastguard Worker void operator()(TracedValue context) const {
283*6dbdd20aSAndroid Build Coastguard Worker std::move(context).WriteString("T::()");
284*6dbdd20aSAndroid Build Coastguard Worker }
285*6dbdd20aSAndroid Build Coastguard Worker };
286*6dbdd20aSAndroid Build Coastguard Worker
287*6dbdd20aSAndroid Build Coastguard Worker class NoConversions {};
288*6dbdd20aSAndroid Build Coastguard Worker
289*6dbdd20aSAndroid Build Coastguard Worker class HasConstWriteMember {
290*6dbdd20aSAndroid Build Coastguard Worker public:
WriteIntoTracedValue(TracedValue context) const291*6dbdd20aSAndroid Build Coastguard Worker void WriteIntoTracedValue(TracedValue context) const {
292*6dbdd20aSAndroid Build Coastguard Worker std::move(context).WriteString("T::WriteIntoTracedValue const");
293*6dbdd20aSAndroid Build Coastguard Worker }
294*6dbdd20aSAndroid Build Coastguard Worker };
295*6dbdd20aSAndroid Build Coastguard Worker
296*6dbdd20aSAndroid Build Coastguard Worker class HasNonConstWriteMember {
297*6dbdd20aSAndroid Build Coastguard Worker public:
WriteIntoTracedValue(TracedValue context)298*6dbdd20aSAndroid Build Coastguard Worker void WriteIntoTracedValue(TracedValue context) {
299*6dbdd20aSAndroid Build Coastguard Worker std::move(context).WriteString("T::WriteIntoTracedValue");
300*6dbdd20aSAndroid Build Coastguard Worker }
301*6dbdd20aSAndroid Build Coastguard Worker };
302*6dbdd20aSAndroid Build Coastguard Worker
303*6dbdd20aSAndroid Build Coastguard Worker class HasConstAndNonConstWriteMember {
304*6dbdd20aSAndroid Build Coastguard Worker public:
WriteIntoTracedValue(TracedValue context)305*6dbdd20aSAndroid Build Coastguard Worker void WriteIntoTracedValue(TracedValue context) {
306*6dbdd20aSAndroid Build Coastguard Worker std::move(context).WriteString("T::WriteIntoTracedValue");
307*6dbdd20aSAndroid Build Coastguard Worker }
308*6dbdd20aSAndroid Build Coastguard Worker
WriteIntoTracedValue(TracedValue context) const309*6dbdd20aSAndroid Build Coastguard Worker void WriteIntoTracedValue(TracedValue context) const {
310*6dbdd20aSAndroid Build Coastguard Worker std::move(context).WriteString("T::WriteIntoTracedValue const");
311*6dbdd20aSAndroid Build Coastguard Worker }
312*6dbdd20aSAndroid Build Coastguard Worker };
313*6dbdd20aSAndroid Build Coastguard Worker
314*6dbdd20aSAndroid Build Coastguard Worker } // namespace
315*6dbdd20aSAndroid Build Coastguard Worker
316*6dbdd20aSAndroid Build Coastguard Worker template <>
317*6dbdd20aSAndroid Build Coastguard Worker struct TraceFormatTraits<HasExternalWriteIntoTraceConvertor> {
WriteIntoTraceperfetto::TraceFormatTraits318*6dbdd20aSAndroid Build Coastguard Worker static void WriteIntoTrace(TracedValue context,
319*6dbdd20aSAndroid Build Coastguard Worker const HasExternalWriteIntoTraceConvertor&) {
320*6dbdd20aSAndroid Build Coastguard Worker std::move(context).WriteString("TraceFormatTraits::WriteIntoTrace");
321*6dbdd20aSAndroid Build Coastguard Worker }
322*6dbdd20aSAndroid Build Coastguard Worker };
323*6dbdd20aSAndroid Build Coastguard Worker
324*6dbdd20aSAndroid Build Coastguard Worker template <>
325*6dbdd20aSAndroid Build Coastguard Worker struct TraceFormatTraits<HasExternalWriteIntoTracedValueConvertor> {
WriteIntoTracedValueperfetto::TraceFormatTraits326*6dbdd20aSAndroid Build Coastguard Worker static void WriteIntoTracedValue(
327*6dbdd20aSAndroid Build Coastguard Worker TracedValue context,
328*6dbdd20aSAndroid Build Coastguard Worker const HasExternalWriteIntoTracedValueConvertor&) {
329*6dbdd20aSAndroid Build Coastguard Worker std::move(context).WriteString("TraceFormatTraits::WriteIntoTracedValue");
330*6dbdd20aSAndroid Build Coastguard Worker }
331*6dbdd20aSAndroid Build Coastguard Worker };
332*6dbdd20aSAndroid Build Coastguard Worker
333*6dbdd20aSAndroid Build Coastguard Worker template <>
334*6dbdd20aSAndroid Build Coastguard Worker struct TraceFormatTraits<HasAllConversionMethods> {
WriteIntoTracedValueperfetto::TraceFormatTraits335*6dbdd20aSAndroid Build Coastguard Worker static void WriteIntoTracedValue(TracedValue context,
336*6dbdd20aSAndroid Build Coastguard Worker const HasAllConversionMethods&) {
337*6dbdd20aSAndroid Build Coastguard Worker std::move(context).WriteString("TraceFormatTraits::WriteIntoTracedValue");
338*6dbdd20aSAndroid Build Coastguard Worker }
339*6dbdd20aSAndroid Build Coastguard Worker };
340*6dbdd20aSAndroid Build Coastguard Worker
341*6dbdd20aSAndroid Build Coastguard Worker template <typename T>
ToStringWithFallback(T && value,const std::string & fallback)342*6dbdd20aSAndroid Build Coastguard Worker std::string ToStringWithFallback(T&& value, const std::string& fallback) {
343*6dbdd20aSAndroid Build Coastguard Worker protozero::HeapBuffered<protos::pbzero::DebugAnnotation> message;
344*6dbdd20aSAndroid Build Coastguard Worker WriteIntoTracedValueWithFallback(
345*6dbdd20aSAndroid Build Coastguard Worker internal::CreateTracedValueFromProto(message.get()),
346*6dbdd20aSAndroid Build Coastguard Worker std::forward<T>(value), fallback);
347*6dbdd20aSAndroid Build Coastguard Worker return internal::DebugAnnotationToString(message.SerializeAsString());
348*6dbdd20aSAndroid Build Coastguard Worker }
349*6dbdd20aSAndroid Build Coastguard Worker
350*6dbdd20aSAndroid Build Coastguard Worker ASSERT_TYPE_SUPPORTED(HasWriteIntoTraceConvertorMember);
351*6dbdd20aSAndroid Build Coastguard Worker ASSERT_TYPE_SUPPORTED(HasWriteIntoTracedValueConvertorMember);
352*6dbdd20aSAndroid Build Coastguard Worker ASSERT_TYPE_SUPPORTED(HasExternalWriteIntoTraceConvertor);
353*6dbdd20aSAndroid Build Coastguard Worker ASSERT_TYPE_SUPPORTED(HasExternalWriteIntoTracedValueConvertor);
354*6dbdd20aSAndroid Build Coastguard Worker ASSERT_TYPE_SUPPORTED(HasAllConversionMethods);
355*6dbdd20aSAndroid Build Coastguard Worker
356*6dbdd20aSAndroid Build Coastguard Worker ASSERT_TYPE_SUPPORTED(HasConstWriteMember);
357*6dbdd20aSAndroid Build Coastguard Worker ASSERT_TYPE_SUPPORTED(HasConstWriteMember&);
358*6dbdd20aSAndroid Build Coastguard Worker ASSERT_TYPE_SUPPORTED(HasConstWriteMember*);
359*6dbdd20aSAndroid Build Coastguard Worker ASSERT_TYPE_SUPPORTED(std::unique_ptr<HasConstWriteMember>);
360*6dbdd20aSAndroid Build Coastguard Worker ASSERT_TYPE_SUPPORTED(std::vector<HasConstWriteMember>);
361*6dbdd20aSAndroid Build Coastguard Worker ASSERT_TYPE_SUPPORTED(const HasConstWriteMember);
362*6dbdd20aSAndroid Build Coastguard Worker ASSERT_TYPE_SUPPORTED(const HasConstWriteMember&);
363*6dbdd20aSAndroid Build Coastguard Worker ASSERT_TYPE_SUPPORTED(const HasConstWriteMember*);
364*6dbdd20aSAndroid Build Coastguard Worker ASSERT_TYPE_SUPPORTED(std::unique_ptr<const HasConstWriteMember>);
365*6dbdd20aSAndroid Build Coastguard Worker ASSERT_TYPE_SUPPORTED(const std::vector<HasConstWriteMember>);
366*6dbdd20aSAndroid Build Coastguard Worker ASSERT_TYPE_SUPPORTED(std::vector<const HasConstWriteMember*>);
367*6dbdd20aSAndroid Build Coastguard Worker
368*6dbdd20aSAndroid Build Coastguard Worker ASSERT_TYPE_SUPPORTED(HasNonConstWriteMember);
369*6dbdd20aSAndroid Build Coastguard Worker ASSERT_TYPE_SUPPORTED(HasNonConstWriteMember&);
370*6dbdd20aSAndroid Build Coastguard Worker ASSERT_TYPE_SUPPORTED(HasNonConstWriteMember*);
371*6dbdd20aSAndroid Build Coastguard Worker ASSERT_TYPE_SUPPORTED(std::unique_ptr<HasNonConstWriteMember>);
372*6dbdd20aSAndroid Build Coastguard Worker ASSERT_TYPE_SUPPORTED(std::vector<HasNonConstWriteMember>);
373*6dbdd20aSAndroid Build Coastguard Worker ASSERT_TYPE_NOT_SUPPORTED(const HasNonConstWriteMember);
374*6dbdd20aSAndroid Build Coastguard Worker ASSERT_TYPE_NOT_SUPPORTED(const HasNonConstWriteMember&);
375*6dbdd20aSAndroid Build Coastguard Worker ASSERT_TYPE_NOT_SUPPORTED(const HasNonConstWriteMember*);
376*6dbdd20aSAndroid Build Coastguard Worker ASSERT_TYPE_NOT_SUPPORTED(std::unique_ptr<const HasNonConstWriteMember>);
377*6dbdd20aSAndroid Build Coastguard Worker ASSERT_TYPE_NOT_SUPPORTED(const std::vector<HasNonConstWriteMember>);
378*6dbdd20aSAndroid Build Coastguard Worker ASSERT_TYPE_NOT_SUPPORTED(std::vector<const HasNonConstWriteMember*>);
379*6dbdd20aSAndroid Build Coastguard Worker
380*6dbdd20aSAndroid Build Coastguard Worker ASSERT_TYPE_SUPPORTED(HasConstAndNonConstWriteMember);
381*6dbdd20aSAndroid Build Coastguard Worker ASSERT_TYPE_SUPPORTED(HasConstAndNonConstWriteMember&);
382*6dbdd20aSAndroid Build Coastguard Worker ASSERT_TYPE_SUPPORTED(HasConstAndNonConstWriteMember*);
383*6dbdd20aSAndroid Build Coastguard Worker ASSERT_TYPE_SUPPORTED(std::unique_ptr<HasConstAndNonConstWriteMember>);
384*6dbdd20aSAndroid Build Coastguard Worker ASSERT_TYPE_SUPPORTED(const HasConstAndNonConstWriteMember);
385*6dbdd20aSAndroid Build Coastguard Worker ASSERT_TYPE_SUPPORTED(const HasConstAndNonConstWriteMember&);
386*6dbdd20aSAndroid Build Coastguard Worker ASSERT_TYPE_SUPPORTED(const HasConstAndNonConstWriteMember*);
387*6dbdd20aSAndroid Build Coastguard Worker ASSERT_TYPE_SUPPORTED(std::unique_ptr<const HasConstAndNonConstWriteMember*>);
388*6dbdd20aSAndroid Build Coastguard Worker
TEST(TracedValueTest,UserDefinedConvertors)389*6dbdd20aSAndroid Build Coastguard Worker TEST(TracedValueTest, UserDefinedConvertors) {
390*6dbdd20aSAndroid Build Coastguard Worker HasWriteIntoTraceConvertorMember value1;
391*6dbdd20aSAndroid Build Coastguard Worker EXPECT_EQ(TracedValueToString(value1), "{int:42,bool:false}");
392*6dbdd20aSAndroid Build Coastguard Worker EXPECT_EQ(TracedValueToString(&value1), "{int:42,bool:false}");
393*6dbdd20aSAndroid Build Coastguard Worker
394*6dbdd20aSAndroid Build Coastguard Worker HasWriteIntoTracedValueConvertorMember value2;
395*6dbdd20aSAndroid Build Coastguard Worker EXPECT_EQ(TracedValueToString(value2), "{int:42,bool:false}");
396*6dbdd20aSAndroid Build Coastguard Worker EXPECT_EQ(TracedValueToString(&value2), "{int:42,bool:false}");
397*6dbdd20aSAndroid Build Coastguard Worker
398*6dbdd20aSAndroid Build Coastguard Worker HasExternalWriteIntoTracedValueConvertor value3;
399*6dbdd20aSAndroid Build Coastguard Worker EXPECT_EQ(TracedValueToString(value3),
400*6dbdd20aSAndroid Build Coastguard Worker "TraceFormatTraits::WriteIntoTracedValue");
401*6dbdd20aSAndroid Build Coastguard Worker EXPECT_EQ(TracedValueToString(&value3),
402*6dbdd20aSAndroid Build Coastguard Worker "TraceFormatTraits::WriteIntoTracedValue");
403*6dbdd20aSAndroid Build Coastguard Worker
404*6dbdd20aSAndroid Build Coastguard Worker HasExternalWriteIntoTraceConvertor value4;
405*6dbdd20aSAndroid Build Coastguard Worker EXPECT_EQ(TracedValueToString(value4), "TraceFormatTraits::WriteIntoTrace");
406*6dbdd20aSAndroid Build Coastguard Worker EXPECT_EQ(TracedValueToString(&value4), "TraceFormatTraits::WriteIntoTrace");
407*6dbdd20aSAndroid Build Coastguard Worker
408*6dbdd20aSAndroid Build Coastguard Worker HasAllConversionMethods value5;
409*6dbdd20aSAndroid Build Coastguard Worker EXPECT_EQ(TracedValueToString(value5), "T::WriteIntoTracedValue");
410*6dbdd20aSAndroid Build Coastguard Worker EXPECT_EQ(TracedValueToString(&value5), "T::WriteIntoTracedValue");
411*6dbdd20aSAndroid Build Coastguard Worker }
412*6dbdd20aSAndroid Build Coastguard Worker
TEST(TracedValueTest,WriteAsLambda)413*6dbdd20aSAndroid Build Coastguard Worker TEST(TracedValueTest, WriteAsLambda) {
414*6dbdd20aSAndroid Build Coastguard Worker EXPECT_EQ("42", TracedValueToString([&](TracedValue context) {
415*6dbdd20aSAndroid Build Coastguard Worker std::move(context).WriteInt64(42);
416*6dbdd20aSAndroid Build Coastguard Worker }));
417*6dbdd20aSAndroid Build Coastguard Worker }
418*6dbdd20aSAndroid Build Coastguard Worker
419*6dbdd20aSAndroid Build Coastguard Worker #if PERFETTO_DCHECK_IS_ON()
420*6dbdd20aSAndroid Build Coastguard Worker // This death test makes sense only when dchecks are enabled.
TEST(TracedValueTest,FailOnIncorrectUsage)421*6dbdd20aSAndroid Build Coastguard Worker TEST(TracedValueTest, FailOnIncorrectUsage) {
422*6dbdd20aSAndroid Build Coastguard Worker // A new call to AddItem is not allowed before the previous result is
423*6dbdd20aSAndroid Build Coastguard Worker // consumed.
424*6dbdd20aSAndroid Build Coastguard Worker EXPECT_DEATH(
425*6dbdd20aSAndroid Build Coastguard Worker
426*6dbdd20aSAndroid Build Coastguard Worker {
427*6dbdd20aSAndroid Build Coastguard Worker protozero::HeapBuffered<protos::pbzero::DebugAnnotation> message;
428*6dbdd20aSAndroid Build Coastguard Worker auto dict = internal::CreateTracedValueFromProto(message.get())
429*6dbdd20aSAndroid Build Coastguard Worker .WriteDictionary();
430*6dbdd20aSAndroid Build Coastguard Worker auto scope1 = dict.AddItem("key1");
431*6dbdd20aSAndroid Build Coastguard Worker auto scope2 = dict.AddItem("key2");
432*6dbdd20aSAndroid Build Coastguard Worker std::move(scope1).WriteInt64(1);
433*6dbdd20aSAndroid Build Coastguard Worker std::move(scope2).WriteInt64(2);
434*6dbdd20aSAndroid Build Coastguard Worker },
435*6dbdd20aSAndroid Build Coastguard Worker "");
436*6dbdd20aSAndroid Build Coastguard Worker
437*6dbdd20aSAndroid Build Coastguard Worker // A new call to AppendItem is not allowed before the previous result is
438*6dbdd20aSAndroid Build Coastguard Worker // consumed.
439*6dbdd20aSAndroid Build Coastguard Worker EXPECT_DEATH(
440*6dbdd20aSAndroid Build Coastguard Worker {
441*6dbdd20aSAndroid Build Coastguard Worker protozero::HeapBuffered<protos::pbzero::DebugAnnotation> message;
442*6dbdd20aSAndroid Build Coastguard Worker auto array =
443*6dbdd20aSAndroid Build Coastguard Worker internal::CreateTracedValueFromProto(message.get()).WriteArray();
444*6dbdd20aSAndroid Build Coastguard Worker auto scope1 = array.AppendItem();
445*6dbdd20aSAndroid Build Coastguard Worker auto scope2 = array.AppendItem();
446*6dbdd20aSAndroid Build Coastguard Worker std::move(scope1).WriteInt64(1);
447*6dbdd20aSAndroid Build Coastguard Worker std::move(scope2).WriteInt64(2);
448*6dbdd20aSAndroid Build Coastguard Worker },
449*6dbdd20aSAndroid Build Coastguard Worker "");
450*6dbdd20aSAndroid Build Coastguard Worker
451*6dbdd20aSAndroid Build Coastguard Worker // Writing to parent scope is not allowed.
452*6dbdd20aSAndroid Build Coastguard Worker EXPECT_DEATH(
453*6dbdd20aSAndroid Build Coastguard Worker {
454*6dbdd20aSAndroid Build Coastguard Worker protozero::HeapBuffered<protos::pbzero::DebugAnnotation> message;
455*6dbdd20aSAndroid Build Coastguard Worker auto outer_dict = internal::CreateTracedValueFromProto(message.get())
456*6dbdd20aSAndroid Build Coastguard Worker .WriteDictionary();
457*6dbdd20aSAndroid Build Coastguard Worker {
458*6dbdd20aSAndroid Build Coastguard Worker auto inner_dict = outer_dict.AddDictionary("inner");
459*6dbdd20aSAndroid Build Coastguard Worker outer_dict.Add("key", "value");
460*6dbdd20aSAndroid Build Coastguard Worker }
461*6dbdd20aSAndroid Build Coastguard Worker },
462*6dbdd20aSAndroid Build Coastguard Worker "");
463*6dbdd20aSAndroid Build Coastguard Worker }
464*6dbdd20aSAndroid Build Coastguard Worker #endif // PERFETTO_DCHECK_IS_ON()
465*6dbdd20aSAndroid Build Coastguard Worker
TEST(TracedValueTest,PrimitiveTypesSupport)466*6dbdd20aSAndroid Build Coastguard Worker TEST(TracedValueTest, PrimitiveTypesSupport) {
467*6dbdd20aSAndroid Build Coastguard Worker EXPECT_EQ("0x0", TracedValueToString(nullptr));
468*6dbdd20aSAndroid Build Coastguard Worker EXPECT_EQ("0x1", TracedValueToString(reinterpret_cast<void*>(1)));
469*6dbdd20aSAndroid Build Coastguard Worker
470*6dbdd20aSAndroid Build Coastguard Worker const int int_value = 1;
471*6dbdd20aSAndroid Build Coastguard Worker EXPECT_EQ("1", TracedValueToString(int_value));
472*6dbdd20aSAndroid Build Coastguard Worker EXPECT_EQ("1", TracedValueToString(&int_value));
473*6dbdd20aSAndroid Build Coastguard Worker
474*6dbdd20aSAndroid Build Coastguard Worker EXPECT_EQ("1.5", TracedValueToString(1.5));
475*6dbdd20aSAndroid Build Coastguard Worker EXPECT_EQ("true", TracedValueToString(true));
476*6dbdd20aSAndroid Build Coastguard Worker EXPECT_EQ("foo", TracedValueToString("foo"));
477*6dbdd20aSAndroid Build Coastguard Worker EXPECT_EQ("bar", TracedValueToString(std::string("bar")));
478*6dbdd20aSAndroid Build Coastguard Worker }
479*6dbdd20aSAndroid Build Coastguard Worker
TEST(TracedValueTest,UniquePtrSupport)480*6dbdd20aSAndroid Build Coastguard Worker TEST(TracedValueTest, UniquePtrSupport) {
481*6dbdd20aSAndroid Build Coastguard Worker std::unique_ptr<int> value1;
482*6dbdd20aSAndroid Build Coastguard Worker EXPECT_EQ("0x0", TracedValueToString(value1));
483*6dbdd20aSAndroid Build Coastguard Worker
484*6dbdd20aSAndroid Build Coastguard Worker std::unique_ptr<int> value2(new int(4));
485*6dbdd20aSAndroid Build Coastguard Worker EXPECT_EQ("4", TracedValueToString(value2));
486*6dbdd20aSAndroid Build Coastguard Worker }
487*6dbdd20aSAndroid Build Coastguard Worker
488*6dbdd20aSAndroid Build Coastguard Worker namespace {
489*6dbdd20aSAndroid Build Coastguard Worker
490*6dbdd20aSAndroid Build Coastguard Worker enum OldStyleEnum { kFoo, kBar };
491*6dbdd20aSAndroid Build Coastguard Worker
492*6dbdd20aSAndroid Build Coastguard Worker enum class NewStyleEnum { kValue1, kValue2 };
493*6dbdd20aSAndroid Build Coastguard Worker
494*6dbdd20aSAndroid Build Coastguard Worker enum class EnumWithPrettyPrint { kValue1, kValue2 };
495*6dbdd20aSAndroid Build Coastguard Worker
496*6dbdd20aSAndroid Build Coastguard Worker } // namespace
497*6dbdd20aSAndroid Build Coastguard Worker
498*6dbdd20aSAndroid Build Coastguard Worker template <>
499*6dbdd20aSAndroid Build Coastguard Worker struct TraceFormatTraits<EnumWithPrettyPrint> {
WriteIntoTracedValueperfetto::TraceFormatTraits500*6dbdd20aSAndroid Build Coastguard Worker static void WriteIntoTracedValue(TracedValue context,
501*6dbdd20aSAndroid Build Coastguard Worker EnumWithPrettyPrint value) {
502*6dbdd20aSAndroid Build Coastguard Worker switch (value) {
503*6dbdd20aSAndroid Build Coastguard Worker case EnumWithPrettyPrint::kValue1:
504*6dbdd20aSAndroid Build Coastguard Worker std::move(context).WriteString("value1");
505*6dbdd20aSAndroid Build Coastguard Worker return;
506*6dbdd20aSAndroid Build Coastguard Worker case EnumWithPrettyPrint::kValue2:
507*6dbdd20aSAndroid Build Coastguard Worker std::move(context).WriteString("value2");
508*6dbdd20aSAndroid Build Coastguard Worker return;
509*6dbdd20aSAndroid Build Coastguard Worker }
510*6dbdd20aSAndroid Build Coastguard Worker }
511*6dbdd20aSAndroid Build Coastguard Worker };
512*6dbdd20aSAndroid Build Coastguard Worker
TEST(TracedValueTest,EnumSupport)513*6dbdd20aSAndroid Build Coastguard Worker TEST(TracedValueTest, EnumSupport) {
514*6dbdd20aSAndroid Build Coastguard Worker EXPECT_EQ(TracedValueToString(kFoo), "0");
515*6dbdd20aSAndroid Build Coastguard Worker EXPECT_EQ(TracedValueToString(NewStyleEnum::kValue2), "1");
516*6dbdd20aSAndroid Build Coastguard Worker EXPECT_EQ(TracedValueToString(EnumWithPrettyPrint::kValue2), "value2");
517*6dbdd20aSAndroid Build Coastguard Worker }
518*6dbdd20aSAndroid Build Coastguard Worker
TEST(TracedValueTest,ContainerSupport)519*6dbdd20aSAndroid Build Coastguard Worker TEST(TracedValueTest, ContainerSupport) {
520*6dbdd20aSAndroid Build Coastguard Worker std::vector<std::list<int>> value1{{1, 2}, {3, 4}};
521*6dbdd20aSAndroid Build Coastguard Worker EXPECT_EQ("[[1,2],[3,4]]", TracedValueToString(value1));
522*6dbdd20aSAndroid Build Coastguard Worker }
523*6dbdd20aSAndroid Build Coastguard Worker
TEST(TracedValueTest,WriteWithFallback)524*6dbdd20aSAndroid Build Coastguard Worker TEST(TracedValueTest, WriteWithFallback) {
525*6dbdd20aSAndroid Build Coastguard Worker EXPECT_EQ("1", ToStringWithFallback(1, "fallback"));
526*6dbdd20aSAndroid Build Coastguard Worker EXPECT_EQ("true", ToStringWithFallback(true, "fallback"));
527*6dbdd20aSAndroid Build Coastguard Worker EXPECT_EQ("fallback", ToStringWithFallback(NonSupportedType(), "fallback"));
528*6dbdd20aSAndroid Build Coastguard Worker }
529*6dbdd20aSAndroid Build Coastguard Worker
TEST(TracedValueTest,ConstAndNotConstSupport)530*6dbdd20aSAndroid Build Coastguard Worker TEST(TracedValueTest, ConstAndNotConstSupport) {
531*6dbdd20aSAndroid Build Coastguard Worker {
532*6dbdd20aSAndroid Build Coastguard Worker HasConstWriteMember value;
533*6dbdd20aSAndroid Build Coastguard Worker EXPECT_EQ("T::WriteIntoTracedValue const", TracedValueToString(value));
534*6dbdd20aSAndroid Build Coastguard Worker EXPECT_EQ("T::WriteIntoTracedValue const", TracedValueToString(&value));
535*6dbdd20aSAndroid Build Coastguard Worker
536*6dbdd20aSAndroid Build Coastguard Worker std::vector<HasConstWriteMember> arr(1, value);
537*6dbdd20aSAndroid Build Coastguard Worker EXPECT_EQ("[T::WriteIntoTracedValue const]", TracedValueToString(arr));
538*6dbdd20aSAndroid Build Coastguard Worker }
539*6dbdd20aSAndroid Build Coastguard Worker
540*6dbdd20aSAndroid Build Coastguard Worker {
541*6dbdd20aSAndroid Build Coastguard Worker const HasConstWriteMember value;
542*6dbdd20aSAndroid Build Coastguard Worker EXPECT_EQ("T::WriteIntoTracedValue const", TracedValueToString(value));
543*6dbdd20aSAndroid Build Coastguard Worker EXPECT_EQ("T::WriteIntoTracedValue const", TracedValueToString(&value));
544*6dbdd20aSAndroid Build Coastguard Worker
545*6dbdd20aSAndroid Build Coastguard Worker const std::vector<HasConstWriteMember> arr(1, value);
546*6dbdd20aSAndroid Build Coastguard Worker EXPECT_EQ("[T::WriteIntoTracedValue const]", TracedValueToString(arr));
547*6dbdd20aSAndroid Build Coastguard Worker }
548*6dbdd20aSAndroid Build Coastguard Worker
549*6dbdd20aSAndroid Build Coastguard Worker {
550*6dbdd20aSAndroid Build Coastguard Worker HasNonConstWriteMember value;
551*6dbdd20aSAndroid Build Coastguard Worker EXPECT_EQ("T::WriteIntoTracedValue", TracedValueToString(value));
552*6dbdd20aSAndroid Build Coastguard Worker EXPECT_EQ("T::WriteIntoTracedValue", TracedValueToString(&value));
553*6dbdd20aSAndroid Build Coastguard Worker
554*6dbdd20aSAndroid Build Coastguard Worker std::vector<HasNonConstWriteMember> arr(1, value);
555*6dbdd20aSAndroid Build Coastguard Worker EXPECT_EQ("[T::WriteIntoTracedValue]", TracedValueToString(arr));
556*6dbdd20aSAndroid Build Coastguard Worker }
557*6dbdd20aSAndroid Build Coastguard Worker
558*6dbdd20aSAndroid Build Coastguard Worker {
559*6dbdd20aSAndroid Build Coastguard Worker HasConstAndNonConstWriteMember value;
560*6dbdd20aSAndroid Build Coastguard Worker EXPECT_EQ("T::WriteIntoTracedValue", TracedValueToString(value));
561*6dbdd20aSAndroid Build Coastguard Worker EXPECT_EQ("T::WriteIntoTracedValue", TracedValueToString(&value));
562*6dbdd20aSAndroid Build Coastguard Worker
563*6dbdd20aSAndroid Build Coastguard Worker std::vector<HasConstAndNonConstWriteMember> arr(1, value);
564*6dbdd20aSAndroid Build Coastguard Worker EXPECT_EQ("[T::WriteIntoTracedValue]", TracedValueToString(arr));
565*6dbdd20aSAndroid Build Coastguard Worker }
566*6dbdd20aSAndroid Build Coastguard Worker
567*6dbdd20aSAndroid Build Coastguard Worker {
568*6dbdd20aSAndroid Build Coastguard Worker const HasConstAndNonConstWriteMember value;
569*6dbdd20aSAndroid Build Coastguard Worker EXPECT_EQ("T::WriteIntoTracedValue const", TracedValueToString(value));
570*6dbdd20aSAndroid Build Coastguard Worker EXPECT_EQ("T::WriteIntoTracedValue const", TracedValueToString(&value));
571*6dbdd20aSAndroid Build Coastguard Worker
572*6dbdd20aSAndroid Build Coastguard Worker const std::vector<HasConstAndNonConstWriteMember> arr(1, value);
573*6dbdd20aSAndroid Build Coastguard Worker EXPECT_EQ("[T::WriteIntoTracedValue const]", TracedValueToString(arr));
574*6dbdd20aSAndroid Build Coastguard Worker }
575*6dbdd20aSAndroid Build Coastguard Worker }
576*6dbdd20aSAndroid Build Coastguard Worker
577*6dbdd20aSAndroid Build Coastguard Worker // Note: interning of the dictionary keys is not implemented yet, so there is no
578*6dbdd20aSAndroid Build Coastguard Worker // difference in behaviour for StaticString and DynamicString yet.
TEST(TracedValueTest,DictionaryKeys)579*6dbdd20aSAndroid Build Coastguard Worker TEST(TracedValueTest, DictionaryKeys) {
580*6dbdd20aSAndroid Build Coastguard Worker EXPECT_EQ("{literal:1}", TracedValueToString([&](TracedValue context) {
581*6dbdd20aSAndroid Build Coastguard Worker auto dict = std::move(context).WriteDictionary();
582*6dbdd20aSAndroid Build Coastguard Worker dict.Add("literal", 1);
583*6dbdd20aSAndroid Build Coastguard Worker }));
584*6dbdd20aSAndroid Build Coastguard Worker
585*6dbdd20aSAndroid Build Coastguard Worker EXPECT_EQ("{static:1}", TracedValueToString([&](TracedValue context) {
586*6dbdd20aSAndroid Build Coastguard Worker auto dict = std::move(context).WriteDictionary();
587*6dbdd20aSAndroid Build Coastguard Worker const char* key = "static";
588*6dbdd20aSAndroid Build Coastguard Worker dict.Add(StaticString{key}, 1);
589*6dbdd20aSAndroid Build Coastguard Worker }));
590*6dbdd20aSAndroid Build Coastguard Worker
591*6dbdd20aSAndroid Build Coastguard Worker EXPECT_EQ("{dynamic:1}", TracedValueToString([&](TracedValue context) {
592*6dbdd20aSAndroid Build Coastguard Worker auto dict = std::move(context).WriteDictionary();
593*6dbdd20aSAndroid Build Coastguard Worker std::string key = "dynamic";
594*6dbdd20aSAndroid Build Coastguard Worker dict.Add(DynamicString{key.data()}, 1);
595*6dbdd20aSAndroid Build Coastguard Worker }));
596*6dbdd20aSAndroid Build Coastguard Worker
597*6dbdd20aSAndroid Build Coastguard Worker EXPECT_EQ("{dynamic:1}", TracedValueToString([&](TracedValue context) {
598*6dbdd20aSAndroid Build Coastguard Worker auto dict = std::move(context).WriteDictionary();
599*6dbdd20aSAndroid Build Coastguard Worker std::string key = "dynamic";
600*6dbdd20aSAndroid Build Coastguard Worker dict.Add(DynamicString{key.data(), key.length()}, 1);
601*6dbdd20aSAndroid Build Coastguard Worker }));
602*6dbdd20aSAndroid Build Coastguard Worker
603*6dbdd20aSAndroid Build Coastguard Worker EXPECT_EQ("{dynamic:1}", TracedValueToString([&](TracedValue context) {
604*6dbdd20aSAndroid Build Coastguard Worker auto dict = std::move(context).WriteDictionary();
605*6dbdd20aSAndroid Build Coastguard Worker std::string key = "dynamic";
606*6dbdd20aSAndroid Build Coastguard Worker dict.Add(DynamicString{key}, 1);
607*6dbdd20aSAndroid Build Coastguard Worker }));
608*6dbdd20aSAndroid Build Coastguard Worker }
609*6dbdd20aSAndroid Build Coastguard Worker
TEST(TracedValueTest,EmptyDict)610*6dbdd20aSAndroid Build Coastguard Worker TEST(TracedValueTest, EmptyDict) {
611*6dbdd20aSAndroid Build Coastguard Worker EXPECT_EQ("{}", TracedValueToString([&](TracedValue context) {
612*6dbdd20aSAndroid Build Coastguard Worker auto dict = std::move(context).WriteDictionary();
613*6dbdd20aSAndroid Build Coastguard Worker }));
614*6dbdd20aSAndroid Build Coastguard Worker }
615*6dbdd20aSAndroid Build Coastguard Worker
TEST(TracedValueTest,EmptyArray)616*6dbdd20aSAndroid Build Coastguard Worker TEST(TracedValueTest, EmptyArray) {
617*6dbdd20aSAndroid Build Coastguard Worker // For now we do not distinguish between empty arrays and empty dicts on proto
618*6dbdd20aSAndroid Build Coastguard Worker // level as trace processor ignores them anyway.
619*6dbdd20aSAndroid Build Coastguard Worker EXPECT_EQ("{}", TracedValueToString([&](TracedValue context) {
620*6dbdd20aSAndroid Build Coastguard Worker auto array = std::move(context).WriteArray();
621*6dbdd20aSAndroid Build Coastguard Worker }));
622*6dbdd20aSAndroid Build Coastguard Worker }
623*6dbdd20aSAndroid Build Coastguard Worker
TEST(TracedValueTest,WriteTypedProto_Explicit)624*6dbdd20aSAndroid Build Coastguard Worker TEST(TracedValueTest, WriteTypedProto_Explicit) {
625*6dbdd20aSAndroid Build Coastguard Worker protozero::HeapBuffered<protos::pbzero::DebugAnnotation> message;
626*6dbdd20aSAndroid Build Coastguard Worker WriteIntoTracedValue(
627*6dbdd20aSAndroid Build Coastguard Worker internal::CreateTracedValueFromProto(message.get()),
628*6dbdd20aSAndroid Build Coastguard Worker [](perfetto::TracedValue context) {
629*6dbdd20aSAndroid Build Coastguard Worker perfetto::TracedProto<protos::pbzero::TestEvent::TestPayload> proto =
630*6dbdd20aSAndroid Build Coastguard Worker std::move(context)
631*6dbdd20aSAndroid Build Coastguard Worker .WriteProto<protos::pbzero::TestEvent::TestPayload>();
632*6dbdd20aSAndroid Build Coastguard Worker proto->set_single_string("payload");
633*6dbdd20aSAndroid Build Coastguard Worker });
634*6dbdd20aSAndroid Build Coastguard Worker
635*6dbdd20aSAndroid Build Coastguard Worker protos::DebugAnnotation annotation;
636*6dbdd20aSAndroid Build Coastguard Worker annotation.ParseFromString(message.SerializeAsString());
637*6dbdd20aSAndroid Build Coastguard Worker EXPECT_EQ(annotation.proto_type_name(),
638*6dbdd20aSAndroid Build Coastguard Worker ".perfetto.protos.TestEvent.TestPayload");
639*6dbdd20aSAndroid Build Coastguard Worker
640*6dbdd20aSAndroid Build Coastguard Worker protos::TestEvent::TestPayload payload;
641*6dbdd20aSAndroid Build Coastguard Worker payload.ParseFromString(annotation.proto_value());
642*6dbdd20aSAndroid Build Coastguard Worker EXPECT_EQ(payload.single_string(), "payload");
643*6dbdd20aSAndroid Build Coastguard Worker }
644*6dbdd20aSAndroid Build Coastguard Worker
TEST(TracedValueTest,WriteTypedProto_Implicit)645*6dbdd20aSAndroid Build Coastguard Worker TEST(TracedValueTest, WriteTypedProto_Implicit) {
646*6dbdd20aSAndroid Build Coastguard Worker protozero::HeapBuffered<protos::pbzero::DebugAnnotation> message;
647*6dbdd20aSAndroid Build Coastguard Worker WriteIntoTracedValue(
648*6dbdd20aSAndroid Build Coastguard Worker internal::CreateTracedValueFromProto(message.get()),
649*6dbdd20aSAndroid Build Coastguard Worker [](perfetto::TracedProto<protos::pbzero::TestEvent::TestPayload> proto) {
650*6dbdd20aSAndroid Build Coastguard Worker proto->set_single_string("payload");
651*6dbdd20aSAndroid Build Coastguard Worker });
652*6dbdd20aSAndroid Build Coastguard Worker
653*6dbdd20aSAndroid Build Coastguard Worker protos::DebugAnnotation annotation;
654*6dbdd20aSAndroid Build Coastguard Worker annotation.ParseFromString(message.SerializeAsString());
655*6dbdd20aSAndroid Build Coastguard Worker EXPECT_EQ(annotation.proto_type_name(),
656*6dbdd20aSAndroid Build Coastguard Worker ".perfetto.protos.TestEvent.TestPayload");
657*6dbdd20aSAndroid Build Coastguard Worker
658*6dbdd20aSAndroid Build Coastguard Worker protos::TestEvent::TestPayload payload;
659*6dbdd20aSAndroid Build Coastguard Worker payload.ParseFromString(annotation.proto_value());
660*6dbdd20aSAndroid Build Coastguard Worker EXPECT_EQ(payload.single_string(), "payload");
661*6dbdd20aSAndroid Build Coastguard Worker }
662*6dbdd20aSAndroid Build Coastguard Worker
TEST(TracedValueTest,ImplicitTracedDictionary)663*6dbdd20aSAndroid Build Coastguard Worker TEST(TracedValueTest, ImplicitTracedDictionary) {
664*6dbdd20aSAndroid Build Coastguard Worker EXPECT_EQ("{key:value}", TracedValueToString([&](TracedDictionary dict) {
665*6dbdd20aSAndroid Build Coastguard Worker dict.Add("key", "value");
666*6dbdd20aSAndroid Build Coastguard Worker }));
667*6dbdd20aSAndroid Build Coastguard Worker }
668*6dbdd20aSAndroid Build Coastguard Worker
TEST(TracedValueTest,ImplicitTracedArray)669*6dbdd20aSAndroid Build Coastguard Worker TEST(TracedValueTest, ImplicitTracedArray) {
670*6dbdd20aSAndroid Build Coastguard Worker EXPECT_EQ("[1]",
671*6dbdd20aSAndroid Build Coastguard Worker TracedValueToString([&](TracedArray array) { array.Append(1); }));
672*6dbdd20aSAndroid Build Coastguard Worker }
673*6dbdd20aSAndroid Build Coastguard Worker
TEST(TracedValueTest,TracedProtoInDict)674*6dbdd20aSAndroid Build Coastguard Worker TEST(TracedValueTest, TracedProtoInDict) {
675*6dbdd20aSAndroid Build Coastguard Worker struct Foo {
676*6dbdd20aSAndroid Build Coastguard Worker void WriteIntoTrace(
677*6dbdd20aSAndroid Build Coastguard Worker perfetto::TracedProto<protos::pbzero::TestEvent::TestPayload> message) {
678*6dbdd20aSAndroid Build Coastguard Worker message->set_single_int(42);
679*6dbdd20aSAndroid Build Coastguard Worker }
680*6dbdd20aSAndroid Build Coastguard Worker };
681*6dbdd20aSAndroid Build Coastguard Worker Foo foo;
682*6dbdd20aSAndroid Build Coastguard Worker protozero::HeapBuffered<protos::pbzero::DebugAnnotation> message;
683*6dbdd20aSAndroid Build Coastguard Worker WriteIntoTracedValue(internal::CreateTracedValueFromProto(message.get()),
684*6dbdd20aSAndroid Build Coastguard Worker [&](TracedDictionary dict) { dict.Add("foo", foo); });
685*6dbdd20aSAndroid Build Coastguard Worker protos::DebugAnnotation annotation;
686*6dbdd20aSAndroid Build Coastguard Worker annotation.ParseFromString(message.SerializeAsString());
687*6dbdd20aSAndroid Build Coastguard Worker EXPECT_EQ(annotation.dict_entries_size(), 1);
688*6dbdd20aSAndroid Build Coastguard Worker EXPECT_EQ(annotation.dict_entries(0).name(), "foo");
689*6dbdd20aSAndroid Build Coastguard Worker EXPECT_EQ(annotation.dict_entries(0).proto_type_name(),
690*6dbdd20aSAndroid Build Coastguard Worker ".perfetto.protos.TestEvent.TestPayload");
691*6dbdd20aSAndroid Build Coastguard Worker
692*6dbdd20aSAndroid Build Coastguard Worker protos::TestEvent::TestPayload payload;
693*6dbdd20aSAndroid Build Coastguard Worker payload.ParseFromString(annotation.dict_entries(0).proto_value());
694*6dbdd20aSAndroid Build Coastguard Worker EXPECT_EQ(payload.single_int(), 42);
695*6dbdd20aSAndroid Build Coastguard Worker }
696*6dbdd20aSAndroid Build Coastguard Worker
TEST(TracedValueTest,PointerToTracedProtoInDict)697*6dbdd20aSAndroid Build Coastguard Worker TEST(TracedValueTest, PointerToTracedProtoInDict) {
698*6dbdd20aSAndroid Build Coastguard Worker struct Foo {
699*6dbdd20aSAndroid Build Coastguard Worker void WriteIntoTrace(
700*6dbdd20aSAndroid Build Coastguard Worker perfetto::TracedProto<protos::pbzero::TestEvent::TestPayload> message) {
701*6dbdd20aSAndroid Build Coastguard Worker message->set_single_int(42);
702*6dbdd20aSAndroid Build Coastguard Worker }
703*6dbdd20aSAndroid Build Coastguard Worker };
704*6dbdd20aSAndroid Build Coastguard Worker Foo foo;
705*6dbdd20aSAndroid Build Coastguard Worker protozero::HeapBuffered<protos::pbzero::DebugAnnotation> message;
706*6dbdd20aSAndroid Build Coastguard Worker WriteIntoTracedValue(internal::CreateTracedValueFromProto(message.get()),
707*6dbdd20aSAndroid Build Coastguard Worker [&](TracedDictionary dict) { dict.Add("foo", &foo); });
708*6dbdd20aSAndroid Build Coastguard Worker protos::DebugAnnotation annotation;
709*6dbdd20aSAndroid Build Coastguard Worker annotation.ParseFromString(message.SerializeAsString());
710*6dbdd20aSAndroid Build Coastguard Worker EXPECT_EQ(annotation.dict_entries_size(), 1);
711*6dbdd20aSAndroid Build Coastguard Worker EXPECT_EQ(annotation.dict_entries(0).name(), "foo");
712*6dbdd20aSAndroid Build Coastguard Worker EXPECT_EQ(annotation.dict_entries(0).proto_type_name(),
713*6dbdd20aSAndroid Build Coastguard Worker ".perfetto.protos.TestEvent.TestPayload");
714*6dbdd20aSAndroid Build Coastguard Worker
715*6dbdd20aSAndroid Build Coastguard Worker protos::TestEvent::TestPayload payload;
716*6dbdd20aSAndroid Build Coastguard Worker payload.ParseFromString(annotation.dict_entries(0).proto_value());
717*6dbdd20aSAndroid Build Coastguard Worker EXPECT_EQ(payload.single_int(), 42);
718*6dbdd20aSAndroid Build Coastguard Worker }
719*6dbdd20aSAndroid Build Coastguard Worker
TEST(TracedValueTest,UniquePointerToTracedProtoInDict)720*6dbdd20aSAndroid Build Coastguard Worker TEST(TracedValueTest, UniquePointerToTracedProtoInDict) {
721*6dbdd20aSAndroid Build Coastguard Worker struct Foo {
722*6dbdd20aSAndroid Build Coastguard Worker void WriteIntoTrace(
723*6dbdd20aSAndroid Build Coastguard Worker perfetto::TracedProto<protos::pbzero::TestEvent::TestPayload> message) {
724*6dbdd20aSAndroid Build Coastguard Worker message->set_single_int(42);
725*6dbdd20aSAndroid Build Coastguard Worker }
726*6dbdd20aSAndroid Build Coastguard Worker };
727*6dbdd20aSAndroid Build Coastguard Worker std::unique_ptr<Foo> foo(new Foo());
728*6dbdd20aSAndroid Build Coastguard Worker protozero::HeapBuffered<protos::pbzero::DebugAnnotation> message;
729*6dbdd20aSAndroid Build Coastguard Worker WriteIntoTracedValue(internal::CreateTracedValueFromProto(message.get()),
730*6dbdd20aSAndroid Build Coastguard Worker [&](TracedDictionary dict) { dict.Add("foo", foo); });
731*6dbdd20aSAndroid Build Coastguard Worker protos::DebugAnnotation annotation;
732*6dbdd20aSAndroid Build Coastguard Worker annotation.ParseFromString(message.SerializeAsString());
733*6dbdd20aSAndroid Build Coastguard Worker EXPECT_EQ(annotation.dict_entries_size(), 1);
734*6dbdd20aSAndroid Build Coastguard Worker EXPECT_EQ(annotation.dict_entries(0).name(), "foo");
735*6dbdd20aSAndroid Build Coastguard Worker EXPECT_EQ(annotation.dict_entries(0).proto_type_name(),
736*6dbdd20aSAndroid Build Coastguard Worker ".perfetto.protos.TestEvent.TestPayload");
737*6dbdd20aSAndroid Build Coastguard Worker
738*6dbdd20aSAndroid Build Coastguard Worker protos::TestEvent::TestPayload payload;
739*6dbdd20aSAndroid Build Coastguard Worker payload.ParseFromString(annotation.dict_entries(0).proto_value());
740*6dbdd20aSAndroid Build Coastguard Worker EXPECT_EQ(payload.single_int(), 42);
741*6dbdd20aSAndroid Build Coastguard Worker }
742*6dbdd20aSAndroid Build Coastguard Worker
743*6dbdd20aSAndroid Build Coastguard Worker } // namespace perfetto
744