fslite-conformance 0.1.0

A transport-independent, async virtual filesystem with a SQLite-backed persistent backend, HTTP adapter, and CLI.
Documentation
use fslite_core::{CreateOptions, NodeKind, RequestContext, StatOptions, VirtualPath};

use crate::ConformanceFactory;

pub(crate) async fn run(factory: &dyn ConformanceFactory) {
    symlink_round_trips_and_follows(factory).await;
}

async fn symlink_round_trips_and_follows(factory: &dyn ConformanceFactory) {
    let fs = factory.fresh().await;
    let workspace_id = factory.workspace(&*fs).await;
    let ctx = RequestContext::trusted(workspace_id);

    fs.mkdir(
        &ctx,
        &VirtualPath::parse("/real").unwrap(),
        Default::default(),
    )
    .await
    .unwrap();
    fs.symlink(
        &ctx,
        &fslite_core::LinkTarget::parse("/real").unwrap(),
        &VirtualPath::parse("/link").unwrap(),
        CreateOptions::default(),
    )
    .await
    .unwrap();

    let target = fs
        .read_link(&ctx, &VirtualPath::parse("/link").unwrap())
        .await
        .unwrap();
    assert_eq!(target.as_str(), "/real");

    let followed = fs
        .stat(
            &ctx,
            &VirtualPath::parse("/link").unwrap(),
            Default::default(),
        )
        .await
        .unwrap();
    assert_eq!(followed.kind, NodeKind::Directory);

    let not_followed = fs
        .stat(
            &ctx,
            &VirtualPath::parse("/link").unwrap(),
            StatOptions::default().follow_symlinks(false),
        )
        .await
        .unwrap();
    assert_eq!(not_followed.kind, NodeKind::Symlink);
}