#![cfg(all(feature = "build_with_queue", feature = "async_embedded"))]
extern crate syslog_rs;
use syslog_rs::{formatters::DefaultSyslogFormatter, sync::DefaultQueueAdapter, LogFacility, LogStat, Priority, QueuedSyslog};
use syslog_rs::DefaultLocalSyslogDestination;
#[test]
fn test_multithreading()
{
use std::sync::Arc;
use std::thread;
use std::time::{Instant, Duration};
use syslog_rs::LOG_MASK;
let log =
QueuedSyslog
::<DefaultQueueAdapter, DefaultSyslogFormatter, DefaultLocalSyslogDestination>
::openlog_with(
Some("test5"),
LogStat::LOG_CONS | LogStat::LOG_NDELAY | LogStat::LOG_PID,
LogFacility::LOG_DAEMON, DefaultLocalSyslogDestination::new()
);
assert_eq!(log.is_ok(), true, "{}", log.err().unwrap());
let log = Arc::new(log.unwrap());
let c1_log = log.clone();
let c2_log = log.clone();
thread::spawn(move|| {
for i in 0..5
{
thread::sleep(Duration::from_nanos(200));
let now = Instant::now();
c1_log.syslog(Priority::LOG_DEBUG,
format!("a message from thread 1 #{}[]", i).into()).unwrap();
let elapsed = now.elapsed();
println!("t1: {:?}", elapsed);
}
});
thread::spawn(move|| {
for i in 0..5
{
thread::sleep(Duration::from_nanos(201));
let now = Instant::now();
c2_log.syslog(Priority::LOG_DEBUG,
format!("きるさお命泉ぶねりよ日子金れっ {}", i).into()).unwrap();
let elapsed = now.elapsed();
println!("t2: {:?}", elapsed);
}
});
let res = log.setlogmask(!LOG_MASK!(Priority::LOG_ERR));
assert_eq!(res.is_ok(), true, "{}", res.err().unwrap());
assert_eq!(res.unwrap(), 0xff, "should be 0xff");
let now = Instant::now();
log.syslog(Priority::LOG_DEBUG,
format!("A message from main, сообщение от главнюка").into()).unwrap();
let elapsed = now.elapsed();
println!("main: {:?}", elapsed);
thread::sleep(Duration::from_secs(2));
let _ = log.closelog();
thread::sleep(Duration::from_millis(500));
let res = log.setlogmask(!LOG_MASK!(Priority::LOG_ERR));
assert_eq!(res.is_ok(), true);
return;
}
#[cfg(feature = "build_ext_file")]
#[test]
fn test_file_multithreading()
{
use std::sync::Arc;
use std::thread;
use std::time::{Instant, Duration};
use syslog_rs::formatters::DefaultSyslogFormatterFile;
use syslog_rs::{SyslogFile, LOG_MASK};
let log =
QueuedSyslog
::<DefaultQueueAdapter, DefaultSyslogFormatterFile, SyslogFile>
::openlog_with(
Some("test2"),
LogStat::LOG_CONS | LogStat::LOG_NDELAY | LogStat::LOG_PID,
LogFacility::LOG_DAEMON,
SyslogFile::new("/tmp/syslog_rs_test2.log")
);
assert_eq!(log.is_ok(), true, "{}", log.err().unwrap());
let log = Arc::new(log.unwrap());
let c1_log = log.clone();
let c2_log = log.clone();
thread::spawn(move|| {
for i in 0..5
{
thread::sleep(Duration::from_nanos(200));
let now = Instant::now();
c1_log.syslog(Priority::LOG_ALERT,
format!("a message from thread 1 #{}[]", i).into()).unwrap();
let elapsed = now.elapsed();
println!("t1: {:?}", elapsed);
}
});
thread::spawn(move|| {
for i in 0..5
{
thread::sleep(Duration::from_nanos(201));
let now = Instant::now();
c2_log.syslog(Priority::LOG_DEBUG,
format!("きるさお命泉ぶねりよ日子金れっ {}", i).into()).unwrap();
let elapsed = now.elapsed();
println!("t2: {:?}", elapsed);
}
});
let res = log.setlogmask(!LOG_MASK!(Priority::LOG_ERR));
assert_eq!(res.is_ok(), true, "{}", res.err().unwrap());
assert_eq!(res.unwrap(), 0xff, "should be 0xff");
let now = Instant::now();
log.syslog(Priority::LOG_DEBUG,
format!("A message from main, きるさお命泉ぶねりよ日子金れっ").into()).unwrap();
let elapsed = now.elapsed();
println!("main: {:?}", elapsed);
thread::sleep(Duration::from_secs(2));
let _ = log.closelog();
thread::sleep(Duration::from_millis(500));
let res = log.setlogmask(!LOG_MASK!(Priority::LOG_ERR));
assert_eq!(res.is_ok(), true);
return;
}