Skip to content

Comments

CI: Use Xcode 14.3.1 for iOS 15 tests#6297

Merged
ajpallares merged 9 commits intomainfrom
pallares/ci/xcode-14-for-ios-15-tests
Feb 23, 2026
Merged

CI: Use Xcode 14.3.1 for iOS 15 tests#6297
ajpallares merged 9 commits intomainfrom
pallares/ci/xcode-14-for-ios-15-tests

Conversation

@ajpallares
Copy link
Contributor

@ajpallares ajpallares commented Feb 19, 2026

Checklist

  • If applicable, unit tests
  • If applicable, create follow-up issues for purchases-android and hybrids

Motivation

iOS 15 CI tests were using Xcode 15 machines, which don't include the iOS 15 simulator. This required downloading the simulator at runtime via xcodes, which is slow and can fail intermittently. Xcode 14.3.1 machines already bundle the iOS 15 simulator natively, avoiding this issue.

Description

  • Switch run-test-ios-15 from Xcode 15.4.0 to Xcode 14.3.1 and remove the install-runtime: iOS 15.5 step (no longer needed since the simulator is bundled).
  • Switch from install-xcbeautify-for-xcode15 to install-xcbeautify-for-xcode14 to match the Xcode version.
  • Guard SKTestSession.setSimulatedError calls with #if compiler(>=5.9) since that API only exists in the Xcode 15+ SDK.
  • Fix a test deadlock in SimulatedStorePurchaseHandlerTests: self.wait(for:timeout:) blocks a cooperative thread pool thread in async context on Swift 5.8, causing a deadlock. Replaced with an Atomic<Bool> + Task.sleep polling loop for the older compiler path.

Made with Cursor


Note

Low Risk
Primarily CI configuration and test-only changes; main risk is CI coverage drift if the Xcode downgrade changes simulator/tooling behavior.

Overview
CI: Switches run-test-ios-15 to Xcode 14.3.1, swaps to install-xcbeautify-for-xcode14, and removes the runtime simulator install step for iOS 15.

Tests: Adds compiler guards around SKTestSession.setSimulatedError so iOS 17 StoreKit simulation code only compiles with Swift 5.9+/Xcode 15 SDKs, and updates SimulatedStorePurchaseHandlerTests to avoid an async deadlock on Swift 5.8 by replacing wait(for:timeout:) with an Atomic<Bool> + Task.sleep polling gate in the older-compiler path.

Written by Cursor Bugbot for commit b855c9f. This will update automatically on new commits. Configure here.

ajpallares and others added 6 commits February 19, 2026 11:35
Xcode 14.3.1 includes the iOS 15 simulator natively, so there's no need
to install Xcodes and download the runtime, which can be flaky. Also
switches to the xcode14-compatible xcbeautify version.

Co-authored-by: Cursor <cursoragent@cursor.com>
Adds a `run-ios-15-tests` action parameter and `ios-15-tests-only`
workflow to validate the Xcode 14.3.1 change for iOS 15 tests in
isolation. This workflow should be removed once validated.

Co-authored-by: Cursor <cursoragent@cursor.com>
SKTestSession.setSimulatedError is only available in the Xcode 15+ SDK
(Swift 5.9+). Gate it so the test compiles on Xcode 14.3.1 (Swift 5.8).

Co-authored-by: Cursor <cursoragent@cursor.com>
self.wait(for:timeout:) blocks a cooperative thread pool thread in async
context, causing a deadlock on Swift 5.8. Use Atomic<Bool> + Task.sleep
polling instead, keeping the XCTestExpectation path for Swift 5.9+.

Co-authored-by: Cursor <cursoragent@cursor.com>
Only needed on Swift 5.8 path.

Co-authored-by: Cursor <cursoragent@cursor.com>
Co-authored-by: Cursor <cursoragent@cursor.com>
@ajpallares ajpallares requested a review from a team as a code owner February 19, 2026 11:54
@emerge-tools
Copy link

emerge-tools bot commented Feb 23, 2026

📸 Snapshot Test

242 unchanged

Name Added Removed Modified Renamed Unchanged Errored Approval
RevenueCat
com.revenuecat.PaywallsTester
0 0 0 0 242 0 N/A

🛸 Powered by Emerge Tools

@ajpallares ajpallares merged commit 681ac60 into main Feb 23, 2026
40 of 44 checks passed
@ajpallares ajpallares deleted the pallares/ci/xcode-14-for-ios-15-tests branch February 23, 2026 10:32
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants