From 154a54de6dbaa149be678405dadf4918d79995a6 Mon Sep 17 00:00:00 2001 From: "Eric C. Johnson" Date: Thu, 11 Jun 2026 17:26:43 -0600 Subject: [PATCH 1/3] @W-22954921: [iOS] Stabilize flaky test testMissingLoginHint (trivial change to trigger CI) --- .../SalesforceSDKCoreTests/DomainDiscoveryCoordinatorTests.swift | 1 + 1 file changed, 1 insertion(+) diff --git a/libs/SalesforceSDKCore/SalesforceSDKCoreTests/DomainDiscoveryCoordinatorTests.swift b/libs/SalesforceSDKCore/SalesforceSDKCoreTests/DomainDiscoveryCoordinatorTests.swift index c436b9c80f..3018ea94f0 100644 --- a/libs/SalesforceSDKCore/SalesforceSDKCoreTests/DomainDiscoveryCoordinatorTests.swift +++ b/libs/SalesforceSDKCore/SalesforceSDKCoreTests/DomainDiscoveryCoordinatorTests.swift @@ -41,6 +41,7 @@ final class DomainDiscoveryCoordinatorTests: XCTestCase { XCTAssertNil(results) } + // Flaky test stabilization - W-22954921 func testMissingLoginHint() async throws { // Given: callback URL with my_domain only (no login_hint). Build via URLComponents so parsing is deterministic on all platforms. let coordinator = DomainDiscoveryCoordinator() From 5838081141dc40def703153255ed751305d502d6 Mon Sep 17 00:00:00 2001 From: "Eric C. Johnson" Date: Fri, 12 Jun 2026 09:17:48 -0600 Subject: [PATCH 2/3] @W-22954921: [iOS] Stabilize flaky test testMissingLoginHint (remove @MainActor and async from synchronous tests) --- .../DomainDiscoveryCoordinatorTests.swift | 23 ++++++++++--------- 1 file changed, 12 insertions(+), 11 deletions(-) diff --git a/libs/SalesforceSDKCore/SalesforceSDKCoreTests/DomainDiscoveryCoordinatorTests.swift b/libs/SalesforceSDKCore/SalesforceSDKCoreTests/DomainDiscoveryCoordinatorTests.swift index 3018ea94f0..c6e38366b7 100644 --- a/libs/SalesforceSDKCore/SalesforceSDKCoreTests/DomainDiscoveryCoordinatorTests.swift +++ b/libs/SalesforceSDKCore/SalesforceSDKCoreTests/DomainDiscoveryCoordinatorTests.swift @@ -4,10 +4,12 @@ import XCTest /// Tests for DomainDiscoveryCoordinator. We call `handle(callbackURL:)` directly with a URL /// instead of building a MockNavigationAction, because subclassing WKNavigationAction and /// calling super.init() can trigger an abort in WebKit on CI (signal abrt). -@MainActor +/// +/// These tests exercise only synchronous URL-parsing logic, so they avoid @MainActor and async +/// to prevent main-actor contention with WebKit-using tests running in the same bundle. final class DomainDiscoveryCoordinatorTests: XCTestCase { - func testCallbackSuccess() async throws { + func testCallbackSuccess() throws { // Given let coordinator = DomainDiscoveryCoordinator() let expectedDomain = "foo.my.salesforce.com" @@ -26,7 +28,7 @@ final class DomainDiscoveryCoordinatorTests: XCTestCase { XCTAssertEqual(results?.loginHint, expectedLoginHint) } - func testMissingMyDomain() async throws { + func testMissingMyDomain() throws { // Given let coordinator = DomainDiscoveryCoordinator() let expectedLoginHint = "testuser@example.com" @@ -41,9 +43,8 @@ final class DomainDiscoveryCoordinatorTests: XCTestCase { XCTAssertNil(results) } - // Flaky test stabilization - W-22954921 - func testMissingLoginHint() async throws { - // Given: callback URL with my_domain only (no login_hint). Build via URLComponents so parsing is deterministic on all platforms. + func testMissingLoginHint() throws { + // Given let coordinator = DomainDiscoveryCoordinator() var components = URLComponents() components.scheme = "sfdc" @@ -58,7 +59,7 @@ final class DomainDiscoveryCoordinatorTests: XCTestCase { XCTAssertNil(results) } - func testMalformedCallbackURL() async throws { + func testMalformedCallbackURL() throws { // Given let coordinator = DomainDiscoveryCoordinator() let callbackURLString = "sfdc://discocallback?my_domain=&login_hint=" @@ -72,8 +73,8 @@ final class DomainDiscoveryCoordinatorTests: XCTestCase { XCTAssertEqual(results?.loginHint, "") } - func testNonCallbackURL() async throws { - // Given: URL that is not a domain discovery callback. Build via URLComponents so parsing is deterministic on all platforms. + func testNonCallbackURL() throws { + // Given let coordinator = DomainDiscoveryCoordinator() var components = URLComponents() components.scheme = "https" @@ -87,7 +88,7 @@ final class DomainDiscoveryCoordinatorTests: XCTestCase { XCTAssertNil(results) } - func testSpecialCharactersInLoginHint() async throws { + func testSpecialCharactersInLoginHint() throws { // Given let coordinator = DomainDiscoveryCoordinator() let expectedDomain = "foo.my.salesforce.com" @@ -106,7 +107,7 @@ final class DomainDiscoveryCoordinatorTests: XCTestCase { XCTAssertEqual(results?.loginHint, expectedLoginHint) } - func testExtraQueryParameters() async throws { + func testExtraQueryParameters() throws { // Given let coordinator = DomainDiscoveryCoordinator() let expectedDomain = "foo.my.salesforce.com" From a5ef33bfc7be3ad3fc7482840e5ea5a58103f1e7 Mon Sep 17 00:00:00 2001 From: "Eric C. Johnson" Date: Fri, 12 Jun 2026 14:38:26 -0600 Subject: [PATCH 3/3] @W-22954921: [iOS] Restore useful Given comments and simplify class doc --- .../DomainDiscoveryCoordinatorTests.swift | 12 ++++-------- 1 file changed, 4 insertions(+), 8 deletions(-) diff --git a/libs/SalesforceSDKCore/SalesforceSDKCoreTests/DomainDiscoveryCoordinatorTests.swift b/libs/SalesforceSDKCore/SalesforceSDKCoreTests/DomainDiscoveryCoordinatorTests.swift index c6e38366b7..345533f1ce 100644 --- a/libs/SalesforceSDKCore/SalesforceSDKCoreTests/DomainDiscoveryCoordinatorTests.swift +++ b/libs/SalesforceSDKCore/SalesforceSDKCoreTests/DomainDiscoveryCoordinatorTests.swift @@ -1,12 +1,8 @@ import XCTest @testable import SalesforceSDKCore -/// Tests for DomainDiscoveryCoordinator. We call `handle(callbackURL:)` directly with a URL -/// instead of building a MockNavigationAction, because subclassing WKNavigationAction and -/// calling super.init() can trigger an abort in WebKit on CI (signal abrt). -/// -/// These tests exercise only synchronous URL-parsing logic, so they avoid @MainActor and async -/// to prevent main-actor contention with WebKit-using tests running in the same bundle. +/// Tests for DomainDiscoveryCoordinator. These exercise synchronous URL-parsing logic +/// via `handle(callbackURL:)` directly. final class DomainDiscoveryCoordinatorTests: XCTestCase { func testCallbackSuccess() throws { @@ -44,7 +40,7 @@ final class DomainDiscoveryCoordinatorTests: XCTestCase { } func testMissingLoginHint() throws { - // Given + // Given: callback URL with my_domain but no login_hint let coordinator = DomainDiscoveryCoordinator() var components = URLComponents() components.scheme = "sfdc" @@ -74,7 +70,7 @@ final class DomainDiscoveryCoordinatorTests: XCTestCase { } func testNonCallbackURL() throws { - // Given + // Given: URL that is not a domain discovery callback let coordinator = DomainDiscoveryCoordinator() var components = URLComponents() components.scheme = "https"