lesavka/tests/integration/common/proto/relay_proto_integration_contract.rs

53 lines
1.9 KiB
Rust

// Integration contract between the protobuf API and server implementation.
//
// Scope: compare the generated service surface contract with the relay handler
// implementation files that dispatch each RPC.
// Targets: `common/proto/lesavka.proto` and `server/src/main/relay_service.rs`.
// Why: client and server can compile independently while still drifting at the
// protocol boundary; this test keeps the end-to-end RPC seam visible.
const PROTO: &str = include_str!(concat!(
env!("CARGO_MANIFEST_DIR"),
"/common/proto/lesavka.proto"
));
const RELAY_SERVICE: &str = include_str!(concat!(
env!("CARGO_MANIFEST_DIR"),
"/server/src/main/relay_service.rs"
));
const HANDSHAKE_SERVICE: &str = include_str!(concat!(
env!("CARGO_MANIFEST_DIR"),
"/server/src/handshake.rs"
));
#[test]
fn proto_rpc_surface_has_matching_relay_dispatch_methods() {
for (rpc, method) in [
("StreamKeyboard", "stream_keyboard_rpc"),
("StreamMouse", "stream_mouse_rpc"),
("CaptureVideo", "capture_video_rpc"),
("CaptureAudio", "capture_audio_rpc"),
("StreamMicrophone", "stream_microphone_rpc"),
("StreamCamera", "stream_camera_rpc"),
("StreamWebcamMedia", "stream_webcam_media_rpc"),
("RunOutputDelayProbe", "run_output_delay_probe_rpc"),
("PasteText", "paste_text_rpc"),
("RecoverUsb", "recover_usb_rpc"),
("RecoverUac", "recover_uac_rpc"),
("RecoverUvc", "recover_uvc_rpc"),
] {
assert!(
PROTO.contains(&format!("rpc {rpc}")),
"missing proto RPC {rpc}"
);
assert!(
RELAY_SERVICE.contains(method),
"relay service should dispatch {rpc} through {method}"
);
}
assert!(
PROTO.contains("rpc GetCapabilities") && HANDSHAKE_SERVICE.contains("get_capabilities"),
"handshake service should implement the GetCapabilities API"
);
}