blob: 17d40c68fd92214a1f20b5b217c98a3bbbd1b6a6 [file] [log] [blame] [edit]
// This test validates the `--test-builder` rustdoc option.
// It ensures that:
// 1. When the test-builder path points to a non-executable file, rustdoc gracefully fails
// 2. When the test-builder path points to a valid executable, it receives rustc arguments
//@ needs-target-std
use run_make_support::{bare_rustc, path, rfs, rustc_path, rustdoc, target};
fn main() {
// Test 1: Verify that a non-executable test-builder fails gracefully
let absolute_path = path("foo.rs").canonicalize().expect("failed to get absolute path");
let output = rustdoc()
.input("foo.rs")
.arg("--test")
.arg("-Zunstable-options")
.arg("--test-builder")
.arg(&absolute_path)
.run_fail();
// We check that rustdoc outputs the error correctly...
output.assert_stdout_contains("Failed to spawn ");
// ... and that we didn't panic.
output.assert_not_ice();
// Some targets (for example wasm) cannot execute doctests directly even with a runner,
// so only exercise the success path when the target can run on the host.
if target().contains("wasm")
|| target().contains("sgx")
|| std::env::var_os("REMOTE_TEST_CLIENT").is_some()
{
return;
}
// Test 2: Verify that a valid test-builder is invoked with correct arguments
// Build a custom test-builder that logs its arguments and forwards to rustc.
// Use `bare_rustc` so we compile for the host architecture even in cross builds.
let builder_bin = path("builder-bin");
bare_rustc().input("builder.rs").output(&builder_bin).run();
let log_path = path("builder.log");
let _ = std::fs::remove_file(&log_path);
// Run rustdoc with our custom test-builder
rustdoc()
.input("doctest.rs")
.arg("--test")
.arg("-Zunstable-options")
.arg("--test-builder")
.arg(&builder_bin)
.env("REAL_RUSTC", rustc_path())
.env("BUILDER_LOG", &log_path)
.run();
// Verify the custom builder was invoked with rustc-style arguments
let log_contents = rfs::read_to_string(&log_path);
assert!(
log_contents.contains("--crate-type"),
"expected builder to receive rustc arguments, got:\n{log_contents}"
);
}