Upstream version 7.36.149.0
[platform/framework/web/crosswalk.git] / src / components / dom_distiller / core / distiller_unittest.cc
index 471f91f..115ca2d 100644 (file)
@@ -17,6 +17,7 @@
 #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"
@@ -181,6 +182,9 @@ void VerifyArticleProtoMatchesMultipageData(
 
 namespace dom_distiller {
 
+using test::MockDistillerPage;
+using test::MockDistillerPageFactory;
+
 class TestDistillerURLFetcher : public DistillerURLFetcher {
  public:
   explicit TestDistillerURLFetcher(bool delay_fetch)
@@ -224,36 +228,12 @@ class TestDistillerURLFetcherFactory : public DistillerURLFetcherFactory {
 
 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() {}
@@ -265,8 +245,10 @@ class DistillerTest : public testing::Test {
     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,
@@ -281,69 +263,52 @@ class DistillerTest : public testing::Test {
   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);
@@ -359,11 +324,8 @@ TEST_F(DistillerTest, DistillPageWithImages) {
   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);
@@ -396,12 +358,10 @@ TEST_F(DistillerTest, DistillMultiplePages) {
     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);
@@ -413,11 +373,8 @@ TEST_F(DistillerTest, DistillLinkLoop) {
   // 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);
@@ -443,14 +400,13 @@ TEST_F(DistillerTest, CheckMaxPageLimitExtraPage) {
   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,
@@ -463,16 +419,14 @@ TEST_F(DistillerTest, CheckMaxPageLimitExactLimit) {
   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,
@@ -483,11 +437,9 @@ TEST_F(DistillerTest, SinglePageDistillationFailure) {
   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());
@@ -508,12 +460,10 @@ TEST_F(DistillerTest, MultiplePagesDistillationFailure) {
       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(
@@ -529,13 +479,10 @@ TEST_F(DistillerTest, DistillPreviousPage) {
   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);
@@ -550,13 +497,10 @@ TEST_F(DistillerTest, IncrementalUpdates) {
   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()));
@@ -573,13 +517,10 @@ TEST_F(DistillerTest, IncrementalUpdatesDoNotDeleteFinalArticle) {
   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());
 
@@ -598,13 +539,10 @@ TEST_F(DistillerTest, DeletingArticleDoesNotInterfereWithUpdates) {
   // 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());
@@ -622,16 +560,13 @@ TEST_F(DistillerTest, CancelWithDelayedImageFetchCallback) {
   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.
@@ -646,17 +581,15 @@ TEST_F(DistillerTest, CancelWithDelayedJSCallback) {
   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();