| // 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; | |
| } |