xref: /aosp_15_r20/external/perfetto/src/profiling/deobfuscator_unittest.cc (revision 6dbdd20afdafa5e3ca9b8809fa73465d530080dc)
1*6dbdd20aSAndroid Build Coastguard Worker /*
2*6dbdd20aSAndroid Build Coastguard Worker  * Copyright (C) 2019 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 "src/profiling/deobfuscator.h"
18*6dbdd20aSAndroid Build Coastguard Worker 
19*6dbdd20aSAndroid Build Coastguard Worker #include "test/gtest_and_gmock.h"
20*6dbdd20aSAndroid Build Coastguard Worker 
21*6dbdd20aSAndroid Build Coastguard Worker namespace perfetto {
22*6dbdd20aSAndroid Build Coastguard Worker namespace profiling {
23*6dbdd20aSAndroid Build Coastguard Worker 
24*6dbdd20aSAndroid Build Coastguard Worker bool operator==(const ObfuscatedClass& a, const ObfuscatedClass& b);
operator ==(const ObfuscatedClass & a,const ObfuscatedClass & b)25*6dbdd20aSAndroid Build Coastguard Worker bool operator==(const ObfuscatedClass& a, const ObfuscatedClass& b) {
26*6dbdd20aSAndroid Build Coastguard Worker   return a.deobfuscated_name() == b.deobfuscated_name() &&
27*6dbdd20aSAndroid Build Coastguard Worker          a.deobfuscated_fields() == b.deobfuscated_fields() &&
28*6dbdd20aSAndroid Build Coastguard Worker          a.deobfuscated_methods() == b.deobfuscated_methods();
29*6dbdd20aSAndroid Build Coastguard Worker }
30*6dbdd20aSAndroid Build Coastguard Worker 
31*6dbdd20aSAndroid Build Coastguard Worker namespace {
32*6dbdd20aSAndroid Build Coastguard Worker 
33*6dbdd20aSAndroid Build Coastguard Worker using ::testing::_;
34*6dbdd20aSAndroid Build Coastguard Worker using ::testing::ElementsAre;
35*6dbdd20aSAndroid Build Coastguard Worker using ::testing::Eq;
36*6dbdd20aSAndroid Build Coastguard Worker using ::testing::Pair;
37*6dbdd20aSAndroid Build Coastguard Worker 
TEST(ProguardParserTest,ReadClass)38*6dbdd20aSAndroid Build Coastguard Worker TEST(ProguardParserTest, ReadClass) {
39*6dbdd20aSAndroid Build Coastguard Worker   ProguardParser p;
40*6dbdd20aSAndroid Build Coastguard Worker   ASSERT_TRUE(
41*6dbdd20aSAndroid Build Coastguard Worker       p.AddLine(
42*6dbdd20aSAndroid Build Coastguard Worker            "android.arch.core.executor.ArchTaskExecutor -> android.arch.a.a.a:")
43*6dbdd20aSAndroid Build Coastguard Worker           .ok());
44*6dbdd20aSAndroid Build Coastguard Worker   ASSERT_THAT(p.ConsumeMapping(),
45*6dbdd20aSAndroid Build Coastguard Worker               ElementsAre(std::pair<std::string, ObfuscatedClass>(
46*6dbdd20aSAndroid Build Coastguard Worker                   "android.arch.a.a.a",
47*6dbdd20aSAndroid Build Coastguard Worker                   "android.arch.core.executor.ArchTaskExecutor")));
48*6dbdd20aSAndroid Build Coastguard Worker }
49*6dbdd20aSAndroid Build Coastguard Worker 
TEST(ProguardParserTest,MissingColon)50*6dbdd20aSAndroid Build Coastguard Worker TEST(ProguardParserTest, MissingColon) {
51*6dbdd20aSAndroid Build Coastguard Worker   ProguardParser p;
52*6dbdd20aSAndroid Build Coastguard Worker   ASSERT_FALSE(
53*6dbdd20aSAndroid Build Coastguard Worker       p.AddLine(
54*6dbdd20aSAndroid Build Coastguard Worker            "android.arch.core.executor.ArchTaskExecutor -> android.arch.a.a.a")
55*6dbdd20aSAndroid Build Coastguard Worker           .ok());
56*6dbdd20aSAndroid Build Coastguard Worker }
57*6dbdd20aSAndroid Build Coastguard Worker 
TEST(ProguardParserTest,UnexpectedMember)58*6dbdd20aSAndroid Build Coastguard Worker TEST(ProguardParserTest, UnexpectedMember) {
59*6dbdd20aSAndroid Build Coastguard Worker   ProguardParser p;
60*6dbdd20aSAndroid Build Coastguard Worker   ASSERT_FALSE(
61*6dbdd20aSAndroid Build Coastguard Worker       p.AddLine("    android.arch.core.executor.TaskExecutor mDelegate -> b")
62*6dbdd20aSAndroid Build Coastguard Worker           .ok());
63*6dbdd20aSAndroid Build Coastguard Worker }
64*6dbdd20aSAndroid Build Coastguard Worker 
TEST(ProguardParserTest,Member)65*6dbdd20aSAndroid Build Coastguard Worker TEST(ProguardParserTest, Member) {
66*6dbdd20aSAndroid Build Coastguard Worker   ProguardParser p;
67*6dbdd20aSAndroid Build Coastguard Worker   ASSERT_TRUE(
68*6dbdd20aSAndroid Build Coastguard Worker       p.AddLine(
69*6dbdd20aSAndroid Build Coastguard Worker            "android.arch.core.executor.ArchTaskExecutor -> android.arch.a.a.a:")
70*6dbdd20aSAndroid Build Coastguard Worker           .ok());
71*6dbdd20aSAndroid Build Coastguard Worker   ASSERT_TRUE(
72*6dbdd20aSAndroid Build Coastguard Worker       p.AddLine("    android.arch.core.executor.TaskExecutor mDelegate -> b")
73*6dbdd20aSAndroid Build Coastguard Worker           .ok());
74*6dbdd20aSAndroid Build Coastguard Worker   EXPECT_THAT(
75*6dbdd20aSAndroid Build Coastguard Worker       p.ConsumeMapping(),
76*6dbdd20aSAndroid Build Coastguard Worker       ElementsAre(std::pair<std::string, ObfuscatedClass>(
77*6dbdd20aSAndroid Build Coastguard Worker           "android.arch.a.a.a", {"android.arch.core.executor.ArchTaskExecutor",
78*6dbdd20aSAndroid Build Coastguard Worker                                  {{"b", "mDelegate"}},
79*6dbdd20aSAndroid Build Coastguard Worker                                  {}})));
80*6dbdd20aSAndroid Build Coastguard Worker }
81*6dbdd20aSAndroid Build Coastguard Worker 
TEST(ProguardParserTest,Method)82*6dbdd20aSAndroid Build Coastguard Worker TEST(ProguardParserTest, Method) {
83*6dbdd20aSAndroid Build Coastguard Worker   ProguardParser p;
84*6dbdd20aSAndroid Build Coastguard Worker   ASSERT_TRUE(
85*6dbdd20aSAndroid Build Coastguard Worker       p.AddLine(
86*6dbdd20aSAndroid Build Coastguard Worker            "android.arch.core.executor.ArchTaskExecutor -> android.arch.a.a.a:")
87*6dbdd20aSAndroid Build Coastguard Worker           .ok());
88*6dbdd20aSAndroid Build Coastguard Worker   ASSERT_TRUE(p.AddLine("    15:15:boolean isMainThread():116:116 -> b").ok());
89*6dbdd20aSAndroid Build Coastguard Worker   auto mapping = p.ConsumeMapping();
90*6dbdd20aSAndroid Build Coastguard Worker   ASSERT_THAT(mapping, ElementsAre(Pair("android.arch.a.a.a", _)));
91*6dbdd20aSAndroid Build Coastguard Worker   EXPECT_THAT(
92*6dbdd20aSAndroid Build Coastguard Worker       mapping.find("android.arch.a.a.a")->second.deobfuscated_methods(),
93*6dbdd20aSAndroid Build Coastguard Worker       ElementsAre(Pair(
94*6dbdd20aSAndroid Build Coastguard Worker           "b", "android.arch.core.executor.ArchTaskExecutor.isMainThread")));
95*6dbdd20aSAndroid Build Coastguard Worker }
96*6dbdd20aSAndroid Build Coastguard Worker 
TEST(ProguardParserTest,AmbiguousMethodSameCls)97*6dbdd20aSAndroid Build Coastguard Worker TEST(ProguardParserTest, AmbiguousMethodSameCls) {
98*6dbdd20aSAndroid Build Coastguard Worker   ProguardParser p;
99*6dbdd20aSAndroid Build Coastguard Worker   ASSERT_TRUE(
100*6dbdd20aSAndroid Build Coastguard Worker       p.AddLine(
101*6dbdd20aSAndroid Build Coastguard Worker            "android.arch.core.executor.ArchTaskExecutor -> android.arch.a.a.a:")
102*6dbdd20aSAndroid Build Coastguard Worker           .ok());
103*6dbdd20aSAndroid Build Coastguard Worker   ASSERT_TRUE(p.AddLine("    15:15:boolean isMainThread():116:116 -> b").ok());
104*6dbdd20aSAndroid Build Coastguard Worker   ASSERT_TRUE(
105*6dbdd20aSAndroid Build Coastguard Worker       p.AddLine("    15:15:boolean somethingDifferent(int):116:116 -> b").ok());
106*6dbdd20aSAndroid Build Coastguard Worker   auto mapping = p.ConsumeMapping();
107*6dbdd20aSAndroid Build Coastguard Worker   ASSERT_THAT(mapping, ElementsAre(Pair("android.arch.a.a.a", _)));
108*6dbdd20aSAndroid Build Coastguard Worker   EXPECT_THAT(
109*6dbdd20aSAndroid Build Coastguard Worker       mapping.find("android.arch.a.a.a")->second.deobfuscated_methods(),
110*6dbdd20aSAndroid Build Coastguard Worker       ElementsAre(Pair(
111*6dbdd20aSAndroid Build Coastguard Worker           "b", "android.arch.core.executor.ArchTaskExecutor.[ambiguous]")));
112*6dbdd20aSAndroid Build Coastguard Worker }
113*6dbdd20aSAndroid Build Coastguard Worker 
TEST(ProguardParserTest,AmbiguousMethodDifferentCls)114*6dbdd20aSAndroid Build Coastguard Worker TEST(ProguardParserTest, AmbiguousMethodDifferentCls) {
115*6dbdd20aSAndroid Build Coastguard Worker   ProguardParser p;
116*6dbdd20aSAndroid Build Coastguard Worker   ASSERT_TRUE(
117*6dbdd20aSAndroid Build Coastguard Worker       p.AddLine(
118*6dbdd20aSAndroid Build Coastguard Worker            "android.arch.core.executor.ArchTaskExecutor -> android.arch.a.a.a:")
119*6dbdd20aSAndroid Build Coastguard Worker           .ok());
120*6dbdd20aSAndroid Build Coastguard Worker   ASSERT_TRUE(p.AddLine("    15:15:boolean isMainThread():116:116 -> b").ok());
121*6dbdd20aSAndroid Build Coastguard Worker   ASSERT_TRUE(
122*6dbdd20aSAndroid Build Coastguard Worker       p.AddLine("    15:15:boolean Foo.somethingDifferent(int):116:116 -> b")
123*6dbdd20aSAndroid Build Coastguard Worker           .ok());
124*6dbdd20aSAndroid Build Coastguard Worker   auto mapping = p.ConsumeMapping();
125*6dbdd20aSAndroid Build Coastguard Worker   ASSERT_THAT(mapping, ElementsAre(Pair("android.arch.a.a.a", _)));
126*6dbdd20aSAndroid Build Coastguard Worker   EXPECT_THAT(mapping.find("android.arch.a.a.a")->second.deobfuscated_methods(),
127*6dbdd20aSAndroid Build Coastguard Worker               ElementsAre(Pair(
128*6dbdd20aSAndroid Build Coastguard Worker                   "b",
129*6dbdd20aSAndroid Build Coastguard Worker                   "Foo.somethingDifferent | "
130*6dbdd20aSAndroid Build Coastguard Worker                   "android.arch.core.executor.ArchTaskExecutor.isMainThread")));
131*6dbdd20aSAndroid Build Coastguard Worker }
132*6dbdd20aSAndroid Build Coastguard Worker 
TEST(ProguardParserTest,AmbiguousMethodSameAndDifferentCls)133*6dbdd20aSAndroid Build Coastguard Worker TEST(ProguardParserTest, AmbiguousMethodSameAndDifferentCls) {
134*6dbdd20aSAndroid Build Coastguard Worker   ProguardParser p;
135*6dbdd20aSAndroid Build Coastguard Worker   ASSERT_TRUE(
136*6dbdd20aSAndroid Build Coastguard Worker       p.AddLine(
137*6dbdd20aSAndroid Build Coastguard Worker            "android.arch.core.executor.ArchTaskExecutor -> android.arch.a.a.a:")
138*6dbdd20aSAndroid Build Coastguard Worker           .ok());
139*6dbdd20aSAndroid Build Coastguard Worker   ASSERT_TRUE(p.AddLine("    15:15:boolean isMainThread():116:116 -> b").ok());
140*6dbdd20aSAndroid Build Coastguard Worker   ASSERT_TRUE(p.AddLine("    15:15:boolean what(String):116:116 -> b").ok());
141*6dbdd20aSAndroid Build Coastguard Worker   ASSERT_TRUE(
142*6dbdd20aSAndroid Build Coastguard Worker       p.AddLine("    15:15:boolean Foo.somethingDifferent(int):116:116 -> b")
143*6dbdd20aSAndroid Build Coastguard Worker           .ok());
144*6dbdd20aSAndroid Build Coastguard Worker   auto mapping = p.ConsumeMapping();
145*6dbdd20aSAndroid Build Coastguard Worker   ASSERT_THAT(mapping, ElementsAre(Pair("android.arch.a.a.a", _)));
146*6dbdd20aSAndroid Build Coastguard Worker   EXPECT_THAT(mapping.find("android.arch.a.a.a")->second.deobfuscated_methods(),
147*6dbdd20aSAndroid Build Coastguard Worker               ElementsAre(Pair(
148*6dbdd20aSAndroid Build Coastguard Worker                   "b",
149*6dbdd20aSAndroid Build Coastguard Worker                   "Foo.somethingDifferent | "
150*6dbdd20aSAndroid Build Coastguard Worker                   "android.arch.core.executor.ArchTaskExecutor.[ambiguous]")));
151*6dbdd20aSAndroid Build Coastguard Worker }
152*6dbdd20aSAndroid Build Coastguard Worker 
TEST(ProguardParserTest,AmbiguousMethodSameAndDifferentCls2)153*6dbdd20aSAndroid Build Coastguard Worker TEST(ProguardParserTest, AmbiguousMethodSameAndDifferentCls2) {
154*6dbdd20aSAndroid Build Coastguard Worker   ProguardParser p;
155*6dbdd20aSAndroid Build Coastguard Worker   ASSERT_TRUE(
156*6dbdd20aSAndroid Build Coastguard Worker       p.AddLine(
157*6dbdd20aSAndroid Build Coastguard Worker            "android.arch.core.executor.ArchTaskExecutor -> android.arch.a.a.a:")
158*6dbdd20aSAndroid Build Coastguard Worker           .ok());
159*6dbdd20aSAndroid Build Coastguard Worker   ASSERT_TRUE(p.AddLine("    15:15:boolean isMainThread():116:116 -> b").ok());
160*6dbdd20aSAndroid Build Coastguard Worker   ASSERT_TRUE(p.AddLine("    15:15:boolean what(String):116:116 -> b").ok());
161*6dbdd20aSAndroid Build Coastguard Worker   ASSERT_TRUE(
162*6dbdd20aSAndroid Build Coastguard Worker       p.AddLine("    15:15:boolean Foo.somethingDifferent(int):116:116 -> b")
163*6dbdd20aSAndroid Build Coastguard Worker           .ok());
164*6dbdd20aSAndroid Build Coastguard Worker   ASSERT_TRUE(
165*6dbdd20aSAndroid Build Coastguard Worker       p.AddLine("    15:15:boolean Foo.third(int,int):116:116 -> b").ok());
166*6dbdd20aSAndroid Build Coastguard Worker   auto mapping = p.ConsumeMapping();
167*6dbdd20aSAndroid Build Coastguard Worker   ASSERT_THAT(mapping, ElementsAre(Pair("android.arch.a.a.a", _)));
168*6dbdd20aSAndroid Build Coastguard Worker   EXPECT_THAT(mapping.find("android.arch.a.a.a")->second.deobfuscated_methods(),
169*6dbdd20aSAndroid Build Coastguard Worker               ElementsAre(Pair(
170*6dbdd20aSAndroid Build Coastguard Worker                   "b",
171*6dbdd20aSAndroid Build Coastguard Worker                   "Foo.[ambiguous] | "
172*6dbdd20aSAndroid Build Coastguard Worker                   "android.arch.core.executor.ArchTaskExecutor.[ambiguous]")));
173*6dbdd20aSAndroid Build Coastguard Worker }
174*6dbdd20aSAndroid Build Coastguard Worker 
TEST(ProguardParserTest,DuplicateClass)175*6dbdd20aSAndroid Build Coastguard Worker TEST(ProguardParserTest, DuplicateClass) {
176*6dbdd20aSAndroid Build Coastguard Worker   ProguardParser p;
177*6dbdd20aSAndroid Build Coastguard Worker   ASSERT_TRUE(
178*6dbdd20aSAndroid Build Coastguard Worker       p.AddLine(
179*6dbdd20aSAndroid Build Coastguard Worker            "android.arch.core.executor.ArchTaskExecutor -> android.arch.a.a.a:")
180*6dbdd20aSAndroid Build Coastguard Worker           .ok());
181*6dbdd20aSAndroid Build Coastguard Worker   ASSERT_FALSE(p.AddLine("android.arch.core.executor.ArchTaskExecutor2 -> "
182*6dbdd20aSAndroid Build Coastguard Worker                          "android.arch.a.a.a:")
183*6dbdd20aSAndroid Build Coastguard Worker                    .ok());
184*6dbdd20aSAndroid Build Coastguard Worker }
185*6dbdd20aSAndroid Build Coastguard Worker 
TEST(ProguardParserTest,DuplicateField)186*6dbdd20aSAndroid Build Coastguard Worker TEST(ProguardParserTest, DuplicateField) {
187*6dbdd20aSAndroid Build Coastguard Worker   ProguardParser p;
188*6dbdd20aSAndroid Build Coastguard Worker   ASSERT_TRUE(
189*6dbdd20aSAndroid Build Coastguard Worker       p.AddLine(
190*6dbdd20aSAndroid Build Coastguard Worker            "android.arch.core.executor.ArchTaskExecutor -> android.arch.a.a.a:")
191*6dbdd20aSAndroid Build Coastguard Worker           .ok());
192*6dbdd20aSAndroid Build Coastguard Worker   ASSERT_TRUE(
193*6dbdd20aSAndroid Build Coastguard Worker       p.AddLine("    android.arch.core.executor.TaskExecutor mDelegate -> b")
194*6dbdd20aSAndroid Build Coastguard Worker           .ok());
195*6dbdd20aSAndroid Build Coastguard Worker   ASSERT_FALSE(
196*6dbdd20aSAndroid Build Coastguard Worker       p.AddLine("    android.arch.core.executor.TaskExecutor mDelegate2 -> b")
197*6dbdd20aSAndroid Build Coastguard Worker           .ok());
198*6dbdd20aSAndroid Build Coastguard Worker }
199*6dbdd20aSAndroid Build Coastguard Worker 
TEST(ProguardParserTest,DuplicateMethod)200*6dbdd20aSAndroid Build Coastguard Worker TEST(ProguardParserTest, DuplicateMethod) {
201*6dbdd20aSAndroid Build Coastguard Worker   ProguardParser p;
202*6dbdd20aSAndroid Build Coastguard Worker   ASSERT_TRUE(
203*6dbdd20aSAndroid Build Coastguard Worker       p.AddLine(
204*6dbdd20aSAndroid Build Coastguard Worker            "android.arch.core.executor.ArchTaskExecutor -> android.arch.a.a.a:")
205*6dbdd20aSAndroid Build Coastguard Worker           .ok());
206*6dbdd20aSAndroid Build Coastguard Worker   ASSERT_TRUE(p.AddLine("    15:15:boolean isMainThread():116:116 -> b").ok());
207*6dbdd20aSAndroid Build Coastguard Worker   ASSERT_TRUE(
208*6dbdd20aSAndroid Build Coastguard Worker       p.AddLine("    15:15:boolean doSomething(boolean):116:116 -> b").ok());
209*6dbdd20aSAndroid Build Coastguard Worker }
210*6dbdd20aSAndroid Build Coastguard Worker 
TEST(ProguardParserTest,DuplicateFieldSame)211*6dbdd20aSAndroid Build Coastguard Worker TEST(ProguardParserTest, DuplicateFieldSame) {
212*6dbdd20aSAndroid Build Coastguard Worker   ProguardParser p;
213*6dbdd20aSAndroid Build Coastguard Worker   ASSERT_TRUE(
214*6dbdd20aSAndroid Build Coastguard Worker       p.AddLine(
215*6dbdd20aSAndroid Build Coastguard Worker            "android.arch.core.executor.ArchTaskExecutor -> android.arch.a.a.a:")
216*6dbdd20aSAndroid Build Coastguard Worker           .ok());
217*6dbdd20aSAndroid Build Coastguard Worker   ASSERT_TRUE(
218*6dbdd20aSAndroid Build Coastguard Worker       p.AddLine("    android.arch.core.executor.TaskExecutor mDelegate -> b")
219*6dbdd20aSAndroid Build Coastguard Worker           .ok());
220*6dbdd20aSAndroid Build Coastguard Worker   ASSERT_TRUE(
221*6dbdd20aSAndroid Build Coastguard Worker       p.AddLine(
222*6dbdd20aSAndroid Build Coastguard Worker            "    1:1:android.arch.core.executor.TaskExecutor mDelegate -> b")
223*6dbdd20aSAndroid Build Coastguard Worker           .ok());
224*6dbdd20aSAndroid Build Coastguard Worker }
225*6dbdd20aSAndroid Build Coastguard Worker 
TEST(ProguardParserTest,EmptyLinesAndComments)226*6dbdd20aSAndroid Build Coastguard Worker TEST(ProguardParserTest, EmptyLinesAndComments) {
227*6dbdd20aSAndroid Build Coastguard Worker   ProguardParser p;
228*6dbdd20aSAndroid Build Coastguard Worker   const char input[] = R"(
229*6dbdd20aSAndroid Build Coastguard Worker # comment
230*6dbdd20aSAndroid Build Coastguard Worker 
231*6dbdd20aSAndroid Build Coastguard Worker Example$$Class -> C:
232*6dbdd20aSAndroid Build Coastguard Worker 
233*6dbdd20aSAndroid Build Coastguard Worker     int first -> q
234*6dbdd20aSAndroid Build Coastguard Worker     # indented comment
235*6dbdd20aSAndroid Build Coastguard Worker     long second -> o
236*6dbdd20aSAndroid Build Coastguard Worker )";
237*6dbdd20aSAndroid Build Coastguard Worker 
238*6dbdd20aSAndroid Build Coastguard Worker   ASSERT_TRUE(p.AddLines(std::string(input)));
239*6dbdd20aSAndroid Build Coastguard Worker   EXPECT_THAT(
240*6dbdd20aSAndroid Build Coastguard Worker       p.ConsumeMapping(),
241*6dbdd20aSAndroid Build Coastguard Worker       ElementsAre(std::pair<std::string, ObfuscatedClass>(
242*6dbdd20aSAndroid Build Coastguard Worker           "C", {"Example$$Class", {{"q", "first"}, {"o", "second"}}, {}})));
243*6dbdd20aSAndroid Build Coastguard Worker }
244*6dbdd20aSAndroid Build Coastguard Worker 
245*6dbdd20aSAndroid Build Coastguard Worker }  // namespace
246*6dbdd20aSAndroid Build Coastguard Worker }  // namespace profiling
247*6dbdd20aSAndroid Build Coastguard Worker }  // namespace perfetto
248