1 /*
2  * Copyright (C) 2022 The Android Open Source Project
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  *      http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  */
16 
17 #include "src/trace_processor/importers/common/deobfuscation_mapping_table.h"
18 #include <string>
19 #include "perfetto/ext/base/flat_hash_map.h"
20 #include "test/gtest_and_gmock.h"
21 
22 namespace perfetto {
23 namespace trace_processor {
24 namespace {
25 
26 using PackageId = DeobfuscationMappingTable::PackageId;
27 
TEST(DeobfuscationMappingTable,EmptyTableByDefault)28 TEST(DeobfuscationMappingTable, EmptyTableByDefault) {
29   TraceStorage storage;
30   StringId xyz_id = storage.InternString("xyz");
31 
32   DeobfuscationMappingTable table;
33   EXPECT_EQ(table.TranslateClass(xyz_id), std::nullopt);
34   EXPECT_EQ(table.TranslateClass(PackageId{"app", 123}, xyz_id), std::nullopt);
35 }
36 
TEST(DeobfuscationMappingTable,TranslateClassSingleInsert)37 TEST(DeobfuscationMappingTable, TranslateClassSingleInsert) {
38   TraceStorage storage;
39   StringId xyz_id = storage.InternString("xyz");
40   StringId abc_id = storage.InternString("abc");
41   StringId class_x_id = storage.InternString("class_X");
42 
43   DeobfuscationMappingTable table;
44   table.AddClassTranslation(PackageId{"app", 123}, xyz_id, class_x_id,
45                             base::FlatHashMap<StringId, StringId>{});
46   EXPECT_EQ(table.TranslateClass(xyz_id), class_x_id);
47   EXPECT_EQ(table.TranslateClass(PackageId{"app", 123}, xyz_id), class_x_id);
48   EXPECT_EQ(table.TranslateClass(PackageId{"app", 124}, xyz_id), std::nullopt);
49   EXPECT_EQ(table.TranslateClass(PackageId{"app", 123}, abc_id), std::nullopt);
50 }
51 
TEST(DeobfuscationMappingTable,TranslateClassMultipleInsert)52 TEST(DeobfuscationMappingTable, TranslateClassMultipleInsert) {
53   TraceStorage storage;
54   StringId xyz_id = storage.InternString("xyz");
55   StringId abc_id = storage.InternString("abc");
56   StringId class_x_id = storage.InternString("class_X");
57   StringId class_y_id = storage.InternString("class_Y");
58   StringId class_a_id = storage.InternString("class_A");
59 
60   DeobfuscationMappingTable table;
61   table.AddClassTranslation(PackageId{"app1", 123}, xyz_id, class_x_id,
62                             base::FlatHashMap<StringId, StringId>{});
63   table.AddClassTranslation(PackageId{"app2", 123}, xyz_id, class_y_id,
64                             base::FlatHashMap<StringId, StringId>{});
65   table.AddClassTranslation(PackageId{"app3", 123}, abc_id, class_a_id,
66                             base::FlatHashMap<StringId, StringId>{});
67   EXPECT_EQ(table.TranslateClass(xyz_id), class_x_id);
68   EXPECT_EQ(table.TranslateClass(abc_id), std::nullopt);
69   EXPECT_EQ(table.TranslateClass(PackageId{"app1", 123}, xyz_id), class_x_id);
70   EXPECT_EQ(table.TranslateClass(PackageId{"app2", 123}, xyz_id), class_y_id);
71   EXPECT_EQ(table.TranslateClass(PackageId{"app1", 123}, abc_id), std::nullopt);
72 }
73 
TEST(DeobfuscationMappingTable,TranslateMember)74 TEST(DeobfuscationMappingTable, TranslateMember) {
75   TraceStorage storage;
76   StringId xyz_id = storage.InternString("xyz");
77   StringId abc_id = storage.InternString("abc");
78   StringId class_x_id = storage.InternString("class_X");
79   StringId mmm_1_id = storage.InternString("mmm1");
80   StringId mmm_2_id = storage.InternString("mmm2");
81   StringId mmm_3_id = storage.InternString("mmm3");
82   StringId mmm_4_id = storage.InternString("mmm4");
83   StringId member_1_id = storage.InternString("member_1");
84   StringId member_2_id = storage.InternString("member_2");
85   StringId member_3_id = storage.InternString("member_3");
86 
87   base::FlatHashMap<StringId, StringId> members;
88   members[mmm_1_id] = member_1_id;
89   members[mmm_2_id] = member_2_id;
90   members[mmm_3_id] = member_3_id;
91   DeobfuscationMappingTable table;
92   table.AddClassTranslation(PackageId{"app1", 123}, xyz_id, class_x_id,
93                             std::move(members));
94   EXPECT_EQ(table.TranslateMember(PackageId{"app1", 123}, xyz_id, mmm_2_id),
95             member_2_id);
96   EXPECT_EQ(table.TranslateMember(PackageId{"app1", 123}, xyz_id, mmm_4_id),
97             std::nullopt);
98   EXPECT_EQ(table.TranslateMember(PackageId{"app1", 123}, abc_id, mmm_2_id),
99             std::nullopt);
100   EXPECT_EQ(table.TranslateMember(PackageId{"app1", 124}, xyz_id, mmm_2_id),
101             std::nullopt);
102 }
103 
104 }  // namespace
105 }  // namespace trace_processor
106 }  // namespace perfetto
107