@@ -721,3 +721,79 @@ fn test_parse_uint_default() {
721
721
let config: TestUint = config. try_deserialize ( ) . unwrap ( ) ;
722
722
assert_eq ! ( config. int_val, 42 ) ;
723
723
}
724
+
725
+ #[ cfg( any( unix, windows) ) ]
726
+ #[ cfg( test) ]
727
+ mod unicode_tests {
728
+ use std:: ffi:: OsString ;
729
+
730
+ use super :: * ;
731
+
732
+ fn make_invalid_unicode_os_string ( ) -> OsString {
733
+ let string = {
734
+ #[ cfg( unix) ]
735
+ {
736
+ use std:: os:: unix:: ffi:: OsStringExt ;
737
+
738
+ OsString :: from_vec ( vec ! [ 0xff ] )
739
+ }
740
+ #[ cfg( windows) ]
741
+ {
742
+ use std:: os:: windows:: ffi:: OsStringExt ;
743
+
744
+ OsString :: from_wide ( & [ 0xd800 ] ) // unpaired high surrogate
745
+ }
746
+ } ;
747
+
748
+ assert ! ( string. to_str( ) . is_none( ) ) ;
749
+
750
+ string
751
+ }
752
+
753
+ #[ test]
754
+ #[ should_panic( expected = r#"`Result::unwrap()` on an `Err` value: "\xFF""# ) ]
755
+ fn test_invalid_unicode_key_ignored ( ) {
756
+ temp_env:: with_vars (
757
+ vec ! [
758
+ ( make_invalid_unicode_os_string( ) , Some ( "abc" ) ) ,
759
+ ( "A_B_C" . into( ) , Some ( "abc" ) ) ,
760
+ ] ,
761
+ || {
762
+ let vars = Environment :: default ( ) . collect ( ) . unwrap ( ) ;
763
+
764
+ assert ! ( vars. contains_key( "a_b_c" ) ) ;
765
+ } ,
766
+ ) ;
767
+ }
768
+
769
+ #[ test]
770
+ #[ should_panic( expected = r#"`Result::unwrap()` on an `Err` value: "\xFF""# ) ]
771
+ fn test_invalid_unicode_value_filtered ( ) {
772
+ temp_env:: with_vars (
773
+ vec ! [
774
+ ( "invalid_value1" , Some ( make_invalid_unicode_os_string( ) ) ) ,
775
+ ( "valid_value2" , Some ( "valid" . into( ) ) ) ,
776
+ ] ,
777
+ || {
778
+ let vars = Environment :: with_prefix ( "valid" )
779
+ . keep_prefix ( true )
780
+ . collect ( )
781
+ . unwrap ( ) ;
782
+
783
+ assert ! ( !vars. contains_key( "invalid_value1" ) ) ;
784
+ assert ! ( vars. contains_key( "valid_value2" ) ) ;
785
+ } ,
786
+ ) ;
787
+ }
788
+
789
+ #[ test]
790
+ #[ should_panic( expected = r#"`Result::unwrap()` on an `Err` value: "\xFF""# ) ]
791
+ fn test_invalid_unicode_value_not_filtered ( ) {
792
+ temp_env:: with_vars (
793
+ vec ! [ ( "invalid_value1" , Some ( make_invalid_unicode_os_string( ) ) ) ] ,
794
+ || {
795
+ Environment :: default ( ) . collect ( ) . unwrap ( ) ;
796
+ } ,
797
+ ) ;
798
+ }
799
+ }
0 commit comments