Skip to content

[tests] Re-enable Android memory-leak UI tests (#27411) - #36480

Merged
kubaflo merged 1 commit into
inflight/currentfrom
fix/reenable-27411-memtests
Jul 10, 2026
Merged

kubaflo merged 1 commit into
inflight/currentfrom
fix/reenable-27411-memtests

Conversation

@kubaflo

@kubaflo kubaflo commented Jul 9, 2026

Copy link
Copy Markdown
Contributor

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 from this PR and let us know in a comment if this change resolves your issue. Thank you!

Description of Change

Re-enables the Android memory-leak UI tests that were disabled under #27411.

Verified locally on an Android API 30 emulator (multiple runs, stable):

Test Result
Bugzilla40955.MemoryLeakInFormsAppCompatActivity ✅ now passes — Android [Ignore] removed
Bugzilla42329.MemoryLeakB42329 ✅ now passes — Android [Ignore] removed
Bugzilla44166.Bugzilla44166Test ❌ still leaks (FlyoutPage not collected) — kept skipped, now points at #36479

The device-level memory tests referenced by #27411 (MemoryTests.PagesDoNotLeak, NavigationPageTests.ChildPagesDoNotLeak, ShellTests.PagesDoNotLeak) are already enabled on main.

This closes out the umbrella #27411 and carves the one remaining Android leak into a dedicated tracking issue.

Issues Fixed

Fixes #27411
Tracks remaining leak: #36479


This PR was prepared by GitHub Copilot CLI on behalf of @kubaflo, based on local device-test verification.

Re-enable Bugzilla40955 (MemoryLeakInFormsAppCompatActivity) and
Bugzilla42329 (MemoryLeakB42329) on Android — both now pass on net10
(verified locally on an Android API 30 emulator across multiple runs).

Bugzilla44166 (FlyoutPage disposal) still leaks on Android, so it stays
skipped but now points at the dedicated tracking issue #36479 instead of
the umbrella #27411.

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Copilot-Session: 4963cebd-6bf0-4911-aff9-c2d2ab398cfe
Copilot AI review requested due to automatic review settings July 9, 2026 13:58
@kubaflo
kubaflo temporarily deployed to copilot-pat-pool July 9, 2026 13:58 — with GitHub Actions Inactive
@github-actions

github-actions Bot commented Jul 9, 2026

Copy link
Copy Markdown
Contributor

🚀 Dogfood this PR with:

⚠️ WARNING: Do not do this without first carefully reviewing the code of this PR to satisfy yourself it is safe.

curl -fsSL https://raw.githubusercontent.com/dotnet/maui/main/eng/scripts/get-maui-pr.sh | bash -s -- 36480

Or

  • Run remotely in PowerShell:
iex "& { $(irm https://raw.githubusercontent.com/dotnet/maui/main/eng/scripts/get-maui-pr.ps1) } 36480"

@kubaflo

This comment has been minimized.

@kubaflo

kubaflo commented Jul 9, 2026

Copy link
Copy Markdown
Contributor Author

/azp run maui-pr-devicetests

@azure-pipelines

Copy link
Copy Markdown
Azure Pipelines successfully started running 1 pipeline(s).

@github-actions github-actions Bot added the s/agent-review-in-progress AI review is currently running for this PR label Jul 9, 2026

Copilot AI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

Re-enables previously skipped Android UI memory-leak tests in the Controls test suite by removing Android-only [Ignore] attributes for the tests that are now stable, while keeping the remaining failing test skipped with an updated tracking link.

Changes:

  • Removed Android-only [Ignore] from Bugzilla40955.MemoryLeakInFormsAppCompatActivity so it runs again on Android.
  • Removed Android-only [Ignore] from Bugzilla42329.MemoryLeakB42329 so it runs again on Android.
  • Kept Bugzilla44166.Bugzilla44166Test ignored on Android, updating the ignore message to point to the new dedicated tracking issue (#36479).

Reviewed changes

Copilot reviewed 3 out of 3 changed files in this pull request and generated no comments.

File Description
src/Controls/tests/TestCases.Shared.Tests/Tests/Issues/Bugzilla/Bugzilla44166.cs Updates Android ignore reason/link while continuing to skip the still-failing leak test on Android.
src/Controls/tests/TestCases.Shared.Tests/Tests/Issues/Bugzilla/Bugzilla42329.cs Re-enables the test on Android by removing the Android-only ignore.
src/Controls/tests/TestCases.Shared.Tests/Tests/Issues/Bugzilla/Bugzilla40955.cs Re-enables the test on Android by removing the Android-only ignore.

@kubaflo
kubaflo temporarily deployed to copilot-pat-pool July 9, 2026 14:03 — with GitHub Actions Inactive
@kubaflo
kubaflo temporarily deployed to copilot-pat-pool July 9, 2026 14:04 — with GitHub Actions Inactive
@github-actions github-actions Bot added the area-core-lifecycle XPlat and Native UIApplicationDelegate/Activity/Window lifecycle events label Jul 9, 2026
@kubaflo
kubaflo temporarily deployed to copilot-pat-pool July 9, 2026 14:05 — with GitHub Actions Inactive
@MauiBot MauiBot added s/agent-fix-win AI found a better alternative fix than the PR s/agent-reviewed PR was reviewed by AI agent workflow (full 4-phase review) labels Jul 9, 2026

@MauiBot MauiBot left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

AI Review Summary

@kubaflo — new AI review results are available based on this last commit: 75e298a. To request a fresh review after new comments or commits, comment /review rerun.

Gate Inconclusive Confidence Low Platform Android


🗂️ Review Sessions — click to expand
🚦 Gate — Test Before & After Fix

Gate Result: ⚠️ INCONCLUSIVE

Platform: ANDROID

⚠️ verify-tests-fail.ps1 exited before writing a verification report. Diagnostics below.

Exit code: 3

Likely cause:

  • Device/emulator setup failed (env error class).

Artifacts written before exit:

  • test-failure-Bugzilla40955.log (7.5 KB)
  • test-failure-Bugzilla42329.log (7.4 KB)
  • test-failure-Bugzilla44166.log (7.5 KB)
  • verification-log.txt (0.2 KB)
Gate output log (last 60 lines)
🔹 Collecting test artifacts (screenshots, page source)...
ℹ️  Test artifacts collected: 0 screenshot(s), 0 page source(s) (copied 0 from assembly dir)
🔹 Capturing device logs...
ℹ️  Dumping Android logcat buffer (filtered to HostApp)...
ℹ️  Android logcat saved to: /home/vsts/work/1/s/CustomAgentLogsTmp/UITests/android-device.log
═══════════════════════════════════════════════════════
  Android Device Logs (Last 100 lines)
═══════════════════════════════════════════════════════
07-09 09:55:29.107  4014  4044 I appium  : Created the new session with id 95982ce0-97fd-40ff-a0bc-9274dff4a916 and capabilities {appPackage=com.microsoft.maui.uitests, networkConnectionEnabled=true, disableWindowAnimation=true, noReset=true, warnings={}, reportFormat=xml, disableAndroidWatchers=true, databaseEnabled=false, deviceName=emulator-5554, platform=LINUX, deviceUDID=emulator-5554, appActivity=com.microsoft.maui.uitests.MainActivity, androidInstallTimeout=60000.0, desired={platformName=Android, automationName=UIAutomator2, reportDirectory=reports, reportFormat=xml, newCommandTimeout=3000.0, noReset=true, appPackage=com.microsoft.maui.uitests, appActivity=com.microsoft.maui.uitests.MainActivity, disableAndroidWatchers=true, androidInstallTimeout=60000.0, waitForIdleTimeout=5000.0, disableWindowAnimation=true, ignoreHiddenApiPolicyError=true}, newCommandTimeout=3000.0, automationName=UIAutomator2, webStorageEnabled=false, locationContextEnabled=false, reportDirectory=reports, takesScreenshot=true, javascriptEnabled=true, platformName=Android, ignoreHiddenApiPolicyError=true}
07-09 09:55:29.113  4014  4044 I appium  : AppiumResponse: {"sessionId":"95982ce0-97fd-40ff-a0bc-9274dff4a916","value":{"capabilities":{"firstMatch":[{"platformName":"Android","automationName":"UIAutomator2","reportDirectory":"reports","reportFormat":"xml","newCommandTimeout":3000.0,"noReset":true,"appPackage":"com.microsoft.maui.uitests","appActivity":"com…
07-09 09:55:29.566 13944 14198 I ActivityTaskManager: START u0 {act=android.intent.action.MAIN cat=[android.intent.category.LAUNCHER] flg=0x10200000 cmp=com.microsoft.maui.uitests/.MainActivity} from uid 2000
07-09 09:55:30.431 13944 13971 D ArtManagerInternalImpl: /data/misc/iorapd/com.microsoft.maui.uitests/1/com.microsoft.maui.uitests.MainActivity/compiled_traces/compiled_trace.pb doesn't exist
07-09 09:55:30.496 13944 13971 I ActivityTaskManager: Displayed com.microsoft.maui.uitests/.MainActivity: +862ms
07-09 09:55:31.090  4014  4044 I appium  : method: 'id', selector: 'com.microsoft.maui.uitests:id/GoToTestButton'
07-09 09:55:31.615  4014  4044 I appium  : method: 'id', selector: 'com.microsoft.maui.uitests:id/SearchBar'
07-09 09:55:31.959  4014  4044 I appium  : method: 'id', selector: 'com.microsoft.maui.uitests:id/GoToTestButton'
07-09 09:55:32.226  4014  4044 I appium  : method: 'id', selector: 'com.microsoft.maui.uitests:id/GoToTestButton'
07-09 09:55:33.818 13944 14325 I ActivityManager: Force stopping com.microsoft.maui.uitests appid=10154 user=0: from pid 4111
07-09 09:55:33.819 13944 14325 I ActivityManager: Killing 3704:com.microsoft.maui.uitests/u0a154 (adj 0): stop com.microsoft.maui.uitests due to from pid 4111
07-09 09:55:33.825 13944 14325 W ActivityTaskManager: Force removing ActivityRecord{f596c43 u0 com.microsoft.maui.uitests/.MainActivity t48 f}}: app died, no saved state
07-09 09:55:34.830 13944 16965 D AutofillSession: handling death of Token{78bddf2 ActivityRecord{f596c43 u0 com.microsoft.maui.uitests/.MainActivity t-1 f}}} when saving=false
07-09 09:55:35.599 13944 16965 I ActivityTaskManager: START u0 {act=android.intent.action.MAIN cat=[android.intent.category.LAUNCHER] flg=0x10200000 cmp=com.microsoft.maui.uitests/.MainActivity} from uid 2000
07-09 09:55:36.077 13944 13973 I ActivityManager: Start proc 4133:com.microsoft.maui.uitests/u0a154 for pre-top-activity {com.microsoft.maui.uitests/com.microsoft.maui.uitests.MainActivity}
07-09 09:55:36.990  4133  4133 W monodroid: Failed to create directory '/data/user/0/com.microsoft.maui.uitests/files/.__override__/x86_64'. File exists
07-09 09:55:36.990  4133  4133 W monodroid: Creating public update directory: `/data/user/0/com.microsoft.maui.uitests/files/.__override__/x86_64`
07-09 09:55:37.019  4133  4133 D DOTNET  : AndroidCryptoNative_InitLibraryOnLoad: jint AndroidCryptoNative_InitLibraryOnLoad(JavaVM *, void *) in /__w/1/s/src/runtime/src/native/libs/System.Security.Cryptography.Native.Android/pal_jni.c
07-09 09:55:37.021  4133  4133 D DOTNET  : GetOptionalClassGRef: optional class com/android/org/conscrypt/OpenSSLEngineImpl was not found
07-09 09:55:37.636  4133  4133 W ft.maui.uitest: ClassLoaderContext classpath size mismatch. expected=15, found=2 (DLC[];PCL[base.apk*1604962157:base.apk!classes2.dex*892330443:base.apk!classes3.dex*4132208247:base.apk!classes4.dex*1189418256:base.apk!classes5.dex*603145810:base.apk!classes6.dex*3249919879:base.apk!classes7.dex*4272712489:base.apk!classes8.dex*2286867051:base.apk!classes9.dex*1990284164:base.apk!classes10.dex*1304220855:base.apk!classes11.dex*2113592843:base.apk!classes12.dex*567841885:base.apk!classes13.dex*1284683107:base.apk!classes14.dex*287099224:base.apk!classes15.dex*3381648213]{PCL[/system/framework/org.apache.http.legacy.jar*1452144318]#PCL[/system/framework/com.android.location.provider.jar*4177849200]#PCL[/system/framework/com.android.media.remotedisplay.jar*1128910120]#PCL[/system_ext/framework/androidx.window.sidecar.jar*709954415]} | DLC[];PCL[/data/app/~~3RgJYNVixA9BRl8Qovpd9A==/com.microsoft.maui.uitests-WBYqBpMCYV2rEbRhtKsXLw==/base.apk*3243068382:/data/app/~~3RgJYNVixA9BRl8Qovpd9A==/com.microsoft.maui.uitests-WBYqBpMCYV2rEbRhtKsXLw==/base.apk!classes2.dex*2864831927]{PCL[/system/framework/org.apache.http.legacy.jar*1452144318]#PCL[/system_ext/framework/androidx.window.sidecar.jar*709954415]})
07-09 09:55:37.637  4133  4133 W ft.maui.uitest: Found duplicated class when checking oat files: 'Landroid/support/v4/graphics/drawable/IconCompatParcelizer;' in /data/app/~~ZlkzjixvWGeOIuReL3RWDQ==/com.google.android.gms-HtXi96UN3vYSHEpVV2M57g==/split_MapsDynamite_installtime.apk!classes2.dex and /data/app/~~3RgJYNVixA9BRl8Qovpd9A==/com.microsoft.maui.uitests-WBYqBpMCYV2rEbRhtKsXLw==/base.apk
07-09 09:55:39.583 13944 13971 D ArtManagerInternalImpl: /data/misc/iorapd/com.microsoft.maui.uitests/1/com.microsoft.maui.uitests.MainActivity/compiled_traces/compiled_trace.pb doesn't exist
07-09 09:55:40.064 14668 15926 I PhenotypeResourceReader: unable to find any Phenotype resource metadata for com.microsoft.maui.uitests
07-09 09:55:40.081 13944 13971 I ActivityTaskManager: Displayed com.microsoft.maui.uitests/.MainActivity: +3s983ms
07-09 09:55:40.109  4133  4215 W ft.maui.uitest: ClassLoaderContext classpath size mismatch. expected=15, found=2 (DLC[];PCL[base.apk*1604962157:base.apk!classes2.dex*892330443:base.apk!classes3.dex*4132208247:base.apk!classes4.dex*1189418256:base.apk!classes5.dex*603145810:base.apk!classes6.dex*3249919879:base.apk!classes7.dex*4272712489:base.apk!classes8.dex*2286867051:base.apk!classes9.dex*1990284164:base.apk!classes10.dex*1304220855:base.apk!classes11.dex*2113592843:base.apk!classes12.dex*567841885:base.apk!classes13.dex*1284683107:base.apk!classes14.dex*287099224:base.apk!classes15.dex*3381648213]{PCL[/system/framework/org.apache.http.legacy.jar*1452144318]#PCL[/system/framework/com.android.location.provider.jar*4177849200]#PCL[/system/framework/com.android.media.remotedisplay.jar*1128910120]#PCL[/system_ext/framework/androidx.window.sidecar.jar*709954415]} | DLC[];PCL[/data/app/~~3RgJYNVixA9BRl8Qovpd9A==/com.microsoft.maui.uitests-WBYqBpMCYV2rEbRhtKsXLw==/base.apk*3243068382:/data/app/~~3RgJYNVixA9BRl8Qovpd9A==/com.microsoft.maui.uitests-WBYqBpMCYV2rEbRhtKsXLw==/base.apk!classes2.dex*2864831927]{PCL[/system/framework/org.apache.http.legacy.jar*1452144318]#PCL[/system_ext/framework/androidx.window.sidecar.jar*709954415]})
07-09 09:55:40.109  4133  4215 W ft.maui.uitest: Found duplicated class when checking oat files: 'Landroid/support/v4/graphics/drawable/IconCompatParcelizer;' in /data/app/~~ZlkzjixvWGeOIuReL3RWDQ==/com.google.android.gms-HtXi96UN3vYSHEpVV2M57g==/split_GoogleCertificates_installtime.apk!classes2.dex and /data/app/~~3RgJYNVixA9BRl8Qovpd9A==/com.microsoft.maui.uitests-WBYqBpMCYV2rEbRhtKsXLw==/base.apk
07-09 09:55:40.230  4133  4206 I PhClient: Shared storage file not found for com.google.android.gms.clearcut_client#com.microsoft.maui.uitests
07-09 09:55:40.232  4133  4206 I PhClient: Unable to retrieve flag snapshot for com.google.android.gms.clearcut_client#com.microsoft.maui.uitests, using defaults.
ℹ️  Full device log: /home/vsts/work/1/s/CustomAgentLogsTmp/UITests/android-device.log
═══════════════════════════════════════════════════════
✅ All tests passed
╔═══════════════════════════════════════════════════════════╗
║                    Test Summary                           ║
╠═══════════════════════════════════════════════════════════╣
║  Platform:     ANDROID                                ║
║  Device:       emulator-5554                                 ║
║  Test Filter:  Bugzilla44166                                 ║
║  Result:       SUCCESS ✅                                 ║
║  Logs:         /home/vsts/work/1/s/CustomAgentLogsTmp/UITests
╚═══════════════════════════════════════════════════════════╝
==========================================
VERIFICATION RESULTS
==========================================
  🖥️ [UITest] Bugzilla40955: PASSED ❌ (should fail!)
  🖥️ [UITest] Bugzilla42329: PASSED ❌ (should fail!)
  🖥️ [UITest] Bugzilla44166: PASSED ❌ (should fail!)
╔═══════════════════════════════════════════════════════════╗
║              VERIFICATION FAILED ❌                       ║
╠═══════════════════════════════════════════════════════════╣
║  3/3 test(s) PASSED but should FAIL!                   ║
║  Those tests don't reproduce the bug. Revise them!        ║
╚═══════════════════════════════════════════════════════════╝

📱 UI Tests — FlyoutPage,ListView,Performance

Detected UI test categories: FlyoutPage,ListView,Performance

❌ Deep UI tests — 175 passed, 3 failed across 3 categories on platform-pool agent (replaces in-process counts above).

🧪 UI Test Execution Results (deep, platform pool)

Category Tests Snapshot diffs
FlyoutPage 61/64 (3 ❌) —
ListView 109/109 ✓ —
Performance 5/6 ✓ —
❌ FlyoutPage — 3 failed tests
VerifyFlyoutPage_IsGestureEnabled
Flyout did not open after multiple drag attempts
Assert.That(flyoutOpened, Is.True)
  Expected: True
  But was:  False
at Microsoft.Maui.TestCases.Tests.FlyoutPageFeatureTests.VerifyFlyoutPage_IsGestureEnabled() in /_/src/Controls/tests/TestCases.Shared.Tests/Tests/FeatureMatrix/FlyoutPageFeatureTests.cs:line 92

1)    at Microsoft.Maui.TestCases.Tests.FlyoutPageFeatureTests.VerifyFlyoutPage_IsGestureEnabled() in /_/src/Controls/tests/TestCases.Shared.Tests/Tests/FeatureMatrix/FlyoutPageFeatureTests.cs:line 92
ShouldKeepFlyoutLockedWhenSwitchingLandScapeToPortrait
OpenQA.Selenium.InvalidElementStateException : Screen rotation cannot be changed to ROTATION_0 after 2000ms. Is it locked programmatically?
at OpenQA.Selenium.WebDriver.UnpackAndThrowOnError(Response errorResponse, String commandToExecute)
   at OpenQA.Selenium.WebDriver.ExecuteAsync(String driverCommandToExecute, Dictionary`2 parameters)
   at OpenQA.Selenium.Appium.AppiumDriver.Execute(String driverCommandToExecute, Dictionary`2 parameters)
   at OpenQA.Selenium.Appium.AppiumDriver.set_Orientation(ScreenOrientation value)
   at UITest.Appium.AppiumOrientationActions.SetOrientationPortrait(IDictionary`2 parameters) in /_/src/TestUtils/src/UITest.Appium/Actions/AppiumOrientationActions.cs:line 43
   at UITest.Appium.AppiumOrientationActions.Execute(String commandName, IDictionary`2 parameters) in /_/src/TestUtils/src/UITest.Appium/Actions/AppiumOrientationActions.cs:line 34
   at UITest.Appium.AppiumCommandExecutor.Execute(String commandName, IDictionary`2 parameters) in /_/src/TestUti
...
VerifyFlyoutPage_IsGestureEnabled_FlyoutBehaviorPopover
Flyout did not open after multiple drag attempts
Assert.That(flyoutOpened, Is.True)
  Expected: True
  But was:  False
at Microsoft.Maui.TestCases.Tests.FlyoutPageFeatureTests.VerifyFlyoutPage_IsGestureEnabled_FlyoutBehaviorPopover() in /_/src/Controls/tests/TestCases.Shared.Tests/Tests/FeatureMatrix/FlyoutPageFeatureTests.cs:line 149

1)    at Microsoft.Maui.TestCases.Tests.FlyoutPageFeatureTests.VerifyFlyoutPage_IsGestureEnabled_FlyoutBehaviorPopover() in /_/src/Controls/tests/TestCases.Shared.Tests/Tests/FeatureMatrix/FlyoutPageFeatureTests.cs:line 149

📎 Download drop-deep-uitests artifact (TRX + snapshot diffs)


📋 Pre-Flight — Context & Validation

Issue: #36479 - FlyoutPage instances are not collected on Android (inferred from local diff; GitHub CLI/web access unavailable)
PR: #36480 - Re-enable Android memory leak UI tests except known FlyoutPage leak (inferred from local diff)
Platforms Affected: Android
Files Changed: 0 implementation, 3 test

Key Findings

  • PR is test-metadata only: it removes Android [Ignore] from Bugzilla40955 and Bugzilla42329, and retargets the remaining Android skip on Bugzilla44166 from umbrella issue #27411 to #36479.
  • The affected tests are Appium UI tests in TestCases.Shared.Tests; likely impacted categories are Performance, ListView, and FlyoutPage.
  • GitHub CLI authentication and GitHub web fetch were unavailable, so issue/PR comments and required checks could not be independently gathered in this environment.

Code Review Summary

Verdict: NEEDS_DISCUSSION
Confidence: low
Errors: 0 | Warnings: 0 | Suggestions: 0

Key code review findings:

  • ℹ No code-review findings; blast radius is limited to UI test execution metadata.
  • ℹ CI/check status is undetermined because gh pr checks --required could not run without authentication.

Fix Candidates

# Source Approach Test Result Files Changed Notes
PR PR #36480 Remove obsolete Android ignores from Bugzilla40955 and Bugzilla42329; keep Bugzilla44166 ignored on Android with issue #36479. ⚠️ INCONCLUSIVE (Gate) Bugzilla40955.cs, Bugzilla42329.cs, Bugzilla44166.cs Original PR; gate build/run was inconclusive per caller.

🔬 Code Review — Deep Analysis

Code Review — PR #36480

Independent Assessment

What this changes: Re-enables two Android UI memory-leak tests by removing Android-only [Ignore] attributes, while keeping Bugzilla44166Test skipped on Android with a newer tracking issue link.
Inferred motivation: The umbrella Android memory-leak skip (#27411) appears partially resolved; only the FlyoutPage collection leak remains.

Reconciliation with PR Narrative

Author claims: Bugzilla40955 and Bugzilla42329 now pass locally on Android; Bugzilla44166 still fails and is tracked by #36479.
Agreement/disagreement: Matches the code and linked issue #36479. I could not independently verify local Android execution.

Prior Review Reconciliation

Prior ❌ Error Finding Source Status Evidence
No prior ❌ Error findings found. Reviews, inline comments, issue comments n/a GitHub API showed one Copilot summary review with no comments, no inline review comments, and no error-level issue comments.

CI Status

  • Required-check result: undetermined / pending
  • Classification: CI still in progress; no failing check observed from public check-runs at review time
  • Action taken: gh auth unavailable, so gh pr checks --required could not run. Used local diff plus public GitHub API. azdo-build-investigator was invoked; ci-analysis skill was unavailable. Confidence capped low and no LGTM per skill rules.

Findings

No ❌ Errors, ⚠️ Warnings, or 💡 Suggestions found.

Failure-Mode Probing

  • Re-enabled tests compile on Android? Yes: Android test project defines TEST_FAILS_ON_WINDOWS / TEST_FAILS_ON_CATALYST, so these files remain included; removing [Ignore] makes only Android start executing them.
  • Remaining known Android leak accidentally unskipped? No: Bugzilla44166Test still has #if ANDROID [Ignore(...#36479)].
  • Platform blast radius? Limited to UI test execution metadata; no product code or startup/runtime path is changed.

Verdict: NEEDS_DISCUSSION

Confidence: low
Summary: Code changes look sound and narrowly scoped, with no review findings. However, required CI could not be verified via gh and public check data still showed pending/queued checks, so the skill rules prohibit LGTM until CI is complete.


🛠️ Fix — Analysis & Comparison

Fix Candidates

# Source Approach Test Result Files Changed Notes
1 try-fix Split Bugzilla44166 into existing leak assertion plus Android-only navigation smoke coverage. ✅ PASS 1 file Passed after fixing helper extraction; viable but adds a new test method.
2 try-fix Run Bugzilla44166 on Android and quarantine only the final known leak assertion with Assert.Ignore. ✅ PASS 1 file Selected: narrower than PR method-level skip and less complex than Candidate 1.
PR PR #36480 Remove obsolete Android ignores from Bugzilla40955/Bugzilla42329; keep Bugzilla44166 ignored on Android with #36479. ⚠️ INCONCLUSIVE (Gate) 3 files Original PR; prior gate could not build/run per caller.

Cross-Pollination

Model Round New Ideas? Details
maui-expert-reviewer 1 Yes Suggested splitting Bugzilla44166 to preserve Android smoke coverage while keeping leak assertion skipped.
maui-expert-reviewer 2 Yes Suggested late Android quarantine: run the known repro path and skip only at the final unresolved leak assertion.

Exhausted: No — stopped because Candidate #2 passed the affected Android filter and is demonstrably narrower than the PR's method-level skip.
Selected Fix: Candidate #2 — it executes more of the Android regression path than the PR while keeping the unresolved #36479 leak from failing CI, and avoids Candidate #1's additional test method.

Candidate Details

try-fix-1

See ../try-fix-1/content.md and attempt-1/ artifacts. Summary: passed after one compile correction, but adds extra Android-only smoke coverage and is therefore more complex than necessary.

try-fix-2

See ../try-fix-2/content.md and attempt-2/ artifacts. Summary: passed with 3 total affected tests and 1 skipped known-failure assertion after executing the Bugzilla44166 repro path.


🏁 Report — Final Recommendation

Comparative Candidate Report — PR #36480

Ranking

Rank Candidate Regression result Assessment
1 try-fix-2 ✅ PASS Best balance: re-enables Bugzilla40955 and Bugzilla42329, executes the Android Bugzilla44166 navigation/GC repro path, and quarantines only the final known unresolved leak assertion tracked by #36479. If the leak is fixed later, the test can return success before the Android quarantine.
2 try-fix-1 ✅ PASS Viable and safer than a method-level skip because it adds Android FlyoutPage navigation smoke coverage while keeping the leak assertion skipped. It is more complex and provides less leak-path coverage than try-fix-2.
3 pr ⚠️ INCONCLUSIVE Simple and accurate for closing the umbrella skip, but keeps the entire Bugzilla44166 Android test skipped, so Android gets no coverage for the repro path while #36479 remains open.
4 pr-plus-reviewer ⚠️ INCONCLUSIVE Equivalent to pr; the expert reviewer produced no actionable findings and no patch was applied.

Candidate analysis

pr is a clean metadata-only change: it removes obsolete Android skips from two tests that are believed stable and updates the remaining Android skip to the dedicated FlyoutPage leak issue. The weakness is that the remaining Bugzilla44166 method-level skip hides all Android coverage for that scenario, not just the unresolved leak assertion.

pr-plus-reviewer does not differ from pr because the expert reviewer returned no inline findings.

try-fix-1 improves coverage by adding a separate Android-only smoke test for the FlyoutPage navigation path while preserving the skipped leak assertion. It passed the affected Android filter, but adds an extra test method and additional platform-scoped test metadata.

try-fix-2 is the strongest candidate. It lets the existing Bugzilla44166Test run through the repro path on Android and only skips when it reaches the known unresolved leak assertion. This is narrower than the PR's method-level skip and more direct than adding a separate smoke test. Its inline Android quarantine is a tradeoff, but it is localized, issue-linked, and empirically passed the affected Android run.

Winner

Winner: try-fix-2

try-fix-2 wins because it passed regression verification and preserves the most Android coverage while still quarantining the known #36479 leak. The raw PR and pr-plus-reviewer are acceptable but unverified and broader than necessary for Bugzilla44166.


🧭 Next Steps — alternative fix proposed (try-fix-2)

Automated review — alternative fix proposed

The expert-reviewer evaluation compared the PR fix against automatically generated candidates and selected try-fix-2 as the strongest fix.

Why: try-fix-2 passed the affected Android regression run and preserves more Android coverage than the PR by executing the Bugzilla44166 repro path before quarantining only the known #36479 leak assertion. The raw PR and pr-plus-reviewer remain broader method-level skips for Bugzilla44166, and pr-plus-reviewer is identical because the expert reviewer found no actionable issues.

Please consider applying the candidate diff below (or use it as guidance). Once you push an update, this workflow will re-trigger and re-evaluate.

Candidate diff (try-fix-2)
diff --git a/src/Controls/tests/TestCases.Shared.Tests/Tests/Issues/Bugzilla/Bugzilla40955.cs b/src/Controls/tests/TestCases.Shared.Tests/Tests/Issues/Bugzilla/Bugzilla40955.cs
index 44d0514b5b..66f0e045ac 100644
--- a/src/Controls/tests/TestCases.Shared.Tests/Tests/Issues/Bugzilla/Bugzilla40955.cs
+++ b/src/Controls/tests/TestCases.Shared.Tests/Tests/Issues/Bugzilla/Bugzilla40955.cs
@@ -23,9 +23,6 @@ public class Bugzilla40955 : _IssuesUITest
 	public override string Issue => "Memory leak with FormsAppCompatActivity and NavigationPage";
 
 	[Test]
-#if ANDROID
-	[Ignore("Failing on net10 https://github.com/dotnet/maui/issues/27411")]
-#endif
 	[Category(UITestCategories.Performance)]
 	public void MemoryLeakInFormsAppCompatActivity()
 	{
diff --git a/src/Controls/tests/TestCases.Shared.Tests/Tests/Issues/Bugzilla/Bugzilla42329.cs b/src/Controls/tests/TestCases.Shared.Tests/Tests/Issues/Bugzilla/Bugzilla42329.cs
index 5824acb249..5e63e38a28 100644
--- a/src/Controls/tests/TestCases.Shared.Tests/Tests/Issues/Bugzilla/Bugzilla42329.cs
+++ b/src/Controls/tests/TestCases.Shared.Tests/Tests/Issues/Bugzilla/Bugzilla42329.cs
@@ -20,9 +20,6 @@ public class Bugzilla42329 : _IssuesUITest
 	public override string Issue => "ListView in Frame and FormsAppCompatActivity Memory Leak";
 
 	[Test]
-#if ANDROID
-	[Ignore("Failing on net10 https://github.com/dotnet/maui/issues/27411")]
-#endif
 	[Category(UITestCategories.ListView)]
 	public async Task MemoryLeakB42329()
 	{
diff --git a/src/Controls/tests/TestCases.Shared.Tests/Tests/Issues/Bugzilla/Bugzilla44166.cs b/src/Controls/tests/TestCases.Shared.Tests/Tests/Issues/Bugzilla/Bugzilla44166.cs
index a3378990d7..0c48938d0c 100644
--- a/src/Controls/tests/TestCases.Shared.Tests/Tests/Issues/Bugzilla/Bugzilla44166.cs
+++ b/src/Controls/tests/TestCases.Shared.Tests/Tests/Issues/Bugzilla/Bugzilla44166.cs
@@ -15,9 +15,6 @@ public class Bugzilla44166 : _IssuesUITest
 
 	[Test]
-#if ANDROID
-	[Ignore("Failing on net10 https://github.com/dotnet/maui/issues/27411")]
-#endif
 	[Category(UITestCategories.Performance)]
 	public void Bugzilla44166Test()
 	{
@@ -41,6 +38,9 @@ public class Bugzilla44166 : _IssuesUITest
 		// The previous content retrieves the value of the page that was still allocated,
 		// which is only used for displaying in the error message.
 		// We can ignore this in Appium tests since we can't access those properties from the sample.
+#if ANDROID
+		Assert.Ignore("FlyoutPage instances are not collected on Android https://github.com/dotnet/maui/issues/36479");
+#endif
 		Assert.Fail($"At least one of the pages was not collected");
 	}
 }

@MauiBot MauiBot removed the s/agent-review-in-progress AI review is currently running for this PR label Jul 9, 2026
@kubaflo
kubaflo changed the base branch from main to inflight/current July 10, 2026 10:41
@kubaflo
kubaflo force-pushed the inflight/current branch from b28d9c1 to f9f3c80 Compare July 10, 2026 10:46
@kubaflo
kubaflo merged commit f594a31 into inflight/current Jul 10, 2026
43 of 50 checks passed
@kubaflo
kubaflo deleted the fix/reenable-27411-memtests branch July 10, 2026 11:15
@github-actions github-actions Bot added this to the .NET 10 SR9 milestone Jul 10, 2026
kubaflo added a commit that referenced this pull request Jul 15, 2026
<!-- Please let the below note in for people that find this PR -->
> [!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!

### Description of Change

Re-enables the Android memory-leak UI tests that were disabled under
#27411.

Verified locally on an Android API 30 emulator (multiple runs, stable):

| Test | Result |
| --- | --- |
| `Bugzilla40955.MemoryLeakInFormsAppCompatActivity` | ✅ now passes —
Android `[Ignore]` removed |
| `Bugzilla42329.MemoryLeakB42329` | ✅ now passes — Android `[Ignore]`
removed |
| `Bugzilla44166.Bugzilla44166Test` | ❌ still leaks (`FlyoutPage` not
collected) — kept skipped, now points at #36479 |

The device-level memory tests referenced by #27411
(`MemoryTests.PagesDoNotLeak`,
`NavigationPageTests.ChildPagesDoNotLeak`, `ShellTests.PagesDoNotLeak`)
are already enabled on `main`.

This closes out the umbrella #27411 and carves the one remaining Android
leak into a dedicated tracking issue.

### Issues Fixed

Fixes #27411
Tracks remaining leak: #36479

---
_This PR was prepared by GitHub Copilot CLI on behalf of @kubaflo, based
on local device-test verification._

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
kubaflo added a commit that referenced this pull request Jul 22, 2026
<!-- Please let the below note in for people that find this PR -->
> [!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!

### Description of Change

Re-enables the Android memory-leak UI tests that were disabled under
#27411.

Verified locally on an Android API 30 emulator (multiple runs, stable):

| Test | Result |
| --- | --- |
| `Bugzilla40955.MemoryLeakInFormsAppCompatActivity` | ✅ now passes —
Android `[Ignore]` removed |
| `Bugzilla42329.MemoryLeakB42329` | ✅ now passes — Android `[Ignore]`
removed |
| `Bugzilla44166.Bugzilla44166Test` | ❌ still leaks (`FlyoutPage` not
collected) — kept skipped, now points at #36479 |

The device-level memory tests referenced by #27411
(`MemoryTests.PagesDoNotLeak`,
`NavigationPageTests.ChildPagesDoNotLeak`, `ShellTests.PagesDoNotLeak`)
are already enabled on `main`.

This closes out the umbrella #27411 and carves the one remaining Android
leak into a dedicated tracking issue.

### Issues Fixed

Fixes #27411
Tracks remaining leak: #36479

---
_This PR was prepared by GitHub Copilot CLI on behalf of @kubaflo, based
on local device-test verification._

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
kubaflo added a commit that referenced this pull request Jul 28, 2026
<!-- Please let the below note in for people that find this PR -->
> [!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!

### Description of Change

Re-enables the Android memory-leak UI tests that were disabled under
#27411.

Verified locally on an Android API 30 emulator (multiple runs, stable):

| Test | Result |
| --- | --- |
| `Bugzilla40955.MemoryLeakInFormsAppCompatActivity` | ✅ now passes —
Android `[Ignore]` removed |
| `Bugzilla42329.MemoryLeakB42329` | ✅ now passes — Android `[Ignore]`
removed |
| `Bugzilla44166.Bugzilla44166Test` | ❌ still leaks (`FlyoutPage` not
collected) — kept skipped, now points at #36479 |

The device-level memory tests referenced by #27411
(`MemoryTests.PagesDoNotLeak`,
`NavigationPageTests.ChildPagesDoNotLeak`, `ShellTests.PagesDoNotLeak`)
are already enabled on `main`.

This closes out the umbrella #27411 and carves the one remaining Android
leak into a dedicated tracking issue.

### Issues Fixed

Fixes #27411
Tracks remaining leak: #36479

---
_This PR was prepared by GitHub Copilot CLI on behalf of @kubaflo, based
on local device-test verification._

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
kubaflo added a commit that referenced this pull request Jul 29, 2026
<!-- Please let the below note in for people that find this PR -->
> [!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!

### Description of Change

Re-enables the Android memory-leak UI tests that were disabled under
#27411.

Verified locally on an Android API 30 emulator (multiple runs, stable):

| Test | Result |
| --- | --- |
| `Bugzilla40955.MemoryLeakInFormsAppCompatActivity` | ✅ now passes —
Android `[Ignore]` removed |
| `Bugzilla42329.MemoryLeakB42329` | ✅ now passes — Android `[Ignore]`
removed |
| `Bugzilla44166.Bugzilla44166Test` | ❌ still leaks (`FlyoutPage` not
collected) — kept skipped, now points at #36479 |

The device-level memory tests referenced by #27411
(`MemoryTests.PagesDoNotLeak`,
`NavigationPageTests.ChildPagesDoNotLeak`, `ShellTests.PagesDoNotLeak`)
are already enabled on `main`.

This closes out the umbrella #27411 and carves the one remaining Android
leak into a dedicated tracking issue.

### Issues Fixed

Fixes #27411
Tracks remaining leak: #36479

---
_This PR was prepared by GitHub Copilot CLI on behalf of @kubaflo, based
on local device-test verification._

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
kubaflo added a commit that referenced this pull request Aug 7, 2026
<!-- Please let the below note in for people that find this PR -->
> [!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!

### Description of Change

Re-enables the Android memory-leak UI tests that were disabled under
#27411.

Verified locally on an Android API 30 emulator (multiple runs, stable):

| Test | Result |
| --- | --- |
| `Bugzilla40955.MemoryLeakInFormsAppCompatActivity` | ✅ now passes —
Android `[Ignore]` removed |
| `Bugzilla42329.MemoryLeakB42329` | ✅ now passes — Android `[Ignore]`
removed |
| `Bugzilla44166.Bugzilla44166Test` | ❌ still leaks (`FlyoutPage` not
collected) — kept skipped, now points at #36479 |

The device-level memory tests referenced by #27411
(`MemoryTests.PagesDoNotLeak`,
`NavigationPageTests.ChildPagesDoNotLeak`, `ShellTests.PagesDoNotLeak`)
are already enabled on `main`.

This closes out the umbrella #27411 and carves the one remaining Android
leak into a dedicated tracking issue.

### Issues Fixed

Fixes #27411
Tracks remaining leak: #36479

---
_This PR was prepared by GitHub Copilot CLI on behalf of @kubaflo, based
on local device-test verification._

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
@github-actions github-actions Bot locked and limited conversation to collaborators Aug 10, 2026
@github-actions github-actions Bot modified the milestones: .NET 10 SR9, .NET 10 SR11 Sep 22, 2026

This branch was previously deployed

1 inactive deployment
copilot-pat-pool — 75e298a4 Deployed Jul 9, 2026 by kubaflo via conclusion #739
Sign up for free to subscribe to this conversation on GitHub. Already have an account? Sign in.

Labels

area-core-lifecycle XPlat and Native UIApplicationDelegate/Activity/Window lifecycle events s/agent-fix-win AI found a better alternative fix than the PR s/agent-reviewed PR was reviewed by AI agent workflow (full 4-phase review)

Projects

None yet

Development

Successfully merging this pull request may close these issues.

[net10.0] Enable back Memory leak tests on Android

4 participants