@@ -5,14 +5,18 @@ use std::net::TcpListener;
55use std:: process:: Command ;
66use 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
1115const EXE_CONTENT : & str = r#"
1216use std::env;
1317
1418fn 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]
109241fn makes_jobserver_used ( ) {
110242 let make = make_exe ( ) ;
0 commit comments