use super::read_network_conn_info;
use crate::client::{Client, ClientConfig};
use eyre::Result;
use sn_interface::types::Keypair;
use std::{sync::Once, time::Duration};
use tempfile::tempdir;
use tracing_core::{Event, Subscriber};
use tracing_subscriber::fmt::time::{FormatTime, SystemTime};
use tracing_subscriber::fmt::{
fmt, format::Writer, FmtContext, FormatEvent, FormatFields, FormattedFields,
};
use tracing_subscriber::{registry::LookupSpan, EnvFilter};
static INIT: Once = Once::new();
#[derive(Default)]
struct MyFormatter;
impl<S, N> FormatEvent<S, N> for MyFormatter
where
S: Subscriber + for<'a> LookupSpan<'a>,
N: for<'a> FormatFields<'a> + 'static,
{
fn format_event(
&self,
ctx: &FmtContext<'_, S, N>,
mut writer: Writer,
event: &Event<'_>,
) -> std::fmt::Result {
let level = *event.metadata().level();
let target = event.metadata().file().expect("will never be `None`");
let span_separation_string = "\t ➤ ";
let time = SystemTime::default();
write!(writer, " {} ", level)?;
time.format_time(&mut writer)?;
writeln!(
writer,
" [{}:L{}]:",
target,
event.metadata().line().expect("will never be `None`"),
)?;
write!(writer, "{}", span_separation_string)?;
ctx.visit_spans(|span| {
write!(writer, "{} ", span.name())?;
let ext = span.extensions();
let fields = &ext
.get::<FormattedFields<N>>()
.expect("will never be `None`");
if !fields.is_empty() {
write!(writer, "{{{}}}", fields)?;
}
write!(writer, "\n{}", span_separation_string)?;
Ok(())
})?;
ctx.field_format().format_fields(writer.by_ref(), event)?;
writeln!(writer)
}
}
pub fn init_test_logger() {
INIT.call_once(|| {
fmt()
.with_thread_names(true)
.with_ansi(false)
.with_env_filter(EnvFilter::from_default_env())
.with_target(false)
.event_format(MyFormatter::default())
.init()
});
}
pub async fn create_test_client() -> Result<Client> {
create_test_client_with(None, None, false).await
}
pub async fn create_test_client_with(
optional_keypair: Option<Keypair>,
timeout: Option<u64>,
read_prefix_map: bool,
) -> Result<Client> {
let root_dir = tempdir().map_err(|e| eyre::eyre!(e.to_string()))?;
let timeout = timeout.map(Duration::from_secs);
let (genesis_key, bootstrap_nodes) = read_network_conn_info()?;
let cmd_ack_wait = None;
let config = ClientConfig::new(
Some(root_dir.path()),
None,
genesis_key,
None,
timeout,
timeout,
cmd_ack_wait,
)
.await;
let client = Client::create_with(
config,
bootstrap_nodes,
optional_keypair.clone(),
read_prefix_map,
)
.await?;
Ok(client)
}