// 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");
    }
}
