]> git.lizzy.rs Git - rust.git/blob - library/std/tests/env.rs
Merge commit '1d8491b120223272b13451fc81265aa64f7f4d5b' into sync-from-rustfmt
[rust.git] / library / std / tests / env.rs
1 use std::env::*;
2 use std::ffi::{OsStr, OsString};
3
4 use rand::distributions::{Alphanumeric, DistString};
5
6 /// Copied from `std::test_helpers::test_rng`, since these tests rely on the
7 /// seed not being the same for every RNG invocation too.
8 #[track_caller]
9 pub(crate) fn test_rng() -> rand_xorshift::XorShiftRng {
10     use core::hash::{BuildHasher, Hash, Hasher};
11     let mut hasher = std::collections::hash_map::RandomState::new().build_hasher();
12     core::panic::Location::caller().hash(&mut hasher);
13     let hc64 = hasher.finish();
14     let seed_vec = hc64.to_le_bytes().into_iter().chain(0u8..8).collect::<Vec<u8>>();
15     let seed: [u8; 16] = seed_vec.as_slice().try_into().unwrap();
16     rand::SeedableRng::from_seed(seed)
17 }
18
19 #[track_caller]
20 fn make_rand_name() -> OsString {
21     let n = format!("TEST{}", Alphanumeric.sample_string(&mut test_rng(), 10));
22     let n = OsString::from(n);
23     assert!(var_os(&n).is_none());
24     n
25 }
26
27 fn eq(a: Option<OsString>, b: Option<&str>) {
28     assert_eq!(a.as_ref().map(|s| &**s), b.map(OsStr::new).map(|s| &*s));
29 }
30
31 #[test]
32 fn test_set_var() {
33     let n = make_rand_name();
34     set_var(&n, "VALUE");
35     eq(var_os(&n), Some("VALUE"));
36 }
37
38 #[test]
39 fn test_remove_var() {
40     let n = make_rand_name();
41     set_var(&n, "VALUE");
42     remove_var(&n);
43     eq(var_os(&n), None);
44 }
45
46 #[test]
47 fn test_set_var_overwrite() {
48     let n = make_rand_name();
49     set_var(&n, "1");
50     set_var(&n, "2");
51     eq(var_os(&n), Some("2"));
52     set_var(&n, "");
53     eq(var_os(&n), Some(""));
54 }
55
56 #[test]
57 #[cfg_attr(target_os = "emscripten", ignore)]
58 fn test_var_big() {
59     let mut s = "".to_string();
60     let mut i = 0;
61     while i < 100 {
62         s.push_str("aaaaaaaaaa");
63         i += 1;
64     }
65     let n = make_rand_name();
66     set_var(&n, &s);
67     eq(var_os(&n), Some(&s));
68 }
69
70 #[test]
71 #[cfg_attr(target_os = "emscripten", ignore)]
72 fn test_env_set_get_huge() {
73     let n = make_rand_name();
74     let s = "x".repeat(10000);
75     set_var(&n, &s);
76     eq(var_os(&n), Some(&s));
77     remove_var(&n);
78     eq(var_os(&n), None);
79 }
80
81 #[test]
82 fn test_env_set_var() {
83     let n = make_rand_name();
84
85     let mut e = vars_os();
86     set_var(&n, "VALUE");
87     assert!(!e.any(|(k, v)| { &*k == &*n && &*v == "VALUE" }));
88
89     assert!(vars_os().any(|(k, v)| { &*k == &*n && &*v == "VALUE" }));
90 }
91
92 #[test]
93 #[cfg_attr(not(any(unix, windows)), ignore, allow(unused))]
94 #[allow(deprecated)]
95 fn env_home_dir() {
96     use std::path::PathBuf;
97
98     fn var_to_os_string(var: Result<String, VarError>) -> Option<OsString> {
99         match var {
100             Ok(var) => Some(OsString::from(var)),
101             Err(VarError::NotUnicode(var)) => Some(var),
102             _ => None,
103         }
104     }
105
106     cfg_if::cfg_if! {
107         if #[cfg(unix)] {
108             let oldhome = var_to_os_string(var("HOME"));
109
110             set_var("HOME", "/home/MountainView");
111             assert_eq!(home_dir(), Some(PathBuf::from("/home/MountainView")));
112
113             remove_var("HOME");
114             if cfg!(target_os = "android") {
115                 assert!(home_dir().is_none());
116             } else {
117                 // When HOME is not set, some platforms return `None`,
118                 // but others return `Some` with a default.
119                 // Just check that it is not "/home/MountainView".
120                 assert_ne!(home_dir(), Some(PathBuf::from("/home/MountainView")));
121             }
122
123             if let Some(oldhome) = oldhome { set_var("HOME", oldhome); }
124         } else if #[cfg(windows)] {
125             let oldhome = var_to_os_string(var("HOME"));
126             let olduserprofile = var_to_os_string(var("USERPROFILE"));
127
128             remove_var("HOME");
129             remove_var("USERPROFILE");
130
131             assert!(home_dir().is_some());
132
133             set_var("HOME", "/home/MountainView");
134             assert_eq!(home_dir(), Some(PathBuf::from("/home/MountainView")));
135
136             remove_var("HOME");
137
138             set_var("USERPROFILE", "/home/MountainView");
139             assert_eq!(home_dir(), Some(PathBuf::from("/home/MountainView")));
140
141             set_var("HOME", "/home/MountainView");
142             set_var("USERPROFILE", "/home/PaloAlto");
143             assert_eq!(home_dir(), Some(PathBuf::from("/home/MountainView")));
144
145             remove_var("HOME");
146             remove_var("USERPROFILE");
147
148             if let Some(oldhome) = oldhome { set_var("HOME", oldhome); }
149             if let Some(olduserprofile) = olduserprofile { set_var("USERPROFILE", olduserprofile); }
150         }
151     }
152 }