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