flatland-protocol 0.2.3

Flatland3 wire protocol types and codecs
Documentation
//! Wire frame size smoke test — catches oversized ticks before they hit TCP.

use flatland_protocol::{
    frame::{read_server_message, write_server_message, write_client_message},
    ClientMessage, Intent, ServerMessage,
};
use flatland_sim::{craft::BlueprintBook, RegionSim, WorldSegment};

#[tokio::test]
async fn starter_plains_tick_frame_under_limit() {
    const MAX: usize = 1_048_576;
    let segment_path = flatland_sim::default_seed_segment_path();
    let world = WorldSegment::from_yaml_file(&segment_path).expect("starter segment");
    let blueprint_dir = flatland_sim::craft::default_blueprints_path();
    let book = BlueprintBook::from_yaml_dir(&blueprint_dir).expect("blueprints");
    let mut sim = RegionSim::with_blueprints(world, book);

    let id = sim.spawn_player_at(128.0, 128.0, 0.0);
    sim.tick();

    let welcome = sim.welcome_snapshot(id);
    let delta = sim.tick_delta_for(id);

    let mut welcome_buf = Vec::new();
    write_server_message(
        &mut welcome_buf,
        &ServerMessage::Welcome(flatland_protocol::Welcome {
            session_id: 1,
            entity_id: id,
            snapshot: welcome,
        }),
    )
    .await
    .expect("encode welcome");

    let mut tick_buf = Vec::new();
    write_server_message(&mut tick_buf, &ServerMessage::Tick(delta))
        .await
        .expect("encode tick");

    let mut stop_buf = Vec::new();
    write_client_message(
        &mut stop_buf,
        &ClientMessage::Intent(Intent::Stop {
            entity_id: id,
            seq: 1,
        }),
    )
    .await
    .expect("encode stop");

    eprintln!("welcome frame: {} bytes", welcome_buf.len());
    eprintln!("tick frame: {} bytes", tick_buf.len());
    eprintln!("stop frame: {} bytes", stop_buf.len());

    assert!(
        welcome_buf.len() <= MAX,
        "welcome frame too large: {}",
        welcome_buf.len()
    );
    assert!(
        tick_buf.len() <= MAX,
        "tick frame too large: {}",
        tick_buf.len()
    );
    assert!(tick_buf.len() < 256 * 1024, "tick unexpectedly large");

    let mut cursor = std::io::Cursor::new(&welcome_buf);
    let decoded = read_server_message(&mut cursor)
        .await
        .expect("welcome roundtrip decode");
    assert!(matches!(decoded, ServerMessage::Welcome(_)));

    let mut cursor = std::io::Cursor::new(&tick_buf);
    let decoded = read_server_message(&mut cursor)
        .await
        .expect("tick roundtrip decode");
    assert!(matches!(decoded, ServerMessage::Tick(_)));
}