| OLD | NEW |
| 1 // Copyright 2016 The Chromium Authors. All rights reserved. | 1 // Copyright 2016 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include "components/offline_pages/offline_page_storage_manager.h" | 5 #include "components/offline_pages/offline_page_storage_manager.h" |
| 6 | 6 |
| 7 #include <stdint.h> | 7 #include <stdint.h> |
| 8 #include <map> |
| 9 #include <vector> |
| 8 | 10 |
| 9 #include "base/bind.h" | 11 #include "base/bind.h" |
| 10 #include "base/files/file_path.h" | 12 #include "base/files/file_path.h" |
| 11 #include "base/test/simple_test_clock.h" | 13 #include "base/test/simple_test_clock.h" |
| 12 #include "base/time/time.h" | 14 #include "base/time/time.h" |
| 13 #include "components/offline_pages/archive_manager.h" | 15 #include "components/offline_pages/archive_manager.h" |
| 14 #include "components/offline_pages/client_policy_controller.h" | 16 #include "components/offline_pages/client_policy_controller.h" |
| 15 #include "components/offline_pages/offline_page_item.h" | 17 #include "components/offline_pages/offline_page_item.h" |
| 16 #include "components/offline_pages/offline_page_storage_manager.h" | 18 #include "components/offline_pages/offline_page_storage_manager.h" |
| 17 #include "components/offline_pages/offline_page_types.h" | 19 #include "components/offline_pages/offline_page_types.h" |
| 18 #include "testing/gtest/include/gtest/gtest.h" | 20 #include "testing/gtest/include/gtest/gtest.h" |
| 19 | 21 |
| 20 using LifetimePolicy = offline_pages::LifetimePolicy; | 22 using LifetimePolicy = offline_pages::LifetimePolicy; |
| 21 using ClearStorageResult = | 23 using ClearStorageResult = |
| 22 offline_pages::OfflinePageStorageManager::ClearStorageResult; | 24 offline_pages::OfflinePageStorageManager::ClearStorageResult; |
| 23 using StorageStats = offline_pages::ArchiveManager::StorageStats; | 25 using StorageStats = offline_pages::ArchiveManager::StorageStats; |
| 24 | 26 |
| 25 namespace offline_pages { | 27 namespace offline_pages { |
| 26 | 28 |
| 27 namespace { | 29 namespace { |
| 28 const char kBookmarkNamespace[] = "bookmark"; | 30 const char kBookmarkNamespace[] = "bookmark"; |
| 29 const char kLastNNamespace[] = "last_n"; | 31 const char kLastNNamespace[] = "last_n"; |
| 30 const GURL kTestUrl("http://example.com"); | 32 const GURL kTestUrl("http://example.com"); |
| 31 const base::FilePath::CharType kFilePath[] = FILE_PATH_LITERAL("/data"); | 33 const base::FilePath::CharType kFilePath[] = FILE_PATH_LITERAL("/data"); |
| 32 const int64_t kTestFileSize = 500 * (1 << 10); | 34 const int64_t kTestFileSize = 500 * (1 << 10); |
| 33 const int64_t kFreeSpaceNormal = 100 * (1 << 20); | 35 const int64_t kFreeSpaceNormal = 100 * (1 << 20); |
| 34 | 36 |
| 35 enum TestOptions { | 37 enum TestOptions { |
| 36 DEFAULT = 1 << 0, | 38 DEFAULT = 1 << 0, |
| 37 DELETE_FAILURE = 1 << 1, | 39 EXPIRE_FAILURE = 1 << 1, |
| 40 DELETE_FAILURE = 1 << 2, |
| 41 EXPIRE_AND_DELETE_FAILURES = EXPIRE_FAILURE | DELETE_FAILURE, |
| 38 }; | 42 }; |
| 39 | 43 |
| 40 struct PageSettings { | 44 struct PageSettings { |
| 41 std::string name_space; | 45 std::string name_space; |
| 42 int fresh_pages_count; | 46 int fresh_pages_count; |
| 43 int expired_pages_count; | 47 int expired_pages_count; |
| 44 }; | 48 }; |
| 45 } // namespace | 49 } // namespace |
| 46 | 50 |
| 47 class StorageManagerTestClient : public OfflinePageStorageManager::Client { | 51 class StorageManagerTestClient : public OfflinePageStorageManager::Client { |
| 48 public: | 52 public: |
| 49 StorageManagerTestClient(std::vector<PageSettings> page_settings, | 53 StorageManagerTestClient(std::vector<PageSettings> page_settings, |
| 50 base::SimpleTestClock* clock, | 54 base::SimpleTestClock* clock, |
| 51 TestOptions options = TestOptions::DEFAULT) | 55 TestOptions options = TestOptions::DEFAULT) |
| 52 : policy_controller_(new ClientPolicyController()), | 56 : policy_controller_(new ClientPolicyController()), |
| 53 clock_(clock), | 57 clock_(clock), |
| 54 options_(options), | 58 options_(options), |
| 55 next_offline_id_(0) { | 59 next_offline_id_(0) { |
| 56 for (const auto& setting : page_settings) | 60 for (const auto& setting : page_settings) |
| 57 AddPages(setting); | 61 AddPages(setting); |
| 58 } | 62 } |
| 59 | 63 |
| 60 ~StorageManagerTestClient() override; | 64 ~StorageManagerTestClient() override; |
| 61 | 65 |
| 62 void GetAllPages(const MultipleOfflinePageItemCallback& callback) override { | 66 void GetAllPages(const MultipleOfflinePageItemCallback& callback) override { |
| 63 callback.Run(pages_); | 67 MultipleOfflinePageItemResult pages; |
| 68 for (const auto& id_page_pair : pages_) |
| 69 pages.push_back(id_page_pair.second); |
| 70 callback.Run(pages); |
| 64 } | 71 } |
| 65 | 72 |
| 66 void DeletePagesByOfflineId(const std::vector<int64_t>& offline_ids, | 73 void DeletePagesByOfflineId(const std::vector<int64_t>& offline_ids, |
| 67 const DeletePageCallback& callback) override; | 74 const DeletePageCallback& callback) override; |
| 75 |
| 76 void ExpirePages(const std::vector<int64_t>& offline_ids, |
| 77 const base::Time& expiration_time, |
| 78 const base::Callback<void(bool)>& callback) override; |
| 79 |
| 68 void AddPages(const PageSettings& setting); | 80 void AddPages(const PageSettings& setting); |
| 69 | 81 |
| 82 const std::vector<OfflinePageItem>& GetRemovedPages() { |
| 83 return removed_pages_; |
| 84 } |
| 85 |
| 70 int64_t GetTotalSize() const; | 86 int64_t GetTotalSize() const; |
| 71 | 87 |
| 72 base::SimpleTestClock* clock() { return clock_; } | 88 base::SimpleTestClock* clock() { return clock_; } |
| 73 | 89 |
| 74 private: | 90 private: |
| 91 std::map<int64_t, OfflinePageItem> pages_; |
| 75 | 92 |
| 76 std::vector<OfflinePageItem> pages_; | 93 std::vector<OfflinePageItem> removed_pages_; |
| 77 | 94 |
| 78 std::unique_ptr<ClientPolicyController> policy_controller_; | 95 std::unique_ptr<ClientPolicyController> policy_controller_; |
| 79 | 96 |
| 80 base::SimpleTestClock* clock_; | 97 base::SimpleTestClock* clock_; |
| 81 | 98 |
| 82 TestOptions options_; | 99 TestOptions options_; |
| 83 | 100 |
| 84 int64_t next_offline_id_; | 101 int64_t next_offline_id_; |
| 85 }; | 102 }; |
| 86 | 103 |
| 104 void StorageManagerTestClient::ExpirePages( |
| 105 const std::vector<int64_t>& offline_ids, |
| 106 const base::Time& expiration_time, |
| 107 const base::Callback<void(bool)>& callback) { |
| 108 for (const auto id : offline_ids) |
| 109 pages_.at(id).expiration_time = expiration_time; |
| 110 if (options_ & TestOptions::EXPIRE_FAILURE) { |
| 111 callback.Run(false); |
| 112 return; |
| 113 } |
| 114 callback.Run(true); |
| 115 } |
| 116 |
| 87 void StorageManagerTestClient::DeletePagesByOfflineId( | 117 void StorageManagerTestClient::DeletePagesByOfflineId( |
| 88 const std::vector<int64_t>& offline_ids, | 118 const std::vector<int64_t>& offline_ids, |
| 89 const DeletePageCallback& callback) { | 119 const DeletePageCallback& callback) { |
| 90 if (options_ & TestOptions::DELETE_FAILURE) { | 120 if (options_ & TestOptions::DELETE_FAILURE) { |
| 91 callback.Run(DeletePageResult::STORE_FAILURE); | 121 callback.Run(DeletePageResult::STORE_FAILURE); |
| 92 return; | 122 return; |
| 93 } | 123 } |
| 94 std::set<int64_t> s(offline_ids.begin(), offline_ids.end()); | 124 for (const auto id : offline_ids) { |
| 95 pages_.erase(std::remove_if(pages_.begin(), pages_.end(), | 125 removed_pages_.push_back(pages_.at(id)); |
| 96 [&s](const OfflinePageItem& page) -> bool { | 126 pages_.erase(id); |
| 97 return s.count(page.offline_id) != 0; | 127 } |
| 98 }), | |
| 99 pages_.end()); | |
| 100 callback.Run(DeletePageResult::SUCCESS); | 128 callback.Run(DeletePageResult::SUCCESS); |
| 101 } | 129 } |
| 102 | 130 |
| 103 int64_t StorageManagerTestClient::GetTotalSize() const { | 131 int64_t StorageManagerTestClient::GetTotalSize() const { |
| 104 int64_t res = 0; | 132 int64_t res = 0; |
| 105 for (const auto& page : pages_) | 133 for (const auto& id_page_pair : pages_) { |
| 106 res += page.file_size; | 134 if (!id_page_pair.second.IsExpired()) |
| 135 res += id_page_pair.second.file_size; |
| 136 } |
| 107 return res; | 137 return res; |
| 108 } | 138 } |
| 109 | 139 |
| 110 StorageManagerTestClient::~StorageManagerTestClient() {} | 140 StorageManagerTestClient::~StorageManagerTestClient() {} |
| 111 | 141 |
| 112 void StorageManagerTestClient::AddPages(const PageSettings& setting) { | 142 void StorageManagerTestClient::AddPages(const PageSettings& setting) { |
| 113 std::string name_space = setting.name_space; | 143 std::string name_space = setting.name_space; |
| 114 int fresh_pages_count = setting.fresh_pages_count; | 144 int fresh_pages_count = setting.fresh_pages_count; |
| 115 int expired_pages_count = setting.expired_pages_count; | 145 int expired_pages_count = setting.expired_pages_count; |
| 116 base::Time now = clock()->Now(); | 146 base::Time now = clock()->Now(); |
| 117 // Fresh pages. | 147 // Fresh pages. |
| 118 for (int i = 0; i < fresh_pages_count; i++) { | 148 for (int i = 0; i < fresh_pages_count; i++) { |
| 119 OfflinePageItem page = | 149 OfflinePageItem page = |
| 120 OfflinePageItem(kTestUrl, next_offline_id_, | 150 OfflinePageItem(kTestUrl, next_offline_id_, |
| 121 ClientId(name_space, std::to_string(next_offline_id_)), | 151 ClientId(name_space, std::to_string(next_offline_id_)), |
| 122 base::FilePath(kFilePath), kTestFileSize); | 152 base::FilePath(kFilePath), kTestFileSize); |
| 153 page.last_access_time = now; |
| 154 pages_[next_offline_id_] = page; |
| 123 next_offline_id_++; | 155 next_offline_id_++; |
| 124 page.last_access_time = now; | |
| 125 pages_.push_back(page); | |
| 126 } | 156 } |
| 127 // Expired pages. | 157 // Expired pages. |
| 128 for (int i = 0; i < expired_pages_count; i++) { | 158 for (int i = 0; i < expired_pages_count; i++) { |
| 129 OfflinePageItem page = | 159 OfflinePageItem page = |
| 130 OfflinePageItem(kTestUrl, next_offline_id_, | 160 OfflinePageItem(kTestUrl, next_offline_id_, |
| 131 ClientId(name_space, std::to_string(next_offline_id_)), | 161 ClientId(name_space, std::to_string(next_offline_id_)), |
| 132 base::FilePath(kFilePath), kTestFileSize); | 162 base::FilePath(kFilePath), kTestFileSize); |
| 133 next_offline_id_++; | |
| 134 page.last_access_time = now - | 163 page.last_access_time = now - |
| 135 policy_controller_->GetPolicy(name_space) | 164 policy_controller_->GetPolicy(name_space) |
| 136 .lifetime_policy.expiration_period; | 165 .lifetime_policy.expiration_period; |
| 137 pages_.push_back(page); | 166 pages_[next_offline_id_] = page; |
| 167 next_offline_id_++; |
| 138 } | 168 } |
| 139 } | 169 } |
| 140 | 170 |
| 141 class TestArchiveManager : public ArchiveManager { | 171 class TestArchiveManager : public ArchiveManager { |
| 142 public: | 172 public: |
| 143 explicit TestArchiveManager(StorageStats stats) : stats_(stats) {} | 173 explicit TestArchiveManager(StorageStats stats) : stats_(stats) {} |
| 144 | 174 |
| 145 void GetStorageStats(const base::Callback< | 175 void GetStorageStats(const base::Callback< |
| 146 void(const ArchiveManager::StorageStats& storage_stats)>& | 176 void(const ArchiveManager::StorageStats& storage_stats)>& |
| 147 callback) const override { | 177 callback) const override { |
| 148 callback.Run(stats_); | 178 callback.Run(stats_); |
| 149 } | 179 } |
| 150 | 180 |
| 151 void SetValues(ArchiveManager::StorageStats stats) { stats_ = stats; } | 181 void SetValues(ArchiveManager::StorageStats stats) { stats_ = stats; } |
| 152 | 182 |
| 153 private: | 183 private: |
| 154 StorageStats stats_; | 184 StorageStats stats_; |
| 155 }; | 185 }; |
| 156 | 186 |
| 157 class OfflinePageStorageManagerTest : public testing::Test { | 187 class OfflinePageStorageManagerTest : public testing::Test { |
| 158 public: | 188 public: |
| 159 OfflinePageStorageManagerTest(); | 189 OfflinePageStorageManagerTest(); |
| 160 OfflinePageStorageManager* manager() { return manager_.get(); } | 190 OfflinePageStorageManager* manager() { return manager_.get(); } |
| 161 StorageManagerTestClient* test_client() { return client_.get(); } | 191 StorageManagerTestClient* client() { return client_.get(); } |
| 162 ClientPolicyController* policy_controller() { | 192 ClientPolicyController* policy_controller() { |
| 163 return policy_controller_.get(); | 193 return policy_controller_.get(); |
| 164 } | 194 } |
| 165 TestArchiveManager* test_archive_manager() { return archive_manager_.get(); } | 195 TestArchiveManager* test_archive_manager() { return archive_manager_.get(); } |
| 166 void OnPagesCleared(int pages_cleared_count, ClearStorageResult result); | 196 void OnPagesCleared(size_t pages_cleared_count, ClearStorageResult result); |
| 167 void Initialize(const std::vector<PageSettings>& settings, | 197 void Initialize(const std::vector<PageSettings>& settings, |
| 168 StorageStats stats = {kFreeSpaceNormal, 0}, | 198 StorageStats stats = {kFreeSpaceNormal, 0}, |
| 169 TestOptions options = TestOptions::DEFAULT); | 199 TestOptions options = TestOptions::DEFAULT); |
| 170 void TryClearPages(); | 200 void TryClearPages(); |
| 171 | 201 |
| 172 // testing::Test | 202 // testing::Test |
| 173 void TearDown() override; | 203 void TearDown() override; |
| 174 | 204 |
| 175 base::SimpleTestClock* clock() { return clock_; } | 205 base::SimpleTestClock* clock() { return clock_; } |
| 176 int last_cleared_page_count() const { return last_cleared_page_count_; } | 206 int last_cleared_page_count() const { |
| 207 return static_cast<int>(last_cleared_page_count_); |
| 208 } |
| 177 int total_cleared_times() const { return total_cleared_times_; } | 209 int total_cleared_times() const { return total_cleared_times_; } |
| 178 ClearStorageResult last_clear_storage_result() const { | 210 ClearStorageResult last_clear_storage_result() const { |
| 179 return last_clear_storage_result_; | 211 return last_clear_storage_result_; |
| 180 } | 212 } |
| 181 | 213 |
| 182 private: | 214 private: |
| 183 std::unique_ptr<OfflinePageStorageManager> manager_; | 215 std::unique_ptr<OfflinePageStorageManager> manager_; |
| 184 std::unique_ptr<StorageManagerTestClient> client_; | 216 std::unique_ptr<StorageManagerTestClient> client_; |
| 185 std::unique_ptr<ClientPolicyController> policy_controller_; | 217 std::unique_ptr<ClientPolicyController> policy_controller_; |
| 186 std::unique_ptr<TestArchiveManager> archive_manager_; | 218 std::unique_ptr<TestArchiveManager> archive_manager_; |
| 187 | 219 |
| 188 base::SimpleTestClock* clock_; | 220 base::SimpleTestClock* clock_; |
| 189 | 221 |
| 190 int last_cleared_page_count_; | 222 size_t last_cleared_page_count_; |
| 191 int total_cleared_times_; | 223 int total_cleared_times_; |
| 192 ClearStorageResult last_clear_storage_result_; | 224 ClearStorageResult last_clear_storage_result_; |
| 193 }; | 225 }; |
| 194 | 226 |
| 195 OfflinePageStorageManagerTest::OfflinePageStorageManagerTest() | 227 OfflinePageStorageManagerTest::OfflinePageStorageManagerTest() |
| 196 : policy_controller_(new ClientPolicyController()), | 228 : policy_controller_(new ClientPolicyController()), |
| 197 last_cleared_page_count_(0), | 229 last_cleared_page_count_(0), |
| 198 total_cleared_times_(0), | 230 total_cleared_times_(0), |
| 199 last_clear_storage_result_(ClearStorageResult::SUCCESS) {} | 231 last_clear_storage_result_(ClearStorageResult::SUCCESS) {} |
| 200 | 232 |
| (...skipping 20 matching lines...) Expand all Loading... |
| 221 void OfflinePageStorageManagerTest::TryClearPages() { | 253 void OfflinePageStorageManagerTest::TryClearPages() { |
| 222 manager()->ClearPagesIfNeeded(base::Bind( | 254 manager()->ClearPagesIfNeeded(base::Bind( |
| 223 &OfflinePageStorageManagerTest::OnPagesCleared, base::Unretained(this))); | 255 &OfflinePageStorageManagerTest::OnPagesCleared, base::Unretained(this))); |
| 224 } | 256 } |
| 225 | 257 |
| 226 void OfflinePageStorageManagerTest::TearDown() { | 258 void OfflinePageStorageManagerTest::TearDown() { |
| 227 manager_.reset(); | 259 manager_.reset(); |
| 228 client_.reset(); | 260 client_.reset(); |
| 229 } | 261 } |
| 230 | 262 |
| 231 void OfflinePageStorageManagerTest::OnPagesCleared(int pages_cleared_count, | 263 void OfflinePageStorageManagerTest::OnPagesCleared(size_t pages_cleared_count, |
| 232 ClearStorageResult result) { | 264 ClearStorageResult result) { |
| 233 last_cleared_page_count_ = pages_cleared_count; | 265 last_cleared_page_count_ = pages_cleared_count; |
| 234 total_cleared_times_++; | 266 total_cleared_times_++; |
| 235 last_clear_storage_result_ = result; | 267 last_clear_storage_result_ = result; |
| 236 } | 268 } |
| 237 | 269 |
| 238 TEST_F(OfflinePageStorageManagerTest, TestClearPagesLessThanLimit) { | 270 TEST_F(OfflinePageStorageManagerTest, TestClearPagesLessThanLimit) { |
| 239 Initialize(std::vector<PageSettings>( | 271 Initialize(std::vector<PageSettings>( |
| 240 {{kBookmarkNamespace, 1, 1}, {kLastNNamespace, 1, 1}})); | 272 {{kBookmarkNamespace, 1, 1}, {kLastNNamespace, 1, 1}})); |
| 241 clock()->Advance(base::TimeDelta::FromMinutes(30)); | 273 clock()->Advance(base::TimeDelta::FromMinutes(30)); |
| 242 TryClearPages(); | 274 TryClearPages(); |
| 243 EXPECT_EQ(2, last_cleared_page_count()); | 275 EXPECT_EQ(2, last_cleared_page_count()); |
| 244 EXPECT_EQ(1, total_cleared_times()); | 276 EXPECT_EQ(1, total_cleared_times()); |
| 245 EXPECT_EQ(ClearStorageResult::SUCCESS, last_clear_storage_result()); | 277 EXPECT_EQ(ClearStorageResult::SUCCESS, last_clear_storage_result()); |
| 278 EXPECT_EQ(0, static_cast<int>(client()->GetRemovedPages().size())); |
| 246 } | 279 } |
| 247 | 280 |
| 248 TEST_F(OfflinePageStorageManagerTest, TestClearPagesMoreThanLimit) { | 281 TEST_F(OfflinePageStorageManagerTest, TestClearPagesMoreThanLimit) { |
| 249 Initialize(std::vector<PageSettings>( | 282 Initialize(std::vector<PageSettings>( |
| 250 {{kBookmarkNamespace, 10, 15}, {kLastNNamespace, 5, 30}})); | 283 {{kBookmarkNamespace, 10, 15}, {kLastNNamespace, 5, 30}})); |
| 251 clock()->Advance(base::TimeDelta::FromMinutes(30)); | 284 clock()->Advance(base::TimeDelta::FromMinutes(30)); |
| 252 TryClearPages(); | 285 TryClearPages(); |
| 253 EXPECT_EQ(45, last_cleared_page_count()); | 286 EXPECT_EQ(45, last_cleared_page_count()); |
| 254 EXPECT_EQ(1, total_cleared_times()); | 287 EXPECT_EQ(1, total_cleared_times()); |
| 255 EXPECT_EQ(ClearStorageResult::SUCCESS, last_clear_storage_result()); | 288 EXPECT_EQ(ClearStorageResult::SUCCESS, last_clear_storage_result()); |
| 289 EXPECT_EQ(0, static_cast<int>(client()->GetRemovedPages().size())); |
| 256 } | 290 } |
| 257 | 291 |
| 258 TEST_F(OfflinePageStorageManagerTest, TestClearPagesMoreFreshPages) { | 292 TEST_F(OfflinePageStorageManagerTest, TestClearPagesMoreFreshPages) { |
| 259 Initialize(std::vector<PageSettings>( | 293 Initialize(std::vector<PageSettings>( |
| 260 {{kBookmarkNamespace, 30, 0}, {kLastNNamespace, 100, 1}}), | 294 {{kBookmarkNamespace, 30, 0}, {kLastNNamespace, 100, 1}}), |
| 261 {500 * (1 << 20), 0}); | 295 {500 * (1 << 20), 0}); |
| 262 clock()->Advance(base::TimeDelta::FromMinutes(30)); | 296 clock()->Advance(base::TimeDelta::FromMinutes(30)); |
| 263 TryClearPages(); | 297 TryClearPages(); |
| 264 int last_n_page_limit = policy_controller() | 298 int last_n_page_limit = static_cast<int>(policy_controller() |
| 265 ->GetPolicy(kLastNNamespace) | 299 ->GetPolicy(kLastNNamespace) |
| 266 .lifetime_policy.page_limit; | 300 .lifetime_policy.page_limit); |
| 267 EXPECT_EQ(1 + (100 - last_n_page_limit), last_cleared_page_count()); | 301 EXPECT_EQ(1 + (100 - last_n_page_limit), last_cleared_page_count()); |
| 268 EXPECT_EQ(1, total_cleared_times()); | 302 EXPECT_EQ(1, total_cleared_times()); |
| 269 EXPECT_EQ(ClearStorageResult::SUCCESS, last_clear_storage_result()); | 303 EXPECT_EQ(ClearStorageResult::SUCCESS, last_clear_storage_result()); |
| 304 EXPECT_EQ(0, static_cast<int>(client()->GetRemovedPages().size())); |
| 270 } | 305 } |
| 271 | 306 |
| 272 TEST_F(OfflinePageStorageManagerTest, TestDeletionFailed) { | 307 TEST_F(OfflinePageStorageManagerTest, TestDeletionFailed) { |
| 273 Initialize(std::vector<PageSettings>( | 308 Initialize(std::vector<PageSettings>( |
| 274 {{kBookmarkNamespace, 10, 10}, {kLastNNamespace, 10, 10}}), | 309 {{kBookmarkNamespace, 10, 10}, {kLastNNamespace, 10, 10}}), |
| 275 {kFreeSpaceNormal, 0}, TestOptions::DELETE_FAILURE); | 310 {kFreeSpaceNormal, 0}, TestOptions::DELETE_FAILURE); |
| 276 TryClearPages(); | 311 TryClearPages(); |
| 277 EXPECT_EQ(20, last_cleared_page_count()); | 312 EXPECT_EQ(20, last_cleared_page_count()); |
| 278 EXPECT_EQ(1, total_cleared_times()); | 313 EXPECT_EQ(1, total_cleared_times()); |
| 279 EXPECT_EQ(ClearStorageResult::DELETE_FAILURE, last_clear_storage_result()); | 314 EXPECT_EQ(ClearStorageResult::DELETE_FAILURE, last_clear_storage_result()); |
| 315 EXPECT_EQ(0, static_cast<int>(client()->GetRemovedPages().size())); |
| 316 } |
| 317 |
| 318 TEST_F(OfflinePageStorageManagerTest, TestRemoveFromStoreFailure) { |
| 319 Initialize(std::vector<PageSettings>({{kBookmarkNamespace, 10, 10}}), {0, 0}, |
| 320 TestOptions::EXPIRE_FAILURE); |
| 321 clock()->Advance(base::TimeDelta::FromMinutes(30)); |
| 322 TryClearPages(); |
| 323 EXPECT_EQ(10, last_cleared_page_count()); |
| 324 EXPECT_EQ(1, total_cleared_times()); |
| 325 EXPECT_EQ(ClearStorageResult::EXPIRE_FAILURE, last_clear_storage_result()); |
| 326 EXPECT_EQ(0, static_cast<int>(client()->GetRemovedPages().size())); |
| 327 } |
| 328 |
| 329 TEST_F(OfflinePageStorageManagerTest, TestBothFailure) { |
| 330 Initialize(std::vector<PageSettings>({{kBookmarkNamespace, 10, 10}}), {0, 0}, |
| 331 TestOptions::EXPIRE_AND_DELETE_FAILURES); |
| 332 clock()->Advance(base::TimeDelta::FromMinutes(30)); |
| 333 TryClearPages(); |
| 334 EXPECT_EQ(ClearStorageResult::EXPIRE_AND_DELETE_FAILURES, |
| 335 last_clear_storage_result()); |
| 280 } | 336 } |
| 281 | 337 |
| 282 TEST_F(OfflinePageStorageManagerTest, TestStorageTimeInterval) { | 338 TEST_F(OfflinePageStorageManagerTest, TestStorageTimeInterval) { |
| 283 Initialize(std::vector<PageSettings>( | 339 Initialize(std::vector<PageSettings>( |
| 284 {{kBookmarkNamespace, 10, 10}, {kLastNNamespace, 10, 10}})); | 340 {{kBookmarkNamespace, 10, 10}, {kLastNNamespace, 10, 10}})); |
| 285 clock()->Advance(base::TimeDelta::FromMinutes(30)); | 341 clock()->Advance(base::TimeDelta::FromMinutes(30)); |
| 286 TryClearPages(); | 342 TryClearPages(); |
| 287 EXPECT_EQ(20, last_cleared_page_count()); | 343 EXPECT_EQ(20, last_cleared_page_count()); |
| 288 EXPECT_EQ(1, total_cleared_times()); | 344 EXPECT_EQ(1, total_cleared_times()); |
| 289 EXPECT_EQ(ClearStorageResult::SUCCESS, last_clear_storage_result()); | 345 EXPECT_EQ(ClearStorageResult::SUCCESS, last_clear_storage_result()); |
| 346 EXPECT_EQ(0, static_cast<int>(client()->GetRemovedPages().size())); |
| 290 | 347 |
| 291 // Advance clock so we go over the gap, but no expired pages. | 348 // Advance clock so we go over the gap, but no expired pages. |
| 292 clock()->Advance(kClearStorageInterval + base::TimeDelta::FromHours(1)); | 349 clock()->Advance(kClearStorageInterval + base::TimeDelta::FromMinutes(1)); |
| 293 TryClearPages(); | 350 TryClearPages(); |
| 294 EXPECT_EQ(0, last_cleared_page_count()); | 351 EXPECT_EQ(0, last_cleared_page_count()); |
| 295 EXPECT_EQ(2, total_cleared_times()); | 352 EXPECT_EQ(2, total_cleared_times()); |
| 296 EXPECT_EQ(ClearStorageResult::SUCCESS, last_clear_storage_result()); | 353 EXPECT_EQ(ClearStorageResult::SUCCESS, last_clear_storage_result()); |
| 354 EXPECT_EQ(0, static_cast<int>(client()->GetRemovedPages().size())); |
| 297 | 355 |
| 298 // Advance clock so we are still in the gap, should be unnecessary. | 356 // Advance clock so we are still in the gap, should be unnecessary. |
| 299 clock()->Advance(kClearStorageInterval - base::TimeDelta::FromHours(1)); | 357 clock()->Advance(kClearStorageInterval - base::TimeDelta::FromMinutes(1)); |
| 300 TryClearPages(); | 358 TryClearPages(); |
| 301 EXPECT_EQ(0, last_cleared_page_count()); | 359 EXPECT_EQ(0, last_cleared_page_count()); |
| 302 EXPECT_EQ(3, total_cleared_times()); | 360 EXPECT_EQ(3, total_cleared_times()); |
| 303 EXPECT_EQ(ClearStorageResult::UNNECESSARY, last_clear_storage_result()); | 361 EXPECT_EQ(ClearStorageResult::UNNECESSARY, last_clear_storage_result()); |
| 362 EXPECT_EQ(0, static_cast<int>(client()->GetRemovedPages().size())); |
| 363 } |
| 364 |
| 365 TEST_F(OfflinePageStorageManagerTest, TestTwoStepExpiration) { |
| 366 Initialize(std::vector<PageSettings>({{kBookmarkNamespace, 10, 10}})); |
| 367 clock()->Advance(base::TimeDelta::FromMinutes(30)); |
| 368 TryClearPages(); |
| 369 EXPECT_EQ(10, last_cleared_page_count()); |
| 370 EXPECT_EQ(1, total_cleared_times()); |
| 371 EXPECT_EQ(ClearStorageResult::SUCCESS, last_clear_storage_result()); |
| 372 EXPECT_EQ(0, static_cast<int>(client()->GetRemovedPages().size())); |
| 373 |
| 374 clock()->Advance(kRemovePageItemInterval + base::TimeDelta::FromDays(1)); |
| 375 TryClearPages(); |
| 376 EXPECT_EQ(10, last_cleared_page_count()); |
| 377 EXPECT_EQ(2, total_cleared_times()); |
| 378 EXPECT_EQ(ClearStorageResult::SUCCESS, last_clear_storage_result()); |
| 379 EXPECT_EQ(10, static_cast<int>(client()->GetRemovedPages().size())); |
| 304 } | 380 } |
| 305 | 381 |
| 306 TEST_F(OfflinePageStorageManagerTest, TestClearMultipleTimes) { | 382 TEST_F(OfflinePageStorageManagerTest, TestClearMultipleTimes) { |
| 307 Initialize(std::vector<PageSettings>( | 383 Initialize(std::vector<PageSettings>( |
| 308 {{kBookmarkNamespace, 30, 0}, {kLastNNamespace, 100, 1}}), | 384 {{kBookmarkNamespace, 30, 0}, {kLastNNamespace, 100, 1}}), |
| 309 {500 * (1 << 20), 0}); | 385 {500 * (1 << 20), 0}); |
| 310 clock()->Advance(base::TimeDelta::FromMinutes(30)); | 386 clock()->Advance(base::TimeDelta::FromMinutes(30)); |
| 311 LifetimePolicy policy = | 387 LifetimePolicy policy = |
| 312 policy_controller()->GetPolicy(kLastNNamespace).lifetime_policy; | 388 policy_controller()->GetPolicy(kLastNNamespace).lifetime_policy; |
| 313 int last_n_page_limit = policy.page_limit; | 389 int last_n_page_limit = static_cast<int>(policy.page_limit); |
| 314 | 390 |
| 315 TryClearPages(); | 391 TryClearPages(); |
| 316 EXPECT_EQ(1 + (100 - last_n_page_limit), last_cleared_page_count()); | 392 EXPECT_EQ(1 + (100 - last_n_page_limit), last_cleared_page_count()); |
| 317 EXPECT_EQ(1, total_cleared_times()); | 393 EXPECT_EQ(1, total_cleared_times()); |
| 318 EXPECT_EQ(ClearStorageResult::SUCCESS, last_clear_storage_result()); | 394 EXPECT_EQ(ClearStorageResult::SUCCESS, last_clear_storage_result()); |
| 395 EXPECT_EQ(0, static_cast<int>(client()->GetRemovedPages().size())); |
| 319 | 396 |
| 320 // Advance the clock by expiration period of last_n namespace, should be | 397 // Advance the clock by expiration period of last_n namespace, should be |
| 321 // deleting all pages left in the namespace. | 398 // expiring all pages left in the namespace. |
| 322 clock()->Advance(policy.expiration_period); | 399 clock()->Advance(policy.expiration_period); |
| 323 TryClearPages(); | 400 TryClearPages(); |
| 324 EXPECT_EQ(last_n_page_limit, last_cleared_page_count()); | 401 EXPECT_EQ(last_n_page_limit, last_cleared_page_count()); |
| 325 EXPECT_EQ(2, total_cleared_times()); | 402 EXPECT_EQ(2, total_cleared_times()); |
| 326 EXPECT_EQ(ClearStorageResult::SUCCESS, last_clear_storage_result()); | 403 EXPECT_EQ(ClearStorageResult::SUCCESS, last_clear_storage_result()); |
| 404 EXPECT_EQ(0, static_cast<int>(client()->GetRemovedPages().size())); |
| 327 | 405 |
| 328 // Only 1 ms passes and no changes in pages, so no need to clear page. | 406 // Only 1 ms passes and no changes in pages, so no need to clear page. |
| 329 clock()->Advance(base::TimeDelta::FromMilliseconds(1)); | 407 clock()->Advance(base::TimeDelta::FromMilliseconds(1)); |
| 330 TryClearPages(); | 408 TryClearPages(); |
| 331 EXPECT_EQ(0, last_cleared_page_count()); | 409 EXPECT_EQ(0, last_cleared_page_count()); |
| 332 EXPECT_EQ(3, total_cleared_times()); | 410 EXPECT_EQ(3, total_cleared_times()); |
| 333 EXPECT_EQ(ClearStorageResult::UNNECESSARY, last_clear_storage_result()); | 411 EXPECT_EQ(ClearStorageResult::UNNECESSARY, last_clear_storage_result()); |
| 412 EXPECT_EQ(0, static_cast<int>(client()->GetRemovedPages().size())); |
| 334 | 413 |
| 335 // Adding more fresh pages to make it go over limit. | 414 // Adding more fresh pages to make it go over limit. |
| 336 clock()->Advance(base::TimeDelta::FromMinutes(5)); | 415 clock()->Advance(base::TimeDelta::FromMinutes(5)); |
| 337 test_client()->AddPages({kBookmarkNamespace, 400, 0}); | 416 client()->AddPages({kBookmarkNamespace, 400, 0}); |
| 338 int64_t total_size_before = test_client()->GetTotalSize(); | 417 int64_t total_size_before = client()->GetTotalSize(); |
| 339 test_archive_manager()->SetValues({300 * (1 << 20), total_size_before}); | 418 int64_t available_space = 300 * (1 << 20); // 300 MB |
| 419 test_archive_manager()->SetValues({available_space, total_size_before}); |
| 420 EXPECT_GE(total_size_before, |
| 421 kOfflinePageStorageLimit * (available_space + total_size_before)); |
| 340 TryClearPages(); | 422 TryClearPages(); |
| 341 EXPECT_LE(total_size_before * kOfflinePageStorageClearThreshold, | 423 EXPECT_LE(total_size_before * kOfflinePageStorageClearThreshold, |
| 342 test_client()->GetTotalSize()); | 424 client()->GetTotalSize()); |
| 343 EXPECT_EQ(4, total_cleared_times()); | 425 EXPECT_EQ(4, total_cleared_times()); |
| 344 EXPECT_EQ(ClearStorageResult::SUCCESS, last_clear_storage_result()); | 426 EXPECT_EQ(ClearStorageResult::SUCCESS, last_clear_storage_result()); |
| 427 EXPECT_EQ(0, static_cast<int>(client()->GetRemovedPages().size())); |
| 428 int expired_page_count = last_cleared_page_count(); |
| 345 | 429 |
| 346 // After more days, all pages should be expired and deleted. | 430 // After more days, all pages should be expired and . |
| 347 clock()->Advance(base::TimeDelta::FromDays(30)); | 431 clock()->Advance(kRemovePageItemInterval + base::TimeDelta::FromDays(1)); |
| 348 TryClearPages(); | 432 TryClearPages(); |
| 349 EXPECT_EQ(0, test_client()->GetTotalSize()); | 433 EXPECT_EQ(0, client()->GetTotalSize()); |
| 350 EXPECT_EQ(5, total_cleared_times()); | 434 EXPECT_EQ(5, total_cleared_times()); |
| 351 EXPECT_EQ(ClearStorageResult::SUCCESS, last_clear_storage_result()); | 435 EXPECT_EQ(ClearStorageResult::SUCCESS, last_clear_storage_result()); |
| 436 // Number of removed pages should be the ones expired above and all the pages |
| 437 // initially created for last_n namespace. |
| 438 EXPECT_EQ(expired_page_count + 101, |
| 439 static_cast<int>(client()->GetRemovedPages().size())); |
| 352 } | 440 } |
| 353 | 441 |
| 354 } // namespace offline_pages | 442 } // namespace offline_pages |
| OLD | NEW |