| Index: components/dom_distiller/core/task_tracker_unittest.cc
|
| diff --git a/components/dom_distiller/core/task_tracker_unittest.cc b/components/dom_distiller/core/task_tracker_unittest.cc
|
| index c6eef4be519782dfc74428bac361d5c1e2a83e75..ee90021b3ed2f52532744c9f61f651a8fb472914 100644
|
| --- a/components/dom_distiller/core/task_tracker_unittest.cc
|
| +++ b/components/dom_distiller/core/task_tracker_unittest.cc
|
| @@ -7,6 +7,7 @@
|
| #include "base/run_loop.h"
|
| #include "components/dom_distiller/core/article_distillation_update.h"
|
| #include "components/dom_distiller/core/article_entry.h"
|
| +#include "components/dom_distiller/core/distilled_content_store.h"
|
| #include "components/dom_distiller/core/fake_distiller.h"
|
| #include "testing/gtest/include/gtest/gtest.h"
|
|
|
| @@ -25,6 +26,16 @@ class FakeViewRequestDelegate : public ViewRequestDelegate {
|
| void(ArticleDistillationUpdate article_update));
|
| };
|
|
|
| +class MockContentStore : public DistilledContentStore {
|
| + public:
|
| + MOCK_CONST_METHOD2(LoadContent,
|
| + void(const ArticleEntry& entry, LoadCallback callback));
|
| + MOCK_METHOD3(SaveContent,
|
| + void(const ArticleEntry& entry,
|
| + const DistilledArticleProto& proto,
|
| + SaveCallback callback));
|
| +};
|
| +
|
| class TestCancelCallback {
|
| public:
|
| TestCancelCallback() : cancelled_(false) {}
|
| @@ -73,7 +84,8 @@ class DomDistillerTaskTrackerTest : public testing::Test {
|
| TEST_F(DomDistillerTaskTrackerTest, TestHasEntryId) {
|
| MockDistillerFactory distiller_factory;
|
| TestCancelCallback cancel_callback;
|
| - TaskTracker task_tracker(GetDefaultEntry(), cancel_callback.GetCallback());
|
| + TaskTracker task_tracker(
|
| + GetDefaultEntry(), cancel_callback.GetCallback(), NULL);
|
| EXPECT_TRUE(task_tracker.HasEntryId(entry_id_));
|
| EXPECT_FALSE(task_tracker.HasEntryId("other_id"));
|
| }
|
| @@ -81,7 +93,8 @@ TEST_F(DomDistillerTaskTrackerTest, TestHasEntryId) {
|
| TEST_F(DomDistillerTaskTrackerTest, TestHasUrl) {
|
| MockDistillerFactory distiller_factory;
|
| TestCancelCallback cancel_callback;
|
| - TaskTracker task_tracker(GetDefaultEntry(), cancel_callback.GetCallback());
|
| + TaskTracker task_tracker(
|
| + GetDefaultEntry(), cancel_callback.GetCallback(), NULL);
|
| EXPECT_TRUE(task_tracker.HasUrl(page_0_url_));
|
| EXPECT_TRUE(task_tracker.HasUrl(page_1_url_));
|
| EXPECT_FALSE(task_tracker.HasUrl(GURL("http://other.url/")));
|
| @@ -90,7 +103,8 @@ TEST_F(DomDistillerTaskTrackerTest, TestHasUrl) {
|
| TEST_F(DomDistillerTaskTrackerTest, TestViewerCancelled) {
|
| MockDistillerFactory distiller_factory;
|
| TestCancelCallback cancel_callback;
|
| - TaskTracker task_tracker(GetDefaultEntry(), cancel_callback.GetCallback());
|
| + TaskTracker task_tracker(
|
| + GetDefaultEntry(), cancel_callback.GetCallback(), NULL);
|
|
|
| FakeViewRequestDelegate viewer_delegate;
|
| FakeViewRequestDelegate viewer_delegate2;
|
| @@ -107,7 +121,8 @@ TEST_F(DomDistillerTaskTrackerTest, TestViewerCancelled) {
|
| TEST_F(DomDistillerTaskTrackerTest, TestViewerCancelledWithSaveRequest) {
|
| MockDistillerFactory distiller_factory;
|
| TestCancelCallback cancel_callback;
|
| - TaskTracker task_tracker(GetDefaultEntry(), cancel_callback.GetCallback());
|
| + TaskTracker task_tracker(
|
| + GetDefaultEntry(), cancel_callback.GetCallback(), NULL);
|
|
|
| FakeViewRequestDelegate viewer_delegate;
|
| scoped_ptr<ViewerHandle> handle(task_tracker.AddViewer(&viewer_delegate));
|
| @@ -128,7 +143,8 @@ TEST_F(DomDistillerTaskTrackerTest, TestViewerNotifiedOnDistillationComplete) {
|
| EXPECT_CALL(distiller_factory, CreateDistillerImpl())
|
| .WillOnce(Return(distiller));
|
| TestCancelCallback cancel_callback;
|
| - TaskTracker task_tracker(GetDefaultEntry(), cancel_callback.GetCallback());
|
| + TaskTracker task_tracker(
|
| + GetDefaultEntry(), cancel_callback.GetCallback(), NULL);
|
|
|
| FakeViewRequestDelegate viewer_delegate;
|
| scoped_ptr<ViewerHandle> handle(task_tracker.AddViewer(&viewer_delegate));
|
| @@ -149,7 +165,8 @@ TEST_F(DomDistillerTaskTrackerTest,
|
| EXPECT_CALL(distiller_factory, CreateDistillerImpl())
|
| .WillOnce(Return(distiller));
|
| TestCancelCallback cancel_callback;
|
| - TaskTracker task_tracker(GetDefaultEntry(), cancel_callback.GetCallback());
|
| + TaskTracker task_tracker(
|
| + GetDefaultEntry(), cancel_callback.GetCallback(), NULL);
|
|
|
| MockSaveCallback save_callback;
|
| task_tracker.AddSaveCallback(
|
| @@ -164,5 +181,192 @@ TEST_F(DomDistillerTaskTrackerTest,
|
| EXPECT_TRUE(cancel_callback.Cancelled());
|
| }
|
|
|
| +DistilledArticleProto CreateDistilledArticleForEntry(
|
| + const ArticleEntry& entry) {
|
| + DistilledArticleProto article;
|
| + for (int i = 0; i < entry.pages_size(); ++i) {
|
| + DistilledPageProto* page = article.add_pages();
|
| + page->set_url(entry.pages(i).url());
|
| + page->set_html("<div>" + entry.pages(i).url() + "</div>");
|
| + }
|
| + return article;
|
| +}
|
| +
|
| +TEST_F(DomDistillerTaskTrackerTest, TestBlobFetcher) {
|
| + ArticleEntry entry_with_blob = GetDefaultEntry();
|
| + DistilledArticleProto stored_distilled_article =
|
| + CreateDistilledArticleForEntry(entry_with_blob);
|
| + InMemoryContentStore content_store;
|
| + content_store.InjectContent(entry_with_blob, stored_distilled_article);
|
| + TestCancelCallback cancel_callback;
|
| +
|
| + TaskTracker task_tracker(
|
| + entry_with_blob, cancel_callback.GetCallback(), &content_store);
|
| +
|
| + FakeViewRequestDelegate viewer_delegate;
|
| + scoped_ptr<ViewerHandle> handle(task_tracker.AddViewer(&viewer_delegate));
|
| + base::RunLoop().RunUntilIdle();
|
| +
|
| + const DistilledArticleProto* distilled_article;
|
| +
|
| + EXPECT_CALL(viewer_delegate, OnArticleReady(_))
|
| + .WillOnce(testing::SaveArg<0>(&distilled_article));
|
| +
|
| + task_tracker.StartBlobFetcher();
|
| + base::RunLoop().RunUntilIdle();
|
| +
|
| + EXPECT_EQ(stored_distilled_article.SerializeAsString(),
|
| + distilled_article->SerializeAsString());
|
| +
|
| + EXPECT_FALSE(cancel_callback.Cancelled());
|
| +}
|
| +
|
| +TEST_F(DomDistillerTaskTrackerTest, TestBlobFetcherFinishesFirst) {
|
| + MockDistillerFactory distiller_factory;
|
| + FakeDistiller* distiller = new FakeDistiller(false);
|
| + EXPECT_CALL(distiller_factory, CreateDistillerImpl())
|
| + .WillOnce(Return(distiller));
|
| +
|
| + ArticleEntry entry_with_blob = GetDefaultEntry();
|
| + DistilledArticleProto stored_distilled_article =
|
| + CreateDistilledArticleForEntry(entry_with_blob);
|
| + InMemoryContentStore content_store;
|
| + content_store.InjectContent(entry_with_blob, stored_distilled_article);
|
| + TestCancelCallback cancel_callback;
|
| + TaskTracker task_tracker(
|
| + entry_with_blob, cancel_callback.GetCallback(), &content_store);
|
| +
|
| + FakeViewRequestDelegate viewer_delegate;
|
| + scoped_ptr<ViewerHandle> handle(task_tracker.AddViewer(&viewer_delegate));
|
| + base::RunLoop().RunUntilIdle();
|
| +
|
| + DistilledArticleProto distilled_article;
|
| +
|
| + EXPECT_CALL(viewer_delegate, OnArticleReady(_))
|
| + .WillOnce(testing::SaveArgPointee<0>(&distilled_article));
|
| + bool distiller_destroyed = false;
|
| + EXPECT_CALL(*distiller, Die())
|
| + .WillOnce(testing::Assign(&distiller_destroyed, true));
|
| +
|
| + task_tracker.StartDistiller(&distiller_factory);
|
| + task_tracker.StartBlobFetcher();
|
| + base::RunLoop().RunUntilIdle();
|
| +
|
| + testing::Mock::VerifyAndClearExpectations(&viewer_delegate);
|
| + EXPECT_EQ(stored_distilled_article.SerializeAsString(),
|
| + distilled_article.SerializeAsString());
|
| +
|
| + EXPECT_TRUE(distiller_destroyed);
|
| + EXPECT_FALSE(cancel_callback.Cancelled());
|
| + base::RunLoop().RunUntilIdle();
|
| +}
|
| +
|
| +TEST_F(DomDistillerTaskTrackerTest, TestBlobFetcherWithoutBlob) {
|
| + MockDistillerFactory distiller_factory;
|
| + FakeDistiller* distiller = new FakeDistiller(false);
|
| + EXPECT_CALL(distiller_factory, CreateDistillerImpl())
|
| + .WillOnce(Return(distiller));
|
| +
|
| + ArticleEntry entry(GetDefaultEntry());
|
| + InMemoryContentStore content_store;
|
| + scoped_ptr<DistilledArticleProto> distilled_article(
|
| + new DistilledArticleProto(CreateDistilledArticleForEntry(entry)));
|
| +
|
| + TestCancelCallback cancel_callback;
|
| + TaskTracker task_tracker(
|
| + GetDefaultEntry(), cancel_callback.GetCallback(), &content_store);
|
| +
|
| + FakeViewRequestDelegate viewer_delegate;
|
| + scoped_ptr<ViewerHandle> handle(task_tracker.AddViewer(&viewer_delegate));
|
| + base::RunLoop().RunUntilIdle();
|
| +
|
| + task_tracker.StartBlobFetcher();
|
| + task_tracker.StartDistiller(&distiller_factory);
|
| +
|
| + // OnArticleReady shouldn't be called until distillation finishes (i.e. the
|
| + // blob fetcher shouldn't return distilled content).
|
| + EXPECT_CALL(viewer_delegate, OnArticleReady(_)).Times(0);
|
| + base::RunLoop().RunUntilIdle();
|
| +
|
| + EXPECT_CALL(viewer_delegate, OnArticleReady(_));
|
| + distiller->RunDistillerCallback(distilled_article.Pass());
|
| + base::RunLoop().RunUntilIdle();
|
| +
|
| + EXPECT_FALSE(cancel_callback.Cancelled());
|
| +}
|
| +
|
| +TEST_F(DomDistillerTaskTrackerTest, TestDistillerFailsFirst) {
|
| + MockDistillerFactory distiller_factory;
|
| + FakeDistiller* distiller = new FakeDistiller(false);
|
| + EXPECT_CALL(distiller_factory, CreateDistillerImpl())
|
| + .WillOnce(Return(distiller));
|
| +
|
| + ArticleEntry entry(GetDefaultEntry());
|
| + MockContentStore content_store;
|
| +
|
| + TestCancelCallback cancel_callback;
|
| + TaskTracker task_tracker(
|
| + GetDefaultEntry(), cancel_callback.GetCallback(), &content_store);
|
| +
|
| + FakeViewRequestDelegate viewer_delegate;
|
| + scoped_ptr<ViewerHandle> handle(task_tracker.AddViewer(&viewer_delegate));
|
| +
|
| + DistilledContentStore::LoadCallback content_store_load_callback;
|
| + EXPECT_CALL(content_store, LoadContent(_, _)).WillOnce(
|
| + testing::SaveArg<1>(&content_store_load_callback));
|
| +
|
| + task_tracker.StartDistiller(&distiller_factory);
|
| + task_tracker.StartBlobFetcher();
|
| +
|
| + EXPECT_CALL(viewer_delegate, OnArticleReady(_)).Times(0);
|
| + distiller->RunDistillerCallback(
|
| + scoped_ptr<DistilledArticleProto>(new DistilledArticleProto));
|
| + base::RunLoop().RunUntilIdle();
|
| +
|
| + EXPECT_CALL(viewer_delegate, OnArticleReady(_));
|
| + content_store_load_callback.Run(
|
| + true,
|
| + scoped_ptr<DistilledArticleProto>(
|
| + new DistilledArticleProto(CreateDistilledArticleForEntry(entry))));
|
| + base::RunLoop().RunUntilIdle();
|
| +
|
| + EXPECT_FALSE(cancel_callback.Cancelled());
|
| +}
|
| +
|
| +TEST_F(DomDistillerTaskTrackerTest, ContentIsSaved) {
|
| + MockDistillerFactory distiller_factory;
|
| + FakeDistiller* distiller = new FakeDistiller(false);
|
| + EXPECT_CALL(distiller_factory, CreateDistillerImpl())
|
| + .WillOnce(Return(distiller));
|
| +
|
| + ArticleEntry entry(GetDefaultEntry());
|
| + DistilledArticleProto distilled_article =
|
| + CreateDistilledArticleForEntry(entry);
|
| +
|
| + MockContentStore content_store;
|
| + TestCancelCallback cancel_callback;
|
| + TaskTracker task_tracker(
|
| + GetDefaultEntry(), cancel_callback.GetCallback(), &content_store);
|
| +
|
| + FakeViewRequestDelegate viewer_delegate;
|
| + scoped_ptr<ViewerHandle> handle(task_tracker.AddViewer(&viewer_delegate));
|
| +
|
| + DistilledArticleProto stored_distilled_article;
|
| + DistilledContentStore::LoadCallback content_store_load_callback;
|
| + EXPECT_CALL(content_store, SaveContent(_, _, _))
|
| + .WillOnce(testing::SaveArg<1>(&stored_distilled_article));
|
| +
|
| + task_tracker.StartDistiller(&distiller_factory);
|
| +
|
| + EXPECT_CALL(viewer_delegate, OnArticleReady(_));
|
| + distiller->RunDistillerCallback(scoped_ptr<DistilledArticleProto>(
|
| + new DistilledArticleProto(distilled_article)));
|
| + base::RunLoop().RunUntilIdle();
|
| +
|
| + ASSERT_EQ(stored_distilled_article.SerializeAsString(),
|
| + distilled_article.SerializeAsString());
|
| + EXPECT_FALSE(cancel_callback.Cancelled());
|
| +}
|
| +
|
| } // namespace test
|
| } // namespace dom_distiller
|
|
|