| 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..bfe44b1f2ecd148d573f5c74b33e257663983803 100644
|
| --- a/storage/browser/blob/blob_memory_controller_unittest.cc
|
| +++ b/storage/browser/blob/blob_memory_controller_unittest.cc
|
| @@ -33,6 +33,7 @@ const size_t kTestBlobStorageMaxSharedMemoryBytes = 50;
|
| const size_t kTestBlobStorageMaxBlobMemorySize = 500;
|
| const uint64_t kTestBlobStorageMaxDiskSpace = 1000;
|
| const uint64_t kTestBlobStorageMinFileSizeBytes = 10;
|
| +const float kTestBlobStorageMinFileSizeBytesUnderPressure = 0.004;
|
| const uint64_t kTestBlobStorageMaxFileSizeBytes = 100;
|
|
|
| const uint64_t kTestSmallBlobStorageMaxDiskSpace = 100;
|
| @@ -91,6 +92,8 @@ class BlobMemoryControllerTest : public testing::Test {
|
| limits.desired_max_disk_space = kTestBlobStorageMaxDiskSpace;
|
| limits.effective_max_disk_space = kTestBlobStorageMaxDiskSpace;
|
| limits.min_page_file_size = kTestBlobStorageMinFileSizeBytes;
|
| + limits.min_page_file_size_ratio_under_pressure =
|
| + kTestBlobStorageMinFileSizeBytesUnderPressure;
|
| limits.max_file_size = kTestBlobStorageMaxFileSizeBytes;
|
| controller->set_limits_for_testing(limits);
|
| }
|
| @@ -103,6 +106,8 @@ class BlobMemoryControllerTest : public testing::Test {
|
| limits.desired_max_disk_space = kTestSmallBlobStorageMaxDiskSpace;
|
| limits.effective_max_disk_space = kTestSmallBlobStorageMaxDiskSpace;
|
| limits.min_page_file_size = kTestBlobStorageMinFileSizeBytes;
|
| + limits.min_page_file_size_ratio_under_pressure =
|
| + kTestBlobStorageMinFileSizeBytesUnderPressure;
|
| limits.max_file_size = kTestBlobStorageMaxFileSizeBytes;
|
| controller->set_limits_for_testing(limits);
|
| }
|
| @@ -1120,4 +1125,47 @@ 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 *
|
| + kTestBlobStorageMinFileSizeBytesUnderPressure +
|
| + 1;
|
| + // 2 * kTestBlobStorageMinFileSizeBytesUnderPressure is less than
|
| + // 2 * kTestBlobStorageMinFileSizeBytes.
|
| + 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();
|
| +
|
| + EXPECT_EQ(1u, controller.memory_usage());
|
| + EXPECT_EQ(size_to_load - 1, controller.disk_usage());
|
| + return;
|
| +}
|
| +
|
| } // namespace storage
|
|
|