Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(103)

Side by Side Diff: base/memory/discardable_shared_memory_unittest.cc

Issue 822713002: Update from https://crrev.com/309415 (Closed) Base URL: https://github.com/domokit/mojo.git@master
Patch Set: Created 6 years ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
1 // Copyright 2014 The Chromium Authors. All rights reserved. 1 // Copyright 2014 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "base/basictypes.h" 5 #include "base/basictypes.h"
6 #include "base/memory/discardable_shared_memory.h" 6 #include "base/memory/discardable_shared_memory.h"
7 #include "base/process/process_metrics.h"
7 #include "testing/gtest/include/gtest/gtest.h" 8 #include "testing/gtest/include/gtest/gtest.h"
8 9
9 namespace base { 10 namespace base {
10 namespace { 11 namespace {
11 12
12 class TestDiscardableSharedMemory : public DiscardableSharedMemory { 13 class TestDiscardableSharedMemory : public DiscardableSharedMemory {
13 public: 14 public:
14 TestDiscardableSharedMemory() {} 15 TestDiscardableSharedMemory() {}
15 16
16 explicit TestDiscardableSharedMemory(SharedMemoryHandle handle) 17 explicit TestDiscardableSharedMemory(SharedMemoryHandle handle)
17 : DiscardableSharedMemory(handle) {} 18 : DiscardableSharedMemory(handle) {}
18 19
19 void SetNow(Time now) { now_ = now; } 20 void SetNow(Time now) { now_ = now; }
20 21
21 private: 22 private:
22 // Overriden from DiscardableSharedMemory: 23 // Overriden from DiscardableSharedMemory:
23 virtual Time Now() const override { return now_; } 24 Time Now() const override { return now_; }
24 25
25 Time now_; 26 Time now_;
26 }; 27 };
27 28
28 TEST(DiscardableSharedMemoryTest, CreateAndMap) { 29 TEST(DiscardableSharedMemoryTest, CreateAndMap) {
29 const uint32 kDataSize = 1024; 30 const uint32 kDataSize = 1024;
30 31
31 TestDiscardableSharedMemory memory; 32 TestDiscardableSharedMemory memory;
32 bool rv = memory.CreateAndMap(kDataSize); 33 bool rv = memory.CreateAndMap(kDataSize);
33 ASSERT_TRUE(rv); 34 ASSERT_TRUE(rv);
(...skipping 19 matching lines...) Expand all
53 54
54 TEST(DiscardableSharedMemoryTest, LockAndUnlock) { 55 TEST(DiscardableSharedMemoryTest, LockAndUnlock) {
55 const uint32 kDataSize = 1024; 56 const uint32 kDataSize = 1024;
56 57
57 TestDiscardableSharedMemory memory1; 58 TestDiscardableSharedMemory memory1;
58 bool rv = memory1.CreateAndMap(kDataSize); 59 bool rv = memory1.CreateAndMap(kDataSize);
59 ASSERT_TRUE(rv); 60 ASSERT_TRUE(rv);
60 61
61 // Memory is initially locked. Unlock it. 62 // Memory is initially locked. Unlock it.
62 memory1.SetNow(Time::FromDoubleT(1)); 63 memory1.SetNow(Time::FromDoubleT(1));
63 memory1.Unlock(); 64 memory1.Unlock(0, 0);
64 65
65 // Lock and unlock memory. 66 // Lock and unlock memory.
66 rv = memory1.Lock(); 67 rv = memory1.Lock(0, 0);
67 EXPECT_TRUE(rv); 68 EXPECT_TRUE(rv);
68 memory1.SetNow(Time::FromDoubleT(2)); 69 memory1.SetNow(Time::FromDoubleT(2));
69 memory1.Unlock(); 70 memory1.Unlock(0, 0);
71
72 // Lock again before duplicating and passing ownership to new instance.
73 rv = memory1.Lock(0, 0);
74 EXPECT_TRUE(rv);
70 75
71 SharedMemoryHandle shared_handle; 76 SharedMemoryHandle shared_handle;
72 ASSERT_TRUE( 77 ASSERT_TRUE(
73 memory1.ShareToProcess(GetCurrentProcessHandle(), &shared_handle)); 78 memory1.ShareToProcess(GetCurrentProcessHandle(), &shared_handle));
74 ASSERT_TRUE(SharedMemory::IsHandleValid(shared_handle)); 79 ASSERT_TRUE(SharedMemory::IsHandleValid(shared_handle));
75 80
76 TestDiscardableSharedMemory memory2(shared_handle); 81 TestDiscardableSharedMemory memory2(shared_handle);
77 rv = memory2.Map(kDataSize); 82 rv = memory2.Map(kDataSize);
78 ASSERT_TRUE(rv); 83 ASSERT_TRUE(rv);
79 84
80 // Lock first instance again.
81 rv = memory1.Lock();
82 EXPECT_TRUE(rv);
83
84 // Unlock second instance. 85 // Unlock second instance.
85 memory2.SetNow(Time::FromDoubleT(3)); 86 memory2.SetNow(Time::FromDoubleT(3));
86 memory2.Unlock(); 87 memory2.Unlock(0, 0);
87 88
88 // Lock and unlock second instance. 89 // Lock second instance before passing ownership back to first instance.
89 rv = memory2.Lock(); 90 rv = memory2.Lock(0, 0);
90 EXPECT_TRUE(rv); 91 EXPECT_TRUE(rv);
91 memory2.SetNow(Time::FromDoubleT(4));
92 memory2.Unlock();
93
94 // Try to lock first instance again. Should fail as first instance has an
95 // incorrect last know usage time.
96 rv = memory1.Lock();
97 EXPECT_FALSE(rv);
98 92
99 // Memory should still be resident. 93 // Memory should still be resident.
100 rv = memory1.IsMemoryResident(); 94 rv = memory1.IsMemoryResident();
101 EXPECT_TRUE(rv); 95 EXPECT_TRUE(rv);
102 96
103 // Second attempt to lock first instance should succeed as last known usage 97 // Unlock first instance.
104 // time is now correct. 98 memory1.SetNow(Time::FromDoubleT(4));
105 rv = memory1.Lock(); 99 memory1.Unlock(0, 0);
106 EXPECT_TRUE(rv);
107 memory1.SetNow(Time::FromDoubleT(5));
108 memory1.Unlock();
109 } 100 }
110 101
111 TEST(DiscardableSharedMemoryTest, Purge) { 102 TEST(DiscardableSharedMemoryTest, Purge) {
112 const uint32 kDataSize = 1024; 103 const uint32 kDataSize = 1024;
113 104
114 TestDiscardableSharedMemory memory1; 105 TestDiscardableSharedMemory memory1;
115 bool rv = memory1.CreateAndMap(kDataSize); 106 bool rv = memory1.CreateAndMap(kDataSize);
116 ASSERT_TRUE(rv); 107 ASSERT_TRUE(rv);
117 108
118 SharedMemoryHandle shared_handle; 109 SharedMemoryHandle shared_handle;
119 ASSERT_TRUE( 110 ASSERT_TRUE(
120 memory1.ShareToProcess(GetCurrentProcessHandle(), &shared_handle)); 111 memory1.ShareToProcess(GetCurrentProcessHandle(), &shared_handle));
121 ASSERT_TRUE(SharedMemory::IsHandleValid(shared_handle)); 112 ASSERT_TRUE(SharedMemory::IsHandleValid(shared_handle));
122 113
123 TestDiscardableSharedMemory memory2(shared_handle); 114 TestDiscardableSharedMemory memory2(shared_handle);
124 rv = memory2.Map(kDataSize); 115 rv = memory2.Map(kDataSize);
125 ASSERT_TRUE(rv); 116 ASSERT_TRUE(rv);
126 117
127 // This should fail as memory is locked. 118 // This should fail as memory is locked.
128 rv = memory1.Purge(Time::FromDoubleT(1)); 119 rv = memory1.Purge(Time::FromDoubleT(1));
129 EXPECT_FALSE(rv); 120 EXPECT_FALSE(rv);
130 121
131 memory2.SetNow(Time::FromDoubleT(2)); 122 memory2.SetNow(Time::FromDoubleT(2));
132 memory2.Unlock(); 123 memory2.Unlock(0, 0);
133 124
134 ASSERT_TRUE(memory2.IsMemoryResident()); 125 ASSERT_TRUE(memory2.IsMemoryResident());
135 126
136 // Memory is unlocked, but our usage timestamp is incorrect. 127 // Memory is unlocked, but our usage timestamp is incorrect.
137 rv = memory1.Purge(Time::FromDoubleT(3)); 128 rv = memory1.Purge(Time::FromDoubleT(3));
138 EXPECT_FALSE(rv); 129 EXPECT_FALSE(rv);
139 130
140 ASSERT_TRUE(memory2.IsMemoryResident()); 131 ASSERT_TRUE(memory2.IsMemoryResident());
141 132
142 // Memory is unlocked and our usage timestamp should be correct. 133 // Memory is unlocked and our usage timestamp should be correct.
143 rv = memory1.Purge(Time::FromDoubleT(4)); 134 rv = memory1.Purge(Time::FromDoubleT(4));
144 EXPECT_TRUE(rv); 135 EXPECT_TRUE(rv);
145 136
146 // Lock should fail as memory has been purged. 137 // Lock should fail as memory has been purged.
147 rv = memory2.Lock(); 138 rv = memory2.Lock(0, 0);
148 EXPECT_FALSE(rv); 139 EXPECT_FALSE(rv);
149 140
150 ASSERT_FALSE(memory2.IsMemoryResident()); 141 ASSERT_FALSE(memory2.IsMemoryResident());
151 } 142 }
152 143
153 TEST(DiscardableSharedMemoryTest, LastUsed) { 144 TEST(DiscardableSharedMemoryTest, LastUsed) {
154 const uint32 kDataSize = 1024; 145 const uint32 kDataSize = 1024;
155 146
156 TestDiscardableSharedMemory memory1; 147 TestDiscardableSharedMemory memory1;
157 bool rv = memory1.CreateAndMap(kDataSize); 148 bool rv = memory1.CreateAndMap(kDataSize);
158 ASSERT_TRUE(rv); 149 ASSERT_TRUE(rv);
159 150
160 SharedMemoryHandle shared_handle; 151 SharedMemoryHandle shared_handle;
161 ASSERT_TRUE( 152 ASSERT_TRUE(
162 memory1.ShareToProcess(GetCurrentProcessHandle(), &shared_handle)); 153 memory1.ShareToProcess(GetCurrentProcessHandle(), &shared_handle));
163 ASSERT_TRUE(SharedMemory::IsHandleValid(shared_handle)); 154 ASSERT_TRUE(SharedMemory::IsHandleValid(shared_handle));
164 155
165 TestDiscardableSharedMemory memory2(shared_handle); 156 TestDiscardableSharedMemory memory2(shared_handle);
166 rv = memory2.Map(kDataSize); 157 rv = memory2.Map(kDataSize);
167 ASSERT_TRUE(rv); 158 ASSERT_TRUE(rv);
168 159
169 memory2.SetNow(Time::FromDoubleT(1)); 160 memory2.SetNow(Time::FromDoubleT(1));
170 memory2.Unlock(); 161 memory2.Unlock(0, 0);
171 162
172 EXPECT_EQ(memory2.last_known_usage(), Time::FromDoubleT(1)); 163 EXPECT_EQ(memory2.last_known_usage(), Time::FromDoubleT(1));
173 164
174 rv = memory2.Lock(); 165 rv = memory2.Lock(0, 0);
175 EXPECT_TRUE(rv); 166 EXPECT_TRUE(rv);
176 167
177 // This should fail as memory is locked. 168 // This should fail as memory is locked.
178 rv = memory1.Purge(Time::FromDoubleT(2)); 169 rv = memory1.Purge(Time::FromDoubleT(2));
179 ASSERT_FALSE(rv); 170 ASSERT_FALSE(rv);
180 171
181 // Last usage should have been updated to timestamp passed to Purge above. 172 // Last usage should have been updated to timestamp passed to Purge above.
182 EXPECT_EQ(memory1.last_known_usage(), Time::FromDoubleT(2)); 173 EXPECT_EQ(memory1.last_known_usage(), Time::FromDoubleT(2));
183 174
184 memory2.SetNow(Time::FromDoubleT(3)); 175 memory2.SetNow(Time::FromDoubleT(3));
185 memory2.Unlock(); 176 memory2.Unlock(0, 0);
186 177
187 // Usage time should be correct for |memory2| instance. 178 // Usage time should be correct for |memory2| instance.
188 EXPECT_EQ(memory2.last_known_usage(), Time::FromDoubleT(3)); 179 EXPECT_EQ(memory2.last_known_usage(), Time::FromDoubleT(3));
189 180
190 // However, usage time has not changed as far as |memory1| instance knows. 181 // However, usage time has not changed as far as |memory1| instance knows.
191 EXPECT_EQ(memory1.last_known_usage(), Time::FromDoubleT(2)); 182 EXPECT_EQ(memory1.last_known_usage(), Time::FromDoubleT(2));
192 183
193 // Memory is unlocked, but our usage timestamp is incorrect. 184 // Memory is unlocked, but our usage timestamp is incorrect.
194 rv = memory1.Purge(Time::FromDoubleT(4)); 185 rv = memory1.Purge(Time::FromDoubleT(4));
195 EXPECT_FALSE(rv); 186 EXPECT_FALSE(rv);
(...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after
228 SharedMemoryHandle shared_handle; 219 SharedMemoryHandle shared_handle;
229 ASSERT_TRUE( 220 ASSERT_TRUE(
230 memory1.ShareToProcess(GetCurrentProcessHandle(), &shared_handle)); 221 memory1.ShareToProcess(GetCurrentProcessHandle(), &shared_handle));
231 ASSERT_TRUE(SharedMemory::IsHandleValid(shared_handle)); 222 ASSERT_TRUE(SharedMemory::IsHandleValid(shared_handle));
232 223
233 TestDiscardableSharedMemory memory2(shared_handle); 224 TestDiscardableSharedMemory memory2(shared_handle);
234 rv = memory2.Map(kDataSize); 225 rv = memory2.Map(kDataSize);
235 ASSERT_TRUE(rv); 226 ASSERT_TRUE(rv);
236 227
237 memory2.SetNow(Time::FromDoubleT(1)); 228 memory2.SetNow(Time::FromDoubleT(1));
238 memory2.Unlock(); 229 memory2.Unlock(0, 0);
239 230
240 rv = memory2.Purge(Time::FromDoubleT(2)); 231 rv = memory2.Purge(Time::FromDoubleT(2));
241 EXPECT_TRUE(rv); 232 EXPECT_TRUE(rv);
242 233
243 // Lock should fail as memory has been purged. 234 // Lock should fail as memory has been purged.
244 rv = memory2.Lock(); 235 rv = memory2.Lock(0, 0);
245 EXPECT_FALSE(rv); 236 EXPECT_FALSE(rv);
246 rv = memory1.Lock(); 237 rv = memory1.Lock(0, 0);
247 EXPECT_FALSE(rv); 238 EXPECT_FALSE(rv);
248 } 239 }
249 240
241 TEST(DiscardableSharedMemoryTest, LockAndUnlockRange) {
242 const uint32 kDataSize = 32;
243
244 uint32 data_size_in_bytes = kDataSize * base::GetPageSize();
245
246 TestDiscardableSharedMemory memory1;
247 bool rv = memory1.CreateAndMap(data_size_in_bytes);
248 ASSERT_TRUE(rv);
249
250 SharedMemoryHandle shared_handle;
251 ASSERT_TRUE(
252 memory1.ShareToProcess(GetCurrentProcessHandle(), &shared_handle));
253 ASSERT_TRUE(SharedMemory::IsHandleValid(shared_handle));
254
255 TestDiscardableSharedMemory memory2(shared_handle);
256 rv = memory2.Map(data_size_in_bytes);
257 ASSERT_TRUE(rv);
258
259 // Unlock first page.
260 memory2.SetNow(Time::FromDoubleT(1));
261 memory2.Unlock(0, base::GetPageSize());
262
263 rv = memory1.Purge(Time::FromDoubleT(2));
264 EXPECT_FALSE(rv);
265
266 // Unlock second page.
267 memory2.SetNow(Time::FromDoubleT(3));
268 memory2.Unlock(base::GetPageSize(), base::GetPageSize());
269
270 rv = memory1.Purge(Time::FromDoubleT(4));
271 EXPECT_FALSE(rv);
272
273 // Unlock anything onwards.
274 memory2.SetNow(Time::FromDoubleT(5));
275 memory2.Unlock(2 * base::GetPageSize(), 0);
276
277 // Memory is unlocked, but our usage timestamp is incorrect.
278 rv = memory1.Purge(Time::FromDoubleT(6));
279 EXPECT_FALSE(rv);
280
281 // The failed purge attempt should have updated usage time to the correct
282 // value.
283 EXPECT_EQ(Time::FromDoubleT(5), memory1.last_known_usage());
284
285 // Purge should now succeed.
286 rv = memory1.Purge(Time::FromDoubleT(7));
287 EXPECT_TRUE(rv);
288 }
289
250 } // namespace 290 } // namespace
251 } // namespace base 291 } // namespace base
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698