• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 // Copyright (C) 2017 The Android Open Source Project
2 //
3 // Licensed under the Apache License, Version 2.0 (the "License");
4 // you may not use this file except in compliance with the License.
5 // You may obtain a copy of the License at
6 //
7 // http://www.apache.org/licenses/LICENSE-2.0
8 //
9 // Unless required by applicable law or agreed to in writing, software
10 // distributed under the License is distributed on an "AS IS" BASIS,
11 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12 // See the License for the specific language governing permissions and
13 // limitations under the License.
14 
15 #include "StalePtrRegistry.h"
16 
17 #include <gtest/gtest.h>
18 
TEST(StalePtrRegistry,Constructor)19 TEST(StalePtrRegistry, Constructor) {
20     StalePtrRegistry<void> reg;
21 }
22 
TEST(StalePtrRegistry,Add)23 TEST(StalePtrRegistry, Add) {
24     StalePtrRegistry<void> reg;
25     EXPECT_EQ(reg.numCurrEntries(), 0);
26     reg.addPtr(nullptr);
27     EXPECT_EQ(reg.numCurrEntries(), 1);
28 }
29 
TEST(StalePtrRegistry,AddRemove)30 TEST(StalePtrRegistry, AddRemove) {
31     StalePtrRegistry<void> reg;
32     EXPECT_EQ(reg.numCurrEntries(), 0);
33     reg.addPtr(nullptr);
34     EXPECT_EQ(reg.numCurrEntries(), 1);
35     reg.removePtr(nullptr);
36     EXPECT_EQ(reg.numCurrEntries(), 0);
37 }
38 
TEST(StalePtrRegistry,AddMakeStale)39 TEST(StalePtrRegistry, AddMakeStale) {
40     StalePtrRegistry<void> reg;
41     EXPECT_EQ(reg.numCurrEntries(), 0);
42     reg.addPtr(nullptr);
43     EXPECT_EQ(reg.numCurrEntries(), 1);
44     EXPECT_EQ(reg.numStaleEntries(), 0);
45     reg.makeCurrentPtrsStale();
46     EXPECT_EQ(reg.numCurrEntries(), 0);
47     EXPECT_EQ(reg.numStaleEntries(), 1);
48 }
49 
TEST(StalePtrRegistry,Get)50 TEST(StalePtrRegistry, Get) {
51     StalePtrRegistry<void> reg;
52     EXPECT_EQ(reg.numCurrEntries(), 0);
53     reg.addPtr(nullptr);
54     EXPECT_EQ(reg.numCurrEntries(), 1);
55     EXPECT_EQ(reg.getPtr(0), nullptr);
56 }
57 
TEST(StalePtrRegistry,GetDefaultVal)58 TEST(StalePtrRegistry, GetDefaultVal) {
59     StalePtrRegistry<void> reg;
60     EXPECT_EQ(reg.numCurrEntries(), 0);
61     EXPECT_EQ(reg.getPtr(0), nullptr);
62     EXPECT_EQ(reg.getPtr(0, (void*)0x1), (void*)0x1);
63 }
64 
TEST(StalePtrRegistry,GetNonExisting)65 TEST(StalePtrRegistry, GetNonExisting) {
66     StalePtrRegistry<void> reg;
67     EXPECT_EQ(reg.numCurrEntries(), 0);
68     EXPECT_EQ(reg.getPtr(0), nullptr);
69     EXPECT_EQ(reg.numCurrEntries(), 0);
70 }
71 
TEST(StalePtrRegistry,AddMakeStaleGetStale)72 TEST(StalePtrRegistry, AddMakeStaleGetStale) {
73     StalePtrRegistry<void> reg;
74     void* ptr = (void*)0xabcdef;
75     uint64_t handle = (uint64_t)(uintptr_t)ptr;
76 
77     EXPECT_EQ(reg.numCurrEntries(), 0);
78 
79     reg.addPtr(ptr);
80 
81     EXPECT_EQ(reg.numCurrEntries(), 1);
82     EXPECT_EQ(reg.numStaleEntries(), 0);
83 
84     reg.makeCurrentPtrsStale();
85 
86     EXPECT_EQ(reg.numCurrEntries(), 0);
87     EXPECT_EQ(reg.numStaleEntries(), 1);
88 
89     EXPECT_EQ(reg.getPtr(handle), ptr);
90 }
91 
TEST(StalePtrRegistry,AddMakeStaleGetStaleWithDelete)92 TEST(StalePtrRegistry, AddMakeStaleGetStaleWithDelete) {
93     StalePtrRegistry<void> reg;
94     void* ptr = (void*)0xabcdef;
95     uint64_t handle = (uint64_t)(uintptr_t)ptr;
96 
97     EXPECT_EQ(reg.numCurrEntries(), 0);
98 
99     reg.addPtr(ptr);
100 
101     EXPECT_EQ(reg.numCurrEntries(), 1);
102     EXPECT_EQ(reg.numStaleEntries(), 0);
103 
104     reg.makeCurrentPtrsStale();
105 
106     EXPECT_EQ(reg.numCurrEntries(), 0);
107     EXPECT_EQ(reg.numStaleEntries(), 1);
108 
109     EXPECT_EQ(reg.getPtr(handle, nullptr, true), ptr);
110     EXPECT_EQ(reg.getPtr(handle, nullptr, true), nullptr);
111 }
112 
TEST(StalePtrRegistry,AddMakeStaleWithRemap)113 TEST(StalePtrRegistry, AddMakeStaleWithRemap) {
114     StalePtrRegistry<void> reg;
115     void* ptr = (void*)0xabcdef;
116     void* remapped = (void*)0xbcdefa;
117     uint64_t handle = (uint64_t)(uintptr_t)ptr;
118 
119     EXPECT_EQ(reg.numCurrEntries(), 0);
120 
121     reg.addPtr(ptr);
122 
123     EXPECT_EQ(reg.numCurrEntries(), 1);
124     EXPECT_EQ(reg.numStaleEntries(), 0);
125 
126     reg.makeCurrentPtrsStale();
127 
128     EXPECT_EQ(reg.numCurrEntries(), 0);
129     EXPECT_EQ(reg.numStaleEntries(), 1);
130 
131     reg.remapStalePtr(handle, remapped);
132 
133     EXPECT_EQ(reg.getPtr(handle), remapped);
134 }
135 
TEST(StalePtrRegistry,AddMakeStaleWithRemapNameCollision)136 TEST(StalePtrRegistry, AddMakeStaleWithRemapNameCollision) {
137     StalePtrRegistry<void> reg;
138     void* ptr = (void*)0xabcdef;
139     void* remapped = (void*)0xbcdefa;
140     uint64_t handle = (uint64_t)(uintptr_t)ptr;
141 
142     EXPECT_EQ(reg.numCurrEntries(), 0);
143 
144     reg.addPtr(ptr);
145 
146     EXPECT_EQ(reg.numCurrEntries(), 1);
147     EXPECT_EQ(reg.numStaleEntries(), 0);
148 
149     reg.makeCurrentPtrsStale();
150 
151     EXPECT_EQ(reg.numCurrEntries(), 0);
152     EXPECT_EQ(reg.numStaleEntries(), 1);
153 
154     reg.remapStalePtr(handle, remapped);
155 
156     EXPECT_EQ(reg.getPtr(handle), remapped);
157 
158     reg.addPtr(ptr);
159 
160     EXPECT_EQ(reg.getPtr(handle), ptr);
161 }
162 
TEST(StalePtrRegistry,AddMakeStaleTwice)163 TEST(StalePtrRegistry, AddMakeStaleTwice) {
164     StalePtrRegistry<void> reg;
165     void* ptr1 = (void*)0xabcdef;
166     uint64_t handle1 = (uint64_t)(uintptr_t)ptr1;
167     void* ptr2 = (void*)0xbcdefa;
168     uint64_t handle2 = (uint64_t)(uintptr_t)ptr2;
169 
170     reg.addPtr(ptr1);
171     reg.makeCurrentPtrsStale();
172     EXPECT_EQ(reg.numStaleEntries(), 1);
173     reg.addPtr(ptr2);
174     reg.makeCurrentPtrsStale();
175 
176     EXPECT_EQ(reg.numCurrEntries(), 0);
177     EXPECT_EQ(reg.numStaleEntries(), 2);
178 
179     EXPECT_EQ(reg.getPtr(handle1), ptr1);
180     EXPECT_EQ(reg.getPtr(handle2), ptr2);
181 }
182 
TEST(StalePtrRegistry,AddMakeStaleTwiceWithCollision)183 TEST(StalePtrRegistry, AddMakeStaleTwiceWithCollision) {
184     StalePtrRegistry<void> reg;
185     void* ptr1 = (void*)0xabcdef;
186     uint64_t handle1 = (uint64_t)(uintptr_t)ptr1;
187     void* ptr2 = (void*)0xabcdef;
188     uint64_t handle2 = (uint64_t)(uintptr_t)ptr2;
189 
190     reg.addPtr(ptr1);
191     reg.makeCurrentPtrsStale();
192     EXPECT_EQ(reg.numStaleEntries(), 1);
193     reg.addPtr(ptr2);
194     reg.makeCurrentPtrsStale();
195 
196     EXPECT_EQ(reg.numCurrEntries(), 0);
197     EXPECT_EQ(reg.numStaleEntries(), 1);
198 
199     EXPECT_EQ(reg.getPtr(handle1), ptr1);
200     EXPECT_EQ(reg.getPtr(handle2), ptr2);
201 }
202