use super::build_script::{BuildMetadata, write_metadata};
use std::io::{self, Write};
use std::path::PathBuf;
type TestResult = Result<(), Box<dyn std::error::Error>>;
#[test]
fn build_metadata_emits_the_commit_and_each_watched_reference() -> TestResult {
let metadata = BuildMetadata {
commit: "fixture-commit".to_owned(),
watched: vec![
PathBuf::from("git/HEAD"),
PathBuf::from("git/refs/heads/main"),
],
warning: None,
};
let mut output = Vec::new();
write_metadata(&metadata, &mut output)?;
assert_eq!(
String::from_utf8(output)?,
concat!(
"cargo:rerun-if-changed=build.rs\n",
"cargo:rerun-if-changed=git/HEAD\n",
"cargo:rerun-if-changed=git/refs/heads/main\n",
"cargo:rustc-env=LIMINAL_BUILD_COMMIT=fixture-commit\n"
)
);
Ok(())
}
#[test]
fn build_metadata_emits_a_named_warning_with_the_unknown_commit() -> TestResult {
let metadata = BuildMetadata {
commit: "unknown".to_owned(),
watched: Vec::new(),
warning: Some("workspace has no git metadata".to_owned()),
};
let mut output = Vec::new();
write_metadata(&metadata, &mut output)?;
assert_eq!(
String::from_utf8(output)?,
concat!(
"cargo:rerun-if-changed=build.rs\n",
"cargo:warning=SELF_STREAM_BUILD_UNKNOWN: workspace has no git metadata\n",
"cargo:rustc-env=LIMINAL_BUILD_COMMIT=unknown\n"
)
);
Ok(())
}
struct RefusedWriter;
impl Write for RefusedWriter {
fn write(&mut self, _: &[u8]) -> io::Result<usize> {
Err(io::Error::other("fixture metadata output refused"))
}
fn flush(&mut self) -> io::Result<()> {
Ok(())
}
}
#[test]
fn build_metadata_propagates_the_output_failure() -> TestResult {
let metadata = BuildMetadata {
commit: "unknown".to_owned(),
watched: Vec::new(),
warning: None,
};
let error = write_metadata(&metadata, &mut RefusedWriter)
.err()
.ok_or("metadata output failure was swallowed")?;
assert_eq!(error.to_string(), "fixture metadata output refused");
Ok(())
}