// Copyright (c) 2014 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.

#ifndef CONTENT_TEST_TEST_NAVIGATION_URL_LOADER_H_
#define CONTENT_TEST_TEST_NAVIGATION_URL_LOADER_H_

#include <memory>

#include "base/memory/weak_ptr.h"
#include "content/browser/frame_host/navigation_request_info.h"
#include "content/browser/loader/navigation_url_loader.h"
#include "content/common/navigation_params.h"

namespace net {
struct RedirectInfo;
}

namespace network {
struct ResourceResponse;
}

namespace content {

class NavigationURLLoaderDelegate;

// Test implementation of NavigationURLLoader to simulate the network stack
// response.
class TestNavigationURLLoader
    : public NavigationURLLoader,
      public base::SupportsWeakPtr<TestNavigationURLLoader> {
 public:
  TestNavigationURLLoader(std::unique_ptr<NavigationRequestInfo> request_info,
                          NavigationURLLoaderDelegate* delegate);

  // NavigationURLLoader implementation.
  void FollowRedirect(const std::vector<std::string>& removed_headers,
                      const net::HttpRequestHeaders& modified_headers,
                      PreviewsState new_previews_state) override;
  void ProceedWithResponse() override;

  NavigationRequestInfo* request_info() const { return request_info_.get(); }

  void SimulateServerRedirect(const GURL& redirect_url);

  void SimulateError(int error_code);
  void SimulateErrorWithStatus(
      const network::URLLoaderCompletionStatus& status);

  void CallOnRequestRedirected(
      const net::RedirectInfo& redirect_info,
      const scoped_refptr<network::ResourceResponse>& response);
  void CallOnResponseStarted(
      const scoped_refptr<network::ResourceResponse>& response);

  int redirect_count() { return redirect_count_; }

  bool response_proceeded() { return response_proceeded_; }

 private:
  ~TestNavigationURLLoader() override;

  std::unique_ptr<NavigationRequestInfo> request_info_;
  NavigationURLLoaderDelegate* delegate_;
  int redirect_count_;
  bool response_proceeded_;
};

}  // namespace content

#endif  // CONTENT_TEST_TEST_NAVIGATION_URL_LOADER_H_
