audio-engine-core 0.1.0

Reusable decoder, DSP, loudness, resampling, and streaming pipeline primitives
Documentation
use std::sync::atomic::AtomicBool;
use std::sync::Arc;

#[cfg(feature = "http")]
use super::{source::fetch_range_once, NetworkError};
use super::{DecodeCancelToken, DecoderError, StreamingDecoder};

#[cfg(feature = "http")]
#[test]
fn network_error_classifies_retriable_errors() {
    assert!(NetworkError::HttpTimeout.is_retriable());
    assert!(NetworkError::ConnectionReset.is_retriable());
    assert!(NetworkError::HttpStatus(408).is_retriable());
    assert!(NetworkError::HttpStatus(429).is_retriable());
    assert!(NetworkError::HttpStatus(500).is_retriable());
    assert!(NetworkError::HttpStatus(503).is_retriable());
    assert!(NetworkError::HttpStatus(504).is_retriable());
}

#[cfg(feature = "http")]
#[test]
fn network_error_classifies_non_retriable_errors() {
    assert!(!NetworkError::HttpStatus(401).is_retriable());
    assert!(!NetworkError::HttpStatus(403).is_retriable());
    assert!(!NetworkError::HttpStatus(404).is_retriable());
    assert!(!NetworkError::DnsFailure("no such host".into()).is_retriable());
    assert!(!NetworkError::TlsError("bad cert".into()).is_retriable());
    assert!(!NetworkError::Other("invalid response".into()).is_retriable());
}

#[test]
fn cancelled_open_returns_before_touching_source() {
    let cancelled = Arc::new(AtomicBool::new(true));
    let token = DecodeCancelToken::new(cancelled);

    let result = StreamingDecoder::open_with_credentials_and_cancel(
        "Z:/definitely/not/a/real/audio-file.flac",
        None,
        Some(token),
    );

    assert!(matches!(result, Err(DecoderError::Canceled)));
}

#[cfg(feature = "http")]
#[test]
fn cancelled_range_fetch_returns_before_network_request() {
    let cancelled = Arc::new(AtomicBool::new(true));
    let token = DecodeCancelToken::new(cancelled);
    let client = reqwest::blocking::Client::builder().build().unwrap();

    let result = fetch_range_once(
        &client,
        "http://127.0.0.1:9/never-requested.flac",
        None,
        0,
        8,
        Some(&token),
    );

    assert!(matches!(result, Err(NetworkError::Other(message)) if message == "Decode cancelled"));
}