xref: /aosp_15_r20/external/perfetto/src/profiling/common/interner_unittest.cc (revision 6dbdd20afdafa5e3ca9b8809fa73465d530080dc)
1*6dbdd20aSAndroid Build Coastguard Worker /*
2*6dbdd20aSAndroid Build Coastguard Worker  * Copyright (C) 2018 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/common/interner.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 namespace {
24*6dbdd20aSAndroid Build Coastguard Worker 
TEST(InternerStringTest,Basic)25*6dbdd20aSAndroid Build Coastguard Worker TEST(InternerStringTest, Basic) {
26*6dbdd20aSAndroid Build Coastguard Worker   Interner<std::string> interner;
27*6dbdd20aSAndroid Build Coastguard Worker   {
28*6dbdd20aSAndroid Build Coastguard Worker     Interned<std::string> interned_str = interner.Intern("foo");
29*6dbdd20aSAndroid Build Coastguard Worker     ASSERT_EQ(interned_str.data(), "foo");
30*6dbdd20aSAndroid Build Coastguard Worker   }
31*6dbdd20aSAndroid Build Coastguard Worker   ASSERT_EQ(interner.entry_count_for_testing(), 0u);
32*6dbdd20aSAndroid Build Coastguard Worker }
33*6dbdd20aSAndroid Build Coastguard Worker 
TEST(InternerStringTest,TwoStrings)34*6dbdd20aSAndroid Build Coastguard Worker TEST(InternerStringTest, TwoStrings) {
35*6dbdd20aSAndroid Build Coastguard Worker   Interner<std::string> interner;
36*6dbdd20aSAndroid Build Coastguard Worker   {
37*6dbdd20aSAndroid Build Coastguard Worker     Interned<std::string> interned_str = interner.Intern("foo");
38*6dbdd20aSAndroid Build Coastguard Worker     Interned<std::string> other_interned_str = interner.Intern("bar");
39*6dbdd20aSAndroid Build Coastguard Worker     ASSERT_EQ(interned_str.data(), "foo");
40*6dbdd20aSAndroid Build Coastguard Worker     ASSERT_EQ(other_interned_str.data(), "bar");
41*6dbdd20aSAndroid Build Coastguard Worker   }
42*6dbdd20aSAndroid Build Coastguard Worker   ASSERT_EQ(interner.entry_count_for_testing(), 0u);
43*6dbdd20aSAndroid Build Coastguard Worker }
44*6dbdd20aSAndroid Build Coastguard Worker 
TEST(InternerStringTest,TwoReferences)45*6dbdd20aSAndroid Build Coastguard Worker TEST(InternerStringTest, TwoReferences) {
46*6dbdd20aSAndroid Build Coastguard Worker   Interner<std::string> interner;
47*6dbdd20aSAndroid Build Coastguard Worker   {
48*6dbdd20aSAndroid Build Coastguard Worker     Interned<std::string> interned_str = interner.Intern("foo");
49*6dbdd20aSAndroid Build Coastguard Worker     ASSERT_EQ(interned_str.data(), "foo");
50*6dbdd20aSAndroid Build Coastguard Worker     Interned<std::string> interned_str2 = interner.Intern("foo");
51*6dbdd20aSAndroid Build Coastguard Worker     ASSERT_EQ(interner.entry_count_for_testing(), 1u);
52*6dbdd20aSAndroid Build Coastguard Worker     ASSERT_EQ(interned_str2.data(), "foo");
53*6dbdd20aSAndroid Build Coastguard Worker   }
54*6dbdd20aSAndroid Build Coastguard Worker   ASSERT_EQ(interner.entry_count_for_testing(), 0u);
55*6dbdd20aSAndroid Build Coastguard Worker }
56*6dbdd20aSAndroid Build Coastguard Worker 
TEST(InternerStringTest,Move)57*6dbdd20aSAndroid Build Coastguard Worker TEST(InternerStringTest, Move) {
58*6dbdd20aSAndroid Build Coastguard Worker   Interner<std::string> interner;
59*6dbdd20aSAndroid Build Coastguard Worker   {
60*6dbdd20aSAndroid Build Coastguard Worker     Interned<std::string> interned_str = interner.Intern("foo");
61*6dbdd20aSAndroid Build Coastguard Worker     {
62*6dbdd20aSAndroid Build Coastguard Worker       Interned<std::string> interned_str2(std::move(interned_str));
63*6dbdd20aSAndroid Build Coastguard Worker       ASSERT_EQ(interner.entry_count_for_testing(), 1u);
64*6dbdd20aSAndroid Build Coastguard Worker       ASSERT_EQ(interned_str2.data(), "foo");
65*6dbdd20aSAndroid Build Coastguard Worker     }
66*6dbdd20aSAndroid Build Coastguard Worker     ASSERT_EQ(interner.entry_count_for_testing(), 0u);
67*6dbdd20aSAndroid Build Coastguard Worker   }
68*6dbdd20aSAndroid Build Coastguard Worker }
69*6dbdd20aSAndroid Build Coastguard Worker 
TEST(InternerStringTest,Copy)70*6dbdd20aSAndroid Build Coastguard Worker TEST(InternerStringTest, Copy) {
71*6dbdd20aSAndroid Build Coastguard Worker   Interner<std::string> interner;
72*6dbdd20aSAndroid Build Coastguard Worker   {
73*6dbdd20aSAndroid Build Coastguard Worker     Interned<std::string> interned_str = interner.Intern("foo");
74*6dbdd20aSAndroid Build Coastguard Worker     {
75*6dbdd20aSAndroid Build Coastguard Worker       Interned<std::string> interned_str2(interned_str);
76*6dbdd20aSAndroid Build Coastguard Worker       ASSERT_EQ(interner.entry_count_for_testing(), 1u);
77*6dbdd20aSAndroid Build Coastguard Worker       ASSERT_EQ(interned_str2.data(), "foo");
78*6dbdd20aSAndroid Build Coastguard Worker     }
79*6dbdd20aSAndroid Build Coastguard Worker     ASSERT_EQ(interner.entry_count_for_testing(), 1u);
80*6dbdd20aSAndroid Build Coastguard Worker     ASSERT_EQ(interned_str.data(), "foo");
81*6dbdd20aSAndroid Build Coastguard Worker   }
82*6dbdd20aSAndroid Build Coastguard Worker }
83*6dbdd20aSAndroid Build Coastguard Worker 
TEST(InternerStringTest,MoveAssign)84*6dbdd20aSAndroid Build Coastguard Worker TEST(InternerStringTest, MoveAssign) {
85*6dbdd20aSAndroid Build Coastguard Worker   Interner<std::string> interner;
86*6dbdd20aSAndroid Build Coastguard Worker   {
87*6dbdd20aSAndroid Build Coastguard Worker     Interned<std::string> interned_str = interner.Intern("foo");
88*6dbdd20aSAndroid Build Coastguard Worker     {
89*6dbdd20aSAndroid Build Coastguard Worker       Interned<std::string> interned_str2 = std::move(interned_str);
90*6dbdd20aSAndroid Build Coastguard Worker       ASSERT_EQ(interner.entry_count_for_testing(), 1u);
91*6dbdd20aSAndroid Build Coastguard Worker       ASSERT_EQ(interned_str2.data(), "foo");
92*6dbdd20aSAndroid Build Coastguard Worker     }
93*6dbdd20aSAndroid Build Coastguard Worker     ASSERT_EQ(interner.entry_count_for_testing(), 0u);
94*6dbdd20aSAndroid Build Coastguard Worker   }
95*6dbdd20aSAndroid Build Coastguard Worker }
96*6dbdd20aSAndroid Build Coastguard Worker 
TEST(InternerStringTest,CopyAssign)97*6dbdd20aSAndroid Build Coastguard Worker TEST(InternerStringTest, CopyAssign) {
98*6dbdd20aSAndroid Build Coastguard Worker   Interner<std::string> interner;
99*6dbdd20aSAndroid Build Coastguard Worker   {
100*6dbdd20aSAndroid Build Coastguard Worker     Interned<std::string> interned_str = interner.Intern("foo");
101*6dbdd20aSAndroid Build Coastguard Worker     {
102*6dbdd20aSAndroid Build Coastguard Worker       Interned<std::string> interned_str2 = interned_str;
103*6dbdd20aSAndroid Build Coastguard Worker       ASSERT_EQ(interner.entry_count_for_testing(), 1u);
104*6dbdd20aSAndroid Build Coastguard Worker       ASSERT_EQ(interned_str2.data(), "foo");
105*6dbdd20aSAndroid Build Coastguard Worker     }
106*6dbdd20aSAndroid Build Coastguard Worker     ASSERT_EQ(interner.entry_count_for_testing(), 1u);
107*6dbdd20aSAndroid Build Coastguard Worker     ASSERT_EQ(interned_str.data(), "foo");
108*6dbdd20aSAndroid Build Coastguard Worker   }
109*6dbdd20aSAndroid Build Coastguard Worker }
110*6dbdd20aSAndroid Build Coastguard Worker 
TEST(InternerStringTest,IDsUnique)111*6dbdd20aSAndroid Build Coastguard Worker TEST(InternerStringTest, IDsUnique) {
112*6dbdd20aSAndroid Build Coastguard Worker   Interner<std::string> interner;
113*6dbdd20aSAndroid Build Coastguard Worker   Interned<std::string> interned_str = interner.Intern("foo");
114*6dbdd20aSAndroid Build Coastguard Worker   Interned<std::string> same_interned_str = interner.Intern("foo");
115*6dbdd20aSAndroid Build Coastguard Worker   Interned<std::string> other_interned_str = interner.Intern("bar");
116*6dbdd20aSAndroid Build Coastguard Worker   EXPECT_EQ(interned_str.id(), same_interned_str.id());
117*6dbdd20aSAndroid Build Coastguard Worker   EXPECT_NE(interned_str.id(), other_interned_str.id());
118*6dbdd20aSAndroid Build Coastguard Worker }
119*6dbdd20aSAndroid Build Coastguard Worker 
TEST(InternerStringTest,IdsConsecutive)120*6dbdd20aSAndroid Build Coastguard Worker TEST(InternerStringTest, IdsConsecutive) {
121*6dbdd20aSAndroid Build Coastguard Worker   Interner<std::string> interner;
122*6dbdd20aSAndroid Build Coastguard Worker   {
123*6dbdd20aSAndroid Build Coastguard Worker     Interned<std::string> interned_str = interner.Intern("foo");
124*6dbdd20aSAndroid Build Coastguard Worker     interner.Intern("foo");
125*6dbdd20aSAndroid Build Coastguard Worker     Interned<std::string> other_interned_str = interner.Intern("bar");
126*6dbdd20aSAndroid Build Coastguard Worker     ASSERT_EQ(interned_str.id() + 1, other_interned_str.id());
127*6dbdd20aSAndroid Build Coastguard Worker   }
128*6dbdd20aSAndroid Build Coastguard Worker   ASSERT_EQ(interner.entry_count_for_testing(), 0u);
129*6dbdd20aSAndroid Build Coastguard Worker }
130*6dbdd20aSAndroid Build Coastguard Worker 
131*6dbdd20aSAndroid Build Coastguard Worker }  // namespace
132*6dbdd20aSAndroid Build Coastguard Worker }  // namespace profiling
133*6dbdd20aSAndroid Build Coastguard Worker }  // namespace perfetto
134