blob: e55bf6d10cc78f4d3872499200de54f8bd91a3a5 [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::{constants::*, test_topology};
use diagnostics_data::LogsData;
use diagnostics_hierarchy::assert_data_tree;
use diagnostics_reader::{ArchiveReader, Error, Logs, Severity};
use fidl_fuchsia_diagnostics::{
ArchiveAccessorMarker, Interest, LogInterestSelector, LogSettingsMarker,
Severity as FidlSeverity,
};
use futures::{Stream, StreamExt};
use selectors::{self, VerboseError};
#[fuchsia::test]
async fn register_interest() {
let (builder, test_realm) = test_topology::create(test_topology::Options::default())
.await
.expect("create test topology");
test_topology::add_eager_child(&test_realm, "child", LOGGER_COMPONENT_FOR_INTEREST_URL)
.await
.expect("add child");
let instance = builder.build().await.expect("create instance");
let accessor = instance
.root
.connect_to_protocol_at_exposed_dir::<ArchiveAccessorMarker>()
.expect("connect to archive accessor");
let mut logs = ArchiveReader::new()
.with_archive(accessor)
.snapshot_then_subscribe::<Logs>()
.expect("subscribe to logs");
let log_settings = instance
.root
.connect_to_protocol_at_exposed_dir::<LogSettingsMarker>()
.expect("connect to log settings");
let expected_logs = vec![
(Severity::Debug, "debug msg"),
(Severity::Info, "info msg"),
(Severity::Warn, "warn msg"),
(Severity::Error, "error msg"),
];
let selector = selectors::parse_component_selector::<VerboseError>(&format!(
"realm_builder\\:{}/test/child",
instance.root.child_name()
))
.unwrap();
// 1. Assert logs for default interest registration (info)
assert_messages(&mut logs, &expected_logs[1..]).await;
// 2. Interest registration with min_severity = debug
let mut interests = vec![LogInterestSelector {
selector: selector.clone(),
interest: Interest { min_severity: Some(FidlSeverity::Debug), ..Interest::EMPTY },
}];
log_settings.register_interest(&mut interests.iter_mut()).expect("registered interest");
// 3. Assert logs
assert_messages(&mut logs, &expected_logs).await;
// 4. Interest registration with min_severity = warn
let mut interests = vec![LogInterestSelector {
selector,
interest: Interest { min_severity: Some(FidlSeverity::Warn), ..Interest::EMPTY },
}];
log_settings.register_interest(&mut interests.iter_mut()).expect("registered interest");
// 5. Assert logs
assert_messages(&mut logs, &expected_logs[2..]).await;
// 6. Disconnecting the protocol, brings back an EMPTY interest, which defaults to INFO.
drop(log_settings);
assert_messages(&mut logs, &expected_logs[1..]).await;
}
async fn assert_messages<S>(mut logs: S, messages: &[(Severity, &str)])
where
S: Stream<Item = Result<LogsData, Error>> + std::marker::Unpin,
{
for (expected_severity, expected_msg) in messages {
let log = logs.next().await.expect("got log response").expect("log isn't an error");
assert_eq!(log.metadata.component_url, Some(LOGGER_COMPONENT_FOR_INTEREST_URL.to_string()));
assert_eq!(log.metadata.severity, *expected_severity);
assert_data_tree!(log.payload.unwrap(), root: contains {
message: {
value: expected_msg.to_string(),
}
});
}
}