Support for Xcode 27 on CI (#6217)

* Run the tests on iOS 27.0

Bump the required simulator OS in the preview, UI and Compound tests, and the CI tool's default OS, from 26.5 to 27.0. Test devices stay the same.

iOS 27 writes transcoded videos 146 bytes larger, so update the expected sizes in MediaUploadingPreprocessorTests.

* Build and test on CI with Xcode 27

Select Xcode 27 in ci_common.sh and move every macOS workflow to the xcode-27 runner image, as macos-26 doesn't include Xcode 27. The Compound workflow now also creates its simulator on the iOS 27.0 runtime.

The xcode-27 runners are slower, so give the unit, Enterprise, Compound and snapshot recording jobs longer timeouts.

* Fix the preview snapshot layout on iOS 27

On iOS 27 the hosting controller applies the window's safe area when rendering, but the snapshot size comes from sizeThatFits, which ignores it. Component previews were shifted down and clipped at the bottom. Disable the hosting controller's safe area regions for these snapshots so the measured and rendered layouts match.

swift-snapshot-testing also renders into a window without a scene, and on iOS 27 a navigation stack in such a window reserves space for a large title it never shows, leaving a gap below the navigation bar. Attach the render window to the app's scene until swift-snapshot-testing handles it.

The invite users and add rooms screens sized their selected items row from a measured width stored in state, which is zero on the first layout pass, so snapshots could draw the row empty. Use containerRelativeFrame instead. The add rooms search previews now also wait for their results, and the search previews that show a clear button get a small precision tolerance, as it renders inconsistently in snapshots.

* Re-record the preview snapshots on iOS 27.0

Recorded on an iPhone SE (3rd generation) simulator running iOS 27.0 with Xcode 27.0 (27A266a). The changes come from iOS 27 rendering: text anti-aliasing, hyphenation and line breaking, navigation bars and toggles that now render in snapshots, lazy stacks that were blank on iOS 26, and pseudo-language locale formatting.

* Fix the UI tests on iOS 27

iOS 27 no longer exposes accessibility identifiers on SwiftUI menu items, so the space exploration test now finds them by label within the menu. On iPad, the start chat search field keeps focus after submitting and can swallow the next tap, so retry the tap if the create room screen doesn't appear.

* Re-record the UI test snapshots on iOS 27.0

Recorded on iPhone 17 and iPad (A16) simulators running iOS 27.0 with Xcode 27.0. The changes come from iOS 27 styling, like the keyboard height and glass borders. This also removes the iPad app lock setup snapshots, which have been orphaned since those tests stopped running on iPad.

* Fix the accessibility tests crashing on iOS 27

The accessibility tests' previews wrapper kept its ImageRenderer alive across the awaits that follow the render. On iOS 27, releasing it at that point tears down its view graph outside of a SwiftUI update, which hits an assertion and crashes the app. Release the renderer as soon as the image has been rendered.

* Keep the accessibility tests' image renderers alive on iOS 27

Releasing the ImageRenderer straight away wasn't enough: on iOS 27, releasing one that rendered a preview crashes SwiftUI whichever context it happens in. Keep the renderers alive instead. Each test launches a fresh app, so they only live for the one test.

* Share the UI tests' app settings with their mock user session

Since the user session flow reads its settings from UserSettings, the UI tests' mock user session was wrapping a fresh volatile AppSettings instead of the one the tests configure. The flags that skip onboarding weren't picked up, so every user session UI test got stuck on the notifications permission screen.

* Re-record the Compound snapshots on iOS 27.0

Apply the same safe area fix as the app's preview tests, so size-that-fits snapshots aren't clipped on iOS 27, and re-record the snapshots on an iPhone SE (3rd generation) simulator running iOS 27.0 in English (US).

* Fix a race reading the keyboard in the accessibility tests

On iOS 27 the QR code login screen's keyboard can be dismissing between checking that it exists and reading its frame, which fails the test. Snapshot it in a single query instead.
This commit is contained in:
Mauro
2026-09-29 17:02:48 +02:00
committed by GitHub
parent 90425460f9
commit b1ed870474
2404 changed files with 4824 additions and 4809 deletions
@@ -20,7 +20,7 @@ struct PreviewTests {
private let deviceConfig: ViewImageConfig = .iPhoneX
private let simulatorDevice: String? = "iPhone14,6" // iPhone SE 3rd Generation
private let requiredOSVersion = (major: 26, minor: 5)
private let requiredOSVersion = (major: 27, minor: 0)
/// The key is the name we will give to the snapshot
/// The value is the actual device that will be used to render the preview
private let snapshotDevices: [SnapshotDevice] = [.init(name: "iPhone", device: "iPhone 17"),
@@ -202,6 +202,8 @@ private extension Snapshotting where Value: SwiftUI.View, Format == UIImage {
controller = UIHostingController(rootView: view)
} else {
let hostingController = UIHostingController(rootView: view)
// iOS 27 applies the window's safe area when rendering, which sizeThatFits ignores, clipping the content.
hostingController.safeAreaRegions = []
let maxSize = CGSize.zero
config.size = hostingController.sizeThatFits(in: maxSize)
@@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
oid sha256:cfb365f0661902e712378ba2231c8cac0a2218d3c10fa600e8cc60db1d5105ba
size 86933
oid sha256:a24de165d7ee1acc5439fbbea5ef75742e337a0fb57c2103341d9ca967d9e0a7
size 86892
@@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
oid sha256:d0dab51c3b09212a708aa59da25662f585a33d842bcd21f0e9fd858186e56bff
size 46019
oid sha256:7931b18cd0dbd852495315270500982a7e350a2b3a12fb56ec1491d17d2493ff
size 46037
@@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
oid sha256:a75664c2367efb5437650d38f055cc21809e8472c8dc422ea68d2c5e6bf0f6c7
size 365515
oid sha256:5bb8c65ad9f4220459172702468a18d6fd3cf4b0f46061024ce50ec79ee17448
size 365653
@@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
oid sha256:e920dbb8ba61ea7e57fb7d4a6d5d20936d9332a681443fc9bb6b8bd0493ac44e
size 246192
oid sha256:dbdd6143d3907e1e3ba89bb6f928a017c2b7aed9ffef8c2379e7fe11a3753ea0
size 246432
@@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
oid sha256:79741242a1c5321c11de6b81fb46ad417b2309e0f3b11a99a99425195641d310
size 270790
oid sha256:24186f5a16ed5660bb0c090a918a8b0605a8c7b65f3cbfde8d352e8c37717379
size 270928
@@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
oid sha256:f23c2c6c927fc2dc00ca2df8484db861440e31e1c7333f188fc65f314d6a624d
size 151089
oid sha256:3c24e5b4ba319b2bf3ecaf024f4f803d7fc7a7d153dcd562767273cc36fdab24
size 151252
@@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
oid sha256:bb28b5531eaad9c88f4b2f72159cae17885a35b1a66723dc4df87aa2716c3410
size 28339
oid sha256:975ec06c99d0eaf162608a04f04f8254077a7d4b2a123db53e7ba63989b4927f
size 28322
@@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
oid sha256:620fb4f44e81cc77e8e7402db383fb96fdf90ff7a471d74921f5124d84a5c4f2
size 20139
oid sha256:13d67839d513161819bed772eaa33159c2361fe7c9be4493320115cff5999e29
size 20169
@@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
oid sha256:08815317819ffaa53aaf3a57c0d77faf83982c0f0995b531b29d65205ecf23f2
size 95605
oid sha256:83d1b9c3e13da54a2a62946ae508ee70408a5d581f27d47e8834f80a5a51aa8a
size 95641
@@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
oid sha256:f3bdd49d8c0a83aecaa6abfc6e19b1e7ce28410e9b59b8aecfeacb589365a424
size 49205
oid sha256:4a01abfc5f5c77caca7a3c76ca8463bf10a508d5dd5355222c4dee6983b9a72b
size 49233
@@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
oid sha256:282243f297e0c64292faa2b4295b1152881a290bbad790f42966647f999d9b3e
size 242145
oid sha256:dbd4787ecee53978e01e90782f8e8704a424b486ed27f06fece2e5e5113b86aa
size 241919
@@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
oid sha256:4e152394328a312a27e6f60426b4e977855f2c8569b6a861163231fad5845c72
size 150627
oid sha256:60ee1c44ab8ed1895c529c2c4d1bb749e6f71f73b3adbff2a67d0965c63af807
size 150593
@@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
oid sha256:b8b924c37a01860b662e08f4baee34aaf1b68adbce16331e797b76ef016fc336
size 79443
oid sha256:222283d193eee287c8c85cfde1d37f90f9e2d769d77c652178245d8d2651b3dd
size 84165
@@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
oid sha256:999e4a23c0523d63648ade432f542ff030d02bc52c3e1d960e4eb68b3c76d41e
size 38935
oid sha256:01d58200dfc274b8a736bdcf16d59ee916d81c63d2dc5ed091cf169ebc5a9a48
size 42999
@@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
oid sha256:c0bb121c331c798e33371368a782ee80e09beca1b5c6be6670cb6691cbc4d3ba
size 110002
oid sha256:98eaa70be3c00ca65aa80fad2769e7a36952686a17df32b5982c610259a4ed0b
size 110018
@@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
oid sha256:eeca363a76f76c2c08be150d600fd8e8e30eb85673a67210ea1ca4ba82d6c1a6
size 61441
oid sha256:2f3cfc2fea3cf5cfcda107a68c65fe6e4286d150c1bd1b4900522a6ae80994f0
size 61707
@@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
oid sha256:0624e48ac16514442e5154c1f17de0cc0469013e6d31adf6dcc2c4ceb33c61e8
size 384855
oid sha256:3c174b4ab439350d055ecdfd4b183a1654d6af677660a3c57ef32e04de4b4892
size 388365
@@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
oid sha256:34f7a6dd90a0368517ff51f341fb78d9ad3a002f6715a0b2f83e209c90d544e9
size 258128
oid sha256:74292377a178a57cb0260ea9eecbed8fa680f4a9c61e2ee725c02610be2f81c9
size 260928
@@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
oid sha256:5604d0d6c98f762efc3d05e8898f10c6547180b97f18de5dfbc2048e34b4579f
size 115627
oid sha256:85a3d618a8ed7281c193c5cfddf17359a716d9bc7373d830e7830efbece3a85e
size 115803
@@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
oid sha256:58df4ee7b09ac1597c5ff7da98ea96333040c0d47d151295a7eab43e7d083547
size 70077
oid sha256:3ec87a3e5bce4452a53cab89c2610aea4296502573aba3baf169e40d226f123b
size 69925
@@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
oid sha256:f804be26cba1a1ea081c3c51a21c69b564a9faab0bbf8649a17d7941179bebd1
size 86942
oid sha256:cfa98cf7eb6ea34fe23b84319fe13b5f4fff9e2018e18968377929c4a10c11a8
size 86992
@@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
oid sha256:903583ea0c7ab7ee24705a121782dd4e7e81414315f1cb00f01ae1e28efd4fa2
size 41534
oid sha256:b13273983072392eedbdb235408fdbc66eded96f4db31b21f835f66d53fa88f5
size 41476
@@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
oid sha256:87a1d5fcd870f54b9d3ab6a85a2b4a57453d2ee4ca9cfde85e88edc470582c3e
size 189991
oid sha256:fca867904f88aa945b2865a1484b2031c05ece7e5f711e9a89c172dd874ef696
size 190076
@@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
oid sha256:69a7eea88ff74ca88b49b4c2f30a0d0d639c81d9d9d9701abcbd1039ed661523
size 132964
oid sha256:370ca2dd68ff8a9082bcaa507369e8f5970549ba23a5821fb29e1f4c5fcedb48
size 132865
@@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
oid sha256:77f72cfac3d8dcf9165d934fae26fa4b52bc8d580b709497f4b70f81ab97a3bf
size 133254
oid sha256:298c4672c92569297bd543da8e65546a9d080d6c141d5925cd95c3f6ec3b42fd
size 133258
@@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
oid sha256:0c9372e4c8f0b2ae71ec0e469010c3f760ed37232532ea9fec70f8816ab714d3
size 99943
oid sha256:b12412ceb3ec9719a264d1ddae38a9bca3c9f8daa6a532df28cce9e50d1f1b00
size 99832
@@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
oid sha256:8111df3245f6fda7a760c48754fab886e934e0195c92feb9622f42f6f40850d0
size 92213
oid sha256:1566371fbf1a2b22771f6aed53e254787774b7e37e6ff518239ed9b699a332c6
size 92159
@@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
oid sha256:b7e4d098aebb49eb1370be283a084b25708ab74070eb873baf4e2fe560fec5f8
size 49321
oid sha256:9125a04b59d3645a9af3a72ad1744dde3dc79d171a41e5b5374e9e5645448e86
size 49548
@@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
oid sha256:dea95a18a22e57497f1eac4b22fa96b7541c0b59adc4a0de33a95264b7f1f66f
size 107443
oid sha256:bf3c572a37990c0326e7e9dc57dee7f7fde6fc98bf9921e22f7fa49b5b099a82
size 107610
@@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
oid sha256:08b36375d8b2fe380db803f304921efe1c8eafcca2d71f9d31126685e6d2715c
size 60451
oid sha256:c9da62eac825e5f7f25809f163af1bcd1b99eb7f350e4b05a7668c608a396793
size 60446
@@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
oid sha256:f47d8e612978976adfbf9a41f3fcee2dfa52637d5fdff704c149a46a38136a0e
size 88063
oid sha256:f599f189f7d722115ca9b253827d2b7634bd5482536abcf53ea91437f3335d70
size 88150
@@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
oid sha256:9506a43aa25ec4e18eeed0fc8da996ca04e4f06f09a058b99c61eb403bd75ce6
size 41439
oid sha256:2f0c5a8a4d09361095879b7b070ff9a9236a6d19c09e5f4f1a14c622d56dc65d
size 41339
@@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
oid sha256:c2f9b2b1458f7c07fedc82b41c17ebfd59e33e98bb5611b5b8c396aaaa70d361
size 92692
oid sha256:0a1a084004941111103da65eff88865e05915a1dd3f1daec54463b832581035b
size 92659
@@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
oid sha256:3186e1513ea161acb1976c6d7f35be3a5ffcc98e7dd07ebe825a415744c6bc2e
size 51106
oid sha256:1d2561424c5999ec85cb093f0d27324b0996dfde3695d3d1c4af0551c42cef7f
size 51301
@@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
oid sha256:4262ce787869d1cf6f85a0c5169104395912bac5ff8f8190867ecb11ce671986
size 97006
oid sha256:ece1f932318dec1b60d76aa2e2eee12097a14edd4fc8d57a8e9e6741a27b849e
size 97815
@@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
oid sha256:477cdc3393b1a03ed68f483926f7e800eac89f4133f89ccf9f4b374bdbe6af64
size 48568
oid sha256:f7244e270579e70a9128ac9895021339cdf6b39a8e6c07b3a0c583d4b5816c3e
size 49416
@@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
oid sha256:284bbc795d22df98213ea84f90ad99dd88f116df50b7b129b9509121be23f289
size 85804
oid sha256:1a7926d9fb82e299db8bc1d95f070822837bdc5f4cb9a53d28cb7a4ba548ef7a
size 85908
@@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
oid sha256:cf52b1156d4bb8af8c58b6e80d1dc2b48ec5511c9362b709bcde4451d63bb32e
size 44196
oid sha256:9aa9078211e0ecdf419de97ffcd206bc9952d2ffc51efc41b3c8fa9eed95c58b
size 44273
@@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
oid sha256:4a087c9fd5e0980921c85c87c5289186e7e0c185625ce50a1bd107cb87a553ed
size 98731
oid sha256:a462bcf49cb01edc5dd987b35fbeed8f22afb1beb821c066aa8b048da5a78285
size 98742
@@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
oid sha256:8dc8fafd68ddaa38ceb0090990bd4aa464f4ca5da4424a6f38c6233b2fe495cd
size 56402
oid sha256:77ef2e1f94fa765e37b2a51127fe641a60c0049561a32c64ac228665195c0764
size 56729