use std::path::PathBuf;
use log::LevelFilter;
use rstest::fixture;
use tempdir::TempDir;
use tokio_util::sync::CancellationToken;
use krossbar_log_lib::Logger as ClientLogger;
use krossbar_logger_lib::{args::Args, logger::Logger};
pub struct Fixture {
socket_path: PathBuf,
_socket_dir: TempDir,
_logs_dir: TempDir,
log_file_path: PathBuf,
cancel_token: CancellationToken,
}
impl Fixture {
pub fn new() -> Self {
let socket_dir =
TempDir::new("logger_socket_dir").expect("Failed to create socket tempdir");
let socket_path: PathBuf = socket_dir.path().join("krossbar_logger.socket");
let logs_dir = TempDir::new("logs").expect("Failed to create tempdir");
let log_file_path = logs_dir.path().join("krossbar.log");
Self {
socket_path,
_socket_dir: socket_dir,
_logs_dir: logs_dir,
log_file_path,
cancel_token: CancellationToken::new(),
}
}
pub async fn start_logger(&self) {
let args = Args {
keep_num_files: 10,
num_bytes_rotate: 1_000_000,
log_location: self
.log_file_path
.to_owned()
.into_os_string()
.into_string()
.unwrap(),
log_level: LevelFilter::Trace,
};
let token = self.cancel_token.clone();
let socket_path: PathBuf = self.socket_path.clone().into();
tokio::spawn(async move {
tokio::select! {
_ = Logger::new(args, socket_path).run() => {}
_ = token.cancelled() => {}
}
});
}
pub fn cancel(&self) {
self.cancel_token.cancel()
}
pub fn logger_socket_path(&self) -> &PathBuf {
&self.socket_path
}
pub fn log_file_path(&self) -> &PathBuf {
&self.log_file_path
}
}
#[fixture]
pub fn make_fixture() -> Fixture {
Fixture::new()
}
pub async fn init_client_logger(logger_sock: PathBuf) {
let logger = Box::new(
ClientLogger::new(
"test.log.service",
LevelFilter::Debug,
true,
Some(logger_sock),
)
.await
.unwrap(),
);
tokio::spawn(logger.run());
}