| // Copyright 2021 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 { |
| anyhow::{Context, Result}, |
| fidl_fuchsia_driver_development as fdd, fidl_fuchsia_driver_test as fdt, |
| fidl_fuchsia_io as fio, fuchsia_async as fasync, |
| fuchsia_component_test::RealmBuilder, |
| fuchsia_driver_test::{DriverTestRealmBuilder, DriverTestRealmInstance}, |
| }; |
| |
| async fn get_driver_info( |
| service: &fdd::DriverDevelopmentProxy, |
| driver_filter: &mut dyn ExactSizeIterator<Item = &str>, |
| ) -> Result<Vec<fdd::DriverInfo>> { |
| let (iterator, iterator_server) = |
| fidl::endpoints::create_proxy::<fdd::DriverInfoIteratorMarker>()?; |
| |
| service |
| .get_driver_info(driver_filter, iterator_server) |
| .context("FIDL call to get driver info failed")?; |
| |
| let mut info_result = Vec::new(); |
| loop { |
| let mut driver_info = |
| iterator.get_next().await.context("FIDL call to get driver info failed")?; |
| if driver_info.len() == 0 { |
| break; |
| } |
| info_result.append(&mut driver_info) |
| } |
| Ok(info_result) |
| } |
| |
| #[fasync::run_singlethreaded(test)] |
| async fn test_smoke_test() -> Result<()> { |
| let realm = RealmBuilder::new().await?; |
| realm.driver_test_realm_setup().await?; |
| |
| let instance = realm.build().await?; |
| |
| instance.driver_test_realm_start(fdt::RealmArgs::EMPTY).await?; |
| |
| // Connect to a protocol to ensure that it starts, then immediately exit. |
| let _ = instance.root.connect_to_protocol_at_exposed_dir::<fdd::DriverDevelopmentMarker>()?; |
| Ok(()) |
| } |
| |
| // Run DriverTestRealm with no arguments and see that the drivers in our package |
| // are loaded. |
| #[fasync::run_singlethreaded(test)] |
| async fn test_empty_args() -> Result<()> { |
| let realm = RealmBuilder::new().await?; |
| realm.driver_test_realm_setup().await?; |
| |
| let instance = realm.build().await?; |
| |
| instance.driver_test_realm_start(fdt::RealmArgs::EMPTY).await?; |
| |
| let driver_dev = |
| instance.root.connect_to_protocol_at_exposed_dir::<fdd::DriverDevelopmentMarker>()?; |
| |
| let info = get_driver_info(&driver_dev, &mut std::iter::empty()).await?; |
| assert!(info |
| .iter() |
| .any(|d| d.url == Some("fuchsia-boot:///#meta/test-parent-sys.cm".to_string()))); |
| assert!(info.iter().any(|d| d.url == Some("fuchsia-boot:///#meta/test.cm".to_string()))); |
| |
| Ok(()) |
| } |
| |
| // Manually open our /pkg directory and pass it to DriverTestRealm to see that it works. |
| #[fasync::run_singlethreaded(test)] |
| async fn test_pkg_dir() -> Result<()> { |
| let realm = RealmBuilder::new().await?; |
| realm.driver_test_realm_setup().await?; |
| |
| let instance = realm.build().await?; |
| |
| let (pkg, pkg_server) = fidl::endpoints::create_endpoints::<fio::DirectoryMarker>()?; |
| let pkg_flags = fuchsia_fs::OpenFlags::RIGHT_READABLE |
| | fuchsia_fs::OpenFlags::RIGHT_EXECUTABLE |
| | fio::OpenFlags::DIRECTORY; |
| fuchsia_fs::connect_in_namespace("/pkg", pkg_server.into_channel(), pkg_flags).unwrap(); |
| let args = fdt::RealmArgs { boot: Some(pkg), ..fdt::RealmArgs::EMPTY }; |
| |
| instance.driver_test_realm_start(args).await?; |
| |
| let driver_dev = |
| instance.root.connect_to_protocol_at_exposed_dir::<fdd::DriverDevelopmentMarker>()?; |
| |
| let info = get_driver_info(&driver_dev, &mut std::iter::empty()).await?; |
| assert!(info |
| .iter() |
| .any(|d| d.url == Some("fuchsia-boot:///#meta/test-parent-sys.cm".to_string()))); |
| assert!(info.iter().any(|d| d.url == Some("fuchsia-boot:///#meta/test.cm".to_string()))); |
| |
| let dev = instance.driver_test_realm_connect_to_dev()?; |
| device_watcher::recursive_wait_and_open_node(&dev, "sys/test/test").await?; |
| |
| Ok(()) |
| } |
| |
| #[fasync::run_singlethreaded(test)] |
| async fn test_root_driver() -> Result<()> { |
| let realm = RealmBuilder::new().await?; |
| realm.driver_test_realm_setup().await?; |
| |
| let instance = realm.build().await?; |
| let args = fdt::RealmArgs { |
| root_driver: Some("fuchsia-boot:///#driver/platform-bus.so".to_string()), |
| ..fdt::RealmArgs::EMPTY |
| }; |
| |
| instance.driver_test_realm_start(args).await?; |
| |
| let dev = instance.driver_test_realm_connect_to_dev()?; |
| device_watcher::recursive_wait_and_open_node(&dev, "sys/platform").await?; |
| |
| Ok(()) |
| } |