blob: daf4f4f4895b528588c0c2c5bc33441ffc6d737f [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::base::SettingType,
crate::handler::device_storage::testing::InMemoryStorageFactory,
crate::setup::types::{ConfigurationInterfaceFlags, SetupInfo},
crate::tests::fakes::hardware_power_statecontrol_service::{
Action, HardwarePowerStatecontrolService,
},
crate::tests::fakes::service_registry::ServiceRegistry,
crate::EnvironmentBuilder,
fidl_fuchsia_settings::*,
futures::lock::Mutex,
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()))
.settings(&[SettingType::Setup, SettingType::Power])
.spawn_and_get_nested_environment(ENV_NAME)
.await
.unwrap();
let setup_service = env.connect_to_service::<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()))
.settings(&[SettingType::Setup, SettingType::Power])
.spawn_and_get_nested_environment(ENV_NAME)
.await
.unwrap();
let setup_service = env.connect_to_service::<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).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() {
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()))
.settings(&[SettingType::Setup, SettingType::Power])
.spawn_and_get_nested_environment(ENV_NAME)
.await
.unwrap();
let setup_service = env.connect_to_service::<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
.set2(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()));
}