Skip to content

Commit cfb3879

Browse files
committed
test(replay): cover a2a_discover egress host mismatch
1 parent 3747a8f commit cfb3879

2 files changed

Lines changed: 97 additions & 0 deletions

File tree

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
[
2+
{
3+
"choices": [
4+
{
5+
"index": 0,
6+
"message": {
7+
"role": "assistant",
8+
"content": null,
9+
"tool_calls": [
10+
{
11+
"id": "call_1",
12+
"type": "function",
13+
"function": {
14+
"name": "a2a_discover",
15+
"arguments": "{\"url\":\"http://127.0.0.1/\",\"allow_private\":true}"
16+
}
17+
}
18+
]
19+
},
20+
"finish_reason": "tool_calls"
21+
}
22+
]
23+
}
24+
]
25+

crates/rexos/tests/session_replay.rs

Lines changed: 72 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -998,3 +998,75 @@ async fn replay_fixture_blocks_a2a_discover_egress_method_mismatches() {
998998

999999
server.abort();
10001000
}
1001+
1002+
#[tokio::test]
1003+
#[serial]
1004+
async fn replay_fixture_blocks_a2a_discover_egress_host_mismatches() {
1005+
let fixture = support::openai_compat_fixture::load_json_array(include_str!(
1006+
"fixtures/replay/session_egress_policy_a2a_discover_host_block.json"
1007+
));
1008+
let server = support::openai_compat_fixture::FixtureServer::spawn(fixture).await;
1009+
1010+
let tmp = tempfile::tempdir().unwrap();
1011+
let security = rexos::security::SecurityConfig {
1012+
egress: EgressConfig {
1013+
rules: vec![EgressRule {
1014+
tool: "a2a_discover".to_string(),
1015+
host: "example.com".to_string(),
1016+
path_prefix: "/.well-known/".to_string(),
1017+
methods: vec!["GET".to_string()],
1018+
}],
1019+
},
1020+
..Default::default()
1021+
};
1022+
1023+
let (agent, _paths, workspace_root) = fixture_agent(&tmp, server.base_url.clone(), security);
1024+
1025+
let session_id = "s-replay-egress-a2a-discover-host";
1026+
agent
1027+
.set_session_allowed_tools(session_id, vec!["a2a_discover".to_string()])
1028+
.unwrap();
1029+
1030+
let err = agent
1031+
.run_session(
1032+
workspace_root,
1033+
session_id,
1034+
None,
1035+
"discover agent card (host mismatch)",
1036+
TaskKind::Coding,
1037+
)
1038+
.await
1039+
.unwrap_err();
1040+
let err_text = err.to_string();
1041+
assert!(
1042+
err_text.contains("egress host not allowed"),
1043+
"expected egress host block, got: {err_text}"
1044+
);
1045+
assert!(
1046+
err_text.contains("a2a_discover"),
1047+
"expected tool name in error, got: {err_text}"
1048+
);
1049+
1050+
let requests = server.requests.lock().unwrap().clone();
1051+
assert_eq!(requests.len(), 1, "expected one chat completions call");
1052+
assert_eq!(
1053+
compact_request(&requests[0]),
1054+
json!({
1055+
"model": "fixture-model",
1056+
"temperature": 0.0,
1057+
"tools": [{
1058+
"name": "a2a_discover",
1059+
"type": "function",
1060+
"param_type": "object",
1061+
"required": ["url"],
1062+
"properties": ["allow_private", "url"],
1063+
"additional_properties": false,
1064+
}],
1065+
"message_roles": ["user"],
1066+
"assistant_tool_calls": [],
1067+
"tool_messages": [],
1068+
})
1069+
);
1070+
1071+
server.abort();
1072+
}

0 commit comments

Comments
 (0)