Skip to content

Commit 9353e04

Browse files
committed
Implement test for 11036 cargo changes
1 parent 4c7f9d0 commit 9353e04

File tree

1 file changed

+84
-21
lines changed

1 file changed

+84
-21
lines changed

tests/testsuite/rustup.rs

Lines changed: 84 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -8,8 +8,9 @@ use std::path::{Path, PathBuf};
88

99
use crate::prelude::*;
1010
use crate::utils::cargo_process;
11-
use cargo_test_support::paths::{home, root};
12-
use cargo_test_support::{process, project, str};
11+
use cargo_test_support::install::assert_has_installed_exe;
12+
use cargo_test_support::paths::{cargo_home, home, root};
13+
use cargo_test_support::{execs, process, project, str};
1314

1415
/// Helper to generate an executable.
1516
fn make_exe(dest: &Path, name: &str, contents: &str, env: &[(&str, PathBuf)]) -> PathBuf {
@@ -99,7 +100,13 @@ fn real_rustc_wrapper(bin_dir: &Path, message: &str) -> PathBuf {
99100
/// Creates a simulation of a rustup environment with `~/.cargo/bin` and
100101
/// `~/.rustup` directories populated with some executables that simulate
101102
/// rustup.
102-
fn simulated_rustup_environment() -> RustupEnvironment {
103+
///
104+
/// Arguments
105+
///
106+
/// - `proxy_calls_cargo`: if true, the cargo proxy calls the cargo under test;
107+
/// otherwise, the cargo proxy calls an executable that panics immediately
108+
/// - `env_setup`: environment variable setup the proxy should perform
109+
fn simulated_rustup_environment(proxy_calls_cargo: bool, env_setup: &str) -> RustupEnvironment {
103110
// Set up ~/.rustup/toolchains/test-toolchain/bin with a custom rustc and cargo.
104111
let rustup_home = home().join(".rustup");
105112
let toolchain_bin = rustup_home
@@ -108,42 +115,58 @@ fn simulated_rustup_environment() -> RustupEnvironment {
108115
.join("bin");
109116
toolchain_bin.mkdir_p();
110117
let rustc_toolchain_exe = real_rustc_wrapper(&toolchain_bin, "real rustc running");
111-
let cargo_toolchain_exe = make_exe(
112-
&toolchain_bin,
113-
"cargo",
114-
r#"panic!("cargo toolchain should not be called");"#,
115-
&[],
116-
);
118+
let cargo_toolchain_exe = if proxy_calls_cargo {
119+
crate::utils::cargo_exe()
120+
} else {
121+
make_exe(
122+
&toolchain_bin,
123+
"cargo",
124+
r#"panic!("cargo toolchain should not be called");"#,
125+
&[],
126+
)
127+
};
117128

118129
// Set up ~/.cargo/bin with a typical set of rustup proxies.
119130
let cargo_bin = home().join(".cargo").join("bin");
120131
cargo_bin.mkdir_p();
121132

122-
let rustc_proxy = make_exe(
133+
let proxy = make_exe(
123134
&cargo_bin,
124135
"rustc",
125136
&format!(
126137
r#"
127-
match std::env::args().next().unwrap().as_ref() {{
128-
"rustc" => {{}}
129-
arg => panic!("proxy only supports rustc, got {{arg:?}}"),
130-
}}
131-
eprintln!("rustc proxy running");
132-
let r = std::process::Command::new(env!("CARGO_RUSTUP_TEST_rustc_toolchain_exe"))
138+
let file_stem = std::path::PathBuf::from(std::env::args().next().unwrap())
139+
.file_stem()
140+
.map(ToOwned::to_owned)
141+
.unwrap();
142+
let program = match file_stem.to_str().unwrap() {{
143+
"cargo" => env!("CARGO_RUSTUP_TEST_cargo_toolchain_exe"),
144+
"rustc" => env!("CARGO_RUSTUP_TEST_rustc_toolchain_exe"),
145+
arg => panic!("proxy only supports cargo and rustc, got {{arg:?}}"),
146+
}};
147+
eprintln!("`{{program}}` proxy running");
148+
let r = std::process::Command::new(program)
133149
.args(std::env::args_os().skip(1))
150+
{env_setup}
134151
.status();
135152
std::process::exit(r.unwrap().code().unwrap_or(2));
136153
"#
137154
),
138-
&[("CARGO_RUSTUP_TEST_rustc_toolchain_exe", rustc_toolchain_exe)],
155+
&[
156+
("CARGO_RUSTUP_TEST_rustc_toolchain_exe", rustc_toolchain_exe),
157+
(
158+
"CARGO_RUSTUP_TEST_cargo_toolchain_exe",
159+
cargo_toolchain_exe.clone(),
160+
),
161+
],
139162
);
140163
fs::hard_link(
141-
&rustc_proxy,
164+
&proxy,
142165
cargo_bin.join("cargo").with_extension(EXE_EXTENSION),
143166
)
144167
.unwrap();
145168
fs::hard_link(
146-
&rustc_proxy,
169+
&proxy,
147170
cargo_bin.join("rustup").with_extension(EXE_EXTENSION),
148171
)
149172
.unwrap();
@@ -162,7 +185,7 @@ fn typical_rustup() {
162185
cargo_bin,
163186
rustup_home,
164187
cargo_toolchain_exe,
165-
} = simulated_rustup_environment();
188+
} = simulated_rustup_environment(false, "");
166189

167190
// Set up a project and run a normal cargo build.
168191
let p = project().file("src/lib.rs", "").build();
@@ -212,7 +235,7 @@ fn custom_calls_other_cargo() {
212235
cargo_bin,
213236
rustup_home,
214237
cargo_toolchain_exe: _,
215-
} = simulated_rustup_environment();
238+
} = simulated_rustup_environment(false, "");
216239

217240
// Create a directory with a custom toolchain (outside of the rustup universe).
218241
let custom_bin = root().join("custom-bin");
@@ -271,3 +294,43 @@ custom toolchain rustc running
271294
"#]])
272295
.run();
273296
}
297+
298+
/// Performs a `cargo install` with a non-default toolchain in a simulated
299+
/// rustup environment. The purpose is to verify the warning that is emitted.
300+
#[cargo_test]
301+
fn cargo_install_with_non_default_toolchain() {
302+
let RustupEnvironment {
303+
cargo_bin,
304+
rustup_home: _,
305+
cargo_toolchain_exe: _,
306+
} = simulated_rustup_environment(
307+
true,
308+
".env(\"RUSTUP_TOOLCHAIN_SOURCE\", \"env\")
309+
.env(\"RUSTUP_TOOLCHAIN\", \"test-toolchain\")",
310+
);
311+
312+
crate::utils::pkg("foo", "0.0.1");
313+
314+
let mut p = process(cargo_bin.join("cargo"));
315+
p.arg_line("install foo");
316+
execs()
317+
.with_process_builder(p)
318+
.with_stderr_data(str![[r#"
319+
`[..]/cargo[EXE]` proxy running
320+
[UPDATING] `dummy-registry` index
321+
[DOWNLOADING] crates ...
322+
[DOWNLOADED] foo v0.0.1 (registry `dummy-registry`)
323+
[INSTALLING] foo v0.0.1
324+
[WARNING] using non-default toolchain `test-toolchain` overridden by env
325+
|
326+
= [HELP] Use `cargo +stable install` if you meant to use the stable toolchain.
327+
[COMPILING] foo v0.0.1
328+
[FINISHED] `release` profile [optimized] target(s) in [ELAPSED]s
329+
[INSTALLING] [ROOT]/home/.cargo/bin/foo[EXE]
330+
[INSTALLED] package `foo v0.0.1` (executable `foo[EXE]`)
331+
[WARNING] be sure to add `[ROOT]/home/.cargo/bin` to your PATH to be able to run the installed binaries
332+
333+
"#]])
334+
.run();
335+
assert_has_installed_exe(cargo_home(), "foo");
336+
}

0 commit comments

Comments
 (0)