blob: e0a948729ec4fb0941c53adba0f57ce21fd61d63 [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::storage::device_storage::{
DeviceStorage, DeviceStorageAccess, DeviceStorageCompatible,
};
use crate::agent::storage::storage_factory::testing::InMemoryStorageFactory;
use crate::agent::storage::storage_factory::DeviceStorageFactory;
use crate::base::{SettingInfo, SettingType, UnknownInfo};
use crate::message::base::{Audience, MessengerType};
use crate::service::{self, Address};
use crate::storage::{Payload, StorageInfo, StorageRequest, StorageResponse, UpdateState};
use crate::EnvironmentBuilder;
use assert_matches::assert_matches;
use std::sync::Arc;
const ENV_NAME: &str = "storage_agent_test_environment";
const ORIGINAL_VALUE: bool = true;
struct TestAccess;
impl DeviceStorageAccess for TestAccess {
const STORAGE_KEYS: &'static [&'static str] = &[UnknownInfo::KEY];
}
async fn create_test_environment() -> (service::message::Delegate, Arc<DeviceStorage>) {
let storage_factory = Arc::new(InMemoryStorageFactory::new());
storage_factory
.initialize::<TestAccess>()
.await
.expect("Should be able to initialize unknown info");
let env =
EnvironmentBuilder::new(Arc::clone(&storage_factory)).spawn_nested(ENV_NAME).await.unwrap();
let store = storage_factory.get_store().await;
let _ = store.write(&UnknownInfo(ORIGINAL_VALUE)).await.expect("Write should succeed");
(env.delegate, store)
}
// Assert that we can read values by sending messages to the storage agent and receive a response.
#[fuchsia_async::run_until_stalled(test)]
async fn test_read() {
let (delegate, _) = create_test_environment().await;
let (messenger, _) =
delegate.create(MessengerType::Unbound).await.expect("should be able to get messenger");
let mut receptor = messenger
.message(
service::Payload::Storage(Payload::Request(StorageRequest::Read(
SettingType::Unknown.into(),
0,
))),
Audience::Address(Address::Storage),
)
.send();
assert_matches!(receptor.next_of::<Payload>().await,
Ok((
Payload::Response(StorageResponse::Read(StorageInfo::SettingInfo(
SettingInfo::Unknown(UnknownInfo(value))
))),
_
)) if value == ORIGINAL_VALUE);
}
// Assert that we can write values by sending messages to the storage agent and seeing a response
// and the value in the in memory storage.
#[fuchsia_async::run_until_stalled(test)]
async fn test_write() {
const CHANGED_VALUE: bool = false;
let (service_delegate, store) = create_test_environment().await;
// Validate original value before the write request.
let UnknownInfo(value) = store.get::<UnknownInfo>().await;
assert_eq!(ORIGINAL_VALUE, value);
let (messenger, _) = service_delegate
.create(MessengerType::Unbound)
.await
.expect("should be able to get messenger");
let mut receptor = messenger
.message(
service::Payload::Storage(Payload::Request(StorageRequest::Write(
SettingInfo::Unknown(UnknownInfo(CHANGED_VALUE)).into(),
0,
))),
Audience::Address(Address::Storage),
)
.send();
assert_matches!(
receptor.next_of::<Payload>().await,
Ok((Payload::Response(StorageResponse::Write(Ok(UpdateState::Updated)),), _))
);
let UnknownInfo(value) = store.get::<UnknownInfo>().await;
assert_eq!(CHANGED_VALUE, value);
}