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

#include <fuchsia/io/cpp/fidl.h>
#include <lib/sys/cpp/testing/fake_component.h>

namespace sys {
namespace testing {

FakeComponent::FakeComponent() {}

FakeComponent::~FakeComponent() = default;

void FakeComponent::Register(std::string url, FakeLauncher& fake_launcher,
                             async_dispatcher_t* dispatcher) {
  fake_launcher.RegisterComponent(
      url, [this, dispatcher](
               fuchsia::sys::LaunchInfo launch_info,
               fidl::InterfaceRequest<fuchsia::sys::ComponentController> ctrl) {
        ctrls_.push_back(std::move(ctrl));
        zx_status_t status = directory_.Serve(
            fuchsia::io::OPEN_RIGHT_READABLE | fuchsia::io::OPEN_RIGHT_WRITABLE,
            std::move(launch_info.directory_request), dispatcher);
        ZX_ASSERT(status == ZX_OK);
      });
}

}  // namespace testing
}  // namespace sys
