superfluid 0.1.4

The superfluid daemon: durable session store (WAL, verbatim token spans, epochs), generation runtime over Link W, and the native session API
Documentation
#![cfg(feature = "basert")]

use std::process::{Command, Output};

fn serve(tag: &str, args: &[&str]) -> Output {
    let dir = std::env::temp_dir().join(format!("superfluid-serve-cli-{tag}-{}", std::process::id()));
    Command::new(env!("CARGO_BIN_EXE_superfluid"))
        .args(["serve", "--model", "/nonexistent/model.base", "--sessions"])
        .arg(dir.join("sessions"))
        .args(args)
        .output()
        .expect("run superfluid")
}

#[test]
fn a_socket_path_too_long_to_bind_is_refused_before_loading() {
    let long = format!("/tmp/{}/superfluid.sock", "x".repeat(120));
    let out = serve("sock", &["--socket", &long, "--no-http"]);
    let err = String::from_utf8_lossy(&out.stderr);
    assert_eq!(out.status.code(), Some(2), "{err}");
    assert!(err.contains("a unix socket path must be under"), "{err}");
    assert!(!err.contains("panicked"), "{err}");
}

#[test]
fn an_address_already_taken_is_refused_before_loading() {
    let taken = std::net::TcpListener::bind("127.0.0.1:0").unwrap();
    let addr = taken.local_addr().unwrap().to_string();
    let sock = std::env::temp_dir().join(format!("bsc-{}.sock", std::process::id()));
    let out = serve("http", &["--socket", sock.to_str().unwrap(), "--http", &addr]);
    let err = String::from_utf8_lossy(&out.stderr);
    assert_eq!(out.status.code(), Some(1), "{err}");
    assert!(err.contains(&format!("cannot listen on --http {addr}")), "{err}");
    assert!(err.contains("another process listens there"), "{err}");
    assert!(!err.contains("panicked"), "{err}");
    drop(taken);
}

#[test]
fn help_and_version_answer_on_stdout() {
    let run = |args: &[&str]| Command::new(env!("CARGO_BIN_EXE_superfluid")).args(args).output().expect("run superfluid");
    for args in [&["--help"][..], &["help"], &["serve", "--help"], &["help", "serve"], &["runtime", "--help"], &["session", "-h"]] {
        let out = run(args);
        assert!(out.status.success(), "{args:?}");
        assert!(String::from_utf8_lossy(&out.stdout).contains("Usage:"), "{args:?}");
    }
    let out = run(&["--version"]);
    assert!(String::from_utf8_lossy(&out.stdout).starts_with("superfluid "));
    let out = run(&["serv"]);
    assert_eq!(out.status.code(), Some(2));
    assert!(String::from_utf8_lossy(&out.stderr).contains("did you mean serve?"));
    let out = run(&["serve", "--port=nope", "m.gguf"]);
    assert_eq!(out.status.code(), Some(2));
    assert!(String::from_utf8_lossy(&out.stderr).contains("--port expects a number, got \"nope\""));
}