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