OLD | NEW |
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 "base/process/process_metrics.h" |
8 #include "testing/gtest/include/gtest/gtest.h" | 8 #include "testing/gtest/include/gtest/gtest.h" |
9 | 9 |
10 namespace base { | 10 namespace base { |
(...skipping 216 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
227 | 227 |
228 memory2.SetNow(Time::FromDoubleT(1)); | 228 memory2.SetNow(Time::FromDoubleT(1)); |
229 memory2.Unlock(0, 0); | 229 memory2.Unlock(0, 0); |
230 | 230 |
231 rv = memory2.Purge(Time::FromDoubleT(2)); | 231 rv = memory2.Purge(Time::FromDoubleT(2)); |
232 EXPECT_TRUE(rv); | 232 EXPECT_TRUE(rv); |
233 | 233 |
234 // Lock should fail as memory has been purged. | 234 // Lock should fail as memory has been purged. |
235 auto lock_rv = memory2.Lock(0, 0); | 235 auto lock_rv = memory2.Lock(0, 0); |
236 EXPECT_EQ(DiscardableSharedMemory::FAILED, lock_rv); | 236 EXPECT_EQ(DiscardableSharedMemory::FAILED, lock_rv); |
237 lock_rv = memory1.Lock(0, 0); | |
238 EXPECT_EQ(DiscardableSharedMemory::FAILED, lock_rv); | |
239 } | 237 } |
240 | 238 |
241 TEST(DiscardableSharedMemoryTest, LockAndUnlockRange) { | 239 TEST(DiscardableSharedMemoryTest, LockAndUnlockRange) { |
242 const uint32 kDataSize = 32; | 240 const uint32 kDataSize = 32; |
243 | 241 |
244 uint32 data_size_in_bytes = kDataSize * base::GetPageSize(); | 242 uint32 data_size_in_bytes = kDataSize * base::GetPageSize(); |
245 | 243 |
246 TestDiscardableSharedMemory memory1; | 244 TestDiscardableSharedMemory memory1; |
247 bool rv = memory1.CreateAndMap(data_size_in_bytes); | 245 bool rv = memory1.CreateAndMap(data_size_in_bytes); |
248 ASSERT_TRUE(rv); | 246 ASSERT_TRUE(rv); |
249 | 247 |
250 SharedMemoryHandle shared_handle; | 248 SharedMemoryHandle shared_handle; |
251 ASSERT_TRUE( | 249 ASSERT_TRUE( |
252 memory1.ShareToProcess(GetCurrentProcessHandle(), &shared_handle)); | 250 memory1.ShareToProcess(GetCurrentProcessHandle(), &shared_handle)); |
253 ASSERT_TRUE(SharedMemory::IsHandleValid(shared_handle)); | 251 ASSERT_TRUE(SharedMemory::IsHandleValid(shared_handle)); |
254 | 252 |
255 TestDiscardableSharedMemory memory2(shared_handle); | 253 TestDiscardableSharedMemory memory2(shared_handle); |
256 rv = memory2.Map(data_size_in_bytes); | 254 rv = memory2.Map(data_size_in_bytes); |
257 ASSERT_TRUE(rv); | 255 ASSERT_TRUE(rv); |
258 | 256 |
259 // Unlock first page. | 257 // Unlock first page. |
260 memory2.SetNow(Time::FromDoubleT(1)); | 258 memory2.SetNow(Time::FromDoubleT(1)); |
261 memory2.Unlock(0, base::GetPageSize()); | 259 memory2.Unlock(0, base::GetPageSize()); |
262 | 260 |
263 rv = memory1.Purge(Time::FromDoubleT(2)); | 261 rv = memory1.Purge(Time::FromDoubleT(2)); |
264 EXPECT_FALSE(rv); | 262 EXPECT_FALSE(rv); |
265 | 263 |
| 264 // Lock first page again. |
| 265 memory2.SetNow(Time::FromDoubleT(3)); |
| 266 auto lock_rv = memory2.Lock(0, base::GetPageSize()); |
| 267 EXPECT_NE(DiscardableSharedMemory::FAILED, lock_rv); |
| 268 |
| 269 // Unlock first page. |
| 270 memory2.SetNow(Time::FromDoubleT(4)); |
| 271 memory2.Unlock(0, base::GetPageSize()); |
| 272 |
| 273 rv = memory1.Purge(Time::FromDoubleT(5)); |
| 274 EXPECT_FALSE(rv); |
| 275 |
266 // Unlock second page. | 276 // Unlock second page. |
267 memory2.SetNow(Time::FromDoubleT(3)); | 277 memory2.SetNow(Time::FromDoubleT(6)); |
268 memory2.Unlock(base::GetPageSize(), base::GetPageSize()); | 278 memory2.Unlock(base::GetPageSize(), base::GetPageSize()); |
269 | 279 |
270 rv = memory1.Purge(Time::FromDoubleT(4)); | 280 rv = memory1.Purge(Time::FromDoubleT(7)); |
271 EXPECT_FALSE(rv); | 281 EXPECT_FALSE(rv); |
272 | 282 |
273 // Unlock anything onwards. | 283 // Unlock anything onwards. |
274 memory2.SetNow(Time::FromDoubleT(5)); | 284 memory2.SetNow(Time::FromDoubleT(8)); |
275 memory2.Unlock(2 * base::GetPageSize(), 0); | 285 memory2.Unlock(2 * base::GetPageSize(), 0); |
276 | 286 |
277 // Memory is unlocked, but our usage timestamp is incorrect. | 287 // Memory is unlocked, but our usage timestamp is incorrect. |
278 rv = memory1.Purge(Time::FromDoubleT(6)); | 288 rv = memory1.Purge(Time::FromDoubleT(9)); |
279 EXPECT_FALSE(rv); | 289 EXPECT_FALSE(rv); |
280 | 290 |
281 // The failed purge attempt should have updated usage time to the correct | 291 // The failed purge attempt should have updated usage time to the correct |
282 // value. | 292 // value. |
283 EXPECT_EQ(Time::FromDoubleT(5), memory1.last_known_usage()); | 293 EXPECT_EQ(Time::FromDoubleT(8), memory1.last_known_usage()); |
284 | 294 |
285 // Purge should now succeed. | 295 // Purge should now succeed. |
286 rv = memory1.Purge(Time::FromDoubleT(7)); | 296 rv = memory1.Purge(Time::FromDoubleT(10)); |
287 EXPECT_TRUE(rv); | 297 EXPECT_TRUE(rv); |
288 } | 298 } |
289 | 299 |
290 TEST(DiscardableSharedMemoryTest, MappedSize) { | 300 TEST(DiscardableSharedMemoryTest, MappedSize) { |
291 const uint32 kDataSize = 1024; | 301 const uint32 kDataSize = 1024; |
292 | 302 |
293 TestDiscardableSharedMemory memory; | 303 TestDiscardableSharedMemory memory; |
294 bool rv = memory.CreateAndMap(kDataSize); | 304 bool rv = memory.CreateAndMap(kDataSize); |
295 ASSERT_TRUE(rv); | 305 ASSERT_TRUE(rv); |
296 | 306 |
297 EXPECT_LE(kDataSize, memory.mapped_size()); | 307 EXPECT_LE(kDataSize, memory.mapped_size()); |
298 | 308 |
299 // Mapped size should be 0 after memory segment has been closed. | 309 // Mapped size should be 0 after memory segment has been closed. |
300 memory.Close(); | 310 memory.Close(); |
301 EXPECT_EQ(0u, memory.mapped_size()); | 311 EXPECT_EQ(0u, memory.mapped_size()); |
302 } | 312 } |
303 | 313 |
304 } // namespace | 314 } // namespace |
305 } // namespace base | 315 } // namespace base |
OLD | NEW |