Add coverage recipe.
This recipe will be used for builds running as low priority and not
blocking the build. This is going to be a very expensive build running
from 90 minutes.
Bug: https://github.com/flutter/flutter/issues/81803
Change-Id: Ic4e6f9c99fd154fee8024e96d6ce07d74b15f126
Reviewed-on: https://flutter-review.googlesource.com/c/recipes/+/34740
Reviewed-by: Ricardo Amador <ricardoamador@google.com>
Commit-Queue: Godofredo Contreras <godofredoc@google.com>
diff --git a/recipes/flutter/coverage.expected/coverage.json b/recipes/flutter/coverage.expected/coverage.json
new file mode 100644
index 0000000..d2cf01c
--- /dev/null
+++ b/recipes/flutter/coverage.expected/coverage.json
@@ -0,0 +1,259 @@
+[
+ {
+ "cmd": [],
+ "name": "checkout source code"
+ },
+ {
+ "cmd": [],
+ "name": "checkout source code.Checkout flutter/flutter",
+ "~followup_annotations": [
+ "@@@STEP_NEST_LEVEL@1@@@"
+ ]
+ },
+ {
+ "cmd": [
+ "python3",
+ "-u",
+ "RECIPE_MODULE[depot_tools::git]/resources/git_setup.py",
+ "--path",
+ "[START_DIR]/flutter sdk",
+ "--url",
+ "https://flutter.googlesource.com/mirrors/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": [
+ "git",
+ "rev-parse",
+ "HEAD"
+ ],
+ "cwd": "[START_DIR]/flutter sdk",
+ "infra_step": true,
+ "name": "git rev-parse"
+ },
+ {
+ "cmd": [],
+ "name": "prepare environment"
+ },
+ {
+ "cmd": [
+ "flutter",
+ "doctor"
+ ],
+ "cwd": "[START_DIR]/flutter sdk/packages/flutter",
+ "env": {
+ "DEPOT_TOOLS": "RECIPE_REPO[depot_tools]",
+ "GIT_BRANCH": "",
+ "LUCI_BRANCH": "",
+ "LUCI_CI": "True",
+ "LUCI_PR": "",
+ "OS": "linux",
+ "PUB_CACHE": "[START_DIR]/.pub-cache",
+ "REVISION": "",
+ "SDK_CHECKOUT_PATH": "[START_DIR]/flutter sdk"
+ },
+ "env_prefixes": {
+ "PATH": [
+ "[START_DIR]/flutter sdk/bin",
+ "[START_DIR]/flutter sdk/bin/cache/dart-sdk/bin"
+ ]
+ },
+ "name": "prepare environment.flutter doctor",
+ "~followup_annotations": [
+ "@@@STEP_NEST_LEVEL@1@@@"
+ ]
+ },
+ {
+ "cmd": [
+ "flutter",
+ "update-packages"
+ ],
+ "cwd": "[START_DIR]/flutter sdk/packages/flutter",
+ "env": {
+ "DEPOT_TOOLS": "RECIPE_REPO[depot_tools]",
+ "GIT_BRANCH": "",
+ "LUCI_BRANCH": "",
+ "LUCI_CI": "True",
+ "LUCI_PR": "",
+ "OS": "linux",
+ "PUB_CACHE": "[START_DIR]/.pub-cache",
+ "REVISION": "",
+ "SDK_CHECKOUT_PATH": "[START_DIR]/flutter sdk"
+ },
+ "env_prefixes": {
+ "PATH": [
+ "[START_DIR]/flutter sdk/bin",
+ "[START_DIR]/flutter sdk/bin/cache/dart-sdk/bin"
+ ]
+ },
+ "infra_step": true,
+ "name": "prepare environment.download dependencies",
+ "~followup_annotations": [
+ "@@@STEP_NEST_LEVEL@1@@@"
+ ]
+ },
+ {
+ "cmd": [
+ "flutter",
+ "test",
+ "--coverage",
+ "-j",
+ "1"
+ ],
+ "cwd": "[START_DIR]/flutter sdk/packages/flutter",
+ "env": {
+ "DEPOT_TOOLS": "RECIPE_REPO[depot_tools]",
+ "GIT_BRANCH": "",
+ "LUCI_BRANCH": "",
+ "LUCI_CI": "True",
+ "LUCI_PR": "",
+ "OS": "linux",
+ "PUB_CACHE": "[START_DIR]/.pub-cache",
+ "REVISION": "",
+ "SDK_CHECKOUT_PATH": "[START_DIR]/flutter sdk"
+ },
+ "env_prefixes": {
+ "PATH": [
+ "[START_DIR]/flutter sdk/bin",
+ "[START_DIR]/flutter sdk/bin/cache/dart-sdk/bin"
+ ]
+ },
+ "name": "flutter coverage"
+ },
+ {
+ "cmd": [
+ "python3",
+ "-u",
+ "RECIPE_MODULE[depot_tools::gsutil]/resources/gsutil_smart_retry.py",
+ "--",
+ "RECIPE_REPO[depot_tools]/gsutil.py",
+ "-m",
+ "----",
+ "cp",
+ "[START_DIR]/flutter sdk/packages/flutter/coverage/lcov.info",
+ "gs://flutter_infra_release/flutter/coverage/lcov.info"
+ ],
+ "cwd": "[START_DIR]/flutter sdk/packages/flutter",
+ "env": {
+ "DEPOT_TOOLS": "RECIPE_REPO[depot_tools]",
+ "GIT_BRANCH": "",
+ "LUCI_BRANCH": "",
+ "LUCI_CI": "True",
+ "LUCI_PR": "",
+ "OS": "linux",
+ "PUB_CACHE": "[START_DIR]/.pub-cache",
+ "REVISION": "",
+ "SDK_CHECKOUT_PATH": "[START_DIR]/flutter sdk"
+ },
+ "env_prefixes": {
+ "PATH": [
+ "[START_DIR]/flutter sdk/bin",
+ "[START_DIR]/flutter sdk/bin/cache/dart-sdk/bin"
+ ]
+ },
+ "infra_step": true,
+ "name": "gsutil upload lcov.info",
+ "~followup_annotations": [
+ "@@@STEP_LINK@lcov.info@https://storage.googleapis.com/flutter_infra_release/flutter/coverage/lcov.info@@@"
+ ]
+ },
+ {
+ "name": "$result"
+ }
+]
\ No newline at end of file
diff --git a/recipes/flutter/coverage.py b/recipes/flutter/coverage.py
new file mode 100644
index 0000000..6be5da4
--- /dev/null
+++ b/recipes/flutter/coverage.py
@@ -0,0 +1,65 @@
+# Copyright 2022 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.
+
+DEPS = [
+ 'depot_tools/gsutil',
+ 'flutter/flutter_deps',
+ 'flutter/repo_util',
+ 'recipe_engine/context',
+ 'recipe_engine/path',
+ 'recipe_engine/properties',
+ 'recipe_engine/step',
+]
+
+
+def RunSteps(api):
+ """Recipe to collect coverage used by the flutter tool."""
+ 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', [])
+ )
+
+ packages_path = checkout_path.join('packages', 'flutter')
+ with api.context(env=env, env_prefixes=env_prefixes, cwd=packages_path):
+ with api.step.nest('prepare environment'), api.step.defer_results():
+ api.step(
+ 'flutter doctor',
+ ['flutter', 'doctor'],
+ )
+ api.step(
+ 'download dependencies',
+ ['flutter', 'update-packages'],
+ infra_step=True,
+ )
+
+ api.step(
+ 'flutter coverage',
+ ['flutter', 'test', '--coverage', '-j', '1'],
+ )
+ lcov_path = packages_path.join('coverage', 'lcov.info')
+ api.gsutil.upload(
+ bucket='flutter_infra_release',
+ source=lcov_path,
+ dest='flutter/coverage/lcov.info',
+ link_name='lcov.info',
+ multithreaded=True,
+ name='upload lcov.info',
+ unauthenticated_url=True
+ )
+
+
+def GenTests(api):
+ yield api.test(
+ 'coverage',
+ api.repo_util.flutter_environment_data()
+ )