| Index: storage/browser/blob/blob_memory_controller_unittest.cc
|
| diff --git a/storage/browser/blob/blob_memory_controller_unittest.cc b/storage/browser/blob/blob_memory_controller_unittest.cc
|
| index 918315b378edc746ba125ccfe0b7b80807383151..2ab02f0ea8687fc11008479d8b1ca5fbbf7ffb81 100644
|
| --- a/storage/browser/blob/blob_memory_controller_unittest.cc
|
| +++ b/storage/browser/blob/blob_memory_controller_unittest.cc
|
| @@ -31,6 +31,7 @@ const std::string kBlobStorageDirectory = "blob_storage";
|
| const size_t kTestBlobStorageIPCThresholdBytes = 20;
|
| const size_t kTestBlobStorageMaxSharedMemoryBytes = 50;
|
| const size_t kTestBlobStorageMaxBlobMemorySize = 500;
|
| +const float kTestMaxBlobInMemorySpaceUnderPressureRatio = 0.004f;
|
| const uint64_t kTestBlobStorageMaxDiskSpace = 1000;
|
| const uint64_t kTestBlobStorageMinFileSizeBytes = 10;
|
| const uint64_t kTestBlobStorageMaxFileSizeBytes = 100;
|
| @@ -88,6 +89,8 @@ class BlobMemoryControllerTest : public testing::Test {
|
| limits.max_ipc_memory_size = kTestBlobStorageIPCThresholdBytes;
|
| limits.max_shared_memory_size = kTestBlobStorageMaxSharedMemoryBytes;
|
| limits.max_blob_in_memory_space = kTestBlobStorageMaxBlobMemorySize;
|
| + limits.max_blob_in_memory_space_under_pressure_ratio =
|
| + kTestMaxBlobInMemorySpaceUnderPressureRatio;
|
| limits.desired_max_disk_space = kTestBlobStorageMaxDiskSpace;
|
| limits.effective_max_disk_space = kTestBlobStorageMaxDiskSpace;
|
| limits.min_page_file_size = kTestBlobStorageMinFileSizeBytes;
|
| @@ -100,6 +103,8 @@ class BlobMemoryControllerTest : public testing::Test {
|
| limits.max_ipc_memory_size = kTestBlobStorageIPCThresholdBytes;
|
| limits.max_shared_memory_size = kTestBlobStorageMaxSharedMemoryBytes;
|
| limits.max_blob_in_memory_space = kTestBlobStorageMaxBlobMemorySize;
|
| + limits.max_blob_in_memory_space_under_pressure_ratio =
|
| + kTestMaxBlobInMemorySpaceUnderPressureRatio;
|
| limits.desired_max_disk_space = kTestSmallBlobStorageMaxDiskSpace;
|
| limits.effective_max_disk_space = kTestSmallBlobStorageMaxDiskSpace;
|
| limits.min_page_file_size = kTestBlobStorageMinFileSizeBytes;
|
| @@ -1120,4 +1125,48 @@ TEST_F(BlobMemoryControllerTest, DiskSpaceUnknown) {
|
| EXPECT_FALSE(controller.limits().IsDiskSpaceConstrained());
|
| }
|
|
|
| +TEST_F(BlobMemoryControllerTest, OnMemoryPressure) {
|
| + BlobMemoryController controller(temp_dir_.GetPath(), file_runner_);
|
| + SetTestMemoryLimits(&controller);
|
| + AssertEnoughDiskSpace();
|
| +
|
| + char kData[1];
|
| + kData[0] = 'e';
|
| +
|
| + std::vector<scoped_refptr<ShareableBlobDataItem>> small_items;
|
| + size_t size_to_load = 2 * kTestBlobStorageMaxBlobMemorySize *
|
| + kTestMaxBlobInMemorySpaceUnderPressureRatio +
|
| + 1;
|
| + for (size_t i = 0; i < size_to_load; i++) {
|
| + BlobDataBuilder builder("fake");
|
| + builder.AppendData(kData, 1);
|
| + std::vector<scoped_refptr<ShareableBlobDataItem>> items =
|
| + CreateSharedDataItems(builder);
|
| + base::WeakPtr<QuotaAllocationTask> memory_task =
|
| + controller.ReserveMemoryQuota(items, GetMemoryRequestCallback());
|
| + EXPECT_FALSE(memory_task);
|
| + items[0]->set_state(ItemState::POPULATED_WITH_QUOTA);
|
| + small_items.insert(small_items.end(), items.begin(), items.end());
|
| + }
|
| + controller.NotifyMemoryItemsUsed(small_items);
|
| + EXPECT_FALSE(file_runner_->HasPendingTask());
|
| + EXPECT_EQ(size_to_load, controller.memory_usage());
|
| +
|
| + controller.OnMemoryPressure(
|
| + base::MemoryPressureListener::MemoryPressureLevel::
|
| + MEMORY_PRESSURE_LEVEL_CRITICAL);
|
| +
|
| + EXPECT_TRUE(file_runner_->HasPendingTask());
|
| + RunFileThreadTasks();
|
| +
|
| + base::RunLoop().RunUntilIdle();
|
| +
|
| + // 2 page files of size |kTestBlobStorageMaxBlobMemorySize *
|
| + // kTestMaxBlobInMemorySpaceUnderPressureRatio| should be evicted with 1 byte
|
| + // left in-memory.
|
| + EXPECT_EQ(1u, controller.memory_usage());
|
| + EXPECT_EQ(size_to_load - 1, controller.disk_usage());
|
| + return;
|
| +}
|
| +
|
| } // namespace storage
|
|
|