补齐桌面壳命令入口单测
桌面壳 host_bridge_request 入口抽出请求准备阶段 桌面壳单测覆盖非法请求进入 replay 前被拒绝 桌面壳配置门禁和宿主壳文档同步命令入口边界
This commit is contained in:
@@ -2307,6 +2307,8 @@ const requiredRustHostSnippets = [
|
||||
'HostBridgeReplayReservation',
|
||||
'HOST_BRIDGE_RESPONSE_CACHE_MAX',
|
||||
'.manage(HostBridgeReplayState::default())',
|
||||
'fn prepare_host_bridge_request(',
|
||||
'prepare_host_bridge_request(&mut request)',
|
||||
'replay_state.reserve(&request.id)',
|
||||
'HostBridgeReplayState::wait_for_response',
|
||||
'execute_host_bridge_request(app, request).await',
|
||||
@@ -2318,6 +2320,21 @@ assertSameList(
|
||||
['host_bridge_request'],
|
||||
'shared Tauri HostBridge command',
|
||||
);
|
||||
|
||||
for (const snippet of [
|
||||
'fn host_bridge_request_rejects_invalid_requests_before_replay()',
|
||||
'let replay_state = HostBridgeReplayState::default();',
|
||||
'prepare_host_bridge_request(&mut invalid).expect("invalid envelope")',
|
||||
'assert_eq!(response.id, "request-1");',
|
||||
'assert_eq!(response.error.expect("error").code, "invalid_request");',
|
||||
'match replay_state.reserve("request-1")',
|
||||
'invalid request must not reserve replay slot',
|
||||
]) {
|
||||
if (!rustHostSource.includes(snippet)) {
|
||||
throw new Error(`desktop shell host_bridge command facade test missing ${snippet}`);
|
||||
}
|
||||
}
|
||||
|
||||
assertSameList(
|
||||
readDirectoryEntryList(rustSourceDir, 'desktop shell Rust root entries'),
|
||||
expectedRustRootEntries,
|
||||
|
||||
@@ -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")
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user