corsa_client 0.39.0

Typed stdio API client bindings for Corsa
Documentation
use super::{CorsaError, MAX_BIN_BYTES, MSG_CALL, MSG_RESPONSE, read_tuple, write_tuple};
use std::io::Cursor;

#[test]
fn roundtrips_small_tuple() {
    let mut buffer = Vec::new();
    write_tuple(&mut buffer, MSG_CALL, b"ping", br#"{"ok":true}"#).unwrap();
    let tuple = read_tuple(&mut Cursor::new(buffer)).unwrap();
    assert_eq!(tuple.kind, MSG_CALL);
    assert_eq!(tuple.method, b"ping");
    assert_eq!(tuple.payload, br#"{"ok":true}"#);
}

#[test]
fn reads_uint8_encoded_kind() {
    let bytes = [
        0x93_u8,
        0xcc,
        MSG_RESPONSE,
        0xc4,
        4,
        b'p',
        b'i',
        b'n',
        b'g',
        0xc4,
        0,
    ];
    let tuple = read_tuple(&mut Cursor::new(bytes)).unwrap();
    assert_eq!(tuple.kind, MSG_RESPONSE);
    assert_eq!(tuple.method, b"ping");
    assert!(tuple.payload.is_empty());
}

#[test]
fn rejects_non_tuple_marker() {
    let err = read_tuple(&mut Cursor::new([0x92_u8])).unwrap_err();
    assert!(
        matches!(err, CorsaError::Protocol(message) if message.contains("expected tuple marker"))
    );
}

#[test]
fn rejects_invalid_uint_marker() {
    let bytes = [0x93_u8, 0xcd, 0, 1, 0xc4, 0, 0xc4, 0];
    let err = read_tuple(&mut Cursor::new(bytes)).unwrap_err();
    assert!(
        matches!(err, CorsaError::Protocol(message) if message.contains("expected uint8 marker"))
    );
}

#[test]
fn rejects_invalid_bin_marker() {
    let bytes = [0x93_u8, MSG_CALL, 0xa1, b'x', 0xc4, 0];
    let err = read_tuple(&mut Cursor::new(bytes)).unwrap_err();
    assert!(
        matches!(err, CorsaError::Protocol(message) if message.contains("expected bin marker"))
    );
}

#[test]
fn rejects_oversized_bin_length_before_allocation() {
    let len = ((MAX_BIN_BYTES as u32) + 1).to_be_bytes();
    let bytes = [&[0x93_u8, MSG_CALL, 0xc4, 0, 0xc6][..], &len, &[][..]].concat();
    let err = read_tuple(&mut Cursor::new(bytes)).unwrap_err();
    assert!(matches!(err, CorsaError::Protocol(message) if message.contains("too large")));
}

#[test]
fn write_tuple_selects_bin_threshold_markers() {
    let mut bin8 = Vec::new();
    write_tuple(&mut bin8, MSG_CALL, &[b'a'; 255], b"").unwrap();
    assert_eq!(bin8[2], 0xc4);

    let mut bin16 = Vec::new();
    write_tuple(&mut bin16, MSG_CALL, &[b'a'; 256], b"").unwrap();
    assert_eq!(bin16[2], 0xc5);

    let mut bin32 = Vec::new();
    write_tuple(&mut bin32, MSG_CALL, b"m", &[b'b'; 65_536]).unwrap();
    let payload_marker = 5;
    assert_eq!(bin32[payload_marker], 0xc6);
}