补齐桌面壳命令入口单测

桌面壳 host_bridge_request 入口抽出请求准备阶段

桌面壳单测覆盖非法请求进入 replay 前被拒绝

桌面壳配置门禁和宿主壳文档同步命令入口边界
This commit is contained in:
2026-06-20 09:03:22 +08:00
parent 05e7ca1015
commit fe1caff3db
5 changed files with 59 additions and 4 deletions
@@ -22,16 +22,25 @@ use crate::host_bridge::protocol::{
HostBridgeResponse,
};
fn prepare_host_bridge_request(
request: &mut HostBridgeRequest,
) -> Option<HostBridgeResponse> {
if let Some(response) = validate_request(request) {
return Some(response);
}
request.id = normalize_request_id(&request.id).unwrap_or_else(|| request.id.clone());
None
}
#[tauri::command]
pub(crate) async fn host_bridge_request(
app: tauri::AppHandle,
replay_state: tauri::State<'_, HostBridgeReplayState>,
mut request: HostBridgeRequest,
) -> Result<HostBridgeResponse, String> {
if let Some(response) = validate_request(&request) {
if let Some(response) = prepare_host_bridge_request(&mut request) {
return Ok(response);
}
request.id = normalize_request_id(&request.id).unwrap_or(request.id);
let response = match replay_state.reserve(&request.id) {
HostBridgeReplayReservation::Wait(slot) => HostBridgeReplayState::wait_for_response(slot),
@@ -43,3 +52,31 @@ pub(crate) async fn host_bridge_request(
Ok(response)
}
#[cfg(test)]
mod tests {
use super::*;
use crate::host_bridge::protocol::request;
#[test]
fn host_bridge_request_rejects_invalid_requests_before_replay() {
let replay_state = HostBridgeReplayState::default();
let mut invalid = request("share.open");
invalid.id = " request-1 ".to_string();
invalid.bridge = "OtherBridge".to_string();
let response =
prepare_host_bridge_request(&mut invalid).expect("invalid envelope");
assert!(!response.ok);
assert_eq!(response.id, "request-1");
assert_eq!(response.error.expect("error").code, "invalid_request");
match replay_state.reserve("request-1") {
HostBridgeReplayReservation::Execute(_) => {}
HostBridgeReplayReservation::Wait(_) => {
panic!("invalid request must not reserve replay slot")
}
}
}
}