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 "base/bind.h"
6#include "base/bind_helpers.h"
7#include "base/message_loop/message_loop.h"
8#include "components/dom_distiller/core/distiller_url_fetcher.h"
9#include "net/http/http_status_code.h"
10#include "net/url_request/test_url_fetcher_factory.h"
11#include "net/url_request/url_fetcher.h"
12#include "net/url_request/url_request_context_getter.h"
13#include "net/url_request/url_request_status.h"
14#include "testing/gtest/include/gtest/gtest.h"
15#include "url/gurl.h"
16
17const char kTestPageA[] = "http://www.a.com/";
18const char kTestPageAResponse[] = { 1, 2, 3, 4, 5, 6, 7 };
19const char kTestPageB[] = "http://www.b.com/";
20const char kTestPageBResponse[] = { 'a', 'b', 'c' };
21
22
23class DistillerURLFetcherTest : public testing::Test {
24 public:
25  void FetcherCallback(const std::string& response) {
26     response_ = response;
27  }
28
29 protected:
30  // testing::Test implementation:
31  virtual void SetUp() OVERRIDE {
32    url_fetcher_.reset(new dom_distiller::DistillerURLFetcher(NULL));
33    factory_.reset(new net::FakeURLFetcherFactory(NULL));
34    factory_->SetFakeResponse(
35        GURL(kTestPageA),
36        std::string(kTestPageAResponse, sizeof(kTestPageAResponse)),
37        net::HTTP_OK,
38        net::URLRequestStatus::SUCCESS);
39    factory_->SetFakeResponse(
40        GURL(kTestPageB),
41        std::string(kTestPageBResponse, sizeof(kTestPageBResponse)),
42        net::HTTP_INTERNAL_SERVER_ERROR,
43        net::URLRequestStatus::SUCCESS);
44  }
45
46  void Fetch(const std::string& url,
47             const std::string& expected_response) {
48    base::MessageLoopForUI loop;
49    url_fetcher_->FetchURL(
50        url,
51        base::Bind(&DistillerURLFetcherTest::FetcherCallback,
52                   base::Unretained(this)));
53    loop.RunUntilIdle();
54    CHECK_EQ(expected_response, response_);
55  }
56
57  scoped_ptr<dom_distiller::DistillerURLFetcher> url_fetcher_;
58  scoped_ptr<net::FakeURLFetcherFactory> factory_;
59  std::string response_;
60};
61
62TEST_F(DistillerURLFetcherTest, PopulateProto) {
63  Fetch(kTestPageA,
64        std::string(kTestPageAResponse, sizeof(kTestPageAResponse)));
65}
66
67TEST_F(DistillerURLFetcherTest, PopulateProtoFailedFetch) {
68  // Expect the callback to contain an empty string for this URL.
69  Fetch(kTestPageB, std::string(std::string(), 0));
70}
71