#include "components/dom_distiller/core/article_distillation_update.h"
#include "components/dom_distiller/core/distiller.h"
#include "components/dom_distiller/core/distiller_page.h"
+#include "components/dom_distiller/core/fake_distiller_page.h"
#include "components/dom_distiller/core/proto/distilled_article.pb.h"
#include "components/dom_distiller/core/proto/distilled_page.pb.h"
#include "net/url_request/url_request_context_getter.h"
namespace dom_distiller {
+using test::MockDistillerPage;
+using test::MockDistillerPageFactory;
+
class TestDistillerURLFetcher : public DistillerURLFetcher {
public:
explicit TestDistillerURLFetcher(bool delay_fetch)
class MockDistillerURLFetcherFactory : public DistillerURLFetcherFactory {
public:
- explicit MockDistillerURLFetcherFactory()
- : DistillerURLFetcherFactory(NULL) {}
+ MockDistillerURLFetcherFactory() : DistillerURLFetcherFactory(NULL) {}
virtual ~MockDistillerURLFetcherFactory() {}
MOCK_CONST_METHOD0(CreateDistillerURLFetcher, DistillerURLFetcher*());
};
-class MockDistillerPage : public DistillerPage {
- public:
- MOCK_METHOD0(InitImpl, void());
- MOCK_METHOD1(LoadURLImpl, void(const GURL& gurl));
- MOCK_METHOD1(ExecuteJavaScriptImpl, void(const string& script));
-
- explicit MockDistillerPage(
- const base::WeakPtr<DistillerPage::Delegate>& delegate)
- : DistillerPage(delegate) {}
-};
-
-class MockDistillerPageFactory : public DistillerPageFactory {
- public:
- MOCK_CONST_METHOD1(
- CreateDistillerPageMock,
- DistillerPage*(const base::WeakPtr<DistillerPage::Delegate>& delegate));
-
- virtual scoped_ptr<DistillerPage> CreateDistillerPage(
- const base::WeakPtr<DistillerPage::Delegate>& delegate) const OVERRIDE {
- return scoped_ptr<DistillerPage>(CreateDistillerPageMock(delegate));
- }
-};
-
class DistillerTest : public testing::Test {
public:
virtual ~DistillerTest() {}
in_sequence_updates_.push_back(article_update);
}
- void DistillPage(const std::string& url) {
+ void DistillPage(const std::string& url,
+ scoped_ptr<DistillerPage> distiller_page) {
distiller_->DistillPage(GURL(url),
+ distiller_page.Pass(),
base::Bind(&DistillerTest::OnDistillArticleDone,
base::Unretained(this)),
base::Bind(&DistillerTest::OnDistillArticleUpdate,
TestDistillerURLFetcherFactory url_fetcher_factory_;
};
-ACTION_P3(DistillerPageOnExecuteJavaScriptDone, distiller_page, url, list) {
- distiller_page->OnExecuteJavaScriptDone(url, list);
+ACTION_P3(DistillerPageOnDistillationDone, distiller_page, url, list) {
+ distiller_page->OnDistillationDone(url, list);
}
-ACTION_P2(CreateMockDistillerPage, list, kurl) {
- const base::WeakPtr<DistillerPage::Delegate>& delegate = arg0;
- MockDistillerPage* distiller_page = new MockDistillerPage(delegate);
- EXPECT_CALL(*distiller_page, InitImpl());
- EXPECT_CALL(*distiller_page, LoadURLImpl(kurl))
- .WillOnce(testing::InvokeWithoutArgs(distiller_page,
- &DistillerPage::OnLoadURLDone));
- EXPECT_CALL(*distiller_page, ExecuteJavaScriptImpl(_)).WillOnce(
- DistillerPageOnExecuteJavaScriptDone(distiller_page, kurl, list));
- return distiller_page;
+scoped_ptr<DistillerPage> CreateMockDistillerPage(const base::Value* list,
+ const GURL& url) {
+ MockDistillerPage* distiller_page = new MockDistillerPage();
+ EXPECT_CALL(*distiller_page, DistillPageImpl(url, _))
+ .WillOnce(DistillerPageOnDistillationDone(distiller_page, url, list));
+ return scoped_ptr<DistillerPage>(distiller_page).Pass();
}
-ACTION_P2(CreateMockDistillerPageWithPendingJSCallback,
- distiller_page_ptr,
- kurl) {
- const base::WeakPtr<DistillerPage::Delegate>& delegate = arg0;
- MockDistillerPage* distiller_page = new MockDistillerPage(delegate);
+scoped_ptr<DistillerPage> CreateMockDistillerPageWithPendingJSCallback(
+ MockDistillerPage** distiller_page_ptr,
+ const GURL& url) {
+ MockDistillerPage* distiller_page = new MockDistillerPage();
*distiller_page_ptr = distiller_page;
- EXPECT_CALL(*distiller_page, InitImpl());
- EXPECT_CALL(*distiller_page, LoadURLImpl(kurl))
- .WillOnce(testing::InvokeWithoutArgs(distiller_page,
- &DistillerPage::OnLoadURLDone));
- EXPECT_CALL(*distiller_page, ExecuteJavaScriptImpl(_));
- return distiller_page;
+ EXPECT_CALL(*distiller_page, DistillPageImpl(url, _));
+ return scoped_ptr<DistillerPage>(distiller_page).Pass();
}
-ACTION_P3(CreateMockDistillerPages,
- distiller_data,
- pages_size,
- start_page_num) {
- const base::WeakPtr<DistillerPage::Delegate>& delegate = arg0;
- MockDistillerPage* distiller_page = new MockDistillerPage(delegate);
- EXPECT_CALL(*distiller_page, InitImpl());
+scoped_ptr<DistillerPage> CreateMockDistillerPages(
+ MultipageDistillerData* distiller_data,
+ size_t pages_size,
+ int start_page_num) {
+ MockDistillerPage* distiller_page = new MockDistillerPage();
{
testing::InSequence s;
vector<int> page_nums = GetPagesInSequence(start_page_num, pages_size);
for (size_t page_num = 0; page_num < pages_size; ++page_num) {
int page = page_nums[page_num];
GURL url = GURL(distiller_data->page_urls[page]);
- EXPECT_CALL(*distiller_page, LoadURLImpl(url))
- .WillOnce(testing::InvokeWithoutArgs(distiller_page,
- &DistillerPage::OnLoadURLDone));
- EXPECT_CALL(*distiller_page, ExecuteJavaScriptImpl(_))
- .WillOnce(DistillerPageOnExecuteJavaScriptDone(
+ EXPECT_CALL(*distiller_page, DistillPageImpl(url, _))
+ .WillOnce(DistillerPageOnDistillationDone(
distiller_page, url, distiller_data->distilled_values[page]));
}
}
- return distiller_page;
+ return scoped_ptr<DistillerPage>(distiller_page).Pass();
}
TEST_F(DistillerTest, DistillPage) {
base::MessageLoopForUI loop;
scoped_ptr<base::ListValue> list =
CreateDistilledValueReturnedFromJS(kTitle, kContent, vector<int>(), "");
- EXPECT_CALL(page_factory_, CreateDistillerPageMock(_))
- .WillOnce(CreateMockDistillerPage(list.get(), GURL(kURL)));
- distiller_.reset(new DistillerImpl(page_factory_, url_fetcher_factory_));
- distiller_->Init();
- DistillPage(kURL);
+ distiller_.reset(new DistillerImpl(url_fetcher_factory_));
+ DistillPage(kURL, CreateMockDistillerPage(list.get(), GURL(kURL)).Pass());
base::MessageLoop::current()->RunUntilIdle();
EXPECT_EQ(kTitle, article_proto_->title());
EXPECT_EQ(article_proto_->pages_size(), 1);
image_indices.push_back(1);
scoped_ptr<base::ListValue> list =
CreateDistilledValueReturnedFromJS(kTitle, kContent, image_indices, "");
- EXPECT_CALL(page_factory_, CreateDistillerPageMock(_))
- .WillOnce(CreateMockDistillerPage(list.get(), GURL(kURL)));
- distiller_.reset(new DistillerImpl(page_factory_, url_fetcher_factory_));
- distiller_->Init();
- DistillPage(kURL);
+ distiller_.reset(new DistillerImpl(url_fetcher_factory_));
+ DistillPage(kURL, CreateMockDistillerPage(list.get(), GURL(kURL)).Pass());
base::MessageLoop::current()->RunUntilIdle();
EXPECT_EQ(kTitle, article_proto_->title());
EXPECT_EQ(article_proto_->pages_size(), 1);
distiller_data->image_ids.push_back(image_indices);
}
- EXPECT_CALL(page_factory_, CreateDistillerPageMock(_))
- .WillOnce(CreateMockDistillerPages(distiller_data.get(), kNumPages, 0));
-
- distiller_.reset(new DistillerImpl(page_factory_, url_fetcher_factory_));
- distiller_->Init();
- DistillPage(distiller_data->page_urls[0]);
+ distiller_.reset(new DistillerImpl(url_fetcher_factory_));
+ DistillPage(
+ distiller_data->page_urls[0],
+ CreateMockDistillerPages(distiller_data.get(), kNumPages, 0).Pass());
base::MessageLoop::current()->RunUntilIdle();
VerifyArticleProtoMatchesMultipageData(
article_proto_.get(), distiller_data.get(), kNumPages);
// happen if javascript misparses a next page link.
scoped_ptr<base::ListValue> list =
CreateDistilledValueReturnedFromJS(kTitle, kContent, vector<int>(), kURL);
- EXPECT_CALL(page_factory_, CreateDistillerPageMock(_))
- .WillOnce(CreateMockDistillerPage(list.get(), GURL(kURL)));
- distiller_.reset(new DistillerImpl(page_factory_, url_fetcher_factory_));
- distiller_->Init();
- DistillPage(kURL);
+ distiller_.reset(new DistillerImpl(url_fetcher_factory_));
+ DistillPage(kURL, CreateMockDistillerPage(list.get(), GURL(kURL)).Pass());
base::MessageLoop::current()->RunUntilIdle();
EXPECT_EQ(kTitle, article_proto_->title());
EXPECT_EQ(article_proto_->pages_size(), 1);
distiller_data->distilled_values.pop_back();
distiller_data->distilled_values.push_back(last_page_data.release());
- EXPECT_CALL(page_factory_, CreateDistillerPageMock(_)).WillOnce(
- CreateMockDistillerPages(distiller_data.get(), kMaxPagesInArticle, 0));
- distiller_.reset(new DistillerImpl(page_factory_, url_fetcher_factory_));
+ distiller_.reset(new DistillerImpl(url_fetcher_factory_));
distiller_->SetMaxNumPagesInArticle(kMaxPagesInArticle);
- distiller_->Init();
- DistillPage(distiller_data->page_urls[0]);
+ DistillPage(distiller_data->page_urls[0],
+ CreateMockDistillerPages(
+ distiller_data.get(), kMaxPagesInArticle, 0).Pass());
base::MessageLoop::current()->RunUntilIdle();
EXPECT_EQ(kTitle, article_proto_->title());
EXPECT_EQ(kMaxPagesInArticle,
scoped_ptr<MultipageDistillerData> distiller_data =
CreateMultipageDistillerDataWithoutImages(kMaxPagesInArticle);
- EXPECT_CALL(page_factory_, CreateDistillerPageMock(_)).WillOnce(
- CreateMockDistillerPages(distiller_data.get(), kMaxPagesInArticle, 0));
- distiller_.reset(new DistillerImpl(page_factory_, url_fetcher_factory_));
+ distiller_.reset(new DistillerImpl(url_fetcher_factory_));
// Check if distilling an article with exactly the page limit works.
distiller_->SetMaxNumPagesInArticle(kMaxPagesInArticle);
- distiller_->Init();
-
- DistillPage(distiller_data->page_urls[0]);
+ DistillPage(distiller_data->page_urls[0],
+ CreateMockDistillerPages(
+ distiller_data.get(), kMaxPagesInArticle, 0).Pass());
base::MessageLoop::current()->RunUntilIdle();
EXPECT_EQ(kTitle, article_proto_->title());
EXPECT_EQ(kMaxPagesInArticle,
base::MessageLoopForUI loop;
// To simulate failure return a null value.
scoped_ptr<base::Value> nullValue(base::Value::CreateNullValue());
- EXPECT_CALL(page_factory_, CreateDistillerPageMock(_))
- .WillOnce(CreateMockDistillerPage(nullValue.get(), GURL(kURL)));
- distiller_.reset(new DistillerImpl(page_factory_, url_fetcher_factory_));
- distiller_->Init();
- DistillPage(kURL);
+ distiller_.reset(new DistillerImpl(url_fetcher_factory_));
+ DistillPage(kURL,
+ CreateMockDistillerPage(nullValue.get(), GURL(kURL)).Pass());
base::MessageLoop::current()->RunUntilIdle();
EXPECT_EQ("", article_proto_->title());
EXPECT_EQ(0, article_proto_->pages_size());
distiller_data->distilled_values.begin() + failed_page_num,
base::Value::CreateNullValue());
// Expect only calls till the failed page number.
- EXPECT_CALL(page_factory_, CreateDistillerPageMock(_)).WillOnce(
- CreateMockDistillerPages(distiller_data.get(), failed_page_num + 1, 0));
-
- distiller_.reset(new DistillerImpl(page_factory_, url_fetcher_factory_));
- distiller_->Init();
- DistillPage(distiller_data->page_urls[0]);
+ distiller_.reset(new DistillerImpl(url_fetcher_factory_));
+ DistillPage(distiller_data->page_urls[0],
+ CreateMockDistillerPages(
+ distiller_data.get(), failed_page_num + 1, 0).Pass());
base::MessageLoop::current()->RunUntilIdle();
EXPECT_EQ(kTitle, article_proto_->title());
VerifyArticleProtoMatchesMultipageData(
scoped_ptr<MultipageDistillerData> distiller_data =
CreateMultipageDistillerDataWithoutImages(kNumPages);
- EXPECT_CALL(page_factory_, CreateDistillerPageMock(_))
- .WillOnce(CreateMockDistillerPages(
- distiller_data.get(), kNumPages, start_page_num));
-
- distiller_.reset(new DistillerImpl(page_factory_, url_fetcher_factory_));
- distiller_->Init();
- DistillPage(distiller_data->page_urls[start_page_num]);
+ distiller_.reset(new DistillerImpl(url_fetcher_factory_));
+ DistillPage(distiller_data->page_urls[start_page_num],
+ CreateMockDistillerPages(
+ distiller_data.get(), kNumPages, start_page_num).Pass());
base::MessageLoop::current()->RunUntilIdle();
VerifyArticleProtoMatchesMultipageData(
article_proto_.get(), distiller_data.get(), kNumPages);
scoped_ptr<MultipageDistillerData> distiller_data =
CreateMultipageDistillerDataWithoutImages(kNumPages);
- EXPECT_CALL(page_factory_, CreateDistillerPageMock(_))
- .WillOnce(CreateMockDistillerPages(
- distiller_data.get(), kNumPages, start_page_num));
-
- distiller_.reset(new DistillerImpl(page_factory_, url_fetcher_factory_));
- distiller_->Init();
- DistillPage(distiller_data->page_urls[start_page_num]);
+ distiller_.reset(new DistillerImpl(url_fetcher_factory_));
+ DistillPage(distiller_data->page_urls[start_page_num],
+ CreateMockDistillerPages(
+ distiller_data.get(), kNumPages, start_page_num).Pass());
base::MessageLoop::current()->RunUntilIdle();
EXPECT_EQ(kTitle, article_proto_->title());
EXPECT_EQ(kNumPages, static_cast<size_t>(article_proto_->pages_size()));
scoped_ptr<MultipageDistillerData> distiller_data =
CreateMultipageDistillerDataWithoutImages(kNumPages);
- EXPECT_CALL(page_factory_, CreateDistillerPageMock(_))
- .WillOnce(CreateMockDistillerPages(
- distiller_data.get(), kNumPages, start_page_num));
-
- distiller_.reset(new DistillerImpl(page_factory_, url_fetcher_factory_));
- distiller_->Init();
- DistillPage(distiller_data->page_urls[start_page_num]);
+ distiller_.reset(new DistillerImpl(url_fetcher_factory_));
+ DistillPage(distiller_data->page_urls[start_page_num],
+ CreateMockDistillerPages(
+ distiller_data.get(), kNumPages, start_page_num).Pass());
base::MessageLoop::current()->RunUntilIdle();
EXPECT_EQ(kNumPages, in_sequence_updates_.size());
// The page number of the article on which distillation starts.
int start_page_num = 3;
- EXPECT_CALL(page_factory_, CreateDistillerPageMock(_))
- .WillOnce(CreateMockDistillerPages(
- distiller_data.get(), kNumPages, start_page_num));
-
- distiller_.reset(new DistillerImpl(page_factory_, url_fetcher_factory_));
- distiller_->Init();
- DistillPage(distiller_data->page_urls[start_page_num]);
+ distiller_.reset(new DistillerImpl(url_fetcher_factory_));
+ DistillPage(distiller_data->page_urls[start_page_num],
+ CreateMockDistillerPages(
+ distiller_data.get(), kNumPages, start_page_num).Pass());
base::MessageLoop::current()->RunUntilIdle();
EXPECT_EQ(kNumPages, in_sequence_updates_.size());
EXPECT_EQ(kTitle, article_proto_->title());
image_indices.push_back(0);
scoped_ptr<base::ListValue> distilled_value =
CreateDistilledValueReturnedFromJS(kTitle, kContent, image_indices, "");
- EXPECT_CALL(page_factory_, CreateDistillerPageMock(_))
- .WillOnce(CreateMockDistillerPage(distilled_value.get(), GURL(kURL)));
-
TestDistillerURLFetcher* delayed_fetcher = new TestDistillerURLFetcher(true);
MockDistillerURLFetcherFactory url_fetcher_factory;
EXPECT_CALL(url_fetcher_factory, CreateDistillerURLFetcher())
.WillOnce(Return(delayed_fetcher));
- distiller_.reset(new DistillerImpl(page_factory_, url_fetcher_factory));
- distiller_->Init();
- DistillPage(kURL);
+ distiller_.reset(new DistillerImpl(url_fetcher_factory));
+ DistillPage(
+ kURL, CreateMockDistillerPage(distilled_value.get(), GURL(kURL)).Pass());
base::MessageLoop::current()->RunUntilIdle();
// Post callback from the url fetcher and then delete the distiller.
scoped_ptr<base::ListValue> distilled_value =
CreateDistilledValueReturnedFromJS(kTitle, kContent, vector<int>(), "");
MockDistillerPage* distiller_page = NULL;
- EXPECT_CALL(page_factory_, CreateDistillerPageMock(_))
- .WillOnce(CreateMockDistillerPageWithPendingJSCallback(&distiller_page,
- GURL(kURL)));
- distiller_.reset(new DistillerImpl(page_factory_, url_fetcher_factory_));
- distiller_->Init();
- DistillPage(kURL);
+ distiller_.reset(new DistillerImpl(url_fetcher_factory_));
+ DistillPage(kURL,
+ CreateMockDistillerPageWithPendingJSCallback(&distiller_page,
+ GURL(kURL)));
base::MessageLoop::current()->RunUntilIdle();
ASSERT_TRUE(distiller_page);
// Post the task to execute javascript and then delete the distiller.
- distiller_page->OnExecuteJavaScriptDone(GURL(kURL), distilled_value.get());
+ distiller_page->OnDistillationDone(GURL(kURL), distilled_value.get());
distiller_.reset();
base::MessageLoop::current()->RunUntilIdle();