@@ -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 \n 567\n 90" )
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] , "\n 90" . 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 \n klm\n nopqr\n stuvwxyz" )
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 \n 567\n 90" )
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 \n klm\n nopqr\n stuvwxyz" ;
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 \n newlines\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+ }
0 commit comments