1 // Copyright 2019 The Chromium Authors
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
4
5 #include "base/memory/shared_memory_hooks.h"
6
7 #include "testing/gtest/include/gtest/gtest.h"
8 #include "third_party/abseil-cpp/absl/types/optional.h"
9
10 namespace base {
11
12 class SharedMemoryHooksTest : public ::testing::Test {
13 protected:
TearDown()14 void TearDown() override { SetCreateHooks(nullptr, nullptr, nullptr); }
15
SetCreateHooks(ReadOnlySharedMemoryRegion::CreateFunction * read_only_hook,UnsafeSharedMemoryRegion::CreateFunction * unsafe_hook,WritableSharedMemoryRegion::CreateFunction * writable_hook)16 void SetCreateHooks(
17 ReadOnlySharedMemoryRegion::CreateFunction* read_only_hook,
18 UnsafeSharedMemoryRegion::CreateFunction* unsafe_hook,
19 WritableSharedMemoryRegion::CreateFunction* writable_hook) {
20 SharedMemoryHooks::SetCreateHooks(read_only_hook, unsafe_hook,
21 writable_hook);
22 }
23 };
24
25 absl::optional<size_t> requested_read_only_shmem_size;
26 absl::optional<size_t> requested_unsafe_shmem_size;
27 absl::optional<size_t> requested_writable_shmem_size;
28
ReadOnlyShmemCreateHook(size_t size,SharedMemoryMapper * mapper)29 MappedReadOnlyRegion ReadOnlyShmemCreateHook(size_t size, SharedMemoryMapper* mapper) {
30 requested_read_only_shmem_size = size;
31 return {};
32 }
33
UnsafeShmemCreateHook(size_t size)34 UnsafeSharedMemoryRegion UnsafeShmemCreateHook(size_t size) {
35 requested_unsafe_shmem_size = size;
36 return {};
37 }
38
WritableShmemCreateHook(size_t size)39 WritableSharedMemoryRegion WritableShmemCreateHook(size_t size) {
40 requested_writable_shmem_size = size;
41 return {};
42 }
43
TEST_F(SharedMemoryHooksTest,Basic)44 TEST_F(SharedMemoryHooksTest, Basic) {
45 {
46 auto region = ReadOnlySharedMemoryRegion::Create(3);
47 EXPECT_TRUE(region.IsValid());
48 EXPECT_FALSE(requested_read_only_shmem_size.has_value());
49 }
50
51 {
52 auto region = UnsafeSharedMemoryRegion::Create(25);
53 EXPECT_TRUE(region.IsValid());
54 EXPECT_FALSE(requested_unsafe_shmem_size.has_value());
55 }
56
57 {
58 auto region = WritableSharedMemoryRegion::Create(777);
59 EXPECT_TRUE(region.IsValid());
60 EXPECT_FALSE(requested_writable_shmem_size.has_value());
61 }
62
63 SetCreateHooks(&ReadOnlyShmemCreateHook, &UnsafeShmemCreateHook,
64 &WritableShmemCreateHook);
65
66 {
67 auto region = ReadOnlySharedMemoryRegion::Create(3);
68 EXPECT_FALSE(region.IsValid());
69 EXPECT_EQ(3u, *requested_read_only_shmem_size);
70 }
71
72 {
73 auto region = UnsafeSharedMemoryRegion::Create(25);
74 EXPECT_FALSE(region.IsValid());
75 EXPECT_EQ(25u, *requested_unsafe_shmem_size);
76 }
77
78 {
79 auto region = WritableSharedMemoryRegion::Create(777);
80 EXPECT_FALSE(region.IsValid());
81 EXPECT_EQ(777u, *requested_writable_shmem_size);
82 }
83 }
84
85 } // namespace base
86