#![allow(clippy::panic_in_result_fn)]
use crush_core::{compress_with_options, init_plugins, CompressionOptions, Result};
use std::time::Duration;
#[test]
fn test_compression_within_timeout() -> Result<()> {
init_plugins()?;
let data = b"Test data that should compress quickly within timeout.";
let options = CompressionOptions::default().with_timeout(Duration::from_secs(5));
let result = compress_with_options(data, &options);
assert!(result.is_ok(), "Compression should succeed within timeout");
let compressed = result?;
assert!(!compressed.is_empty());
Ok(())
}
#[test]
fn test_default_timeout_applied() -> Result<()> {
init_plugins()?;
let data = b"Test data for default timeout.";
let options = CompressionOptions::default();
let result = compress_with_options(data, &options);
assert!(
result.is_ok(),
"Compression should succeed with default 30s timeout"
);
Ok(())
}
#[test]
fn test_configurable_timeout() -> Result<()> {
init_plugins()?;
let data = b"Test data for configurable timeout.";
let short_timeout = CompressionOptions::default().with_timeout(Duration::from_secs(1));
let long_timeout = CompressionOptions::default().with_timeout(Duration::from_secs(10));
assert!(compress_with_options(data, &short_timeout).is_ok());
assert!(compress_with_options(data, &long_timeout).is_ok());
Ok(())
}
#[test]
fn test_cancellation_infrastructure_exists() -> Result<()> {
init_plugins()?;
let data = b"Test data for cancellation infrastructure.";
let options = CompressionOptions::default().with_timeout(Duration::from_millis(100));
let result = compress_with_options(data, &options);
assert!(
result.is_ok(),
"Fast operations should complete before timeout"
);
Ok(())
}
#[test]
fn test_fast_compression_short_timeout() -> Result<()> {
init_plugins()?;
let data = b"Hi";
let options = CompressionOptions::default().with_timeout(Duration::from_millis(10));
let result = compress_with_options(data, &options);
assert!(result.is_ok(), "Tiny data should compress within 10ms");
Ok(())
}
#[test]
fn test_zero_timeout_handling() {
if let Ok(()) = init_plugins() {
let data = b"Test data";
let options = CompressionOptions::default().with_timeout(Duration::from_secs(0));
let result = compress_with_options(data, &options);
let _ = result;
}
}
#[test]
fn test_multiple_operations_with_timeout() -> Result<()> {
init_plugins()?;
let options = CompressionOptions::default().with_timeout(Duration::from_secs(2));
for i in 0..5 {
let data = format!("Test data iteration {i}");
let result = compress_with_options(data.as_bytes(), &options);
assert!(
result.is_ok(),
"Iteration {i} should succeed within timeout"
);
}
Ok(())
}
#[test]
fn test_large_data_within_timeout() -> Result<()> {
init_plugins()?;
let data = vec![0x42u8; 1_000_000];
let options = CompressionOptions::default().with_timeout(Duration::from_secs(5));
let result = compress_with_options(&data, &options);
assert!(result.is_ok(), "1MB should compress within 5 seconds");
Ok(())
}
#[test]
fn test_timeout_with_plugin_selection() -> Result<()> {
init_plugins()?;
let data = b"Test data for plugin selection with timeout.";
let options = CompressionOptions::default()
.with_plugin("deflate")
.with_timeout(Duration::from_secs(2));
let result = compress_with_options(data, &options);
assert!(result.is_ok(), "DEFLATE should complete within timeout");
Ok(())
}
#[test]
fn test_timeout_error_message_quality() -> Result<()> {
init_plugins()?;
let data = b"Test data";
let options = CompressionOptions::default().with_timeout(Duration::from_secs(1));
let result = compress_with_options(data, &options);
if let Err(e) = result {
let error_msg = format!("{e}");
assert!(
error_msg.to_lowercase().contains("timeout")
|| error_msg.to_lowercase().contains("timed out"),
"Timeout error should mention timeout in message: {error_msg}"
);
}
Ok(())
}