radio/iroh-car/tests/car_writer_bytes_test.rs

use cid::Cid;
use iroh_car::*;
use multihash::Multihash;
use multihash_codetable::{Code, MultihashDigest};
use proptest::{collection::vec, prelude::any, prop_assert_eq, strategy::Strategy};
use test_strategy::proptest;

fn identity_hash_cid() -> impl Strategy<Value = Cid> {
    vec(any::<u8>(), 0..64)
        .prop_map(|hash_bytes| Cid::new_v1(0x55, Multihash::wrap(0x00, &hash_bytes).unwrap()))
}

#[proptest(max_shrink_iters = 1_000_000)]
fn write_returns_bytes_written(
    #[strategy(vec(vec(any::<u8>(), 0..1_000), 0..100))] blocks: Vec<Vec<u8>>,
    #[strategy(vec(identity_hash_cid(), 1..100))] roots: Vec<Cid>,
) {
    let (supposedly_written, actually_written) = tokio::runtime::Builder::new_current_thread()
        .enable_all()
        .build()
        .expect("Failed building the Runtime")
        .block_on(async move {
            let mut writer = CarWriter::new(CarHeader::new_v1(roots), Vec::new());
            let mut written = 0;
            written += writer.write_header().await.unwrap();
            for block in blocks {
                let hash = Code::Sha2_256.digest(&block);
                let cid = Cid::new_v1(0x55, hash);
                written += writer.write(cid, block).await.unwrap();
            }
            let buffer = writer.finish().await.unwrap();
            (written, buffer.len())
        });

    prop_assert_eq!(supposedly_written, actually_written);
}

Neighbours