Index: components/offline_pages/core/prefetch/prefetch_dispatcher_impl_unittest.cc |
diff --git a/components/offline_pages/core/prefetch/prefetch_dispatcher_impl_unittest.cc b/components/offline_pages/core/prefetch/prefetch_dispatcher_impl_unittest.cc |
index 846f697919381afa39cbdd7671150446390f39b1..52fbe8e8a3e30e8306023b6f2f0cafefa29c2cc1 100644 |
--- a/components/offline_pages/core/prefetch/prefetch_dispatcher_impl_unittest.cc |
+++ b/components/offline_pages/core/prefetch/prefetch_dispatcher_impl_unittest.cc |
@@ -12,9 +12,10 @@ |
#include "components/offline_pages/core/client_namespace_constants.h" |
#include "components/offline_pages/core/offline_event_logger.h" |
#include "components/offline_pages/core/offline_page_feature.h" |
-#include "components/offline_pages/core/prefetch/prefetch_in_memory_store.h" |
#include "components/offline_pages/core/prefetch/prefetch_service.h" |
+#include "components/offline_pages/core/prefetch/store/prefetch_store_command_factory.h" |
#include "testing/gtest/include/gtest/gtest.h" |
+#include "url/gurl.h" |
namespace offline_pages { |
@@ -31,8 +32,72 @@ class TestScopedBackgroundTask |
bool needs_reschedule_called = false; |
}; |
+namespace { |
+class TestPrefetchStoreCommandFactory; |
+ |
+class TestAddUrlsStoreCommand : public AddUrlsStoreCommand { |
+ public: |
+ TestAddUrlsStoreCommand(TestPrefetchStoreCommandFactory* factory) |
+ : factory_(factory){}; |
+ ~TestAddUrlsStoreCommand() override{}; |
+ void Execute(const std::string& name_space, |
+ const std::vector<PrefetchURL>& prefetch_urls, |
+ UrlsAddedCallback callback) override; |
+ |
+ private: |
+ TestPrefetchStoreCommandFactory* factory_; |
+}; |
+ |
+class TestCleanupZombiesStoreCommand : public CleanupZombiesStoreCommand { |
+ public: |
+ TestCleanupZombiesStoreCommand(TestPrefetchStoreCommandFactory* factory) |
+ : factory_(factory){}; |
+ ~TestCleanupZombiesStoreCommand() override{}; |
+ void Execute(const std::string& name_space, |
+ const std::vector<GURL>& urls_to_keep, |
+ base::OnceCallback<void()> callback) override; |
+ |
+ private: |
+ TestPrefetchStoreCommandFactory* factory_; |
+}; |
+ |
+class TestPrefetchStoreCommandFactory : public PrefetchStoreCommandFactory { |
+ public: |
+ std::unique_ptr<AddUrlsStoreCommand> createAddUrls() override { |
+ return base::MakeUnique<TestAddUrlsStoreCommand>(this); |
+ } |
+ |
+ std::unique_ptr<CleanupZombiesStoreCommand> createCleanupZombies() override { |
+ return base::MakeUnique<TestCleanupZombiesStoreCommand>(this); |
+ } |
+ |
+ int add_url_execute_calls_ = 0; |
+ bool add_url_succeeds = true; |
+ int zombies_execute_calls_ = 0; |
+}; |
+ |
+void TestAddUrlsStoreCommand::Execute( |
+ const std::string& name_space, |
+ const std::vector<PrefetchURL>& prefetch_urls, |
+ UrlsAddedCallback callback) { |
+ ++factory_->add_url_execute_calls_; |
+ std::move(callback).Run(factory_->add_url_succeeds); |
+} |
+ |
+void TestCleanupZombiesStoreCommand::Execute( |
+ const std::string& name_space, |
+ const std::vector<GURL>& urls_to_keep, |
+ base::OnceCallback<void()> callback) { |
+ ++factory_->zombies_execute_calls_; |
+ std::move(callback).Run(); |
+} |
+ |
+} // namespace |
+ |
class PrefetchDispatcherTest : public testing::Test, public PrefetchService { |
public: |
+ const std::string TEST_NAMESPACE = "TestPrefetchClientNamespace"; |
+ |
PrefetchDispatcherTest(); |
// Test implementation. |
@@ -44,7 +109,7 @@ class PrefetchDispatcherTest : public testing::Test, public PrefetchService { |
OfflineMetricsCollector* GetOfflineMetricsCollector() override; |
PrefetchDispatcher* GetPrefetchDispatcher() override; |
PrefetchGCMHandler* GetPrefetchGCMHandler() override; |
- PrefetchStore* GetPrefetchStore() override; |
+ PrefetchStoreCommandFactory* GetPrefetchStoreCommandFactory() override; |
SuggestedArticlesObserver* GetSuggestedArticlesObserver() override; |
// KeyedService implementation. |
@@ -57,13 +122,14 @@ class PrefetchDispatcherTest : public testing::Test, public PrefetchService { |
TaskQueue* dispatcher_task_queue() { return &dispatcher_impl_->task_queue_; } |
+ protected: |
+ std::unique_ptr<TestPrefetchStoreCommandFactory> test_command_factory_; |
+ std::vector<PrefetchURL> test_urls_; |
+ |
private: |
+ std::unique_ptr<PrefetchDispatcherImpl> dispatcher_impl_; |
OfflineEventLogger logger_; |
base::test::ScopedFeatureList feature_list_; |
- |
- std::unique_ptr<PrefetchInMemoryStore> in_memory_store_; |
- std::unique_ptr<PrefetchDispatcherImpl> dispatcher_impl_; |
- |
scoped_refptr<base::TestSimpleTaskRunner> task_runner_; |
base::ThreadTaskRunnerHandle task_runner_handle_; |
}; |
@@ -77,9 +143,13 @@ PrefetchDispatcherTest::PrefetchDispatcherTest() |
void PrefetchDispatcherTest::SetUp() { |
ASSERT_EQ(base::ThreadTaskRunnerHandle::Get(), task_runner_); |
ASSERT_FALSE(task_runner_->HasPendingTask()); |
- in_memory_store_ = base::MakeUnique<PrefetchInMemoryStore>(); |
+ test_command_factory_ = base::MakeUnique<TestPrefetchStoreCommandFactory>(); |
dispatcher_impl_ = base::MakeUnique<PrefetchDispatcherImpl>(); |
dispatcher_impl_->SetService(this); |
+ |
+ ASSERT_TRUE(test_urls_.empty()); |
+ test_urls_.push_back({"1", GURL("http://testurl.com/foo")}); |
+ test_urls_.push_back({"2", GURL("https://testurl.com/bar")}); |
} |
void PrefetchDispatcherTest::TearDown() { |
@@ -104,8 +174,9 @@ PrefetchGCMHandler* PrefetchDispatcherTest::GetPrefetchGCMHandler() { |
return nullptr; |
} |
-PrefetchStore* PrefetchDispatcherTest::GetPrefetchStore() { |
- return in_memory_store_.get(); |
+PrefetchStoreCommandFactory* |
+PrefetchDispatcherTest::GetPrefetchStoreCommandFactory() { |
+ return test_command_factory_.get(); |
} |
SuggestedArticlesObserver* |
@@ -119,7 +190,7 @@ void PrefetchDispatcherTest::PumpLoop() { |
} |
TEST_F(PrefetchDispatcherTest, DispatcherDoesNotCrash) { |
- GetPrefetchDispatcher()->AddCandidatePrefetchURLs(std::vector<PrefetchURL>()); |
+ GetPrefetchDispatcher()->AddCandidatePrefetchURLs(TEST_NAMESPACE, test_urls_); |
GetPrefetchDispatcher()->RemoveAllUnprocessedPrefetchURLs( |
kSuggestedArticlesNamespace); |
GetPrefetchDispatcher()->RemovePrefetchURLsByClientId( |
@@ -127,12 +198,26 @@ TEST_F(PrefetchDispatcherTest, DispatcherDoesNotCrash) { |
} |
TEST_F(PrefetchDispatcherTest, AddCandidatePrefetchURLsTask) { |
- GetPrefetchDispatcher()->AddCandidatePrefetchURLs(std::vector<PrefetchURL>()); |
+ GetPrefetchDispatcher()->AddCandidatePrefetchURLs(TEST_NAMESPACE, test_urls_); |
+ EXPECT_TRUE(dispatcher_task_queue()->HasPendingTasks()); |
+ EXPECT_TRUE(dispatcher_task_queue()->HasRunningTask()); |
+ PumpLoop(); |
+ EXPECT_FALSE(dispatcher_task_queue()->HasPendingTasks()); |
+ EXPECT_FALSE(dispatcher_task_queue()->HasRunningTask()); |
+ EXPECT_EQ(1, test_command_factory_->add_url_execute_calls_); |
+ EXPECT_EQ(1, test_command_factory_->zombies_execute_calls_); |
+} |
+ |
+TEST_F(PrefetchDispatcherTest, AddCandidatePrefetchURLsTaskFailsAdding) { |
+ test_command_factory_->add_url_succeeds = false; |
+ GetPrefetchDispatcher()->AddCandidatePrefetchURLs(TEST_NAMESPACE, test_urls_); |
EXPECT_TRUE(dispatcher_task_queue()->HasPendingTasks()); |
EXPECT_TRUE(dispatcher_task_queue()->HasRunningTask()); |
PumpLoop(); |
EXPECT_FALSE(dispatcher_task_queue()->HasPendingTasks()); |
EXPECT_FALSE(dispatcher_task_queue()->HasRunningTask()); |
+ EXPECT_EQ(1, test_command_factory_->add_url_execute_calls_); |
+ EXPECT_EQ(0, test_command_factory_->zombies_execute_calls_); |
} |
TEST_F(PrefetchDispatcherTest, DispatcherDoesNothingIfFeatureNotEnabled) { |
@@ -140,10 +225,9 @@ TEST_F(PrefetchDispatcherTest, DispatcherDoesNothingIfFeatureNotEnabled) { |
disabled_feature_list.InitAndDisableFeature(kPrefetchingOfflinePagesFeature); |
// Don't add a task for new prefetch URLs. |
- ClientId client_id("namespace", "id"); |
- PrefetchURL prefetch_url(client_id, GURL("https://www.chromium.org")); |
+ PrefetchURL prefetch_url("id", GURL("https://www.chromium.org")); |
GetPrefetchDispatcher()->AddCandidatePrefetchURLs( |
- std::vector<PrefetchURL>(1, prefetch_url)); |
+ TEST_NAMESPACE, std::vector<PrefetchURL>(1, prefetch_url)); |
EXPECT_FALSE(dispatcher_task_queue()->HasRunningTask()); |
// Do nothing with a new background task. |