Fix flaky TestHuhPrompterMultiSelectWithSearchPersistence on slow architectures#13675
Conversation
|
Thanks for your pull request! Unfortunately, it doesn't meet the requirements for review:
Please update your PR to address the above. This PR will be automatically closed in 4 days if these requirements are not met. Full contribution requirements
|
There was a problem hiding this comment.
Pull request overview
Note
Copilot was unable to run its full agentic suite in this review.
This PR improves the reliability of Bubble Tea-based prompt tests by replacing fixed sleeps with a deterministic synchronization hook that waits for async search completion.
Changes:
- Add a test-only
onSearchDonecallback hook tomultiSelectSearchField, invoked when async search results are applied. - Extend the test interaction harness to support blocking “wait” steps (
waitFn) in addition to time-based delays. - Update the multi-select-with-search persistence test to wait for async search completion before submitting.
Reviewed changes
Copilot reviewed 2 out of 2 changed files in this pull request and generated 4 comments.
| File | Description |
|---|---|
| internal/prompter/multi_select_with_search.go | Adds a callback hook fired on search completion to enable deterministic test synchronization. |
| internal/prompter/huh_prompter_test.go | Adds wait-capable interaction steps and uses them to remove timing flakiness in async search tests. |
💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.
58f5399 to
5c33128
Compare
…tures Replace fixed-duration sleep with a channel-based synchronization hook so the test waits for the async search to genuinely complete before sending the next keystroke. The previous 50ms waitForOptions() was too short on slow architectures such as s390x under QEMU emulation, causing the enter key to be dropped while the field was still loading.
5c33128 to
300cae9
Compare
|
Hello @williammartin, I remember we already did similar fixes together, can you help here? |
|
Thanks for your pull request! Unfortunately, it doesn't meet the requirements for review:
Please update your PR to address the above. This PR will be automatically closed in 4 days if these requirements are not met. Full contribution requirements
|
BagToad
left a comment
There was a problem hiding this comment.
Thanks for bumping this with an issue @pdostal - I think that's the best way to contribute (and follows our documented process) since we don't have bandwidth to review many PRs at the moment, the ones we do review come from well-reasoned issues right now. Thank you for making this better!
This MR contains the following updates: | Package | Update | Change | |---|---|---| | [cli/cli](https://github.com/cli/cli) | minor | `v2.94.0` → `v2.96.0` | MR created with the help of [el-capitano/tools/renovate-bot](https://gitlab.com/el-capitano/tools/renovate-bot). **Proposed changes to behavior should be submitted there as MRs.** --- ### Release Notes <details> <summary>cli/cli (cli/cli)</summary> ### [`v2.96.0`](https://github.com/cli/cli/releases/tag/v2.96.0): GitHub CLI 2.96.0 [Compare Source](cli/cli@v2.95.0...v2.96.0) #### Security A security vulnerability has been identified, and fixed, that could allow command execution on a user's computer when connecting to a malicious Codespace via `gh codespace jupyter`. Users of `gh codespace jupyter` are advised to update gh to version v2.96.0 as soon as possible. For more information see: <GHSA-8cg3-r6g9-fpg2> #### Download release assets without authentication `gh release download` now works against public repositories without authentication, matching `gh extension install`. A token is still used when one is present: ```shell # Download assets from a public repository, no login required gh release download v2.96.0 --repo cli/cli ``` #### What's Changed ##### ✨ Features - Allow `gh release download` without authentication on public repositories by [@​BagToad](https://github.com/BagToad) in [#​13723](cli/cli#13723) - Detect additional third-party coding agents by [@​BagToad](https://github.com/BagToad) in [#​13722](cli/cli#13722) - Support `antigravity-cli` and `antigravity2.0` in `gh skill` by [@​BagToad](https://github.com/BagToad) in [#​13784](cli/cli#13784) ##### 🐛 Fixes - fix: show checks summary when all checks were cancelled by [@​s3onghyun](https://github.com/s3onghyun) in [#​13679](cli/cli#13679) - fix(skills): install universal agent to `~/.agents/skills` by [@​toller892](https://github.com/toller892) in [#​13681](cli/cli#13681) - fix(skills): honor `--dir` without agent prompt by [@​happysnaker](https://github.com/happysnaker) in [#​13766](cli/cli#13766) - Fix concurrent map writes in codespace port forwarding by [@​williammartin](https://github.com/williammartin) in [#​13313](cli/cli#13313) - Use `int64` for GitHub database IDs by [@​williammartin](https://github.com/williammartin) in [#​13403](cli/cli#13403) ##### 📚 Docs & Chores - Pin reusable triage workflows to a commit SHA by [@​BagToad](https://github.com/BagToad) in [#​13705](cli/cli#13705) - Add security disclosure guidance to `AGENTS.md` by [@​BagToad](https://github.com/BagToad) in [#​13720](cli/cli#13720) - Clarify `--clone` boolean flag behaviour in `gh repo fork` help by [@​BagToad](https://github.com/BagToad) in [#​13786](cli/cli#13786) - Fix flaky `TestHuhPrompterMultiSelectWithSearchPersistence` on slow architectures by [@​pdostal](https://github.com/pdostal) in [#​13675](cli/cli#13675) - docs(search): add examples for multiple qualifiers by [@​happysnaker](https://github.com/happysnaker) in [#​13756](cli/cli#13756) - docs: fix broken anchor link in release-process-deep-dive by [@​patrickwehbe](https://github.com/patrickwehbe) in [#​13688](cli/cli#13688) - docs: fix broken install command and link/grammar errors by [@​patrickwehbe](https://github.com/patrickwehbe) in [#​13690](cli/cli#13690) - docs: fix duplicated word in primer README by [@​s3onghyun](https://github.com/s3onghyun) in [#​13677](cli/cli#13677) #####Dependencies - chore(deps): bump github.com/microsoft/dev-tunnels from 0.1.19 to 0.1.27 by [@​dependabot](https://github.com/dependabot) in [#​13708](cli/cli#13708) - chore(deps): bump actions/checkout from 6.0.3 to 7.0.0 by [@​dependabot](https://github.com/dependabot) in [#​13703](cli/cli#13703) - chore(deps): bump github.com/google/go-containerregistry from 0.21.6 to 0.21.7 by [@​dependabot](https://github.com/dependabot) in [#​13702](cli/cli#13702) - chore(deps): bump actions/setup-go from 6.4.0 to 6.5.0 by [@​dependabot](https://github.com/dependabot) in [#​13740](cli/cli#13740) - chore(deps): bump actions/attest from 4.1.0 to 4.1.1 by [@​dependabot](https://github.com/dependabot) in [#​13754](cli/cli#13754) - chore(deps): bump goreleaser/goreleaser-action from 7.2.2 to 7.2.3 by [@​dependabot](https://github.com/dependabot) in [#​13759](cli/cli#13759) - chore(deps): bump golangci/golangci-lint-action from 9.2.1 to 9.3.0 by [@​dependabot](https://github.com/dependabot) in [#​13779](cli/cli#13779) #### New Contributors - [@​patrickwehbe](https://github.com/patrickwehbe) made their first contribution in [#​13688](cli/cli#13688) - [@​s3onghyun](https://github.com/s3onghyun) made their first contribution in [#​13679](cli/cli#13679) - [@​toller892](https://github.com/toller892) made their first contribution in [#​13681](cli/cli#13681) - [@​happysnaker](https://github.com/happysnaker) made their first contribution in [#​13756](cli/cli#13756) **Full Changelog**: <cli/cli@v2.95.0...v2.96.0> ### [`v2.95.0`](https://github.com/cli/cli/releases/tag/v2.95.0): GitHub CLI 2.95.0 [Compare Source](cli/cli@v2.94.0...v2.95.0) #### Read repository files and directories with `gh repo read-file` and `gh repo read-dir` Two new preview commands read repository contents without cloning: ```shell # Read a single file to stdout gh repo read-file README.md --repo cli/cli # Read from a specific branch, tag, or commit gh repo read-file go.mod --ref v2.94.0 --repo cli/cli # Write a file to disk (use --clobber to overwrite) gh repo read-file README.md --output ./README.md --repo cli/cli # List the entries in a directory gh repo read-dir script --repo cli/cli ``` Both commands default to the repository's default branch, accept `--ref` to target any branch, tag, or commit, and support `--json`, `--jq`, and `--template` for scripting. This makes it easy for agents and automation to inspect a repo without a full checkout. > \[!NOTE] > `gh repo read-file` and `gh repo read-dir` are in preview and subject to change without notice. #### What's Changed ##### ✨ Features - feat: add `repo read-file` and `repo read-dir` by [@​babakks](https://github.com/babakks) in [#​13580](cli/cli#13580) - feat(skills): list available skills when install runs non-interactively by [@​SamMorrowDrums](https://github.com/SamMorrowDrums) in [#​13548](cli/cli#13548) - Support custom CLAUDE\_CONFIG\_DIR in install by [@​tommaso-moro](https://github.com/tommaso-moro) in [#​13523](cli/cli#13523) ##### 🐛 Fixes - fix(skills): stage updates in a temp dir and swap in-place by [@​SamMorrowDrums](https://github.com/SamMorrowDrums) in [#​13449](cli/cli#13449) ##### 📚 Docs & Chores - Make filtering by bot authors more discoverable by [@​BagToad](https://github.com/BagToad) in [#​13642](cli/cli#13642) - docs(discussion): polish help docs by [@​babakks](https://github.com/babakks) in [#​13632](cli/cli#13632) - Bump Go in devcontainer by [@​spenserblack](https://github.com/spenserblack) in [#​13674](cli/cli#13674) #####
Dependencies - chore(deps): bump golang.org/x/text from 0.37.0 to 0.38.0 by [@​dependabot](https://github.com/dependabot)\[bot] in [#​13640](cli/cli#13640) - chore(deps): bump charm.land/lipgloss/v2 from 2.0.3 to 2.0.4 by [@​dependabot](https://github.com/dependabot)\[bot] in [#​13663](cli/cli#13663) - chore(deps): bump golang.org/x/term from 0.43.0 to 0.44.0 by [@​dependabot](https://github.com/dependabot)\[bot] in [#​13661](cli/cli#13661) - chore(deps): bump github/codeql-action from 4.36.1 to 4.36.2 by [@​dependabot](https://github.com/dependabot)\[bot] in [#​13619](cli/cli#13619) - chore(deps): bump github.com/sigstore/sigstore-go from 1.1.4 to 1.2.1 by [@​dependabot](https://github.com/dependabot)\[bot] in [#​13662](cli/cli#13662) - chore(deps): bump golang.org/x/crypto from 0.52.0 to 0.53.0 by [@​dependabot](https://github.com/dependabot)\[bot] in [#​13641](cli/cli#13641) **Full Changelog**: <cli/cli@v2.94.0...v2.95.0> </details> --- ### Configuration 📅 **Schedule**: (UTC) - Branch creation - At any time (no schedule defined) - Automerge - At any time (no schedule defined) 🚦 **Automerge**: Disabled by config. Please merge this manually once you are satisfied. ♻ **Rebasing**: Whenever MR becomes conflicted, or you tick the rebase/retry checkbox. 🔕 **Ignore**: Close this MR and you won't be reminded about this update again. --- - [ ] <!-- rebase-check -->If you want to rebase/retry this MR, check this box --- This MR has been generated by [Mend Renovate](https://github.com/renovatebot/renovate). <!--renovate-debug:eyJjcmVhdGVkSW5WZXIiOiI0My4yMjcuMSIsInVwZGF0ZWRJblZlciI6IjQzLjIzMi4wIiwidGFyZ2V0QnJhbmNoIjoibWFpbiIsImxhYmVscyI6WyJSZW5vdmF0ZSBCb3QiLCJhdXRvbWF0aW9uOmJvdC1hdXRob3JlZCIsImRlcGVuZGVuY3ktdHlwZTo6bWlub3IiXX0=-->
Fixes #13727
The test was using a fixed 50ms sleep (
waitForOptions()) to wait for an async bubbletea search goroutine before sending the next keystroke. On slow architectures such as s390x under QEMU emulation, the goroutine scheduling and event loop round-trip can exceed 50ms, causing theenterkey to arrive whilem.loadingis stilltrue. In that state the field silently drops all keystrokes, the form never advances, and the 5s overall deadline fires with "form.Run() did not complete in time".The fix replaces the blind sleep with proper channel-based synchronization. An
onSearchDone func()hook is added tomultiSelectSearchField(nil in production, set only in tests) and called at the end ofapplySearchResult. A new test helperwaitForSearch(field)wires a one-shotsync.Once-guarded channel into that hook and blocks until it fires - guaranteeing the search is truly complete before the next step is sent, regardless of scheduler timing or machine speed.Error log