task_tracker_unittest.cc revision f2477e01787aa58f445919b809d89e252beef54f
1f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)// Copyright 2013 The Chromium Authors. All rights reserved.
2f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
3f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)// found in the LICENSE file.
4f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
5f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include "components/dom_distiller/core/task_tracker.h"
6f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
7f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include "base/run_loop.h"
8f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include "components/dom_distiller/core/article_entry.h"
9f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include "components/dom_distiller/core/fake_distiller.h"
10f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include "testing/gtest/include/gtest/gtest.h"
11f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
12f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)using testing::Return;
13f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)using testing::_;
14f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
15f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)namespace dom_distiller {
16f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)namespace test {
17f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
18f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)class FakeViewRequestDelegate : public ViewRequestDelegate {
19f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) public:
20f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  virtual ~FakeViewRequestDelegate() {}
21f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  MOCK_METHOD1(OnArticleReady, void(DistilledPageProto* proto));
22f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)};
23f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
24f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)class TestCancelCallback {
25f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) public:
26f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  TestCancelCallback() : cancelled_(false) {}
27f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  TaskTracker::CancelCallback GetCallback() {
28f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    return base::Bind(&TestCancelCallback::Cancel, base::Unretained(this));
29f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  }
30f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  void Cancel(TaskTracker*) { cancelled_ = true; }
31f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  bool Cancelled() { return cancelled_; }
32f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
33f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) private:
34f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  bool cancelled_;
35f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)};
36f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
37f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)class MockSaveCallback {
38f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) public:
39f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  MOCK_METHOD2(Save, void(const ArticleEntry&, DistilledPageProto*));
40f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)};
41f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
42f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)class DomDistillerTaskTrackerTest : public testing::Test {
43f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) public:
44f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  virtual void SetUp() OVERRIDE {
45f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    message_loop_.reset(new base::MessageLoop());
46f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    entry_id_ = "id0";
47f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    page_0_url_ = GURL("http://www.example.com/1");
48f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    page_1_url_ = GURL("http://www.example.com/2");
49f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  }
50f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
51f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  ArticleEntry GetDefaultEntry() {
52f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    ArticleEntry entry;
53f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    entry.set_entry_id(entry_id_);
54f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    ArticleEntryPage* page0 = entry.add_pages();
55f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    ArticleEntryPage* page1 = entry.add_pages();
56f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    page0->set_url(page_0_url_.spec());
57f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    page1->set_url(page_1_url_.spec());
58f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    return entry;
59f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  }
60f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
61f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) protected:
62f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  scoped_ptr<base::MessageLoop> message_loop_;
63f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  std::string entry_id_;
64f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  GURL page_0_url_;
65f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  GURL page_1_url_;
66f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)};
67f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
68f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)TEST_F(DomDistillerTaskTrackerTest, TestHasEntryId) {
69f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  MockDistillerFactory distiller_factory;
70f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  TestCancelCallback cancel_callback;
71f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  TaskTracker task_tracker(GetDefaultEntry(), cancel_callback.GetCallback());
72f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  EXPECT_TRUE(task_tracker.HasEntryId(entry_id_));
73f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  EXPECT_FALSE(task_tracker.HasEntryId("other_id"));
74f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)}
75f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
76f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)TEST_F(DomDistillerTaskTrackerTest, TestHasUrl) {
77f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  MockDistillerFactory distiller_factory;
78f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  TestCancelCallback cancel_callback;
79f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  TaskTracker task_tracker(GetDefaultEntry(), cancel_callback.GetCallback());
80f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  EXPECT_TRUE(task_tracker.HasUrl(page_0_url_));
81f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  EXPECT_TRUE(task_tracker.HasUrl(page_1_url_));
82f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  EXPECT_FALSE(task_tracker.HasUrl(GURL("http://other.url/")));
83f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)}
84f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
85f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)TEST_F(DomDistillerTaskTrackerTest, TestViewerCancelled) {
86f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  MockDistillerFactory distiller_factory;
87f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  TestCancelCallback cancel_callback;
88f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  TaskTracker task_tracker(GetDefaultEntry(), cancel_callback.GetCallback());
89f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
90f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  FakeViewRequestDelegate viewer_delegate;
91f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  FakeViewRequestDelegate viewer_delegate2;
92f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  scoped_ptr<ViewerHandle> handle(task_tracker.AddViewer(&viewer_delegate));
93f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  scoped_ptr<ViewerHandle> handle2(task_tracker.AddViewer(&viewer_delegate2));
94f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
95f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  EXPECT_FALSE(cancel_callback.Cancelled());
96f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  handle.reset();
97f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  EXPECT_FALSE(cancel_callback.Cancelled());
98f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  handle2.reset();
99f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  EXPECT_TRUE(cancel_callback.Cancelled());
100f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)}
101f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
102f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)TEST_F(DomDistillerTaskTrackerTest, TestViewerCancelledWithSaveRequest) {
103f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  MockDistillerFactory distiller_factory;
104f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  TestCancelCallback cancel_callback;
105f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  TaskTracker task_tracker(GetDefaultEntry(), cancel_callback.GetCallback());
106f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
107f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  FakeViewRequestDelegate viewer_delegate;
108f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  scoped_ptr<ViewerHandle> handle(task_tracker.AddViewer(&viewer_delegate));
109f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  EXPECT_FALSE(cancel_callback.Cancelled());
110f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
111f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  MockSaveCallback save_callback;
112f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  task_tracker.SetSaveCallback(
113f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      base::Bind(&MockSaveCallback::Save, base::Unretained(&save_callback)));
114f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  handle.reset();
115f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
116f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  // Since there is a pending save request, the task shouldn't be cancelled.
117f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  EXPECT_FALSE(cancel_callback.Cancelled());
118f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)}
119f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
120f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)TEST_F(DomDistillerTaskTrackerTest, TestViewerNotifiedOnDistillationComplete) {
121f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  MockDistillerFactory distiller_factory;
122f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  FakeDistiller* distiller = new FakeDistiller();
123f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  EXPECT_CALL(distiller_factory, CreateDistillerImpl())
124f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      .WillOnce(Return(distiller));
125f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  TestCancelCallback cancel_callback;
126f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  TaskTracker task_tracker(GetDefaultEntry(), cancel_callback.GetCallback());
127f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
128f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  FakeViewRequestDelegate viewer_delegate;
129f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  scoped_ptr<ViewerHandle> handle(task_tracker.AddViewer(&viewer_delegate));
130f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  base::RunLoop().RunUntilIdle();
131f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
132f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  EXPECT_CALL(viewer_delegate, OnArticleReady(_));
133f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
134f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  task_tracker.StartDistiller(&distiller_factory);
135f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  distiller->RunDistillerCallback(make_scoped_ptr(new DistilledPageProto));
136f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  base::RunLoop().RunUntilIdle();
137f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
138f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  EXPECT_FALSE(cancel_callback.Cancelled());
139f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)}
140f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
141f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)TEST_F(DomDistillerTaskTrackerTest,
142f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)       TestSaveCallbackCalledOnDistillationComplete) {
143f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  MockDistillerFactory distiller_factory;
144f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  FakeDistiller* distiller = new FakeDistiller();
145f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  EXPECT_CALL(distiller_factory, CreateDistillerImpl())
146f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      .WillOnce(Return(distiller));
147f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  TestCancelCallback cancel_callback;
148f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  TaskTracker task_tracker(GetDefaultEntry(), cancel_callback.GetCallback());
149f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
150f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  MockSaveCallback save_callback;
151f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  task_tracker.SetSaveCallback(
152f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      base::Bind(&MockSaveCallback::Save, base::Unretained(&save_callback)));
153f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  base::RunLoop().RunUntilIdle();
154f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
155f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  EXPECT_CALL(save_callback, Save(_, _));
156f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
157f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  task_tracker.StartDistiller(&distiller_factory);
158f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  distiller->RunDistillerCallback(make_scoped_ptr(new DistilledPageProto));
159f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  base::RunLoop().RunUntilIdle();
160f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
161f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  EXPECT_TRUE(cancel_callback.Cancelled());
162f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)}
163f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
164f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)}  // namespace test
165f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)}  // namespace dom_distiller
166