use std::io::Write;
use bytes::BytesMut;
use omp_core::encoding::*;
use proptest::prelude::*;
const INPUT_BUFFER_SIZE: usize = 768;
#[test]
fn test_encode_writer_exactly_input_buffer_size() {
let data = vec![0x42u8; INPUT_BUFFER_SIZE];
let mut output = Vec::new();
{
let mut writer = base64::encode_writer(&mut output);
writer.write_all(&data).unwrap();
writer.flush().unwrap();
}
let expected = base64::encode(&data).into_vec();
assert_eq!(output, expected);
}
#[test]
fn test_encode_writer_one_byte_over_input_buffer() {
let data = vec![0x42u8; INPUT_BUFFER_SIZE + 1];
let mut output = Vec::new();
{
let mut writer = base64::encode_writer(&mut output);
writer.write_all(&data).unwrap();
writer.flush().unwrap();
}
let expected = base64::encode(&data).into_vec();
assert_eq!(output, expected);
}
#[test]
fn test_encode_writer_one_byte_under_input_buffer() {
let data = vec![0x42u8; INPUT_BUFFER_SIZE - 1];
let mut output = Vec::new();
{
let mut writer = base64::encode_writer(&mut output);
writer.write_all(&data).unwrap();
writer.flush().unwrap();
}
let expected = base64::encode(&data).into_vec();
assert_eq!(output, expected);
}
#[test]
fn test_encode_writer_multiple_buffer_fills() {
let data = vec![0x42u8; INPUT_BUFFER_SIZE * 3];
let mut output = Vec::new();
{
let mut writer = base64::encode_writer(&mut output);
writer.write_all(&data).unwrap();
writer.flush().unwrap();
}
let expected = base64::encode(&data).into_vec();
assert_eq!(output, expected);
}
#[test]
fn test_encode_writer_small_writes_across_boundary() {
let mut output = Vec::new();
{
let mut writer = base64::encode_writer(&mut output);
for _ in 0..(INPUT_BUFFER_SIZE / 10 + 2) {
writer.write_all(&[0x42u8; 10]).unwrap();
}
writer.flush().unwrap();
}
let total_size = (INPUT_BUFFER_SIZE / 10 + 2) * 10;
let expected = base64::encode(&vec![0x42u8; total_size]).into_vec();
assert_eq!(output, expected);
}
#[test]
fn test_decode_writer_incomplete_group_buffering() {
let data = b"Hello World!";
let encoded = base64::encode(data).into_vec();
let mut output = Vec::new();
{
let mut writer = base64::decode_writer(&mut output);
for &byte in &encoded {
writer.write_all(&[byte]).unwrap();
}
writer.flush().unwrap();
}
assert_eq!(output, data);
}
#[test]
fn test_decode_writer_exactly_one_group() {
let data = b"Hel"; let encoded = base64::encode(data).into_vec();
let mut output = Vec::new();
{
let mut writer = base64::decode_writer(&mut output);
writer.write_all(&encoded).unwrap();
writer.flush().unwrap();
}
assert_eq!(output, data);
}
#[test]
fn test_decode_writer_partial_groups_not_flushed_until_final() {
let mut output = Vec::new();
{
let mut writer = base64::decode_writer(&mut output);
writer.write_all(b"SG").unwrap();
writer.write_all(b"Vs").unwrap();
writer.write_all(b"bG").unwrap();
writer.write_all(b"8=").unwrap();
writer.flush().unwrap();
}
assert_eq!(output, b"Hello");
}
#[test]
fn test_decode_writer_buffer_boundary_base32() {
let data = vec![0x42u8; 100];
let encoded = base32::encode(&data).into_vec();
let mut output = Vec::new();
{
let mut writer = base32::decode_writer(&mut output);
let chunk_size = 13; for chunk in encoded.chunks(chunk_size) {
writer.write_all(chunk).unwrap();
}
writer.flush().unwrap();
}
assert_eq!(output, data);
}
#[test]
fn test_decode_writer_exactly_input_buffer_size() {
let data_size = (INPUT_BUFFER_SIZE * 3) / 4; let data = vec![0x42u8; data_size];
let encoded = base64::encode(&data).into_vec();
let mut output = Vec::new();
{
let mut writer = base64::decode_writer(&mut output);
writer.write_all(&encoded).unwrap();
writer.flush().unwrap();
}
assert_eq!(output, data);
}
#[test]
fn test_encode_len_base64_padding() {
assert_eq!(base64::encode_len(0), 0);
assert_eq!(base64::encode_len(1), 4); assert_eq!(base64::encode_len(2), 4); assert_eq!(base64::encode_len(3), 4); assert_eq!(base64::encode_len(4), 8); }
#[test]
fn test_encode_raw_len_base64_no_padding() {
assert_eq!(base64::encode_raw_len(0), 0);
assert_eq!(base64::encode_raw_len(1), 2); assert_eq!(base64::encode_raw_len(2), 3); assert_eq!(base64::encode_raw_len(3), 4); assert_eq!(base64::encode_raw_len(4), 6); }
#[test]
fn test_encode_len_base32_padding() {
assert_eq!(base32::encode_len(0), 0);
assert_eq!(base32::encode_len(1), 8); assert_eq!(base32::encode_len(2), 8); assert_eq!(base32::encode_len(3), 8); assert_eq!(base32::encode_len(4), 8); assert_eq!(base32::encode_len(5), 8); assert_eq!(base32::encode_len(6), 16); }
#[test]
fn test_decode_len_base64() {
assert_eq!(base64::decode_len(0), 0);
assert_eq!(base64::decode_len(2), 1); assert_eq!(base64::decode_len(3), 2); assert_eq!(base64::decode_len(4), 3); }
#[test]
fn test_decode_len_base32() {
assert_eq!(base32::decode_len(0), 0);
assert_eq!(base32::decode_len(2), 1); assert_eq!(base32::decode_len(4), 2); assert_eq!(base32::decode_len(5), 3); assert_eq!(base32::decode_len(7), 4); assert_eq!(base32::decode_len(8), 5); }
#[test]
fn test_encode_n_empty_array() {
let data: [u8; 0] = [];
let encoded = base64::encode_n(&data);
assert_eq!(&*encoded, "");
}
#[test]
fn test_encode_n_single_byte() {
let data: [u8; 1] = [0x41]; let encoded = base64::RAW.encode_n(&data);
assert_eq!(&*encoded, "QQ");
}
#[test]
fn test_decode_n_empty_array() {
let data: [u8; 0] = [];
let decoded = base64::decode_n(&data).unwrap();
let empty: &[u8] = &[];
assert_eq!(&*decoded, empty);
}
#[test]
fn test_decode_n_wrong_size() {
let encoded: &[u8; 4] = b"QUFB";
let result = base64::RAW.decode_n(encoded);
let decoded = result.unwrap();
assert_eq!(decoded.len(), 3); }
#[test]
fn test_encode_n_max_capacity() {
let data: [u8; 5] = *b"Hello";
let encoded = base64::encode_n(&data); assert_eq!(&*encoded, "SGVsbG8=");
}
#[test]
fn test_encoder_exact_size_iter() {
let data = b"Hello";
let enc = base64::encode(data);
assert_eq!(enc.len(), 8); assert_eq!(enc.size_hint(), (8, Some(8)));
assert_eq!(enc.count(), 8);
}
#[test]
fn test_decoder_exact_size_iter() {
let encoded = b"SGVsbG8=";
let dec = base64::decode(encoded);
assert_eq!(dec.len(), 5); assert_eq!(dec.size_hint(), (5, Some(5)));
let collected: Result<Vec<u8>> = dec.collect();
assert_eq!(collected.unwrap().len(), 5);
}
#[test]
fn test_encoder_exact_size_after_partial_consumption() {
let data = b"Hi";
let mut enc = base64::encode(data);
assert_eq!(enc.len(), 4); enc.next(); assert_eq!(enc.count(), 3);
}
#[test]
fn test_decoder_exact_size_after_partial_consumption() {
let encoded = b"SGk=";
let mut dec = base64::decode(encoded);
assert_eq!(dec.len(), 2); dec.next(); let remaining: Result<Vec<u8>> = dec.collect();
assert_eq!(remaining.unwrap().len(), 1);
}
#[test]
fn test_encoder_fused() {
let data = b"A";
let mut enc = base64::encode(data);
while enc.next().is_some() {}
for _ in 0..10 {
assert_eq!(enc.next(), None);
}
}
#[test]
fn test_decoder_fused() {
let encoded = b"QQ==";
let mut dec = base64::decode(encoded);
while dec.next().is_some() {}
for _ in 0..10 {
assert_eq!(dec.next(), None);
}
}
#[test]
fn test_encoder_partial_eq() {
let enc1 = base64::encode(b"Hello");
let enc2 = base64::encode(b"Hello");
assert_eq!(enc1, enc2);
}
#[test]
fn test_encoder_partial_eq_slice() {
let enc = base64::encode(b"Hello");
assert_eq!(enc, b"SGVsbG8="[..]);
}
#[test]
fn test_encoder_partial_eq_str() {
let enc = base64::encode(b"Hello");
let s = enc.clone().into_string();
assert_eq!(s, "SGVsbG8=");
}
#[test]
fn test_decoder_partial_eq_slice() {
let dec = base64::decode(b"SGVsbG8=");
assert_eq!(dec, b"Hello"[..]);
}
#[test]
fn test_encoder_ord() {
let a = base64::encode(b"A");
let b = base64::encode(b"B");
assert!(a < b);
}
#[test]
fn test_encoder_into_buf() {
let data = b"Hello";
let buf = BytesMut::with_capacity(20);
let result = base64::encode(data).into_buf(buf);
assert_eq!(&result[..], b"SGVsbG8=");
}
#[test]
fn test_decoder_into_buf() {
let encoded = b"SGVsbG8=";
let buf = BytesMut::with_capacity(10);
let result = base64::decode(encoded).into_buf(buf).unwrap();
assert_eq!(&result[..], b"Hello");
}
#[test]
fn test_encoder_extend_into() {
let data = b"Hello";
let mut vec = Vec::new();
base64::encode(data).extend_into(&mut vec);
assert_eq!(vec, b"SGVsbG8=");
}
#[test]
fn test_decoder_extend_into() {
let encoded = b"SGVsbG8=";
let mut vec = Vec::new();
let n = base64::decode(encoded).extend_into(&mut vec).unwrap();
assert_eq!(n, 5);
assert_eq!(vec, b"Hello");
}
#[test]
fn test_encoder_display() {
let enc = base64::encode(b"Hello");
let s = format!("{enc}");
assert_eq!(s, "SGVsbG8=");
}
#[test]
fn test_decoder_display() {
let dec = base64::decode(b"SGVsbG8=");
let s = format!("{dec}");
assert_eq!(s, "48656c6c6f");
}
proptest! {
#[test]
fn proptest_encode_writer_consistency(data in prop::collection::vec(any::<u8>(), 0..1000)) {
let mut output = Vec::new();
{
let mut writer = base64::encode_writer(&mut output);
writer.write_all(&data).unwrap();
writer.flush().unwrap();
}
let expected = base64::encode(&data).into_vec();
prop_assert_eq!(output, expected);
}
#[test]
fn proptest_decode_writer_consistency(data in prop::collection::vec(any::<u8>(), 0..1000)) {
let encoded = base64::encode(&data).into_vec();
let mut output = Vec::new();
{
let mut writer = base64::decode_writer(&mut output);
writer.write_all(&encoded).unwrap();
writer.flush().unwrap();
}
prop_assert_eq!(output, data);
}
#[test]
fn proptest_encode_writer_chunked(
data in prop::collection::vec(any::<u8>(), 1..1000),
chunk_size in 1usize..100
) {
let mut output = Vec::new();
{
let mut writer = base64::encode_writer(&mut output);
for chunk in data.chunks(chunk_size) {
writer.write_all(chunk).unwrap();
}
writer.flush().unwrap();
}
let expected = base64::encode(&data).into_vec();
prop_assert_eq!(output, expected);
}
#[test]
fn proptest_decoder_into_buf_consistency(data in prop::collection::vec(any::<u8>(), 0..100)) {
let encoded = base64::encode(&data).into_vec();
let buf = BytesMut::with_capacity(data.len() + 10);
let result = base64::decode(&encoded).into_buf(buf).unwrap();
prop_assert_eq!(&result[..], data.as_slice());
}
#[test]
fn proptest_encoder_exact_size_accurate(data in prop::collection::vec(any::<u8>(), 0..100)) {
let enc = base64::encode(&data);
let len = enc.len();
prop_assert_eq!(enc.count(), len);
}
}