$ python Apple test iOS
+This test will attempt to find an "SE-class" simulator (i.e., an iPhone SE, or
+iPhone 16e, or similar), and run the test suite on the most recent version of
+iOS that is available. You can specify a simulator using the `--simulator`
+command line argument, providing the name of the simulator (e.g., `--simulator
+'iPhone 16 Pro'`). You can also use this argument to control the OS version used
+for testing; `--simulator 'iPhone 16 Pro,OS=18.2'` would attempt to run the
+tests on an iPhone 16 Pro running iOS 18.2.
+
+If the test runner is executed on GitHub Actions, the `GITHUB_ACTIONS`
+environment variable will be exposed to the iOS process at runtime.
+
### Testing a single-architecture framework
The `Apple/testbed` folder that contains an Xcode project that is able to run
setenv("NO_COLOR", "1", true);
setenv("PYTHON_COLORS", "0", true);
+ if (getenv("GITHUB_ACTIONS")) {
+ NSLog(@"Running in a GitHub Actions environment");
+ }
// Arguments to pass into the test suite runner.
// argv[0] must identify the process; any subsequent arg
// will be handled as if it were an argument to `python -m test`
import argparse
import json
+import os
import re
import shutil
import subprocess
check=True,
)
+ # Any environment variable prefixed with TEST_RUNNER_ is exposed into the
+ # test runner environment. There are some variables (like those identifying
+ # CI platforms) that can be useful to have access to.
+ test_env = os.environ.copy()
+ if "GITHUB_ACTIONS" in os.environ:
+ test_env["TEST_RUNNER_GITHUB_ACTIONS"] = os.environ["GITHUB_ACTIONS"]
+
print("Running test project...")
# Test execution *can't* be run -quiet; verbose mode
# is how we see the output of the test output.
["xcodebuild", "test-without-building"] + args,
stdout=subprocess.PIPE,
stderr=subprocess.STDOUT,
+ env=test_env,
)
while line := (process.stdout.readline()).decode(*DECODE_ARGS):
# Strip the timestamp/process prefix from each log line
"BrokenIter",
"in_systemd_nspawn_sync_suppressed",
"run_no_yield_async_fn", "run_yielding_async_fn", "async_yield",
- "reset_code",
+ "reset_code", "on_github_actions"
]
f.__code__ = f.__code__.replace()
return f
+on_github_actions = "GITHUB_ACTIONS" in os.environ
#=======================================================================
# Check for the presence of docstrings.
self.dgram_examine)
@requires_unix_sockets
+ @unittest.skipIf(test.support.is_apple_mobile and test.support.on_github_actions,
+ "gh-140702: Test fails regularly on iOS simulator on GitHub Actions")
def test_UnixDatagramServer(self):
self.run_server(socketserver.UnixDatagramServer,
socketserver.DatagramRequestHandler,
self.dgram_examine)
@requires_unix_sockets
+ @unittest.skipIf(test.support.is_apple_mobile and test.support.on_github_actions,
+ "gh-140702: Test fails regularly on iOS simulator on GitHub Actions")
def test_ThreadingUnixDatagramServer(self):
self.run_server(socketserver.ThreadingUnixDatagramServer,
socketserver.DatagramRequestHandler,
--- /dev/null
+The iOS testbed app will now expose the ``GITHUB_ACTIONS`` environment
+variable to iOS apps being tested.