| // 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}" | |
| ); | |
| } |