#![cfg(feature = "logging")]
mod stream_a_support;
use stratify::logging::Handle;
use stream_a_support::{file_config, lines_written};
use tempfile::TempDir;
use tracing_subscriber::filter::EnvFilter;
const EVENTS: usize = 500;
fn file_subscriber(dir: &TempDir) -> (Handle, tracing::subscriber::DefaultGuard) {
let (subscriber, handle) = stratify::logging::builder()
.file(file_config(dir.path()))
.with_filter(EnvFilter::new("trace"))
.build()
.expect("build failed");
let default = tracing::subscriber::set_default(subscriber);
(handle, default)
}
fn emit(count: usize, tag: &str) {
for i in 0..count {
tracing::info!(index = i, tag, "flush event");
}
}
#[test]
fn flush_drains_every_queued_event_to_disk_before_returning() {
let dir = TempDir::new().expect("tempdir");
let (handle, _default) = file_subscriber(&dir);
emit(EVENTS, "first");
handle.flush();
let written = lines_written(dir.path());
assert_eq!(
written.len(),
EVENTS,
"flush() returned with {} of {EVENTS} events still queued",
written.len()
);
}
#[test]
fn flush_is_repeatable_and_the_writer_survives_it() {
let dir = TempDir::new().expect("tempdir");
let (handle, _default) = file_subscriber(&dir);
emit(EVENTS, "first");
handle.flush();
let after_first = lines_written(dir.path()).len();
emit(EVENTS, "second");
handle.flush();
let after_second = lines_written(dir.path());
assert_eq!(after_first, EVENTS);
assert_eq!(after_second.len(), EVENTS * 2);
assert!(after_second
.iter()
.any(|l| l.contains("\"tag\":\"second\"")));
}
#[test]
fn flushing_an_empty_queue_is_harmless() {
let dir = TempDir::new().expect("tempdir");
let (handle, _default) = file_subscriber(&dir);
handle.flush();
handle.flush();
emit(1, "after");
handle.flush();
assert_eq!(lines_written(dir.path()).len(), 1);
}
#[test]
fn a_cloned_handle_can_flush() {
let dir = TempDir::new().expect("tempdir");
let (handle, _default) = file_subscriber(&dir);
let clone = handle.clone();
emit(EVENTS, "clone");
clone.flush();
assert_eq!(lines_written(dir.path()).len(), EVENTS);
}
#[test]
fn a_clone_keeps_the_writers_alive_after_the_original_is_dropped() {
let dir = TempDir::new().expect("tempdir");
let (handle, _default) = file_subscriber(&dir);
let clone = handle.clone();
drop(handle);
emit(EVENTS, "after-drop");
clone.flush();
assert_eq!(lines_written(dir.path()).len(), EVENTS);
}