sim-lib-stream-host 0.1.2

Host-device stream backend substrate for SIM streams.
Documentation
use sim_kernel::{Expr, Symbol};
use sim_lib_stream_core::{StreamPacket, TransportProfile};

use crate::{FakeBackend, HostBackendRegistry, HostCallbackCassette, HostCallbackReplayReport};

use super::support::authorized_cx;

#[test]
fn host_callback_cassette_replays_callback_timeline() {
    let mut registry = HostBackendRegistry::new();
    registry.register(FakeBackend::new()).unwrap();
    let mut cx = authorized_cx();
    let opened = registry
        .open_checked(&mut cx, FakeBackend::data_request(4).unwrap())
        .unwrap();
    let mut cassette = HostCallbackCassette::new();
    cassette.record_packet(StreamPacket::data(
        Symbol::qualified("stream/data", "expr"),
        Expr::String("first".to_owned()),
    ));
    cassette.record_packet(StreamPacket::data(
        Symbol::qualified("stream/data", "expr"),
        Expr::String("second".to_owned()),
    ));

    let shared = cassette
        .to_stream_cassette(
            opened.config().metadata(),
            TransportProfile::remote_stream_fabric(),
        )
        .unwrap();
    let cassette = HostCallbackCassette::from_stream_cassette(&shared).unwrap();

    let report = cassette.replay(opened.queue()).unwrap();

    let replayed = opened.queue().drain(4).unwrap();
    assert_eq!(
        report,
        HostCallbackReplayReport {
            accepted: 2,
            ..HostCallbackReplayReport::default()
        }
    );
    assert_eq!(replayed.len(), 2);
    assert_eq!(
        replayed[0].packet(),
        &StreamPacket::data(
            Symbol::qualified("stream/data", "expr"),
            Expr::String("first".to_owned()),
        )
    );
}

#[test]
fn host_callback_cassette_replay_reports_dropped_newest() {
    let mut registry = HostBackendRegistry::new();
    registry.register(FakeBackend::new()).unwrap();
    let mut cx = authorized_cx();
    let opened = registry
        .open_checked(&mut cx, FakeBackend::data_request(1).unwrap())
        .unwrap();
    let mut cassette = HostCallbackCassette::new();
    cassette.record_packet(StreamPacket::data(
        Symbol::qualified("stream/data", "expr"),
        Expr::String("first".to_owned()),
    ));
    cassette.record_packet(StreamPacket::data(
        Symbol::qualified("stream/data", "expr"),
        Expr::String("second".to_owned()),
    ));

    let report = cassette.replay(opened.queue()).unwrap();

    assert_eq!(
        report,
        HostCallbackReplayReport {
            accepted: 1,
            dropped_newest: 1,
            ..HostCallbackReplayReport::default()
        }
    );
    assert_eq!(opened.queue().drain(4).unwrap().len(), 1);
}

#[test]
fn host_callback_cassette_replay_reports_closed_queue() {
    let mut registry = HostBackendRegistry::new();
    registry.register(FakeBackend::new()).unwrap();
    let mut cx = authorized_cx();
    let opened = registry
        .open_checked(&mut cx, FakeBackend::data_request(2).unwrap())
        .unwrap();
    let mut cassette = HostCallbackCassette::new();
    cassette.record_packet(StreamPacket::data(
        Symbol::qualified("stream/data", "expr"),
        Expr::String("first".to_owned()),
    ));
    cassette.record_packet(StreamPacket::data(
        Symbol::qualified("stream/data", "expr"),
        Expr::String("second".to_owned()),
    ));

    opened.close().unwrap();
    let report = cassette.replay(opened.queue()).unwrap();

    assert_eq!(
        report,
        HostCallbackReplayReport {
            closed: 2,
            ..HostCallbackReplayReport::default()
        }
    );
}