// 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.

#include <lib/sys/cpp/testing/service_directory_provider.h>

namespace sys {
namespace testing {

ServiceDirectoryProvider::ServiceDirectoryProvider(async_dispatcher_t* dispatcher)
    : svc_dir_(std::make_unique<vfs::PseudoDir>()) {
  fidl::InterfaceHandle<fuchsia::io::Directory> directory_ptr;
  svc_dir_->Serve(fuchsia::io::OPEN_RIGHT_READABLE | fuchsia::io::OPEN_RIGHT_WRITABLE,
                  directory_ptr.NewRequest().TakeChannel(), dispatcher);
  service_directory_ = std::make_shared<sys::ServiceDirectory>(directory_ptr.TakeChannel());
}

ServiceDirectoryProvider::~ServiceDirectoryProvider() = default;

zx_status_t ServiceDirectoryProvider::AddService(std::unique_ptr<vfs::Service> service,
                                                 const std::string& name) const {
  return svc_dir_->AddEntry(name, std::move(service));
}

}  // namespace testing
}  // namespace sys
