@@ -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