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