blob: 89466c78891888b2a412c0b34d7d328250f80fc4 [file] [log] [blame] [edit]
// Copyright 2020 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.
// To get drivermanager to run in a test environment, we need to fake boot-arguments & root-job.
#include <fuchsia/boot/llcpp/fidl.h>
#include <fuchsia/kernel/c/fidl.h>
#include <fuchsia/kernel/llcpp/fidl.h>
#include <lib/async-loop/cpp/loop.h>
#include <lib/async-loop/default.h>
#include <lib/async/cpp/wait.h>
#include <lib/async/dispatcher.h>
#include <lib/fidl-async/bind.h>
#include <lib/fidl-async/cpp/bind.h>
#include <lib/sys/cpp/component_context.h>
#include <lib/zx/job.h>
#include <lib/zx/time.h>
#include <zircon/status.h>
#include <mock-boot-arguments/server.h>
static zx_status_t RootJobGet(void* ctx, fidl_txn_t* txn) {
zx_handle_t out;
zx_status_t status = zx_handle_duplicate(zx_job_default(), ZX_RIGHT_SAME_RIGHTS, &out);
if (status != ZX_OK) {
return status;
}
return fuchsia_kernel_RootJobGet_reply(txn, out);
}
constexpr fuchsia_kernel_RootJob_ops kRootJobOps = {
.Get = RootJobGet,
};
int main(void) {
async::Loop loop(&kAsyncLoopConfigAttachToCurrentThread);
auto context = sys::ComponentContext::CreateAndServeOutgoingDirectory();
mock_boot_arguments::Server boot_arguments;
context->outgoing()->AddPublicService(
std::make_unique<vfs::Service>(
[&boot_arguments](zx::channel request, async_dispatcher_t* dispatcher) {
fidl::BindSingleInFlightOnly(dispatcher, std::move(request), &boot_arguments);
}),
llcpp::fuchsia::boot::Arguments::Name);
context->outgoing()->AddPublicService(
std::make_unique<vfs::Service>([](zx::channel request, async_dispatcher_t* dispatcher) {
auto root_job_dispatch =
reinterpret_cast<fidl_dispatch_t*>(fuchsia_kernel_RootJob_dispatch);
fidl_bind(dispatcher, request.release(), root_job_dispatch, nullptr, &kRootJobOps);
}),
llcpp::fuchsia::kernel::RootJob::Name);
loop.Run();
return 0;
}