blob: 2eac96440227a6d99f11864d4ce069225444b3db [file] [log] [blame]
// Copyright 2018 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.
#![deny(warnings)]
// dummy main. We do not copy this binary to fuchsia, only tests.
fn main() {}
#[cfg(test)]
mod tests {
use fidl_fuchsia_logger::{LogFilterOptions, LogLevelFilter, LogMessage};
use fuchsia_async as fasync;
use fuchsia_syslog::{self as syslog, fx_log_info};
use fuchsia_syslog_listener::{self as syslog_listener, LogProcessor};
use fuchsia_zircon::DurationNum;
use futures::TryFutureExt;
use log::warn;
use parking_lot::Mutex;
use std::sync::Arc;
use std::vec::Vec;
struct Listener {
log_messages: Arc<Mutex<Vec<LogMessage>>>,
}
impl LogProcessor for Listener {
fn log(&mut self, message: LogMessage) {
self.log_messages.lock().push(message);
}
fn done(&mut self) {
panic!("this should not be called");
}
}
fn run_listener(tag: String) -> Arc<Mutex<Vec<LogMessage>>> {
let mut options = LogFilterOptions {
filter_by_pid: false,
pid: 0,
min_severity: LogLevelFilter::None,
verbosity: 0,
filter_by_tid: false,
tid: 0,
tags: vec![tag],
};
let logs = Arc::new(Mutex::new(Vec::new()));
let l = Listener {
log_messages: logs.clone(),
};
let listener_fut = syslog_listener::run_log_listener(l, Some(&mut options), false)
.expect("failed to register listener");
fasync::spawn(listener_fut.unwrap_or_else(|e| {
panic!("test fail {:?}", e);
}));
return logs;
}
#[test]
fn test_full_stack() {
let mut executor = fasync::Executor::new().unwrap();
let random = rand::random::<u16>();
let tag = "logger_integration_rust".to_string() + &random.to_string();
syslog::init_with_tags(&[&tag]).expect("should not fail");
let logs = run_listener(tag.clone());
fx_log_info!("my msg: {}", 10);
warn!("log crate: {}", 20);
let tries = 50;
for _ in 0..tries {
if logs.lock().len() >= 2 {
break;
}
let timeout = fasync::Timer::new(100.millis().after_now());
executor.run_singlethreaded(timeout);
}
let logs = logs.lock();
assert_eq!(2, logs.len());
assert_eq!(logs[0].tags, vec![tag.clone()]);
assert_eq!(logs[0].severity, LogLevelFilter::Info as i32);
assert_eq!(logs[0].msg, "my msg: 10");
assert_eq!(logs[1].tags[0], tag.clone());
assert_eq!(logs[1].severity, LogLevelFilter::Warn as i32);
assert_eq!(logs[1].msg, "log crate: 20");
}
}