diff --git a/examples/folio/composeApp/src/iosMain/kotlin/app/folio/sanderling/SanderlingIos.kt b/examples/folio/composeApp/src/iosMain/kotlin/app/folio/sanderling/SanderlingIos.kt index c17fe57..f14dd0f 100644 --- a/examples/folio/composeApp/src/iosMain/kotlin/app/folio/sanderling/SanderlingIos.kt +++ b/examples/folio/composeApp/src/iosMain/kotlin/app/folio/sanderling/SanderlingIos.kt @@ -15,12 +15,24 @@ object SanderlingIos { internal val extractors = mutableMapOf Any?>() fun start() { - val env = NSProcessInfo.processInfo.environment - val portStr = env["SANDERLING_PORT"] as? String ?: return - val port = portStr.toIntOrNull() ?: return + val port = resolvePort() ?: return IosAgent.start("127.0.0.1", port) } + private fun resolvePort(): Int? { + // Env var set via SIMCTL_CHILD_SANDERLING_PORT (simctl direct launch). + (NSProcessInfo.processInfo.environment["SANDERLING_PORT"] as? String) + ?.toIntOrNull()?.let { return it } + // Launch argument -SANDERLING_PORT (Maestro simctl launch). + @Suppress("UNCHECKED_CAST") + val args = NSProcessInfo.processInfo.arguments as? List ?: return null + val idx = args.indexOfFirst { it == "-SANDERLING_PORT" } + if (idx >= 0 && idx + 1 < args.size) { + return args[idx + 1].toIntOrNull() + } + return null + } + fun extract(name: String, block: () -> Any?) { extractors[name] = block } diff --git a/sidecar/src/main/kotlin/dev/sanderling/sidecar/DriverBackend.kt b/sidecar/src/main/kotlin/dev/sanderling/sidecar/DriverBackend.kt index 3ff34b3..fab13d3 100644 --- a/sidecar/src/main/kotlin/dev/sanderling/sidecar/DriverBackend.kt +++ b/sidecar/src/main/kotlin/dev/sanderling/sidecar/DriverBackend.kt @@ -503,12 +503,15 @@ class IosDriverBackend(private val udid: String) : DriverBackend { false, ) val xcTestDriverClient = xcuitest.XCTestDriverClient(installer, httpClient, false) - val device = ios.xctest.XCTestIOSDevice(udid, xcTestDriverClient) { emptySet() } + val xcTestDevice = ios.xctest.XCTestIOSDevice(udid, xcTestDriverClient) { emptySet() } + val simctlDevice = ios.simctl.SimctlIOSDevice(udid) + val device = ios.LocalIOSDevice(udid, xcTestDevice, simctlDevice, maestro.utils.NoopInsights) driver = maestro.drivers.IOSDriver(device, maestro.utils.NoopInsights, metrics) driver.open() } override fun launch(bundleId: String, clearState: Boolean, env: Map) { + runCatching { driver.stopApp(bundleId) } if (clearState) driver.clearAppState(bundleId) driver.launchApp(bundleId, env, java.util.UUID.randomUUID()) } diff --git a/sidecar/src/main/kotlin/dev/sanderling/sidecar/DriverService.kt b/sidecar/src/main/kotlin/dev/sanderling/sidecar/DriverService.kt index 0f3c945..d52fe7f 100644 --- a/sidecar/src/main/kotlin/dev/sanderling/sidecar/DriverService.kt +++ b/sidecar/src/main/kotlin/dev/sanderling/sidecar/DriverService.kt @@ -150,7 +150,9 @@ class DriverService( observer.onNext(block()) observer.onCompleted() } catch (cause: Exception) { - observer.onError(cause) + cause.printStackTrace() + observer.onError(io.grpc.Status.INTERNAL.withDescription(cause.toString()) + .withCause(cause).asRuntimeException()) } }