Skip to content

Commit 19a1888

Browse files
[ci-fix] De-flake SafeAreaPerEdgeValidation with keyboard waits (refs #37557) (#37742)
> [!NOTE] > Are you waiting for the changes in this PR to be merged? > It would be very helpful if you could [test the resulting artifacts](https://github.com/dotnet/maui/wiki/Testing-PR-Builds) from this PR and let us know in a comment if this change resolves your issue. Thank you! Workflow artifact: ci-fix Artifact kind: deflake Refs: #37557 Target branch: main Attempt: 1/10 ## Attempt 1 of 10 Synchronize `SafeAreaPerEdgeValidation` with actual keyboard visibility before validating keyboard-dependent safe-area layouts. ### Previous attempts (prior commits on this PR) None. This attempt differs by: this is the first attempt. ## Root cause The latest `main` build 1563072 failed `Issue28986.SafeAreaPerEdgeValidation` on run 0 because `ContentGrid` remained at height 2789 after tapping the entry, then passed on built-in retry run 1. The test immediately queried layout after the tap without proving that Android had shown the keyboard. Flake class: test-quality ## Why this was flaky `Issue28986.SafeAreaPerEdgeValidation` retried its layout assertion but had no synchronization point confirming that Android had completed the keyboard transition. Depending on keyboard animation timing, the assertion could poll the unchanged pre-keyboard layout; build 1563072 demonstrates the intermittent fail-then-pass behavior. ## De-flake The test now asserts `WaitForKeyboardToShow()` before measuring the keyboard-visible layout and `WaitForKeyboardToHide()` before validating the restored layout. Every existing layout assertion remains unchanged. No timeout was increased, no retry attribute was added, and no assertion was weakened. ## Fix Add the existing Appium keyboard-state waits at the two transition boundaries so the test evaluates the same behavior in deterministic UI states. ## What is unverified / where I need help - The Android UI test could not be run because this runner has no device rig. - Please confirm the API 36 SafeAreaEdges leg consistently observes both transitions. ## Validation - Command: `not run because no Android device rig is available` - Result: not run ## Evidence - Original failing build: https://dev.azure.com/dnceng-public/public/_build/results?buildId=1554582 - Latest verified-failing build: https://dev.azure.com/dnceng-public/public/_build/results?buildId=1563072 --- Filed by [`ci-status-fix`](https://github.com/dotnet/maui/blob/main/.github/workflows/ci-status-fix.md). This is the single PR for #37557: the workflow watches its own CI and pushes up to **10 attempts on this same PR** (it never opens a second PR). It advances only when the fix's own build settles red and that red is caused by the fix. Comments, reviews, and commits do not transfer ownership; the loop remains autonomous until this PR is closed. Eligible `CHANGES_REQUESTED` reviews are handled through Track C. After 10 attempts it stops and defers to humans. In round 1 a maintainer still needs to comment `/azp run maui-pr` (plus the gated uitests/devicetests legs when relevant) to exercise each new commit. > [!WARNING] > <details> > <summary>Firewall blocked 1 domain</summary> > > The following domain was blocked by the firewall during workflow execution: > > - `dc.services.visualstudio.com` > > To allow these domains, add them to the `network.allowed` list in your workflow frontmatter: > > ```yaml > network: > allowed: > - defaults > - "dc.services.visualstudio.com" > ``` > > See [Network Configuration](https://github.github.com/gh-aw/reference/network/) for more information. > > </details> > Generated by [CI Failure Fixer (main)](https://github.com/dotnet/maui/actions/runs/32573008235) · gpt56 · 446.8 AIC · ⌖ 82.9 AIC · ⊞ 31.1K · [◷](https://github.com/search?q=repo%3Adotnet%2Fmaui+%22gh-aw-workflow-id%3A+ci-status-fix%22&type=pullrequests) <!-- gh-aw-agentic-workflow: CI Failure Fixer (main), engine: copilot, model: gpt-5.6-sol, id: 32573008235, workflow_id: ci-status-fix, run: https://github.com/dotnet/maui/actions/runs/32573008235 --> <!-- gh-aw-workflow-id: ci-status-fix --> <!-- gh-aw-workflow-call-id: dotnet/maui/ci-status-fix --> Co-authored-by: Jakub Florkowski <42434498+kubaflo@users.noreply.github.com>
1 parent e7d00b0 commit 19a1888

1 file changed

Lines changed: 2 additions & 0 deletions

File tree

  • src/Controls/tests/TestCases.Shared.Tests/Tests/Issues

src/Controls/tests/TestCases.Shared.Tests/Tests/Issues/Issue28986.cs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -177,6 +177,7 @@ public void SafeAreaPerEdgeValidation()
177177

178178
// Open Soft Input test entry
179179
App.Tap("SoftInputTestEntry");
180+
Assert.That(App.WaitForKeyboardToShow(), Is.True, "Keyboard should be visible before validating the resized safe area");
180181

181182
// With AdjustNothing mode, the window doesn't resize or pan
182183
// The MainGrid gets bottom padding from SoftInput, so ContentGrid should shrink
@@ -187,6 +188,7 @@ public void SafeAreaPerEdgeValidation()
187188
});
188189

189190
App.DismissKeyboard();
191+
Assert.That(App.WaitForKeyboardToHide(), Is.True, "Keyboard should be hidden before validating the restored safe area");
190192

191193
App.RetryAssert(() =>
192194
{

0 commit comments

Comments
 (0)