tenferro-cpu 0.2.0

CPU backend, kernels, provider selection, and CPU resource pools for tenferro.
Documentation
use super::*;

#[test]
fn count_affinity_mask_bits_returns_none_for_zero_masks() {
    assert_eq!(count_affinity_mask_bits(&[]), None);
    assert_eq!(count_affinity_mask_bits(&[0, 0, 0]), None);
}

#[test]
fn count_affinity_mask_bits_sums_all_set_bits() {
    assert_eq!(count_affinity_mask_bits(&[0b0000_0001]), Some(1));
    assert_eq!(
        count_affinity_mask_bits(&[0b1010_0001, 0b1111_0000]),
        Some(7)
    );
}

#[cfg(any(target_os = "linux", target_os = "android"))]
#[test]
fn linux_next_affinity_mask_bytes_retries_only_on_einval() {
    assert_eq!(
        linux_next_affinity_mask_bytes(128, Some(LINUX_EINVAL)),
        Some(256)
    );
    assert_eq!(linux_next_affinity_mask_bytes(128, Some(1)), None);
    assert_eq!(linux_next_affinity_mask_bytes(128, None), None);
    assert_eq!(
        linux_next_affinity_mask_bytes(usize::MAX / 2 + 1, Some(LINUX_EINVAL)),
        None
    );
}

#[test]
fn available_parallelism_helpers_report_positive_counts() {
    assert!(available_parallelism() >= 1);
    if let Some(count) = standard_available_parallelism() {
        assert!(count >= 1);
    }
    if let Some(count) = process_cpu_affinity_count() {
        assert!(count >= 1);
    }
}

#[test]
fn windows_group_affinity_probe_documents_expected_failure_path() {
    let source = include_str!("../affinity.rs");
    assert!(
        source.contains("expected failure path")
            && source.contains("required processor-group")
            && source.contains("count. That probe"),
        "Windows GetProcessGroupAffinity null-array probe must document that failure with a count is expected"
    );
}