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. 4 5#include "components/dom_distiller/core/fake_distiller.h" 6 7#include "base/auto_reset.h" 8#include "base/bind.h" 9#include "base/callback_helpers.h" 10#include "base/message_loop/message_loop.h" 11#include "testing/gtest/include/gtest/gtest.h" 12 13namespace dom_distiller { 14namespace test { 15 16MockDistillerFactory::MockDistillerFactory() {} 17MockDistillerFactory::~MockDistillerFactory() {} 18 19FakeDistiller::FakeDistiller(bool execute_callback) 20 : execute_callback_(execute_callback), 21 destruction_allowed_(true) { 22 EXPECT_CALL(*this, Die()).Times(testing::AnyNumber()); 23} 24 25FakeDistiller::FakeDistiller( 26 bool execute_callback, 27 const base::Closure& distillation_initiated_callback) 28 : execute_callback_(execute_callback), 29 destruction_allowed_(true), 30 distillation_initiated_callback_(distillation_initiated_callback) { 31 EXPECT_CALL(*this, Die()).Times(testing::AnyNumber()); 32} 33 34FakeDistiller::~FakeDistiller() { 35 EXPECT_TRUE(destruction_allowed_); 36 Die(); 37} 38 39void FakeDistiller::DistillPage( 40 const GURL& url, 41 scoped_ptr<DistillerPage> distiller_page, 42 const DistillationFinishedCallback& article_callback, 43 const DistillationUpdateCallback& page_callback) { 44 url_ = url; 45 article_callback_ = article_callback; 46 page_callback_ = page_callback; 47 if (!distillation_initiated_callback_.is_null()) { 48 base::ResetAndReturn(&distillation_initiated_callback_).Run(); 49 } 50 if (execute_callback_) { 51 scoped_ptr<DistilledArticleProto> proto(new DistilledArticleProto); 52 proto->add_pages()->set_url(url_.spec()); 53 PostDistillerCallback(proto.Pass()); 54 } 55} 56 57void FakeDistiller::RunDistillerCallback( 58 scoped_ptr<DistilledArticleProto> proto) { 59 ASSERT_FALSE(execute_callback_) << "Cannot explicitly run the distiller " 60 "callback for a fake distiller created " 61 "with automatic callback execution."; 62 PostDistillerCallback(proto.Pass()); 63} 64 65void FakeDistiller::RunDistillerUpdateCallback( 66 const ArticleDistillationUpdate& update) { 67 page_callback_.Run(update); 68} 69 70 71void FakeDistiller::PostDistillerCallback( 72 scoped_ptr<DistilledArticleProto> proto) { 73 base::MessageLoop::current()->PostTask( 74 FROM_HERE, 75 base::Bind(&FakeDistiller::RunDistillerCallbackInternal, 76 base::Unretained(this), 77 base::Passed(&proto))); 78} 79 80void FakeDistiller::RunDistillerCallbackInternal( 81 scoped_ptr<DistilledArticleProto> proto) { 82 EXPECT_FALSE(article_callback_.is_null()); 83 84 base::AutoReset<bool> dont_delete_this_in_callback(&destruction_allowed_, 85 false); 86 article_callback_.Run(proto.Pass()); 87 article_callback_.Reset(); 88} 89 90} // namespace test 91} // namespace dom_distiller 92