blob: 59d1d172cc40fb90b5104c6e25105667f2c844b2 [file] [log] [blame]
// 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 crate::display;
use crate::interface_tests::Services;
use crate::interface_tests::ENV_NAME;
use anyhow::{Context as _, Error};
use fidl_fuchsia_settings::{
DisplayMarker, DisplayRequest, DisplaySettings, LightSensorData, LowLightMode, Theme, ThemeType,
};
use fuchsia_async as fasync;
use fuchsia_component::server::ServiceFs;
use futures::prelude::*;
use parking_lot::RwLock;
use std::sync::Arc;
// Can only check one mutate option at once.
async fn validate_display(
expected_brightness: Option<f32>,
expected_auto_brightness: Option<bool>,
expected_auto_brightness_value: Option<f32>,
expected_low_light_mode: Option<LowLightMode>,
expected_theme_type: Option<ThemeType>,
expected_screen_enabled: Option<bool>,
) -> Result<(), Error> {
let env = create_service!(
Services::Display, DisplayRequest::Set { settings, responder, } => {
if let (Some(brightness_value), Some(expected_brightness_value)) =
(settings.brightness_value, expected_brightness) {
assert_eq!(brightness_value, expected_brightness_value);
responder.send(&mut Ok(()))?;
} else if let (Some(auto_brightness), Some(expected_auto_brightness_value)) =
(settings.auto_brightness, expected_auto_brightness) {
assert_eq!(auto_brightness, expected_auto_brightness_value);
responder.send(&mut Ok(()))?;
} else if let (Some(auto_brightness_value), Some(expected_auto_brightness_value)) =
(settings.adjusted_auto_brightness, expected_auto_brightness_value) {
assert_eq!(auto_brightness_value, expected_auto_brightness_value);
responder.send(&mut Ok(()))?;
} else if let (Some(low_light_mode), Some(expected_low_light_mode_value)) =
(settings.low_light_mode, expected_low_light_mode) {
assert_eq!(low_light_mode, expected_low_light_mode_value);
responder.send(&mut Ok(()))?;
} else if let (Some(Theme{ theme_type: Some(theme_type), ..}), Some(expected_theme_type_value)) =
(settings.theme, expected_theme_type) {
assert_eq!(theme_type, expected_theme_type_value);
responder.send(&mut Ok(()))?;
} else if let (Some(screen_enabled), Some(expected_screen_enabled_value)) =
(settings.screen_enabled, expected_screen_enabled) {
assert_eq!(screen_enabled, expected_screen_enabled_value);
responder.send(&mut Ok(()))?;
} else {
panic!("Unexpected call to set");
}
},
DisplayRequest::Watch { responder } => {
responder.send(DisplaySettings {
auto_brightness: Some(false),
adjusted_auto_brightness: Some(0.5),
brightness_value: Some(0.5),
low_light_mode: Some(LowLightMode::Disable),
theme: Some(Theme{theme_type: Some(ThemeType::Default), ..Theme::EMPTY}),
screen_enabled: Some(true),
..DisplaySettings::EMPTY
})?;
}
);
let display_service = env
.connect_to_protocol::<DisplayMarker>()
.context("Failed to connect to display service")?;
assert_successful!(display::command(
display_service,
expected_brightness,
expected_auto_brightness,
expected_auto_brightness_value,
false,
expected_low_light_mode,
Some(Theme { theme_type: expected_theme_type, ..Theme::EMPTY }),
expected_screen_enabled,
));
Ok(())
}
// Can only check one mutate option at once
async fn validate_light_sensor() -> Result<(), Error> {
let watch_called = Arc::new(RwLock::new(false));
let watch_called_clone = watch_called.clone();
let (display_service, mut stream) =
fidl::endpoints::create_proxy_and_stream::<DisplayMarker>().unwrap();
fasync::Task::spawn(async move {
while let Some(request) = stream.try_next().await.unwrap() {
match request {
DisplayRequest::WatchLightSensor { delta: _, responder } => {
*watch_called_clone.write() = true;
responder
.send(LightSensorData {
illuminance_lux: Some(100.0),
color: Some(fidl_fuchsia_ui_types::ColorRgb {
red: 25.0,
green: 16.0,
blue: 59.0,
}),
..LightSensorData::EMPTY
})
.unwrap();
}
_ => {}
}
}
})
.detach();
assert_watch!(display::command(display_service, None, None, None, true, None, None, None));
assert_eq!(*watch_called.read(), true);
Ok(())
}
#[fuchsia_async::run_until_stalled(test)]
async fn test_display() -> Result<(), Error> {
println!("display service tests");
println!(" client calls display watch");
validate_display(None, None, None, None, None, None).await?;
println!(" client calls set brightness");
validate_display(Some(0.5), None, None, None, None, None).await?;
println!(" client calls set auto brightness");
validate_display(None, Some(true), None, None, None, None).await?;
println!(" client calls set auto brightness value");
validate_display(None, None, Some(0.5), None, None, None).await?;
println!(" client calls set low light mode");
validate_display(None, None, None, Some(LowLightMode::Enable), None, None).await?;
println!(" client calls set theme");
validate_display(None, None, None, None, Some(ThemeType::Dark), None).await?;
println!(" client calls set screen enabled");
validate_display(None, None, None, None, Some(ThemeType::Dark), Some(false)).await?;
println!(" client can modify multiple settings");
validate_display(Some(0.3), Some(false), Some(0.8), None, Some(ThemeType::Light), Some(true))
.await?;
println!(" client calls watch light sensor");
validate_light_sensor().await?;
Ok(())
}