blob: 99a31d6cc798ea4da47dc8d4a03739e2e6745171 [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::display::{light_sensor_testing, LIGHT_SENSOR_SERVICE_NAME},
crate::handler::device_storage::testing::InMemoryStorageFactory,
crate::tests::fakes::service_registry::ServiceRegistry,
crate::EnvironmentBuilder,
anyhow::format_err,
fidl::endpoints::ServerEnd,
fidl::Error::ClientChannelClosed,
fidl_fuchsia_settings::*,
fuchsia_zircon as zx,
futures::future::{self, BoxFuture},
std::sync::Arc,
};
const ENV_NAME: &str = "settings_service_light_sensor_test_environment";
const TEST_DELTA: f32 = 0.2;
#[fuchsia_async::run_until_stalled(test)]
async fn test_light_sensor() {
let service_gen = |service_name: &str,
channel: zx::Channel|
-> BoxFuture<'static, Result<(), anyhow::Error>> {
if service_name != LIGHT_SENSOR_SERVICE_NAME {
let service = String::from(service_name);
return Box::pin(async move { Err(format_err!("{:?} unsupported!", service)) });
}
let stream_result =
ServerEnd::<fidl_fuchsia_input_report::InputDeviceMarker>::new(channel).into_stream();
if stream_result.is_err() {
return Box::pin(async { Err(format_err!("could not connect to service")) });
}
let stream = stream_result.unwrap();
let (sensor_axes, data_fn) = light_sensor_testing::get_mock_sensor_response();
light_sensor_testing::spawn_mock_sensor_with_data(stream, sensor_axes, move || {
future::ready(data_fn())
});
Box::pin(async { Ok(()) })
};
let env = EnvironmentBuilder::new(Arc::new(InMemoryStorageFactory::new()))
.service(Box::new(service_gen))
.settings(&[SettingType::LightSensor])
.spawn_and_get_nested_environment(ENV_NAME)
.await
.unwrap();
let display_service = env.connect_to_service::<DisplayMarker>().unwrap();
let data = display_service.watch_light_sensor(TEST_DELTA).await.expect("watch completed");
assert_eq!(data.illuminance_lux, Some(light_sensor_testing::TEST_LUX_VAL as f32));
assert_eq!(
data.color,
Some(fidl_fuchsia_ui_types::ColorRgb {
red: light_sensor_testing::TEST_RED_VAL as f32,
green: light_sensor_testing::TEST_GREEN_VAL as f32,
blue: light_sensor_testing::TEST_BLUE_VAL as f32,
})
);
}
// Tests for light sensor.
#[fuchsia_async::run_until_stalled(test)]
async fn test_watch_light_sensor_no_service_error() {
let expected_error = fuchsia_zircon::Status::UNAVAILABLE;
let env = EnvironmentBuilder::new(Arc::new(InMemoryStorageFactory::new()))
.service(ServiceRegistry::serve(ServiceRegistry::create()))
.settings(&[SettingType::Display])
.spawn_and_get_nested_environment(ENV_NAME)
.await
.unwrap();
let display_service = env.connect_to_service::<DisplayMarker>().unwrap();
let light_sensor_watch_response = display_service.watch_light_sensor(TEST_DELTA).await;
matches::assert_matches!(
light_sensor_watch_response,
Err(ClientChannelClosed { status, .. }) if status == expected_error
);
}