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 <optional>
8
9 #include "testing/gtest/include/gtest/gtest.h"
10
11 namespace base {
12
13 class SharedMemoryHooksTest : public ::testing::Test {
14 protected:
TearDown()15 void TearDown() override { SetCreateHooks(nullptr, nullptr, nullptr); }
16
SetCreateHooks(ReadOnlySharedMemoryRegion::CreateFunction * read_only_hook,UnsafeSharedMemoryRegion::CreateFunction * unsafe_hook,WritableSharedMemoryRegion::CreateFunction * writable_hook)17 void SetCreateHooks(
18 ReadOnlySharedMemoryRegion::CreateFunction* read_only_hook,
19 UnsafeSharedMemoryRegion::CreateFunction* unsafe_hook,
20 WritableSharedMemoryRegion::CreateFunction* writable_hook) {
21 SharedMemoryHooks::SetCreateHooks(read_only_hook, unsafe_hook,
22 writable_hook);
23 }
24 };
25
26 std::optional<size_t> requested_read_only_shmem_size;
27 std::optional<size_t> requested_unsafe_shmem_size;
28 std::optional<size_t> requested_writable_shmem_size;
29
ReadOnlyShmemCreateHook(size_t size,SharedMemoryMapper * mapper)30 MappedReadOnlyRegion ReadOnlyShmemCreateHook(size_t size, SharedMemoryMapper* mapper) {
31 requested_read_only_shmem_size = size;
32 return {};
33 }
34
UnsafeShmemCreateHook(size_t size)35 UnsafeSharedMemoryRegion UnsafeShmemCreateHook(size_t size) {
36 requested_unsafe_shmem_size = size;
37 return {};
38 }
39
WritableShmemCreateHook(size_t size)40 WritableSharedMemoryRegion WritableShmemCreateHook(size_t size) {
41 requested_writable_shmem_size = size;
42 return {};
43 }
44
TEST_F(SharedMemoryHooksTest,Basic)45 TEST_F(SharedMemoryHooksTest, Basic) {
46 {
47 auto region = ReadOnlySharedMemoryRegion::Create(3);
48 EXPECT_TRUE(region.IsValid());
49 EXPECT_FALSE(requested_read_only_shmem_size.has_value());
50 }
51
52 {
53 auto region = UnsafeSharedMemoryRegion::Create(25);
54 EXPECT_TRUE(region.IsValid());
55 EXPECT_FALSE(requested_unsafe_shmem_size.has_value());
56 }
57
58 {
59 auto region = WritableSharedMemoryRegion::Create(777);
60 EXPECT_TRUE(region.IsValid());
61 EXPECT_FALSE(requested_writable_shmem_size.has_value());
62 }
63
64 SetCreateHooks(&ReadOnlyShmemCreateHook, &UnsafeShmemCreateHook,
65 &WritableShmemCreateHook);
66
67 {
68 auto region = ReadOnlySharedMemoryRegion::Create(3);
69 EXPECT_FALSE(region.IsValid());
70 EXPECT_EQ(3u, *requested_read_only_shmem_size);
71 }
72
73 {
74 auto region = UnsafeSharedMemoryRegion::Create(25);
75 EXPECT_FALSE(region.IsValid());
76 EXPECT_EQ(25u, *requested_unsafe_shmem_size);
77 }
78
79 {
80 auto region = WritableSharedMemoryRegion::Create(777);
81 EXPECT_FALSE(region.IsValid());
82 EXPECT_EQ(777u, *requested_writable_shmem_size);
83 }
84 }
85
86 } // namespace base
87