1 // Copyright 2013 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
5 #include "components/dom_distiller/core/task_tracker.h"
7 #include "base/run_loop.h"
8 #include "components/dom_distiller/core/article_entry.h"
9 #include "components/dom_distiller/core/fake_distiller.h"
10 #include "testing/gtest/include/gtest/gtest.h"
12 using testing::Return;
15 namespace dom_distiller {
18 class FakeViewRequestDelegate : public ViewRequestDelegate {
20 virtual ~FakeViewRequestDelegate() {}
21 MOCK_METHOD1(OnArticleReady,
22 void(const DistilledArticleProto* article_proto));
25 class TestCancelCallback {
27 TestCancelCallback() : cancelled_(false) {}
28 TaskTracker::CancelCallback GetCallback() {
29 return base::Bind(&TestCancelCallback::Cancel, base::Unretained(this));
31 void Cancel(TaskTracker*) { cancelled_ = true; }
32 bool Cancelled() { return cancelled_; }
38 class MockSaveCallback {
41 void(const ArticleEntry&, const DistilledArticleProto*, bool));
44 class DomDistillerTaskTrackerTest : public testing::Test {
46 virtual void SetUp() OVERRIDE {
47 message_loop_.reset(new base::MessageLoop());
49 page_0_url_ = GURL("http://www.example.com/1");
50 page_1_url_ = GURL("http://www.example.com/2");
53 ArticleEntry GetDefaultEntry() {
55 entry.set_entry_id(entry_id_);
56 ArticleEntryPage* page0 = entry.add_pages();
57 ArticleEntryPage* page1 = entry.add_pages();
58 page0->set_url(page_0_url_.spec());
59 page1->set_url(page_1_url_.spec());
64 scoped_ptr<base::MessageLoop> message_loop_;
65 std::string entry_id_;
70 TEST_F(DomDistillerTaskTrackerTest, TestHasEntryId) {
71 MockDistillerFactory distiller_factory;
72 TestCancelCallback cancel_callback;
73 TaskTracker task_tracker(GetDefaultEntry(), cancel_callback.GetCallback());
74 EXPECT_TRUE(task_tracker.HasEntryId(entry_id_));
75 EXPECT_FALSE(task_tracker.HasEntryId("other_id"));
78 TEST_F(DomDistillerTaskTrackerTest, TestHasUrl) {
79 MockDistillerFactory distiller_factory;
80 TestCancelCallback cancel_callback;
81 TaskTracker task_tracker(GetDefaultEntry(), cancel_callback.GetCallback());
82 EXPECT_TRUE(task_tracker.HasUrl(page_0_url_));
83 EXPECT_TRUE(task_tracker.HasUrl(page_1_url_));
84 EXPECT_FALSE(task_tracker.HasUrl(GURL("http://other.url/")));
87 TEST_F(DomDistillerTaskTrackerTest, TestViewerCancelled) {
88 MockDistillerFactory distiller_factory;
89 TestCancelCallback cancel_callback;
90 TaskTracker task_tracker(GetDefaultEntry(), cancel_callback.GetCallback());
92 FakeViewRequestDelegate viewer_delegate;
93 FakeViewRequestDelegate viewer_delegate2;
94 scoped_ptr<ViewerHandle> handle(task_tracker.AddViewer(&viewer_delegate));
95 scoped_ptr<ViewerHandle> handle2(task_tracker.AddViewer(&viewer_delegate2));
97 EXPECT_FALSE(cancel_callback.Cancelled());
99 EXPECT_FALSE(cancel_callback.Cancelled());
101 EXPECT_TRUE(cancel_callback.Cancelled());
104 TEST_F(DomDistillerTaskTrackerTest, TestViewerCancelledWithSaveRequest) {
105 MockDistillerFactory distiller_factory;
106 TestCancelCallback cancel_callback;
107 TaskTracker task_tracker(GetDefaultEntry(), cancel_callback.GetCallback());
109 FakeViewRequestDelegate viewer_delegate;
110 scoped_ptr<ViewerHandle> handle(task_tracker.AddViewer(&viewer_delegate));
111 EXPECT_FALSE(cancel_callback.Cancelled());
113 MockSaveCallback save_callback;
114 task_tracker.AddSaveCallback(
115 base::Bind(&MockSaveCallback::Save, base::Unretained(&save_callback)));
118 // Since there is a pending save request, the task shouldn't be cancelled.
119 EXPECT_FALSE(cancel_callback.Cancelled());
122 TEST_F(DomDistillerTaskTrackerTest, TestViewerNotifiedOnDistillationComplete) {
123 MockDistillerFactory distiller_factory;
124 FakeDistiller* distiller = new FakeDistiller(true);
125 EXPECT_CALL(distiller_factory, CreateDistillerImpl())
126 .WillOnce(Return(distiller));
127 TestCancelCallback cancel_callback;
128 TaskTracker task_tracker(GetDefaultEntry(), cancel_callback.GetCallback());
130 FakeViewRequestDelegate viewer_delegate;
131 scoped_ptr<ViewerHandle> handle(task_tracker.AddViewer(&viewer_delegate));
132 base::RunLoop().RunUntilIdle();
134 EXPECT_CALL(viewer_delegate, OnArticleReady(_));
136 task_tracker.StartDistiller(&distiller_factory);
137 base::RunLoop().RunUntilIdle();
139 EXPECT_FALSE(cancel_callback.Cancelled());
142 TEST_F(DomDistillerTaskTrackerTest,
143 TestSaveCallbackCalledOnDistillationComplete) {
144 MockDistillerFactory distiller_factory;
145 FakeDistiller* distiller = new FakeDistiller(true);
146 EXPECT_CALL(distiller_factory, CreateDistillerImpl())
147 .WillOnce(Return(distiller));
148 TestCancelCallback cancel_callback;
149 TaskTracker task_tracker(GetDefaultEntry(), cancel_callback.GetCallback());
151 MockSaveCallback save_callback;
152 task_tracker.AddSaveCallback(
153 base::Bind(&MockSaveCallback::Save, base::Unretained(&save_callback)));
154 base::RunLoop().RunUntilIdle();
156 EXPECT_CALL(save_callback, Save(_, _, _));
158 task_tracker.StartDistiller(&distiller_factory);
159 base::RunLoop().RunUntilIdle();
161 EXPECT_TRUE(cancel_callback.Cancelled());
165 } // namespace dom_distiller