// Copyright 2018 The Fuchsia 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 LIB_NETWORK_WRAPPER_FAKE_NETWORK_WRAPPER_H_
#define LIB_NETWORK_WRAPPER_FAKE_NETWORK_WRAPPER_H_

#include <fuchsia/net/oldhttp/cpp/fidl.h>
#include <lib/async/dispatcher.h>

#include "src/lib/fxl/macros.h"
#include "lib/network_wrapper/network_wrapper.h"

namespace network_wrapper {

class FakeNetworkWrapper : public NetworkWrapper {
 public:
  explicit FakeNetworkWrapper(async_dispatcher_t* dispatcher);
  ~FakeNetworkWrapper() override;

  ::fuchsia::net::oldhttp::URLRequest* GetRequest();
  void ResetRequest();

  void SetResponse(::fuchsia::net::oldhttp::URLResponse response);

  void SetSocketResponse(zx::socket body, uint32_t status_code);

  void SetStringResponse(const std::string& body, uint32_t status_code);

 private:
  // NetworkWrapper
  fxl::RefPtr<callback::Cancellable> Request(
      fit::function<::fuchsia::net::oldhttp::URLRequest()> request_factory,
      fit::function<void(::fuchsia::net::oldhttp::URLResponse)> callback)
      override;

  std::unique_ptr<::fuchsia::net::oldhttp::URLRequest> request_received_;
  std::unique_ptr<::fuchsia::net::oldhttp::URLResponse> response_to_return_;
  async_dispatcher_t* const dispatcher_;

  FXL_DISALLOW_COPY_AND_ASSIGN(FakeNetworkWrapper);
};

}  // namespace network_wrapper

#endif  // LIB_NETWORK_WRAPPER_FAKE_NETWORK_WRAPPER_H_
