From 3c549b4cb8bca8dfd5f8401c0d5244831dba33fc Mon Sep 17 00:00:00 2001 From: Lawrence Chen Date: Tue, 17 Mar 2026 02:06:50 -0700 Subject: [PATCH] Fix browser import UI test harness --- .../BrowserImportProfilesUITests.swift | 50 ++++++++++++------- 1 file changed, 33 insertions(+), 17 deletions(-) diff --git a/cmuxUITests/BrowserImportProfilesUITests.swift b/cmuxUITests/BrowserImportProfilesUITests.swift index 8ba0e7d6..a5b4df7a 100644 --- a/cmuxUITests/BrowserImportProfilesUITests.swift +++ b/cmuxUITests/BrowserImportProfilesUITests.swift @@ -1,6 +1,23 @@ import XCTest import Foundation +private func browserImportPollUntil( + timeout: TimeInterval, + pollInterval: TimeInterval = 0.05, + condition: () -> Bool +) -> Bool { + let start = ProcessInfo.processInfo.systemUptime + while true { + if condition() { + return true + } + if (ProcessInfo.processInfo.systemUptime - start) >= timeout { + return false + } + RunLoop.current.run(until: Date().addingTimeInterval(pollInterval)) + } +} + final class BrowserImportProfilesUITests: XCTestCase { private var capturePath = "" @@ -121,11 +138,7 @@ final class BrowserImportProfilesUITests: XCTestCase { app.launchEnvironment["CMUX_UI_TEST_BROWSER_IMPORT_DESTINATIONS"] = #"["Default"]"# app.launchEnvironment["CMUX_UI_TEST_BROWSER_IMPORT_MODE"] = "capture-only" app.launchEnvironment["CMUX_UI_TEST_BROWSER_IMPORT_CAPTURE_PATH"] = capturePath - app.launch() - XCTAssertTrue( - ensureForegroundAfterLaunch(app, timeout: 12.0), - "Expected app to launch in the foreground for browser import UI tests" - ) + launchAndActivate(app) return app } @@ -145,30 +158,33 @@ final class BrowserImportProfilesUITests: XCTestCase { } private func waitForCapturedSelection(timeout: TimeInterval) -> [String: Any]? { - let deadline = Date().addingTimeInterval(timeout) let url = URL(fileURLWithPath: capturePath) - while Date() < deadline { + let foundCapture = browserImportPollUntil(timeout: timeout) { if let data = try? Data(contentsOf: url), let object = try? JSONSerialization.jsonObject(with: data) as? [String: Any] { - return object + return !object.isEmpty } - RunLoop.current.run(until: Date().addingTimeInterval(0.05)) + return false } - if let data = try? Data(contentsOf: url), + if foundCapture, + let data = try? Data(contentsOf: url), let object = try? JSONSerialization.jsonObject(with: data) as? [String: Any] { return object } return nil } - private func ensureForegroundAfterLaunch(_ app: XCUIApplication, timeout: TimeInterval) -> Bool { - if app.wait(for: .runningForeground, timeout: timeout) { - return true - } - if app.state == .runningBackground { + private func launchAndActivate(_ app: XCUIApplication, activateTimeout: TimeInterval = 2.0) { + app.launch() + let activated = browserImportPollUntil(timeout: activateTimeout) { + guard app.state != .runningForeground else { + return true + } + app.activate() + return app.state == .runningForeground + } + if !activated { app.activate() - return app.wait(for: .runningForeground, timeout: 6.0) } - return false } }