radio/iroh-car/tests/car_file_test.rs

use futures::TryStreamExt;
use iroh_car::*;
use tokio::io::BufReader;

#[cfg(target_arch = "wasm32")]
use wasm_bindgen_test::wasm_bindgen_test;

#[cfg(target_arch = "wasm32")]
wasm_bindgen_test::wasm_bindgen_test_configure!(run_in_browser);

const TEST_V1_CAR: &[u8] = include_bytes!("testv1.car");
const CAR_V1_BASIC: &[u8] = include_bytes!("carv1_basic.car");

#[cfg_attr(target_arch = "wasm32", wasm_bindgen_test)]
#[cfg_attr(not(target_arch = "wasm32"), tokio::test)]
async fn roundtrip_carv1_test_file() {
    let buf_reader = BufReader::new(TEST_V1_CAR);

    let car_reader = CarReader::new(buf_reader).await.unwrap();
    let header = car_reader.header().clone();
    let files: Vec<_> = car_reader.stream().try_collect().await.unwrap();
    assert_eq!(files.len(), 35);

    let mut buffer = Vec::new();
    let mut writer = CarWriter::new(header, &mut buffer);
    for (cid, data) in &files {
        writer.write(*cid, data).await.unwrap();
    }
    writer.finish().await.unwrap();

    assert_eq!(TEST_V1_CAR, buffer.as_slice());
}

#[cfg_attr(target_arch = "wasm32", wasm_bindgen_test)]
#[cfg_attr(not(target_arch = "wasm32"), tokio::test)]
async fn roundtrip_carv1_basic_fixtures_file() {
    let buf_reader = BufReader::new(CAR_V1_BASIC);

    let car_reader = CarReader::new(buf_reader).await.unwrap();
    let header = car_reader.header().clone();

    assert_eq!(
        car_reader.header().roots(),
        [
            "bafyreihyrpefhacm6kkp4ql6j6udakdit7g3dmkzfriqfykhjw6cad5lrm"
                .parse()
                .unwrap(),
            "bafyreidj5idub6mapiupjwjsyyxhyhedxycv4vihfsicm2vt46o7morwlm"
                .parse()
                .unwrap()
        ]
    );

    let files: Vec<_> = car_reader.stream().try_collect().await.unwrap();
    assert_eq!(files.len(), 8);

    let cids = [
        "bafyreihyrpefhacm6kkp4ql6j6udakdit7g3dmkzfriqfykhjw6cad5lrm",
        "QmNX6Tffavsya4xgBi2VJQnSuqy9GsxongxZZ9uZBqp16d",
        "bafkreifw7plhl6mofk6sfvhnfh64qmkq73oeqwl6sloru6rehaoujituke",
        "QmWXZxVQ9yZfhQxLD35eDR8LiMRsYtHxYqTFCBbJoiJVys",
        "bafkreiebzrnroamgos2adnbpgw5apo3z4iishhbdx77gldnbk57d4zdio4",
        "QmdwjhxpxzcMsR3qUuj7vUL8pbA7MgR3GAxWi2GLHjsKCT",
        "bafkreidbxzk2ryxwwtqxem4l3xyyjvw35yu4tcct4cqeqxwo47zhxgxqwq",
        "bafyreidj5idub6mapiupjwjsyyxhyhedxycv4vihfsicm2vt46o7morwlm",
    ];

    for (expected_cid, (cid, _)) in cids.iter().zip(&files) {
        assert_eq!(*cid, expected_cid.parse().unwrap());
    }

    let mut buffer = Vec::new();
    let mut writer = CarWriter::new(header, &mut buffer);
    for (cid, data) in &files {
        writer.write(*cid, data).await.unwrap();
    }
    writer.finish().await.unwrap();

    assert_eq!(CAR_V1_BASIC, buffer.as_slice());
}

Neighbours