| 1 | #!/usr/bin/env python3 |
| 2 | """Exercise the real SwiftUI window on a logged-in Mac using only a local fixture.""" |
| 3 | import http.server |
| 4 | import json |
| 5 | import os |
| 6 | from pathlib import Path |
| 7 | import subprocess |
| 8 | import sys |
| 9 | import threading |
| 10 | import time |
| 11 | |
| 12 | root = Path(__file__).resolve().parents[2] |
| 13 | fixture_name = os.environ.get("DOCS_SMOKE_FIXTURE", "letter") |
| 14 | assert fixture_name in {"letter", "documentation"} |
| 15 | fixture = Path(os.environ["DOCS_SMOKE_UPDATE"]).read_bytes() if "DOCS_SMOKE_UPDATE" in os.environ else (root / "internal/docs/seeddata" / (fixture_name + ".update.bin")).read_bytes() |
| 16 | |
| 17 | draft = os.environ.get("DOCS_SMOKE_DRAFT") == "1" |
| 18 | |
| 19 | class Handler(http.server.BaseHTTPRequestHandler): |
| 20 | def do_GET(self): |
| 21 | if self.path.endswith("/stream"): |
| 22 | self.send_response(200) |
| 23 | self.send_header("Content-Type", "text/event-stream") |
| 24 | self.end_headers() |
| 25 | self.wfile.write(b"data: 0\n\n") |
| 26 | self.wfile.flush() |
| 27 | time.sleep(20) |
| 28 | return |
| 29 | if "/updates" in self.path: |
| 30 | data = b"" if draft else fixture |
| 31 | else: |
| 32 | time.sleep(0.3) # Include loading -> editor layout transition. |
| 33 | data = json.dumps(dict(sqid="fixture", title="Window smoke fixture", guid="window-smoke", |
| 34 | can_write=True, can_share=False)).encode() |
| 35 | self.send_response(200) |
| 36 | self.send_header("Docs-Seq", "0") |
| 37 | self.send_header("Content-Length", str(len(data))) |
| 38 | self.end_headers() |
| 39 | self.wfile.write(data) |
| 40 | |
| 41 | def do_POST(self): |
| 42 | self.rfile.read(int(self.headers.get("Content-Length", "0"))) |
| 43 | if self.path == "/documents": |
| 44 | time.sleep(2) |
| 45 | data = json.dumps(dict(sqid="fixture", title="Window smoke fixture")).encode() |
| 46 | self.send_response(201); self.send_header("Content-Length", str(len(data))); self.end_headers(); self.wfile.write(data) |
| 47 | else: |
| 48 | self.send_response(204) |
| 49 | self.end_headers() |
| 50 | |
| 51 | def log_message(self, *_): |
| 52 | pass |
| 53 | |
| 54 | with http.server.ThreadingHTTPServer(("127.0.0.1", 0), Handler) as server: |
| 55 | threading.Thread(target=server.serve_forever, daemon=True).start() |
| 56 | env = dict(os.environ, DOCS_SMOKE_ORIGIN=f"http://127.0.0.1:{server.server_port}") |
| 57 | result = subprocess.run(["swift", "run", "--package-path", str(root / "native/smoke/document-window")], |
| 58 | env=env, timeout=180, stdout=subprocess.PIPE, text=True) |
| 59 | print(result.stdout, end="") |
| 60 | server.shutdown() |
| 61 | if result.returncode == 0 and "PASS: document loads," not in result.stdout: |
| 62 | sys.exit("Smoke process exited before completing its assertions") |
| 63 | raise SystemExit(result.returncode) |
| 64 | |