| // Copyright 2016 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/test_runner/cpp/scope.h" |
| #include <lib/async/default.h> |
| |
| namespace test_runner { |
| |
| ScopeServices::ScopeServices() |
| : vfs_(std::make_unique<fs::SynchronousVfs>(async_get_default_dispatcher())), |
| svc_(fbl::AdoptRef(new fs::PseudoDir)) {} |
| |
| zx::channel ScopeServices::OpenAsDirectory() { |
| zx::channel h1, h2; |
| if (zx::channel::create(0, &h1, &h2) != ZX_OK) |
| return zx::channel(); |
| if (vfs_->ServeDirectory(svc_, std::move(h1)) != ZX_OK) |
| return zx::channel(); |
| return h2; |
| } |
| |
| Scope::Scope(const fuchsia::sys::EnvironmentPtr& parent_env, const std::string& label, |
| std::unique_ptr<ScopeServices> services) |
| : services_(std::move(services)) { |
| fuchsia::sys::ServiceListPtr service_list(new fuchsia::sys::ServiceList); |
| service_list->names = std::move(services_->svc_names_); |
| service_list->host_directory = services_->OpenAsDirectory(); |
| parent_env->CreateNestedEnvironment( |
| env_.NewRequest(), env_controller_.NewRequest(), label, std::move(service_list), |
| {.inherit_parent_services = true, .delete_storage_on_death = true}); |
| } |
| |
| fuchsia::sys::Launcher* Scope::GetLauncher() { |
| if (!env_launcher_) { |
| env_->GetLauncher(env_launcher_.NewRequest()); |
| } |
| return env_launcher_.get(); |
| } |
| |
| } // namespace test_runner |