Compare commits

...

2 Commits

Author SHA1 Message Date
Ahmed Ibrahim
249648d7b4 core: stabilize unicode shell command test 2026-03-09 00:54:10 -07:00
Ahmed Ibrahim
2bc3e52a91 Stabilize app list update ordering test (#14052)
## Summary
- make
`list_apps_waits_for_accessible_data_before_emitting_directory_updates`
accept the two valid notification paths the server can emit
- keep rejecting the real bug this test is meant to catch: a
directory-only `app/list/updated` notification before accessible app
data is available

## Why this fixes the flake
The old test used a fixed `150ms` silence window and assumed the first
notification after that window had to be the fully merged final update.
In CI, scheduling occasionally lets accessible app data arrive before
directory data, so the first valid notification can be an
accessible-only interim update. That made the test fail even though the
server behavior was correct.

This change makes the test deterministic by reading notifications until
the final merged payload arrives. Any interim update is only accepted if
it contains accessible apps only; if the server ever emits inaccessible
directory data before accessible data is ready, the test still fails
immediately.

## Change type
- test-only; no production app-list logic changes
2026-03-09 00:16:13 -07:00
2 changed files with 12 additions and 13 deletions

View File

@@ -501,16 +501,6 @@ async fn list_apps_waits_for_accessible_data_before_emitting_directory_updates()
})
.await?;
let maybe_update = timeout(
Duration::from_millis(150),
read_app_list_updated_notification(&mut mcp),
)
.await;
assert!(
maybe_update.is_err(),
"unexpected directory-only app/list update before accessible apps loaded"
);
let expected = vec![
AppInfo {
id: "beta".to_string(),
@@ -544,8 +534,17 @@ async fn list_apps_waits_for_accessible_data_before_emitting_directory_updates()
},
];
let update = read_app_list_updated_notification(&mut mcp).await?;
assert_eq!(update.data, expected);
loop {
let update = read_app_list_updated_notification(&mut mcp).await?;
if update.data == expected {
break;
}
assert!(
!update.data.is_empty() && update.data.iter().all(|connector| connector.is_accessible),
"unexpected directory-only app/list update before accessible apps loaded"
);
}
let response: JSONRPCResponse = timeout(
DEFAULT_TIMEOUT,

View File

@@ -266,7 +266,7 @@ async fn unicode_output(login: bool) -> anyhow::Result<()> {
mount_shell_responses_with_timeout(
&harness,
call_id,
"git -c alias.say='!printf \"%s\" \"naïve_café\"' say",
"echo 'naïve_café'",
Some(login),
MEDIUM_TIMEOUT,
)