https://github.com/python/cpython/commit/99088ab081279329b8362e1c24533fa0be303e6f
commit: 99088ab081279329b8362e1c24533fa0be303e6f
branch: main
author: Russell Keith-Magee <russ...@keith-magee.com>
committer: freakboy3742 <russ...@keith-magee.com>
date: 2025-02-25T14:49:05+08:00
summary:

gh-130292: Allow for empty simulator list when running iOS testbed (#130388)

Adds error handling when there are no pre-existing test simulators.

files:
A Misc/NEWS.d/next/Tests/2025-02-20-13-50-07.gh-issue-130292.RvK2Ou.rst
M iOS/testbed/__main__.py

diff --git 
a/Misc/NEWS.d/next/Tests/2025-02-20-13-50-07.gh-issue-130292.RvK2Ou.rst 
b/Misc/NEWS.d/next/Tests/2025-02-20-13-50-07.gh-issue-130292.RvK2Ou.rst
new file mode 100644
index 00000000000000..0805058544abac
--- /dev/null
+++ b/Misc/NEWS.d/next/Tests/2025-02-20-13-50-07.gh-issue-130292.RvK2Ou.rst
@@ -0,0 +1,2 @@
+The iOS testbed will now run successfully on a machine that has not
+previously run Xcode tests (such as CI configurations).
diff --git a/iOS/testbed/__main__.py b/iOS/testbed/__main__.py
index 08fbe90a1c6aef..d12a5ab065b517 100644
--- a/iOS/testbed/__main__.py
+++ b/iOS/testbed/__main__.py
@@ -82,19 +82,29 @@ async def async_check_output(*args, **kwargs):
 
 # Return a list of UDIDs associated with booted simulators
 async def list_devices():
-    # List the testing simulators, in JSON format
-    raw_json = await async_check_output(
-        "xcrun", "simctl", "--set", "testing", "list", "-j"
-    )
-    json_data = json.loads(raw_json)
-
-    # Filter out the booted iOS simulators
-    return [
-        simulator["udid"]
-        for runtime, simulators in json_data["devices"].items()
-        for simulator in simulators
-        if runtime.split(".")[-1].startswith("iOS") and simulator["state"] == 
"Booted"
-    ]
+    try:
+        # List the testing simulators, in JSON format
+        raw_json = await async_check_output(
+            "xcrun", "simctl", "--set", "testing", "list", "-j"
+        )
+        json_data = json.loads(raw_json)
+
+        # Filter out the booted iOS simulators
+        return [
+            simulator["udid"]
+            for runtime, simulators in json_data["devices"].items()
+            for simulator in simulators
+            if runtime.split(".")[-1].startswith("iOS") and simulator["state"] 
== "Booted"
+        ]
+    except subprocess.CalledProcessError as e:
+        # If there's no ~/Library/Developer/XCTestDevices folder (which is the
+        # case on fresh installs, and in some CI environments), `simctl list`
+        # returns error code 1, rather than an empty list. Handle that case,
+        # but raise all other errors.
+        if e.returncode == 1:
+            return []
+        else:
+            raise
 
 
 async def find_device(initial_devices):

_______________________________________________
Python-checkins mailing list -- python-checkins@python.org
To unsubscribe send an email to python-checkins-le...@python.org
https://mail.python.org/mailman3/lists/python-checkins.python.org/
Member address: arch...@mail-archive.com

Reply via email to