fn check_overreading()

in shed/async_compression/src/test.rs [191:239]


fn check_overreading(c_type: CompressorType, data: &[u8], extra: &[u8]) -> TestResult {
    const EXTRA_SPACE: usize = 8;

    let mut decompressor = {
        let mut compressor = Compressor::new(Cursor::new(Vec::new()), c_type);
        compressor.write_all(data).unwrap();
        compressor.flush().unwrap();
        let mut compressed = compressor.try_finish().unwrap().into_inner();

        for u in extra {
            compressed.push(*u);
        }

        Decompressor::new(
            BufReader::new(Cursor::new(compressed)),
            c_type.decompressor_type(),
        )
    };

    {
        let mut buf = vec![0u8; data.len() + extra.len() + EXTRA_SPACE];
        let mut expected = Vec::new();
        expected.extend_from_slice(data);
        expected.extend_from_slice(vec![0u8; extra.len() + EXTRA_SPACE].as_slice());

        if !(decompressor.read(buf.as_mut_slice()).unwrap() == data.len() && buf == expected) {
            return TestResult::error(format!("decoding failed, buf: {:?}", buf));
        }
    }

    {
        let mut buf = vec![0u8; data.len() + extra.len() + EXTRA_SPACE];

        if !(decompressor.read(buf.as_mut_slice()).unwrap() == 0 && buf == vec![0u8; buf.len()]) {
            return TestResult::error(format!("detecting eof failed, buf: {:?}", buf));
        }
    }

    {
        let mut buf = Vec::new();

        let mut remainder = decompressor.into_inner();
        if !(remainder.read_to_end(&mut buf).unwrap() == extra.len() && buf.as_slice() == extra) {
            return TestResult::error(format!("leaving remainder failed, buf: {:?}", buf));
        }
    }

    TestResult::passed()
}