hardcpy 0.2.1

Simple backup tool written in Rust
#[cfg(test)]
mod tests {
    use crate::_copy;
    use rand::Rng;
    use rusqlite::Connection;
    use std::fs;
    use std::fs::File;
    use std::io::Write;

    const FILE_SIZE: usize = 1024 * 1024 * 16;
    const FILE_SIZE_S: usize = 1024 * 1024;
    #[test]
    fn create_backup_singlethread() {
        let mut conn = Connection::open_in_memory().unwrap();
        let tx = conn.transaction().unwrap();

        tx.execute(
            "CREATE TABLE IF NOT EXISTS Backups (
            id INTEGER PRIMARY KEY,
            source TEXT NOT NULL,
            dest TEXT NOT NULL,
            compression TEXT
        )",
            (),
        )
        .unwrap();

        tx.execute(
            "CREATE TABLE IF NOT EXISTS Files (
            backup_id INTEGER NOT NULL,
            source TEXT NOT NULL,
            dest TEXT NOT NULL,
            sha256 TEXT NOT NULL,
            PRIMARY KEY (source, dest)
        )",
            (),
        )
        .unwrap();

        fs::create_dir_all("test/test_singlethread/source").unwrap();
        fs::create_dir_all("test/test_singlethread/dest").unwrap();

        let mut f = File::create("test/test_singlethread/source/big_file").unwrap();
        let mut rng = rand::thread_rng();
        let mut buf = Vec::with_capacity(FILE_SIZE);
        for _ in 0..=FILE_SIZE {
            buf.push(rng.gen());
        }
        f.write_all(&*buf).unwrap();
        f.flush().unwrap();

        _copy(
            &tx,
            false,
            "test/test_singlethread/source".into(),
            "test/test_singlethread/dest".into(),
        );
    }

    #[test]
    fn create_backup_multithread() {
        let mut conn = Connection::open_in_memory().unwrap();
        let tx = conn.transaction().unwrap();

        tx.execute(
            "CREATE TABLE IF NOT EXISTS Backups (
            id INTEGER PRIMARY KEY,
            source TEXT NOT NULL,
            dest TEXT NOT NULL,
            compression TEXT
        )",
            (),
        )
        .unwrap();

        tx.execute(
            "CREATE TABLE IF NOT EXISTS Files (
            backup_id INTEGER NOT NULL,
            source TEXT NOT NULL,
            dest TEXT NOT NULL,
            sha256 TEXT NOT NULL,
            PRIMARY KEY (source, dest)
        )",
            (),
        )
        .unwrap();

        fs::create_dir_all("test/test_multithread/source").unwrap();
        fs::create_dir_all("test/test_multithread/dest").unwrap();

        for i in 1..=16 {
            let mut f =
                File::create(format!("test/test_multithread/source/small_file{}", i)).unwrap();
            let mut rng = rand::thread_rng();
            let mut buf = Vec::with_capacity(FILE_SIZE_S);
            for _ in 0..=FILE_SIZE_S {
                buf.push(rng.gen());
            }
            f.write_all(&*buf).unwrap();
            f.flush().unwrap();
        }

        _copy(
            &tx,
            true,
            "test/test_multithread/source".into(),
            "test/test_multithread/dest".into(),
        );
    }
}