219 parser = argparse.ArgumentParser(description=__doc__)
220 parser.add_argument("--release", action="store_true", help="Build Release instead of Debug")
221 parser.add_argument("--seconds", type=float, default=3.0, help="GUI observation time")
222 parser.add_argument("--shutdown-timeout", type=float, default=3.0)
223 group = parser.add_mutually_exclusive_group()
224 group.add_argument("--internal-only", action="store_true")
225 group.add_argument("--external-only", action="store_true")
226 group.add_argument("--sdk-only", action="store_true")
227 parser.add_argument("--sdk-archive", help="Explicit path to packaged SDK .tar.gz")
228 parser.add_argument("--skip-sdk", action="store_true", help="Run developer-mode tests only")
229 args = parser.parse_args()
230 if os.name != "posix" or not (sys.platform == "linux" or sys.platform.startswith("freebsd")):
231 parser.error("This test supports Linux and FreeBSD only")
232 if args.seconds <= 0 or args.shutdown_timeout <= 0:
233 parser.error("Timeouts must be positive")
234 if args.sdk_only and args.skip_sdk:
235 parser.error("--sdk-only and --skip-sdk cannot be combined")
236
237 build_type = "Release" if args.release else "Debug"
238 build_flag = "--release" if args.release else "--debug"
239 results = []
240
241 def execute(name, test):
242 print(f"\n=== {name} ===", flush=True)
243 try:
244 reason = test()
245 status = "PASS"
246 except (OSError, RuntimeError, tarfile.TarError) as exc:
247 status, reason = "FAIL", str(exc)
248 results.append((name, status, reason))
249 print(f"{status}: {name}: {reason}", flush=True)
250
251 print(f"Rendering Engine root: {ROOT}")
252 print(f"Build configuration: {build_type}")
253 print("Prerequisite: the engine and SDK archive are already built.", flush=True)
254
255 if not args.sdk_only and not args.external_only:
256 execute("Internal project creation", lambda: test_internal(
257 build_type, build_flag, args.seconds, args.shutdown_timeout))
258 if not args.sdk_only and not args.internal_only:
259 execute("External project creation", lambda: test_external(
260 build_type, build_flag, args.seconds, args.shutdown_timeout))
261
262 if not (args.skip_sdk or args.internal_only or args.external_only):
263 try:
264 archive = discover_archive(args.sdk_archive)
265 print(f"SDK archive: {archive}", flush=True)
266
267 with tempfile.TemporaryDirectory(prefix="sdk-workflow-", dir=ROOT / "Build") as temp:
268 workspace = Path(temp)
269 sdk = extract_sdk(archive, workspace)
270 print(f"Extracted SDK: {sdk}", flush=True)
271 execute("SDK project creation", lambda: test_sdk_created(
272 sdk, workspace, build_type, build_flag, args.seconds, args.shutdown_timeout))
273 execute("SDK registration", lambda: test_sdk_registered(
274 sdk, workspace, build_type, build_flag, args.seconds, args.shutdown_timeout))
275 except (OSError, RuntimeError, tarfile.TarError, ValueError) as exc:
276 execute("SDK preparation", lambda: (_ for _ in ()).throw(RuntimeError(str(exc))))
277
278 print("\n=== Summary ===")
279 for name, status, reason in results:
280 print(f"{status:4} {name}: {reason}")
281 passed = sum(status == "PASS" for _, status, _ in results)
282 print(f"Passed {passed}/{len(results)}")
283 return 0 if passed == len(results) else 1
284
285
int main(int argc, char *argv[])