diff --git a/.gitignore b/.gitignore index 0fb0445a..3b20eadb 100644 --- a/.gitignore +++ b/.gitignore @@ -15,5 +15,7 @@ support/* wheels/* *.dist-info __pycache__ -tests/testbed/macOS -tests/testbed/iOS +testbed/build +testbed/logs +testbed/dist +venv* diff --git a/testbed/README.rst b/testbed/README.rst new file mode 100644 index 00000000..2cb27770 --- /dev/null +++ b/testbed/README.rst @@ -0,0 +1,14 @@ +Python Testbed +============== + +A testbed to run the CPython test suite. + +The test suite can be run with `Briefcase `__: + +* **macOS** `briefcase run --test` +* **iOS** `briefcase run iOS --test` + +You can also pass in any command line arguments that the Python test suite honors: e.g., + +* **macOS** `briefcase run --test -- -u all,-largefile,-audio,-gui test_builtin` +* **iOS** `briefcase run iOS --test -- -u all,-largefile,-audio,-gui test_builtin` diff --git a/testbed/pyproject.toml b/testbed/pyproject.toml new file mode 100644 index 00000000..4bc14ec3 --- /dev/null +++ b/testbed/pyproject.toml @@ -0,0 +1,58 @@ +# This project was generated with Unknown using template: https://github.com/beeware/briefcase-template@v0.3.15 +[tool.briefcase] +project_name = "Python Testbed" +bundle = "org.python" +version = "0.0.1" +url = "https://python.org/testbed" +license = "BSD license" +author = "Jane Developer" +author_email = "jane@python.org" + +[tool.briefcase.app.testbed] +formal_name = "Python Testbed" +description = "The CPython test suite" +long_description = """More details about the app should go here. +""" +icon = "src/testbed/resources/testbed" +sources = [ + "src/testbed", +] +test_sources = [ + "tests", +] + +requires = [] +test_requires = [] + +[tool.briefcase.app.testbed.macOS] +requires = [ + "std-nslog~=1.0.0" +] +support_package = "../dist/Python-3.11-macOS-support.test-custom.tar.gz" + +# Mobile deployments +[tool.briefcase.app.testbed.iOS] +requires = [ + "rubicon-objc~=0.4.6", + "std-nslog~=1.0.0", +] +support_package = "../dist/Python-3.11-iOS-support.test-custom.tar.gz" + +[tool.briefcase.app.testbed.android] +sources = [ + # "../path/to/python-src/Lib/test" +] +requires = [ +] +# Is this needed? +# build_gradle_extra_content = "android.defaultConfig.python.extractPackages 'test'" + +# Unsupported deployments +[tool.briefcase.app.testbed.linux] +supported = false + +[tool.briefcase.app.testbed.windows] +supported = false + +[tool.briefcase.app.testbed.web] +supported = false diff --git a/testbed/src/testbed/__init__.py b/testbed/src/testbed/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/testbed/src/testbed/__main__.py b/testbed/src/testbed/__main__.py new file mode 100644 index 00000000..00c3da21 --- /dev/null +++ b/testbed/src/testbed/__main__.py @@ -0,0 +1,4 @@ +from testbed.app import main + +if __name__ == "__main__": + main() diff --git a/testbed/src/testbed/android.py b/testbed/src/testbed/android.py new file mode 100644 index 00000000..d2f47adb --- /dev/null +++ b/testbed/src/testbed/android.py @@ -0,0 +1,28 @@ +###################################################################### +# Android App main loop +# +# The main loop itself is a no-op; however we need a PythonAppDelegate +# to satisfy the app stub. +####################################################################### +from rubicon.java import JavaClass, JavaInterface + +# The Android cookiecutter template creates an app whose main Activity is +# called `MainActivity`. The activity assumes that we will store a reference +# to an implementation/subclass of `IPythonApp` in it. +MainActivity = JavaClass("org/beeware/android/MainActivity") + +# The `IPythonApp` interface in Java allows Python code to +# run on Android activity lifecycle hooks such as `onCreate()`. +IPythonApp = JavaInterface("org/beeware/android/IPythonApp") + + +class PythonApp(IPythonApp): + def __init__(self, app): + super().__init__() + self._impl = app + MainActivity.setPythonApp(self) + print("Python app launched & stored in Android Activity class") + + +def main_loop(): + pass diff --git a/testbed/src/testbed/app.py b/testbed/src/testbed/app.py new file mode 100644 index 00000000..dcd28b37 --- /dev/null +++ b/testbed/src/testbed/app.py @@ -0,0 +1,20 @@ +import importlib +import platform +import sys + + +def main(): + print("=" * 80) + print(f"Python {platform.python_version()} Verification Suite") + print(f"Running on {platform.platform()}") + print("=" * 80) + + # Load the platform module + if hasattr(sys, "getandroidapilevel"): + module_path = ".android" + else: + module_path = f".{sys.platform}" + platform_module = importlib.import_module(module_path, "testbed") + + # Run the main_loop() for the platform + platform_module.main_loop() diff --git a/testbed/src/testbed/darwin.py b/testbed/src/testbed/darwin.py new file mode 100644 index 00000000..91232980 --- /dev/null +++ b/testbed/src/testbed/darwin.py @@ -0,0 +1,6 @@ +###################################################################### +# macOS App main loop +####################################################################### + +def main_loop(): + print("Did you forget to use --test?") diff --git a/testbed/src/testbed/ios.py b/testbed/src/testbed/ios.py new file mode 100644 index 00000000..cbc91c9a --- /dev/null +++ b/testbed/src/testbed/ios.py @@ -0,0 +1,17 @@ +###################################################################### +# iOS App main loop +# +# The main loop itself is a no-op; however we need a PythonAppDelegate +# to satisfy the app stub. +####################################################################### +from rubicon.objc import ObjCClass + +UIResponder = ObjCClass("UIResponder") + + +class PythonAppDelegate(UIResponder): + pass + + +def main_loop(): + print("Python app launched") diff --git a/testbed/src/testbed/resources/__init__.py b/testbed/src/testbed/resources/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/testbed/src/testbed/resources/testbed-1024.png b/testbed/src/testbed/resources/testbed-1024.png new file mode 100644 index 00000000..b4510ed8 Binary files /dev/null and b/testbed/src/testbed/resources/testbed-1024.png differ diff --git a/testbed/src/testbed/resources/testbed-120.png b/testbed/src/testbed/resources/testbed-120.png new file mode 100644 index 00000000..0ef25c17 Binary files /dev/null and b/testbed/src/testbed/resources/testbed-120.png differ diff --git a/testbed/src/testbed/resources/testbed-128.png b/testbed/src/testbed/resources/testbed-128.png new file mode 100644 index 00000000..6d6ebf6c Binary files /dev/null and b/testbed/src/testbed/resources/testbed-128.png differ diff --git a/testbed/src/testbed/resources/testbed-152.png b/testbed/src/testbed/resources/testbed-152.png new file mode 100644 index 00000000..4ea9b2f9 Binary files /dev/null and b/testbed/src/testbed/resources/testbed-152.png differ diff --git a/testbed/src/testbed/resources/testbed-16.png b/testbed/src/testbed/resources/testbed-16.png new file mode 100644 index 00000000..335d9f3f Binary files /dev/null and b/testbed/src/testbed/resources/testbed-16.png differ diff --git a/testbed/src/testbed/resources/testbed-167.png b/testbed/src/testbed/resources/testbed-167.png new file mode 100644 index 00000000..79765634 Binary files /dev/null and b/testbed/src/testbed/resources/testbed-167.png differ diff --git a/testbed/src/testbed/resources/testbed-180.png b/testbed/src/testbed/resources/testbed-180.png new file mode 100644 index 00000000..08f585b1 Binary files /dev/null and b/testbed/src/testbed/resources/testbed-180.png differ diff --git a/testbed/src/testbed/resources/testbed-20.png b/testbed/src/testbed/resources/testbed-20.png new file mode 100644 index 00000000..119c2ad3 Binary files /dev/null and b/testbed/src/testbed/resources/testbed-20.png differ diff --git a/testbed/src/testbed/resources/testbed-256.ico b/testbed/src/testbed/resources/testbed-256.ico new file mode 100644 index 00000000..9b214508 Binary files /dev/null and b/testbed/src/testbed/resources/testbed-256.ico differ diff --git a/testbed/src/testbed/resources/testbed-256.png b/testbed/src/testbed/resources/testbed-256.png new file mode 100644 index 00000000..f7c65f1c Binary files /dev/null and b/testbed/src/testbed/resources/testbed-256.png differ diff --git a/testbed/src/testbed/resources/testbed-29.png b/testbed/src/testbed/resources/testbed-29.png new file mode 100644 index 00000000..333f4fd6 Binary files /dev/null and b/testbed/src/testbed/resources/testbed-29.png differ diff --git a/testbed/src/testbed/resources/testbed-32.png b/testbed/src/testbed/resources/testbed-32.png new file mode 100644 index 00000000..203b237a Binary files /dev/null and b/testbed/src/testbed/resources/testbed-32.png differ diff --git a/testbed/src/testbed/resources/testbed-40.png b/testbed/src/testbed/resources/testbed-40.png new file mode 100644 index 00000000..9608273a Binary files /dev/null and b/testbed/src/testbed/resources/testbed-40.png differ diff --git a/testbed/src/testbed/resources/testbed-512.png b/testbed/src/testbed/resources/testbed-512.png new file mode 100644 index 00000000..6cb4b19d Binary files /dev/null and b/testbed/src/testbed/resources/testbed-512.png differ diff --git a/testbed/src/testbed/resources/testbed-58.png b/testbed/src/testbed/resources/testbed-58.png new file mode 100644 index 00000000..456859fc Binary files /dev/null and b/testbed/src/testbed/resources/testbed-58.png differ diff --git a/testbed/src/testbed/resources/testbed-60.png b/testbed/src/testbed/resources/testbed-60.png new file mode 100644 index 00000000..b041aa96 Binary files /dev/null and b/testbed/src/testbed/resources/testbed-60.png differ diff --git a/testbed/src/testbed/resources/testbed-64.png b/testbed/src/testbed/resources/testbed-64.png new file mode 100644 index 00000000..8a80c3c3 Binary files /dev/null and b/testbed/src/testbed/resources/testbed-64.png differ diff --git a/testbed/src/testbed/resources/testbed-76.png b/testbed/src/testbed/resources/testbed-76.png new file mode 100644 index 00000000..63d12d72 Binary files /dev/null and b/testbed/src/testbed/resources/testbed-76.png differ diff --git a/testbed/src/testbed/resources/testbed-80.png b/testbed/src/testbed/resources/testbed-80.png new file mode 100644 index 00000000..82d8cb9f Binary files /dev/null and b/testbed/src/testbed/resources/testbed-80.png differ diff --git a/testbed/src/testbed/resources/testbed-87.png b/testbed/src/testbed/resources/testbed-87.png new file mode 100644 index 00000000..d4c92fe4 Binary files /dev/null and b/testbed/src/testbed/resources/testbed-87.png differ diff --git a/testbed/src/testbed/resources/testbed.icns b/testbed/src/testbed/resources/testbed.icns new file mode 100644 index 00000000..4979fc8f Binary files /dev/null and b/testbed/src/testbed/resources/testbed.icns differ diff --git a/testbed/tests/__init__.py b/testbed/tests/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/testbed/tests/testbed.py b/testbed/tests/testbed.py new file mode 100644 index 00000000..d97964bf --- /dev/null +++ b/testbed/tests/testbed.py @@ -0,0 +1,28 @@ +import os +from pathlib import Path + +from test.libregrtest import main +import faulthandler + + +def run_tests(): + project_path = Path(__file__).parent.parent + os.chdir(project_path) + + # Install a dummy traceback handler. + # faulthandler tries to use fileno on sys.stderr, which doesn't work on iOS + # because sys.stderr has been redirected to NSLog. + def dump_traceback_later(*args, **kwargs): + pass + + faulthandler.dump_traceback_later = dump_traceback_later + + try: + main() + except SystemExit as e: + returncode = e.code + print(f">>>>>>>>>> EXIT {returncode} <<<<<<<<<<") + + +if __name__ == "__main__": + run_tests()