Skip to content

Commit ebf4df3

Browse files
authored
Merge pull request #41 from BramBonne/add-tests
Add tests
2 parents ed772ca + fd7ba5c commit ebf4df3

File tree

4 files changed

+218
-0
lines changed

4 files changed

+218
-0
lines changed

src/lib.rs

Lines changed: 187 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -446,3 +446,190 @@ pub fn init_once(config: Config) {
446446
.expect("failed to acquire android_log filter lock for write") = config;
447447
}
448448
}
449+
450+
#[cfg(test)]
451+
mod tests {
452+
use super::*;
453+
use std::fmt::Write;
454+
use std::sync::atomic::{AtomicBool, Ordering};
455+
456+
#[test]
457+
fn check_config_values() {
458+
// Filter is checked in config_filter_match below.
459+
let config = Config::default()
460+
.with_min_level(Level::Trace)
461+
.with_tag("my_app");
462+
463+
assert_eq!(config.log_level, Some(Level::Trace));
464+
assert_eq!(config.tag, Some(CString::new("my_app").unwrap()));
465+
}
466+
467+
#[test]
468+
fn log_calls_formatter() {
469+
static FORMAT_FN_WAS_CALLED: AtomicBool = AtomicBool::new(false);
470+
let config = Config::default()
471+
.with_min_level(Level::Info)
472+
.format(|_, _| {
473+
FORMAT_FN_WAS_CALLED.store(true, Ordering::SeqCst);
474+
Ok(())
475+
});
476+
let logger = AndroidLogger::new(config);
477+
478+
logger.log(&Record::builder().level(Level::Info).build());
479+
480+
assert!(FORMAT_FN_WAS_CALLED.load(Ordering::SeqCst));
481+
}
482+
483+
#[test]
484+
fn logger_always_enabled() {
485+
let logger = AndroidLogger::new(Config::default());
486+
487+
assert!(logger.enabled(&log::MetadataBuilder::new().build()));
488+
}
489+
490+
// Test whether the filter gets called correctly. Not meant to be exhaustive for all filter
491+
// options, as these are handled directly by the filter itself.
492+
#[test]
493+
fn config_filter_match() {
494+
let info_record = Record::builder().level(Level::Info).build();
495+
let debug_record = Record::builder().level(Level::Debug).build();
496+
497+
let info_all_filter = env_logger::filter::Builder::new().parse("info").build();
498+
let info_all_config = Config::default().with_filter(info_all_filter);
499+
500+
assert!(info_all_config.filter_matches(&info_record));
501+
assert!(!info_all_config.filter_matches(&debug_record));
502+
}
503+
504+
#[test]
505+
fn fill_tag_bytes_truncates_long_tag() {
506+
let logger = AndroidLogger::new(Config::default());
507+
let too_long_tag: [u8; LOGGING_TAG_MAX_LEN + 20] = [b'a'; LOGGING_TAG_MAX_LEN + 20];
508+
509+
let mut result: [u8; LOGGING_TAG_MAX_LEN + 1] = Default::default();
510+
logger.fill_tag_bytes(&mut result, &too_long_tag);
511+
512+
let mut expected_result = [b'a'; LOGGING_TAG_MAX_LEN - 2].to_vec();
513+
expected_result.extend("..\0".as_bytes());
514+
assert_eq!(result.to_vec(), expected_result);
515+
}
516+
517+
#[test]
518+
fn fill_tag_bytes_keeps_short_tag() {
519+
let logger = AndroidLogger::new(Config::default());
520+
let short_tag: [u8; 3] = [b'a'; 3];
521+
522+
let mut result: [u8; LOGGING_TAG_MAX_LEN + 1] = Default::default();
523+
logger.fill_tag_bytes(&mut result, &short_tag);
524+
525+
let mut expected_result = short_tag.to_vec();
526+
expected_result.push(0);
527+
assert_eq!(result.to_vec()[..4], expected_result);
528+
}
529+
530+
#[test]
531+
fn platform_log_writer_init_values() {
532+
let tag = CStr::from_bytes_with_nul(b"tag\0").unwrap();
533+
534+
let writer = PlatformLogWriter::new(Level::Warn, &tag);
535+
536+
assert_eq!(writer.tag, tag);
537+
// Android uses LogPriority instead, which doesn't implement equality checks
538+
#[cfg(not(target_os = "android"))]
539+
assert_eq!(writer.priority, Level::Warn);
540+
}
541+
542+
#[test]
543+
fn temporal_flush() {
544+
let mut writer = get_tag_writer();
545+
546+
writer
547+
.write_str("12\n\n567\n90")
548+
.expect("Unable to write to PlatformLogWriter");
549+
550+
assert_eq!(writer.len, 10);
551+
writer.temporal_flush();
552+
// Should have flushed up until the last newline.
553+
assert_eq!(writer.len, 3);
554+
assert_eq!(writer.last_newline_index, 0);
555+
assert_eq!(&writer.buffer.to_vec()[..writer.len], "\n90".as_bytes());
556+
557+
writer.temporal_flush();
558+
// Should have flushed all remaining bytes.
559+
assert_eq!(writer.len, 0);
560+
assert_eq!(writer.last_newline_index, 0);
561+
}
562+
563+
#[test]
564+
fn flush() {
565+
let mut writer = get_tag_writer();
566+
writer
567+
.write_str("abcdefghij\n\nklm\nnopqr\nstuvwxyz")
568+
.expect("Unable to write to PlatformLogWriter");
569+
570+
writer.flush();
571+
572+
assert_eq!(writer.last_newline_index, 0);
573+
assert_eq!(writer.len, 0);
574+
}
575+
576+
#[test]
577+
fn last_newline_index() {
578+
let mut writer = get_tag_writer();
579+
580+
writer
581+
.write_str("12\n\n567\n90")
582+
.expect("Unable to write to PlatformLogWriter");
583+
584+
assert_eq!(writer.last_newline_index, 7);
585+
}
586+
587+
#[test]
588+
fn output_specified_len_leaves_buffer_unchanged() {
589+
let mut writer = get_tag_writer();
590+
let log_string = "abcdefghij\n\nklm\nnopqr\nstuvwxyz";
591+
writer
592+
.write_str(log_string)
593+
.expect("Unable to write to PlatformLogWriter");
594+
595+
writer.output_specified_len(5);
596+
597+
assert_eq!(
598+
writer.buffer[..log_string.len()].to_vec(),
599+
log_string.as_bytes()
600+
);
601+
}
602+
603+
#[test]
604+
fn copy_bytes_to_start() {
605+
let mut writer = get_tag_writer();
606+
writer
607+
.write_str("0123456789")
608+
.expect("Unable to write to PlatformLogWriter");
609+
610+
writer.copy_bytes_to_start(3, 2);
611+
612+
assert_eq!(writer.buffer[..10].to_vec(), "3423456789".as_bytes());
613+
}
614+
615+
#[test]
616+
fn copy_bytes_to_start_nop() {
617+
let test_string = "Test_string_with\n\n\n\nnewlines\n";
618+
let mut writer = get_tag_writer();
619+
writer
620+
.write_str(test_string)
621+
.expect("Unable to write to PlatformLogWriter");
622+
623+
writer.copy_bytes_to_start(0, 20);
624+
writer.copy_bytes_to_start(10, 0);
625+
626+
assert_eq!(
627+
writer.buffer[..test_string.len()].to_vec(),
628+
test_string.as_bytes()
629+
);
630+
}
631+
632+
fn get_tag_writer() -> PlatformLogWriter<'static> {
633+
PlatformLogWriter::new(Level::Warn, &CStr::from_bytes_with_nul(b"tag\0").unwrap())
634+
}
635+
}

tests/config_log_level.rs

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
extern crate android_logger;
2+
extern crate log;
3+
4+
#[test]
5+
fn config_log_level() {
6+
android_logger::init_once(android_logger::Config::default().with_min_level(log::Level::Trace));
7+
8+
assert_eq!(log::max_level(), log::LevelFilter::Trace);
9+
}

tests/default_init.rs

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
extern crate android_logger;
2+
extern crate log;
3+
4+
#[test]
5+
fn default_init() {
6+
android_logger::init_once(Default::default());
7+
8+
// android_logger has default log level "off"
9+
assert_eq!(log::max_level(), log::LevelFilter::Off);
10+
}

tests/multiple_init.rs

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
extern crate android_logger;
2+
extern crate log;
3+
4+
#[test]
5+
fn multiple_init() {
6+
android_logger::init_once(android_logger::Config::default().with_min_level(log::Level::Trace));
7+
8+
// Second initialization should be silently ignored
9+
android_logger::init_once(android_logger::Config::default().with_min_level(log::Level::Error));
10+
11+
assert_eq!(log::max_level(), log::LevelFilter::Trace);
12+
}

0 commit comments

Comments
 (0)