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
19 namespace gfxstream {
20 namespace {
21
TEST(StalePtrRegistry,Constructor)22 TEST(StalePtrRegistry, Constructor) {
23 StalePtrRegistry<void> reg;
24 }
25
TEST(StalePtrRegistry,Add)26 TEST(StalePtrRegistry, Add) {
27 StalePtrRegistry<void> reg;
28 EXPECT_EQ(reg.numCurrEntries(), 0);
29 reg.addPtr(nullptr);
30 EXPECT_EQ(reg.numCurrEntries(), 1);
31 }
32
TEST(StalePtrRegistry,AddRemove)33 TEST(StalePtrRegistry, AddRemove) {
34 StalePtrRegistry<void> reg;
35 EXPECT_EQ(reg.numCurrEntries(), 0);
36 reg.addPtr(nullptr);
37 EXPECT_EQ(reg.numCurrEntries(), 1);
38 reg.removePtr(nullptr);
39 EXPECT_EQ(reg.numCurrEntries(), 0);
40 }
41
TEST(StalePtrRegistry,AddMakeStale)42 TEST(StalePtrRegistry, AddMakeStale) {
43 StalePtrRegistry<void> reg;
44 EXPECT_EQ(reg.numCurrEntries(), 0);
45 reg.addPtr(nullptr);
46 EXPECT_EQ(reg.numCurrEntries(), 1);
47 EXPECT_EQ(reg.numStaleEntries(), 0);
48 reg.makeCurrentPtrsStale();
49 EXPECT_EQ(reg.numCurrEntries(), 0);
50 EXPECT_EQ(reg.numStaleEntries(), 1);
51 }
52
TEST(StalePtrRegistry,Get)53 TEST(StalePtrRegistry, Get) {
54 StalePtrRegistry<void> reg;
55 EXPECT_EQ(reg.numCurrEntries(), 0);
56 reg.addPtr(nullptr);
57 EXPECT_EQ(reg.numCurrEntries(), 1);
58 EXPECT_EQ(reg.getPtr(0), nullptr);
59 }
60
TEST(StalePtrRegistry,GetDefaultVal)61 TEST(StalePtrRegistry, GetDefaultVal) {
62 StalePtrRegistry<void> reg;
63 EXPECT_EQ(reg.numCurrEntries(), 0);
64 EXPECT_EQ(reg.getPtr(0), nullptr);
65 EXPECT_EQ(reg.getPtr(0, (void*)0x1), (void*)0x1);
66 }
67
TEST(StalePtrRegistry,GetNonExisting)68 TEST(StalePtrRegistry, GetNonExisting) {
69 StalePtrRegistry<void> reg;
70 EXPECT_EQ(reg.numCurrEntries(), 0);
71 EXPECT_EQ(reg.getPtr(0), nullptr);
72 EXPECT_EQ(reg.numCurrEntries(), 0);
73 }
74
TEST(StalePtrRegistry,AddMakeStaleGetStale)75 TEST(StalePtrRegistry, AddMakeStaleGetStale) {
76 StalePtrRegistry<void> reg;
77 void* ptr = (void*)0xabcdef;
78 uint64_t handle = (uint64_t)(uintptr_t)ptr;
79
80 EXPECT_EQ(reg.numCurrEntries(), 0);
81
82 reg.addPtr(ptr);
83
84 EXPECT_EQ(reg.numCurrEntries(), 1);
85 EXPECT_EQ(reg.numStaleEntries(), 0);
86
87 reg.makeCurrentPtrsStale();
88
89 EXPECT_EQ(reg.numCurrEntries(), 0);
90 EXPECT_EQ(reg.numStaleEntries(), 1);
91
92 EXPECT_EQ(reg.getPtr(handle), ptr);
93 }
94
TEST(StalePtrRegistry,AddMakeStaleGetStaleWithDelete)95 TEST(StalePtrRegistry, AddMakeStaleGetStaleWithDelete) {
96 StalePtrRegistry<void> reg;
97 void* ptr = (void*)0xabcdef;
98 uint64_t handle = (uint64_t)(uintptr_t)ptr;
99
100 EXPECT_EQ(reg.numCurrEntries(), 0);
101
102 reg.addPtr(ptr);
103
104 EXPECT_EQ(reg.numCurrEntries(), 1);
105 EXPECT_EQ(reg.numStaleEntries(), 0);
106
107 reg.makeCurrentPtrsStale();
108
109 EXPECT_EQ(reg.numCurrEntries(), 0);
110 EXPECT_EQ(reg.numStaleEntries(), 1);
111
112 EXPECT_EQ(reg.getPtr(handle, nullptr, true), ptr);
113 EXPECT_EQ(reg.getPtr(handle, nullptr, true), nullptr);
114 }
115
TEST(StalePtrRegistry,AddMakeStaleWithRemap)116 TEST(StalePtrRegistry, AddMakeStaleWithRemap) {
117 StalePtrRegistry<void> reg;
118 void* ptr = (void*)0xabcdef;
119 void* remapped = (void*)0xbcdefa;
120 uint64_t handle = (uint64_t)(uintptr_t)ptr;
121
122 EXPECT_EQ(reg.numCurrEntries(), 0);
123
124 reg.addPtr(ptr);
125
126 EXPECT_EQ(reg.numCurrEntries(), 1);
127 EXPECT_EQ(reg.numStaleEntries(), 0);
128
129 reg.makeCurrentPtrsStale();
130
131 EXPECT_EQ(reg.numCurrEntries(), 0);
132 EXPECT_EQ(reg.numStaleEntries(), 1);
133
134 reg.remapStalePtr(handle, remapped);
135
136 EXPECT_EQ(reg.getPtr(handle), remapped);
137 }
138
TEST(StalePtrRegistry,AddMakeStaleWithRemapNameCollision)139 TEST(StalePtrRegistry, AddMakeStaleWithRemapNameCollision) {
140 StalePtrRegistry<void> reg;
141 void* ptr = (void*)0xabcdef;
142 void* remapped = (void*)0xbcdefa;
143 uint64_t handle = (uint64_t)(uintptr_t)ptr;
144
145 EXPECT_EQ(reg.numCurrEntries(), 0);
146
147 reg.addPtr(ptr);
148
149 EXPECT_EQ(reg.numCurrEntries(), 1);
150 EXPECT_EQ(reg.numStaleEntries(), 0);
151
152 reg.makeCurrentPtrsStale();
153
154 EXPECT_EQ(reg.numCurrEntries(), 0);
155 EXPECT_EQ(reg.numStaleEntries(), 1);
156
157 reg.remapStalePtr(handle, remapped);
158
159 EXPECT_EQ(reg.getPtr(handle), remapped);
160
161 reg.addPtr(ptr);
162
163 EXPECT_EQ(reg.getPtr(handle), ptr);
164 }
165
TEST(StalePtrRegistry,AddMakeStaleTwice)166 TEST(StalePtrRegistry, AddMakeStaleTwice) {
167 StalePtrRegistry<void> reg;
168 void* ptr1 = (void*)0xabcdef;
169 uint64_t handle1 = (uint64_t)(uintptr_t)ptr1;
170 void* ptr2 = (void*)0xbcdefa;
171 uint64_t handle2 = (uint64_t)(uintptr_t)ptr2;
172
173 reg.addPtr(ptr1);
174 reg.makeCurrentPtrsStale();
175 EXPECT_EQ(reg.numStaleEntries(), 1);
176 reg.addPtr(ptr2);
177 reg.makeCurrentPtrsStale();
178
179 EXPECT_EQ(reg.numCurrEntries(), 0);
180 EXPECT_EQ(reg.numStaleEntries(), 2);
181
182 EXPECT_EQ(reg.getPtr(handle1), ptr1);
183 EXPECT_EQ(reg.getPtr(handle2), ptr2);
184 }
185
TEST(StalePtrRegistry,AddMakeStaleTwiceWithCollision)186 TEST(StalePtrRegistry, AddMakeStaleTwiceWithCollision) {
187 StalePtrRegistry<void> reg;
188 void* ptr1 = (void*)0xabcdef;
189 uint64_t handle1 = (uint64_t)(uintptr_t)ptr1;
190 void* ptr2 = (void*)0xabcdef;
191 uint64_t handle2 = (uint64_t)(uintptr_t)ptr2;
192
193 reg.addPtr(ptr1);
194 reg.makeCurrentPtrsStale();
195 EXPECT_EQ(reg.numStaleEntries(), 1);
196 reg.addPtr(ptr2);
197 reg.makeCurrentPtrsStale();
198
199 EXPECT_EQ(reg.numCurrEntries(), 0);
200 EXPECT_EQ(reg.numStaleEntries(), 1);
201
202 EXPECT_EQ(reg.getPtr(handle1), ptr1);
203 EXPECT_EQ(reg.getPtr(handle2), ptr2);
204 }
205
206 } // namespace
207 } // namespace gfxstream
208