android-sparse 0.6.0

An implementation of Android's sparse file format.
Documentation
extern crate android_sparse as sparse;

mod util;

use self::util::{data_file, test_blocks};
use sparse::{Block, Encoder, Reader};

#[test]
fn read_sparse() {
    let file = data_file("hello.simg");
    let expected = test_blocks();

    let reader = Reader::new(file).unwrap();
    let blocks: Vec<_> = reader.map(|r| r.unwrap()).collect();
    assert_eq!(blocks.len(), expected.len());

    for (blk, exp) in blocks.iter().zip(expected.iter()) {
        assert_eq!(blk, exp);
    }
}

#[test]
fn read_sparse_with_crc() {
    let file = data_file("crc.simg");
    let mut expected = test_blocks();
    expected.push(Block::Crc32(0xffb880a5));

    let reader = Reader::with_crc(file).unwrap();
    let blocks: Vec<_> = reader.map(|r| r.unwrap()).collect();
    assert_eq!(blocks.len(), expected.len());

    for (blk, exp) in blocks.iter().zip(expected.iter()) {
        assert_eq!(blk, exp);
    }
}

#[test]
fn read_sparse_with_invalid_crc() {
    let file = data_file("invalid_crc.simg");

    let mut reader = Reader::with_crc(file).unwrap();
    assert!(reader.nth(5).unwrap().is_err());
}

#[test]
fn encode_raw() {
    let file = data_file("hello.img");
    let expected = test_blocks();

    let encoder = Encoder::new(file).unwrap();
    let blocks: Vec<_> = encoder.map(|r| r.unwrap()).collect();
    assert_eq!(blocks.len(), expected.len());

    for (blk, exp) in blocks.iter().zip(expected.iter()) {
        assert_eq!(blk, exp);
    }
}