Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

test(build-std): Isolate output test to avoid spurious [BLOCKING] messages from concurrent runs #14943

Merged
merged 1 commit into from
Dec 18, 2024
Merged
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
49 changes: 37 additions & 12 deletions tests/build-std/main.rs
Original file line number Diff line number Diff line change
Expand Up @@ -25,9 +25,11 @@ use cargo_test_support::{basic_manifest, paths, project, rustc_host, str, Execs}
use std::env;
use std::path::Path;

fn enable_build_std(e: &mut Execs, arg: Option<&str>) {
e.env_remove("CARGO_HOME");
e.env_remove("HOME");
fn enable_build_std(e: &mut Execs, arg: Option<&str>, isolated: bool) {
if !isolated {
e.env_remove("CARGO_HOME");
e.env_remove("HOME");
}

// And finally actually enable `build-std` for now
let arg = match arg {
Expand All @@ -40,19 +42,41 @@ fn enable_build_std(e: &mut Execs, arg: Option<&str>) {

// Helper methods used in the tests below
trait BuildStd: Sized {
/// Set `-Zbuild-std` args and will download dependencies of the standard
/// library in users's `CARGO_HOME` (`~/.cargo/`) instead of isolated
/// environment `cargo-test-support` usually provides.
///
/// The environment is not isolated is to avoid excessive network requests
/// and downloads. A side effect is `[BLOCKING]` will show up in stderr,
/// as a sign of package cahce lock contention when running other build-std
/// tests concurrently.
fn build_std(&mut self) -> &mut Self;

/// Like [`BuildStd::build_std`] and is able to specify what crates to build.
fn build_std_arg(&mut self, arg: &str) -> &mut Self;

/// Like [`BuildStd::build_std`] but use an isolated `CARGO_HOME` environment
/// to avoid package cache lock contention.
///
/// Don't use this unless you really need to assert the full stderr
/// and avoid any `[BLOCKING]` message.
fn build_std_isolated(&mut self) -> &mut Self;
fn target_host(&mut self) -> &mut Self;
}

impl BuildStd for Execs {
fn build_std(&mut self) -> &mut Self {
enable_build_std(self, None);
enable_build_std(self, None, false);
self
}

fn build_std_arg(&mut self, arg: &str) -> &mut Self {
enable_build_std(self, Some(arg));
enable_build_std(self, Some(arg), false);
self
}

fn build_std_isolated(&mut self) -> &mut Self {
enable_build_std(self, None, true);
self
}

Expand Down Expand Up @@ -107,9 +131,12 @@ fn basic() {
)
.build();

p.cargo("check").build_std().target_host().run();
// HACK: use an isolated the isolated CARGO_HOME environment (`build_std_isolated`)
// to avoid `[BLOCKING]` messages (from lock contention with other tests)
// from getting in this test's asserts
p.cargo("check").build_std_isolated().target_host().run();
p.cargo("build")
.build_std()
.build_std_isolated()
.target_host()
// Importantly, this should not say [UPDATING]
// There have been multiple bugs where every build triggers and update.
Expand All @@ -120,7 +147,7 @@ fn basic() {
"#]])
.run();
p.cargo("run")
.build_std()
.build_std_isolated()
.target_host()
.with_stderr_data(str![[r#"
[FINISHED] `dev` profile [unoptimized + debuginfo] target(s) in [ELAPSED]s
Expand All @@ -129,7 +156,7 @@ fn basic() {
"#]])
.run();
p.cargo("test")
.build_std()
.build_std_isolated()
.target_host()
.with_stderr_data(str![[r#"
[COMPILING] rustc-std-workspace-std [..]
Expand Down Expand Up @@ -379,13 +406,11 @@ fn test_proc_macro() {
.file("src/lib.rs", "")
.build();

// Download dependencies first,
// so we can compare `cargo test` output without any wildcard
p.cargo("fetch").build_std().run();
p.cargo("test --lib")
.env_remove(cargo_util::paths::dylib_path_envvar())
.build_std()
.with_stderr_data(str![[r#"
...
[COMPILING] foo v0.0.0 ([ROOT]/foo)
[FINISHED] `test` profile [unoptimized + debuginfo] target(s) in [ELAPSED]s
[RUNNING] unittests src/lib.rs (target/debug/deps/foo-[HASH])
Expand Down
Loading