syncless 0.2.0

ordered, atomic storage without durability guarantees
Documentation
use tempfile::tempdir;
use syncless::{open, WriteOpenMode, open_readonly};
use std::fs;

#[test]
fn compact() {
    let dir = tempdir().unwrap();
    let path = dir.path().join("store");

    let mut store = open(&path, WriteOpenMode::MustNotExist).unwrap();

    let mut prev_len = fs::metadata(&path).unwrap().len();

    let mut off = 0usize;
    loop {
        store.write(off as u64, b"ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789").unwrap();
        assert!(store.size() == off as u64 + 36);
        let new_len = fs::metadata(&path).unwrap().len();
        if new_len < prev_len {
            break;
        }
        prev_len = new_len;
        off += 1;
    }

    assert!(store.size() == off as u64 + 36);
    let mut compacted_contents = vec![0u8; store.size() as usize];
    store.read(0, &mut compacted_contents).unwrap();

    for i in 0..off {
        assert_eq!(compacted_contents[i], b'A');
    }
    assert_eq!(&compacted_contents[off..], b"ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789");

    let mut store = open_readonly(path).unwrap();
    assert!(store.size() == off as u64 + 36);
    let mut reread_contents = vec![0u8; store.size() as usize];
    store.read(0, &mut reread_contents).unwrap();

    assert!(reread_contents == compacted_contents);
}