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