Skip to content

Commit 0500b33

Browse files
committed
melib: log to stderr for binary tests
Binary tests don't have cfg(test) set, so they log to user log file ($HOME/.local/share/meli/meli.log by default). Change StderrLogger constructor to allow for passing a test boolean argument. Signed-off-by: Manos Pitsidianakis <[email protected]>
1 parent c5fcd7b commit 0500b33

File tree

6 files changed

+83
-49
lines changed

6 files changed

+83
-49
lines changed

melib/src/utils/logging.rs

Lines changed: 77 additions & 43 deletions
Original file line numberDiff line numberDiff line change
@@ -19,10 +19,10 @@
1919
* along with meli. If not, see <http://www.gnu.org/licenses/>.
2020
*/
2121

22-
#[cfg(not(test))]
23-
use std::fs::{File, OpenOptions};
2422
use std::{
23+
fs::{File, OpenOptions},
2524
io::{BufWriter, Write},
25+
ops::DerefMut,
2626
path::PathBuf,
2727
sync::{
2828
atomic::{AtomicU8, Ordering},
@@ -134,11 +134,35 @@ pub enum Destination {
134134
None,
135135
}
136136

137+
enum Writer {
138+
Stderr(BufWriter<std::io::Stderr>),
139+
File(BufWriter<std::fs::File>),
140+
}
141+
142+
impl std::ops::Deref for Writer {
143+
type Target = dyn std::io::Write;
144+
145+
#[inline]
146+
fn deref(&self) -> &Self::Target {
147+
match self {
148+
Self::Stderr(ref inner) => inner,
149+
Self::File(ref inner) => inner,
150+
}
151+
}
152+
}
153+
154+
impl std::ops::DerefMut for Writer {
155+
#[inline]
156+
fn deref_mut(&mut self) -> &mut Self::Target {
157+
match self {
158+
Self::Stderr(ref mut inner) => inner,
159+
Self::File(ref mut inner) => inner,
160+
}
161+
}
162+
}
163+
137164
struct FileOutput {
138-
#[cfg(test)]
139-
writer: BufWriter<std::io::Stderr>,
140-
#[cfg(not(test))]
141-
writer: BufWriter<std::fs::File>,
165+
writer: Writer,
142166
path: PathBuf,
143167
}
144168

@@ -169,13 +193,23 @@ impl Default for StderrLogger {
169193
}
170194

171195
impl StderrLogger {
172-
pub fn new(level: LogLevel) -> Self {
196+
pub fn new_with(level: LogLevel, test: bool) -> Self {
173197
use std::sync::Once;
174198

175199
static INIT_STDERR_LOGGING: Once = Once::new();
176200

177-
#[cfg(not(test))]
178-
let logger = {
201+
let logger = if test {
202+
Self {
203+
dest: Arc::new(Mutex::new(FileOutput {
204+
writer: Writer::Stderr(BufWriter::new(std::io::stderr())),
205+
path: PathBuf::new(),
206+
})),
207+
level: Arc::new(AtomicU8::new(level as u8)),
208+
print_level: true,
209+
print_module_names: true,
210+
debug_dest: Destination::Stderr,
211+
}
212+
} else {
179213
#[inline(always)]
180214
fn __inline_err_wrap() -> Result<(PathBuf, File), Box<dyn std::error::Error>> {
181215
let data_dir = xdg::BaseDirectories::with_prefix("meli")?;
@@ -190,7 +224,7 @@ impl StderrLogger {
190224
__inline_err_wrap().expect("Could not create log file in XDG_DATA_DIR");
191225
Self {
192226
dest: Arc::new(Mutex::new(FileOutput {
193-
writer: BufWriter::new(log_file),
227+
writer: Writer::File(BufWriter::new(log_file)),
194228
path,
195229
})),
196230
level: Arc::new(AtomicU8::new(level as u8)),
@@ -203,53 +237,50 @@ impl StderrLogger {
203237
},
204238
}
205239
};
206-
#[cfg(test)]
207-
let logger = {
208-
Self {
209-
dest: Arc::new(Mutex::new(FileOutput {
210-
writer: BufWriter::new(std::io::stderr()),
211-
path: PathBuf::new(),
212-
})),
213-
level: Arc::new(AtomicU8::new(level as u8)),
214-
print_level: true,
215-
print_module_names: true,
216-
debug_dest: Destination::Stderr,
217-
}
218-
};
219240

220-
#[cfg(feature = "debug-tracing")]
221-
log::set_max_level(
222-
if matches!(LevelFilter::from(logger.log_level()), LevelFilter::Off) {
223-
LevelFilter::Off
224-
} else {
225-
LevelFilter::Trace
226-
},
227-
);
228-
#[cfg(not(feature = "debug-tracing"))]
229-
log::set_max_level(LevelFilter::from(logger.log_level()));
241+
if cfg!(feature = "debug-tracing") {
242+
log::set_max_level(
243+
if matches!(LevelFilter::from(logger.log_level()), LevelFilter::Off) {
244+
LevelFilter::Off
245+
} else {
246+
LevelFilter::Trace
247+
},
248+
)
249+
} else {
250+
log::set_max_level(LevelFilter::from(logger.log_level()));
251+
}
230252

231253
INIT_STDERR_LOGGING.call_once(|| {
232254
log::set_boxed_logger(Box::new(logger.clone())).unwrap();
233255
});
234256
logger
235257
}
236258

259+
pub fn new(level: LogLevel) -> Self {
260+
Self::new_with(level, cfg!(test))
261+
}
262+
237263
pub fn log_level(&self) -> LogLevel {
238264
self.level.load(Ordering::SeqCst).into()
239265
}
240266

241-
#[cfg(not(test))]
242267
pub fn change_log_dest(&self, path: PathBuf) {
243268
use crate::utils::shellexpand::ShellExpandTrait;
244269

245270
let path = path.expand(); // expand shell stuff
246271
let mut dest = self.dest.lock().unwrap();
247272
*dest = FileOutput {
248-
writer: BufWriter::new(OpenOptions::new().append(true) /* writes will append to a file instead of overwriting previous contents */
249-
.create(true) /* a new file will be created if the file does not yet already exist.*/
250-
.read(true)
251-
.open(&path).unwrap()),
252-
path
273+
writer: Writer::File(BufWriter::new(
274+
OpenOptions::new()
275+
/* writes will append to a file instead of overwriting previous contents */
276+
.append(true)
277+
/* a new file will be created if the file does not yet already exist. */
278+
.create(true)
279+
.read(true)
280+
.open(&path)
281+
.unwrap(),
282+
)),
283+
path,
253284
};
254285
}
255286

@@ -275,7 +306,7 @@ impl Log for StderrLogger {
275306
}
276307

277308
fn write(
278-
writer: &mut impl Write,
309+
writer: &mut (impl Write + ?Sized),
279310
record: &Record,
280311
(print_level, print_module_names): (bool, bool),
281312
) -> Option<()> {
@@ -299,7 +330,10 @@ impl Log for StderrLogger {
299330
if matches!(record.metadata(), m if (m.target().starts_with("isahc::handler") || m.target().starts_with("isahc::wire")) && m.level() >= Level::Debug)
300331
&& matches!(record.args().to_string(), s if s.contains("Bearer") || s.contains("Basic"))
301332
{
302-
fn redact_http_auth(writer: &mut impl Write, record: &Record) -> Option<()> {
333+
fn redact_http_auth(
334+
writer: &mut (impl Write + ?Sized),
335+
record: &Record,
336+
) -> Option<()> {
303337
use std::borrow::Cow;
304338

305339
use regex::Regex;
@@ -341,7 +375,7 @@ impl Log for StderrLogger {
341375
(Destination::None | Destination::File, _) => {
342376
_ = self.dest.lock().ok().and_then(|mut d| {
343377
write(
344-
&mut d.writer,
378+
d.writer.deref_mut(),
345379
record,
346380
(self.print_level, self.print_module_names),
347381
)
@@ -350,7 +384,7 @@ impl Log for StderrLogger {
350384
(Destination::Stderr, true) => {
351385
_ = self.dest.lock().ok().and_then(|mut d| {
352386
write(
353-
&mut d.writer,
387+
d.writer.deref_mut(),
354388
record,
355389
(self.print_level, self.print_module_names),
356390
)

melib/tests/imap/main.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -701,7 +701,7 @@ mod tests {
701701
/// Test that `ImapType::watch` `Stream` returns the expected `Refresh`
702702
/// events when altering the mail store in the IMAP server.
703703
pub(crate) fn run_imap_watch() {
704-
let mut _logger = StderrLogger::new(LogLevel::TRACE);
704+
let mut _logger = StderrLogger::new_with(LogLevel::TRACE, true);
705705
let temp_dir = TempDir::new().unwrap();
706706
let backend_event_queue =
707707
Arc::new(Mutex::new(std::collections::VecDeque::with_capacity(16)));

melib/tests/jmap/main.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -733,7 +733,7 @@ mod tests {
733733
/// Test that `JmapType::refresh` returns the expected `Refresh` events when
734734
/// altering the mail store in the jmap server.
735735
pub(crate) fn run_jmap_refresh() {
736-
let mut _logger = StderrLogger::new(LogLevel::TRACE);
736+
let mut _logger = StderrLogger::new_with(LogLevel::TRACE, true);
737737
let temp_dir = TempDir::new().unwrap();
738738
let backend_event_queue =
739739
Arc::new(Mutex::new(std::collections::VecDeque::with_capacity(16)));

melib/tests/maildir/main.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -112,7 +112,7 @@ fn new_maildir_backend(
112112
/// Test that `MaildirType::watch` `Stream` returns the expected `Refresh`
113113
/// events when altering the mail store in the filesystem.
114114
fn test_maildir_watch() {
115-
let mut _logger = StderrLogger::new(LogLevel::TRACE);
115+
let mut _logger = StderrLogger::new_with(LogLevel::TRACE, true);
116116
let temp_dir = TempDir::new().unwrap();
117117
let backend_event_queue = Arc::new(Mutex::new(VecDeque::with_capacity(16)));
118118

melib/tests/notmuch/main.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
178178
/// Test that `NotmuchDb::watch` `Stream` returns the expected `Refresh`
179179
/// events when altering the mail store in the filesystem.
180180
pub(crate) fn run_notmuch_watch() {
181-
let mut _logger = StderrLogger::new(LogLevel::TRACE);
181+
let mut _logger = StderrLogger::new_with(LogLevel::TRACE, true);
182182
skip_test_if_notmuch_binary_is_missing!();
183183
let temp_dir = TempDir::new().unwrap();
184184
// Store all events in a vector, and compare them at the end with the expected
@@ -320,7 +320,7 @@ hello world.
320320
/// Test that `NotmuchDb::refresh` returns the expected `Refresh` events
321321
/// when altering the mail store in the filesystem.
322322
pub(crate) fn run_notmuch_refresh() {
323-
let mut _logger = StderrLogger::new(LogLevel::TRACE);
323+
let mut _logger = StderrLogger::new_with(LogLevel::TRACE, true);
324324
skip_test_if_notmuch_binary_is_missing!();
325325
let temp_dir = TempDir::new().unwrap();
326326
// Store all events in a vector, and compare them at the end with the expected

melib/tests/smtp/main.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -369,7 +369,7 @@ pub mod tests {
369369

370370
/// Run a simple SMTP transaction without credential authentication.
371371
pub fn run_smtp_transaction() {
372-
let mut _logger = StderrLogger::new(LogLevel::TRACE);
372+
let mut _logger = StderrLogger::new_with(LogLevel::TRACE, true);
373373
let (server_event_sender, server_event_receiver) = unbounded();
374374
let server = SmtpServer::new(server_event_receiver);
375375
let server_state = server.state.clone();

0 commit comments

Comments
 (0)