Skip to content

Amiga port test status

Simon Dick edited this page Jun 21, 2026 · 14 revisions

Amiga port — test status

At-a-glance status of every test that covers the AmigaOS port. The full runbook (how to run each path, setup, gotchas) is on Amiga port testing; the per-phase design log is on Amiga port design. Snapshot date: 2026-06-20 (standard variant unless noted).

Legend: ✅ passes · ◐ runs and passes, but part of the surface is gated/stubbed on this host so full coverage needs the other path · ✗ fails · — not applicable.

Port-local smoke tests (tests/ports/amiga/)

33 targeted smoke tests. All pass under vamos on the standard variant; the ◐ rows run cleanly but only fully exercise their live surface on Amiberry / real hardware (the test files accept either the vamos-stub or live-success path, so the same file is portable to the Amiberry rig).

Native / viper emitter

Test Covers vamos Amiberry
test_native_nlr_smoke.py Phase 12a — try/except/with in native mode (register NLR)
test_native_nested_smoke.py Phase 12b — nested def / closure / generator (big-endian prelude index)
test_viper_shift_smoke.py Phase 12c — viper long shifts (LSL.L/LSR.L/ASR.L)
test_native_emitter_smoke.py MOVEQ destination-register regression (asm68k.h)

Core runtime / port internals

Test Covers vamos Amiberry
test_floatconv_smoke.py floatconv.c libgcc / libm wraps + NaN comparison
test_mem_smoke.py alloc_vec/free_vec, peek_*/poke_*, big-endian order, MEMF_*
test_library_proxy_smoke.py Phase 17 — amiga.Library + .fd trampoline (lib_open/lib_call/lib_close)
test_vfs_smoke.py VfsAmiga file I/O (open/read/write/seek/listdir/stat/rename/mkdir/chdir/errors)
test_stdio_smoke.py sys.stdin/stdout/stderr — fd numbers, write guards, TextIOWrapper
test_json_smoke.py Port-local modjson — primitives/composites/escapes/round-trip
test_history_smoke.py Phase 24 — REPL history ring (readline_history/readline_push_history)
test_time_monotonic_smoke.py time.ticks_* / ticks_add / ticks_diff / sleep_ms / sleep_us
test_amiga_introspection_smoke.py os_version/heap_info/exists/volumes/assigns/disk_info/match/imatch
test_signal_smoke.py Phase 25 — signal/wait_signal + SIGBREAKF_CTRL_*
test_amiga_execute_smoke.py amiga.execute (dos.library SystemTagList())
test_workbench_smoke.py Phase 19 — launched_from_workbench/wb_selected_files/tooltype

test_signal_smoke ◐: vamos doesn't deliver Signal/Wait to the same task. test_amiga_execute_smoke ◐ / test_workbench_smoke ◐: vamos has no live SystemTagList command run / no icon.library + Workbench state.

AmigaOS API wrappers

Test Covers vamos Amiberry
test_intuition_smoke.py Phase 30 — intuition requesters (arg-shape; modal dialog needs a screen)
test_asl_smoke.py Phase 31 — asl.file_request (arg-shape + multi+save guard; dialog needs HW)
test_rexx_polish.py Phase 32 — rexx_exists/rexx_list/RexxClient (live host needs a peer)
test_platform_smoke.py Phase 33 — platform.* + amiga.* accessors (chipset/amiga_info need graphics.library)
test_os_smoke.py Phase 34 — frozen os.py/_ospath.py, chmod/getprotect/makedirs/walk
test_os_envvar_smoke.py Phase 20 — os.getenv/putenv/unsetenvENV: + chmod round-trip
test_icon_smoke.py Phase 35 — _icon registration, WB*, error paths, new→write→read round trip
test_catalog_smoke.py Phase 36 — _catalog registration, language(), error paths, lookup round trip

here: vamos stubs intuition/asl (no real screen), lacks graphics.library, partially stubs SetProtection, and has no real icon.library / locale.library so the round-trip blocks soft-pass.

Networking & TLS

Test Covers vamos Amiberry
test_socket_smoke.py socket surface (constants; live I/O needs bsdsocket.library)
test_select_smoke.py select.poll() surface + live WaitSelect-backed readiness / POLLNVAL over a socket
test_ssl_smoke.py ssl.SSLContext surface (constants; live handshake needs AmiSSL)
test_urequests_smoke.py Frozen urequests_parse_url/_quote/_urlencode/verbs/Response (live fetch needs HW)
test_asyncio_smoke.py asyncio event loop — tasks/sleep/gather/Event/Lock/wait_for (vamos has no advancing clock, so the loop only runs live)

extmod opt-ins (Phase 39)

Test Covers vamos Amiberry
test_time_wallclock_smoke.py Step 1 — time.time/time_ns/gmtime/localtime/mktime (vamos: static surface only, no GetSysTime)
test_hashlib_smoke.py Step 2 — hashlib.md5/sha1/sha256 against canonical vectors
test_deflate_compress_smoke.py Step 3 — deflate.DeflateIO compress (RAW/ZLIB/GZIP round trip)
test_btree_smoke.py Step 4 — btree persistent K/V over a stream

One Amiga surface still lacks a targeted smoke test: Ctrl+C interrupt polling (amiga_check_ctrl_c, VM hook every 1024 bytecodes) — vamos doesn't deliver a signal to the same task, so it can only be verified on Amiberry / real hardware. It's exercised implicitly by every long-running test.

Upstream suite (vamos, standard)

Per-directory snapshot, driven through tools/amiga-vamos-run.sh (per-directory breakdown 2026-06-02; micropython/ re-run 2026-06-20 after the Phase 12 emitter completion):

Directory Files Pass Self-skip Fail Failing tests are…
basics/ 574 490 83 1 struct1.py (m68k ABI)
float/ 68 54 11 3 long-double EXACT-mode precision
io/ 16 15 1 0
import/ 30 30 0 0 import_file.py fixed 2026-06-20
micropython/ 108 85 18 5 viper ptr16/ptr32 byte-order (platform diff)
extmod/ 192 76 102 13 see genuine-gaps table — most are vamos artifacts
misc/ 14 6 8 0
cmdline/ 27 9 2 14 Unix-port-specific (REPL banner, -v, PTY)
stress/ 13 12 0 1 bytecode_limit.py (parser memory)

Latest full re-run (2026-06-20, dirs basics float io import micropython extmod misc stress): 752 pass / 40 fail / 223 self-skip, no regressions — every failure is a category below. Excluding platform differences, vamos emulation gaps, and Unix-port-only cmdline tests, 4 individual tests fail as real platform differences.

The native + viper emitter is functionally complete (Phase 12a/12b/12c

  • the MOVEQ fix): every native_* / viper_* test passes except the five viper ptr16/ptr32 boundary tests, which are big-endian vs little-endian-.exp differences.

Remaining real-hardware failures

Verified on Amiberry 2026-06-20 — these still fail against real Kickstart (not vamos artifacts):

Genuine port gaps (TODO)

Test(s) Cause Next step
extmod/vfs_userfs.py Test mounts a Python VFS at /, colliding with the built-in VfsAmiga Skip for this port (pragmatic), or allow runtime unmount of root
extmod/platform_basic.py sys.platform == "amiga" not in the test's expected list Upstream "amiga" into extmod/modplatform.c, or carry a downstream .exp

Environmental / not a port bug

Test(s) Cause
extmod/socket_tcp_basic.py Needs a routable TCP path from the Amiga to the host test server; neither the serial bridge nor vamos provides one (passes against a reachable server)
stress/bytecode_limit.py Parser memory pressure at the bytecode-size edge

Platform differences (won't fix)

Both sides are correct; the .exp expects CPython-on-x86 / full-precision IEEE rather than the AmigaOS m68k ABI + bebbo soft-float.

Test(s) Cause
basics/struct1.py struct.calcsize("97sI") = 102 (m68k 2-byte int alignment) vs 104 (x86)
float/float_parse*.py, float_format_accuracy.py, inf_nan_arith.py bebbo 80-bit long-double soft-float loses 1–2 ULP; repr round-trip ~72%; a nan/inf sign quirk in min/max
micropython/viper_ptr16_load*.py, viper_ptr16_store_boundary.py, viper_ptr32_load_boundary.py, viper_ptr32_store_boundary.py Raw ptr16/ptr32 access uses native byte order — m68k big-endian vs little-endian .exp

Recently fixed (2026-06-21)

The full upstream extmod/ssl_* suite now passes on real Amiberry (AmiSSL v5). See Phase 28 follow-ups.

Was failing Fix
extmod/ssl_basic.py, ssl_ioctl.py, ssl_keycert.py Module-level ssl.wrap_socket(...), load_cert_chain, server_side, and a memory-BIO stream transport in modssl.c
extmod/ssl_cadata.py In-memory cadata loading (load_verify_locations)
extmod/ssl_poll.py Non-blocking, poll-driven BIO-pair stream path (poll_mask/last_error/SSL_pending); single-write flights; SSL_write flush; security level 0 for the 1024-bit test key
extmod/ssl_sslcontext_verify_mode2.py Exposed ssl.OPENSSL_VERSION so the test runs instead of skipping
extmod/ssl_keycert_pkcs8.py Now skips cleanly (mbedTLS-only PKCS#8 gate)
extmod/select_poll_basic.py, select_ipoll.py select.poll()/select() over bsdsocket: socket MP_STREAM_POLL ioctl backed by a zero-timeout WaitSelect() (modsocket.c); MICROPY_INTERNAL_WFE sleeps in short slices so idle poll-waits don't busy-spin (mphalport.c)
asyncio (was disabled) Enabled MICROPY_PY_ASYNCIO + MICROPY_ENABLE_SCHEDULER, froze the asyncio package. Event loop runs off time.ticks_* + select.poll().ipoll(). Verified live on Amiberry: core loop (test_asyncio_smoke) and asyncio.open_connection plain-TCP HTTP GET (HTTP/1.1 200 OK).
asyncio over TLS SSLContext.wrap_socket(do_handshake_on_connect=False) now routes non-blocking clients through the memory-BIO stream path (poll-aware) instead of the fd path, so a TLS SSLSocket is pollable. Verified live: asyncio.open_connection(host, 443, ssl=True) HTTPS GET to www.python.org (52 KB) and example.com (HTTP/1.1 200 OK).
urequests HTTPS hardened Removed the SSL_set_fd fd path — every TLS socket uses the one BIO stream transport. urequests also reuses one module-level SSLContext and closes the socket on any failure (no leak). CERT_REQUIRED GETs to www.python.org are reliable, single and repeated in one process. A residual issue is server-side: some servers complete the handshake then reset the exchange (EIO); the socket close lets the next request recover, not yet 100% — AmiSSL notes.

Recently fixed (2026-06-20)

Was failing Fix
micropython/native_try/native_try_deep/native_with Phase 12a register NLR (nlr68k.S)
micropython/native_const/native_closure/native_gen Phase 12b big-endian prelude-index byte-swap (emitnative.c)
micropython/viper_binop_arith + 5 more Phase 12c long-size shift opcodes (asm68k.h)
extmod/time_res.py FPU FPCR rounding-precision reset at startup (amiga_fpu_fix_rounding() in main.c)
import/import_file.py Keep sys.path[0] relative ("") for a basename script
extmod/socket_*, ssl_sslcontext*, time_ms_us, time_time_ns Were vamos artifacts — pass on real Amiberry

Clone this wiki locally