Skip to content

Commit 05cbf03

Browse files
committed
Move env modifying tests to a separate integration test
1 parent 52907d7 commit 05cbf03

File tree

2 files changed

+166
-160
lines changed

2 files changed

+166
-160
lines changed

library/std/tests/env.rs

-160
Original file line numberDiff line numberDiff line change
@@ -1,167 +1,7 @@
11
use std::env::*;
2-
use std::ffi::{OsStr, OsString};
32
use std::path::Path;
43

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

1666
#[test]
1677
#[cfg_attr(any(target_os = "emscripten", target_os = "wasi", target_env = "sgx"), ignore)]

library/std/tests/env_modify.rs

+166
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,166 @@
1+
// These tests are in a separate integration test as they modify the environment,
2+
// and would otherwise cause some other tests to fail.
3+
4+
use std::env::*;
5+
use std::ffi::{OsStr, OsString};
6+
7+
use rand::distributions::{Alphanumeric, DistString};
8+
9+
mod common;
10+
use std::thread;
11+
12+
use common::test_rng;
13+
14+
#[track_caller]
15+
fn make_rand_name() -> OsString {
16+
let n = format!("TEST{}", Alphanumeric.sample_string(&mut test_rng(), 10));
17+
let n = OsString::from(n);
18+
assert!(var_os(&n).is_none());
19+
n
20+
}
21+
22+
fn eq(a: Option<OsString>, b: Option<&str>) {
23+
assert_eq!(a.as_ref().map(|s| &**s), b.map(OsStr::new).map(|s| &*s));
24+
}
25+
26+
#[test]
27+
fn test_set_var() {
28+
let n = make_rand_name();
29+
set_var(&n, "VALUE");
30+
eq(var_os(&n), Some("VALUE"));
31+
}
32+
33+
#[test]
34+
fn test_remove_var() {
35+
let n = make_rand_name();
36+
set_var(&n, "VALUE");
37+
remove_var(&n);
38+
eq(var_os(&n), None);
39+
}
40+
41+
#[test]
42+
fn test_set_var_overwrite() {
43+
let n = make_rand_name();
44+
set_var(&n, "1");
45+
set_var(&n, "2");
46+
eq(var_os(&n), Some("2"));
47+
set_var(&n, "");
48+
eq(var_os(&n), Some(""));
49+
}
50+
51+
#[test]
52+
#[cfg_attr(target_os = "emscripten", ignore)]
53+
fn test_var_big() {
54+
let mut s = "".to_string();
55+
let mut i = 0;
56+
while i < 100 {
57+
s.push_str("aaaaaaaaaa");
58+
i += 1;
59+
}
60+
let n = make_rand_name();
61+
set_var(&n, &s);
62+
eq(var_os(&n), Some(&s));
63+
}
64+
65+
#[test]
66+
#[cfg_attr(target_os = "emscripten", ignore)]
67+
fn test_env_set_get_huge() {
68+
let n = make_rand_name();
69+
let s = "x".repeat(10000);
70+
set_var(&n, &s);
71+
eq(var_os(&n), Some(&s));
72+
remove_var(&n);
73+
eq(var_os(&n), None);
74+
}
75+
76+
#[test]
77+
fn test_env_set_var() {
78+
let n = make_rand_name();
79+
80+
let mut e = vars_os();
81+
set_var(&n, "VALUE");
82+
assert!(!e.any(|(k, v)| { &*k == &*n && &*v == "VALUE" }));
83+
84+
assert!(vars_os().any(|(k, v)| { &*k == &*n && &*v == "VALUE" }));
85+
}
86+
87+
#[test]
88+
#[cfg_attr(not(any(unix, windows)), ignore, allow(unused))]
89+
#[allow(deprecated)]
90+
fn env_home_dir() {
91+
use std::path::PathBuf;
92+
93+
fn var_to_os_string(var: Result<String, VarError>) -> Option<OsString> {
94+
match var {
95+
Ok(var) => Some(OsString::from(var)),
96+
Err(VarError::NotUnicode(var)) => Some(var),
97+
_ => None,
98+
}
99+
}
100+
101+
cfg_if::cfg_if! {
102+
if #[cfg(unix)] {
103+
let oldhome = var_to_os_string(var("HOME"));
104+
105+
set_var("HOME", "/home/MountainView");
106+
assert_eq!(home_dir(), Some(PathBuf::from("/home/MountainView")));
107+
108+
remove_var("HOME");
109+
if cfg!(target_os = "android") {
110+
assert!(home_dir().is_none());
111+
} else {
112+
// When HOME is not set, some platforms return `None`,
113+
// but others return `Some` with a default.
114+
// Just check that it is not "/home/MountainView".
115+
assert_ne!(home_dir(), Some(PathBuf::from("/home/MountainView")));
116+
}
117+
118+
if let Some(oldhome) = oldhome { set_var("HOME", oldhome); }
119+
} else if #[cfg(windows)] {
120+
let oldhome = var_to_os_string(var("HOME"));
121+
let olduserprofile = var_to_os_string(var("USERPROFILE"));
122+
123+
remove_var("HOME");
124+
remove_var("USERPROFILE");
125+
126+
assert!(home_dir().is_some());
127+
128+
set_var("HOME", "/home/PaloAlto");
129+
assert_ne!(home_dir(), Some(PathBuf::from("/home/PaloAlto")), "HOME must not be used");
130+
131+
set_var("USERPROFILE", "/home/MountainView");
132+
assert_eq!(home_dir(), Some(PathBuf::from("/home/MountainView")));
133+
134+
remove_var("HOME");
135+
136+
assert_eq!(home_dir(), Some(PathBuf::from("/home/MountainView")));
137+
138+
set_var("USERPROFILE", "");
139+
assert_ne!(home_dir(), Some(PathBuf::from("")), "Empty USERPROFILE must be ignored");
140+
141+
remove_var("USERPROFILE");
142+
143+
if let Some(oldhome) = oldhome { set_var("HOME", oldhome); }
144+
if let Some(olduserprofile) = olduserprofile { set_var("USERPROFILE", olduserprofile); }
145+
}
146+
}
147+
}
148+
149+
#[test] // miri shouldn't detect any data race in this fn
150+
#[cfg_attr(any(not(miri), target_os = "emscripten"), ignore)]
151+
fn test_env_get_set_multithreaded() {
152+
let getter = thread::spawn(|| {
153+
for _ in 0..100 {
154+
let _ = var_os("foo");
155+
}
156+
});
157+
158+
let setter = thread::spawn(|| {
159+
for _ in 0..100 {
160+
set_var("foo", "bar");
161+
}
162+
});
163+
164+
let _ = getter.join();
165+
let _ = setter.join();
166+
}

0 commit comments

Comments
 (0)