buntrail-protocol 0.2.0

Versioned framed transport contracts and validation.
Documentation
use buntrail_core::contracts::TargetPath;
use buntrail_protocol::types::WirePath;

#[test]
fn wire_paths_preserve_windows_units_and_posix_bytes() {
    let windows = TargetPath::WindowsWide(vec![67, 58, 92, 0xd800]);
    let wire = WirePath::from_core(&windows).unwrap();
    assert_eq!(
        serde_json::to_value(&wire).unwrap(),
        serde_json::json!({"kind":"windows","base64":"QwA6AFwAANg="})
    );
    assert_eq!(wire.core(), windows);
    let decoded: WirePath =
        serde_json::from_value(serde_json::json!({"kind":"windows","base64":"QwA6AFwAANg="}))
            .unwrap();
    assert_eq!(decoded.core(), windows);
    let posix = TargetPath::PosixBytes(vec![47, 255]);
    let wire = WirePath::from_core(&posix).unwrap();
    assert_eq!(
        serde_json::to_value(&wire).unwrap(),
        serde_json::json!({"kind":"posix","base64":"L/8="})
    );
    assert_eq!(wire.core(), posix);
    let decoded: WirePath =
        serde_json::from_value(serde_json::json!({"kind":"posix","base64":"L/8="})).unwrap();
    assert_eq!(decoded.core(), posix);
    let decoded: WirePath =
        serde_json::from_value(serde_json::json!({"kind":"windows","base64":"QwA6AFwAPdiH3A=="}))
            .unwrap();
    assert_eq!(
        decoded.core(),
        TargetPath::WindowsWide(vec![67, 58, 92, 0xd83d, 0xdc87])
    );
}

#[test]
fn wire_paths_validate_before_use() {
    for value in [
        serde_json::json!({"kind":"windows","base64":"QwA6AFw="}),
        serde_json::json!({"kind":"windows","base64":"QwA6AHgA"}),
        serde_json::json!({"kind":"windows","base64":"QwA6AFwAAAA="}),
        serde_json::json!({"kind":"posix","base64":"AA=="}),
        serde_json::json!({"kind":"posix","base64":"%%%="}),
    ] {
        assert!(serde_json::from_value::<WirePath>(value).is_err());
    }
    for value in [
        serde_json::json!("Lw=="),
        serde_json::json!({"kind":"other","base64":"Lw=="}),
        serde_json::json!({"kind":"posix","base64":"Lw==","display":"/spoof"}),
    ] {
        assert!(serde_json::from_value::<WirePath>(value).is_err());
    }
    assert!(WirePath::from_core(&TargetPath::WindowsWide(vec![67, 58, 120])).is_err());
    assert!(WirePath::from_core(&TargetPath::PosixBytes(vec![0])).is_err());
}

#[test]
fn wire_paths_reject_windows_device_aliases() {
    for encoded in [
        "QwA6AFwATgBVAEwA",
        "XABcAHMAZQByAHYAZQByAFwAcABpAHAAZQBcAG4AYQBtAGUA",
        "XABcAD8AXABVAE4AQwBcAHMAZQByAHYAZQByAFwASQBQAEMAJABcAG4AYQBtAGUA",
    ] {
        assert!(
            serde_json::from_value::<WirePath>(
                serde_json::json!({"kind":"windows","base64":encoded})
            )
            .is_err()
        );
    }
}