// Copyright 2019 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

#include "base/memory/shared_memory_hooks.h"

#include "testing/gtest/include/gtest/gtest.h"
#include "third_party/abseil-cpp/absl/types/optional.h"

namespace base {

class SharedMemoryHooksTest : public ::testing::Test {
 protected:
  void TearDown() override { SetCreateHooks(nullptr, nullptr, nullptr); }

  void SetCreateHooks(
      ReadOnlySharedMemoryRegion::CreateFunction* read_only_hook,
      UnsafeSharedMemoryRegion::CreateFunction* unsafe_hook,
      WritableSharedMemoryRegion::CreateFunction* writable_hook) {
    SharedMemoryHooks::SetCreateHooks(read_only_hook, unsafe_hook,
                                      writable_hook);
  }
};

absl::optional<size_t> requested_read_only_shmem_size;
absl::optional<size_t> requested_unsafe_shmem_size;
absl::optional<size_t> requested_writable_shmem_size;

MappedReadOnlyRegion ReadOnlyShmemCreateHook(size_t size, SharedMemoryMapper* mapper) {
  requested_read_only_shmem_size = size;
  return {};
}

UnsafeSharedMemoryRegion UnsafeShmemCreateHook(size_t size) {
  requested_unsafe_shmem_size = size;
  return {};
}

WritableSharedMemoryRegion WritableShmemCreateHook(size_t size) {
  requested_writable_shmem_size = size;
  return {};
}

TEST_F(SharedMemoryHooksTest, Basic) {
  {
    auto region = ReadOnlySharedMemoryRegion::Create(3);
    EXPECT_TRUE(region.IsValid());
    EXPECT_FALSE(requested_read_only_shmem_size.has_value());
  }

  {
    auto region = UnsafeSharedMemoryRegion::Create(25);
    EXPECT_TRUE(region.IsValid());
    EXPECT_FALSE(requested_unsafe_shmem_size.has_value());
  }

  {
    auto region = WritableSharedMemoryRegion::Create(777);
    EXPECT_TRUE(region.IsValid());
    EXPECT_FALSE(requested_writable_shmem_size.has_value());
  }

  SetCreateHooks(&ReadOnlyShmemCreateHook, &UnsafeShmemCreateHook,
                 &WritableShmemCreateHook);

  {
    auto region = ReadOnlySharedMemoryRegion::Create(3);
    EXPECT_FALSE(region.IsValid());
    EXPECT_EQ(3u, *requested_read_only_shmem_size);
  }

  {
    auto region = UnsafeSharedMemoryRegion::Create(25);
    EXPECT_FALSE(region.IsValid());
    EXPECT_EQ(25u, *requested_unsafe_shmem_size);
  }

  {
    auto region = WritableSharedMemoryRegion::Create(777);
    EXPECT_FALSE(region.IsValid());
    EXPECT_EQ(777u, *requested_writable_shmem_size);
  }
}

}  // namespace base
