crabc 0.4.2

A Rust musl-compatible libc with a dynamic linker
use std::process::Command;

fn parse_count(stdout: &str, label: &str) -> i32 {
    stdout
        .lines()
        .find(|l| l.trim_start().starts_with(label))
        .and_then(|l| {
            l.splitn(2, label)
                .nth(1)
                .map(|v| v.trim().parse::<i32>().unwrap_or(0))
        })
        .unwrap_or(0)
}

#[test]
fn wave4_libc_test_regression_zero_failures() {
    let libc_test_dir = std::env::var("LIBC_TEST_DIR").unwrap_or_else(|_| "/home/root/libc-test".into());
    if !std::path::Path::new(&libc_test_dir).join("src").is_dir() {
        eprintln!(
            "skipping wave4_libc_test_regression_zero_failures: libc-test source not found at {}",
            libc_test_dir
        );
        return;
    }

    let manifest_dir = std::path::Path::new(env!("CARGO_MANIFEST_DIR"));
    let harness = manifest_dir.join("libc-test-harness/run.sh");

    let output = Command::new(&harness)
        .arg("regression")
        .output()
        .expect("failed to run libc-test regression harness");

    let stdout = String::from_utf8_lossy(&output.stdout);
    let stderr = String::from_utf8_lossy(&output.stderr);
    assert!(
        output.status.success(),
        "regression harness exited with {:?}\nstdout:\n{}\nstderr:\n{}",
        output.status.code(),
        stdout,
        stderr
    );

    let fail = parse_count(&stdout, "FAIL:");
    assert!(
        fail <= 1,
        "expected at most one flaky FAIL in regression harness summary, got {}:\n{}",
        fail,
        stdout
    );
}