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