task_tracker_unittest.cc revision a1401311d1ab56c4ed0a474bd38c108f75cb0cd9
12a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Copyright 2013 The Chromium Authors. All rights reserved.
25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file.
45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "components/dom_distiller/core/task_tracker.h"
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/run_loop.h"
85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "components/dom_distiller/core/article_distillation_update.h"
95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "components/dom_distiller/core/article_entry.h"
105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "components/dom_distiller/core/fake_distiller.h"
112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "testing/gtest/include/gtest/gtest.h"
12116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using testing::Return;
145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using testing::_;
155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace dom_distiller {
175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace test {
185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class FakeViewRequestDelegate : public ViewRequestDelegate {
205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual ~FakeViewRequestDelegate() {}
225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  MOCK_METHOD1(OnArticleReady,
235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)               void(const DistilledArticleProto* article_proto));
242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  MOCK_METHOD1(OnArticleUpdated,
255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)               void(ArticleDistillationUpdate article_update));
265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class TestCancelCallback {
295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
30116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  TestCancelCallback() : cancelled_(false) {}
31116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  TaskTracker::CancelCallback GetCallback() {
32116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    return base::Bind(&TestCancelCallback::Cancel, base::Unretained(this));
33116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  }
34116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  void Cancel(TaskTracker*) { cancelled_ = true; }
355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool Cancelled() { return cancelled_; }
365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private:
385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool cancelled_;
395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
40
41class MockSaveCallback {
42 public:
43  MOCK_METHOD3(Save,
44               void(const ArticleEntry&, const DistilledArticleProto*, bool));
45};
46
47class DomDistillerTaskTrackerTest : public testing::Test {
48 public:
49  virtual void SetUp() OVERRIDE {
50    message_loop_.reset(new base::MessageLoop());
51    entry_id_ = "id0";
52    page_0_url_ = GURL("http://www.example.com/1");
53    page_1_url_ = GURL("http://www.example.com/2");
54  }
55
56  ArticleEntry GetDefaultEntry() {
57    ArticleEntry entry;
58    entry.set_entry_id(entry_id_);
59    ArticleEntryPage* page0 = entry.add_pages();
60    ArticleEntryPage* page1 = entry.add_pages();
61    page0->set_url(page_0_url_.spec());
62    page1->set_url(page_1_url_.spec());
63    return entry;
64  }
65
66 protected:
67  scoped_ptr<base::MessageLoop> message_loop_;
68  std::string entry_id_;
69  GURL page_0_url_;
70  GURL page_1_url_;
71};
72
73TEST_F(DomDistillerTaskTrackerTest, TestHasEntryId) {
74  MockDistillerFactory distiller_factory;
75  TestCancelCallback cancel_callback;
76  TaskTracker task_tracker(GetDefaultEntry(), cancel_callback.GetCallback());
77  EXPECT_TRUE(task_tracker.HasEntryId(entry_id_));
78  EXPECT_FALSE(task_tracker.HasEntryId("other_id"));
79}
80
81TEST_F(DomDistillerTaskTrackerTest, TestHasUrl) {
82  MockDistillerFactory distiller_factory;
83  TestCancelCallback cancel_callback;
84  TaskTracker task_tracker(GetDefaultEntry(), cancel_callback.GetCallback());
85  EXPECT_TRUE(task_tracker.HasUrl(page_0_url_));
86  EXPECT_TRUE(task_tracker.HasUrl(page_1_url_));
87  EXPECT_FALSE(task_tracker.HasUrl(GURL("http://other.url/")));
88}
89
90TEST_F(DomDistillerTaskTrackerTest, TestViewerCancelled) {
91  MockDistillerFactory distiller_factory;
92  TestCancelCallback cancel_callback;
93  TaskTracker task_tracker(GetDefaultEntry(), cancel_callback.GetCallback());
94
95  FakeViewRequestDelegate viewer_delegate;
96  FakeViewRequestDelegate viewer_delegate2;
97  scoped_ptr<ViewerHandle> handle(task_tracker.AddViewer(&viewer_delegate));
98  scoped_ptr<ViewerHandle> handle2(task_tracker.AddViewer(&viewer_delegate2));
99
100  EXPECT_FALSE(cancel_callback.Cancelled());
101  handle.reset();
102  EXPECT_FALSE(cancel_callback.Cancelled());
103  handle2.reset();
104  EXPECT_TRUE(cancel_callback.Cancelled());
105}
106
107TEST_F(DomDistillerTaskTrackerTest, TestViewerCancelledWithSaveRequest) {
108  MockDistillerFactory distiller_factory;
109  TestCancelCallback cancel_callback;
110  TaskTracker task_tracker(GetDefaultEntry(), cancel_callback.GetCallback());
111
112  FakeViewRequestDelegate viewer_delegate;
113  scoped_ptr<ViewerHandle> handle(task_tracker.AddViewer(&viewer_delegate));
114  EXPECT_FALSE(cancel_callback.Cancelled());
115
116  MockSaveCallback save_callback;
117  task_tracker.AddSaveCallback(
118      base::Bind(&MockSaveCallback::Save, base::Unretained(&save_callback)));
119  handle.reset();
120
121  // Since there is a pending save request, the task shouldn't be cancelled.
122  EXPECT_FALSE(cancel_callback.Cancelled());
123}
124
125TEST_F(DomDistillerTaskTrackerTest, TestViewerNotifiedOnDistillationComplete) {
126  MockDistillerFactory distiller_factory;
127  FakeDistiller* distiller = new FakeDistiller(true);
128  EXPECT_CALL(distiller_factory, CreateDistillerImpl())
129      .WillOnce(Return(distiller));
130  TestCancelCallback cancel_callback;
131  TaskTracker task_tracker(GetDefaultEntry(), cancel_callback.GetCallback());
132
133  FakeViewRequestDelegate viewer_delegate;
134  scoped_ptr<ViewerHandle> handle(task_tracker.AddViewer(&viewer_delegate));
135  base::RunLoop().RunUntilIdle();
136
137  EXPECT_CALL(viewer_delegate, OnArticleReady(_));
138
139  task_tracker.StartDistiller(&distiller_factory);
140  base::RunLoop().RunUntilIdle();
141
142  EXPECT_FALSE(cancel_callback.Cancelled());
143}
144
145TEST_F(DomDistillerTaskTrackerTest,
146       TestSaveCallbackCalledOnDistillationComplete) {
147  MockDistillerFactory distiller_factory;
148  FakeDistiller* distiller = new FakeDistiller(true);
149  EXPECT_CALL(distiller_factory, CreateDistillerImpl())
150      .WillOnce(Return(distiller));
151  TestCancelCallback cancel_callback;
152  TaskTracker task_tracker(GetDefaultEntry(), cancel_callback.GetCallback());
153
154  MockSaveCallback save_callback;
155  task_tracker.AddSaveCallback(
156      base::Bind(&MockSaveCallback::Save, base::Unretained(&save_callback)));
157  base::RunLoop().RunUntilIdle();
158
159  EXPECT_CALL(save_callback, Save(_, _, _));
160
161  task_tracker.StartDistiller(&distiller_factory);
162  base::RunLoop().RunUntilIdle();
163
164  EXPECT_TRUE(cancel_callback.Cancelled());
165}
166
167}  // namespace test
168}  // namespace dom_distiller
169