• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 use std::env::*;
2 use std::ffi::{OsStr, OsString};
3 
4 use rand::distributions::{Alphanumeric, DistString};
5 
6 mod common;
7 use common::test_rng;
8 
9 #[track_caller]
make_rand_name() -> OsString10 fn make_rand_name() -> OsString {
11     let n = format!("TEST{}", Alphanumeric.sample_string(&mut test_rng(), 10));
12     let n = OsString::from(n);
13     assert!(var_os(&n).is_none());
14     n
15 }
16 
eq(a: Option<OsString>, b: Option<&str>)17 fn eq(a: Option<OsString>, b: Option<&str>) {
18     assert_eq!(a.as_ref().map(|s| &**s), b.map(OsStr::new).map(|s| &*s));
19 }
20 
21 #[test]
test_set_var()22 fn test_set_var() {
23     let n = make_rand_name();
24     set_var(&n, "VALUE");
25     eq(var_os(&n), Some("VALUE"));
26 }
27 
28 #[test]
test_remove_var()29 fn test_remove_var() {
30     let n = make_rand_name();
31     set_var(&n, "VALUE");
32     remove_var(&n);
33     eq(var_os(&n), None);
34 }
35 
36 #[test]
test_set_var_overwrite()37 fn test_set_var_overwrite() {
38     let n = make_rand_name();
39     set_var(&n, "1");
40     set_var(&n, "2");
41     eq(var_os(&n), Some("2"));
42     set_var(&n, "");
43     eq(var_os(&n), Some(""));
44 }
45 
46 #[test]
47 #[cfg_attr(target_os = "emscripten", ignore)]
test_var_big()48 fn test_var_big() {
49     let mut s = "".to_string();
50     let mut i = 0;
51     while i < 100 {
52         s.push_str("aaaaaaaaaa");
53         i += 1;
54     }
55     let n = make_rand_name();
56     set_var(&n, &s);
57     eq(var_os(&n), Some(&s));
58 }
59 
60 #[test]
61 #[cfg_attr(target_os = "emscripten", ignore)]
test_env_set_get_huge()62 fn test_env_set_get_huge() {
63     let n = make_rand_name();
64     let s = "x".repeat(10000);
65     set_var(&n, &s);
66     eq(var_os(&n), Some(&s));
67     remove_var(&n);
68     eq(var_os(&n), None);
69 }
70 
71 #[test]
test_env_set_var()72 fn test_env_set_var() {
73     let n = make_rand_name();
74 
75     let mut e = vars_os();
76     set_var(&n, "VALUE");
77     assert!(!e.any(|(k, v)| { &*k == &*n && &*v == "VALUE" }));
78 
79     assert!(vars_os().any(|(k, v)| { &*k == &*n && &*v == "VALUE" }));
80 }
81 
82 #[test]
83 #[cfg_attr(not(any(unix, windows)), ignore, allow(unused))]
84 #[allow(deprecated)]
env_home_dir()85 fn env_home_dir() {
86     use std::path::PathBuf;
87 
88     fn var_to_os_string(var: Result<String, VarError>) -> Option<OsString> {
89         match var {
90             Ok(var) => Some(OsString::from(var)),
91             Err(VarError::NotUnicode(var)) => Some(var),
92             _ => None,
93         }
94     }
95 
96     cfg_if::cfg_if! {
97         if #[cfg(unix)] {
98             let oldhome = var_to_os_string(var("HOME"));
99 
100             set_var("HOME", "/home/MountainView");
101             assert_eq!(home_dir(), Some(PathBuf::from("/home/MountainView")));
102 
103             remove_var("HOME");
104             if cfg!(target_os = "android") {
105                 assert!(home_dir().is_none());
106             } else {
107                 // When HOME is not set, some platforms return `None`,
108                 // but others return `Some` with a default.
109                 // Just check that it is not "/home/MountainView".
110                 assert_ne!(home_dir(), Some(PathBuf::from("/home/MountainView")));
111             }
112 
113             if let Some(oldhome) = oldhome { set_var("HOME", oldhome); }
114         } else if #[cfg(windows)] {
115             let oldhome = var_to_os_string(var("HOME"));
116             let olduserprofile = var_to_os_string(var("USERPROFILE"));
117 
118             remove_var("HOME");
119             remove_var("USERPROFILE");
120 
121             assert!(home_dir().is_some());
122 
123             set_var("HOME", "/home/MountainView");
124             assert_eq!(home_dir(), Some(PathBuf::from("/home/MountainView")));
125 
126             remove_var("HOME");
127 
128             set_var("USERPROFILE", "/home/MountainView");
129             assert_eq!(home_dir(), Some(PathBuf::from("/home/MountainView")));
130 
131             set_var("HOME", "/home/MountainView");
132             set_var("USERPROFILE", "/home/PaloAlto");
133             assert_eq!(home_dir(), Some(PathBuf::from("/home/MountainView")));
134 
135             remove_var("HOME");
136             remove_var("USERPROFILE");
137 
138             if let Some(oldhome) = oldhome { set_var("HOME", oldhome); }
139             if let Some(olduserprofile) = olduserprofile { set_var("USERPROFILE", olduserprofile); }
140         }
141     }
142 }
143