blob: 1bc2d46b85f8f34f20c1f6646ac7c431429b6eb9 [file] [log] [blame]
// 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::agent::storage::storage_factory::testing::InMemoryStorageFactory;
use crate::ingress::fidl::Interface;
use crate::setup::types::{ConfigurationInterfaceFlags, SetupInfo};
use crate::tests::fakes::hardware_power_statecontrol_service::{
Action, HardwarePowerStatecontrolService,
};
use crate::tests::fakes::service_registry::ServiceRegistry;
use crate::EnvironmentBuilder;
use fidl_fuchsia_settings::*;
use futures::lock::Mutex;
use std::sync::Arc;
const ENV_NAME: &str = "settings_service_setup_test_environment";
// Ensures the default value returned is WiFi.
#[fuchsia_async::run_until_stalled(test)]
async fn test_setup_default() {
let env = EnvironmentBuilder::new(Arc::new(InMemoryStorageFactory::new()))
.fidl_interfaces(&[Interface::Setup])
.spawn_and_get_nested_environment(ENV_NAME)
.await
.unwrap();
let setup_service = env.connect_to_protocol::<SetupMarker>().unwrap();
// Ensure retrieved value matches default value
let settings = setup_service.watch().await.expect("watch completed");
assert_eq!(
settings.enabled_configuration_interfaces,
Some(fidl_fuchsia_settings::ConfigurationInterfaces::WIFI)
);
}
// Setup doesn't rely on any service yet. In the future this test will be
// updated to verify restart request is made on interface change.
#[fuchsia_async::run_until_stalled(test)]
async fn test_setup_with_reboot() {
// Prepopulate initial value
let initial_data = SetupInfo {
configuration_interfaces: ConfigurationInterfaceFlags::WIFI
| ConfigurationInterfaceFlags::ETHERNET,
};
// Ethernet and WiFi is written out as initial value since the default
// is currently WiFi only.
let storage_factory = Arc::new(InMemoryStorageFactory::with_initial_data(&initial_data));
let service_registry = ServiceRegistry::create();
let hardware_power_statecontrol_service_handle =
Arc::new(Mutex::new(HardwarePowerStatecontrolService::new()));
service_registry
.lock()
.await
.register_service(hardware_power_statecontrol_service_handle.clone());
// Handle reboot
let env = EnvironmentBuilder::new(Arc::clone(&storage_factory))
.service(ServiceRegistry::serve(service_registry.clone()))
.fidl_interfaces(&[Interface::Setup])
.spawn_and_get_nested_environment(ENV_NAME)
.await
.unwrap();
let setup_service = env.connect_to_protocol::<SetupMarker>().unwrap();
// Ensure retrieved value matches set value
let settings = setup_service.watch().await.expect("watch completed");
assert_eq!(
settings.enabled_configuration_interfaces,
Some(
fidl_fuchsia_settings::ConfigurationInterfaces::WIFI
| fidl_fuchsia_settings::ConfigurationInterfaces::ETHERNET
)
);
let expected_interfaces = fidl_fuchsia_settings::ConfigurationInterfaces::ETHERNET;
// Ensure setting interface propagates change correctly
let mut setup_settings = fidl_fuchsia_settings::SetupSettings::EMPTY;
setup_settings.enabled_configuration_interfaces = Some(expected_interfaces);
setup_service.set(setup_settings, true).await.expect("set completed").expect("set successful");
// Ensure retrieved value matches set value
let settings = setup_service.watch().await.expect("watch completed");
assert_eq!(settings.enabled_configuration_interfaces, Some(expected_interfaces));
let store = storage_factory.get_device_storage().await;
// Check to make sure value wrote out to store correctly
assert_eq!(
store.get::<SetupInfo>().await.configuration_interfaces,
ConfigurationInterfaceFlags::ETHERNET
);
// Ensure reboot was requested by the controller
assert!(hardware_power_statecontrol_service_handle
.lock()
.await
.verify_action_sequence([Action::Reboot].to_vec()));
}
#[fuchsia_async::run_until_stalled(test)]
async fn test_setup_no_reboot_with_set() {
let service_registry = ServiceRegistry::create();
let hardware_power_statecontrol_service_handle =
Arc::new(Mutex::new(HardwarePowerStatecontrolService::new()));
service_registry
.lock()
.await
.register_service(hardware_power_statecontrol_service_handle.clone());
let env = EnvironmentBuilder::new(Arc::new(InMemoryStorageFactory::new()))
.fidl_interfaces(&[Interface::Setup])
.spawn_and_get_nested_environment(ENV_NAME)
.await
.unwrap();
let setup_service = env.connect_to_protocol::<SetupMarker>().unwrap();
// Ensure retrieved value matches set value
let settings = setup_service.watch().await.expect("watch completed");
assert_eq!(
settings.enabled_configuration_interfaces,
Some(fidl_fuchsia_settings::ConfigurationInterfaces::WIFI)
);
let expected_interfaces = fidl_fuchsia_settings::ConfigurationInterfaces::ETHERNET;
// Ensure setting interface propagates change correctly
let mut setup_settings = fidl_fuchsia_settings::SetupSettings::EMPTY;
setup_settings.enabled_configuration_interfaces = Some(expected_interfaces);
setup_service.set(setup_settings, false).await.expect("set completed").expect("set successful");
// Ensure retrieved value matches set value
let settings = setup_service.watch().await.expect("watch completed");
assert_eq!(settings.enabled_configuration_interfaces, Some(expected_interfaces));
// No reboot is called.
assert!(hardware_power_statecontrol_service_handle
.lock()
.await
.verify_action_sequence([].to_vec()));
}