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

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

Issue 1897623002: Remove POSIX shared memory. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Comments from amistry. Created 4 years, 8 months 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
« no previous file with comments | « base/memory/shared_memory_mac.cc ('k') | components/nacl/loader/nacl_ipc_adapter.cc » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
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 298 matching lines...) Expand 10 before | Expand all | Expand 10 after
309 else 309 else
310 EXPECT_EQ(0, pointers[j][0]); 310 EXPECT_EQ(0, pointers[j][0]);
311 } 311 }
312 } 312 }
313 313
314 for (int i = 0; i < count; i++) { 314 for (int i = 0; i < count; i++) {
315 memories[i].Close(); 315 memories[i].Close();
316 } 316 }
317 } 317 }
318 318
319 // The Mach functionality is tested in shared_memory_mac_unittest.cc.
320 #if !(defined(OS_MACOSX) && !defined(OS_IOS))
319 TEST(SharedMemoryTest, ShareReadOnly) { 321 TEST(SharedMemoryTest, ShareReadOnly) {
320 StringPiece contents = "Hello World"; 322 StringPiece contents = "Hello World";
321 323
322 SharedMemory writable_shmem; 324 SharedMemory writable_shmem;
323 SharedMemoryCreateOptions options; 325 SharedMemoryCreateOptions options;
324 options.size = contents.size(); 326 options.size = contents.size();
325 options.share_read_only = true; 327 options.share_read_only = true;
326 #if defined(OS_MACOSX) && !defined(OS_IOS)
327 // The Mach functionality is tested in shared_memory_mac_unittest.cc.
328 options.type = SharedMemoryHandle::POSIX;
329 #endif
330 ASSERT_TRUE(writable_shmem.Create(options)); 328 ASSERT_TRUE(writable_shmem.Create(options));
331 ASSERT_TRUE(writable_shmem.Map(options.size)); 329 ASSERT_TRUE(writable_shmem.Map(options.size));
332 memcpy(writable_shmem.memory(), contents.data(), contents.size()); 330 memcpy(writable_shmem.memory(), contents.data(), contents.size());
333 EXPECT_TRUE(writable_shmem.Unmap()); 331 EXPECT_TRUE(writable_shmem.Unmap());
334 332
335 SharedMemoryHandle readonly_handle; 333 SharedMemoryHandle readonly_handle;
336 ASSERT_TRUE(writable_shmem.ShareReadOnlyToProcess(GetCurrentProcessHandle(), 334 ASSERT_TRUE(writable_shmem.ShareReadOnlyToProcess(GetCurrentProcessHandle(),
337 &readonly_handle)); 335 &readonly_handle));
338 SharedMemory readonly_shmem(readonly_handle, /*readonly=*/true); 336 SharedMemory readonly_shmem(readonly_handle, /*readonly=*/true);
339 337
(...skipping 55 matching lines...) Expand 10 before | Expand all | Expand 10 after
395 GetCurrentProcess(), &temp_handle, FILE_MAP_READ, 393 GetCurrentProcess(), &temp_handle, FILE_MAP_READ,
396 false, 0); 394 false, 0);
397 EXPECT_EQ(TRUE, rv) 395 EXPECT_EQ(TRUE, rv)
398 << "Should be able to duplicate the handle into a readable one."; 396 << "Should be able to duplicate the handle into a readable one.";
399 if (rv) 397 if (rv)
400 win::ScopedHandle writable_handle(temp_handle); 398 win::ScopedHandle writable_handle(temp_handle);
401 #else 399 #else
402 #error Unexpected platform; write a test that tries to make 'handle' writable. 400 #error Unexpected platform; write a test that tries to make 'handle' writable.
403 #endif // defined(OS_POSIX) || defined(OS_WIN) 401 #endif // defined(OS_POSIX) || defined(OS_WIN)
404 } 402 }
403 #endif // !(defined(OS_MACOSX) && !defined(OS_IOS))
405 404
406 TEST(SharedMemoryTest, ShareToSelf) { 405 TEST(SharedMemoryTest, ShareToSelf) {
407 StringPiece contents = "Hello World"; 406 StringPiece contents = "Hello World";
408 407
409 SharedMemory shmem; 408 SharedMemory shmem;
410 ASSERT_TRUE(shmem.CreateAndMapAnonymous(contents.size())); 409 ASSERT_TRUE(shmem.CreateAndMapAnonymous(contents.size()));
411 memcpy(shmem.memory(), contents.data(), contents.size()); 410 memcpy(shmem.memory(), contents.data(), contents.size());
412 EXPECT_TRUE(shmem.Unmap()); 411 EXPECT_TRUE(shmem.Unmap());
413 412
414 SharedMemoryHandle shared_handle; 413 SharedMemoryHandle shared_handle;
(...skipping 53 matching lines...) Expand 10 before | Expand all | Expand 10 after
468 bool rv = memory.CreateAndMapAnonymous(kDataSize); 467 bool rv = memory.CreateAndMapAnonymous(kDataSize);
469 EXPECT_TRUE(rv); 468 EXPECT_TRUE(rv);
470 469
471 void* old_address = memory.memory(); 470 void* old_address = memory.memory();
472 471
473 rv = memory.Map(kDataSize); 472 rv = memory.Map(kDataSize);
474 EXPECT_FALSE(rv); 473 EXPECT_FALSE(rv);
475 EXPECT_EQ(old_address, memory.memory()); 474 EXPECT_EQ(old_address, memory.memory());
476 } 475 }
477 476
478 #if defined(OS_POSIX) 477 #if defined(OS_POSIX) && !(defined(OS_MACOSX) && !defined(OS_IOS))
479 // This test is not applicable for iOS (crbug.com/399384). 478 // This test is not applicable for iOS (crbug.com/399384).
480 #if !defined(OS_IOS) 479 #if !defined(OS_IOS)
481 // Create a shared memory object, mmap it, and mprotect it to PROT_EXEC. 480 // Create a shared memory object, mmap it, and mprotect it to PROT_EXEC.
482 TEST(SharedMemoryTest, AnonymousExecutable) { 481 TEST(SharedMemoryTest, AnonymousExecutable) {
483 const uint32_t kTestSize = 1 << 16; 482 const uint32_t kTestSize = 1 << 16;
484 483
485 SharedMemory shared_memory; 484 SharedMemory shared_memory;
486 SharedMemoryCreateOptions options; 485 SharedMemoryCreateOptions options;
487 options.size = kTestSize; 486 options.size = kTestSize;
488 options.executable = true; 487 options.executable = true;
489 #if defined(OS_MACOSX) && !defined(OS_IOS)
490 // The Mach functionality is tested in shared_memory_mac_unittest.cc.
491 options.type = SharedMemoryHandle::POSIX;
492 #endif
493 488
494 EXPECT_TRUE(shared_memory.Create(options)); 489 EXPECT_TRUE(shared_memory.Create(options));
495 EXPECT_TRUE(shared_memory.Map(shared_memory.requested_size())); 490 EXPECT_TRUE(shared_memory.Map(shared_memory.requested_size()));
496 491
497 EXPECT_EQ(0, mprotect(shared_memory.memory(), shared_memory.requested_size(), 492 EXPECT_EQ(0, mprotect(shared_memory.memory(), shared_memory.requested_size(),
498 PROT_READ | PROT_EXEC)); 493 PROT_READ | PROT_EXEC));
499 } 494 }
500 #endif // !defined(OS_IOS) 495 #endif // !defined(OS_IOS)
501 496
502 // Android supports a different permission model than POSIX for its "ashmem" 497 // Android supports a different permission model than POSIX for its "ashmem"
(...skipping 13 matching lines...) Expand all
516 DISALLOW_IMPLICIT_CONSTRUCTORS(ScopedUmaskSetter); 511 DISALLOW_IMPLICIT_CONSTRUCTORS(ScopedUmaskSetter);
517 }; 512 };
518 513
519 // Create a shared memory object, check its permissions. 514 // Create a shared memory object, check its permissions.
520 TEST(SharedMemoryTest, FilePermissionsAnonymous) { 515 TEST(SharedMemoryTest, FilePermissionsAnonymous) {
521 const uint32_t kTestSize = 1 << 8; 516 const uint32_t kTestSize = 1 << 8;
522 517
523 SharedMemory shared_memory; 518 SharedMemory shared_memory;
524 SharedMemoryCreateOptions options; 519 SharedMemoryCreateOptions options;
525 options.size = kTestSize; 520 options.size = kTestSize;
526 #if defined(OS_MACOSX) && !defined(OS_IOS)
527 // The Mach functionality is tested in shared_memory_mac_unittest.cc.
528 options.type = SharedMemoryHandle::POSIX;
529 #endif
530 // Set a file mode creation mask that gives all permissions. 521 // Set a file mode creation mask that gives all permissions.
531 ScopedUmaskSetter permissive_mask(S_IWGRP | S_IWOTH); 522 ScopedUmaskSetter permissive_mask(S_IWGRP | S_IWOTH);
532 523
533 EXPECT_TRUE(shared_memory.Create(options)); 524 EXPECT_TRUE(shared_memory.Create(options));
534 525
535 int shm_fd = 526 int shm_fd =
536 SharedMemory::GetFdFromSharedMemoryHandle(shared_memory.handle()); 527 SharedMemory::GetFdFromSharedMemoryHandle(shared_memory.handle());
537 struct stat shm_stat; 528 struct stat shm_stat;
538 EXPECT_EQ(0, fstat(shm_fd, &shm_stat)); 529 EXPECT_EQ(0, fstat(shm_fd, &shm_stat));
539 // Neither the group, nor others should be able to read the shared memory 530 // Neither the group, nor others should be able to read the shared memory
540 // file. 531 // file.
541 EXPECT_FALSE(shm_stat.st_mode & S_IRWXO); 532 EXPECT_FALSE(shm_stat.st_mode & S_IRWXO);
542 EXPECT_FALSE(shm_stat.st_mode & S_IRWXG); 533 EXPECT_FALSE(shm_stat.st_mode & S_IRWXG);
543 } 534 }
544 535
545 // Create a shared memory object, check its permissions. 536 // Create a shared memory object, check its permissions.
546 TEST(SharedMemoryTest, FilePermissionsNamed) { 537 TEST(SharedMemoryTest, FilePermissionsNamed) {
547 const uint32_t kTestSize = 1 << 8; 538 const uint32_t kTestSize = 1 << 8;
548 539
549 SharedMemory shared_memory; 540 SharedMemory shared_memory;
550 SharedMemoryCreateOptions options; 541 SharedMemoryCreateOptions options;
551 options.size = kTestSize; 542 options.size = kTestSize;
552 #if defined(OS_MACOSX) && !defined(OS_IOS)
553 // The Mach functionality is tested in shared_memory_mac_unittest.cc.
554 options.type = SharedMemoryHandle::POSIX;
555 #endif
556 543
557 // Set a file mode creation mask that gives all permissions. 544 // Set a file mode creation mask that gives all permissions.
558 ScopedUmaskSetter permissive_mask(S_IWGRP | S_IWOTH); 545 ScopedUmaskSetter permissive_mask(S_IWGRP | S_IWOTH);
559 546
560 EXPECT_TRUE(shared_memory.Create(options)); 547 EXPECT_TRUE(shared_memory.Create(options));
561 548
562 int fd = SharedMemory::GetFdFromSharedMemoryHandle(shared_memory.handle()); 549 int fd = SharedMemory::GetFdFromSharedMemoryHandle(shared_memory.handle());
563 struct stat shm_stat; 550 struct stat shm_stat;
564 EXPECT_EQ(0, fstat(fd, &shm_stat)); 551 EXPECT_EQ(0, fstat(fd, &shm_stat));
565 // Neither the group, nor others should have been able to open the shared 552 // Neither the group, nor others should have been able to open the shared
566 // memory file while its name existed. 553 // memory file while its name existed.
567 EXPECT_FALSE(shm_stat.st_mode & S_IRWXO); 554 EXPECT_FALSE(shm_stat.st_mode & S_IRWXO);
568 EXPECT_FALSE(shm_stat.st_mode & S_IRWXG); 555 EXPECT_FALSE(shm_stat.st_mode & S_IRWXG);
569 } 556 }
570 #endif // !defined(OS_ANDROID) 557 #endif // !defined(OS_ANDROID)
571 558
572 #endif // defined(OS_POSIX) 559 #endif // defined(OS_POSIX) && !(defined(OS_MACOSX) && !defined(OS_IOS))
573 560
574 // Map() will return addresses which are aligned to the platform page size, this 561 // Map() will return addresses which are aligned to the platform page size, this
575 // varies from platform to platform though. Since we'd like to advertise a 562 // varies from platform to platform though. Since we'd like to advertise a
576 // minimum alignment that callers can count on, test for it here. 563 // minimum alignment that callers can count on, test for it here.
577 TEST(SharedMemoryTest, MapMinimumAlignment) { 564 TEST(SharedMemoryTest, MapMinimumAlignment) {
578 static const int kDataSize = 8192; 565 static const int kDataSize = 8192;
579 566
580 SharedMemory shared_memory; 567 SharedMemory shared_memory;
581 ASSERT_TRUE(shared_memory.CreateAndMapAnonymous(kDataSize)); 568 ASSERT_TRUE(shared_memory.CreateAndMapAnonymous(kDataSize));
582 EXPECT_EQ(0U, reinterpret_cast<uintptr_t>( 569 EXPECT_EQ(0U, reinterpret_cast<uintptr_t>(
(...skipping 123 matching lines...) Expand 10 before | Expand all | Expand 10 after
706 memory.Close(); 693 memory.Close();
707 SharedMemoryProcessTest::CleanUp(); 694 SharedMemoryProcessTest::CleanUp();
708 } 695 }
709 696
710 MULTIPROCESS_TEST_MAIN(SharedMemoryTestMain) { 697 MULTIPROCESS_TEST_MAIN(SharedMemoryTestMain) {
711 return SharedMemoryProcessTest::TaskTestMain(); 698 return SharedMemoryProcessTest::TaskTestMain();
712 } 699 }
713 #endif // !defined(OS_IOS) && !defined(OS_ANDROID) && !defined(OS_MACOSX) 700 #endif // !defined(OS_IOS) && !defined(OS_ANDROID) && !defined(OS_MACOSX)
714 701
715 } // namespace base 702 } // namespace base
OLDNEW
« no previous file with comments | « base/memory/shared_memory_mac.cc ('k') | components/nacl/loader/nacl_ipc_adapter.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698