crabc 0.7.8

A Rust musl-compatible libc with a dynamic linker
// Copyright (c) 2026 Meng Zhuo
// SPDX-License-Identifier: BSD-3-Clause

mod common;
use std::sync::Mutex;

static PTHREAD_TEST_LOCK: Mutex<()> = Mutex::new(());

#[test]
fn pthread_functions_under_libc_so() {
    let _guard = PTHREAD_TEST_LOCK.lock();
    let output = common::run_fixture("pthread", &[]);

    assert!(
        output.status.success(),
        "pthread_test exited with {:?}, stderr: {}",
        output.status.code(),
        String::from_utf8_lossy(&output.stderr)
    );
    assert_eq!(String::from_utf8_lossy(&output.stdout), "pthread ok\n");
}

#[test]
fn pthread_many_concurrent() {
    let _guard = PTHREAD_TEST_LOCK.lock();
    let output = common::run_fixture("thread_many", &[]);
    assert_eq!(
        String::from_utf8_lossy(&output.stdout),
        "thread many ok\n"
    );
}

#[test]
fn pthread_full_test() {
    let _guard = PTHREAD_TEST_LOCK.lock();
    let output = common::run_fixture("pthread_full", &[]);

    let stdout = String::from_utf8_lossy(&output.stdout);
    let stderr = String::from_utf8_lossy(&output.stderr);
    assert!(
        output.status.success(),
        "pthread_full_test exited with {:?}, stdout: {}, stderr: {}",
        output.status.code(), stdout, stderr
    );
    assert!(stdout.contains("pthread_full ok"), "unexpected output: {}", stdout);
}