blob: 6f2ba21b77df76b74ffcb2d973f5fe03156b3ea1 [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 fidl_fuchsia_media::AudioRenderUsage;
use fidl_fuchsia_settings::{
AccessibilityRequestStream, AudioRequestStream, DisplayRequestStream,
DoNotDisturbRequestStream, FactoryResetRequestStream, InputRequestStream, IntlRequestStream,
LightRequestStream, NightModeRequestStream, PrivacyRequestStream, SetupRequestStream,
};
use fidl_fuchsia_settings_policy::VolumePolicyControllerRequestStream;
enum Services {
Accessibility(AccessibilityRequestStream),
Audio(AudioRequestStream),
Display(DisplayRequestStream),
DoNotDisturb(DoNotDisturbRequestStream),
FactoryReset(FactoryResetRequestStream),
Input(InputRequestStream),
Intl(IntlRequestStream),
Light(LightRequestStream),
NightMode(NightModeRequestStream),
Privacy(PrivacyRequestStream),
Setup(SetupRequestStream),
VolumePolicy(VolumePolicyControllerRequestStream),
}
struct ExpectedStreamSettingsStruct {
stream: Option<AudioRenderUsage>,
source: Option<fidl_fuchsia_settings::AudioStreamSettingSource>,
level: Option<f32>,
volume_muted: Option<bool>,
input_muted: Option<bool>,
}
const ENV_NAME: &str = "setui_client_test_environment";
/// Creates a service in an environment for a given setting type.
///
/// # Example:
///
/// ```
/// # struct ServiceEnumName {}
/// # enum Request{Watch{responder: ()}, Set{value: (), responder}}
/// setui_client::create_service!(ServiceEnumName,
/// Request::Watch { responder } => {
/// # /*
/// ...
/// # */
/// },
/// Request::Set { value, responder } => {
/// # /*
/// ...
/// # */
/// },
/// # /*
/// ...
/// # */
/// );
/// ```
#[macro_export]
macro_rules! create_service {
($setting_type:path, $( $request:pat => $callback:block ),*) => {{
use uuid::Uuid;
let mut fs = ServiceFs::new();
fs.add_fidl_service($setting_type);
let mut uuid = Uuid::new_v4().to_string();
uuid.push_str(ENV_NAME);
let env = fs.create_nested_environment(&uuid)?;
fasync::Task::spawn(fs.for_each_concurrent(None, move |connection| {
async move {
#[allow(unreachable_patterns)]
match connection {
$setting_type(stream) => {
stream
.err_into::<anyhow::Error>()
.try_for_each(|req| async move {
match req {
$($request => $callback)*
_ => panic!("Incorrect command to service"),
}
Ok(())
})
.unwrap_or_else(|e: anyhow::Error| panic!(
"error running setui server: {:?}",
e
)).await;
}
_ => {
panic!("Unexpected service");
}
}
}
})).detach();
env
}};
}
/// Validate that the results of the call are successful, and in the case of watch,
/// that the first item can be retrieved, but do not analyze the result.
#[macro_export]
macro_rules! assert_successful {
($expr:expr) => {
// We only need an extra check on the watch so we can exercise it at least once.
// The sets already return a result.
if let crate::utils::Either::Watch(mut stream) = $expr.await? {
stream.try_next().await?;
}
};
}
/// Validate that the results of the call are a successful watch and return the
/// first result.
#[macro_export]
macro_rules! assert_watch {
($expr:expr) => {
match $expr.await? {
crate::utils::Either::Watch(mut stream) => {
stream.try_next().await?.expect("Watch should have a result")
}
crate::utils::Either::Set(_) => {
panic!("Did not expect a set result for a watch call")
}
crate::utils::Either::Get(_) => {
panic!("Did not expect a get result for a watch call")
}
}
};
}
/// Validate that the results of the call are a successful set and return the result.
#[macro_export]
macro_rules! assert_set {
($expr:expr) => {
match $expr.await? {
crate::utils::Either::Set(output) => output,
crate::utils::Either::Watch(_) => {
panic!("Did not expect a watch result for a set call")
}
crate::utils::Either::Get(_) => {
panic!("Did not expect a get result for a set call")
}
}
};
}
/// Validate that the results of the call are a successful get and return the result.
#[macro_export]
macro_rules! assert_get {
($expr:expr) => {
match $expr.await? {
crate::utils::Either::Get(output) => output,
crate::utils::Either::Watch(_) => {
panic!("Did not expect a watch result for a get call")
}
crate::utils::Either::Set(_) => {
panic!("Did not expect a set result for a get call")
}
}
};
}
mod accessibility_tests;
mod audio_tests;
mod display_tests;
mod do_not_disturb_tests;
mod factory_reset_tests;
mod input_tests;
mod intl_tests;
mod light_tests;
mod night_mode_tests;
mod privacy_tests;
mod setup_tests;
mod volume_policy_tests;