// 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 SRC_LIB_ISOLATED_DEVMGR_ISOLATED_DEVMGR_H_
#define SRC_LIB_ISOLATED_DEVMGR_ISOLATED_DEVMGR_H_

#include <lib/async/cpp/wait.h>
#include <lib/devmgr-integration-test/fixture.h>
#include <lib/zx/channel.h>

#include <memory>

#include <ddk/metadata/test.h>

namespace isolated_devmgr {

class IsolatedDevmgr {
 public:
  IsolatedDevmgr(devmgr_integration_test::IsolatedDevmgr devmgr) : devmgr_(std::move(devmgr)) {}

  ~IsolatedDevmgr() = default;

  int root() { return devmgr_.devfs_root().get(); }

  const fbl::unique_fd& devfs_root() { return devmgr_.devfs_root(); }

  void Connect(zx::channel req);
  zx_status_t WaitForFile(const char* path);

  void SetExceptionCallback(fit::closure cb) { devmgr_.SetExceptionCallback(std::move(cb)); }

  struct ExtraArgs {
    // A list of vid/pid/did triplets to spawn in their own devhosts.
    fbl::Vector<board_test::DeviceEntry> device_list;
  };

  static std::unique_ptr<IsolatedDevmgr> Create(
      devmgr_launcher::Args args,
      std::unique_ptr<fbl::Vector<board_test::DeviceEntry>> device_list_unique_ptr = nullptr,
      async_dispatcher_t* dispatcher = nullptr);

 private:
  devmgr_integration_test::IsolatedDevmgr devmgr_;
};
}  // namespace isolated_devmgr

#endif  // SRC_LIB_ISOLATED_DEVMGR_ISOLATED_DEVMGR_H_
