blob: 1d212bdb139987f0cd902d3f2d39e7fb8feac557 [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::agent::camera_watcher::CameraWatcherAgent;
use crate::agent::{Context, Invocation, Lifespan, Payload};
use crate::event::{self, Event};
use crate::message::base::{Audience, MessageEvent, MessengerType};
use crate::service;
use crate::service_context::ServiceContext;
use crate::tests::fakes::camera3_service::Camera3Service;
use crate::tests::fakes::service_registry::ServiceRegistry;
use futures::lock::Mutex;
use futures::StreamExt;
use std::collections::HashSet;
use std::convert::TryFrom;
use std::sync::Arc;
struct FakeServices {
camera3_service: Arc<Mutex<Camera3Service>>,
}
// Returns a registry and input related services with which it is populated.
async fn create_services() -> (Arc<Mutex<ServiceRegistry>>, FakeServices) {
let service_registry = ServiceRegistry::create();
let camera3_service_handle = Arc::new(Mutex::new(Camera3Service::new()));
service_registry.lock().await.register_service(camera3_service_handle.clone());
(service_registry, FakeServices { camera3_service: camera3_service_handle })
}
#[fuchsia_async::run_until_stalled(test)]
async fn test_camera_agent_proxy() {
let service_hub = service::message::create_hub();
// Create the agent receptor for use by the agent.
let agent_receptor = service_hub
.create(MessengerType::Unbound)
.await
.expect("Unable to create agent messenger")
.1;
let signature = agent_receptor.get_signature();
// Create the messenger where we will send the invocations.
let (agent_messenger, _) =
service_hub.create(MessengerType::Unbound).await.expect("Unable to create agent messenger");
// Create the receptor which will receive the broadcast events.
let mut event_receptor = service::build_event_listener(&service_hub).await;
// Create the agent context and agent.
let context = Context::new(agent_receptor, service_hub, HashSet::new(), None).await;
// Setup the fake services.
let (service_registry, fake_services) = create_services().await;
fake_services.camera3_service.lock().await.set_camera_sw_muted(true);
CameraWatcherAgent::create(context).await;
let service_context =
Arc::new(ServiceContext::new(Some(ServiceRegistry::serve(service_registry)), None));
// Create and send the invocation with faked services.
let invocation = Invocation { lifespan: Lifespan::Service, service_context };
let mut reply_receptor = agent_messenger
.message(Payload::Invocation(invocation).into(), Audience::Messenger(signature))
.send();
let mut completion_result = None;
while let Some(event) = reply_receptor.next().await {
if let MessageEvent::Message(payload, _) = event {
if let Ok(Payload::Complete(result)) = Payload::try_from(payload) {
completion_result = Some(result);
break;
}
}
}
// Validate that the setup is complete.
assert!(
matches!(completion_result, Some(Ok(()))),
"Did not receive a completion event from the invocation message"
);
// Track the events to make sure they came in.
let mut camera_state = false;
while let Ok((payload, _)) = event_receptor.next_payload().await {
if let service::Payload::Event(event::Payload::Event(Event::CameraUpdate(event))) = payload
{
match event {
event::camera_watcher::Event::OnSWMuteState(muted) => {
camera_state = muted;
break;
}
}
}
}
// Validate that we received all expected events.
assert!(camera_state);
}