#[cfg(test)] mod test { use std::path::PathBuf; use std::process::Command; use std::str; use runfiles::Runfiles; /// fake_rustc runs the fake_rustc binary under process_wrapper with the specified /// process wrapper arguments. No arguments are passed to fake_rustc itself. /// fn fake_rustc( process_wrapper_args: &[&'static str], fake_rustc_args: &[&'static str], should_succeed: bool, ) -> String { let r = Runfiles::create().unwrap(); let fake_rustc = r.rlocation( [ "rules_rust", "test", "process_wrapper", if cfg!(unix) { "fake_rustc" } else { "fake_rustc.exe" }, ] .iter() .collect::(), ); let process_wrapper = r.rlocation( [ "rules_rust", "util", "process_wrapper", if cfg!(unix) { "process_wrapper" } else { "process_wrapper.exe" }, ] .iter() .collect::(), ); let output = Command::new(process_wrapper) .args(process_wrapper_args) .arg("--") .arg(fake_rustc) .args(fake_rustc_args) .output() .unwrap(); if should_succeed { assert!( output.status.success(), "unable to run process_wrapper: {} {}", str::from_utf8(&output.stdout).unwrap(), str::from_utf8(&output.stderr).unwrap(), ); } String::from_utf8(output.stderr).unwrap() } #[test] fn test_rustc_quit_on_rmeta_quits() { let out_content = fake_rustc( &[ "--rustc-quit-on-rmeta", "true", "--rustc-output-format", "rendered", ], &[], true, ); assert!( !out_content.contains("should not be in output"), "output should not contain 'should not be in output' but did", ); } #[test] fn test_rustc_quit_on_rmeta_output_json() { let json_content = fake_rustc( &[ "--rustc-quit-on-rmeta", "true", "--rustc-output-format", "json", ], &[], true, ); assert_eq!( json_content, concat!(r#"{"rendered": "should be\nin output"}"#, "\n") ); } #[test] fn test_rustc_quit_on_rmeta_output_rendered() { let rendered_content = fake_rustc( &[ "--rustc-quit-on-rmeta", "true", "--rustc-output-format", "rendered", ], &[], true, ); assert_eq!(rendered_content, "should be\nin output"); } #[test] fn test_rustc_panic() { let rendered_content = fake_rustc(&["--rustc-output-format", "json"], &["error"], false); assert_eq!( rendered_content, r#"{"rendered": "should be\nin output"} ERROR! this should all appear in output. Error: ProcessWrapperError("failed to process stderr: error parsing rustc output as json") "# ); } }