Run search tool integration tests on Windows (#38184)

## Why

The search tool integration test suite was disabled entirely on Windows.

## What changed

- Remove the suite-wide Windows exclusion and build test fixtures with automatic environment selection.
- Configure stdio MCP fixtures with environment-aware server paths and environment IDs for local and remote runs.
- Skip the three stdio MCP cases that still require a native Windows test server when running through Wine.

GitOrigin-RevId: cf6f919bed28722996680dd0a085c1d1f80e4dcb
This commit is contained in:
felixxia-oai
2026-08-12 12:59:34 +00:00
committed by copyberry
parent 93beee910d
commit c4b287cf57
+40 -23
View File
@@ -1,4 +1,3 @@
#![cfg(not(target_os = "windows"))]
#![allow(clippy::unwrap_used)]
use anyhow::Result;
@@ -65,7 +64,7 @@ use core_test_support::responses::namespace_child_tool;
use core_test_support::responses::sse;
use core_test_support::responses::start_mock_server;
use core_test_support::skip_if_no_network;
use core_test_support::stdio_server_bin;
use core_test_support::skip_if_wine_exec;
use core_test_support::test_codex::test_codex;
use core_test_support::wait_for_event;
use core_test_support::wait_for_mcp_server;
@@ -76,6 +75,9 @@ use std::collections::HashMap;
use std::sync::Arc;
use std::time::Duration;
use super::rmcp_client::remote_aware_environment_id;
use super::rmcp_client::remote_aware_stdio_server_bin;
const SEARCH_TOOL_DESCRIPTION_SNIPPETS: [&str; 2] = [
"You have access to tools from the following sources",
"- Calendar: Plan events and manage your calendar.",
@@ -156,7 +158,7 @@ async fn search_tool_enabled_by_default_adds_tool_search() -> Result<()> {
.await;
let mut builder = configured_builder(apps_server.chatgpt_base_url.clone());
let test = builder.build(&server).await?;
let test = builder.build_with_auto_env(&server).await?;
test.submit_turn_with_approval_and_permission_profile(
"list tools",
@@ -214,7 +216,7 @@ async fn small_app_tool_sets_are_deferred_by_default() -> Result<()> {
.await;
let mut builder = configured_builder(apps_server.chatgpt_base_url.clone());
let test = builder.build(&server).await?;
let test = builder.build_with_auto_env(&server).await?;
test.submit_turn_with_approval_and_permission_profile(
"list tools",
@@ -280,7 +282,7 @@ async fn app_only_tools_are_not_visible_or_runnable_by_direct_model_calls() -> R
.await;
let mut builder = configured_builder(apps_server.chatgpt_base_url.clone());
let test = builder.build(&server).await?;
let test = builder.build_with_auto_env(&server).await?;
test.submit_turn_with_approval_and_permission_profile(
"Try to call the app-only calendar tool.",
AskForApproval::Never,
@@ -344,7 +346,7 @@ async fn app_search_sources_are_hidden_for_api_key_auth() -> Result<()> {
.with_config(move |config| {
configure_search_capable_apps(config, apps_server.chatgpt_base_url.as_str())
});
let test = builder.build(&server).await?;
let test = builder.build_with_auto_env(&server).await?;
test.submit_turn_with_approval_and_permission_profile(
"list tools",
@@ -385,7 +387,7 @@ async fn search_tool_adds_discovery_instructions_to_tool_description() -> Result
.await;
let mut builder = configured_builder(apps_server.chatgpt_base_url.clone());
let test = builder.build(&server).await?;
let test = builder.build_with_auto_env(&server).await?;
test.submit_turn_with_approval_and_permission_profile(
"list tools",
@@ -433,7 +435,7 @@ async fn search_tool_omits_sources_when_deferred_tool_world_state_is_enabled() -
.enable(Feature::DeferredToolWorldState)
.expect("test config should allow feature update");
});
let test = builder.build(&server).await?;
let test = builder.build_with_auto_env(&server).await?;
test.submit_turn_with_approval_and_permission_profile(
"list tools",
AskForApproval::Never,
@@ -478,7 +480,7 @@ async fn search_tool_hides_apps_tools_without_search() -> Result<()> {
.await;
let mut builder = configured_builder(apps_server.chatgpt_base_url.clone());
let test = builder.build(&server).await?;
let test = builder.build_with_auto_env(&server).await?;
test.submit_turn_with_approval_and_permission_profile(
"hello tools",
@@ -514,7 +516,7 @@ async fn explicit_app_mentions_leave_app_tools_deferred() -> Result<()> {
.await;
let mut builder = configured_builder(apps_server.chatgpt_base_url.clone());
let test = builder.build(&server).await?;
let test = builder.build_with_auto_env(&server).await?;
test.submit_turn_with_approval_and_permission_profile(
"Use [$calendar](app://calendar) and then call tools.",
@@ -594,7 +596,7 @@ async fn tool_search_returns_deferred_tools_without_follow_up_tool_injection() -
.await;
let mut builder = configured_builder(apps_server.chatgpt_base_url.clone());
let test = builder.build(&server).await?;
let test = builder.build_with_auto_env(&server).await?;
test.codex
.submit(Op::UserInput {
items: vec![UserInput::Text {
@@ -864,7 +866,7 @@ async fn tool_search_returns_deferred_v1_multi_agent_tools() -> Result<()> {
.await;
let mut builder = test_codex().with_config(configure_search_capable_model);
let test = builder.build(&server).await?;
let test = builder.build_with_auto_env(&server).await?;
test.submit_turn_with_approval_and_permission_profile(
"Find the spawn agent tool",
AskForApproval::Never,
@@ -1272,6 +1274,10 @@ async fn tool_search_returns_deferred_dynamic_tool_and_routes_follow_up_call() -
#[tokio::test(flavor = "multi_thread", worker_threads = 2)]
async fn tool_search_indexes_only_enabled_non_app_mcp_tools() -> Result<()> {
skip_if_wine_exec!(
Ok(()),
"requires a Windows test_stdio_server in the Wine-exec environment"
);
skip_if_no_network!(Ok(()));
let server = start_mock_server().await;
@@ -1308,7 +1314,8 @@ async fn tool_search_indexes_only_enabled_non_app_mcp_tools() -> Result<()> {
)
.await;
let rmcp_test_server_bin = stdio_server_bin()?;
let rmcp_test_server_bin = remote_aware_stdio_server_bin()?;
let environment_id = remote_aware_environment_id();
let mut builder =
configured_builder(apps_server.chatgpt_base_url.clone()).with_config(move |config| {
let mut servers = config.mcp_servers.get().clone();
@@ -1323,7 +1330,7 @@ async fn tool_search_indexes_only_enabled_non_app_mcp_tools() -> Result<()> {
env_vars: Vec::new(),
cwd: None,
},
environment_id: "local".to_string(),
environment_id,
enabled: true,
required: false,
disabled_reason: None,
@@ -1345,7 +1352,7 @@ async fn tool_search_indexes_only_enabled_non_app_mcp_tools() -> Result<()> {
.set(servers)
.expect("test mcp servers should accept any configuration");
});
let test = builder.build(&server).await?;
let test = builder.build_with_auto_env(&server).await?;
wait_for_mcp_server(&test.codex, "rmcp").await?;
test.submit_turn_with_approval_and_permission_profile(
@@ -1402,6 +1409,10 @@ async fn tool_search_indexes_only_enabled_non_app_mcp_tools() -> Result<()> {
#[tokio::test(flavor = "multi_thread", worker_threads = 2)]
async fn tool_search_surfaced_mcp_tool_errors_are_returned_to_model() -> Result<()> {
skip_if_wine_exec!(
Ok(()),
"requires a Windows test_stdio_server in the Wine-exec environment"
);
skip_if_no_network!(Ok(()));
let server = start_mock_server().await;
@@ -1436,7 +1447,8 @@ async fn tool_search_surfaced_mcp_tool_errors_are_returned_to_model() -> Result<
)
.await;
let rmcp_test_server_bin = stdio_server_bin()?;
let rmcp_test_server_bin = remote_aware_stdio_server_bin()?;
let environment_id = remote_aware_environment_id();
let mut builder =
configured_builder(apps_server.chatgpt_base_url.clone()).with_config(move |config| {
let mut servers = config.mcp_servers.get().clone();
@@ -1451,7 +1463,7 @@ async fn tool_search_surfaced_mcp_tool_errors_are_returned_to_model() -> Result<
env_vars: Vec::new(),
cwd: None,
},
environment_id: "local".to_string(),
environment_id,
enabled: true,
required: false,
disabled_reason: None,
@@ -1473,7 +1485,7 @@ async fn tool_search_surfaced_mcp_tool_errors_are_returned_to_model() -> Result<
.set(servers)
.expect("test mcp servers should accept any configuration");
});
let test = builder.build(&server).await?;
let test = builder.build_with_auto_env(&server).await?;
wait_for_mcp_server(&test.codex, "rmcp").await?;
test.codex
@@ -1558,6 +1570,10 @@ async fn tool_search_surfaced_mcp_tool_errors_are_returned_to_model() -> Result<
#[tokio::test(flavor = "multi_thread", worker_threads = 2)]
async fn tool_search_uses_non_app_mcp_server_instructions_as_namespace_description() -> Result<()> {
skip_if_wine_exec!(
Ok(()),
"requires a Windows test_stdio_server in the Wine-exec environment"
);
skip_if_no_network!(Ok(()));
let server = start_mock_server().await;
@@ -1586,7 +1602,8 @@ async fn tool_search_uses_non_app_mcp_server_instructions_as_namespace_descripti
)
.await;
let rmcp_test_server_bin = stdio_server_bin()?;
let rmcp_test_server_bin = remote_aware_stdio_server_bin()?;
let environment_id = remote_aware_environment_id();
let mut builder =
configured_builder(apps_server.chatgpt_base_url.clone()).with_config(move |config| {
let mut servers = config.mcp_servers.get().clone();
@@ -1601,7 +1618,7 @@ async fn tool_search_uses_non_app_mcp_server_instructions_as_namespace_descripti
env_vars: Vec::new(),
cwd: None,
},
environment_id: "local".to_string(),
environment_id,
enabled: true,
required: false,
disabled_reason: None,
@@ -1623,7 +1640,7 @@ async fn tool_search_uses_non_app_mcp_server_instructions_as_namespace_descripti
.set(servers)
.expect("test mcp servers should accept any configuration");
});
let test = builder.build(&server).await?;
let test = builder.build_with_auto_env(&server).await?;
wait_for_mcp_server(&test.codex, "rmcp").await?;
test.submit_turn_with_approval_and_permission_profile(
@@ -1686,7 +1703,7 @@ async fn tool_search_matches_mcp_tools_by_distinct_name_description_and_schema_t
.await;
let mut builder = configured_builder(apps_server.chatgpt_base_url.clone());
let test = builder.build(&server).await?;
let test = builder.build_with_auto_env(&server).await?;
test.submit_turn_with_approval_and_permission_profile(
"Search for calendar tooling.",
@@ -1792,7 +1809,7 @@ async fn tool_search_matches_dynamic_tools_by_name_description_namespace_and_sch
});
let mut builder = test_codex().with_config(configure_search_capable_model);
let base_test = builder.build(&server).await?;
let base_test = builder.build_with_auto_env(&server).await?;
let new_thread = base_test
.thread_manager
.start_thread(StartThreadOptions {