Framework Emulator Android Views test
Change-Id: I2936f59198f7a9abac411c6bb30bfdc903dbd56d
Reviewed-on: https://flutter-review.googlesource.com/c/recipes/+/16580
Commit-Queue: Gary Qian <garyq@google.com>
Reviewed-by: Casey Hillers <chillers@google.com>
Reviewed-by: Emmanuel Garcia <egarciad@google.com>
diff --git a/recipes/flutter/android_views.expected/flutter_drive_clean_exit.json b/recipes/flutter/android_views.expected/flutter_drive_clean_exit.json
new file mode 100644
index 0000000..82f57f5
--- /dev/null
+++ b/recipes/flutter/android_views.expected/flutter_drive_clean_exit.json
@@ -0,0 +1,975 @@
+[
+ {
+ "cmd": [
+ "top",
+ "-b",
+ "-n",
+ "3",
+ "-o",
+ "%MEM"
+ ],
+ "infra_step": true,
+ "name": "OS info"
+ },
+ {
+ "cmd": [
+ "vpython",
+ "-u",
+ "RECIPE_MODULE[recipe_engine::file]/resources/fileutil.py",
+ "--json-output",
+ "/path/to/tmp/json",
+ "ensure-directory",
+ "--mode",
+ "0777",
+ "[CACHE]/builder"
+ ],
+ "infra_step": true,
+ "name": "Ensure root cache"
+ },
+ {
+ "cmd": [],
+ "name": "checkout source code"
+ },
+ {
+ "cmd": [],
+ "name": "checkout source code.Checkout flutter/flutter",
+ "~followup_annotations": [
+ "@@@STEP_NEST_LEVEL@1@@@"
+ ]
+ },
+ {
+ "cmd": [
+ "python",
+ "-u",
+ "RECIPE_MODULE[depot_tools::git]/resources/git_setup.py",
+ "--path",
+ "[START_DIR]/flutter sdk",
+ "--url",
+ "https://chromium.googlesource.com/external/github.com/flutter/flutter"
+ ],
+ "name": "checkout source code.Checkout flutter/flutter.git setup",
+ "~followup_annotations": [
+ "@@@STEP_NEST_LEVEL@2@@@"
+ ]
+ },
+ {
+ "cmd": [
+ "git",
+ "fetch",
+ "origin",
+ "master",
+ "--recurse-submodules",
+ "--progress",
+ "--tags"
+ ],
+ "cwd": "[START_DIR]/flutter sdk",
+ "env": {
+ "PATH": "RECIPE_REPO[depot_tools]:<PATH>"
+ },
+ "infra_step": true,
+ "name": "checkout source code.Checkout flutter/flutter.git fetch",
+ "~followup_annotations": [
+ "@@@STEP_NEST_LEVEL@2@@@"
+ ]
+ },
+ {
+ "cmd": [
+ "git",
+ "checkout",
+ "-f",
+ "FETCH_HEAD"
+ ],
+ "cwd": "[START_DIR]/flutter sdk",
+ "infra_step": true,
+ "name": "checkout source code.Checkout flutter/flutter.git checkout",
+ "~followup_annotations": [
+ "@@@STEP_NEST_LEVEL@2@@@"
+ ]
+ },
+ {
+ "cmd": [
+ "git",
+ "rev-parse",
+ "HEAD"
+ ],
+ "cwd": "[START_DIR]/flutter sdk",
+ "infra_step": true,
+ "name": "checkout source code.Checkout flutter/flutter.read revision",
+ "~followup_annotations": [
+ "@@@STEP_NEST_LEVEL@2@@@",
+ "@@@STEP_TEXT@<br/>checked out 'deadbeef'<br/>@@@",
+ "@@@SET_BUILD_PROPERTY@got_revision@\"deadbeef\"@@@"
+ ]
+ },
+ {
+ "cmd": [
+ "git",
+ "clean",
+ "-f",
+ "-d",
+ "-x"
+ ],
+ "cwd": "[START_DIR]/flutter sdk",
+ "infra_step": true,
+ "name": "checkout source code.Checkout flutter/flutter.git clean",
+ "~followup_annotations": [
+ "@@@STEP_NEST_LEVEL@2@@@"
+ ]
+ },
+ {
+ "cmd": [
+ "git",
+ "submodule",
+ "sync"
+ ],
+ "cwd": "[START_DIR]/flutter sdk",
+ "infra_step": true,
+ "name": "checkout source code.Checkout flutter/flutter.submodule sync",
+ "~followup_annotations": [
+ "@@@STEP_NEST_LEVEL@2@@@"
+ ]
+ },
+ {
+ "cmd": [
+ "git",
+ "submodule",
+ "update",
+ "--init",
+ "--recursive"
+ ],
+ "cwd": "[START_DIR]/flutter sdk",
+ "infra_step": true,
+ "name": "checkout source code.Checkout flutter/flutter.submodule update",
+ "~followup_annotations": [
+ "@@@STEP_NEST_LEVEL@2@@@"
+ ]
+ },
+ {
+ "cmd": [
+ "cipd",
+ "ensure",
+ "-root",
+ "[CACHE]/android",
+ "-ensure-file",
+ "flutter_internal/android/sdk/${platform} latest",
+ "-max-threads",
+ "0",
+ "-json-output",
+ "/path/to/tmp/json"
+ ],
+ "name": "ensure_installed",
+ "~followup_annotations": [
+ "@@@STEP_LOG_LINE@json.output@{@@@",
+ "@@@STEP_LOG_LINE@json.output@ \"result\": {@@@",
+ "@@@STEP_LOG_LINE@json.output@ \"\": [@@@",
+ "@@@STEP_LOG_LINE@json.output@ {@@@",
+ "@@@STEP_LOG_LINE@json.output@ \"instance_id\": \"resolved-instance_id-of-latest----------\", @@@",
+ "@@@STEP_LOG_LINE@json.output@ \"package\": \"flutter_internal/android/sdk/resolved-platform\"@@@",
+ "@@@STEP_LOG_LINE@json.output@ }@@@",
+ "@@@STEP_LOG_LINE@json.output@ ]@@@",
+ "@@@STEP_LOG_LINE@json.output@ }@@@",
+ "@@@STEP_LOG_LINE@json.output@}@@@",
+ "@@@STEP_LOG_END@json.output@@@"
+ ]
+ },
+ {
+ "cmd": [
+ "vpython",
+ "-u",
+ "RECIPE_MODULE[recipe_engine::file]/resources/fileutil.py",
+ "--json-output",
+ "/path/to/tmp/json",
+ "ensure-directory",
+ "--mode",
+ "0777",
+ "[CACHE]/builder/avd"
+ ],
+ "cwd": "[CACHE]/builder",
+ "env": {
+ "ANDROID_HOME": "[CACHE]/android",
+ "ANDROID_SDK_ROOT": "[CACHE]/android",
+ "DEPOT_TOOLS": "RECIPE_REPO[depot_tools]",
+ "GRADLE_OPTS": "-Dorg.gradle.daemon=false",
+ "GRADLE_USER_HOME": "[CACHE]/gradle",
+ "LUCI_BRANCH": "",
+ "LUCI_CI": "True",
+ "LUCI_PR": "",
+ "OS": "linux",
+ "PUB_CACHE": "[START_DIR]/.pub-cache",
+ "SDK_CHECKOUT_PATH": "[START_DIR]/flutter sdk"
+ },
+ "env_prefixes": {
+ "PATH": [
+ "[START_DIR]/flutter sdk/bin",
+ "[START_DIR]/flutter sdk/bin/cache/dart-sdk/bin"
+ ]
+ },
+ "env_suffixes": {
+ "DEPOT_TOOLS_UPDATE": [
+ "0"
+ ],
+ "PATH": [
+ "RECIPE_REPO[depot_tools]"
+ ]
+ },
+ "infra_step": true,
+ "name": "Ensure avd cache"
+ },
+ {
+ "cmd": [
+ "cipd",
+ "ensure",
+ "-root",
+ "[CACHE]/builder/avd",
+ "-ensure-file",
+ "chromium/tools/android/avd/linux-amd64 p-1EgH-og45NbJT5ld4bBmvhayUxyb5Wm0oedSBwXOsC",
+ "-max-threads",
+ "0",
+ "-json-output",
+ "/path/to/tmp/json"
+ ],
+ "cwd": "[CACHE]/builder",
+ "env": {
+ "ANDROID_HOME": "[CACHE]/android",
+ "ANDROID_SDK_ROOT": "[CACHE]/android",
+ "DEPOT_TOOLS": "RECIPE_REPO[depot_tools]",
+ "GRADLE_OPTS": "-Dorg.gradle.daemon=false",
+ "GRADLE_USER_HOME": "[CACHE]/gradle",
+ "LUCI_BRANCH": "",
+ "LUCI_CI": "True",
+ "LUCI_PR": "",
+ "OS": "linux",
+ "PUB_CACHE": "[START_DIR]/.pub-cache",
+ "SDK_CHECKOUT_PATH": "[START_DIR]/flutter sdk"
+ },
+ "env_prefixes": {
+ "PATH": [
+ "[START_DIR]/flutter sdk/bin",
+ "[START_DIR]/flutter sdk/bin/cache/dart-sdk/bin"
+ ]
+ },
+ "env_suffixes": {
+ "DEPOT_TOOLS_UPDATE": [
+ "0"
+ ],
+ "PATH": [
+ "RECIPE_REPO[depot_tools]"
+ ]
+ },
+ "name": "ensure_installed (2)",
+ "~followup_annotations": [
+ "@@@STEP_LOG_LINE@json.output@{@@@",
+ "@@@STEP_LOG_LINE@json.output@ \"result\": {@@@",
+ "@@@STEP_LOG_LINE@json.output@ \"\": [@@@",
+ "@@@STEP_LOG_LINE@json.output@ {@@@",
+ "@@@STEP_LOG_LINE@json.output@ \"instance_id\": \"resolved-instance_id-of-p-1EgH-og45NbJT5\", @@@",
+ "@@@STEP_LOG_LINE@json.output@ \"package\": \"chromium/tools/android/avd/linux-amd64\"@@@",
+ "@@@STEP_LOG_LINE@json.output@ }@@@",
+ "@@@STEP_LOG_LINE@json.output@ ]@@@",
+ "@@@STEP_LOG_LINE@json.output@ }@@@",
+ "@@@STEP_LOG_LINE@json.output@}@@@",
+ "@@@STEP_LOG_END@json.output@@@"
+ ]
+ },
+ {
+ "cmd": [],
+ "name": "start avd"
+ },
+ {
+ "cmd": [
+ "python",
+ "-u",
+ "[CACHE]/builder/avd/src/tools/android/avd/avd.py",
+ "install",
+ "--avd-config",
+ "[CACHE]/builder/avd/src/tools/android/avd/proto/generic_android31.textpb"
+ ],
+ "cwd": "[CACHE]/builder/avd",
+ "env": {
+ "ANDROID_HOME": "[CACHE]/android",
+ "ANDROID_SDK_ROOT": "[CACHE]/android",
+ "DEPOT_TOOLS": "RECIPE_REPO[depot_tools]",
+ "GRADLE_OPTS": "-Dorg.gradle.daemon=false",
+ "GRADLE_USER_HOME": "[CACHE]/gradle",
+ "LUCI_BRANCH": "",
+ "LUCI_CI": "True",
+ "LUCI_PR": "",
+ "OS": "linux",
+ "PUB_CACHE": "[START_DIR]/.pub-cache",
+ "SDK_CHECKOUT_PATH": "[START_DIR]/flutter sdk"
+ },
+ "env_prefixes": {
+ "PATH": [
+ "[START_DIR]/flutter sdk/bin",
+ "[START_DIR]/flutter sdk/bin/cache/dart-sdk/bin",
+ "[START_DIR]/flutter sdk/bin",
+ "[START_DIR]/flutter sdk/bin/cache/dart-sdk/bin"
+ ]
+ },
+ "env_suffixes": {
+ "DEPOT_TOOLS_UPDATE": [
+ "0"
+ ],
+ "PATH": [
+ "RECIPE_REPO[depot_tools]"
+ ]
+ },
+ "name": "start avd.Install Android emulator (API level 31)",
+ "~followup_annotations": [
+ "@@@STEP_NEST_LEVEL@1@@@"
+ ]
+ },
+ {
+ "cmd": [
+ "python",
+ "-u",
+ "[CACHE]/builder/avd/src/tools/android/avd/avd.py",
+ "start",
+ "--no-read-only",
+ "--writable-system",
+ "--avd-config",
+ "[CACHE]/builder/avd/src/tools/android/avd/proto/generic_android31.textpb"
+ ],
+ "cwd": "[CACHE]/builder/avd",
+ "env": {
+ "ANDROID_HOME": "[CACHE]/android",
+ "ANDROID_SDK_ROOT": "[CACHE]/android",
+ "DEPOT_TOOLS": "RECIPE_REPO[depot_tools]",
+ "GRADLE_OPTS": "-Dorg.gradle.daemon=false",
+ "GRADLE_USER_HOME": "[CACHE]/gradle",
+ "LUCI_BRANCH": "",
+ "LUCI_CI": "True",
+ "LUCI_PR": "",
+ "OS": "linux",
+ "PUB_CACHE": "[START_DIR]/.pub-cache",
+ "SDK_CHECKOUT_PATH": "[START_DIR]/flutter sdk"
+ },
+ "env_prefixes": {
+ "PATH": [
+ "[START_DIR]/flutter sdk/bin",
+ "[START_DIR]/flutter sdk/bin/cache/dart-sdk/bin",
+ "[START_DIR]/flutter sdk/bin",
+ "[START_DIR]/flutter sdk/bin/cache/dart-sdk/bin"
+ ]
+ },
+ "env_suffixes": {
+ "DEPOT_TOOLS_UPDATE": [
+ "0"
+ ],
+ "PATH": [
+ "RECIPE_REPO[depot_tools]"
+ ]
+ },
+ "name": "start avd.Start Android emulator (API level 31)",
+ "~followup_annotations": [
+ "@@@STEP_NEST_LEVEL@1@@@"
+ ]
+ },
+ {
+ "cmd": [
+ "[CACHE]/builder/avd/src/third_party/android_sdk/public/platform-tools/adb",
+ "kill-server"
+ ],
+ "cwd": "[CACHE]/builder/avd",
+ "env": {
+ "ANDROID_HOME": "[CACHE]/android",
+ "ANDROID_SDK_ROOT": "[CACHE]/android",
+ "DEPOT_TOOLS": "RECIPE_REPO[depot_tools]",
+ "GRADLE_OPTS": "-Dorg.gradle.daemon=false",
+ "GRADLE_USER_HOME": "[CACHE]/gradle",
+ "LUCI_BRANCH": "",
+ "LUCI_CI": "True",
+ "LUCI_PR": "",
+ "OS": "linux",
+ "PUB_CACHE": "[START_DIR]/.pub-cache",
+ "SDK_CHECKOUT_PATH": "[START_DIR]/flutter sdk"
+ },
+ "env_prefixes": {
+ "PATH": [
+ "[START_DIR]/flutter sdk/bin",
+ "[START_DIR]/flutter sdk/bin/cache/dart-sdk/bin",
+ "[START_DIR]/flutter sdk/bin",
+ "[START_DIR]/flutter sdk/bin/cache/dart-sdk/bin"
+ ]
+ },
+ "env_suffixes": {
+ "DEPOT_TOOLS_UPDATE": [
+ "0"
+ ],
+ "PATH": [
+ "RECIPE_REPO[depot_tools]"
+ ]
+ },
+ "name": "start avd.adb kill-server",
+ "~followup_annotations": [
+ "@@@STEP_NEST_LEVEL@1@@@"
+ ]
+ },
+ {
+ "cmd": [
+ "[CACHE]/builder/avd/src/third_party/android_sdk/public/platform-tools/adb",
+ "start-server"
+ ],
+ "cwd": "[CACHE]/builder/avd",
+ "env": {
+ "ANDROID_HOME": "[CACHE]/android",
+ "ANDROID_SDK_ROOT": "[CACHE]/android",
+ "DEPOT_TOOLS": "RECIPE_REPO[depot_tools]",
+ "GRADLE_OPTS": "-Dorg.gradle.daemon=false",
+ "GRADLE_USER_HOME": "[CACHE]/gradle",
+ "LUCI_BRANCH": "",
+ "LUCI_CI": "True",
+ "LUCI_PR": "",
+ "OS": "linux",
+ "PUB_CACHE": "[START_DIR]/.pub-cache",
+ "SDK_CHECKOUT_PATH": "[START_DIR]/flutter sdk"
+ },
+ "env_prefixes": {
+ "PATH": [
+ "[START_DIR]/flutter sdk/bin",
+ "[START_DIR]/flutter sdk/bin/cache/dart-sdk/bin",
+ "[START_DIR]/flutter sdk/bin",
+ "[START_DIR]/flutter sdk/bin/cache/dart-sdk/bin"
+ ]
+ },
+ "env_suffixes": {
+ "DEPOT_TOOLS_UPDATE": [
+ "0"
+ ],
+ "PATH": [
+ "RECIPE_REPO[depot_tools]"
+ ]
+ },
+ "name": "start avd.adb start-server",
+ "~followup_annotations": [
+ "@@@STEP_NEST_LEVEL@1@@@"
+ ]
+ },
+ {
+ "cmd": [
+ "[CACHE]/builder/avd/src/third_party/android_sdk/public/platform-tools/adb",
+ "wait-for-device"
+ ],
+ "cwd": "[CACHE]/builder/avd",
+ "env": {
+ "ANDROID_HOME": "[CACHE]/android",
+ "ANDROID_SDK_ROOT": "[CACHE]/android",
+ "DEPOT_TOOLS": "RECIPE_REPO[depot_tools]",
+ "GRADLE_OPTS": "-Dorg.gradle.daemon=false",
+ "GRADLE_USER_HOME": "[CACHE]/gradle",
+ "LUCI_BRANCH": "",
+ "LUCI_CI": "True",
+ "LUCI_PR": "",
+ "OS": "linux",
+ "PUB_CACHE": "[START_DIR]/.pub-cache",
+ "SDK_CHECKOUT_PATH": "[START_DIR]/flutter sdk"
+ },
+ "env_prefixes": {
+ "PATH": [
+ "[START_DIR]/flutter sdk/bin",
+ "[START_DIR]/flutter sdk/bin/cache/dart-sdk/bin",
+ "[START_DIR]/flutter sdk/bin",
+ "[START_DIR]/flutter sdk/bin/cache/dart-sdk/bin"
+ ]
+ },
+ "env_suffixes": {
+ "DEPOT_TOOLS_UPDATE": [
+ "0"
+ ],
+ "PATH": [
+ "RECIPE_REPO[depot_tools]"
+ ]
+ },
+ "name": "start avd.adb wait-for-device",
+ "~followup_annotations": [
+ "@@@STEP_NEST_LEVEL@1@@@"
+ ]
+ },
+ {
+ "cmd": [
+ "[CACHE]/builder/avd/src/third_party/android_sdk/public/platform-tools/adb",
+ "-s",
+ "emulator-5554",
+ "shell",
+ "while [[ -z $(getprop sys.boot_completed) ]]; do sleep 1; done;"
+ ],
+ "cwd": "[CACHE]/builder/avd",
+ "env": {
+ "ANDROID_HOME": "[CACHE]/android",
+ "ANDROID_SDK_ROOT": "[CACHE]/android",
+ "DEPOT_TOOLS": "RECIPE_REPO[depot_tools]",
+ "GRADLE_OPTS": "-Dorg.gradle.daemon=false",
+ "GRADLE_USER_HOME": "[CACHE]/gradle",
+ "LUCI_BRANCH": "",
+ "LUCI_CI": "True",
+ "LUCI_PR": "",
+ "OS": "linux",
+ "PUB_CACHE": "[START_DIR]/.pub-cache",
+ "SDK_CHECKOUT_PATH": "[START_DIR]/flutter sdk"
+ },
+ "env_prefixes": {
+ "PATH": [
+ "[START_DIR]/flutter sdk/bin",
+ "[START_DIR]/flutter sdk/bin/cache/dart-sdk/bin",
+ "[START_DIR]/flutter sdk/bin",
+ "[START_DIR]/flutter sdk/bin/cache/dart-sdk/bin"
+ ]
+ },
+ "env_suffixes": {
+ "DEPOT_TOOLS_UPDATE": [
+ "0"
+ ],
+ "PATH": [
+ "RECIPE_REPO[depot_tools]"
+ ]
+ },
+ "name": "start avd.adb wait until booted completed",
+ "~followup_annotations": [
+ "@@@STEP_NEST_LEVEL@1@@@"
+ ]
+ },
+ {
+ "cmd": [
+ "[CACHE]/builder/avd/src/third_party/android_sdk/public/platform-tools/adb",
+ "devices"
+ ],
+ "cwd": "[CACHE]/builder/avd",
+ "env": {
+ "ANDROID_HOME": "[CACHE]/android",
+ "ANDROID_SDK_ROOT": "[CACHE]/android",
+ "DEPOT_TOOLS": "RECIPE_REPO[depot_tools]",
+ "GRADLE_OPTS": "-Dorg.gradle.daemon=false",
+ "GRADLE_USER_HOME": "[CACHE]/gradle",
+ "LUCI_BRANCH": "",
+ "LUCI_CI": "True",
+ "LUCI_PR": "",
+ "OS": "linux",
+ "PUB_CACHE": "[START_DIR]/.pub-cache",
+ "SDK_CHECKOUT_PATH": "[START_DIR]/flutter sdk"
+ },
+ "env_prefixes": {
+ "PATH": [
+ "[START_DIR]/flutter sdk/bin",
+ "[START_DIR]/flutter sdk/bin/cache/dart-sdk/bin",
+ "[START_DIR]/flutter sdk/bin",
+ "[START_DIR]/flutter sdk/bin/cache/dart-sdk/bin"
+ ]
+ },
+ "env_suffixes": {
+ "DEPOT_TOOLS_UPDATE": [
+ "0"
+ ],
+ "PATH": [
+ "RECIPE_REPO[depot_tools]"
+ ]
+ },
+ "name": "start avd.adb devices",
+ "~followup_annotations": [
+ "@@@STEP_NEST_LEVEL@1@@@"
+ ]
+ },
+ {
+ "cmd": [
+ "[CACHE]/builder/avd/src/third_party/android_sdk/public/platform-tools/adb",
+ "shell",
+ "input",
+ "keyevent",
+ "82"
+ ],
+ "cwd": "[CACHE]/builder/avd",
+ "env": {
+ "ANDROID_HOME": "[CACHE]/android",
+ "ANDROID_SDK_ROOT": "[CACHE]/android",
+ "DEPOT_TOOLS": "RECIPE_REPO[depot_tools]",
+ "GRADLE_OPTS": "-Dorg.gradle.daemon=false",
+ "GRADLE_USER_HOME": "[CACHE]/gradle",
+ "LUCI_BRANCH": "",
+ "LUCI_CI": "True",
+ "LUCI_PR": "",
+ "OS": "linux",
+ "PUB_CACHE": "[START_DIR]/.pub-cache",
+ "SDK_CHECKOUT_PATH": "[START_DIR]/flutter sdk"
+ },
+ "env_prefixes": {
+ "PATH": [
+ "[START_DIR]/flutter sdk/bin",
+ "[START_DIR]/flutter sdk/bin/cache/dart-sdk/bin",
+ "[START_DIR]/flutter sdk/bin",
+ "[START_DIR]/flutter sdk/bin/cache/dart-sdk/bin"
+ ]
+ },
+ "env_suffixes": {
+ "DEPOT_TOOLS_UPDATE": [
+ "0"
+ ],
+ "PATH": [
+ "RECIPE_REPO[depot_tools]"
+ ]
+ },
+ "name": "start avd.adb shell input keyevent 82",
+ "~followup_annotations": [
+ "@@@STEP_NEST_LEVEL@1@@@"
+ ]
+ },
+ {
+ "cmd": [
+ "[CACHE]/builder/avd/src/third_party/android_sdk/public/platform-tools/adb",
+ "shell",
+ "settings",
+ "put",
+ "global",
+ "development_settings_enabled",
+ "1"
+ ],
+ "cwd": "[CACHE]/builder/avd",
+ "env": {
+ "ANDROID_HOME": "[CACHE]/android",
+ "ANDROID_SDK_ROOT": "[CACHE]/android",
+ "DEPOT_TOOLS": "RECIPE_REPO[depot_tools]",
+ "GRADLE_OPTS": "-Dorg.gradle.daemon=false",
+ "GRADLE_USER_HOME": "[CACHE]/gradle",
+ "LUCI_BRANCH": "",
+ "LUCI_CI": "True",
+ "LUCI_PR": "",
+ "OS": "linux",
+ "PUB_CACHE": "[START_DIR]/.pub-cache",
+ "SDK_CHECKOUT_PATH": "[START_DIR]/flutter sdk"
+ },
+ "env_prefixes": {
+ "PATH": [
+ "[START_DIR]/flutter sdk/bin",
+ "[START_DIR]/flutter sdk/bin/cache/dart-sdk/bin",
+ "[START_DIR]/flutter sdk/bin",
+ "[START_DIR]/flutter sdk/bin/cache/dart-sdk/bin"
+ ]
+ },
+ "env_suffixes": {
+ "DEPOT_TOOLS_UPDATE": [
+ "0"
+ ],
+ "PATH": [
+ "RECIPE_REPO[depot_tools]"
+ ]
+ },
+ "name": "start avd.adb shell settings put global development_settings_enabled 1",
+ "~followup_annotations": [
+ "@@@STEP_NEST_LEVEL@1@@@"
+ ]
+ },
+ {
+ "cmd": [],
+ "name": "prepare environment"
+ },
+ {
+ "cmd": [
+ "flutter",
+ "config",
+ "--no-analytics"
+ ],
+ "cwd": "[START_DIR]/flutter sdk",
+ "env": {
+ "ANDROID_HOME": "[CACHE]/android",
+ "ANDROID_SDK_ROOT": "[CACHE]/android",
+ "DEPOT_TOOLS": "RECIPE_REPO[depot_tools]",
+ "GRADLE_OPTS": "-Dorg.gradle.daemon=false",
+ "GRADLE_USER_HOME": "[CACHE]/gradle",
+ "LUCI_BRANCH": "",
+ "LUCI_CI": "True",
+ "LUCI_PR": "",
+ "OS": "linux",
+ "PUB_CACHE": "[START_DIR]/.pub-cache",
+ "SDK_CHECKOUT_PATH": "[START_DIR]/flutter sdk"
+ },
+ "env_prefixes": {
+ "PATH": [
+ "[START_DIR]/flutter sdk/bin",
+ "[START_DIR]/flutter sdk/bin/cache/dart-sdk/bin",
+ "[START_DIR]/flutter sdk/bin",
+ "[START_DIR]/flutter sdk/bin/cache/dart-sdk/bin"
+ ]
+ },
+ "env_suffixes": {
+ "DEPOT_TOOLS_UPDATE": [
+ "0"
+ ],
+ "PATH": [
+ "RECIPE_REPO[depot_tools]"
+ ]
+ },
+ "name": "prepare environment.flutter config --no-analytics",
+ "~followup_annotations": [
+ "@@@STEP_NEST_LEVEL@1@@@"
+ ]
+ },
+ {
+ "cmd": [
+ "flutter",
+ "doctor"
+ ],
+ "cwd": "[START_DIR]/flutter sdk",
+ "env": {
+ "ANDROID_HOME": "[CACHE]/android",
+ "ANDROID_SDK_ROOT": "[CACHE]/android",
+ "DEPOT_TOOLS": "RECIPE_REPO[depot_tools]",
+ "GRADLE_OPTS": "-Dorg.gradle.daemon=false",
+ "GRADLE_USER_HOME": "[CACHE]/gradle",
+ "LUCI_BRANCH": "",
+ "LUCI_CI": "True",
+ "LUCI_PR": "",
+ "OS": "linux",
+ "PUB_CACHE": "[START_DIR]/.pub-cache",
+ "SDK_CHECKOUT_PATH": "[START_DIR]/flutter sdk"
+ },
+ "env_prefixes": {
+ "PATH": [
+ "[START_DIR]/flutter sdk/bin",
+ "[START_DIR]/flutter sdk/bin/cache/dart-sdk/bin",
+ "[START_DIR]/flutter sdk/bin",
+ "[START_DIR]/flutter sdk/bin/cache/dart-sdk/bin"
+ ]
+ },
+ "env_suffixes": {
+ "DEPOT_TOOLS_UPDATE": [
+ "0"
+ ],
+ "PATH": [
+ "RECIPE_REPO[depot_tools]"
+ ]
+ },
+ "name": "prepare environment.flutter doctor",
+ "~followup_annotations": [
+ "@@@STEP_NEST_LEVEL@1@@@"
+ ]
+ },
+ {
+ "cmd": [
+ "flutter",
+ "devices",
+ "--device-timeout=40",
+ "--verbose"
+ ],
+ "cwd": "[START_DIR]/flutter sdk",
+ "env": {
+ "ANDROID_HOME": "[CACHE]/android",
+ "ANDROID_SDK_ROOT": "[CACHE]/android",
+ "DEPOT_TOOLS": "RECIPE_REPO[depot_tools]",
+ "GRADLE_OPTS": "-Dorg.gradle.daemon=false",
+ "GRADLE_USER_HOME": "[CACHE]/gradle",
+ "LUCI_BRANCH": "",
+ "LUCI_CI": "True",
+ "LUCI_PR": "",
+ "OS": "linux",
+ "PUB_CACHE": "[START_DIR]/.pub-cache",
+ "SDK_CHECKOUT_PATH": "[START_DIR]/flutter sdk"
+ },
+ "env_prefixes": {
+ "PATH": [
+ "[START_DIR]/flutter sdk/bin",
+ "[START_DIR]/flutter sdk/bin/cache/dart-sdk/bin",
+ "[START_DIR]/flutter sdk/bin",
+ "[START_DIR]/flutter sdk/bin/cache/dart-sdk/bin"
+ ]
+ },
+ "env_suffixes": {
+ "DEPOT_TOOLS_UPDATE": [
+ "0"
+ ],
+ "PATH": [
+ "RECIPE_REPO[depot_tools]"
+ ]
+ },
+ "name": "prepare environment.flutter devices",
+ "~followup_annotations": [
+ "@@@STEP_NEST_LEVEL@1@@@"
+ ]
+ },
+ {
+ "cmd": [
+ "flutter",
+ "update-packages"
+ ],
+ "cwd": "[START_DIR]/flutter sdk",
+ "env": {
+ "ANDROID_HOME": "[CACHE]/android",
+ "ANDROID_SDK_ROOT": "[CACHE]/android",
+ "DEPOT_TOOLS": "RECIPE_REPO[depot_tools]",
+ "GRADLE_OPTS": "-Dorg.gradle.daemon=false",
+ "GRADLE_USER_HOME": "[CACHE]/gradle",
+ "LUCI_BRANCH": "",
+ "LUCI_CI": "True",
+ "LUCI_PR": "",
+ "OS": "linux",
+ "PUB_CACHE": "[START_DIR]/.pub-cache",
+ "SDK_CHECKOUT_PATH": "[START_DIR]/flutter sdk"
+ },
+ "env_prefixes": {
+ "PATH": [
+ "[START_DIR]/flutter sdk/bin",
+ "[START_DIR]/flutter sdk/bin/cache/dart-sdk/bin",
+ "[START_DIR]/flutter sdk/bin",
+ "[START_DIR]/flutter sdk/bin/cache/dart-sdk/bin"
+ ]
+ },
+ "env_suffixes": {
+ "DEPOT_TOOLS_UPDATE": [
+ "0"
+ ],
+ "PATH": [
+ "RECIPE_REPO[depot_tools]"
+ ]
+ },
+ "infra_step": true,
+ "name": "prepare environment.download dependencies",
+ "~followup_annotations": [
+ "@@@STEP_NEST_LEVEL@1@@@"
+ ]
+ },
+ {
+ "cmd": [
+ "flutter",
+ "drive",
+ "--browser-name=android-chrome",
+ "--android-emulator",
+ "--no-start-paused",
+ "--purge-persistent-cache",
+ "--device-timeout=30"
+ ],
+ "cwd": "[START_DIR]/flutter sdk/dev/integration_tests/android_views",
+ "env": {
+ "ANDROID_HOME": "[CACHE]/android",
+ "ANDROID_SDK_ROOT": "[CACHE]/android",
+ "DEPOT_TOOLS": "RECIPE_REPO[depot_tools]",
+ "GRADLE_OPTS": "-Dorg.gradle.daemon=false",
+ "GRADLE_USER_HOME": "[CACHE]/gradle",
+ "LUCI_BRANCH": "",
+ "LUCI_CI": "True",
+ "LUCI_PR": "",
+ "OS": "linux",
+ "PUB_CACHE": "[START_DIR]/.pub-cache",
+ "SDK_CHECKOUT_PATH": "[START_DIR]/flutter sdk"
+ },
+ "env_prefixes": {
+ "PATH": [
+ "[START_DIR]/flutter sdk/bin",
+ "[START_DIR]/flutter sdk/bin/cache/dart-sdk/bin",
+ "[START_DIR]/flutter sdk/bin",
+ "[START_DIR]/flutter sdk/bin/cache/dart-sdk/bin"
+ ]
+ },
+ "env_suffixes": {
+ "DEPOT_TOOLS_UPDATE": [
+ "0"
+ ],
+ "PATH": [
+ "RECIPE_REPO[depot_tools]"
+ ]
+ },
+ "name": "Android Views Integration Tests",
+ "timeout": 700
+ },
+ {
+ "cmd": [],
+ "name": "cleanup"
+ },
+ {
+ "cmd": [
+ "kill",
+ "-9",
+ "17687"
+ ],
+ "name": "cleanup.Kill emulator cleanup",
+ "~followup_annotations": [
+ "@@@STEP_NEST_LEVEL@1@@@"
+ ]
+ },
+ {
+ "cmd": [
+ "ps",
+ "-axww"
+ ],
+ "name": "cleanup.list processes",
+ "~followup_annotations": [
+ "@@@STEP_NEST_LEVEL@1@@@"
+ ]
+ },
+ {
+ "cmd": [],
+ "name": "cleanup.Killing Processes",
+ "~followup_annotations": [
+ "@@@STEP_NEST_LEVEL@1@@@"
+ ]
+ },
+ {
+ "cmd": [
+ "pkill",
+ "chrome"
+ ],
+ "infra_step": true,
+ "name": "cleanup.Killing Processes.kill chrome",
+ "~followup_annotations": [
+ "@@@STEP_NEST_LEVEL@2@@@"
+ ]
+ },
+ {
+ "cmd": [
+ "pkill",
+ "dart"
+ ],
+ "infra_step": true,
+ "name": "cleanup.Killing Processes.kill dart",
+ "~followup_annotations": [
+ "@@@STEP_NEST_LEVEL@2@@@"
+ ]
+ },
+ {
+ "cmd": [
+ "pkill",
+ "flutter"
+ ],
+ "infra_step": true,
+ "name": "cleanup.Killing Processes.kill flutter",
+ "~followup_annotations": [
+ "@@@STEP_NEST_LEVEL@2@@@"
+ ]
+ },
+ {
+ "cmd": [
+ "pkill",
+ "java"
+ ],
+ "infra_step": true,
+ "name": "cleanup.Killing Processes.kill java",
+ "~followup_annotations": [
+ "@@@STEP_NEST_LEVEL@2@@@"
+ ]
+ },
+ {
+ "cmd": [
+ "pkill",
+ "adb"
+ ],
+ "infra_step": true,
+ "name": "cleanup.Killing Processes.kill adb",
+ "~followup_annotations": [
+ "@@@STEP_NEST_LEVEL@2@@@"
+ ]
+ },
+ {
+ "cmd": [
+ "top",
+ "-b",
+ "-n",
+ "3",
+ "-o",
+ "%MEM"
+ ],
+ "infra_step": true,
+ "name": "cleanup.OS info",
+ "~followup_annotations": [
+ "@@@STEP_NEST_LEVEL@1@@@"
+ ]
+ },
+ {
+ "name": "$result"
+ }
+]
\ No newline at end of file
diff --git a/recipes/flutter/android_views.expected/flutter_drive_zombie_process.json b/recipes/flutter/android_views.expected/flutter_drive_zombie_process.json
new file mode 100644
index 0000000..b226d5a
--- /dev/null
+++ b/recipes/flutter/android_views.expected/flutter_drive_zombie_process.json
@@ -0,0 +1,986 @@
+[
+ {
+ "cmd": [
+ "top",
+ "-b",
+ "-n",
+ "3",
+ "-o",
+ "%MEM"
+ ],
+ "infra_step": true,
+ "name": "OS info"
+ },
+ {
+ "cmd": [
+ "vpython",
+ "-u",
+ "RECIPE_MODULE[recipe_engine::file]/resources/fileutil.py",
+ "--json-output",
+ "/path/to/tmp/json",
+ "ensure-directory",
+ "--mode",
+ "0777",
+ "[CACHE]/builder"
+ ],
+ "infra_step": true,
+ "name": "Ensure root cache"
+ },
+ {
+ "cmd": [],
+ "name": "checkout source code"
+ },
+ {
+ "cmd": [],
+ "name": "checkout source code.Checkout flutter/flutter",
+ "~followup_annotations": [
+ "@@@STEP_NEST_LEVEL@1@@@"
+ ]
+ },
+ {
+ "cmd": [
+ "python",
+ "-u",
+ "RECIPE_MODULE[depot_tools::git]/resources/git_setup.py",
+ "--path",
+ "[START_DIR]/flutter sdk",
+ "--url",
+ "https://chromium.googlesource.com/external/github.com/flutter/flutter"
+ ],
+ "name": "checkout source code.Checkout flutter/flutter.git setup",
+ "~followup_annotations": [
+ "@@@STEP_NEST_LEVEL@2@@@"
+ ]
+ },
+ {
+ "cmd": [
+ "git",
+ "fetch",
+ "origin",
+ "master",
+ "--recurse-submodules",
+ "--progress",
+ "--tags"
+ ],
+ "cwd": "[START_DIR]/flutter sdk",
+ "env": {
+ "PATH": "RECIPE_REPO[depot_tools]:<PATH>"
+ },
+ "infra_step": true,
+ "name": "checkout source code.Checkout flutter/flutter.git fetch",
+ "~followup_annotations": [
+ "@@@STEP_NEST_LEVEL@2@@@"
+ ]
+ },
+ {
+ "cmd": [
+ "git",
+ "checkout",
+ "-f",
+ "FETCH_HEAD"
+ ],
+ "cwd": "[START_DIR]/flutter sdk",
+ "infra_step": true,
+ "name": "checkout source code.Checkout flutter/flutter.git checkout",
+ "~followup_annotations": [
+ "@@@STEP_NEST_LEVEL@2@@@"
+ ]
+ },
+ {
+ "cmd": [
+ "git",
+ "rev-parse",
+ "HEAD"
+ ],
+ "cwd": "[START_DIR]/flutter sdk",
+ "infra_step": true,
+ "name": "checkout source code.Checkout flutter/flutter.read revision",
+ "~followup_annotations": [
+ "@@@STEP_NEST_LEVEL@2@@@",
+ "@@@STEP_TEXT@<br/>checked out 'deadbeef'<br/>@@@",
+ "@@@SET_BUILD_PROPERTY@got_revision@\"deadbeef\"@@@"
+ ]
+ },
+ {
+ "cmd": [
+ "git",
+ "clean",
+ "-f",
+ "-d",
+ "-x"
+ ],
+ "cwd": "[START_DIR]/flutter sdk",
+ "infra_step": true,
+ "name": "checkout source code.Checkout flutter/flutter.git clean",
+ "~followup_annotations": [
+ "@@@STEP_NEST_LEVEL@2@@@"
+ ]
+ },
+ {
+ "cmd": [
+ "git",
+ "submodule",
+ "sync"
+ ],
+ "cwd": "[START_DIR]/flutter sdk",
+ "infra_step": true,
+ "name": "checkout source code.Checkout flutter/flutter.submodule sync",
+ "~followup_annotations": [
+ "@@@STEP_NEST_LEVEL@2@@@"
+ ]
+ },
+ {
+ "cmd": [
+ "git",
+ "submodule",
+ "update",
+ "--init",
+ "--recursive"
+ ],
+ "cwd": "[START_DIR]/flutter sdk",
+ "infra_step": true,
+ "name": "checkout source code.Checkout flutter/flutter.submodule update",
+ "~followup_annotations": [
+ "@@@STEP_NEST_LEVEL@2@@@"
+ ]
+ },
+ {
+ "cmd": [
+ "cipd",
+ "ensure",
+ "-root",
+ "[CACHE]/android",
+ "-ensure-file",
+ "flutter_internal/android/sdk/${platform} latest",
+ "-max-threads",
+ "0",
+ "-json-output",
+ "/path/to/tmp/json"
+ ],
+ "name": "ensure_installed",
+ "~followup_annotations": [
+ "@@@STEP_LOG_LINE@json.output@{@@@",
+ "@@@STEP_LOG_LINE@json.output@ \"result\": {@@@",
+ "@@@STEP_LOG_LINE@json.output@ \"\": [@@@",
+ "@@@STEP_LOG_LINE@json.output@ {@@@",
+ "@@@STEP_LOG_LINE@json.output@ \"instance_id\": \"resolved-instance_id-of-latest----------\", @@@",
+ "@@@STEP_LOG_LINE@json.output@ \"package\": \"flutter_internal/android/sdk/resolved-platform\"@@@",
+ "@@@STEP_LOG_LINE@json.output@ }@@@",
+ "@@@STEP_LOG_LINE@json.output@ ]@@@",
+ "@@@STEP_LOG_LINE@json.output@ }@@@",
+ "@@@STEP_LOG_LINE@json.output@}@@@",
+ "@@@STEP_LOG_END@json.output@@@"
+ ]
+ },
+ {
+ "cmd": [
+ "vpython",
+ "-u",
+ "RECIPE_MODULE[recipe_engine::file]/resources/fileutil.py",
+ "--json-output",
+ "/path/to/tmp/json",
+ "ensure-directory",
+ "--mode",
+ "0777",
+ "[CACHE]/builder/avd"
+ ],
+ "cwd": "[CACHE]/builder",
+ "env": {
+ "ANDROID_HOME": "[CACHE]/android",
+ "ANDROID_SDK_ROOT": "[CACHE]/android",
+ "DEPOT_TOOLS": "RECIPE_REPO[depot_tools]",
+ "GRADLE_OPTS": "-Dorg.gradle.daemon=false",
+ "GRADLE_USER_HOME": "[CACHE]/gradle",
+ "LUCI_BRANCH": "",
+ "LUCI_CI": "True",
+ "LUCI_PR": "",
+ "OS": "linux",
+ "PUB_CACHE": "[START_DIR]/.pub-cache",
+ "SDK_CHECKOUT_PATH": "[START_DIR]/flutter sdk"
+ },
+ "env_prefixes": {
+ "PATH": [
+ "[START_DIR]/flutter sdk/bin",
+ "[START_DIR]/flutter sdk/bin/cache/dart-sdk/bin"
+ ]
+ },
+ "env_suffixes": {
+ "DEPOT_TOOLS_UPDATE": [
+ "0"
+ ],
+ "PATH": [
+ "RECIPE_REPO[depot_tools]"
+ ]
+ },
+ "infra_step": true,
+ "name": "Ensure avd cache"
+ },
+ {
+ "cmd": [
+ "cipd",
+ "ensure",
+ "-root",
+ "[CACHE]/builder/avd",
+ "-ensure-file",
+ "chromium/tools/android/avd/linux-amd64 p-1EgH-og45NbJT5ld4bBmvhayUxyb5Wm0oedSBwXOsC",
+ "-max-threads",
+ "0",
+ "-json-output",
+ "/path/to/tmp/json"
+ ],
+ "cwd": "[CACHE]/builder",
+ "env": {
+ "ANDROID_HOME": "[CACHE]/android",
+ "ANDROID_SDK_ROOT": "[CACHE]/android",
+ "DEPOT_TOOLS": "RECIPE_REPO[depot_tools]",
+ "GRADLE_OPTS": "-Dorg.gradle.daemon=false",
+ "GRADLE_USER_HOME": "[CACHE]/gradle",
+ "LUCI_BRANCH": "",
+ "LUCI_CI": "True",
+ "LUCI_PR": "",
+ "OS": "linux",
+ "PUB_CACHE": "[START_DIR]/.pub-cache",
+ "SDK_CHECKOUT_PATH": "[START_DIR]/flutter sdk"
+ },
+ "env_prefixes": {
+ "PATH": [
+ "[START_DIR]/flutter sdk/bin",
+ "[START_DIR]/flutter sdk/bin/cache/dart-sdk/bin"
+ ]
+ },
+ "env_suffixes": {
+ "DEPOT_TOOLS_UPDATE": [
+ "0"
+ ],
+ "PATH": [
+ "RECIPE_REPO[depot_tools]"
+ ]
+ },
+ "name": "ensure_installed (2)",
+ "~followup_annotations": [
+ "@@@STEP_LOG_LINE@json.output@{@@@",
+ "@@@STEP_LOG_LINE@json.output@ \"result\": {@@@",
+ "@@@STEP_LOG_LINE@json.output@ \"\": [@@@",
+ "@@@STEP_LOG_LINE@json.output@ {@@@",
+ "@@@STEP_LOG_LINE@json.output@ \"instance_id\": \"resolved-instance_id-of-p-1EgH-og45NbJT5\", @@@",
+ "@@@STEP_LOG_LINE@json.output@ \"package\": \"chromium/tools/android/avd/linux-amd64\"@@@",
+ "@@@STEP_LOG_LINE@json.output@ }@@@",
+ "@@@STEP_LOG_LINE@json.output@ ]@@@",
+ "@@@STEP_LOG_LINE@json.output@ }@@@",
+ "@@@STEP_LOG_LINE@json.output@}@@@",
+ "@@@STEP_LOG_END@json.output@@@"
+ ]
+ },
+ {
+ "cmd": [],
+ "name": "start avd"
+ },
+ {
+ "cmd": [
+ "python",
+ "-u",
+ "[CACHE]/builder/avd/src/tools/android/avd/avd.py",
+ "install",
+ "--avd-config",
+ "[CACHE]/builder/avd/src/tools/android/avd/proto/generic_android31.textpb"
+ ],
+ "cwd": "[CACHE]/builder/avd",
+ "env": {
+ "ANDROID_HOME": "[CACHE]/android",
+ "ANDROID_SDK_ROOT": "[CACHE]/android",
+ "DEPOT_TOOLS": "RECIPE_REPO[depot_tools]",
+ "GRADLE_OPTS": "-Dorg.gradle.daemon=false",
+ "GRADLE_USER_HOME": "[CACHE]/gradle",
+ "LUCI_BRANCH": "",
+ "LUCI_CI": "True",
+ "LUCI_PR": "",
+ "OS": "linux",
+ "PUB_CACHE": "[START_DIR]/.pub-cache",
+ "SDK_CHECKOUT_PATH": "[START_DIR]/flutter sdk"
+ },
+ "env_prefixes": {
+ "PATH": [
+ "[START_DIR]/flutter sdk/bin",
+ "[START_DIR]/flutter sdk/bin/cache/dart-sdk/bin",
+ "[START_DIR]/flutter sdk/bin",
+ "[START_DIR]/flutter sdk/bin/cache/dart-sdk/bin"
+ ]
+ },
+ "env_suffixes": {
+ "DEPOT_TOOLS_UPDATE": [
+ "0"
+ ],
+ "PATH": [
+ "RECIPE_REPO[depot_tools]"
+ ]
+ },
+ "name": "start avd.Install Android emulator (API level 31)",
+ "~followup_annotations": [
+ "@@@STEP_NEST_LEVEL@1@@@"
+ ]
+ },
+ {
+ "cmd": [
+ "python",
+ "-u",
+ "[CACHE]/builder/avd/src/tools/android/avd/avd.py",
+ "start",
+ "--no-read-only",
+ "--writable-system",
+ "--avd-config",
+ "[CACHE]/builder/avd/src/tools/android/avd/proto/generic_android31.textpb"
+ ],
+ "cwd": "[CACHE]/builder/avd",
+ "env": {
+ "ANDROID_HOME": "[CACHE]/android",
+ "ANDROID_SDK_ROOT": "[CACHE]/android",
+ "DEPOT_TOOLS": "RECIPE_REPO[depot_tools]",
+ "GRADLE_OPTS": "-Dorg.gradle.daemon=false",
+ "GRADLE_USER_HOME": "[CACHE]/gradle",
+ "LUCI_BRANCH": "",
+ "LUCI_CI": "True",
+ "LUCI_PR": "",
+ "OS": "linux",
+ "PUB_CACHE": "[START_DIR]/.pub-cache",
+ "SDK_CHECKOUT_PATH": "[START_DIR]/flutter sdk"
+ },
+ "env_prefixes": {
+ "PATH": [
+ "[START_DIR]/flutter sdk/bin",
+ "[START_DIR]/flutter sdk/bin/cache/dart-sdk/bin",
+ "[START_DIR]/flutter sdk/bin",
+ "[START_DIR]/flutter sdk/bin/cache/dart-sdk/bin"
+ ]
+ },
+ "env_suffixes": {
+ "DEPOT_TOOLS_UPDATE": [
+ "0"
+ ],
+ "PATH": [
+ "RECIPE_REPO[depot_tools]"
+ ]
+ },
+ "name": "start avd.Start Android emulator (API level 31)",
+ "~followup_annotations": [
+ "@@@STEP_NEST_LEVEL@1@@@"
+ ]
+ },
+ {
+ "cmd": [
+ "[CACHE]/builder/avd/src/third_party/android_sdk/public/platform-tools/adb",
+ "kill-server"
+ ],
+ "cwd": "[CACHE]/builder/avd",
+ "env": {
+ "ANDROID_HOME": "[CACHE]/android",
+ "ANDROID_SDK_ROOT": "[CACHE]/android",
+ "DEPOT_TOOLS": "RECIPE_REPO[depot_tools]",
+ "GRADLE_OPTS": "-Dorg.gradle.daemon=false",
+ "GRADLE_USER_HOME": "[CACHE]/gradle",
+ "LUCI_BRANCH": "",
+ "LUCI_CI": "True",
+ "LUCI_PR": "",
+ "OS": "linux",
+ "PUB_CACHE": "[START_DIR]/.pub-cache",
+ "SDK_CHECKOUT_PATH": "[START_DIR]/flutter sdk"
+ },
+ "env_prefixes": {
+ "PATH": [
+ "[START_DIR]/flutter sdk/bin",
+ "[START_DIR]/flutter sdk/bin/cache/dart-sdk/bin",
+ "[START_DIR]/flutter sdk/bin",
+ "[START_DIR]/flutter sdk/bin/cache/dart-sdk/bin"
+ ]
+ },
+ "env_suffixes": {
+ "DEPOT_TOOLS_UPDATE": [
+ "0"
+ ],
+ "PATH": [
+ "RECIPE_REPO[depot_tools]"
+ ]
+ },
+ "name": "start avd.adb kill-server",
+ "~followup_annotations": [
+ "@@@STEP_NEST_LEVEL@1@@@"
+ ]
+ },
+ {
+ "cmd": [
+ "[CACHE]/builder/avd/src/third_party/android_sdk/public/platform-tools/adb",
+ "start-server"
+ ],
+ "cwd": "[CACHE]/builder/avd",
+ "env": {
+ "ANDROID_HOME": "[CACHE]/android",
+ "ANDROID_SDK_ROOT": "[CACHE]/android",
+ "DEPOT_TOOLS": "RECIPE_REPO[depot_tools]",
+ "GRADLE_OPTS": "-Dorg.gradle.daemon=false",
+ "GRADLE_USER_HOME": "[CACHE]/gradle",
+ "LUCI_BRANCH": "",
+ "LUCI_CI": "True",
+ "LUCI_PR": "",
+ "OS": "linux",
+ "PUB_CACHE": "[START_DIR]/.pub-cache",
+ "SDK_CHECKOUT_PATH": "[START_DIR]/flutter sdk"
+ },
+ "env_prefixes": {
+ "PATH": [
+ "[START_DIR]/flutter sdk/bin",
+ "[START_DIR]/flutter sdk/bin/cache/dart-sdk/bin",
+ "[START_DIR]/flutter sdk/bin",
+ "[START_DIR]/flutter sdk/bin/cache/dart-sdk/bin"
+ ]
+ },
+ "env_suffixes": {
+ "DEPOT_TOOLS_UPDATE": [
+ "0"
+ ],
+ "PATH": [
+ "RECIPE_REPO[depot_tools]"
+ ]
+ },
+ "name": "start avd.adb start-server",
+ "~followup_annotations": [
+ "@@@STEP_NEST_LEVEL@1@@@"
+ ]
+ },
+ {
+ "cmd": [
+ "[CACHE]/builder/avd/src/third_party/android_sdk/public/platform-tools/adb",
+ "wait-for-device"
+ ],
+ "cwd": "[CACHE]/builder/avd",
+ "env": {
+ "ANDROID_HOME": "[CACHE]/android",
+ "ANDROID_SDK_ROOT": "[CACHE]/android",
+ "DEPOT_TOOLS": "RECIPE_REPO[depot_tools]",
+ "GRADLE_OPTS": "-Dorg.gradle.daemon=false",
+ "GRADLE_USER_HOME": "[CACHE]/gradle",
+ "LUCI_BRANCH": "",
+ "LUCI_CI": "True",
+ "LUCI_PR": "",
+ "OS": "linux",
+ "PUB_CACHE": "[START_DIR]/.pub-cache",
+ "SDK_CHECKOUT_PATH": "[START_DIR]/flutter sdk"
+ },
+ "env_prefixes": {
+ "PATH": [
+ "[START_DIR]/flutter sdk/bin",
+ "[START_DIR]/flutter sdk/bin/cache/dart-sdk/bin",
+ "[START_DIR]/flutter sdk/bin",
+ "[START_DIR]/flutter sdk/bin/cache/dart-sdk/bin"
+ ]
+ },
+ "env_suffixes": {
+ "DEPOT_TOOLS_UPDATE": [
+ "0"
+ ],
+ "PATH": [
+ "RECIPE_REPO[depot_tools]"
+ ]
+ },
+ "name": "start avd.adb wait-for-device",
+ "~followup_annotations": [
+ "@@@STEP_NEST_LEVEL@1@@@"
+ ]
+ },
+ {
+ "cmd": [
+ "[CACHE]/builder/avd/src/third_party/android_sdk/public/platform-tools/adb",
+ "-s",
+ "emulator-5554",
+ "shell",
+ "while [[ -z $(getprop sys.boot_completed) ]]; do sleep 1; done;"
+ ],
+ "cwd": "[CACHE]/builder/avd",
+ "env": {
+ "ANDROID_HOME": "[CACHE]/android",
+ "ANDROID_SDK_ROOT": "[CACHE]/android",
+ "DEPOT_TOOLS": "RECIPE_REPO[depot_tools]",
+ "GRADLE_OPTS": "-Dorg.gradle.daemon=false",
+ "GRADLE_USER_HOME": "[CACHE]/gradle",
+ "LUCI_BRANCH": "",
+ "LUCI_CI": "True",
+ "LUCI_PR": "",
+ "OS": "linux",
+ "PUB_CACHE": "[START_DIR]/.pub-cache",
+ "SDK_CHECKOUT_PATH": "[START_DIR]/flutter sdk"
+ },
+ "env_prefixes": {
+ "PATH": [
+ "[START_DIR]/flutter sdk/bin",
+ "[START_DIR]/flutter sdk/bin/cache/dart-sdk/bin",
+ "[START_DIR]/flutter sdk/bin",
+ "[START_DIR]/flutter sdk/bin/cache/dart-sdk/bin"
+ ]
+ },
+ "env_suffixes": {
+ "DEPOT_TOOLS_UPDATE": [
+ "0"
+ ],
+ "PATH": [
+ "RECIPE_REPO[depot_tools]"
+ ]
+ },
+ "name": "start avd.adb wait until booted completed",
+ "~followup_annotations": [
+ "@@@STEP_NEST_LEVEL@1@@@"
+ ]
+ },
+ {
+ "cmd": [
+ "[CACHE]/builder/avd/src/third_party/android_sdk/public/platform-tools/adb",
+ "devices"
+ ],
+ "cwd": "[CACHE]/builder/avd",
+ "env": {
+ "ANDROID_HOME": "[CACHE]/android",
+ "ANDROID_SDK_ROOT": "[CACHE]/android",
+ "DEPOT_TOOLS": "RECIPE_REPO[depot_tools]",
+ "GRADLE_OPTS": "-Dorg.gradle.daemon=false",
+ "GRADLE_USER_HOME": "[CACHE]/gradle",
+ "LUCI_BRANCH": "",
+ "LUCI_CI": "True",
+ "LUCI_PR": "",
+ "OS": "linux",
+ "PUB_CACHE": "[START_DIR]/.pub-cache",
+ "SDK_CHECKOUT_PATH": "[START_DIR]/flutter sdk"
+ },
+ "env_prefixes": {
+ "PATH": [
+ "[START_DIR]/flutter sdk/bin",
+ "[START_DIR]/flutter sdk/bin/cache/dart-sdk/bin",
+ "[START_DIR]/flutter sdk/bin",
+ "[START_DIR]/flutter sdk/bin/cache/dart-sdk/bin"
+ ]
+ },
+ "env_suffixes": {
+ "DEPOT_TOOLS_UPDATE": [
+ "0"
+ ],
+ "PATH": [
+ "RECIPE_REPO[depot_tools]"
+ ]
+ },
+ "name": "start avd.adb devices",
+ "~followup_annotations": [
+ "@@@STEP_NEST_LEVEL@1@@@"
+ ]
+ },
+ {
+ "cmd": [
+ "[CACHE]/builder/avd/src/third_party/android_sdk/public/platform-tools/adb",
+ "shell",
+ "input",
+ "keyevent",
+ "82"
+ ],
+ "cwd": "[CACHE]/builder/avd",
+ "env": {
+ "ANDROID_HOME": "[CACHE]/android",
+ "ANDROID_SDK_ROOT": "[CACHE]/android",
+ "DEPOT_TOOLS": "RECIPE_REPO[depot_tools]",
+ "GRADLE_OPTS": "-Dorg.gradle.daemon=false",
+ "GRADLE_USER_HOME": "[CACHE]/gradle",
+ "LUCI_BRANCH": "",
+ "LUCI_CI": "True",
+ "LUCI_PR": "",
+ "OS": "linux",
+ "PUB_CACHE": "[START_DIR]/.pub-cache",
+ "SDK_CHECKOUT_PATH": "[START_DIR]/flutter sdk"
+ },
+ "env_prefixes": {
+ "PATH": [
+ "[START_DIR]/flutter sdk/bin",
+ "[START_DIR]/flutter sdk/bin/cache/dart-sdk/bin",
+ "[START_DIR]/flutter sdk/bin",
+ "[START_DIR]/flutter sdk/bin/cache/dart-sdk/bin"
+ ]
+ },
+ "env_suffixes": {
+ "DEPOT_TOOLS_UPDATE": [
+ "0"
+ ],
+ "PATH": [
+ "RECIPE_REPO[depot_tools]"
+ ]
+ },
+ "name": "start avd.adb shell input keyevent 82",
+ "~followup_annotations": [
+ "@@@STEP_NEST_LEVEL@1@@@"
+ ]
+ },
+ {
+ "cmd": [
+ "[CACHE]/builder/avd/src/third_party/android_sdk/public/platform-tools/adb",
+ "shell",
+ "settings",
+ "put",
+ "global",
+ "development_settings_enabled",
+ "1"
+ ],
+ "cwd": "[CACHE]/builder/avd",
+ "env": {
+ "ANDROID_HOME": "[CACHE]/android",
+ "ANDROID_SDK_ROOT": "[CACHE]/android",
+ "DEPOT_TOOLS": "RECIPE_REPO[depot_tools]",
+ "GRADLE_OPTS": "-Dorg.gradle.daemon=false",
+ "GRADLE_USER_HOME": "[CACHE]/gradle",
+ "LUCI_BRANCH": "",
+ "LUCI_CI": "True",
+ "LUCI_PR": "",
+ "OS": "linux",
+ "PUB_CACHE": "[START_DIR]/.pub-cache",
+ "SDK_CHECKOUT_PATH": "[START_DIR]/flutter sdk"
+ },
+ "env_prefixes": {
+ "PATH": [
+ "[START_DIR]/flutter sdk/bin",
+ "[START_DIR]/flutter sdk/bin/cache/dart-sdk/bin",
+ "[START_DIR]/flutter sdk/bin",
+ "[START_DIR]/flutter sdk/bin/cache/dart-sdk/bin"
+ ]
+ },
+ "env_suffixes": {
+ "DEPOT_TOOLS_UPDATE": [
+ "0"
+ ],
+ "PATH": [
+ "RECIPE_REPO[depot_tools]"
+ ]
+ },
+ "name": "start avd.adb shell settings put global development_settings_enabled 1",
+ "~followup_annotations": [
+ "@@@STEP_NEST_LEVEL@1@@@"
+ ]
+ },
+ {
+ "cmd": [],
+ "name": "prepare environment"
+ },
+ {
+ "cmd": [
+ "flutter",
+ "config",
+ "--no-analytics"
+ ],
+ "cwd": "[START_DIR]/flutter sdk",
+ "env": {
+ "ANDROID_HOME": "[CACHE]/android",
+ "ANDROID_SDK_ROOT": "[CACHE]/android",
+ "DEPOT_TOOLS": "RECIPE_REPO[depot_tools]",
+ "GRADLE_OPTS": "-Dorg.gradle.daemon=false",
+ "GRADLE_USER_HOME": "[CACHE]/gradle",
+ "LUCI_BRANCH": "",
+ "LUCI_CI": "True",
+ "LUCI_PR": "",
+ "OS": "linux",
+ "PUB_CACHE": "[START_DIR]/.pub-cache",
+ "SDK_CHECKOUT_PATH": "[START_DIR]/flutter sdk"
+ },
+ "env_prefixes": {
+ "PATH": [
+ "[START_DIR]/flutter sdk/bin",
+ "[START_DIR]/flutter sdk/bin/cache/dart-sdk/bin",
+ "[START_DIR]/flutter sdk/bin",
+ "[START_DIR]/flutter sdk/bin/cache/dart-sdk/bin"
+ ]
+ },
+ "env_suffixes": {
+ "DEPOT_TOOLS_UPDATE": [
+ "0"
+ ],
+ "PATH": [
+ "RECIPE_REPO[depot_tools]"
+ ]
+ },
+ "name": "prepare environment.flutter config --no-analytics",
+ "~followup_annotations": [
+ "@@@STEP_NEST_LEVEL@1@@@"
+ ]
+ },
+ {
+ "cmd": [
+ "flutter",
+ "doctor"
+ ],
+ "cwd": "[START_DIR]/flutter sdk",
+ "env": {
+ "ANDROID_HOME": "[CACHE]/android",
+ "ANDROID_SDK_ROOT": "[CACHE]/android",
+ "DEPOT_TOOLS": "RECIPE_REPO[depot_tools]",
+ "GRADLE_OPTS": "-Dorg.gradle.daemon=false",
+ "GRADLE_USER_HOME": "[CACHE]/gradle",
+ "LUCI_BRANCH": "",
+ "LUCI_CI": "True",
+ "LUCI_PR": "",
+ "OS": "linux",
+ "PUB_CACHE": "[START_DIR]/.pub-cache",
+ "SDK_CHECKOUT_PATH": "[START_DIR]/flutter sdk"
+ },
+ "env_prefixes": {
+ "PATH": [
+ "[START_DIR]/flutter sdk/bin",
+ "[START_DIR]/flutter sdk/bin/cache/dart-sdk/bin",
+ "[START_DIR]/flutter sdk/bin",
+ "[START_DIR]/flutter sdk/bin/cache/dart-sdk/bin"
+ ]
+ },
+ "env_suffixes": {
+ "DEPOT_TOOLS_UPDATE": [
+ "0"
+ ],
+ "PATH": [
+ "RECIPE_REPO[depot_tools]"
+ ]
+ },
+ "name": "prepare environment.flutter doctor",
+ "~followup_annotations": [
+ "@@@STEP_NEST_LEVEL@1@@@"
+ ]
+ },
+ {
+ "cmd": [
+ "flutter",
+ "devices",
+ "--device-timeout=40",
+ "--verbose"
+ ],
+ "cwd": "[START_DIR]/flutter sdk",
+ "env": {
+ "ANDROID_HOME": "[CACHE]/android",
+ "ANDROID_SDK_ROOT": "[CACHE]/android",
+ "DEPOT_TOOLS": "RECIPE_REPO[depot_tools]",
+ "GRADLE_OPTS": "-Dorg.gradle.daemon=false",
+ "GRADLE_USER_HOME": "[CACHE]/gradle",
+ "LUCI_BRANCH": "",
+ "LUCI_CI": "True",
+ "LUCI_PR": "",
+ "OS": "linux",
+ "PUB_CACHE": "[START_DIR]/.pub-cache",
+ "SDK_CHECKOUT_PATH": "[START_DIR]/flutter sdk"
+ },
+ "env_prefixes": {
+ "PATH": [
+ "[START_DIR]/flutter sdk/bin",
+ "[START_DIR]/flutter sdk/bin/cache/dart-sdk/bin",
+ "[START_DIR]/flutter sdk/bin",
+ "[START_DIR]/flutter sdk/bin/cache/dart-sdk/bin"
+ ]
+ },
+ "env_suffixes": {
+ "DEPOT_TOOLS_UPDATE": [
+ "0"
+ ],
+ "PATH": [
+ "RECIPE_REPO[depot_tools]"
+ ]
+ },
+ "name": "prepare environment.flutter devices",
+ "~followup_annotations": [
+ "@@@STEP_NEST_LEVEL@1@@@"
+ ]
+ },
+ {
+ "cmd": [
+ "flutter",
+ "update-packages"
+ ],
+ "cwd": "[START_DIR]/flutter sdk",
+ "env": {
+ "ANDROID_HOME": "[CACHE]/android",
+ "ANDROID_SDK_ROOT": "[CACHE]/android",
+ "DEPOT_TOOLS": "RECIPE_REPO[depot_tools]",
+ "GRADLE_OPTS": "-Dorg.gradle.daemon=false",
+ "GRADLE_USER_HOME": "[CACHE]/gradle",
+ "LUCI_BRANCH": "",
+ "LUCI_CI": "True",
+ "LUCI_PR": "",
+ "OS": "linux",
+ "PUB_CACHE": "[START_DIR]/.pub-cache",
+ "SDK_CHECKOUT_PATH": "[START_DIR]/flutter sdk"
+ },
+ "env_prefixes": {
+ "PATH": [
+ "[START_DIR]/flutter sdk/bin",
+ "[START_DIR]/flutter sdk/bin/cache/dart-sdk/bin",
+ "[START_DIR]/flutter sdk/bin",
+ "[START_DIR]/flutter sdk/bin/cache/dart-sdk/bin"
+ ]
+ },
+ "env_suffixes": {
+ "DEPOT_TOOLS_UPDATE": [
+ "0"
+ ],
+ "PATH": [
+ "RECIPE_REPO[depot_tools]"
+ ]
+ },
+ "infra_step": true,
+ "name": "prepare environment.download dependencies",
+ "~followup_annotations": [
+ "@@@STEP_NEST_LEVEL@1@@@"
+ ]
+ },
+ {
+ "cmd": [
+ "flutter",
+ "drive",
+ "--browser-name=android-chrome",
+ "--android-emulator",
+ "--no-start-paused",
+ "--purge-persistent-cache",
+ "--device-timeout=30"
+ ],
+ "cwd": "[START_DIR]/flutter sdk/dev/integration_tests/android_views",
+ "env": {
+ "ANDROID_HOME": "[CACHE]/android",
+ "ANDROID_SDK_ROOT": "[CACHE]/android",
+ "DEPOT_TOOLS": "RECIPE_REPO[depot_tools]",
+ "GRADLE_OPTS": "-Dorg.gradle.daemon=false",
+ "GRADLE_USER_HOME": "[CACHE]/gradle",
+ "LUCI_BRANCH": "",
+ "LUCI_CI": "True",
+ "LUCI_PR": "",
+ "OS": "linux",
+ "PUB_CACHE": "[START_DIR]/.pub-cache",
+ "SDK_CHECKOUT_PATH": "[START_DIR]/flutter sdk"
+ },
+ "env_prefixes": {
+ "PATH": [
+ "[START_DIR]/flutter sdk/bin",
+ "[START_DIR]/flutter sdk/bin/cache/dart-sdk/bin",
+ "[START_DIR]/flutter sdk/bin",
+ "[START_DIR]/flutter sdk/bin/cache/dart-sdk/bin"
+ ]
+ },
+ "env_suffixes": {
+ "DEPOT_TOOLS_UPDATE": [
+ "0"
+ ],
+ "PATH": [
+ "RECIPE_REPO[depot_tools]"
+ ]
+ },
+ "name": "Android Views Integration Tests",
+ "timeout": 700
+ },
+ {
+ "cmd": [],
+ "name": "cleanup"
+ },
+ {
+ "cmd": [
+ "kill",
+ "-9",
+ "17687"
+ ],
+ "name": "cleanup.Kill emulator cleanup",
+ "~followup_annotations": [
+ "@@@STEP_NEST_LEVEL@1@@@"
+ ]
+ },
+ {
+ "cmd": [
+ "ps",
+ "-axww"
+ ],
+ "name": "cleanup.list processes",
+ "~followup_annotations": [
+ "@@@STEP_NEST_LEVEL@1@@@"
+ ]
+ },
+ {
+ "cmd": [
+ "kill",
+ "-9",
+ "12345"
+ ],
+ "name": "cleanup.Kill zombie processes",
+ "~followup_annotations": [
+ "@@@STEP_NEST_LEVEL@1@@@"
+ ]
+ },
+ {
+ "cmd": [],
+ "name": "cleanup.Killing Processes",
+ "~followup_annotations": [
+ "@@@STEP_NEST_LEVEL@1@@@"
+ ]
+ },
+ {
+ "cmd": [
+ "pkill",
+ "chrome"
+ ],
+ "infra_step": true,
+ "name": "cleanup.Killing Processes.kill chrome",
+ "~followup_annotations": [
+ "@@@STEP_NEST_LEVEL@2@@@"
+ ]
+ },
+ {
+ "cmd": [
+ "pkill",
+ "dart"
+ ],
+ "infra_step": true,
+ "name": "cleanup.Killing Processes.kill dart",
+ "~followup_annotations": [
+ "@@@STEP_NEST_LEVEL@2@@@"
+ ]
+ },
+ {
+ "cmd": [
+ "pkill",
+ "flutter"
+ ],
+ "infra_step": true,
+ "name": "cleanup.Killing Processes.kill flutter",
+ "~followup_annotations": [
+ "@@@STEP_NEST_LEVEL@2@@@"
+ ]
+ },
+ {
+ "cmd": [
+ "pkill",
+ "java"
+ ],
+ "infra_step": true,
+ "name": "cleanup.Killing Processes.kill java",
+ "~followup_annotations": [
+ "@@@STEP_NEST_LEVEL@2@@@"
+ ]
+ },
+ {
+ "cmd": [
+ "pkill",
+ "adb"
+ ],
+ "infra_step": true,
+ "name": "cleanup.Killing Processes.kill adb",
+ "~followup_annotations": [
+ "@@@STEP_NEST_LEVEL@2@@@"
+ ]
+ },
+ {
+ "cmd": [
+ "top",
+ "-b",
+ "-n",
+ "3",
+ "-o",
+ "%MEM"
+ ],
+ "infra_step": true,
+ "name": "cleanup.OS info",
+ "~followup_annotations": [
+ "@@@STEP_NEST_LEVEL@1@@@"
+ ]
+ },
+ {
+ "name": "$result"
+ }
+]
\ No newline at end of file
diff --git a/recipes/flutter/android_views.py b/recipes/flutter/android_views.py
new file mode 100644
index 0000000..af7945e
--- /dev/null
+++ b/recipes/flutter/android_views.py
@@ -0,0 +1,214 @@
+# Copyright 2020 The Chromium Authors. All rights reserved.
+# Use of this source code is governed by a BSD-style license that can be
+# found in the LICENSE file.
+
+from contextlib import contextmanager
+import re
+
+from PB.recipes.flutter.engine import InputProperties
+from PB.recipes.flutter.engine import EnvProperties
+
+DEPS = [
+ 'depot_tools/depot_tools',
+ 'flutter/os_utils',
+ 'flutter/repo_util',
+ 'flutter/flutter_deps',
+ 'recipe_engine/context',
+ 'recipe_engine/path',
+ 'recipe_engine/platform',
+ 'recipe_engine/properties',
+ 'recipe_engine/cipd',
+ 'recipe_engine/file',
+ 'recipe_engine/python',
+ 'recipe_engine/raw_io',
+ 'recipe_engine/step',
+]
+
+PROPERTIES = InputProperties
+ENV_PROPERTIES = EnvProperties
+
+def KillZombieEmulatorProcesses(api):
+ # Kill zombie processes left over by QEMU on the host.
+ step_result = api.step('list processes', ['ps', '-axww'], stdout=api.raw_io.output())
+ zombieList = ['pm serve', 'qemu-system']
+ killCommand = ['kill', '-9']
+ for line in step_result.get_result().stdout.splitlines():
+ # Check if current process has zombie process substring.
+ if any(zombie in line for zombie in zombieList):
+ killCommand.append(line.split(None, 1)[0])
+ if len(killCommand) > 2:
+ api.step('Kill zombie processes', killCommand)
+
+def RunSteps(api, properties, env_properties):
+ # Collect memory/cpu/process before task execution.
+ api.os_utils.collect_os_info()
+ api.os_utils.print_pub_certs()
+
+ cache_root = api.path['cache'].join('builder')
+
+ api.file.ensure_directory('Ensure root cache', cache_root)
+
+ checkout_path = api.path['start_dir'].join('flutter sdk')
+ with api.step.nest('checkout source code'):
+ api.repo_util.checkout(
+ 'flutter',
+ checkout_path=checkout_path,
+ url=api.properties.get('git_url'),
+ ref=api.properties.get('git_ref'),
+ )
+
+ env, env_prefixes = api.repo_util.flutter_environment(checkout_path)
+ api.flutter_deps.required_deps(
+ env, env_prefixes, api.properties.get('dependencies', [{'dependency': 'android_sdk'}])
+ )
+ with api.context(env=env, env_prefixes=env_prefixes, cwd=cache_root), api.depot_tools.on_path():
+ avd_cache_dir = cache_root.join('avd')
+ api.file.ensure_directory('Ensure avd cache', avd_cache_dir)
+ # Download and install AVD
+ api.cipd.ensure(
+ avd_cache_dir,
+ api.cipd.EnsureFile().add_package(
+ 'chromium/tools/android/avd/linux-amd64',
+ 'p-1EgH-og45NbJT5ld4bBmvhayUxyb5Wm0oedSBwXOsC'
+ )
+ )
+
+ avd_script_path = avd_cache_dir.join(
+ 'src', 'tools', 'android', 'avd', 'avd.py'
+ )
+ avd_config = avd_cache_dir.join(
+ 'src', 'tools', 'android', 'avd', 'proto', 'generic_android31.textpb'
+ )
+
+ adb_script_path = avd_cache_dir.join(
+ 'src', 'third_party', 'android_sdk', 'public', 'platform-tools', 'adb'
+ )
+
+ emulator_pid = ''
+ with api.context(env=env, env_prefixes=env_prefixes, cwd=avd_cache_dir):
+ with api.step.nest('start avd'):
+ api.python(
+ 'Install Android emulator (API level 31)', avd_script_path,
+ ['install', '--avd-config', avd_config]
+ )
+ output = api.python(
+ 'Start Android emulator (API level 31)',
+ avd_script_path,
+ ['start', '--no-read-only', '--writable-system', '--avd-config', avd_config],
+ stdout=api.raw_io.output()
+ ).stdout
+ m = re.match('.*pid: (\d+)\)', output)
+ emulator_pid = m.group(1)
+
+ api.step(
+ 'adb kill-server',
+ [str(adb_script_path), 'kill-server'],
+ )
+ api.step(
+ 'adb start-server',
+ [str(adb_script_path), 'start-server'],
+ )
+ # Wait for avd to initialize
+ api.step(
+ 'adb wait-for-device',
+ [str(adb_script_path), 'wait-for-device'],
+ )
+ # Wait for avd to reach home screen
+ api.step(
+ 'adb wait until booted completed',
+ [
+ str(adb_script_path),
+ '-s',
+ 'emulator-5554',
+ 'shell',
+ 'while [[ -z $(getprop sys.boot_completed) ]]; do sleep 1; done;'
+ ],
+ )
+ api.step(
+ 'adb devices',
+ [str(adb_script_path), 'devices'],
+ )
+ # unlock avd
+ api.step(
+ 'adb shell input keyevent 82',
+ [str(adb_script_path), 'shell', 'input', 'keyevent', '82'],
+ )
+ # Ensure developer mode is enabled
+ api.step(
+ 'adb shell settings put global development_settings_enabled 1',
+ [str(adb_script_path), 'shell', 'settings', 'put', 'global', 'development_settings_enabled', '1'],
+ )
+
+ with api.context(env=env, env_prefixes=env_prefixes, cwd=checkout_path):
+ with api.step.nest('prepare environment'), api.step.defer_results():
+ # This prevents junk analytics from being sent due to testing
+ api.step(
+ 'flutter config --no-analytics',
+ ['flutter', 'config', '--no-analytics'],
+ )
+ api.step(
+ 'flutter doctor',
+ ['flutter', 'doctor'],
+ )
+ api.step(
+ 'flutter devices',
+ ['flutter', 'devices', '--device-timeout=40', '--verbose'],
+ )
+ api.step(
+ 'download dependencies',
+ ['flutter', 'update-packages'],
+ infra_step=True,
+ )
+ views_test_dir = checkout_path.join('dev', 'integration_tests', 'android_views')
+ with api.context(env=env, env_prefixes=env_prefixes, cwd=views_test_dir):
+ api.step(
+ 'Android Views Integration Tests',
+ [
+ 'flutter',
+ 'drive',
+ '--browser-name=android-chrome',
+ '--android-emulator',
+ '--no-start-paused',
+ '--purge-persistent-cache',
+ '--device-timeout=30'
+ ],
+ timeout=700,
+ )
+
+ with api.step.nest('cleanup'), api.step.defer_results():
+ api.step('Kill emulator cleanup', ['kill', '-9', emulator_pid])
+ KillZombieEmulatorProcesses(api)
+ # This is to clean up leaked processes.
+ api.os_utils.kill_processes()
+ # Collect memory/cpu/process after task execution.
+ api.os_utils.collect_os_info()
+
+
+def GenTests(api):
+ checkout_path = api.path['start_dir'].join('flutter sdk')
+ yield api.test(
+ 'flutter_drive_clean_exit',
+ api.repo_util.flutter_environment_data(checkout_dir=checkout_path),
+ api.step_data(
+ 'start avd.Start Android emulator (API level 31)',
+ stdout=api.raw_io.output_text(
+ 'android_31_google_apis_x86|emulator-5554 started (pid: 17687)'
+ )
+ ),
+ )
+ yield api.test(
+ 'flutter_drive_zombie_process',
+ api.repo_util.flutter_environment_data(checkout_dir=checkout_path),
+ api.step_data(
+ 'start avd.Start Android emulator (API level 31)',
+ stdout=api.raw_io.output_text(
+ 'android_31_google_apis_x86|emulator-5554 started (pid: 17687)'
+ )
+ ),
+ api.step_data(
+ 'cleanup.list processes',
+ stdout=api.raw_io.output_text(
+ '12345 qemu-system blah'
+ )
+ ),
+ )