diff --git a/garnet/packages/tests/BUILD.gn b/garnet/packages/tests/BUILD.gn index 1b1d44d9248cdb95f1c6d08112e29f7367d9794b..a86339c8e9bbc31cc3bc79775b7e0486b04352d5 100644 --- a/garnet/packages/tests/BUILD.gn +++ b/garnet/packages/tests/BUILD.gn @@ -1067,6 +1067,7 @@ group("runtime") { "//src/sys/component_manager:component_manager_tests", "//src/sys/component_manager/tests:elf_runner_test", "//src/sys/component_manager/tests:routing_integration_test", + "//src/sys/component_manager/tests:no_pkg_resolver_test", ] } diff --git a/src/sys/component_manager/BUILD.gn b/src/sys/component_manager/BUILD.gn index c82352bf90b8f74f99737099a0526452eb15713c..7a25fce62ade31b5410dffb5c82225c63f7af9a0 100644 --- a/src/sys/component_manager/BUILD.gn +++ b/src/sys/component_manager/BUILD.gn @@ -56,10 +56,7 @@ rustc_binary("bin") { deps = [ ":lib", - "//garnet/public/lib/fidl/rust/fidl", "//garnet/public/rust/fuchsia-async", - "//garnet/public/rust/fuchsia-component", - "//sdk/fidl/fuchsia.pkg:fuchsia.pkg-rustc", "//third_party/rust_crates:failure", "//third_party/rust_crates:futures-preview", "//third_party/rust_crates:log", diff --git a/src/sys/component_manager/src/lib.rs b/src/sys/component_manager/src/lib.rs index 4ff203cbabd15da4780241a45cf4a38d37bae9dd..9d50e896dd5f21c2a14d351191437dde047395c8 100644 --- a/src/sys/component_manager/src/lib.rs +++ b/src/sys/component_manager/src/lib.rs @@ -11,6 +11,7 @@ pub mod fuchsia_boot_resolver; pub mod fuchsia_pkg_resolver; pub mod klog; pub mod model; +pub mod startup; mod directory_broker; mod ns_util; diff --git a/src/sys/component_manager/src/main.rs b/src/sys/component_manager/src/main.rs index 0b5db3c18c31dde524a334c2d750639f3e0ff523..c45c7300e6d4c74a35c425c50198ce49755a4700 100644 --- a/src/sys/component_manager/src/main.rs +++ b/src/sys/component_manager/src/main.rs @@ -7,15 +7,12 @@ use { component_manager_lib::{ elf_runner::ElfRunner, - fuchsia_boot_resolver::{self, FuchsiaBootResolver}, - fuchsia_pkg_resolver::{self, FuchsiaPkgResolver}, klog, - model::{AbsoluteMoniker, Model, ModelParams, ResolverRegistry}, + model::{AbsoluteMoniker, Model, ModelParams}, + startup, }, failure::{self, Error, ResultExt}, - fidl_fuchsia_pkg::PackageResolverMarker, fuchsia_async as fasync, - fuchsia_component::client::connect_to_service, futures::prelude::*, log::*, std::env, @@ -46,16 +43,7 @@ fn main() -> Result<(), Error> { let mut executor = fasync::Executor::new().context("error creating executor")?; - let mut resolver_registry = ResolverRegistry::new(); - resolver_registry - .register(fuchsia_boot_resolver::SCHEME.to_string(), Box::new(FuchsiaBootResolver::new())); - let pkg_resolver = connect_to_service::<PackageResolverMarker>() - .context("error connecting to package resolver")?; - resolver_registry.register( - fuchsia_pkg_resolver::SCHEME.to_string(), - Box::new(FuchsiaPkgResolver::new(pkg_resolver)), - ); - + let resolver_registry = startup::available_resolvers()?; let params = ModelParams { root_component_uri: opt.root_component_uri, root_resolver_registry: resolver_registry, diff --git a/src/sys/component_manager/src/startup.rs b/src/sys/component_manager/src/startup.rs new file mode 100644 index 0000000000000000000000000000000000000000..9f4b1932235a29598087d5631505c57cab1b8b57 --- /dev/null +++ b/src/sys/component_manager/src/startup.rs @@ -0,0 +1,45 @@ +// Copyright 2019 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. + +use { + crate::{ + fuchsia_boot_resolver::{self, FuchsiaBootResolver}, + fuchsia_pkg_resolver::{self, FuchsiaPkgResolver}, + model::ResolverRegistry, + }, + failure::{Error, ResultExt}, + fidl::endpoints::ServiceMarker, + fidl_fuchsia_pkg::{PackageResolverMarker, PackageResolverProxy}, + fuchsia_component::client::connect_to_service, + std::path::PathBuf, +}; + +pub fn available_resolvers() -> Result<ResolverRegistry, Error> { + let mut resolver_registry = ResolverRegistry::new(); + resolver_registry + .register(fuchsia_boot_resolver::SCHEME.to_string(), Box::new(FuchsiaBootResolver::new())); + + // Add the fuchsia-pkg resolver to the registry if it's available. + if let Some(pkg_resolver) = connect_pkg_resolver()? { + resolver_registry.register( + fuchsia_pkg_resolver::SCHEME.to_string(), + Box::new(FuchsiaPkgResolver::new(pkg_resolver)), + ); + } + + Ok(resolver_registry) +} + +/// Checks if a package resolver service is available through our namespace and connects to it if +/// so. If not availble, returns Ok(None). +fn connect_pkg_resolver() -> Result<Option<PackageResolverProxy>, Error> { + let service_path = PathBuf::from(format!("/svc/{}", PackageResolverMarker::NAME)); + if !service_path.exists() { + return Ok(None); + } + + let pkg_resolver = connect_to_service::<PackageResolverMarker>() + .context("error connecting to package resolver")?; + return Ok(Some(pkg_resolver)); +} diff --git a/src/sys/component_manager/tests/BUILD.gn b/src/sys/component_manager/tests/BUILD.gn index 43236a9828f148d5aeeee3d8d33390815ff52e7c..e0d709a4fd58e0c704944cd5d5856d7ad28728fe 100644 --- a/src/sys/component_manager/tests/BUILD.gn +++ b/src/sys/component_manager/tests/BUILD.gn @@ -127,3 +127,25 @@ test_package("elf_runner_test") { }, ] } + +rustc_binary("no_pkg_resolver_test_bin") { + name = "no_pkg_resolver_test" + edition = "2018" + source_root = "no_pkg_resolver_test.rs" + deps = [ + "//garnet/public/rust/fuchsia-async", + "//src/sys/component_manager:lib", + ] +} + +test_package("no_pkg_resolver_test") { + deps = [ + ":no_pkg_resolver_test_bin", + ] + + tests = [ + { + name = "no_pkg_resolver_test" + }, + ] +} diff --git a/src/sys/component_manager/tests/meta/no_pkg_resolver_test.cmx b/src/sys/component_manager/tests/meta/no_pkg_resolver_test.cmx new file mode 100644 index 0000000000000000000000000000000000000000..6aca1f0c4269b9a8a726a7d9540629e51a2ed450 --- /dev/null +++ b/src/sys/component_manager/tests/meta/no_pkg_resolver_test.cmx @@ -0,0 +1,5 @@ +{ + "program": { + "binary": "test/no_pkg_resolver_test" + } +} diff --git a/src/sys/component_manager/tests/no_pkg_resolver_test.rs b/src/sys/component_manager/tests/no_pkg_resolver_test.rs new file mode 100644 index 0000000000000000000000000000000000000000..ac88965a0f05e965081db1f83ddfd1453852fe4d --- /dev/null +++ b/src/sys/component_manager/tests/no_pkg_resolver_test.rs @@ -0,0 +1,29 @@ +// Copyright 2019 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. + +use { + component_manager_lib::{ + model::{Resolver, ResolverError}, + startup, + }, + fuchsia_async as fasync, +}; + + +fn main() { + run_test(); +} + +fn run_test() { + let mut executor = fasync::Executor::new().expect("Failed to create executor"); + + let resolver_registry = startup::available_resolvers().expect("Failed to get resolvers"); + let result = executor.run_singlethreaded(resolver_registry.resolve("fuchsia-pkg://fuchsia.com/anything#meta/anything.cmx")); + match result { + Err(ResolverError::SchemeNotRegistered) => {}, + _ => { + panic!("Test failed, unexpected result: {:?}", result); + } + } +}