Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
27 commits
Select commit Hold shift + click to select a range
54c4059
[testing] Add simulator 26
rmarinho Oct 9, 2025
4471adb
Try override device
rmarinho Oct 9, 2025
da6659b
Revert "Try override device"
rmarinho Oct 9, 2025
682aeb8
Add ios-simulator-64
rmarinho Oct 9, 2025
e96748b
try again
rmarinho Oct 9, 2025
952a5cc
Add tests on iOS26
rmarinho Dec 4, 2025
1a7bbff
Try scouting queue
rmarinho Dec 4, 2025
2b07894
Try simulator-26.0
rmarinho Dec 4, 2025
d6fd795
[tools] Update xharness
rmarinho Dec 15, 2025
14e0ba7
Update xharness
rmarinho Dec 15, 2025
c52d168
Update HelixTargetQueues for iOS and MacCatalyst
PureWeen Jan 7, 2026
0bd90bd
Update macOS VM image version to macOS-15
PureWeen Jan 7, 2026
df94175
- setup specific folder for iOS 26 runs with specific screen shots
PureWeen Jan 7, 2026
9934b1b
Fix queue
rmarinho Jan 12, 2026
7bdce93
Try uitests 26
rmarinho Jan 12, 2026
da0dda9
Commit the skill to run xharnes ios
rmarinho Jan 12, 2026
98463fc
[ios] Fixes for IOS tests
rmarinho Jan 12, 2026
98195d0
Skip tests
rmarinho Jan 12, 2026
d36f357
Skip tab bar tests
rmarinho Jan 12, 2026
34ce49f
Fix more tests
rmarinho Jan 12, 2026
9c6db7a
Revert "Commit the skill to run xharnes ios"
rmarinho Jan 12, 2026
2365071
Update images for iOS26
rmarinho Jan 12, 2026
580937b
dont run iOS 26 tests for now
rmarinho Jan 13, 2026
576a041
[testing] Fix more device tests
rmarinho Jan 13, 2026
298a822
Merge branch 'main' into test-26
rmarinho Jan 13, 2026
859db9a
Merge branch 'main' into test-26
rmarinho Jan 16, 2026
b441966
TEst doesn t work on macOS 26
rmarinho Jan 20, 2026
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
The table of contents is too big for display.
Diff view
Diff view
  •  
  •  
  •  
4 changes: 4 additions & 0 deletions .github/scripts/BuildAndRunHostApp.ps1
Original file line number Diff line number Diff line change
Expand Up @@ -261,6 +261,10 @@ if ($Platform -eq "catalyst") {
Write-Info "Executing: dotnet test --filter `"$effectiveFilter`""
Write-Host ""

# Set environment variables for the test
$env:DEVICE_UDID = $DeviceUdid
Write-Info "Set DEVICE_UDID environment variable: $DeviceUdid"

try {
# Run dotnet test and capture output
$testOutput = & dotnet test $TestProject --filter $effectiveFilter --logger "console;verbosity=detailed" 2>&1
Expand Down
8 changes: 4 additions & 4 deletions eng/helix_xharness.proj
Original file line number Diff line number Diff line change
Expand Up @@ -4,9 +4,9 @@
<HelixBuild Condition="'$(HelixBuild)' == ''">$(BUILD_BUILDNUMBER)</HelixBuild>
<HelixBuild Condition="'$(HelixBuild)' == ''">default</HelixBuild>
<!-- Public queues (default) -->
<HelixTargetQueues Condition="'$(TargetOS)' == 'ios' and '$(HelixInternal)' != 'True'">osx.15.arm64.maui.open</HelixTargetQueues>
<HelixTargetQueues Condition="'$(TargetOS)' == 'maccatalyst' and '$(HelixInternal)' != 'True'">osx.15.arm64.maui.open</HelixTargetQueues>
<HelixTargetQueues Condition="'$(TargetOS)' == 'android' and '$(HelixInternal)' != 'True'">ubuntu.2204.amd64.android.33.open</HelixTargetQueues>
<HelixTargetQueues Condition="'$(TargetOS)' == 'ios'">osx.15.arm64.maui.open;osx.26.arm64.open</HelixTargetQueues>
<HelixTargetQueues Condition="'$(TargetOS)' == 'maccatalyst'">osx.15.arm64.maui.open;osx.26.arm64.open</HelixTargetQueues>
<HelixTargetQueues Condition="'$(TargetOS)' == 'android'">ubuntu.2204.amd64.android.33.open</HelixTargetQueues>
<!-- Internal queues -->
<HelixTargetQueues Condition="'$(TargetOS)' == 'ios' and '$(HelixInternal)' == 'True'">osx.15.arm64.iphone.maui</HelixTargetQueues>
<HelixTargetQueues Condition="'$(TargetOS)' == 'maccatalyst' and '$(HelixInternal)' == 'True'">osx.15.arm64.iphone.maui</HelixTargetQueues>
Expand Down Expand Up @@ -180,4 +180,4 @@
</Target>


</Project>
</Project>
2 changes: 1 addition & 1 deletion eng/pipelines/common/device-tests-jobs.yml
Original file line number Diff line number Diff line change
Expand Up @@ -78,7 +78,7 @@ jobs:
apiVersion: ${{ replace(version, 'device-', '') }}
${{ if contains(version, 'latest') }}:
device: ios-simulator-64
apiVersion: 18.5
apiVersion: 26.0
${{ else }}:
device: ios-simulator-64_${{ replace(version, 'simulator-', '') }}
apiVersion: ${{ replace(version, 'simulator-', '') }}
Expand Down
221 changes: 79 additions & 142 deletions eng/pipelines/device-tests.yml
Original file line number Diff line number Diff line change
Expand Up @@ -108,146 +108,83 @@ parameters:
stages:
- ${{ each targetFrameworkVersion in parameters.targetFrameworkVersions }}:

# Run on dnceng-public (Helix)
- ${{ if eq(variables['Build.DefinitionName'], 'maui-pr-devicetests') }}:

# Use Helix for iOS / Android and MacCatalyst Device Tests
- template: /eng/pipelines/arcade/stage-device-tests.yml@self
parameters:
buildPool: ${{ parameters.macOSHelixPool }}
testPool: ${{ parameters.macOSPool }}
runAsPublic: true
TargetFrameworkVersion: ${{ targetFrameworkVersion.tfm }}
prepareSteps:
- template: /eng/pipelines/common/provision.yml@self
parameters:
checkoutDirectory: '$(System.DefaultWorkingDirectory)'
skipJdk: false
skipAndroidCommonSdks: false
skipAndroidPlatformApis: false
onlyAndroidPlatformDefaultApis: true
skipAndroidEmulatorImages: true
skipAndroidCreateAvds: true
skipProvisioning: true
skipXcode: false
skipSimulatorSetup: false

# Just use the old way for Windows Device Tests
- template: common/device-tests.yml
parameters:
windowsPool: ${{ parameters.windowsPool }}
targetFrameworkVersion: ${{ targetFrameworkVersion }}
- template: common/device-tests.yml
parameters:
androidPool: ${{ parameters.androidPool }}
iosPool: ${{ parameters.iosPool }}
catalystPool: ${{ parameters.catalystPool }}
windowsPool: ${{ parameters.windowsPool }}
targetFrameworkVersion: ${{ targetFrameworkVersion }}
${{ if or(parameters.BuildEverything, and(ne(variables['Build.Reason'], 'PullRequest'), eq(variables['System.TeamProject'], 'devdiv'))) }}:
androidApiLevels: [ 36, 35, 33, 30, 29, 27, 26, 25, 24, 23 ]
iosVersions: [ 'simulator-18.4', 'simulator-26.0' ]
catalystVersions: [ 'latest' ]
windowsVersions: [ 'packaged', 'unpackaged' ]
skipProvisioning: true
projects:
- name: essentials
desc: Essentials
windowsConfiguration: 'Debug'
windowsPackageId: 'com.microsoft.maui.essentials.devicetests'
windows: $(System.DefaultWorkingDirectory)/src/Essentials/test/DeviceTests/Essentials.DeviceTests.csproj
- name: graphics
desc: Graphics
windowsConfiguration: 'Debug'
windowsPackageId: 'com.microsoft.maui.graphics.devicetests'
windows: $(System.DefaultWorkingDirectory)/src/Graphics/tests/DeviceTests/Graphics.DeviceTests.csproj
- name: core
desc: Core
windowsConfiguration: 'Debug'
windowsPackageId: 'com.microsoft.maui.core.devicetests'
windows: $(System.DefaultWorkingDirectory)/src/Core/tests/DeviceTests/Core.DeviceTests.csproj
- name: controls
desc: Controls
windowsConfiguration: 'Debug'
windowsPackageId: 'com.microsoft.maui.controls.devicetests'
windows: $(System.DefaultWorkingDirectory)/src/Controls/tests/DeviceTests/Controls.DeviceTests.csproj
- name: blazorwebview
desc: BlazorWebView
windowsConfiguration: 'Debug'
windowsPackageId: 'Microsoft.Maui.MauiBlazorWebView.DeviceTests'
windows: $(System.DefaultWorkingDirectory)/src/BlazorWebView/tests/DeviceTests/MauiBlazorWebView.DeviceTests.csproj
platforms:
- windows

# Run on xamarin public instance
- ${{ else }}:

- template: common/device-tests.yml
parameters:
androidPool: ${{ parameters.androidPool }}
iosPool: ${{ parameters.iosPool }}
catalystPool: ${{ parameters.catalystPool }}
windowsPool: ${{ parameters.windowsPool }}
targetFrameworkVersion: ${{ targetFrameworkVersion }}
${{ if or(parameters.BuildEverything, and(ne(variables['Build.Reason'], 'PullRequest'), eq(variables['System.TeamProject'], 'devdiv'))) }}:
androidApiLevels: [ 36, 35, 33, 30, 29, 27, 26, 25, 24, 23 ]
iosVersions: [ 'simulator-18.4' ]
catalystVersions: [ 'latest' ]
windowsVersions: [ 'packaged', 'unpackaged' ]
skipProvisioning: ${{ or(not(parameters.UseProvisionator), false) }}
${{ else }}:
androidApiLevels: [ 33, 23 ]
iosVersions: [ 'simulator-18.4' ]
catalystVersions: [ 'latest' ]
windowsVersions: [ 'packaged', 'unpackaged' ]
skipProvisioning: ${{ not(parameters.UseProvisionator) }}
projects:
- name: essentials
desc: Essentials
androidApiLevelsExclude: [ 25, 27 ] # Ignore for now API25 since the runs's are not stable
androidApiLevelsCoreClrExclude: [ 27, 25, 23]
androidConfiguration: 'Release'
iOSConfiguration: 'Debug'
windowsConfiguration: 'Debug'
windowsPackageId: 'com.microsoft.maui.essentials.devicetests'
android: $(System.DefaultWorkingDirectory)/src/Essentials/test/DeviceTests/Essentials.DeviceTests.csproj
ios: $(System.DefaultWorkingDirectory)/src/Essentials/test/DeviceTests/Essentials.DeviceTests.csproj
catalyst: $(System.DefaultWorkingDirectory)/src/Essentials/test/DeviceTests/Essentials.DeviceTests.csproj
windows: $(System.DefaultWorkingDirectory)/src/Essentials/test/DeviceTests/Essentials.DeviceTests.csproj
- name: graphics
desc: Graphics
androidApiLevelsExclude: [ 25, 28 ] # Ignore for now API25 since the runs's are not stable
androidApiLevelsCoreClrExclude: [ 28, 25, 23]
androidConfiguration: 'Release'
iOSConfiguration: 'Debug'
windowsConfiguration: 'Debug'
windowsPackageId: 'com.microsoft.maui.graphics.devicetests'
android: $(System.DefaultWorkingDirectory)/src/Graphics/tests/DeviceTests/Graphics.DeviceTests.csproj
ios: $(System.DefaultWorkingDirectory)/src/Graphics/tests/DeviceTests/Graphics.DeviceTests.csproj
catalyst: $(System.DefaultWorkingDirectory)/src/Graphics/tests/DeviceTests/Graphics.DeviceTests.csproj
windows: $(System.DefaultWorkingDirectory)/src/Graphics/tests/DeviceTests/Graphics.DeviceTests.csproj
- name: core
desc: Core
androidApiLevelsExclude: [ 25 ] # Ignore for now API25 since the runs's are not stable
androidApiLevelsCoreClrExclude: [ 28, 25, 23]
androidConfiguration: 'Release'
iOSConfiguration: 'Debug'
windowsConfiguration: 'Debug'
windowsPackageId: 'com.microsoft.maui.core.devicetests'
android: $(System.DefaultWorkingDirectory)/src/Core/tests/DeviceTests/Core.DeviceTests.csproj
ios: $(System.DefaultWorkingDirectory)/src/Core/tests/DeviceTests/Core.DeviceTests.csproj
catalyst: $(System.DefaultWorkingDirectory)/src/Core/tests/DeviceTests/Core.DeviceTests.csproj
windows: $(System.DefaultWorkingDirectory)/src/Core/tests/DeviceTests/Core.DeviceTests.csproj
- name: controls
desc: Controls
androidApiLevelsExclude: [ 27, 25 ] # Ignore for now API25 since the runs's are not stable
androidApiLevelsCoreClrExclude: [ 27, 25, 23]
androidConfiguration: 'Debug'
iOSConfiguration: 'Debug'
windowsConfiguration: 'Debug'
windowsPackageId: 'com.microsoft.maui.controls.devicetests'
android: $(System.DefaultWorkingDirectory)/src/Controls/tests/DeviceTests/Controls.DeviceTests.csproj
ios: $(System.DefaultWorkingDirectory)/src/Controls/tests/DeviceTests/Controls.DeviceTests.csproj
catalyst: $(System.DefaultWorkingDirectory)/src/Controls/tests/DeviceTests/Controls.DeviceTests.csproj
windows: $(System.DefaultWorkingDirectory)/src/Controls/tests/DeviceTests/Controls.DeviceTests.csproj
- name: blazorwebview
desc: BlazorWebView
androidApiLevelsExclude: [ 30, 29, 28, 27, 26, 25, 24, 23, 22, 21 ] # BlazorWebView requires a recent version of Chrome
androidApiLevelsCoreClrExclude: [ 30, 29, 28, 27, 26, 25, 24, 23, 22, 21]
androidConfiguration: 'Release'
iOSConfiguration: 'Debug'
windowsConfiguration: 'Debug'
windowsPackageId: 'Microsoft.Maui.MauiBlazorWebView.DeviceTests'
android: $(System.DefaultWorkingDirectory)/src/BlazorWebView/tests/DeviceTests/MauiBlazorWebView.DeviceTests.csproj
ios: $(System.DefaultWorkingDirectory)/src/BlazorWebView/tests/DeviceTests/MauiBlazorWebView.DeviceTests.csproj
catalyst: $(System.DefaultWorkingDirectory)/src/BlazorWebView/tests/DeviceTests/MauiBlazorWebView.DeviceTests.csproj
windows: $(System.DefaultWorkingDirectory)/src/BlazorWebView/tests/DeviceTests/MauiBlazorWebView.DeviceTests.csproj
skipProvisioning: ${{ or(not(parameters.UseProvisionator), false) }}
${{ else }}:
androidApiLevels: [ 33, 23 ]
iosVersions: [ 'simulator-18.4', 'simulator-26.0' ]
catalystVersions: [ 'latest' ]
windowsVersions: [ 'packaged', 'unpackaged' ]
skipProvisioning: ${{ not(parameters.UseProvisionator) }}
projects:
- name: essentials
desc: Essentials
androidApiLevelsExclude: [ 25, 27 ] # Ignore for now API25 since the runs's are not stable
androidApiLevelsCoreClrExclude: [ 27, 25, 23]
androidConfiguration: 'Release'
iOSConfiguration: 'Debug'
windowsConfiguration: 'Debug'
windowsPackageId: 'com.microsoft.maui.essentials.devicetests'
android: $(System.DefaultWorkingDirectory)/src/Essentials/test/DeviceTests/Essentials.DeviceTests.csproj
ios: $(System.DefaultWorkingDirectory)/src/Essentials/test/DeviceTests/Essentials.DeviceTests.csproj
catalyst: $(System.DefaultWorkingDirectory)/src/Essentials/test/DeviceTests/Essentials.DeviceTests.csproj
windows: $(System.DefaultWorkingDirectory)/src/Essentials/test/DeviceTests/Essentials.DeviceTests.csproj
- name: graphics
desc: Graphics
androidApiLevelsExclude: [ 25, 28 ] # Ignore for now API25 since the runs's are not stable
androidApiLevelsCoreClrExclude: [ 28, 25, 23]
androidConfiguration: 'Release'
iOSConfiguration: 'Debug'
windowsConfiguration: 'Debug'
windowsPackageId: 'com.microsoft.maui.graphics.devicetests'
android: $(System.DefaultWorkingDirectory)/src/Graphics/tests/DeviceTests/Graphics.DeviceTests.csproj
ios: $(System.DefaultWorkingDirectory)/src/Graphics/tests/DeviceTests/Graphics.DeviceTests.csproj
catalyst: $(System.DefaultWorkingDirectory)/src/Graphics/tests/DeviceTests/Graphics.DeviceTests.csproj
windows: $(System.DefaultWorkingDirectory)/src/Graphics/tests/DeviceTests/Graphics.DeviceTests.csproj
- name: core
desc: Core
androidApiLevelsExclude: [ 25 ] # Ignore for now API25 since the runs's are not stable
androidApiLevelsCoreClrExclude: [ 28, 25, 23]
androidConfiguration: 'Release'
iOSConfiguration: 'Debug'
windowsConfiguration: 'Debug'
windowsPackageId: 'com.microsoft.maui.core.devicetests'
android: $(System.DefaultWorkingDirectory)/src/Core/tests/DeviceTests/Core.DeviceTests.csproj
ios: $(System.DefaultWorkingDirectory)/src/Core/tests/DeviceTests/Core.DeviceTests.csproj
catalyst: $(System.DefaultWorkingDirectory)/src/Core/tests/DeviceTests/Core.DeviceTests.csproj
windows: $(System.DefaultWorkingDirectory)/src/Core/tests/DeviceTests/Core.DeviceTests.csproj
- name: controls
desc: Controls
androidApiLevelsExclude: [ 27, 25 ] # Ignore for now API25 since the runs's are not stable
androidApiLevelsCoreClrExclude: [ 27, 25, 23]
androidConfiguration: 'Debug'
iOSConfiguration: 'Debug'
windowsConfiguration: 'Debug'
windowsPackageId: 'com.microsoft.maui.controls.devicetests'
android: $(System.DefaultWorkingDirectory)/src/Controls/tests/DeviceTests/Controls.DeviceTests.csproj
ios: $(System.DefaultWorkingDirectory)/src/Controls/tests/DeviceTests/Controls.DeviceTests.csproj
catalyst: $(System.DefaultWorkingDirectory)/src/Controls/tests/DeviceTests/Controls.DeviceTests.csproj
windows: $(System.DefaultWorkingDirectory)/src/Controls/tests/DeviceTests/Controls.DeviceTests.csproj
- name: blazorwebview
desc: BlazorWebView
androidApiLevelsExclude: [ 30, 29, 28, 27, 26, 25, 24, 23, 22, 21 ] # BlazorWebView requires a recent version of Chrome
androidApiLevelsCoreClrExclude: [ 30, 29, 28, 27, 26, 25, 24, 23, 22, 21]
androidConfiguration: 'Release'
iOSConfiguration: 'Debug'
windowsConfiguration: 'Debug'
windowsPackageId: 'Microsoft.Maui.MauiBlazorWebView.DeviceTests'
android: $(System.DefaultWorkingDirectory)/src/BlazorWebView/tests/DeviceTests/MauiBlazorWebView.DeviceTests.csproj
ios: $(System.DefaultWorkingDirectory)/src/BlazorWebView/tests/DeviceTests/MauiBlazorWebView.DeviceTests.csproj
catalyst: $(System.DefaultWorkingDirectory)/src/BlazorWebView/tests/DeviceTests/MauiBlazorWebView.DeviceTests.csproj
windows: $(System.DefaultWorkingDirectory)/src/BlazorWebView/tests/DeviceTests/MauiBlazorWebView.DeviceTests.csproj
6 changes: 3 additions & 3 deletions eng/pipelines/ui-tests.yml
Original file line number Diff line number Diff line change
Expand Up @@ -106,7 +106,7 @@ parameters:
type: object
default:
name: Azure Pipelines
vmImage: macOS-14
vmImage: macOS-15

stages:

Expand All @@ -123,10 +123,10 @@ stages:
RunNativeAOT: ${{ parameters.RunNativeAOT }}
${{ if or(parameters.BuildEverything, and(ne(variables['Build.Reason'], 'PullRequest'), eq(variables['System.TeamProject'], 'devdiv'))) }}:
androidApiLevels: [ 30 ]
iosVersions: [ '18.4' ]
iosVersions: [ '18.4', '26.0' ]
${{ else }}:
androidApiLevels: [ 30 ]
iosVersions: [ '18.4' ]
iosVersions: [ '18.4', '26.0' ]
${{ if or(parameters.UseProvisionator, eq(variables['internalProvisioning'],'true') ) }}:
skipProvisioning: false
${{ else }}:
Expand Down
8 changes: 8 additions & 0 deletions src/Controls/tests/DeviceTests/Elements/Label/LabelTests.cs
Original file line number Diff line number Diff line change
Expand Up @@ -511,8 +511,16 @@ await InvokeOnMainThreadAsync(() =>
}

[Fact]
#if __IOS__
[Trait(TestCategory.SkipOnIOS26, "Font comparison may fail on iOS 26")]
#endif
public async Task FontStuffAppliesEvenInHtmlMode()
{
#if __IOS__
// iOS 26 may have font handling changes that affect HTML text rendering
if (OperatingSystem.IsIOSVersionAtLeast(26))
return;
#endif
// Note: this is specifically a Controls-level rule that's inherited from Forms
// There's no reason other SDKs need to force font properties when dealing
// with HTML text (since HTML can do that on its own)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -36,8 +36,12 @@ public async Task TextTransformUpdated(string text, TextTransform transform, str
#if MACCATALYST || IOS
// Only Mac Catalyst and iOS needs the CancelButtonColor nuanced handling verifying
[Fact(DisplayName = "CancelButtonColor is set correctly")]
[Trait(TestCategory.SkipOnIOS26, "iOS 26 changed UISearchBar internal structure")]
public async Task CancelButtonColorSetCorrectly()
{
if (OperatingSystem.IsIOSVersionAtLeast(26))
return;

var expected = Graphics.Colors.Red;

var searchBar = new SearchBar()
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -277,6 +277,11 @@ await RunShellTest(shell =>
[ClassData(typeof(ShellFlyoutHeaderScrollTestCases))]
public async Task FlyoutHeaderScroll(FlyoutHeaderBehavior flyoutHeaderBehavior, string contentType)
{
// Skip on iOS 26+ due to FlyoutHeader collapse behavior changes
// See: https://github.com/dotnet/maui/issues/33004
if (OperatingSystem.IsIOSVersionAtLeast(26))
return;

var headerRequestedHeight = 250;
var headerMinHeight = 100;

Expand Down
Loading
Loading