// Copyright 2019 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_VIRTUALIZATION_TESTING_FAKE_MANAGER_H_
#define LIB_VIRTUALIZATION_TESTING_FAKE_MANAGER_H_

#include <fuchsia/virtualization/cpp/fidl.h>
#include <lib/fidl/cpp/binding.h>
#include <lib/fidl/cpp/binding_set.h>
#include <lib/virtualization/testing/fake_guest_vsock.h>
#include <lib/virtualization/testing/fake_host_vsock.h>

namespace guest {
namespace testing {

// Provides an implementation of |fuchsia::virtualization::Manager| that
// can create a single Environment/Guest. This is intended to make testing the
// common case of a single component creating a single guest.
class FakeManager : public fuchsia::virtualization::Manager,
                    public fuchsia::virtualization::Realm,
                    public fuchsia::virtualization::Guest {
 public:
  FakeGuestVsock* GuestVsock() { return &guest_vsock_; }

  fidl::InterfaceRequestHandler<fuchsia::virtualization::Manager> GetHandler() {
    return manager_bindings_.GetHandler(this);
  }

 private:
  // |fuchsia::virtualization::Manager|
  void Create(fidl::StringPtr label,
              fidl::InterfaceRequest<fuchsia::virtualization::Realm> env) override;
  void List(ListCallback callback) override;
  void Connect(uint32_t id, fidl::InterfaceRequest<fuchsia::virtualization::Realm> env) override;

  // |fuchsia::virtualization::Realm|
  void LaunchInstance(fuchsia::virtualization::LaunchInfo launch_info,
                      fidl::InterfaceRequest<fuchsia::virtualization::Guest> controller,
                      LaunchInstanceCallback callback) override;
  void ListInstances(ListInstancesCallback callback) override;
  void ConnectToInstance(
      uint32_t id, fidl::InterfaceRequest<fuchsia::virtualization::Guest> controller) override;
  void ConnectToBalloon(
      uint32_t id,
      fidl::InterfaceRequest<fuchsia::virtualization::BalloonController> controller) override;
  void GetHostVsockEndpoint(
      fidl::InterfaceRequest<fuchsia::virtualization::HostVsockEndpoint> endpoint) override;

  // |fuchsia::virtualization::Guest|
  void GetSerial(GetSerialCallback callback) override;

  FakeHostVsock host_vsock_{&guest_vsock_};
  FakeGuestVsock guest_vsock_{&host_vsock_};
  fidl::BindingSet<fuchsia::virtualization::Manager> manager_bindings_;
  fidl::Binding<fuchsia::virtualization::Realm> realm_binding_{this};
  fidl::Binding<fuchsia::virtualization::Guest> guest_binding_{this};
};

}  // namespace testing
}  // namespace guest

#endif  // LIB_VIRTUALIZATION_TESTING_FAKE_MANAGER_H_
