fix(ios): replace LaunchApp with BootedUDID; simctl launch moved to XCTest path

This commit is contained in:
pj committed 2026-04-23 17:33:39 +07:00
1 parent e16ab7ca0b
commit 768acdf240
2 files changed
+95 -12

No files matched your search

+6 -12
View File
@@ -5,7 +5,6 @@ import (
"encoding/json" "encoding/json"
"fmt" "fmt"
"io" "io"
"os"
"os/exec" "os/exec"
"strings" "strings"
"time" "time"
@@ -55,18 +54,13 @@ func EnsureSimulator(ctx context.Context, deviceName string, stdout io.Writer) e
return nil return nil
} }
func LaunchApp(ctx context.Context, bundleID string, env map[string]string) error { // BootedUDID returns the UDID of the currently booted iOS simulator, or "" if none is booted.
args := []string{"simctl", "launch", "--terminate-running-process", "booted", bundleID} func BootedUDID(ctx context.Context) string {
cmd := exec.CommandContext(ctx, "xcrun", args...) d, _ := bootedSimulator(ctx)
cmd.Env = os.Environ() if d == nil {
for k, v := range env { return ""
cmd.Env = append(cmd.Env, "SIMCTL_CHILD_"+k+"="+v)
} }
out, err := cmd.CombinedOutput() return d.UDID
if err != nil {
return fmt.Errorf("launch %s: %w\n%s", bundleID, err, strings.TrimSpace(string(out)))
}
return nil
} }
func bootedSimulator(ctx context.Context) (*simDevice, error) { func bootedSimulator(ctx context.Context) (*simDevice, error) {
+89
View File
@@ -0,0 +1,89 @@
package ios
import (
"context"
"testing"
)
func TestPickSimulator_ByName(t *testing.T) {
available := []simDevice{
{UDID: "aaa", Name: "iPad Pro", IsAvailable: true},
{UDID: "bbb", Name: "iPhone 15", IsAvailable: true},
}
got, err := pickSimulator("iPhone 15", available)
if err != nil {
t.Fatal(err)
}
if got.UDID != "bbb" {
t.Errorf("got %q, want bbb", got.UDID)
}
}
func TestPickSimulator_ByUDID(t *testing.T) {
available := []simDevice{
{UDID: "aaa", Name: "iPad Pro", IsAvailable: true},
{UDID: "bbb", Name: "iPhone 14", IsAvailable: true},
}
got, err := pickSimulator("aaa", available)
if err != nil {
t.Fatal(err)
}
if got.Name != "iPad Pro" {
t.Errorf("got %q, want iPad Pro", got.Name)
}
}
func TestPickSimulator_UnknownName(t *testing.T) {
available := []simDevice{
{UDID: "aaa", Name: "iPad Pro", IsAvailable: true},
}
_, err := pickSimulator("Pixel 7", available)
if err == nil {
t.Fatal("expected error for unknown simulator name")
}
}
func TestPickSimulator_EmptyName_PrefersIPhone(t *testing.T) {
available := []simDevice{
{UDID: "aaa", Name: "iPad mini", IsAvailable: true},
{UDID: "bbb", Name: "iPhone 16", IsAvailable: true},
{UDID: "ccc", Name: "Apple Watch", IsAvailable: true},
}
got, err := pickSimulator("", available)
if err != nil {
t.Fatal(err)
}
if got.UDID != "bbb" {
t.Errorf("got %q, want bbb (iPhone)", got.UDID)
}
}
func TestPickSimulator_EmptyName_FallsBackToFirst(t *testing.T) {
available := []simDevice{
{UDID: "aaa", Name: "iPad Air", IsAvailable: true},
{UDID: "bbb", Name: "Apple TV", IsAvailable: true},
}
got, err := pickSimulator("", available)
if err != nil {
t.Fatal(err)
}
if got.UDID != "aaa" {
t.Errorf("got %q, want aaa (first available)", got.UDID)
}
}
func TestPickSimulator_EmptyList(t *testing.T) {
_, err := pickSimulator("", nil)
if err == nil {
t.Fatal("expected error for empty simulator list")
}
}
func TestBootedUDID_CanceledContext(t *testing.T) {
ctx, cancel := context.WithCancel(context.Background())
cancel()
udid := BootedUDID(ctx)
if udid != "" {
t.Errorf("expected empty UDID on canceled context, got %q", udid)
}
}