// Copyright 2013 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

#include "components/dom_distiller/core/distiller_url_fetcher.h"
#include "base/bind.h"
#include "base/bind_helpers.h"
#include "base/run_loop.h"
#include "base/test/scoped_task_environment.h"
#include "services/network/public/cpp/weak_wrapper_shared_url_loader_factory.h"
#include "services/network/test/test_url_loader_factory.h"
#include "services/network/test/test_utils.h"
#include "testing/gtest/include/gtest/gtest.h"
#include "url/gurl.h"

const char kTestPageA[] = "http://www.a.com/";
const char kTestPageAResponse[] = {1, 2, 3, 4, 5, 6, 7};
const char kTestPageB[] = "http://www.b.com/";
const char kTestPageBResponse[] = {'a', 'b', 'c'};

class DistillerURLFetcherTest : public testing::Test {
 public:
  DistillerURLFetcherTest()
      : test_shared_url_loader_factory_(
            base::MakeRefCounted<network::WeakWrapperSharedURLLoaderFactory>(
                &test_url_loader_factory_)) {}

  void FetcherCallback(const std::string& response) { response_ = response; }

 protected:
  // testing::Test implementation:
  void SetUp() override {
    url_fetcher_.reset(new dom_distiller::DistillerURLFetcher(
        test_shared_url_loader_factory_));
    test_url_loader_factory_.AddResponse(
        kTestPageA,
        std::string(kTestPageAResponse, sizeof(kTestPageAResponse)));
    test_url_loader_factory_.AddResponse(
        GURL(kTestPageB),
        network::CreateResourceResponseHead(net::HTTP_INTERNAL_SERVER_ERROR),
        std::string(kTestPageBResponse, sizeof(kTestPageBResponse)),
        network::URLLoaderCompletionStatus(net::OK));
  }

  void Fetch(const std::string& url, const std::string& expected_response) {
    url_fetcher_->FetchURL(url,
                           base::Bind(&DistillerURLFetcherTest::FetcherCallback,
                                      base::Unretained(this)));
    base::RunLoop().RunUntilIdle();
    CHECK_EQ(expected_response, response_);
  }

  base::test::ScopedTaskEnvironment task_environment_{
      base::test::ScopedTaskEnvironment::MainThreadType::UI};
  std::unique_ptr<dom_distiller::DistillerURLFetcher> url_fetcher_;
  network::TestURLLoaderFactory test_url_loader_factory_;
  scoped_refptr<network::SharedURLLoaderFactory>
      test_shared_url_loader_factory_;
  std::string response_;
};

TEST_F(DistillerURLFetcherTest, PopulateProto) {
  Fetch(kTestPageA,
        std::string(kTestPageAResponse, sizeof(kTestPageAResponse)));
}

TEST_F(DistillerURLFetcherTest, PopulateProtoFailedFetch) {
  // Expect the callback to contain an empty string for this URL.
  Fetch(kTestPageB, std::string(std::string(), 0));
}
