liteboxfs 0.2.0

A modern POSIX filesystem in a SQLite database
Documentation
use std::path::Path;

use liteboxfs::{Connection, CreateOptions, Device, Error, FileKind, FileOrigin, Owner};

use xpct::{be_err, equal, expect, match_pattern, pattern};

#[test]
fn regular_file_kind() -> liteboxfs::Result<()> {
    let mut conn = Connection::open_in_memory(&CreateOptions::new())?;

    conn.exec(|fs| {
        fs.create("test.txt", FileKind::Regular, Owner::ROOT)?;
        let file = fs.open("test.txt")?;

        expect!(file.kind()).to(equal(&FileKind::Regular));

        liteboxfs::Result::Ok(())
    })?;

    Ok(())
}

#[test]
fn dir_file_kind() -> liteboxfs::Result<()> {
    let mut conn = Connection::open_in_memory(&CreateOptions::new())?;

    conn.exec(|fs| {
        fs.create("dir", FileKind::Dir, Owner::ROOT)?;
        let file = fs.open("dir")?;

        expect!(file.kind()).to(equal(&FileKind::Dir));

        liteboxfs::Result::Ok(())
    })?;

    Ok(())
}

#[test]
fn symlink_file_kind() -> liteboxfs::Result<()> {
    let mut conn = Connection::open_in_memory(&CreateOptions::new())?;

    conn.exec(|fs| {
        fs.create(
            "symlink.txt",
            FileKind::Symlink {
                target: "target.txt".into(),
            },
            Owner::ROOT,
        )?;
        let file = fs.open("symlink.txt")?;

        expect!(file.kind()).to(equal(&FileKind::Symlink {
            target: "target.txt".into(),
        }));

        liteboxfs::Result::Ok(())
    })?;

    Ok(())
}

#[test]
fn block_device_file_kind() -> liteboxfs::Result<()> {
    let mut conn = Connection::open_in_memory(&CreateOptions::new())?;

    conn.exec(|fs| {
        fs.create(
            "device",
            FileKind::Block {
                dev: Device::new(1, 2),
            },
            Owner::ROOT,
        )?;
        let file = fs.open("device")?;

        expect!(file.kind()).to(equal(&FileKind::Block {
            dev: Device::new(1, 2),
        }));

        liteboxfs::Result::Ok(())
    })?;

    Ok(())
}

#[test]
fn char_device_file_kind() -> liteboxfs::Result<()> {
    let mut conn = Connection::open_in_memory(&CreateOptions::new())?;

    conn.exec(|fs| {
        fs.create(
            "device",
            FileKind::Char {
                dev: Device::new(1, 2),
            },
            Owner::ROOT,
        )?;
        let file = fs.open("device")?;

        expect!(file.kind()).to(equal(&FileKind::Char {
            dev: Device::new(1, 2),
        }));

        liteboxfs::Result::Ok(())
    })?;

    Ok(())
}

#[test]
fn pipe_file_kind() -> liteboxfs::Result<()> {
    let mut conn = Connection::open_in_memory(&CreateOptions::new())?;

    conn.exec(|fs| {
        fs.create("fifo", FileKind::Pipe, Owner::ROOT)?;
        let file = fs.open("fifo")?;

        expect!(file.kind()).to(equal(&FileKind::Pipe));

        liteboxfs::Result::Ok(())
    })?;

    Ok(())
}

#[test]
fn create_file_that_already_exists_errors() -> liteboxfs::Result<()> {
    let mut conn = Connection::open_in_memory(&CreateOptions::new())?;

    conn.exec(|fs| {
        fs.create("test.txt", FileKind::Regular, Owner::ROOT)?;

        let result = fs.create("test.txt", FileKind::Regular, Owner::ROOT);
        expect!(result)
            .to(be_err())
            .to(match_pattern(pattern!(Error::FileAlreadyExists {
                path: FileOrigin::Litebox { locator, .. },
                ..
            } if locator == Path::new("/test.txt"))));

        liteboxfs::Result::Ok(())
    })?;

    Ok(())
}