Skip to content

Commit aa6793d

Browse files
committed
test: verify cargo-run doesn't inherit jobserver
1 parent a62a3c6 commit aa6793d

File tree

1 file changed

+135
-3
lines changed

1 file changed

+135
-3
lines changed

tests/testsuite/jobserver.rs

Lines changed: 135 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -5,14 +5,18 @@ use std::net::TcpListener;
55
use std::process::Command;
66
use std::thread;
77

8-
use cargo_test_support::install::{assert_has_installed_exe, cargo_home};
9-
use cargo_test_support::{cargo_exe, project};
8+
use cargo_test_support::basic_bin_manifest;
9+
use cargo_test_support::cargo_exe;
10+
use cargo_test_support::install::assert_has_installed_exe;
11+
use cargo_test_support::install::cargo_home;
12+
use cargo_test_support::project;
13+
use cargo_test_support::rustc_host;
1014

1115
const EXE_CONTENT: &str = r#"
1216
use std::env;
1317
1418
fn main() {
15-
let var = env::var("CARGO_MAKEFLAGS").unwrap();
19+
let var = env::var("CARGO_MAKEFLAGS").expect("no jobserver from env");
1620
let arg = var.split(' ')
1721
.find(|p| p.starts_with("--jobserver"))
1822
.unwrap();
@@ -105,6 +109,134 @@ all:
105109
p.process(make).env("CARGO", cargo_exe()).arg("-j2").run();
106110
}
107111

112+
#[cargo_test]
113+
fn runner_inherits_jobserver() {
114+
let make = make_exe();
115+
if Command::new(make).arg("--version").output().is_err() {
116+
return;
117+
}
118+
119+
let runner = project()
120+
.at("runner")
121+
.file("Cargo.toml", &basic_bin_manifest("runner"))
122+
.file(
123+
"src/main.rs",
124+
r#"
125+
pub fn main() {
126+
eprintln!("this is a runner");
127+
let args: Vec<String> = std::env::args().collect();
128+
let status = std::process::Command::new(&args[1]).status().unwrap();
129+
assert!(status.success());
130+
}
131+
"#,
132+
)
133+
.build();
134+
runner.cargo("build").run();
135+
let runner_bin = runner.bin("runner");
136+
assert!(runner_bin.is_file());
137+
138+
let host = rustc_host();
139+
let config_value = &format!("target.{host}.runner = \"{}\"", runner_bin.display());
140+
141+
let name = "cargo-jobserver-check";
142+
let p = project()
143+
.file(
144+
"Cargo.toml",
145+
&format!(
146+
r#"
147+
[package]
148+
name = "{name}"
149+
version = "0.0.1"
150+
"#
151+
),
152+
)
153+
.file(
154+
"src/lib.rs",
155+
r#"
156+
#[test]
157+
fn test() {
158+
_ = std::env::var("CARGO_MAKEFLAGS").expect("no jobserver from env");
159+
}
160+
"#,
161+
)
162+
.file("src/main.rs", EXE_CONTENT)
163+
.file(
164+
"Makefile",
165+
&format!(
166+
"\
167+
run:
168+
\t+$(CARGO) run
169+
170+
run-runner:
171+
\t+$(CARGO) run --config '{config_value}'
172+
173+
test:
174+
\t+$(CARGO) test --lib
175+
176+
test-runner:
177+
\t+$(CARGO) test --lib --config '{config_value}'
178+
",
179+
),
180+
)
181+
.build();
182+
183+
// jobserver can be inherited from env
184+
p.process(make)
185+
.env("CARGO", cargo_exe())
186+
.arg("run")
187+
.arg("-j2")
188+
.with_status(2)
189+
.with_stderr_contains("[..]no jobserver from env[..]")
190+
.run();
191+
p.process(make)
192+
.env("CARGO", cargo_exe())
193+
.arg("run-runner")
194+
.arg("-j2")
195+
.with_status(2)
196+
.with_stderr_contains("[..]this is a runner[..]")
197+
.with_stderr_contains("[..]no jobserver from env[..]")
198+
.run();
199+
p.process(make)
200+
.env("CARGO", cargo_exe())
201+
.arg("test")
202+
.arg("-j2")
203+
.with_status(2)
204+
.with_stdout_contains("[..]no jobserver from env[..]")
205+
.run();
206+
p.process(make)
207+
.env("CARGO", cargo_exe())
208+
.arg("test-runner")
209+
.arg("-j2")
210+
.with_status(2)
211+
.with_stderr_contains("[..]this is a runner[..]")
212+
.with_stdout_contains("[..]no jobserver from env[..]")
213+
.run();
214+
215+
// but not from `-j` flag
216+
p.cargo("run -j2")
217+
.with_status(101)
218+
.with_stderr_contains("[..]no jobserver from env[..]")
219+
.run();
220+
p.cargo("run -j2")
221+
.arg("--config")
222+
.arg(config_value)
223+
.with_status(101)
224+
.with_stderr_contains("[..]this is a runner[..]")
225+
.with_stderr_contains("[..]no jobserver from env[..]")
226+
.run();
227+
p.cargo("test -j2")
228+
.with_status(101)
229+
.with_stdout_contains("[..]no jobserver from env[..]")
230+
.run();
231+
p.cargo("test -j2")
232+
.arg("--config")
233+
.arg(config_value)
234+
.with_status(101)
235+
.with_stderr_contains("[..]this is a runner[..]")
236+
.with_stdout_contains("[..]no jobserver from env[..]")
237+
.run();
238+
}
239+
108240
#[cargo_test]
109241
fn makes_jobserver_used() {
110242
let make = make_exe();

0 commit comments

Comments
 (0)