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..d6485cb14d0cc7f76d82aab80789f846a1004e03 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 uint64_t kTestBlobStorageMinFileSizeBytesUnderPressure = 4; |
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_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_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; |
+ // 2 * kTestBlobStorageMinFileSizeBytesUnderPressure is less than |
+ // 2 * kTestBlobStorageMinFileSizeBytes. |
+ for (size_t i = 0; i < 2 * kTestBlobStorageMinFileSizeBytesUnderPressure; |
+ 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(2 * kTestBlobStorageMinFileSizeBytesUnderPressure, |
+ controller.memory_usage()); |
+ |
+ controller.OnMemoryPressure( |
+ base::MemoryPressureListener::MemoryPressureLevel:: |
+ MEMORY_PRESSURE_LEVEL_CRITICAL); |
+ |
+ EXPECT_TRUE(file_runner_->HasPendingTask()); |
+ RunFileThreadTasks(); |
+ |
+ base::RunLoop().RunUntilIdle(); |
+ |
+ EXPECT_EQ(0u, controller.memory_usage()); |
+ EXPECT_EQ(2 * kTestBlobStorageMinFileSizeBytesUnderPressure, |
+ controller.disk_usage()); |
+ return; |
+} |
+ |
} // namespace storage |