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