OLD | NEW |
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 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/memory/shared_memory.h" | 5 #include "base/memory/shared_memory.h" |
6 | 6 |
7 #include <stddef.h> | 7 #include <stddef.h> |
8 #include <stdint.h> | 8 #include <stdint.h> |
9 | 9 |
10 #include <memory> | 10 #include <memory> |
(...skipping 317 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
328 // The Mach functionality is tested in shared_memory_mac_unittest.cc. | 328 // The Mach functionality is tested in shared_memory_mac_unittest.cc. |
329 options.type = SharedMemoryHandle::POSIX; | 329 options.type = SharedMemoryHandle::POSIX; |
330 #endif | 330 #endif |
331 ASSERT_TRUE(writable_shmem.Create(options)); | 331 ASSERT_TRUE(writable_shmem.Create(options)); |
332 ASSERT_TRUE(writable_shmem.Map(options.size)); | 332 ASSERT_TRUE(writable_shmem.Map(options.size)); |
333 memcpy(writable_shmem.memory(), contents.data(), contents.size()); | 333 memcpy(writable_shmem.memory(), contents.data(), contents.size()); |
334 EXPECT_TRUE(writable_shmem.Unmap()); | 334 EXPECT_TRUE(writable_shmem.Unmap()); |
335 | 335 |
336 SharedMemoryHandle readonly_handle = writable_shmem.GetReadOnlyHandle(); | 336 SharedMemoryHandle readonly_handle = writable_shmem.GetReadOnlyHandle(); |
337 EXPECT_EQ(writable_shmem.handle().GetGUID(), readonly_handle.GetGUID()); | 337 EXPECT_EQ(writable_shmem.handle().GetGUID(), readonly_handle.GetGUID()); |
| 338 EXPECT_EQ(writable_shmem.handle().GetSize(), readonly_handle.GetSize()); |
338 ASSERT_TRUE(readonly_handle.IsValid()); | 339 ASSERT_TRUE(readonly_handle.IsValid()); |
339 SharedMemory readonly_shmem(readonly_handle, /*readonly=*/true); | 340 SharedMemory readonly_shmem(readonly_handle, /*readonly=*/true); |
340 | 341 |
341 ASSERT_TRUE(readonly_shmem.Map(contents.size())); | 342 ASSERT_TRUE(readonly_shmem.Map(contents.size())); |
342 EXPECT_EQ(contents, | 343 EXPECT_EQ(contents, |
343 StringPiece(static_cast<const char*>(readonly_shmem.memory()), | 344 StringPiece(static_cast<const char*>(readonly_shmem.memory()), |
344 contents.size())); | 345 contents.size())); |
345 EXPECT_TRUE(readonly_shmem.Unmap()); | 346 EXPECT_TRUE(readonly_shmem.Unmap()); |
346 | 347 |
347 // Make sure the writable instance is still writable. | 348 // Make sure the writable instance is still writable. |
(...skipping 59 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
407 TEST(SharedMemoryTest, ShareToSelf) { | 408 TEST(SharedMemoryTest, ShareToSelf) { |
408 StringPiece contents = "Hello World"; | 409 StringPiece contents = "Hello World"; |
409 | 410 |
410 SharedMemory shmem; | 411 SharedMemory shmem; |
411 ASSERT_TRUE(shmem.CreateAndMapAnonymous(contents.size())); | 412 ASSERT_TRUE(shmem.CreateAndMapAnonymous(contents.size())); |
412 memcpy(shmem.memory(), contents.data(), contents.size()); | 413 memcpy(shmem.memory(), contents.data(), contents.size()); |
413 EXPECT_TRUE(shmem.Unmap()); | 414 EXPECT_TRUE(shmem.Unmap()); |
414 | 415 |
415 SharedMemoryHandle shared_handle = shmem.handle().Duplicate(); | 416 SharedMemoryHandle shared_handle = shmem.handle().Duplicate(); |
416 ASSERT_TRUE(shared_handle.IsValid()); | 417 ASSERT_TRUE(shared_handle.IsValid()); |
417 #if defined(OS_WIN) | 418 EXPECT_TRUE(shared_handle.OwnershipPassesToIPC()); |
418 ASSERT_TRUE(shared_handle.OwnershipPassesToIPC()); | 419 EXPECT_EQ(shared_handle.GetGUID(), shmem.handle().GetGUID()); |
419 #endif | 420 EXPECT_EQ(shared_handle.GetSize(), shmem.handle().GetSize()); |
420 SharedMemory shared(shared_handle, /*readonly=*/false); | 421 SharedMemory shared(shared_handle, /*readonly=*/false); |
421 | 422 |
422 ASSERT_TRUE(shared.Map(contents.size())); | 423 ASSERT_TRUE(shared.Map(contents.size())); |
423 EXPECT_EQ( | 424 EXPECT_EQ( |
424 contents, | 425 contents, |
425 StringPiece(static_cast<const char*>(shared.memory()), contents.size())); | 426 StringPiece(static_cast<const char*>(shared.memory()), contents.size())); |
426 | 427 |
427 shared_handle = shmem.handle().Duplicate(); | 428 shared_handle = shmem.handle().Duplicate(); |
428 ASSERT_TRUE(shared_handle.IsValid()); | 429 ASSERT_TRUE(shared_handle.IsValid()); |
429 #if defined(OS_WIN) | |
430 ASSERT_TRUE(shared_handle.OwnershipPassesToIPC()); | 430 ASSERT_TRUE(shared_handle.OwnershipPassesToIPC()); |
431 #endif | |
432 SharedMemory readonly(shared_handle, /*readonly=*/true); | 431 SharedMemory readonly(shared_handle, /*readonly=*/true); |
433 | 432 |
434 ASSERT_TRUE(readonly.Map(contents.size())); | 433 ASSERT_TRUE(readonly.Map(contents.size())); |
435 EXPECT_EQ(contents, | 434 EXPECT_EQ(contents, |
436 StringPiece(static_cast<const char*>(readonly.memory()), | 435 StringPiece(static_cast<const char*>(readonly.memory()), |
437 contents.size())); | 436 contents.size())); |
438 } | 437 } |
439 | 438 |
440 TEST(SharedMemoryTest, MapAt) { | 439 TEST(SharedMemoryTest, MapAt) { |
441 ASSERT_TRUE(SysInfo::VMAllocationGranularity() >= sizeof(uint32_t)); | 440 ASSERT_TRUE(SysInfo::VMAllocationGranularity() >= sizeof(uint32_t)); |
(...skipping 158 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
600 PAGE_READONLY | SEC_IMAGE, 0, 0, kTestSectionName)); | 599 PAGE_READONLY | SEC_IMAGE, 0, 0, kTestSectionName)); |
601 EXPECT_TRUE(section_handle.IsValid()); | 600 EXPECT_TRUE(section_handle.IsValid()); |
602 | 601 |
603 // Check direct opening by name, from handle and duplicated from handle. | 602 // Check direct opening by name, from handle and duplicated from handle. |
604 SharedMemory shared_memory_open; | 603 SharedMemory shared_memory_open; |
605 EXPECT_TRUE(shared_memory_open.Open(kTestSectionName, true)); | 604 EXPECT_TRUE(shared_memory_open.Open(kTestSectionName, true)); |
606 EXPECT_FALSE(shared_memory_open.Map(1)); | 605 EXPECT_FALSE(shared_memory_open.Map(1)); |
607 EXPECT_EQ(nullptr, shared_memory_open.memory()); | 606 EXPECT_EQ(nullptr, shared_memory_open.memory()); |
608 | 607 |
609 SharedMemory shared_memory_handle_local( | 608 SharedMemory shared_memory_handle_local( |
610 SharedMemoryHandle(section_handle.Take(), UnguessableToken::Create()), | 609 SharedMemoryHandle(section_handle.Take(), 1, UnguessableToken::Create()), |
611 true); | 610 true); |
612 EXPECT_FALSE(shared_memory_handle_local.Map(1)); | 611 EXPECT_FALSE(shared_memory_handle_local.Map(1)); |
613 EXPECT_EQ(nullptr, shared_memory_handle_local.memory()); | 612 EXPECT_EQ(nullptr, shared_memory_handle_local.memory()); |
614 | 613 |
615 // Check that a handle without SECTION_QUERY also can't be mapped as it can't | 614 // Check that a handle without SECTION_QUERY also can't be mapped as it can't |
616 // be checked. | 615 // be checked. |
617 SharedMemory shared_memory_handle_dummy; | 616 SharedMemory shared_memory_handle_dummy; |
618 SharedMemoryCreateOptions options; | 617 SharedMemoryCreateOptions options; |
619 options.size = 0x1000; | 618 options.size = 0x1000; |
620 EXPECT_TRUE(shared_memory_handle_dummy.Create(options)); | 619 EXPECT_TRUE(shared_memory_handle_dummy.Create(options)); |
621 HANDLE handle_no_query; | 620 HANDLE handle_no_query; |
622 EXPECT_TRUE(::DuplicateHandle( | 621 EXPECT_TRUE(::DuplicateHandle( |
623 ::GetCurrentProcess(), shared_memory_handle_dummy.handle().GetHandle(), | 622 ::GetCurrentProcess(), shared_memory_handle_dummy.handle().GetHandle(), |
624 ::GetCurrentProcess(), &handle_no_query, FILE_MAP_READ, FALSE, 0)); | 623 ::GetCurrentProcess(), &handle_no_query, FILE_MAP_READ, FALSE, 0)); |
625 SharedMemory shared_memory_handle_no_query( | 624 SharedMemory shared_memory_handle_no_query( |
626 SharedMemoryHandle(handle_no_query, UnguessableToken::Create()), true); | 625 SharedMemoryHandle(handle_no_query, options.size, |
| 626 UnguessableToken::Create()), |
| 627 true); |
627 EXPECT_FALSE(shared_memory_handle_no_query.Map(1)); | 628 EXPECT_FALSE(shared_memory_handle_no_query.Map(1)); |
628 EXPECT_EQ(nullptr, shared_memory_handle_no_query.memory()); | 629 EXPECT_EQ(nullptr, shared_memory_handle_no_query.memory()); |
629 } | 630 } |
630 #endif // defined(OS_WIN) | 631 #endif // defined(OS_WIN) |
631 | 632 |
632 // iOS does not allow multiple processes. | 633 // iOS does not allow multiple processes. |
633 // Android ashmem does not support named shared memory. | 634 // Android ashmem does not support named shared memory. |
634 // Mac SharedMemory does not support named shared memory. crbug.com/345734 | 635 // Mac SharedMemory does not support named shared memory. crbug.com/345734 |
635 #if !defined(OS_IOS) && !defined(OS_ANDROID) && !defined(OS_MACOSX) | 636 #if !defined(OS_IOS) && !defined(OS_ANDROID) && !defined(OS_MACOSX) |
636 // On POSIX it is especially important we test shmem across processes, | 637 // On POSIX it is especially important we test shmem across processes, |
(...skipping 66 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
703 memory.Close(); | 704 memory.Close(); |
704 SharedMemoryProcessTest::CleanUp(); | 705 SharedMemoryProcessTest::CleanUp(); |
705 } | 706 } |
706 | 707 |
707 MULTIPROCESS_TEST_MAIN(SharedMemoryTestMain) { | 708 MULTIPROCESS_TEST_MAIN(SharedMemoryTestMain) { |
708 return SharedMemoryProcessTest::TaskTestMain(); | 709 return SharedMemoryProcessTest::TaskTestMain(); |
709 } | 710 } |
710 #endif // !defined(OS_IOS) && !defined(OS_ANDROID) && !defined(OS_MACOSX) | 711 #endif // !defined(OS_IOS) && !defined(OS_ANDROID) && !defined(OS_MACOSX) |
711 | 712 |
712 } // namespace base | 713 } // namespace base |
OLD | NEW |