#!/usr/bin/env python3 """Run the Maestro groups assigned to each CI emulator.""" from __future__ import annotations import argparse from collections.abc import Sequence import run_maestro ANDROID_15_INSTRUMENTATION_CLASSES = ( "androidx.media3.decoder.ffmpeg.PlezyFfmpegPlaybackTest," "com.edde746.plezy.exoplayer.PlezyAudioModePlaybackTest" ) GROUPS: dict[str, tuple[tuple[str, ...], ...]] = { "android-15": ( ("basic",), ("catalog",), ("media",), ( "basic", "--flow", ".maestro/regression_flows/03_tv_library_focus.yaml", "--jellyfin-log", "build/maestro-tv/library-focus.log", "--diagnostics-dir", "build/maestro-tv/library-focus-diagnostics", ), ( "basic", "--flow", ".maestro/regression_flows/04_tv_player_keys.yaml", "--jellyfin-log", "build/maestro-tv/player-keys.log", "--diagnostics-dir", "build/maestro-tv/player-keys-diagnostics", ), ( "basic", "--flow", ".maestro/regression_flows/05_tv_next_episode_back.yaml", "--jellyfin-log", "build/maestro-tv/next-episode.log", "--diagnostics-dir", "build/maestro-tv/next-episode-diagnostics", ), ( "basic", "--fault", "music-failure", "--flow", ".maestro/real_flows/02_music_browse.yaml", "--jellyfin-log", "build/maestro-recovery/music-jellyfin.log", "--proxy-journal", "build/maestro-recovery/music-proxy-journal.jsonl", "--diagnostics-dir", "build/maestro-recovery/music-diagnostics", ), ( "basic", "--fault", "offline", "--flow", ".maestro/flows/09_download_offline_playback.yaml", "--jellyfin-log", "build/maestro-offline/jellyfin.log", "--proxy-log", "build/maestro-offline/jellyfin-proxy.log", "--proxy-journal", "build/maestro-offline/proxy-journal.jsonl", "--diagnostics-dir", "build/maestro-offline/diagnostics", ), ( "basic", "--fault", "recovery", "--flow", ".maestro/regression_flows/06_playback_recovery.yaml", "--jellyfin-log", "build/maestro-recovery/jellyfin.log", "--proxy-journal", "build/maestro-recovery/proxy-journal.jsonl", "--diagnostics-dir", "build/maestro-recovery/diagnostics", ), ), "android-9": ( ( "basic", "--flow", ".maestro/flows/05_playback.yaml", "--jellyfin-log", "build/maestro-legacy/jellyfin.log", "--diagnostics-dir", "build/maestro-legacy/diagnostics", ), ), } def run_android_15_instrumentation() -> None: print("==> Android 15 filtered instrumentation", flush=True) run_maestro._run_checked( ( "android/gradlew", "-p", "android", ":app:connectedDebugAndroidTest", "-x", ":app:compileFlutterBuildDebug", f"-Pandroid.testInstrumentationRunnerArguments.class={ANDROID_15_INSTRUMENTATION_CLASSES}", ) ) def run_group(name: str) -> int: if name == "android-15": run_android_15_instrumentation() failed = False for arguments in GROUPS[name]: print(f"==> Maestro {' '.join(arguments)}", flush=True) exit_status = run_maestro.main(arguments) if exit_status >= 128: return exit_status failed = failed or exit_status != 0 return 1 if failed else 0 def main(argv: Sequence[str] | None = None) -> int: parser = argparse.ArgumentParser(description=__doc__) parser.add_argument("group", choices=GROUPS) args = parser.parse_args(argv) return run_group(args.group) if __name__ == "__main__": raise SystemExit(main())