@@ -446,3 +446,190 @@ pub fn init_once(config: Config) {
446
446
. expect ( "failed to acquire android_log filter lock for write" ) = config;
447
447
}
448
448
}
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