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