mod common;
use ripcurl::protocol::{DestinationWriter, TransferError};
use common::mock_protocols::MockWriter;
#[tokio::test]
async fn test_mock_writer_partial_write_buffer_consistency() {
let mut writer = MockWriter::new().fail_transiently_at(50, "disk busy");
let chunk = vec![0xABu8; 100];
let result = writer.write(&chunk).await;
assert!(matches!(
result,
Err(TransferError::Transient {
consumed_byte_count: 50,
..
})
));
assert_eq!(writer.written.len(), 50);
assert!(writer.written.iter().all(|&b| b == 0xAB));
}
#[tokio::test]
async fn test_mock_writer_error_after_multiple_writes() {
let mut writer = MockWriter::new().fail_transiently_at(80, "disk busy");
let chunk1 = vec![1u8; 50];
assert!(writer.write(&chunk1).await.is_ok());
assert_eq!(writer.written.len(), 50);
let chunk2 = vec![2u8; 50];
let result = writer.write(&chunk2).await;
assert!(matches!(
result,
Err(TransferError::Transient {
consumed_byte_count: 80,
..
})
));
assert_eq!(writer.written.len(), 80);
assert!(writer.written[..50].iter().all(|&b| b == 1));
assert!(writer.written[50..80].iter().all(|&b| b == 2));
}
#[tokio::test]
async fn test_mock_writer_error_at_zero() {
let mut writer = MockWriter::new().fail_transiently_at(0, "immediate failure");
let chunk = vec![1u8; 10];
let result = writer.write(&chunk).await;
assert!(matches!(
result,
Err(TransferError::Transient {
consumed_byte_count: 0,
..
})
));
assert_eq!(writer.written.len(), 0);
}
#[tokio::test]
async fn test_mock_writer_error_exactly_on_boundary() {
let mut writer = MockWriter::new().fail_transiently_at(50, "disk busy");
let chunk = vec![1u8; 50];
let result = writer.write(&chunk).await;
assert!(result.is_ok());
assert_eq!(writer.written.len(), 50);
let chunk2 = vec![2u8; 1];
let result2 = writer.write(&chunk2).await;
assert!(matches!(result2, Err(TransferError::Transient { .. })));
assert_eq!(writer.written.len(), 50); }