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

#include "cc/resources/resource_pool.h"

#include <stddef.h>

#include "base/single_thread_task_runner.h"
#include "base/test/test_mock_time_task_runner.h"
#include "base/threading/thread_task_runner_handle.h"
#include "components/viz/client/client_resource_provider.h"
#include "components/viz/common/resources/resource_sizes.h"
#include "components/viz/common/resources/returned_resource.h"
#include "components/viz/test/test_context_provider.h"
#include "components/viz/test/test_context_support.h"
#include "components/viz/test/test_shared_bitmap_manager.h"
#include "testing/gmock/include/gmock/gmock.h"
#include "testing/gtest/include/gtest/gtest.h"

namespace cc {

class ResourcePoolTest : public testing::Test {
 public:
  void SetUp() override {
    auto context_support = std::make_unique<MockContextSupport>();
    context_support_ = context_support.get();
    context_provider_ =
        viz::TestContextProvider::Create(std::move(context_support));
    context_provider_->BindToCurrentThread();
    resource_provider_ = std::make_unique<viz::ClientResourceProvider>(true);
    test_task_runner_ = base::MakeRefCounted<base::TestMockTimeTaskRunner>();
    resource_pool_ = std::make_unique<ResourcePool>(
        resource_provider_.get(), context_provider_.get(), test_task_runner_,
        ResourcePool::kDefaultExpirationDelay, false);
    resource_pool_->SetClockForTesting(test_task_runner_->GetMockTickClock());
  }

  void TearDown() override {
    resource_provider_->ShutdownAndReleaseAllResources();
  }

 protected:
  class MockContextSupport : public viz::TestContextSupport {
   public:
    MockContextSupport() = default;
    MOCK_METHOD0(FlushPendingWork, void());
  };

  class StubGpuBacking : public ResourcePool::GpuBacking {
   public:
    void OnMemoryDump(
        base::trace_event::ProcessMemoryDump* pmd,
        const base::trace_event::MemoryAllocatorDumpGuid& buffer_dump_guid,
        uint64_t tracing_process_id,
        int importance) const override {}
  };

  void SetBackingOnResource(const ResourcePool::InUsePoolResource& resource) {
    auto backing = std::make_unique<StubGpuBacking>();
    backing->mailbox = gpu::Mailbox::Generate();
    backing->mailbox_sync_token.Set(
        gpu::GPU_IO, gpu::CommandBufferId::FromUnsafeValue(1), 1);
    resource.set_gpu_backing(std::move(backing));
  }

  void CheckAndReturnResource(ResourcePool::InUsePoolResource resource) {
    EXPECT_TRUE(!!resource);
    resource_pool_->ReleaseResource(std::move(resource));
  }

  viz::TestSharedBitmapManager shared_bitmap_manager_;
  MockContextSupport* context_support_;
  scoped_refptr<viz::TestContextProvider> context_provider_;
  std::unique_ptr<viz::ClientResourceProvider> resource_provider_;
  scoped_refptr<base::TestMockTimeTaskRunner> test_task_runner_;
  std::unique_ptr<ResourcePool> resource_pool_;
};

TEST_F(ResourcePoolTest, AcquireRelease) {
  gfx::Size size(100, 100);
  viz::ResourceFormat format = viz::RGBA_8888;
  gfx::ColorSpace color_space = gfx::ColorSpace::CreateSRGB();
  ResourcePool::InUsePoolResource resource =
      resource_pool_->AcquireResource(size, format, color_space);
  EXPECT_EQ(size, resource.size());
  EXPECT_EQ(format, resource.format());
  EXPECT_EQ(color_space, resource.color_space());

  resource_pool_->ReleaseResource(std::move(resource));
}

TEST_F(ResourcePoolTest, EventuallyEvictAndFlush) {
  gfx::Size size(100, 100);
  viz::ResourceFormat format = viz::RGBA_8888;
  gfx::ColorSpace color_space = gfx::ColorSpace::CreateSRGB();
  ResourcePool::InUsePoolResource resource =
      resource_pool_->AcquireResource(size, format, color_space);
  resource_pool_->ReleaseResource(std::move(resource));
  EXPECT_EQ(1u, resource_pool_->GetTotalResourceCountForTesting());

  // Expect flush after eviction and flush delay.
  EXPECT_CALL(*context_support_, FlushPendingWork()).Times(testing::AtLeast(1));
  test_task_runner_->FastForwardBy(ResourcePool::kDefaultExpirationDelay +
                                   ResourcePool::kDefaultMaxFlushDelay);
  EXPECT_EQ(0u, resource_pool_->GetTotalResourceCountForTesting());
}

TEST_F(ResourcePoolTest, FlushEvenIfMoreUnusedToEvict) {
  gfx::Size size(100, 100);
  viz::ResourceFormat format = viz::RGBA_8888;
  gfx::ColorSpace color_space = gfx::ColorSpace::CreateSRGB();
  ResourcePool::InUsePoolResource resource1 =
      resource_pool_->AcquireResource(size, format, color_space);
  ResourcePool::InUsePoolResource resource2 =
      resource_pool_->AcquireResource(size, format, color_space);

  // Time 0: No resources evicted yet.
  EXPECT_EQ(2u, resource_pool_->GetTotalResourceCountForTesting());

  // Space the resource last_usage out so that they don't expire at the same
  // time. resource1 last used at time 0 (expires kDefaultExpirationDelay) and
  // resource2 last used at last_usage_gap (expires kDefaultExpireationDelay +
  // last_usage_gap).
  const base::TimeDelta last_usage_gap =
      ResourcePool::kDefaultMaxFlushDelay * 2;
  resource_pool_->ReleaseResource(std::move(resource1));
  test_task_runner_->FastForwardBy(last_usage_gap);
  resource_pool_->ReleaseResource(std::move(resource2));

  // Time |last_usage_gap|: No resources evicted yet.
  EXPECT_EQ(2u, resource_pool_->GetTotalResourceCountForTesting());

  // Time |kDefaultExpirationDelay|: resource1 evicted, but not resource2 yet.
  test_task_runner_->FastForwardBy(ResourcePool::kDefaultExpirationDelay -
                                   last_usage_gap);
  EXPECT_EQ(1u, resource_pool_->GetTotalResourceCountForTesting());

  // Expect at least one flush kDefaultMaxFlushDelay after an eviction.
  EXPECT_CALL(*context_support_, FlushPendingWork()).Times(testing::AtLeast(1));
  test_task_runner_->FastForwardBy(ResourcePool::kDefaultMaxFlushDelay);

  // Time |kDefaultExpirationDelay + kDefaultMaxFlushDelay|:
  // Check that flush was called and resource2 still not evicted.
  testing::Mock::VerifyAndClearExpectations(context_support_);
  EXPECT_EQ(1u, resource_pool_->GetTotalResourceCountForTesting());

  // Wait a long time and resource2 should get evicted and flushed.
  EXPECT_CALL(*context_support_, FlushPendingWork()).Times(testing::AtLeast(1));
  test_task_runner_->FastForwardBy(ResourcePool::kDefaultExpirationDelay * 100);
  EXPECT_EQ(0u, resource_pool_->GetTotalResourceCountForTesting());
}

TEST_F(ResourcePoolTest, AccountingSingleResource) {
  // Limits high enough to not be hit by this test.
  size_t bytes_limit = 10 * 1024 * 1024;
  size_t count_limit = 100;
  resource_pool_->SetResourceUsageLimits(bytes_limit, count_limit);

  gfx::Size size(100, 100);
  viz::ResourceFormat format = viz::RGBA_8888;
  gfx::ColorSpace color_space = gfx::ColorSpace::CreateSRGB();
  size_t resource_bytes =
      viz::ResourceSizes::UncheckedSizeInBytes<size_t>(size, format);
  ResourcePool::InUsePoolResource resource =
      resource_pool_->AcquireResource(size, format, color_space);

  EXPECT_EQ(resource_bytes, resource_pool_->GetTotalMemoryUsageForTesting());
  EXPECT_EQ(resource_bytes, resource_pool_->memory_usage_bytes());
  EXPECT_EQ(1u, resource_pool_->GetTotalResourceCountForTesting());
  EXPECT_EQ(1u, resource_pool_->resource_count());
  EXPECT_EQ(0u, resource_pool_->GetBusyResourceCountForTesting());

  resource_pool_->ReleaseResource(std::move(resource));
  EXPECT_EQ(resource_bytes, resource_pool_->GetTotalMemoryUsageForTesting());
  EXPECT_EQ(0u, resource_pool_->memory_usage_bytes());
  EXPECT_EQ(1u, resource_pool_->GetTotalResourceCountForTesting());
  EXPECT_EQ(0u, resource_pool_->resource_count());
  EXPECT_EQ(0u, resource_pool_->GetBusyResourceCountForTesting());

  resource_pool_->SetResourceUsageLimits(0u, 0u);
  resource_pool_->ReduceResourceUsage();
  EXPECT_EQ(0u, resource_pool_->GetTotalMemoryUsageForTesting());
  EXPECT_EQ(0u, resource_pool_->memory_usage_bytes());
  EXPECT_EQ(0u, resource_pool_->GetTotalResourceCountForTesting());
  EXPECT_EQ(0u, resource_pool_->resource_count());
  EXPECT_EQ(0u, resource_pool_->GetBusyResourceCountForTesting());
}

TEST_F(ResourcePoolTest, SimpleResourceReuse) {
  // Limits high enough to not be hit by this test.
  size_t bytes_limit = 10 * 1024 * 1024;
  size_t count_limit = 100;
  resource_pool_->SetResourceUsageLimits(bytes_limit, count_limit);

  gfx::Size size(100, 100);
  viz::ResourceFormat format = viz::RGBA_8888;
  gfx::ColorSpace color_space1;
  gfx::ColorSpace color_space2 = gfx::ColorSpace::CreateSRGB();

  CheckAndReturnResource(
      resource_pool_->AcquireResource(size, format, color_space1));
  EXPECT_EQ(1u, resource_pool_->GetTotalResourceCountForTesting());

  // Same size/format should re-use resource.
  ResourcePool::InUsePoolResource resource =
      resource_pool_->AcquireResource(size, format, color_space1);
  EXPECT_EQ(1u, resource_pool_->GetTotalResourceCountForTesting());
  CheckAndReturnResource(std::move(resource));
  EXPECT_EQ(1u, resource_pool_->GetTotalResourceCountForTesting());
  EXPECT_EQ(0u, resource_pool_->GetBusyResourceCountForTesting());

  // Different size/format should allocate new resource.
  resource = resource_pool_->AcquireResource(gfx::Size(50, 50),
                                             viz::LUMINANCE_8, color_space1);
  EXPECT_EQ(2u, resource_pool_->GetTotalResourceCountForTesting());
  CheckAndReturnResource(std::move(resource));
  EXPECT_EQ(2u, resource_pool_->GetTotalResourceCountForTesting());
  EXPECT_EQ(0u, resource_pool_->GetBusyResourceCountForTesting());

  // Different color space should allocate new resource.
  resource = resource_pool_->AcquireResource(size, format, color_space2);
  EXPECT_EQ(3u, resource_pool_->GetTotalResourceCountForTesting());
  CheckAndReturnResource(std::move(resource));
  EXPECT_EQ(3u, resource_pool_->GetTotalResourceCountForTesting());
  EXPECT_EQ(0u, resource_pool_->GetBusyResourceCountForTesting());
}

TEST_F(ResourcePoolTest, LostResource) {
  // Limits high enough to not be hit by this test.
  size_t bytes_limit = 10 * 1024 * 1024;
  size_t count_limit = 100;
  resource_pool_->SetResourceUsageLimits(bytes_limit, count_limit);

  gfx::Size size(100, 100);
  viz::ResourceFormat format = viz::RGBA_8888;
  gfx::ColorSpace color_space = gfx::ColorSpace::CreateSRGB();

  ResourcePool::InUsePoolResource resource =
      resource_pool_->AcquireResource(size, format, color_space);

  SetBackingOnResource(resource);
  EXPECT_TRUE(resource_pool_->PrepareForExport(resource));

  std::vector<viz::ResourceId> export_ids = {resource.resource_id_for_export()};
  std::vector<viz::TransferableResource> transferable_resources;
  resource_provider_->PrepareSendToParent(
      export_ids, &transferable_resources,
      static_cast<viz::RasterContextProvider*>(context_provider_.get()));
  auto returned_resources =
      viz::TransferableResource::ReturnResources(transferable_resources);
  ASSERT_EQ(1u, returned_resources.size());
  returned_resources[0].lost = true;
  resource_provider_->ReceiveReturnsFromParent(returned_resources);

  EXPECT_EQ(1u, resource_pool_->GetTotalResourceCountForTesting());
  resource_pool_->ReleaseResource(std::move(resource));
  EXPECT_EQ(0u, resource_pool_->GetTotalResourceCountForTesting());
}

TEST_F(ResourcePoolTest, BusyResourcesNotFreed) {
  // Limits high enough to not be hit by this test.
  size_t bytes_limit = 10 * 1024 * 1024;
  size_t count_limit = 100;
  resource_pool_->SetResourceUsageLimits(bytes_limit, count_limit);

  gfx::Size size(100, 100);
  viz::ResourceFormat format = viz::RGBA_8888;
  gfx::ColorSpace color_space;

  ResourcePool::InUsePoolResource resource =
      resource_pool_->AcquireResource(size, format, color_space);
  EXPECT_EQ(40000u, resource_pool_->GetTotalMemoryUsageForTesting());
  EXPECT_EQ(1u, resource_pool_->resource_count());

  SetBackingOnResource(resource);
  EXPECT_TRUE(resource_pool_->PrepareForExport(resource));

  std::vector<viz::TransferableResource> transfers;
  resource_provider_->PrepareSendToParent(
      {resource.resource_id_for_export()}, &transfers,
      static_cast<viz::RasterContextProvider*>(context_provider_.get()));

  resource_pool_->ReleaseResource(std::move(resource));
  EXPECT_EQ(40000u, resource_pool_->GetTotalMemoryUsageForTesting());
  EXPECT_EQ(0u, resource_pool_->memory_usage_bytes());
  EXPECT_EQ(1u, resource_pool_->GetBusyResourceCountForTesting());

  // Wait for our resource pool to evict resources. Wait 10x the expiration
  // delay.
  test_task_runner_->FastForwardBy(ResourcePool::kDefaultExpirationDelay * 10);

  // Busy resources are still held, since they may be in flight to the display
  // compositor and should not be freed.
  EXPECT_EQ(40000u, resource_pool_->GetTotalMemoryUsageForTesting());
  EXPECT_EQ(0u, resource_pool_->memory_usage_bytes());
  EXPECT_EQ(1u, resource_pool_->GetBusyResourceCountForTesting());
}

TEST_F(ResourcePoolTest, UnusedResourcesEventuallyFreed) {
  // Limits high enough to not be hit by this test.
  size_t bytes_limit = 10 * 1024 * 1024;
  size_t count_limit = 100;
  resource_pool_->SetResourceUsageLimits(bytes_limit, count_limit);

  gfx::Size size(100, 100);
  viz::ResourceFormat format = viz::RGBA_8888;
  gfx::ColorSpace color_space;

  ResourcePool::InUsePoolResource resource =
      resource_pool_->AcquireResource(size, format, color_space);
  EXPECT_EQ(40000u, resource_pool_->GetTotalMemoryUsageForTesting());
  EXPECT_EQ(1u, resource_pool_->GetTotalResourceCountForTesting());
  EXPECT_EQ(1u, resource_pool_->resource_count());
  EXPECT_EQ(0u, resource_pool_->GetBusyResourceCountForTesting());

  // Export the resource to the display compositor.
  SetBackingOnResource(resource);
  EXPECT_TRUE(resource_pool_->PrepareForExport(resource));
  std::vector<viz::TransferableResource> transfers;
  resource_provider_->PrepareSendToParent(
      {resource.resource_id_for_export()}, &transfers,
      static_cast<viz::RasterContextProvider*>(context_provider_.get()));

  resource_pool_->ReleaseResource(std::move(resource));
  EXPECT_EQ(40000u, resource_pool_->GetTotalMemoryUsageForTesting());
  EXPECT_EQ(1u, resource_pool_->GetTotalResourceCountForTesting());
  EXPECT_EQ(0u, resource_pool_->resource_count());
  EXPECT_EQ(1u, resource_pool_->GetBusyResourceCountForTesting());

  // Transfer the resource from the busy pool to the unused pool.
  resource_provider_->ReceiveReturnsFromParent(
      viz::TransferableResource::ReturnResources(transfers));
  EXPECT_EQ(40000u, resource_pool_->GetTotalMemoryUsageForTesting());
  EXPECT_EQ(1u, resource_pool_->GetTotalResourceCountForTesting());
  EXPECT_EQ(0u, resource_pool_->resource_count());
  EXPECT_EQ(0u, resource_pool_->GetBusyResourceCountForTesting());

  // Wait for our resource pool to evict resources. Wait 10x the expiration
  // delay.
  test_task_runner_->FastForwardBy(ResourcePool::kDefaultExpirationDelay * 10);

  EXPECT_EQ(0u, resource_pool_->GetTotalMemoryUsageForTesting());
}

TEST_F(ResourcePoolTest, UpdateContentId) {
  gfx::Size size(100, 100);
  viz::ResourceFormat format = viz::RGBA_8888;
  gfx::ColorSpace color_space;
  uint64_t content_id = 42;
  uint64_t new_content_id = 43;
  gfx::Rect new_invalidated_rect(20, 20, 10, 10);

  ResourcePool::InUsePoolResource resource =
      resource_pool_->AcquireResource(size, format, color_space);
  resource_pool_->OnContentReplaced(resource, content_id);
  auto original_id = resource.unique_id_for_testing();
  resource_pool_->ReleaseResource(std::move(resource));

  // Ensure that we can retrieve the resource based on |content_id|.
  gfx::Rect invalidated_rect;
  ResourcePool::InUsePoolResource reacquired_resource =
      resource_pool_->TryAcquireResourceForPartialRaster(
          new_content_id, new_invalidated_rect, content_id, &invalidated_rect);
  EXPECT_EQ(original_id, reacquired_resource.unique_id_for_testing());
  EXPECT_EQ(new_invalidated_rect, invalidated_rect);
  resource_pool_->ReleaseResource(std::move(reacquired_resource));
}

TEST_F(ResourcePoolTest, UpdateContentIdAndInvalidatedRect) {
  gfx::Size size(100, 100);
  viz::ResourceFormat format = viz::RGBA_8888;
  gfx::ColorSpace color_space;
  uint64_t content_ids[] = {42, 43, 44};
  gfx::Rect invalidated_rect(20, 20, 10, 10);
  gfx::Rect second_invalidated_rect(25, 25, 10, 10);
  gfx::Rect expected_total_invalidated_rect(20, 20, 15, 15);

  // Acquire a new resource with the first content id.
  ResourcePool::InUsePoolResource resource =
      resource_pool_->AcquireResource(size, format, color_space);
  resource_pool_->OnContentReplaced(resource, content_ids[0]);
  auto original_id = resource.unique_id_for_testing();

  // Attempt to acquire this resource. It is in use, so its ID and invalidated
  // rect should be updated, but a new resource will be returned.
  gfx::Rect new_invalidated_rect;
  ResourcePool::InUsePoolResource reacquired_resource =
      resource_pool_->TryAcquireResourceForPartialRaster(
          content_ids[1], invalidated_rect, content_ids[0],
          &new_invalidated_rect);
  EXPECT_FALSE(!!reacquired_resource);
  EXPECT_EQ(gfx::Rect(), new_invalidated_rect);

  // Release the original resource, returning it to the unused pool.
  resource_pool_->ReleaseResource(std::move(resource));

  // Ensure that we cannot retrieve a resource based on the original content id.
  reacquired_resource = resource_pool_->TryAcquireResourceForPartialRaster(
      content_ids[1], invalidated_rect, content_ids[0], &new_invalidated_rect);
  EXPECT_FALSE(!!reacquired_resource);
  EXPECT_EQ(gfx::Rect(), new_invalidated_rect);

  // Ensure that we can retrieve the resource based on the second (updated)
  // content ID and that it has the expected invalidated rect.
  gfx::Rect total_invalidated_rect;
  reacquired_resource = resource_pool_->TryAcquireResourceForPartialRaster(
      content_ids[2], second_invalidated_rect, content_ids[1],
      &total_invalidated_rect);
  EXPECT_EQ(original_id, reacquired_resource.unique_id_for_testing());
  EXPECT_EQ(expected_total_invalidated_rect, total_invalidated_rect);
  resource_pool_->ReleaseResource(std::move(reacquired_resource));
}

TEST_F(ResourcePoolTest, LargeInvalidatedRect) {
  gfx::Size size(100, 100);
  viz::ResourceFormat format = viz::RGBA_8888;
  gfx::ColorSpace color_space;
  uint64_t content_ids[] = {42, 43, 44};
  // This rect is too large to take the area of it.
  gfx::Rect large_invalidated_rect(0, 0, std::numeric_limits<int>::max() / 2,
                                   std::numeric_limits<int>::max() / 2);

  // Acquire a resource with the first content id.
  ResourcePool::InUsePoolResource resource =
      resource_pool_->AcquireResource(size, format, color_space);
  resource_pool_->OnContentReplaced(resource, content_ids[0]);

  // Set an invalidated rect on the resource.
  gfx::Rect new_invalidated_rect;
  ResourcePool::InUsePoolResource reacquired_resource =
      resource_pool_->TryAcquireResourceForPartialRaster(
          content_ids[1], large_invalidated_rect, content_ids[0],
          &new_invalidated_rect);
  EXPECT_FALSE(!!reacquired_resource);

  // Release the original resource, returning it to the unused pool.
  resource_pool_->ReleaseResource(std::move(resource));

  // Try to get the resource again, this should work even though the area was
  // too large to compute the area for.
  resource = resource_pool_->TryAcquireResourceForPartialRaster(
      content_ids[2], large_invalidated_rect, content_ids[1],
      &new_invalidated_rect);
  EXPECT_TRUE(!!resource);
  resource_pool_->ReleaseResource(std::move(resource));
}

TEST_F(ResourcePoolTest, ReuseResource) {
  viz::ResourceFormat format = viz::RGBA_8888;
  gfx::ColorSpace color_space = gfx::ColorSpace::CreateSRGB();

  // Create unused resource with size 100x100.
  ResourcePool::InUsePoolResource original =
      resource_pool_->AcquireResource(gfx::Size(100, 100), format, color_space);
  auto original_id = original.unique_id_for_testing();
  CheckAndReturnResource(std::move(original));

  // Try some cases that are too large, none should succeed.
  EXPECT_EQ(nullptr, resource_pool_->ReuseResource(gfx::Size(101, 100), format,
                                                   color_space));
  EXPECT_EQ(nullptr, resource_pool_->ReuseResource(gfx::Size(100, 101), format,
                                                   color_space));
  EXPECT_EQ(nullptr, resource_pool_->ReuseResource(gfx::Size(90, 120), format,
                                                   color_space));
  EXPECT_EQ(nullptr, resource_pool_->ReuseResource(gfx::Size(120, 120), format,
                                                   color_space));

  // Try some cases that are more than 2x smaller than 100x100 in area and
  // won't be re-used.
  EXPECT_EQ(nullptr, resource_pool_->ReuseResource(gfx::Size(49, 100), format,
                                                   color_space));
  EXPECT_EQ(nullptr, resource_pool_->ReuseResource(gfx::Size(100, 49), format,
                                                   color_space));
  EXPECT_EQ(nullptr, resource_pool_->ReuseResource(gfx::Size(50, 50), format,
                                                   color_space));
  EXPECT_EQ(nullptr, resource_pool_->ReuseResource(gfx::Size(70, 70), format,
                                                   color_space));

  // Try some cases that are smaller than 100x100, but within 2x area. Reuse
  // should succeed if non-exact requests are supported. Some platforms never
  // support these.
  if (resource_pool_->AllowsNonExactReUseForTesting()) {
    ResourcePool::InUsePoolResource reused = resource_pool_->AcquireResource(
        gfx::Size(50, 100), format, color_space);
    EXPECT_EQ(original_id, reused.unique_id_for_testing());
    CheckAndReturnResource(std::move(reused));
    reused = resource_pool_->AcquireResource(gfx::Size(100, 50), format,
                                             color_space);
    EXPECT_EQ(original_id, reused.unique_id_for_testing());
    CheckAndReturnResource(std::move(reused));
    reused =
        resource_pool_->AcquireResource(gfx::Size(71, 71), format, color_space);
    EXPECT_EQ(original_id, reused.unique_id_for_testing());
    CheckAndReturnResource(std::move(reused));
  } else {
    EXPECT_EQ(nullptr, resource_pool_->ReuseResource(gfx::Size(50, 100), format,
                                                     color_space));
    EXPECT_EQ(nullptr, resource_pool_->ReuseResource(gfx::Size(100, 50), format,
                                                     color_space));
    EXPECT_EQ(nullptr, resource_pool_->ReuseResource(gfx::Size(71, 71), format,
                                                     color_space));
  }

  // 100x100 is an exact match and should succeed. A subsequent request for
  // the same size should fail (the resource is already in use).
  ResourcePool::InUsePoolResource resource =
      resource_pool_->AcquireResource(gfx::Size(100, 100), format, color_space);
  EXPECT_EQ(nullptr, resource_pool_->ReuseResource(gfx::Size(100, 100), format,
                                                   color_space));
  CheckAndReturnResource(std::move(resource));
}

TEST_F(ResourcePoolTest, PurgedMemory) {
  // Limits high enough to not be hit by this test.
  size_t bytes_limit = 10 * 1024 * 1024;
  size_t count_limit = 100;
  resource_pool_->SetResourceUsageLimits(bytes_limit, count_limit);

  gfx::Size size(100, 100);
  viz::ResourceFormat format = viz::RGBA_8888;
  gfx::ColorSpace color_space = gfx::ColorSpace::CreateSRGB();
  ResourcePool::InUsePoolResource resource =
      resource_pool_->AcquireResource(size, format, color_space);
  SetBackingOnResource(resource);
  EXPECT_TRUE(resource_pool_->PrepareForExport(resource));

  EXPECT_EQ(1u, resource_pool_->GetTotalResourceCountForTesting());
  EXPECT_EQ(0u, resource_pool_->GetBusyResourceCountForTesting());

  // Purging and suspending should not impact an in-use resource.
  resource_pool_->OnMemoryPressure(
      base::MemoryPressureListener::MEMORY_PRESSURE_LEVEL_CRITICAL);
  EXPECT_EQ(1u, resource_pool_->GetTotalResourceCountForTesting());
  EXPECT_EQ(0u, resource_pool_->GetBusyResourceCountForTesting());

  // Export the resource to the display compositor, so it will be busy once
  // released.
  std::vector<viz::TransferableResource> transfers;
  resource_provider_->PrepareSendToParent(
      {resource.resource_id_for_export()}, &transfers,
      static_cast<viz::RasterContextProvider*>(context_provider_.get()));

  // Release the resource making it busy.
  resource_pool_->ReleaseResource(std::move(resource));
  EXPECT_EQ(1u, resource_pool_->GetTotalResourceCountForTesting());
  EXPECT_EQ(1u, resource_pool_->GetBusyResourceCountForTesting());

  // Purging and suspending should not impact a busy resource either.
  resource_pool_->OnMemoryPressure(
      base::MemoryPressureListener::MEMORY_PRESSURE_LEVEL_CRITICAL);
  EXPECT_EQ(1u, resource_pool_->GetTotalResourceCountForTesting());
  EXPECT_EQ(1u, resource_pool_->GetBusyResourceCountForTesting());

  // The resource moves from busy to available.
  resource_provider_->ReceiveReturnsFromParent(
      viz::TransferableResource::ReturnResources(transfers));
  EXPECT_EQ(1u, resource_pool_->GetTotalResourceCountForTesting());
  EXPECT_EQ(0u, resource_pool_->GetBusyResourceCountForTesting());

  // Purging and suspending should drop unused resources.
  resource_pool_->OnMemoryPressure(
      base::MemoryPressureListener::MEMORY_PRESSURE_LEVEL_CRITICAL);
  EXPECT_EQ(0u, resource_pool_->GetTotalResourceCountForTesting());
  EXPECT_EQ(0u, resource_pool_->GetBusyResourceCountForTesting());
}

TEST_F(ResourcePoolTest, InvalidateResources) {
  // Limits high enough to not be hit by this test.
  size_t bytes_limit = 10 * 1024 * 1024;
  size_t count_limit = 100;
  resource_pool_->SetResourceUsageLimits(bytes_limit, count_limit);

  gfx::Size size(100, 100);
  viz::ResourceFormat format = viz::RGBA_8888;
  gfx::ColorSpace color_space = gfx::ColorSpace::CreateSRGB();
  ResourcePool::InUsePoolResource busy_resource =
      resource_pool_->AcquireResource(size, format, color_space);
  SetBackingOnResource(busy_resource);
  EXPECT_TRUE(resource_pool_->PrepareForExport(busy_resource));
  EXPECT_EQ(1u, resource_pool_->GetTotalResourceCountForTesting());
  EXPECT_EQ(0u, resource_pool_->GetBusyResourceCountForTesting());
  EXPECT_EQ(1u, resource_pool_->resource_count());

  // Make a 2nd resource which will be left available in the pool.
  ResourcePool::InUsePoolResource avail_resource =
      resource_pool_->AcquireResource(size, format, color_space);
  EXPECT_EQ(2u, resource_pool_->GetTotalResourceCountForTesting());
  EXPECT_EQ(0u, resource_pool_->GetBusyResourceCountForTesting());
  EXPECT_EQ(2u, resource_pool_->resource_count());

  // Make a 3nd resource which will be kept in use.
  ResourcePool::InUsePoolResource in_use_resource =
      resource_pool_->AcquireResource(size, format, color_space);
  EXPECT_EQ(3u, resource_pool_->GetTotalResourceCountForTesting());
  EXPECT_EQ(0u, resource_pool_->GetBusyResourceCountForTesting());
  EXPECT_EQ(3u, resource_pool_->resource_count());

  // Mark this one as available.
  resource_pool_->ReleaseResource(std::move(avail_resource));
  EXPECT_EQ(3u, resource_pool_->GetTotalResourceCountForTesting());
  EXPECT_EQ(0u, resource_pool_->GetBusyResourceCountForTesting());
  EXPECT_EQ(2u, resource_pool_->resource_count());

  // Export the first resource to the display compositor, so it will be busy
  // once released.
  std::vector<viz::TransferableResource> transfers;
  resource_provider_->PrepareSendToParent(
      {busy_resource.resource_id_for_export()}, &transfers,
      static_cast<viz::RasterContextProvider*>(context_provider_.get()));

  // Release the resource making it busy.
  resource_pool_->ReleaseResource(std::move(busy_resource));
  EXPECT_EQ(3u, resource_pool_->GetTotalResourceCountForTesting());
  EXPECT_EQ(1u, resource_pool_->GetBusyResourceCountForTesting());
  EXPECT_EQ(1u, resource_pool_->resource_count());

  // Invalidating resources should prevent reuse of any resource.
  resource_pool_->InvalidateResources();

  // The available resource is just dropped immediately.
  EXPECT_EQ(2u, resource_pool_->GetTotalResourceCountForTesting());
  EXPECT_EQ(1u, resource_pool_->GetBusyResourceCountForTesting());
  EXPECT_EQ(1u, resource_pool_->resource_count());

  // The resource moves from busy to available, but since we invalidated,
  // it is not kept.
  resource_provider_->ReceiveReturnsFromParent(
      viz::TransferableResource::ReturnResources(transfers));
  EXPECT_EQ(1u, resource_pool_->GetTotalResourceCountForTesting());
  EXPECT_EQ(0u, resource_pool_->GetBusyResourceCountForTesting());
  EXPECT_EQ(1u, resource_pool_->resource_count());

  // The last resource was in use, when it is released it will not become able
  // to be reused.
  resource_pool_->ReleaseResource(std::move(in_use_resource));
  EXPECT_EQ(0u, resource_pool_->GetTotalResourceCountForTesting());
  EXPECT_EQ(0u, resource_pool_->GetBusyResourceCountForTesting());
}

TEST_F(ResourcePoolTest, ExactRequestsRespected) {
  viz::ResourceFormat format = viz::RGBA_8888;
  gfx::ColorSpace color_space = gfx::ColorSpace::CreateSRGB();

  resource_pool_ = std::make_unique<ResourcePool>(
      resource_provider_.get(), context_provider_.get(), test_task_runner_,
      ResourcePool::kDefaultExpirationDelay, true);

  // Create unused resource with size 100x100.
  CheckAndReturnResource(resource_pool_->AcquireResource(gfx::Size(100, 100),
                                                         format, color_space));

  // Try some cases that are smaller than 100x100, but within 2x area which
  // would typically allow reuse. Reuse should fail.
  EXPECT_EQ(nullptr, resource_pool_->ReuseResource(gfx::Size(50, 100), format,
                                                   color_space));
  EXPECT_EQ(nullptr, resource_pool_->ReuseResource(gfx::Size(100, 50), format,
                                                   color_space));
  EXPECT_EQ(nullptr, resource_pool_->ReuseResource(gfx::Size(71, 71), format,
                                                   color_space));

  // 100x100 is an exact match and should succeed. A subsequent request for
  // the same size should fail (the resource is already in use).
  ResourcePool::InUsePoolResource resource =
      resource_pool_->AcquireResource(gfx::Size(100, 100), format, color_space);
  EXPECT_EQ(nullptr, resource_pool_->ReuseResource(gfx::Size(100, 100), format,
                                                   color_space));
  CheckAndReturnResource(std::move(resource));
}

TEST_F(ResourcePoolTest, MetadataSentToDisplayCompositor) {
  // Limits high enough to not be hit by this test.
  size_t bytes_limit = 10 * 1024 * 1024;
  size_t count_limit = 100;
  resource_pool_->SetResourceUsageLimits(bytes_limit, count_limit);

  // These values are all non-default values so we can tell they are propagated.
  gfx::Size size(100, 101);
  viz::ResourceFormat format = viz::RGBA_4444;
  EXPECT_NE(gfx::BufferFormat::RGBA_8888, viz::BufferFormat(format));
  gfx::ColorSpace color_space = gfx::ColorSpace::CreateSRGB();
  uint32_t target = 5;
  gpu::Mailbox mailbox;
  mailbox.name[0] = 'a';
  gpu::SyncToken sync_token(gpu::CommandBufferNamespace::GPU_IO,
                            gpu::CommandBufferId::FromUnsafeValue(0x123), 7);

  ResourcePool::InUsePoolResource resource =
      resource_pool_->AcquireResource(size, format, color_space);
  SetBackingOnResource(resource);

  // More non-default values.
  resource.gpu_backing()->mailbox = mailbox;
  resource.gpu_backing()->mailbox_sync_token = sync_token;
  resource.gpu_backing()->texture_target = target;
  resource.gpu_backing()->wait_on_fence_required = true;
  resource.gpu_backing()->overlay_candidate = true;

  EXPECT_TRUE(resource_pool_->PrepareForExport(resource));

  std::vector<viz::TransferableResource> transfer;
  resource_provider_->PrepareSendToParent(
      {resource.resource_id_for_export()}, &transfer,
      static_cast<viz::RasterContextProvider*>(context_provider_.get()));

  // The verified_flush flag will be set by the ResourceProvider when it exports
  // the resource.
  sync_token.SetVerifyFlush();

  ASSERT_EQ(transfer.size(), 1u);
  EXPECT_EQ(transfer[0].id, resource.resource_id_for_export());
  EXPECT_EQ(transfer[0].mailbox_holder.mailbox, mailbox);
  EXPECT_EQ(transfer[0].mailbox_holder.sync_token, sync_token);
  EXPECT_EQ(transfer[0].mailbox_holder.texture_target, target);
  EXPECT_EQ(transfer[0].format, format);
  EXPECT_TRUE(transfer[0].read_lock_fences_enabled);
  EXPECT_TRUE(transfer[0].is_overlay_candidate);

  resource_pool_->ReleaseResource(std::move(resource));
}

TEST_F(ResourcePoolTest, InvalidResource) {
  // Limits high enough to not be hit by this test.
  size_t bytes_limit = 10 * 1024 * 1024;
  size_t count_limit = 100;
  resource_pool_->SetResourceUsageLimits(bytes_limit, count_limit);

  // These values are all non-default values so we can tell they are propagated.
  gfx::Size size(100, 101);
  viz::ResourceFormat format = viz::RGBA_4444;
  EXPECT_NE(gfx::BufferFormat::RGBA_8888, viz::BufferFormat(format));
  gfx::ColorSpace color_space = gfx::ColorSpace::CreateSRGB();
  uint32_t target = 5;

  ResourcePool::InUsePoolResource resource =
      resource_pool_->AcquireResource(size, format, color_space);

  // Keep a zero mailbox
  auto backing = std::make_unique<StubGpuBacking>();
  backing->texture_target = target;
  backing->wait_on_fence_required = true;
  backing->overlay_candidate = true;
  resource.set_gpu_backing(std::move(backing));

  EXPECT_FALSE(resource_pool_->PrepareForExport(resource));

  resource_pool_->ReleaseResource(std::move(resource));

  // Acquire another resource. The resource should not be reused.
  resource = resource_pool_->AcquireResource(size, format, color_space);
  EXPECT_FALSE(resource.gpu_backing());
  resource_pool_->ReleaseResource(std::move(resource));
}

}  // namespace cc
