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