@@ -3,16 +3,21 @@ use std::ffi::{OsStr, OsString};
33
44pub struct EnvironmentTestGuard {
55 key : OsString ,
6+ value : Option < OsString > ,
67}
78
89pub fn set_env < V : AsRef < OsStr > > ( key : OsString , value : V ) -> EnvironmentTestGuard {
10+ let prev_value = env:: var_os ( & key) ;
911 env:: set_var ( & key, value) ;
10- EnvironmentTestGuard { key }
12+ EnvironmentTestGuard { key, value : prev_value }
1113}
1214
1315impl Drop for EnvironmentTestGuard {
1416 fn drop ( & mut self ) {
15- env:: remove_var ( & self . key )
17+ match & self . value {
18+ Some ( value) => env:: set_var ( & self . key , value) ,
19+ None => env:: remove_var ( & self . key )
20+ }
1621 }
1722}
1823
@@ -23,11 +28,15 @@ mod test {
2328 use fake:: Fake ;
2429 use serial_test:: serial;
2530
31+ fn gen_key ( ) -> OsString {
32+ OsString :: from ( Word ( ) . fake :: < String > ( ) )
33+ }
34+ fn gen_value ( ) -> OsString {
35+ OsString :: from ( Sentence ( 1 ..10 ) . fake :: < String > ( ) )
36+ }
37+
2638 fn gen_pair ( ) -> ( OsString , OsString ) {
27- (
28- OsString :: from ( Word ( ) . fake :: < String > ( ) ) ,
29- OsString :: from ( Sentence ( 1 ..10 ) . fake :: < String > ( ) ) ,
30- )
39+ ( gen_key ( ) , gen_value ( ) )
3140 }
3241
3342 #[ test]
@@ -47,4 +56,15 @@ mod test {
4756 }
4857 assert_eq ! ( env:: var_os( key) , None )
4958 }
59+
60+ #[ test]
61+ #[ serial]
62+ fn set_env_restore ( ) {
63+ let ( key, value) = gen_pair ( ) ;
64+ env:: set_var ( & key, & value) ;
65+ {
66+ let _e = set_env ( key. clone ( ) , gen_value ( ) ) ;
67+ }
68+ assert_eq ! ( env:: var_os( key) . unwrap( ) , value)
69+ }
5070}
0 commit comments