aboutsummaryrefslogtreecommitdiffhomepage
path: root/infra/bots/recipe_modules
diff options
context:
space:
mode:
authorGravatar Eric Boren <borenet@google.com>2017-04-18 15:49:27 -0400
committerGravatar Skia Commit-Bot <skia-commit-bot@chromium.org>2017-04-19 11:24:24 +0000
commite16fb7584a15802949d1eb8b4ad60952619da7d4 (patch)
tree948e2e2d4c9caf2a2994249559f9ba1680d48a97 /infra/bots/recipe_modules
parentc1e9617e82a2d573c890ee17e69a3d4699800f05 (diff)
Recipes: Use strict coverage, part 1
Shouldn't change any behavior. Bug: skia: Change-Id: I953e0da886a6d61096eba7915101f245a6cec741 Reviewed-on: https://skia-review.googlesource.com/13765 Reviewed-by: Ravi Mistry <rmistry@google.com> Commit-Queue: Eric Boren <borenet@google.com>
Diffstat (limited to 'infra/bots/recipe_modules')
-rw-r--r--infra/bots/recipe_modules/builder_name_schema/__init__.py4
-rw-r--r--infra/bots/recipe_modules/builder_name_schema/api.py7
-rw-r--r--infra/bots/recipe_modules/builder_name_schema/builder_name_schema.json3
-rw-r--r--infra/bots/recipe_modules/builder_name_schema/builder_name_schema.py54
-rw-r--r--infra/bots/recipe_modules/builder_name_schema/example.expected/test.json7
-rw-r--r--infra/bots/recipe_modules/builder_name_schema/example.py19
-rw-r--r--infra/bots/recipe_modules/core/__init__.py4
-rw-r--r--infra/bots/recipe_modules/core/api.py4
-rw-r--r--infra/bots/recipe_modules/core/example.expected/Housekeeper-Weekly-RecreateSKPs.json210
-rw-r--r--infra/bots/recipe_modules/core/example.expected/flutter_trybot.json142
-rw-r--r--infra/bots/recipe_modules/core/example.expected/no_persistent_checkout.json30
-rw-r--r--infra/bots/recipe_modules/core/example.expected/pdfium_trybot.json142
-rw-r--r--infra/bots/recipe_modules/core/example.expected/test.json154
-rw-r--r--infra/bots/recipe_modules/core/example.py103
-rw-r--r--infra/bots/recipe_modules/ct/__init__.py4
-rw-r--r--infra/bots/recipe_modules/ct/api.py2
-rw-r--r--infra/bots/recipe_modules/ct/example.expected/failed_gsutil.json160
-rw-r--r--infra/bots/recipe_modules/ct/example.expected/test.json156
-rw-r--r--infra/bots/recipe_modules/ct/example.py25
-rw-r--r--infra/bots/recipe_modules/run/__init__.py4
-rw-r--r--infra/bots/recipe_modules/run/api.py2
-rw-r--r--infra/bots/recipe_modules/run/example.expected/test.json260
-rw-r--r--infra/bots/recipe_modules/run/example.py69
-rw-r--r--infra/bots/recipe_modules/swarming/__init__.py4
-rw-r--r--infra/bots/recipe_modules/swarming/example.expected/test.json863
-rw-r--r--infra/bots/recipe_modules/swarming/example.py30
-rw-r--r--infra/bots/recipe_modules/vars/__init__.py4
-rw-r--r--infra/bots/recipe_modules/vars/example.expected/Build-Ubuntu-GCC-x86_64-Release-Flutter_Android.json35
-rw-r--r--infra/bots/recipe_modules/vars/example.expected/Build-Ubuntu-GCC-x86_64-Release-PDFium.json35
-rw-r--r--infra/bots/recipe_modules/vars/example.expected/Housekeeper-Weekly-RecreateSKPs.json35
-rw-r--r--infra/bots/recipe_modules/vars/example.expected/Perf-Chromecast-GCC-Chorizo-CPU-Cortex_A7-arm-Debug.json35
-rw-r--r--infra/bots/recipe_modules/vars/example.expected/Perf-Ubuntu-Clang-GCE-CPU-AVX2-x86_64-Release-ASAN.json35
-rw-r--r--infra/bots/recipe_modules/vars/example.expected/command_buffer.json35
-rw-r--r--infra/bots/recipe_modules/vars/example.expected/flutter_trybot.json35
-rw-r--r--infra/bots/recipe_modules/vars/example.expected/linux.json7
-rw-r--r--infra/bots/recipe_modules/vars/example.expected/pdfium_trybot.json35
-rw-r--r--infra/bots/recipe_modules/vars/example.expected/test.json7
-rw-r--r--infra/bots/recipe_modules/vars/example.expected/win.json35
-rw-r--r--infra/bots/recipe_modules/vars/example.expected/win_test.json35
-rw-r--r--infra/bots/recipe_modules/vars/example.py108
40 files changed, 2850 insertions, 88 deletions
diff --git a/infra/bots/recipe_modules/builder_name_schema/__init__.py b/infra/bots/recipe_modules/builder_name_schema/__init__.py
index 0b1d7673b9..a3c9297009 100644
--- a/infra/bots/recipe_modules/builder_name_schema/__init__.py
+++ b/infra/bots/recipe_modules/builder_name_schema/__init__.py
@@ -4,7 +4,3 @@
DEPS = [
]
-
-
-# TODO(borenet): Add coverage
-DISABLE_STRICT_COVERAGE = True
diff --git a/infra/bots/recipe_modules/builder_name_schema/api.py b/infra/bots/recipe_modules/builder_name_schema/api.py
index edfd683140..5ce05842c3 100644
--- a/infra/bots/recipe_modules/builder_name_schema/api.py
+++ b/infra/bots/recipe_modules/builder_name_schema/api.py
@@ -27,13 +27,8 @@ class BuilderNameSchemaApi(recipe_api.RecipeApi):
self.BUILDER_ROLE_TEST = builder_name_schema.BUILDER_ROLE_TEST
self.BUILDER_ROLES = builder_name_schema.BUILDER_ROLES
- self.TRYBOT_NAME_SUFFIX = builder_name_schema.TRYBOT_NAME_SUFFIX
-
- def MakeBuilderName(self, *args, **kwargs): # pragma: no cover
+ def MakeBuilderName(self, *args, **kwargs):
return builder_name_schema.MakeBuilderName(*args, **kwargs)
- def IsTrybot(self, *args, **kwargs): # pragma: no cover
- return builder_name_schema.IsTrybot(*args, **kwargs)
-
def DictForBuilderName(self, *args, **kwargs):
return builder_name_schema.DictForBuilderName(*args, **kwargs)
diff --git a/infra/bots/recipe_modules/builder_name_schema/builder_name_schema.json b/infra/bots/recipe_modules/builder_name_schema/builder_name_schema.json
index 6a8c92175b..62971ee975 100644
--- a/infra/bots/recipe_modules/builder_name_schema/builder_name_schema.json
+++ b/infra/bots/recipe_modules/builder_name_schema/builder_name_schema.json
@@ -38,6 +38,5 @@
"configuration"
]
},
- "builder_name_sep": "-",
- "trybot_name_suffix": "Trybot"
+ "builder_name_sep": "-"
}
diff --git a/infra/bots/recipe_modules/builder_name_schema/builder_name_schema.py b/infra/bots/recipe_modules/builder_name_schema/builder_name_schema.py
index 8319789154..b004ead532 100644
--- a/infra/bots/recipe_modules/builder_name_schema/builder_name_schema.py
+++ b/infra/bots/recipe_modules/builder_name_schema/builder_name_schema.py
@@ -33,9 +33,6 @@ BUILDER_ROLES = (BUILDER_ROLE_CANARY,
BUILDER_ROLE_PERF,
BUILDER_ROLE_TEST)
-# Suffix which distinguishes trybots from normal bots.
-TRYBOT_NAME_SUFFIX = None
-
def _LoadSchema():
""" Load the builder naming schema from the JSON file. """
@@ -65,10 +62,6 @@ def _LoadSchema():
BUILDER_NAME_SEP = _UnicodeToStr(
builder_name_schema_json['builder_name_sep'])
- global TRYBOT_NAME_SUFFIX
- TRYBOT_NAME_SUFFIX = _UnicodeToStr(
- builder_name_schema_json['trybot_name_suffix'])
-
# Since the builder roles are dictionary keys, just assert that the global
# variables above account for all of them.
assert len(BUILDER_ROLES) == len(BUILDER_NAME_SCHEMA)
@@ -79,8 +72,7 @@ def _LoadSchema():
_LoadSchema()
-def MakeBuilderName(role, extra_config=None, is_trybot=False,
- **kwargs): # pragma: no cover
+def MakeBuilderName(role, extra_config=None, **kwargs): # pragma: no cover
schema = BUILDER_NAME_SCHEMA.get(role)
if not schema: # pragma: no cover
raise ValueError('%s is not a recognized role.' % role)
@@ -96,46 +88,9 @@ def MakeBuilderName(role, extra_config=None, is_trybot=False,
name_parts.extend([kwargs[attribute] for attribute in schema])
if extra_config:
name_parts.append(extra_config)
- if is_trybot:
- name_parts.append(TRYBOT_NAME_SUFFIX)
return BUILDER_NAME_SEP.join(name_parts)
-def IsTrybot(builder_name): # pragma: no cover
- """ Returns true if builder_name refers to a trybot (as opposed to a
- waterfall bot). """
- return builder_name.endswith(TRYBOT_NAME_SUFFIX)
-
-
-def GetWaterfallBot(builder_name): # pragma: no cover
- """Returns the name of the waterfall bot for this builder. If it is not a
- trybot, builder_name is returned unchanged. If it is a trybot the name is
- returned without the trybot suffix."""
- if not IsTrybot(builder_name):
- return builder_name
- return _WithoutSuffix(builder_name, BUILDER_NAME_SEP + TRYBOT_NAME_SUFFIX)
-
-
-def TrybotName(builder_name): # pragma: no cover
- """Returns the name of the trybot clone of this builder.
-
- If the given builder is a trybot, the name is returned unchanged. If not, the
- TRYBOT_NAME_SUFFIX is appended.
- """
- if builder_name.endswith(TRYBOT_NAME_SUFFIX):
- return builder_name
- return builder_name + BUILDER_NAME_SEP + TRYBOT_NAME_SUFFIX
-
-
-def _WithoutSuffix(string, suffix): # pragma: no cover
- """ Returns a copy of string 'string', but with suffix 'suffix' removed.
- Raises ValueError if string does not end with suffix. """
- if not string.endswith(suffix):
- raise ValueError('_WithoutSuffix: string %s does not end with suffix %s' % (
- string, suffix))
- return string[:-len(suffix)]
-
-
def DictForBuilderName(builder_name):
"""Makes a dictionary containing details about the builder from its name."""
split_name = builder_name.split(BUILDER_NAME_SEP)
@@ -146,12 +101,7 @@ def DictForBuilderName(builder_name):
except: # pragma: no cover
raise ValueError('Invalid builder name: %s' % builder_name)
- result = {'is_trybot': False}
-
- if split_name[-1] == TRYBOT_NAME_SUFFIX:
- result['is_trybot'] = True
- split_name.pop()
-
+ result = {}
if split_name[0] in BUILDER_NAME_SCHEMA.keys():
key_list = BUILDER_NAME_SCHEMA[split_name[0]]
result['role'] = pop_front()
diff --git a/infra/bots/recipe_modules/builder_name_schema/example.expected/test.json b/infra/bots/recipe_modules/builder_name_schema/example.expected/test.json
new file mode 100644
index 0000000000..7726ecb249
--- /dev/null
+++ b/infra/bots/recipe_modules/builder_name_schema/example.expected/test.json
@@ -0,0 +1,7 @@
+[
+ {
+ "name": "$result",
+ "recipe_result": null,
+ "status_code": 0
+ }
+] \ No newline at end of file
diff --git a/infra/bots/recipe_modules/builder_name_schema/example.py b/infra/bots/recipe_modules/builder_name_schema/example.py
new file mode 100644
index 0000000000..451019fa46
--- /dev/null
+++ b/infra/bots/recipe_modules/builder_name_schema/example.py
@@ -0,0 +1,19 @@
+# Copyright 2017 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 = [
+ 'builder_name_schema',
+]
+
+
+def RunSteps(api):
+ name = 'Build-Ubuntu-Clang-x64-Release-Android'
+ d = api.builder_name_schema.DictForBuilderName(name)
+ got = api.builder_name_schema.MakeBuilderName(**d)
+ assert got == name
+
+
+def GenTests(api):
+ yield api.test('test')
diff --git a/infra/bots/recipe_modules/core/__init__.py b/infra/bots/recipe_modules/core/__init__.py
index 2c66e77b82..9112c1c4f8 100644
--- a/infra/bots/recipe_modules/core/__init__.py
+++ b/infra/bots/recipe_modules/core/__init__.py
@@ -9,13 +9,9 @@ DEPS = [
'depot_tools/tryserver',
'flavor',
'recipe_engine/path',
- 'recipe_engine/platform',
'recipe_engine/properties',
'recipe_engine/python',
'recipe_engine/step',
'run',
'vars',
]
-
-# TODO(borenet): Add coverage
-DISABLE_STRICT_COVERAGE = True
diff --git a/infra/bots/recipe_modules/core/api.py b/infra/bots/recipe_modules/core/api.py
index 005ee27733..28a5d1fa10 100644
--- a/infra/bots/recipe_modules/core/api.py
+++ b/infra/bots/recipe_modules/core/api.py
@@ -36,8 +36,8 @@ class SkiaApi(recipe_api.RecipeApi):
def update_repo(self, parent_dir, repo):
"""Update an existing repo. This is safe to call without gen_steps."""
repo_path = parent_dir.join(repo.name)
- if self.m.path.exists(repo_path): # pragma: nocover
- if self.m.platform.is_win:
+ if self.m.path.exists(repo_path) or self._test_data.enabled:
+ if 'Win' in self.m.properties.get('buildername', ''):
git = 'git.bat'
else:
git = 'git'
diff --git a/infra/bots/recipe_modules/core/example.expected/Housekeeper-Weekly-RecreateSKPs.json b/infra/bots/recipe_modules/core/example.expected/Housekeeper-Weekly-RecreateSKPs.json
new file mode 100644
index 0000000000..64b600d718
--- /dev/null
+++ b/infra/bots/recipe_modules/core/example.expected/Housekeeper-Weekly-RecreateSKPs.json
@@ -0,0 +1,210 @@
+[
+ {
+ "cmd": [
+ "python",
+ "-u",
+ "\nimport sys, os\npath = sys.argv[1]\nmode = int(sys.argv[2])\nif not os.path.isdir(path):\n if os.path.exists(path):\n print \"%s exists but is not a dir\" % path\n sys.exit(1)\n os.makedirs(path, mode)\n",
+ "[CUSTOM_/_B_WORK]",
+ "511"
+ ],
+ "infra_step": true,
+ "name": "makedirs checkout_path",
+ "~followup_annotations": [
+ "@@@STEP_LOG_LINE@python.inline@@@@",
+ "@@@STEP_LOG_LINE@python.inline@import sys, os@@@",
+ "@@@STEP_LOG_LINE@python.inline@path = sys.argv[1]@@@",
+ "@@@STEP_LOG_LINE@python.inline@mode = int(sys.argv[2])@@@",
+ "@@@STEP_LOG_LINE@python.inline@if not os.path.isdir(path):@@@",
+ "@@@STEP_LOG_LINE@python.inline@ if os.path.exists(path):@@@",
+ "@@@STEP_LOG_LINE@python.inline@ print \"%s exists but is not a dir\" % path@@@",
+ "@@@STEP_LOG_LINE@python.inline@ sys.exit(1)@@@",
+ "@@@STEP_LOG_LINE@python.inline@ os.makedirs(path, mode)@@@",
+ "@@@STEP_LOG_END@python.inline@@@"
+ ]
+ },
+ {
+ "cmd": [
+ "git",
+ "remote",
+ "set-url",
+ "origin",
+ "https://skia.googlesource.com/skia.git"
+ ],
+ "cwd": "[CUSTOM_/_B_WORK]/skia",
+ "infra_step": true,
+ "name": "git remote set-url"
+ },
+ {
+ "cmd": [
+ "git",
+ "fetch"
+ ],
+ "cwd": "[CUSTOM_/_B_WORK]/skia",
+ "infra_step": true,
+ "name": "git fetch"
+ },
+ {
+ "cmd": [
+ "git",
+ "reset",
+ "--hard",
+ "abc123"
+ ],
+ "cwd": "[CUSTOM_/_B_WORK]/skia",
+ "infra_step": true,
+ "name": "git reset"
+ },
+ {
+ "cmd": [
+ "git",
+ "clean",
+ "-d",
+ "-f"
+ ],
+ "cwd": "[CUSTOM_/_B_WORK]/skia",
+ "infra_step": true,
+ "name": "git clean"
+ },
+ {
+ "cmd": [
+ "git",
+ "remote",
+ "set-url",
+ "origin",
+ "https://chromium.googlesource.com/chromium/src.git"
+ ],
+ "cwd": "[CUSTOM_/_B_WORK]/src",
+ "infra_step": true,
+ "name": "git remote set-url (2)"
+ },
+ {
+ "cmd": [
+ "git",
+ "fetch"
+ ],
+ "cwd": "[CUSTOM_/_B_WORK]/src",
+ "infra_step": true,
+ "name": "git fetch (2)"
+ },
+ {
+ "cmd": [
+ "git",
+ "reset",
+ "--hard",
+ "origin/lkgr"
+ ],
+ "cwd": "[CUSTOM_/_B_WORK]/src",
+ "infra_step": true,
+ "name": "git reset (2)"
+ },
+ {
+ "cmd": [
+ "git",
+ "clean",
+ "-d",
+ "-f"
+ ],
+ "cwd": "[CUSTOM_/_B_WORK]/src",
+ "infra_step": true,
+ "name": "git clean (2)"
+ },
+ {
+ "cmd": [
+ "python",
+ "-u",
+ "RECIPE_MODULE[depot_tools::bot_update]/resources/bot_update.py",
+ "--spec",
+ "cache_dir = '[CUSTOM_/_B_CACHE]'\nsolutions = [{'deps_file': '.DEPS.git', 'managed': False, 'name': 'skia', 'url': 'https://skia.googlesource.com/skia.git'}, {'deps_file': '.DEPS.git', 'managed': False, 'name': 'src', 'url': 'https://chromium.googlesource.com/chromium/src.git'}]",
+ "--patch_root",
+ "skia",
+ "--revision_mapping_file",
+ "{\"skia\": \"got_revision\"}",
+ "--git-cache-dir",
+ "[CUSTOM_/_B_CACHE]",
+ "--output_json",
+ "/path/to/tmp/json",
+ "--revision",
+ "skia@abc123",
+ "--revision",
+ "src@origin/lkgr",
+ "--output_manifest"
+ ],
+ "cwd": "[CUSTOM_/_B_WORK]",
+ "env": {
+ "GIT_HTTP_LOW_SPEED_LIMIT": "1000",
+ "GIT_HTTP_LOW_SPEED_TIME": "300",
+ "PATH": "%(PATH)s:RECIPE_PACKAGE_REPO[depot_tools]"
+ },
+ "infra_step": true,
+ "name": "bot_update",
+ "~followup_annotations": [
+ "@@@STEP_TEXT@Some step text@@@",
+ "@@@STEP_LOG_LINE@json.output@{@@@",
+ "@@@STEP_LOG_LINE@json.output@ \"did_run\": true, @@@",
+ "@@@STEP_LOG_LINE@json.output@ \"fixed_revisions\": {@@@",
+ "@@@STEP_LOG_LINE@json.output@ \"skia\": \"abc123\", @@@",
+ "@@@STEP_LOG_LINE@json.output@ \"src\": \"origin/lkgr\"@@@",
+ "@@@STEP_LOG_LINE@json.output@ }, @@@",
+ "@@@STEP_LOG_LINE@json.output@ \"manifest\": {@@@",
+ "@@@STEP_LOG_LINE@json.output@ \"skia\": {@@@",
+ "@@@STEP_LOG_LINE@json.output@ \"repository\": \"https://fake.org/skia.git\", @@@",
+ "@@@STEP_LOG_LINE@json.output@ \"revision\": \"9046e2e693bb92a76e972b694580e5d17ad10748\"@@@",
+ "@@@STEP_LOG_LINE@json.output@ }@@@",
+ "@@@STEP_LOG_LINE@json.output@ }, @@@",
+ "@@@STEP_LOG_LINE@json.output@ \"patch_failure\": false, @@@",
+ "@@@STEP_LOG_LINE@json.output@ \"patch_root\": \"skia\", @@@",
+ "@@@STEP_LOG_LINE@json.output@ \"properties\": {@@@",
+ "@@@STEP_LOG_LINE@json.output@ \"got_revision\": \"9046e2e693bb92a76e972b694580e5d17ad10748\", @@@",
+ "@@@STEP_LOG_LINE@json.output@ \"got_revision_cp\": \"refs/heads/master@{#164710}\"@@@",
+ "@@@STEP_LOG_LINE@json.output@ }, @@@",
+ "@@@STEP_LOG_LINE@json.output@ \"root\": \"skia\", @@@",
+ "@@@STEP_LOG_LINE@json.output@ \"step_text\": \"Some step text\"@@@",
+ "@@@STEP_LOG_LINE@json.output@}@@@",
+ "@@@STEP_LOG_END@json.output@@@",
+ "@@@SET_BUILD_PROPERTY@got_revision@\"9046e2e693bb92a76e972b694580e5d17ad10748\"@@@",
+ "@@@SET_BUILD_PROPERTY@got_revision_cp@\"refs/heads/master@{#164710}\"@@@"
+ ]
+ },
+ {
+ "cmd": [
+ "python",
+ "-u",
+ "RECIPE_PACKAGE_REPO[depot_tools]/gclient.py",
+ "runhooks"
+ ],
+ "cwd": "[CUSTOM_/_B_WORK]",
+ "env": {
+ "CPPFLAGS": "-DSK_ALLOW_CROSSPROCESS_PICTUREIMAGEFILTERS=1",
+ "PATH": "%(PATH)s:RECIPE_PACKAGE_REPO[depot_tools]"
+ },
+ "name": "gclient runhooks"
+ },
+ {
+ "cmd": [
+ "python",
+ "-u",
+ "\nimport sys, os\npath = sys.argv[1]\nmode = int(sys.argv[2])\nif not os.path.isdir(path):\n if os.path.exists(path):\n print \"%s exists but is not a dir\" % path\n sys.exit(1)\n os.makedirs(path, mode)\n",
+ "[START_DIR]/tmp",
+ "511"
+ ],
+ "infra_step": true,
+ "name": "makedirs tmp_dir",
+ "~followup_annotations": [
+ "@@@STEP_LOG_LINE@python.inline@@@@",
+ "@@@STEP_LOG_LINE@python.inline@import sys, os@@@",
+ "@@@STEP_LOG_LINE@python.inline@path = sys.argv[1]@@@",
+ "@@@STEP_LOG_LINE@python.inline@mode = int(sys.argv[2])@@@",
+ "@@@STEP_LOG_LINE@python.inline@if not os.path.isdir(path):@@@",
+ "@@@STEP_LOG_LINE@python.inline@ if os.path.exists(path):@@@",
+ "@@@STEP_LOG_LINE@python.inline@ print \"%s exists but is not a dir\" % path@@@",
+ "@@@STEP_LOG_LINE@python.inline@ sys.exit(1)@@@",
+ "@@@STEP_LOG_LINE@python.inline@ os.makedirs(path, mode)@@@",
+ "@@@STEP_LOG_END@python.inline@@@"
+ ]
+ },
+ {
+ "name": "$result",
+ "recipe_result": null,
+ "status_code": 0
+ }
+] \ No newline at end of file
diff --git a/infra/bots/recipe_modules/core/example.expected/flutter_trybot.json b/infra/bots/recipe_modules/core/example.expected/flutter_trybot.json
new file mode 100644
index 0000000000..d22609abb3
--- /dev/null
+++ b/infra/bots/recipe_modules/core/example.expected/flutter_trybot.json
@@ -0,0 +1,142 @@
+[
+ {
+ "cmd": [
+ "python",
+ "-u",
+ "\nimport sys, os\npath = sys.argv[1]\nmode = int(sys.argv[2])\nif not os.path.isdir(path):\n if os.path.exists(path):\n print \"%s exists but is not a dir\" % path\n sys.exit(1)\n os.makedirs(path, mode)\n",
+ "[CUSTOM_/_B_WORK]/flutter",
+ "511"
+ ],
+ "infra_step": true,
+ "name": "makedirs checkout_path",
+ "~followup_annotations": [
+ "@@@STEP_LOG_LINE@python.inline@@@@",
+ "@@@STEP_LOG_LINE@python.inline@import sys, os@@@",
+ "@@@STEP_LOG_LINE@python.inline@path = sys.argv[1]@@@",
+ "@@@STEP_LOG_LINE@python.inline@mode = int(sys.argv[2])@@@",
+ "@@@STEP_LOG_LINE@python.inline@if not os.path.isdir(path):@@@",
+ "@@@STEP_LOG_LINE@python.inline@ if os.path.exists(path):@@@",
+ "@@@STEP_LOG_LINE@python.inline@ print \"%s exists but is not a dir\" % path@@@",
+ "@@@STEP_LOG_LINE@python.inline@ sys.exit(1)@@@",
+ "@@@STEP_LOG_LINE@python.inline@ os.makedirs(path, mode)@@@",
+ "@@@STEP_LOG_END@python.inline@@@"
+ ]
+ },
+ {
+ "cmd": [
+ "git",
+ "remote",
+ "set-url",
+ "origin",
+ "https://github.com/flutter/engine.git"
+ ],
+ "cwd": "[CUSTOM_/_B_WORK]/flutter/src/flutter",
+ "infra_step": true,
+ "name": "git remote set-url"
+ },
+ {
+ "cmd": [
+ "git",
+ "fetch"
+ ],
+ "cwd": "[CUSTOM_/_B_WORK]/flutter/src/flutter",
+ "infra_step": true,
+ "name": "git fetch"
+ },
+ {
+ "cmd": [
+ "git",
+ "reset",
+ "--hard",
+ "origin/master"
+ ],
+ "cwd": "[CUSTOM_/_B_WORK]/flutter/src/flutter",
+ "infra_step": true,
+ "name": "git reset"
+ },
+ {
+ "cmd": [
+ "git",
+ "clean",
+ "-d",
+ "-f"
+ ],
+ "cwd": "[CUSTOM_/_B_WORK]/flutter/src/flutter",
+ "infra_step": true,
+ "name": "git clean"
+ },
+ {
+ "cmd": [
+ "python",
+ "-u",
+ "RECIPE_MODULE[depot_tools::bot_update]/resources/bot_update.py",
+ "--spec",
+ "cache_dir = '[CUSTOM_/_B_CACHE]'\nsolutions = [{'deps_file': '.DEPS.git', 'managed': True, 'name': 'src/flutter', 'url': 'https://github.com/flutter/engine.git'}]\ntarget_os = ['android']",
+ "--patch_root",
+ "src/third_party/skia",
+ "--revision_mapping_file",
+ "{\"src/flutter\": \"got_flutter_revision\", \"src/third_party/skia\": \"got_revision\"}",
+ "--git-cache-dir",
+ "[CUSTOM_/_B_CACHE]",
+ "--gerrit_repo",
+ "https://skia.googlesource.com/skia.git",
+ "--gerrit_ref",
+ "refs/changes/89/456789/12",
+ "--output_json",
+ "/path/to/tmp/json",
+ "--revision",
+ "src/flutter@origin/master",
+ "--revision",
+ "src/third_party/skia@abc123",
+ "--output_manifest"
+ ],
+ "cwd": "[CUSTOM_/_B_WORK]/flutter",
+ "env": {
+ "GIT_HTTP_LOW_SPEED_LIMIT": "1000",
+ "GIT_HTTP_LOW_SPEED_TIME": "300",
+ "PATH": "%(PATH)s:RECIPE_PACKAGE_REPO[depot_tools]"
+ },
+ "infra_step": true,
+ "name": "bot_update",
+ "~followup_annotations": [
+ "@@@STEP_TEXT@Some step text@@@",
+ "@@@STEP_LOG_LINE@json.output@{@@@",
+ "@@@STEP_LOG_LINE@json.output@ \"did_run\": true, @@@",
+ "@@@STEP_LOG_LINE@json.output@ \"fixed_revisions\": {@@@",
+ "@@@STEP_LOG_LINE@json.output@ \"src/flutter\": \"origin/master\", @@@",
+ "@@@STEP_LOG_LINE@json.output@ \"src/third_party/skia\": \"abc123\"@@@",
+ "@@@STEP_LOG_LINE@json.output@ }, @@@",
+ "@@@STEP_LOG_LINE@json.output@ \"manifest\": {@@@",
+ "@@@STEP_LOG_LINE@json.output@ \"src/flutter\": {@@@",
+ "@@@STEP_LOG_LINE@json.output@ \"repository\": \"https://fake.org/src/flutter.git\", @@@",
+ "@@@STEP_LOG_LINE@json.output@ \"revision\": \"9221bca00ddbd888260084def81f09543281b952\"@@@",
+ "@@@STEP_LOG_LINE@json.output@ }, @@@",
+ "@@@STEP_LOG_LINE@json.output@ \"src/third_party/skia\": {@@@",
+ "@@@STEP_LOG_LINE@json.output@ \"repository\": \"https://fake.org/src/third_party/skia.git\", @@@",
+ "@@@STEP_LOG_LINE@json.output@ \"revision\": \"d9c4a4d173a97ef2832b65636b4200bb93ea8ee1\"@@@",
+ "@@@STEP_LOG_LINE@json.output@ }@@@",
+ "@@@STEP_LOG_LINE@json.output@ }, @@@",
+ "@@@STEP_LOG_LINE@json.output@ \"patch_failure\": false, @@@",
+ "@@@STEP_LOG_LINE@json.output@ \"patch_root\": \"src/third_party/skia\", @@@",
+ "@@@STEP_LOG_LINE@json.output@ \"properties\": {@@@",
+ "@@@STEP_LOG_LINE@json.output@ \"got_flutter_revision\": \"9221bca00ddbd888260084def81f09543281b952\", @@@",
+ "@@@STEP_LOG_LINE@json.output@ \"got_flutter_revision_cp\": \"refs/heads/master@{#84512}\", @@@",
+ "@@@STEP_LOG_LINE@json.output@ \"got_revision\": \"d9c4a4d173a97ef2832b65636b4200bb93ea8ee1\", @@@",
+ "@@@STEP_LOG_LINE@json.output@ \"got_revision_cp\": \"refs/heads/master@{#143121}\"@@@",
+ "@@@STEP_LOG_LINE@json.output@ }, @@@",
+ "@@@STEP_LOG_LINE@json.output@ \"root\": \"src/flutter\", @@@",
+ "@@@STEP_LOG_LINE@json.output@ \"step_text\": \"Some step text\"@@@",
+ "@@@STEP_LOG_LINE@json.output@}@@@",
+ "@@@STEP_LOG_END@json.output@@@",
+ "@@@SET_BUILD_PROPERTY@got_revision@\"d9c4a4d173a97ef2832b65636b4200bb93ea8ee1\"@@@",
+ "@@@SET_BUILD_PROPERTY@got_revision_cp@\"refs/heads/master@{#143121}\"@@@",
+ "@@@SET_BUILD_PROPERTY@got_flutter_revision_cp@\"refs/heads/master@{#84512}\"@@@",
+ "@@@SET_BUILD_PROPERTY@got_flutter_revision@\"9221bca00ddbd888260084def81f09543281b952\"@@@"
+ ]
+ },
+ {
+ "name": "$result",
+ "recipe_result": null,
+ "status_code": 0
+ }
+] \ No newline at end of file
diff --git a/infra/bots/recipe_modules/core/example.expected/no_persistent_checkout.json b/infra/bots/recipe_modules/core/example.expected/no_persistent_checkout.json
new file mode 100644
index 0000000000..2b14fe5d9f
--- /dev/null
+++ b/infra/bots/recipe_modules/core/example.expected/no_persistent_checkout.json
@@ -0,0 +1,30 @@
+[
+ {
+ "cmd": [
+ "python",
+ "-u",
+ "\nimport sys, os\npath = sys.argv[1]\nmode = int(sys.argv[2])\nif not os.path.isdir(path):\n if os.path.exists(path):\n print \"%s exists but is not a dir\" % path\n sys.exit(1)\n os.makedirs(path, mode)\n",
+ "[START_DIR]/tmp",
+ "511"
+ ],
+ "infra_step": true,
+ "name": "makedirs tmp_dir",
+ "~followup_annotations": [
+ "@@@STEP_LOG_LINE@python.inline@@@@",
+ "@@@STEP_LOG_LINE@python.inline@import sys, os@@@",
+ "@@@STEP_LOG_LINE@python.inline@path = sys.argv[1]@@@",
+ "@@@STEP_LOG_LINE@python.inline@mode = int(sys.argv[2])@@@",
+ "@@@STEP_LOG_LINE@python.inline@if not os.path.isdir(path):@@@",
+ "@@@STEP_LOG_LINE@python.inline@ if os.path.exists(path):@@@",
+ "@@@STEP_LOG_LINE@python.inline@ print \"%s exists but is not a dir\" % path@@@",
+ "@@@STEP_LOG_LINE@python.inline@ sys.exit(1)@@@",
+ "@@@STEP_LOG_LINE@python.inline@ os.makedirs(path, mode)@@@",
+ "@@@STEP_LOG_END@python.inline@@@"
+ ]
+ },
+ {
+ "name": "$result",
+ "recipe_result": null,
+ "status_code": 0
+ }
+] \ No newline at end of file
diff --git a/infra/bots/recipe_modules/core/example.expected/pdfium_trybot.json b/infra/bots/recipe_modules/core/example.expected/pdfium_trybot.json
new file mode 100644
index 0000000000..df49c7e4b5
--- /dev/null
+++ b/infra/bots/recipe_modules/core/example.expected/pdfium_trybot.json
@@ -0,0 +1,142 @@
+[
+ {
+ "cmd": [
+ "python",
+ "-u",
+ "\nimport sys, os\npath = sys.argv[1]\nmode = int(sys.argv[2])\nif not os.path.isdir(path):\n if os.path.exists(path):\n print \"%s exists but is not a dir\" % path\n sys.exit(1)\n os.makedirs(path, mode)\n",
+ "[CUSTOM_/_B_WORK]",
+ "511"
+ ],
+ "infra_step": true,
+ "name": "makedirs checkout_path",
+ "~followup_annotations": [
+ "@@@STEP_LOG_LINE@python.inline@@@@",
+ "@@@STEP_LOG_LINE@python.inline@import sys, os@@@",
+ "@@@STEP_LOG_LINE@python.inline@path = sys.argv[1]@@@",
+ "@@@STEP_LOG_LINE@python.inline@mode = int(sys.argv[2])@@@",
+ "@@@STEP_LOG_LINE@python.inline@if not os.path.isdir(path):@@@",
+ "@@@STEP_LOG_LINE@python.inline@ if os.path.exists(path):@@@",
+ "@@@STEP_LOG_LINE@python.inline@ print \"%s exists but is not a dir\" % path@@@",
+ "@@@STEP_LOG_LINE@python.inline@ sys.exit(1)@@@",
+ "@@@STEP_LOG_LINE@python.inline@ os.makedirs(path, mode)@@@",
+ "@@@STEP_LOG_END@python.inline@@@"
+ ]
+ },
+ {
+ "cmd": [
+ "git",
+ "remote",
+ "set-url",
+ "origin",
+ "https://pdfium.googlesource.com/pdfium.git"
+ ],
+ "cwd": "[CUSTOM_/_B_WORK]/pdfium",
+ "infra_step": true,
+ "name": "git remote set-url"
+ },
+ {
+ "cmd": [
+ "git",
+ "fetch"
+ ],
+ "cwd": "[CUSTOM_/_B_WORK]/pdfium",
+ "infra_step": true,
+ "name": "git fetch"
+ },
+ {
+ "cmd": [
+ "git",
+ "reset",
+ "--hard",
+ "origin/master"
+ ],
+ "cwd": "[CUSTOM_/_B_WORK]/pdfium",
+ "infra_step": true,
+ "name": "git reset"
+ },
+ {
+ "cmd": [
+ "git",
+ "clean",
+ "-d",
+ "-f"
+ ],
+ "cwd": "[CUSTOM_/_B_WORK]/pdfium",
+ "infra_step": true,
+ "name": "git clean"
+ },
+ {
+ "cmd": [
+ "python",
+ "-u",
+ "RECIPE_MODULE[depot_tools::bot_update]/resources/bot_update.py",
+ "--spec",
+ "cache_dir = '[CUSTOM_/_B_CACHE]'\nsolutions = [{'deps_file': '.DEPS.git', 'managed': True, 'name': 'pdfium', 'url': 'https://pdfium.googlesource.com/pdfium.git'}]",
+ "--patch_root",
+ "pdfium/third_party/skia",
+ "--revision_mapping_file",
+ "{\"pdfium\": \"got_pdfium_revision\", \"pdfium/third_party/skia\": \"got_revision\"}",
+ "--git-cache-dir",
+ "[CUSTOM_/_B_CACHE]",
+ "--gerrit_repo",
+ "https://skia.googlesource.com/skia.git",
+ "--gerrit_ref",
+ "refs/changes/89/456789/12",
+ "--output_json",
+ "/path/to/tmp/json",
+ "--revision",
+ "pdfium@origin/master",
+ "--revision",
+ "pdfium/third_party/skia@abc123",
+ "--output_manifest"
+ ],
+ "cwd": "[CUSTOM_/_B_WORK]",
+ "env": {
+ "GIT_HTTP_LOW_SPEED_LIMIT": "1000",
+ "GIT_HTTP_LOW_SPEED_TIME": "300",
+ "PATH": "%(PATH)s:RECIPE_PACKAGE_REPO[depot_tools]"
+ },
+ "infra_step": true,
+ "name": "bot_update",
+ "~followup_annotations": [
+ "@@@STEP_TEXT@Some step text@@@",
+ "@@@STEP_LOG_LINE@json.output@{@@@",
+ "@@@STEP_LOG_LINE@json.output@ \"did_run\": true, @@@",
+ "@@@STEP_LOG_LINE@json.output@ \"fixed_revisions\": {@@@",
+ "@@@STEP_LOG_LINE@json.output@ \"pdfium\": \"origin/master\", @@@",
+ "@@@STEP_LOG_LINE@json.output@ \"pdfium/third_party/skia\": \"abc123\"@@@",
+ "@@@STEP_LOG_LINE@json.output@ }, @@@",
+ "@@@STEP_LOG_LINE@json.output@ \"manifest\": {@@@",
+ "@@@STEP_LOG_LINE@json.output@ \"pdfium\": {@@@",
+ "@@@STEP_LOG_LINE@json.output@ \"repository\": \"https://fake.org/pdfium.git\", @@@",
+ "@@@STEP_LOG_LINE@json.output@ \"revision\": \"d69d97171c17fdb12a52f78847e2ee2f0594eff1\"@@@",
+ "@@@STEP_LOG_LINE@json.output@ }, @@@",
+ "@@@STEP_LOG_LINE@json.output@ \"pdfium/third_party/skia\": {@@@",
+ "@@@STEP_LOG_LINE@json.output@ \"repository\": \"https://fake.org/pdfium/third_party/skia.git\", @@@",
+ "@@@STEP_LOG_LINE@json.output@ \"revision\": \"85501db4bcbeb8f295309fdcda1a743388f0f104\"@@@",
+ "@@@STEP_LOG_LINE@json.output@ }@@@",
+ "@@@STEP_LOG_LINE@json.output@ }, @@@",
+ "@@@STEP_LOG_LINE@json.output@ \"patch_failure\": false, @@@",
+ "@@@STEP_LOG_LINE@json.output@ \"patch_root\": \"pdfium/third_party/skia\", @@@",
+ "@@@STEP_LOG_LINE@json.output@ \"properties\": {@@@",
+ "@@@STEP_LOG_LINE@json.output@ \"got_pdfium_revision\": \"d69d97171c17fdb12a52f78847e2ee2f0594eff1\", @@@",
+ "@@@STEP_LOG_LINE@json.output@ \"got_pdfium_revision_cp\": \"refs/heads/master@{#52055}\", @@@",
+ "@@@STEP_LOG_LINE@json.output@ \"got_revision\": \"85501db4bcbeb8f295309fdcda1a743388f0f104\", @@@",
+ "@@@STEP_LOG_LINE@json.output@ \"got_revision_cp\": \"refs/heads/master@{#120212}\"@@@",
+ "@@@STEP_LOG_LINE@json.output@ }, @@@",
+ "@@@STEP_LOG_LINE@json.output@ \"root\": \"pdfium\", @@@",
+ "@@@STEP_LOG_LINE@json.output@ \"step_text\": \"Some step text\"@@@",
+ "@@@STEP_LOG_LINE@json.output@}@@@",
+ "@@@STEP_LOG_END@json.output@@@",
+ "@@@SET_BUILD_PROPERTY@got_pdfium_revision_cp@\"refs/heads/master@{#52055}\"@@@",
+ "@@@SET_BUILD_PROPERTY@got_revision@\"85501db4bcbeb8f295309fdcda1a743388f0f104\"@@@",
+ "@@@SET_BUILD_PROPERTY@got_revision_cp@\"refs/heads/master@{#120212}\"@@@",
+ "@@@SET_BUILD_PROPERTY@got_pdfium_revision@\"d69d97171c17fdb12a52f78847e2ee2f0594eff1\"@@@"
+ ]
+ },
+ {
+ "name": "$result",
+ "recipe_result": null,
+ "status_code": 0
+ }
+] \ No newline at end of file
diff --git a/infra/bots/recipe_modules/core/example.expected/test.json b/infra/bots/recipe_modules/core/example.expected/test.json
new file mode 100644
index 0000000000..c831dab096
--- /dev/null
+++ b/infra/bots/recipe_modules/core/example.expected/test.json
@@ -0,0 +1,154 @@
+[
+ {
+ "cmd": [
+ "python",
+ "-u",
+ "\nimport sys, os\npath = sys.argv[1]\nmode = int(sys.argv[2])\nif not os.path.isdir(path):\n if os.path.exists(path):\n print \"%s exists but is not a dir\" % path\n sys.exit(1)\n os.makedirs(path, mode)\n",
+ "[CUSTOM_C:\\_B_WORK]",
+ "511"
+ ],
+ "infra_step": true,
+ "name": "makedirs checkout_path",
+ "~followup_annotations": [
+ "@@@STEP_LOG_LINE@python.inline@@@@",
+ "@@@STEP_LOG_LINE@python.inline@import sys, os@@@",
+ "@@@STEP_LOG_LINE@python.inline@path = sys.argv[1]@@@",
+ "@@@STEP_LOG_LINE@python.inline@mode = int(sys.argv[2])@@@",
+ "@@@STEP_LOG_LINE@python.inline@if not os.path.isdir(path):@@@",
+ "@@@STEP_LOG_LINE@python.inline@ if os.path.exists(path):@@@",
+ "@@@STEP_LOG_LINE@python.inline@ print \"%s exists but is not a dir\" % path@@@",
+ "@@@STEP_LOG_LINE@python.inline@ sys.exit(1)@@@",
+ "@@@STEP_LOG_LINE@python.inline@ os.makedirs(path, mode)@@@",
+ "@@@STEP_LOG_END@python.inline@@@"
+ ]
+ },
+ {
+ "cmd": [
+ "git.bat",
+ "remote",
+ "set-url",
+ "origin",
+ "https://skia.googlesource.com/skia.git"
+ ],
+ "cwd": "[CUSTOM_C:\\_B_WORK]/skia",
+ "infra_step": true,
+ "name": "git remote set-url"
+ },
+ {
+ "cmd": [
+ "git.bat",
+ "fetch"
+ ],
+ "cwd": "[CUSTOM_C:\\_B_WORK]/skia",
+ "infra_step": true,
+ "name": "git fetch"
+ },
+ {
+ "cmd": [
+ "git.bat",
+ "reset",
+ "--hard",
+ "abc123"
+ ],
+ "cwd": "[CUSTOM_C:\\_B_WORK]/skia",
+ "infra_step": true,
+ "name": "git reset"
+ },
+ {
+ "cmd": [
+ "git.bat",
+ "clean",
+ "-d",
+ "-f"
+ ],
+ "cwd": "[CUSTOM_C:\\_B_WORK]/skia",
+ "infra_step": true,
+ "name": "git clean"
+ },
+ {
+ "cmd": [
+ "python",
+ "-u",
+ "RECIPE_MODULE[depot_tools::bot_update]/resources/bot_update.py",
+ "--spec",
+ "cache_dir = '[CUSTOM_C:\\\\_B_CACHE]'\nsolutions = [{'deps_file': '.DEPS.git', 'managed': False, 'name': 'skia', 'url': 'https://skia.googlesource.com/skia.git'}]",
+ "--patch_root",
+ "skia",
+ "--revision_mapping_file",
+ "{\"skia\": \"got_revision\"}",
+ "--git-cache-dir",
+ "[CUSTOM_C:\\_B_CACHE]",
+ "--gerrit_repo",
+ "https://skia.googlesource.com/skia.git",
+ "--gerrit_ref",
+ "refs/changes/89/456789/12",
+ "--output_json",
+ "/path/to/tmp/json",
+ "--revision",
+ "skia@abc123",
+ "--output_manifest"
+ ],
+ "cwd": "[CUSTOM_C:\\_B_WORK]",
+ "env": {
+ "GIT_HTTP_LOW_SPEED_LIMIT": "1000",
+ "GIT_HTTP_LOW_SPEED_TIME": "300",
+ "PATH": "%(PATH)s:RECIPE_PACKAGE_REPO[depot_tools]"
+ },
+ "infra_step": true,
+ "name": "bot_update",
+ "~followup_annotations": [
+ "@@@STEP_TEXT@Some step text@@@",
+ "@@@STEP_LOG_LINE@json.output@{@@@",
+ "@@@STEP_LOG_LINE@json.output@ \"did_run\": true, @@@",
+ "@@@STEP_LOG_LINE@json.output@ \"fixed_revisions\": {@@@",
+ "@@@STEP_LOG_LINE@json.output@ \"skia\": \"abc123\"@@@",
+ "@@@STEP_LOG_LINE@json.output@ }, @@@",
+ "@@@STEP_LOG_LINE@json.output@ \"manifest\": {@@@",
+ "@@@STEP_LOG_LINE@json.output@ \"skia\": {@@@",
+ "@@@STEP_LOG_LINE@json.output@ \"repository\": \"https://fake.org/skia.git\", @@@",
+ "@@@STEP_LOG_LINE@json.output@ \"revision\": \"9046e2e693bb92a76e972b694580e5d17ad10748\"@@@",
+ "@@@STEP_LOG_LINE@json.output@ }@@@",
+ "@@@STEP_LOG_LINE@json.output@ }, @@@",
+ "@@@STEP_LOG_LINE@json.output@ \"patch_failure\": false, @@@",
+ "@@@STEP_LOG_LINE@json.output@ \"patch_root\": \"skia\", @@@",
+ "@@@STEP_LOG_LINE@json.output@ \"properties\": {@@@",
+ "@@@STEP_LOG_LINE@json.output@ \"got_revision\": \"9046e2e693bb92a76e972b694580e5d17ad10748\", @@@",
+ "@@@STEP_LOG_LINE@json.output@ \"got_revision_cp\": \"refs/heads/master@{#164710}\"@@@",
+ "@@@STEP_LOG_LINE@json.output@ }, @@@",
+ "@@@STEP_LOG_LINE@json.output@ \"root\": \"skia\", @@@",
+ "@@@STEP_LOG_LINE@json.output@ \"step_text\": \"Some step text\"@@@",
+ "@@@STEP_LOG_LINE@json.output@}@@@",
+ "@@@STEP_LOG_END@json.output@@@",
+ "@@@SET_BUILD_PROPERTY@got_revision@\"9046e2e693bb92a76e972b694580e5d17ad10748\"@@@",
+ "@@@SET_BUILD_PROPERTY@got_revision_cp@\"refs/heads/master@{#164710}\"@@@"
+ ]
+ },
+ {
+ "cmd": [
+ "python",
+ "-u",
+ "\nimport sys, os\npath = sys.argv[1]\nmode = int(sys.argv[2])\nif not os.path.isdir(path):\n if os.path.exists(path):\n print \"%s exists but is not a dir\" % path\n sys.exit(1)\n os.makedirs(path, mode)\n",
+ "[START_DIR]/tmp",
+ "511"
+ ],
+ "infra_step": true,
+ "name": "makedirs tmp_dir",
+ "~followup_annotations": [
+ "@@@STEP_LOG_LINE@python.inline@@@@",
+ "@@@STEP_LOG_LINE@python.inline@import sys, os@@@",
+ "@@@STEP_LOG_LINE@python.inline@path = sys.argv[1]@@@",
+ "@@@STEP_LOG_LINE@python.inline@mode = int(sys.argv[2])@@@",
+ "@@@STEP_LOG_LINE@python.inline@if not os.path.isdir(path):@@@",
+ "@@@STEP_LOG_LINE@python.inline@ if os.path.exists(path):@@@",
+ "@@@STEP_LOG_LINE@python.inline@ print \"%s exists but is not a dir\" % path@@@",
+ "@@@STEP_LOG_LINE@python.inline@ sys.exit(1)@@@",
+ "@@@STEP_LOG_LINE@python.inline@ os.makedirs(path, mode)@@@",
+ "@@@STEP_LOG_END@python.inline@@@"
+ ]
+ },
+ {
+ "name": "$result",
+ "recipe_result": null,
+ "status_code": 0
+ }
+] \ No newline at end of file
diff --git a/infra/bots/recipe_modules/core/example.py b/infra/bots/recipe_modules/core/example.py
new file mode 100644
index 0000000000..9cd7b47890
--- /dev/null
+++ b/infra/bots/recipe_modules/core/example.py
@@ -0,0 +1,103 @@
+# Copyright 2017 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 = [
+ 'core',
+ 'recipe_engine/path',
+ 'recipe_engine/properties',
+]
+
+
+def RunSteps(api):
+ api.core.setup()
+
+
+def GenTests(api):
+ buildername = 'Build-Win-MSVC-x86_64-Release-Vulkan'
+ yield (
+ api.test('test') +
+ api.properties(buildername=buildername,
+ repository='https://skia.googlesource.com/skia.git',
+ revision='abc123',
+ path_config='kitchen',
+ swarm_out_dir='[SWARM_OUT_DIR]') +
+ api.properties(patch_storage='gerrit') +
+ api.properties.tryserver(
+ buildername=buildername,
+ gerrit_project='skia',
+ gerrit_url='https://skia-review.googlesource.com/',
+ )
+ )
+
+ buildername = 'Test-Win10-MSVC-NUC6i5SYK-GPU-IntelIris540-x86_64-Debug-ANGLE'
+ yield (
+ api.test('no_persistent_checkout') +
+ api.properties(buildername=buildername,
+ repository='https://skia.googlesource.com/skia.git',
+ revision='abc123',
+ path_config='kitchen',
+ swarm_out_dir='[SWARM_OUT_DIR]') +
+ api.properties(patch_storage='gerrit') +
+ api.properties.tryserver(
+ buildername=buildername,
+ gerrit_project='skia',
+ gerrit_url='https://skia-review.googlesource.com/',
+ )
+ )
+
+ buildername = 'Build-Ubuntu-GCC-x86_64-Release-PDFium'
+ yield (
+ api.test('pdfium_trybot') +
+ api.properties(
+ repository='https://skia.googlesource.com/skia.git',
+ buildername=buildername,
+ path_config='kitchen',
+ swarm_out_dir='[SWARM_OUT_DIR]',
+ revision='abc123',
+ patch_issue=500,
+ patch_set=1,
+ patch_storage='gerrit') +
+ api.properties.tryserver(
+ buildername=buildername,
+ gerrit_project='skia',
+ gerrit_url='https://skia-review.googlesource.com/',
+ ) +
+ api.path.exists(
+ api.path['start_dir'].join('tmp', 'uninteresting_hashes.txt')
+ )
+ )
+
+ buildername = 'Build-Ubuntu-GCC-x86_64-Release-Flutter_Android'
+ yield (
+ api.test('flutter_trybot') +
+ api.properties(
+ repository='https://skia.googlesource.com/skia.git',
+ buildername=buildername,
+ path_config='kitchen',
+ swarm_out_dir='[SWARM_OUT_DIR]',
+ revision='abc123',
+ patch_issue=500,
+ patch_set=1,
+ patch_storage='gerrit') +
+ api.properties.tryserver(
+ buildername=buildername,
+ gerrit_project='skia',
+ gerrit_url='https://skia-review.googlesource.com/',
+ ) +
+ api.path.exists(
+ api.path['start_dir'].join('tmp', 'uninteresting_hashes.txt')
+ )
+ )
+
+ builder = 'Housekeeper-Weekly-RecreateSKPs'
+ yield (
+ api.test(builder) +
+ api.properties(buildername=builder,
+ repository='https://skia.googlesource.com/skia.git',
+ revision='abc123',
+ path_config='kitchen',
+ swarm_out_dir='[SWARM_OUT_DIR]') +
+ api.path.exists(api.path['start_dir'].join('skp_output'))
+ )
diff --git a/infra/bots/recipe_modules/ct/__init__.py b/infra/bots/recipe_modules/ct/__init__.py
index f9d542c303..3756b3cbb7 100644
--- a/infra/bots/recipe_modules/ct/__init__.py
+++ b/infra/bots/recipe_modules/ct/__init__.py
@@ -9,7 +9,3 @@ DEPS = [
'recipe_engine/step',
'run',
]
-
-
-# TODO(borenet): Add coverage
-DISABLE_STRICT_COVERAGE = True
diff --git a/infra/bots/recipe_modules/ct/api.py b/infra/bots/recipe_modules/ct/api.py
index 91478fb50e..314903fe51 100644
--- a/infra/bots/recipe_modules/ct/api.py
+++ b/infra/bots/recipe_modules/ct/api.py
@@ -46,6 +46,6 @@ class CTApi(recipe_api.RecipeApi):
gsutil_args.append(str(slave_dest_dir))
try:
self.m.gsutil(gsutil_args, use_retry_wrapper=False)
- except self.m.step.StepFailure: # pragma: nocover
+ except self.m.step.StepFailure:
# Some subdirectories might have no SKPs in them.
pass
diff --git a/infra/bots/recipe_modules/ct/example.expected/failed_gsutil.json b/infra/bots/recipe_modules/ct/example.expected/failed_gsutil.json
new file mode 100644
index 0000000000..e51ee004c7
--- /dev/null
+++ b/infra/bots/recipe_modules/ct/example.expected/failed_gsutil.json
@@ -0,0 +1,160 @@
+[
+ {
+ "cmd": [
+ "python",
+ "-u",
+ "RECIPE_MODULE[build::file]/resources/fileutil.py",
+ "rmtree",
+ "[START_DIR]/skps/slave0"
+ ],
+ "env": {
+ "PYTHONPATH": "[START_DIR]/skia/infra/bots/.recipe_deps/build/scripts"
+ },
+ "infra_step": true,
+ "name": "rmtree slave0"
+ },
+ {
+ "cmd": [
+ "python",
+ "-u",
+ "\nimport sys, os\npath = sys.argv[1]\nmode = int(sys.argv[2])\nif not os.path.isdir(path):\n if os.path.exists(path):\n print \"%s exists but is not a dir\" % path\n sys.exit(1)\n os.makedirs(path, mode)\n",
+ "[START_DIR]/skps/slave0",
+ "511"
+ ],
+ "name": "makedirs slave0",
+ "~followup_annotations": [
+ "@@@STEP_LOG_LINE@python.inline@@@@",
+ "@@@STEP_LOG_LINE@python.inline@import sys, os@@@",
+ "@@@STEP_LOG_LINE@python.inline@path = sys.argv[1]@@@",
+ "@@@STEP_LOG_LINE@python.inline@mode = int(sys.argv[2])@@@",
+ "@@@STEP_LOG_LINE@python.inline@if not os.path.isdir(path):@@@",
+ "@@@STEP_LOG_LINE@python.inline@ if os.path.exists(path):@@@",
+ "@@@STEP_LOG_LINE@python.inline@ print \"%s exists but is not a dir\" % path@@@",
+ "@@@STEP_LOG_LINE@python.inline@ sys.exit(1)@@@",
+ "@@@STEP_LOG_LINE@python.inline@ os.makedirs(path, mode)@@@",
+ "@@@STEP_LOG_END@python.inline@@@"
+ ]
+ },
+ {
+ "cmd": [
+ "python",
+ "-u",
+ "RECIPE_PACKAGE_REPO[depot_tools]/gsutil.py",
+ "--",
+ "-m",
+ "cp",
+ "gs://cluster-telemetry/swarming/skps/All/abc123/100/*.skp",
+ "gs://cluster-telemetry/swarming/skps/All/abc123/101/*.skp",
+ "gs://cluster-telemetry/swarming/skps/All/abc123/102/*.skp",
+ "gs://cluster-telemetry/swarming/skps/All/abc123/103/*.skp",
+ "gs://cluster-telemetry/swarming/skps/All/abc123/104/*.skp",
+ "gs://cluster-telemetry/swarming/skps/All/abc123/105/*.skp",
+ "gs://cluster-telemetry/swarming/skps/All/abc123/106/*.skp",
+ "gs://cluster-telemetry/swarming/skps/All/abc123/107/*.skp",
+ "gs://cluster-telemetry/swarming/skps/All/abc123/108/*.skp",
+ "gs://cluster-telemetry/swarming/skps/All/abc123/109/*.skp",
+ "gs://cluster-telemetry/swarming/skps/All/abc123/110/*.skp",
+ "gs://cluster-telemetry/swarming/skps/All/abc123/111/*.skp",
+ "gs://cluster-telemetry/swarming/skps/All/abc123/112/*.skp",
+ "gs://cluster-telemetry/swarming/skps/All/abc123/113/*.skp",
+ "gs://cluster-telemetry/swarming/skps/All/abc123/114/*.skp",
+ "gs://cluster-telemetry/swarming/skps/All/abc123/115/*.skp",
+ "gs://cluster-telemetry/swarming/skps/All/abc123/116/*.skp",
+ "gs://cluster-telemetry/swarming/skps/All/abc123/117/*.skp",
+ "gs://cluster-telemetry/swarming/skps/All/abc123/118/*.skp",
+ "gs://cluster-telemetry/swarming/skps/All/abc123/119/*.skp",
+ "gs://cluster-telemetry/swarming/skps/All/abc123/120/*.skp",
+ "gs://cluster-telemetry/swarming/skps/All/abc123/121/*.skp",
+ "gs://cluster-telemetry/swarming/skps/All/abc123/122/*.skp",
+ "gs://cluster-telemetry/swarming/skps/All/abc123/123/*.skp",
+ "gs://cluster-telemetry/swarming/skps/All/abc123/124/*.skp",
+ "gs://cluster-telemetry/swarming/skps/All/abc123/125/*.skp",
+ "gs://cluster-telemetry/swarming/skps/All/abc123/126/*.skp",
+ "gs://cluster-telemetry/swarming/skps/All/abc123/127/*.skp",
+ "gs://cluster-telemetry/swarming/skps/All/abc123/128/*.skp",
+ "gs://cluster-telemetry/swarming/skps/All/abc123/129/*.skp",
+ "gs://cluster-telemetry/swarming/skps/All/abc123/130/*.skp",
+ "gs://cluster-telemetry/swarming/skps/All/abc123/131/*.skp",
+ "gs://cluster-telemetry/swarming/skps/All/abc123/132/*.skp",
+ "gs://cluster-telemetry/swarming/skps/All/abc123/133/*.skp",
+ "gs://cluster-telemetry/swarming/skps/All/abc123/134/*.skp",
+ "gs://cluster-telemetry/swarming/skps/All/abc123/135/*.skp",
+ "gs://cluster-telemetry/swarming/skps/All/abc123/136/*.skp",
+ "gs://cluster-telemetry/swarming/skps/All/abc123/137/*.skp",
+ "gs://cluster-telemetry/swarming/skps/All/abc123/138/*.skp",
+ "gs://cluster-telemetry/swarming/skps/All/abc123/139/*.skp",
+ "gs://cluster-telemetry/swarming/skps/All/abc123/140/*.skp",
+ "gs://cluster-telemetry/swarming/skps/All/abc123/141/*.skp",
+ "gs://cluster-telemetry/swarming/skps/All/abc123/142/*.skp",
+ "gs://cluster-telemetry/swarming/skps/All/abc123/143/*.skp",
+ "gs://cluster-telemetry/swarming/skps/All/abc123/144/*.skp",
+ "gs://cluster-telemetry/swarming/skps/All/abc123/145/*.skp",
+ "gs://cluster-telemetry/swarming/skps/All/abc123/146/*.skp",
+ "gs://cluster-telemetry/swarming/skps/All/abc123/147/*.skp",
+ "gs://cluster-telemetry/swarming/skps/All/abc123/148/*.skp",
+ "gs://cluster-telemetry/swarming/skps/All/abc123/149/*.skp",
+ "gs://cluster-telemetry/swarming/skps/All/abc123/150/*.skp",
+ "gs://cluster-telemetry/swarming/skps/All/abc123/151/*.skp",
+ "gs://cluster-telemetry/swarming/skps/All/abc123/152/*.skp",
+ "gs://cluster-telemetry/swarming/skps/All/abc123/153/*.skp",
+ "gs://cluster-telemetry/swarming/skps/All/abc123/154/*.skp",
+ "gs://cluster-telemetry/swarming/skps/All/abc123/155/*.skp",
+ "gs://cluster-telemetry/swarming/skps/All/abc123/156/*.skp",
+ "gs://cluster-telemetry/swarming/skps/All/abc123/157/*.skp",
+ "gs://cluster-telemetry/swarming/skps/All/abc123/158/*.skp",
+ "gs://cluster-telemetry/swarming/skps/All/abc123/159/*.skp",
+ "gs://cluster-telemetry/swarming/skps/All/abc123/160/*.skp",
+ "gs://cluster-telemetry/swarming/skps/All/abc123/161/*.skp",
+ "gs://cluster-telemetry/swarming/skps/All/abc123/162/*.skp",
+ "gs://cluster-telemetry/swarming/skps/All/abc123/163/*.skp",
+ "gs://cluster-telemetry/swarming/skps/All/abc123/164/*.skp",
+ "gs://cluster-telemetry/swarming/skps/All/abc123/165/*.skp",
+ "gs://cluster-telemetry/swarming/skps/All/abc123/166/*.skp",
+ "gs://cluster-telemetry/swarming/skps/All/abc123/167/*.skp",
+ "gs://cluster-telemetry/swarming/skps/All/abc123/168/*.skp",
+ "gs://cluster-telemetry/swarming/skps/All/abc123/169/*.skp",
+ "gs://cluster-telemetry/swarming/skps/All/abc123/170/*.skp",
+ "gs://cluster-telemetry/swarming/skps/All/abc123/171/*.skp",
+ "gs://cluster-telemetry/swarming/skps/All/abc123/172/*.skp",
+ "gs://cluster-telemetry/swarming/skps/All/abc123/173/*.skp",
+ "gs://cluster-telemetry/swarming/skps/All/abc123/174/*.skp",
+ "gs://cluster-telemetry/swarming/skps/All/abc123/175/*.skp",
+ "gs://cluster-telemetry/swarming/skps/All/abc123/176/*.skp",
+ "gs://cluster-telemetry/swarming/skps/All/abc123/177/*.skp",
+ "gs://cluster-telemetry/swarming/skps/All/abc123/178/*.skp",
+ "gs://cluster-telemetry/swarming/skps/All/abc123/179/*.skp",
+ "gs://cluster-telemetry/swarming/skps/All/abc123/180/*.skp",
+ "gs://cluster-telemetry/swarming/skps/All/abc123/181/*.skp",
+ "gs://cluster-telemetry/swarming/skps/All/abc123/182/*.skp",
+ "gs://cluster-telemetry/swarming/skps/All/abc123/183/*.skp",
+ "gs://cluster-telemetry/swarming/skps/All/abc123/184/*.skp",
+ "gs://cluster-telemetry/swarming/skps/All/abc123/185/*.skp",
+ "gs://cluster-telemetry/swarming/skps/All/abc123/186/*.skp",
+ "gs://cluster-telemetry/swarming/skps/All/abc123/187/*.skp",
+ "gs://cluster-telemetry/swarming/skps/All/abc123/188/*.skp",
+ "gs://cluster-telemetry/swarming/skps/All/abc123/189/*.skp",
+ "gs://cluster-telemetry/swarming/skps/All/abc123/190/*.skp",
+ "gs://cluster-telemetry/swarming/skps/All/abc123/191/*.skp",
+ "gs://cluster-telemetry/swarming/skps/All/abc123/192/*.skp",
+ "gs://cluster-telemetry/swarming/skps/All/abc123/193/*.skp",
+ "gs://cluster-telemetry/swarming/skps/All/abc123/194/*.skp",
+ "gs://cluster-telemetry/swarming/skps/All/abc123/195/*.skp",
+ "gs://cluster-telemetry/swarming/skps/All/abc123/196/*.skp",
+ "gs://cluster-telemetry/swarming/skps/All/abc123/197/*.skp",
+ "gs://cluster-telemetry/swarming/skps/All/abc123/198/*.skp",
+ "gs://cluster-telemetry/swarming/skps/All/abc123/199/*.skp",
+ "[START_DIR]/skps/slave0"
+ ],
+ "infra_step": true,
+ "name": "gsutil cp",
+ "~followup_annotations": [
+ "step returned non-zero exit code: 1",
+ "@@@STEP_EXCEPTION@@@"
+ ]
+ },
+ {
+ "name": "$result",
+ "recipe_result": null,
+ "status_code": 0
+ }
+] \ No newline at end of file
diff --git a/infra/bots/recipe_modules/ct/example.expected/test.json b/infra/bots/recipe_modules/ct/example.expected/test.json
new file mode 100644
index 0000000000..dc49be70f0
--- /dev/null
+++ b/infra/bots/recipe_modules/ct/example.expected/test.json
@@ -0,0 +1,156 @@
+[
+ {
+ "cmd": [
+ "python",
+ "-u",
+ "RECIPE_MODULE[build::file]/resources/fileutil.py",
+ "rmtree",
+ "[START_DIR]/skps/slave0"
+ ],
+ "env": {
+ "PYTHONPATH": "[START_DIR]/skia/infra/bots/.recipe_deps/build/scripts"
+ },
+ "infra_step": true,
+ "name": "rmtree slave0"
+ },
+ {
+ "cmd": [
+ "python",
+ "-u",
+ "\nimport sys, os\npath = sys.argv[1]\nmode = int(sys.argv[2])\nif not os.path.isdir(path):\n if os.path.exists(path):\n print \"%s exists but is not a dir\" % path\n sys.exit(1)\n os.makedirs(path, mode)\n",
+ "[START_DIR]/skps/slave0",
+ "511"
+ ],
+ "name": "makedirs slave0",
+ "~followup_annotations": [
+ "@@@STEP_LOG_LINE@python.inline@@@@",
+ "@@@STEP_LOG_LINE@python.inline@import sys, os@@@",
+ "@@@STEP_LOG_LINE@python.inline@path = sys.argv[1]@@@",
+ "@@@STEP_LOG_LINE@python.inline@mode = int(sys.argv[2])@@@",
+ "@@@STEP_LOG_LINE@python.inline@if not os.path.isdir(path):@@@",
+ "@@@STEP_LOG_LINE@python.inline@ if os.path.exists(path):@@@",
+ "@@@STEP_LOG_LINE@python.inline@ print \"%s exists but is not a dir\" % path@@@",
+ "@@@STEP_LOG_LINE@python.inline@ sys.exit(1)@@@",
+ "@@@STEP_LOG_LINE@python.inline@ os.makedirs(path, mode)@@@",
+ "@@@STEP_LOG_END@python.inline@@@"
+ ]
+ },
+ {
+ "cmd": [
+ "python",
+ "-u",
+ "RECIPE_PACKAGE_REPO[depot_tools]/gsutil.py",
+ "--",
+ "-m",
+ "cp",
+ "gs://cluster-telemetry/swarming/skps/All/abc123/100/*.skp",
+ "gs://cluster-telemetry/swarming/skps/All/abc123/101/*.skp",
+ "gs://cluster-telemetry/swarming/skps/All/abc123/102/*.skp",
+ "gs://cluster-telemetry/swarming/skps/All/abc123/103/*.skp",
+ "gs://cluster-telemetry/swarming/skps/All/abc123/104/*.skp",
+ "gs://cluster-telemetry/swarming/skps/All/abc123/105/*.skp",
+ "gs://cluster-telemetry/swarming/skps/All/abc123/106/*.skp",
+ "gs://cluster-telemetry/swarming/skps/All/abc123/107/*.skp",
+ "gs://cluster-telemetry/swarming/skps/All/abc123/108/*.skp",
+ "gs://cluster-telemetry/swarming/skps/All/abc123/109/*.skp",
+ "gs://cluster-telemetry/swarming/skps/All/abc123/110/*.skp",
+ "gs://cluster-telemetry/swarming/skps/All/abc123/111/*.skp",
+ "gs://cluster-telemetry/swarming/skps/All/abc123/112/*.skp",
+ "gs://cluster-telemetry/swarming/skps/All/abc123/113/*.skp",
+ "gs://cluster-telemetry/swarming/skps/All/abc123/114/*.skp",
+ "gs://cluster-telemetry/swarming/skps/All/abc123/115/*.skp",
+ "gs://cluster-telemetry/swarming/skps/All/abc123/116/*.skp",
+ "gs://cluster-telemetry/swarming/skps/All/abc123/117/*.skp",
+ "gs://cluster-telemetry/swarming/skps/All/abc123/118/*.skp",
+ "gs://cluster-telemetry/swarming/skps/All/abc123/119/*.skp",
+ "gs://cluster-telemetry/swarming/skps/All/abc123/120/*.skp",
+ "gs://cluster-telemetry/swarming/skps/All/abc123/121/*.skp",
+ "gs://cluster-telemetry/swarming/skps/All/abc123/122/*.skp",
+ "gs://cluster-telemetry/swarming/skps/All/abc123/123/*.skp",
+ "gs://cluster-telemetry/swarming/skps/All/abc123/124/*.skp",
+ "gs://cluster-telemetry/swarming/skps/All/abc123/125/*.skp",
+ "gs://cluster-telemetry/swarming/skps/All/abc123/126/*.skp",
+ "gs://cluster-telemetry/swarming/skps/All/abc123/127/*.skp",
+ "gs://cluster-telemetry/swarming/skps/All/abc123/128/*.skp",
+ "gs://cluster-telemetry/swarming/skps/All/abc123/129/*.skp",
+ "gs://cluster-telemetry/swarming/skps/All/abc123/130/*.skp",
+ "gs://cluster-telemetry/swarming/skps/All/abc123/131/*.skp",
+ "gs://cluster-telemetry/swarming/skps/All/abc123/132/*.skp",
+ "gs://cluster-telemetry/swarming/skps/All/abc123/133/*.skp",
+ "gs://cluster-telemetry/swarming/skps/All/abc123/134/*.skp",
+ "gs://cluster-telemetry/swarming/skps/All/abc123/135/*.skp",
+ "gs://cluster-telemetry/swarming/skps/All/abc123/136/*.skp",
+ "gs://cluster-telemetry/swarming/skps/All/abc123/137/*.skp",
+ "gs://cluster-telemetry/swarming/skps/All/abc123/138/*.skp",
+ "gs://cluster-telemetry/swarming/skps/All/abc123/139/*.skp",
+ "gs://cluster-telemetry/swarming/skps/All/abc123/140/*.skp",
+ "gs://cluster-telemetry/swarming/skps/All/abc123/141/*.skp",
+ "gs://cluster-telemetry/swarming/skps/All/abc123/142/*.skp",
+ "gs://cluster-telemetry/swarming/skps/All/abc123/143/*.skp",
+ "gs://cluster-telemetry/swarming/skps/All/abc123/144/*.skp",
+ "gs://cluster-telemetry/swarming/skps/All/abc123/145/*.skp",
+ "gs://cluster-telemetry/swarming/skps/All/abc123/146/*.skp",
+ "gs://cluster-telemetry/swarming/skps/All/abc123/147/*.skp",
+ "gs://cluster-telemetry/swarming/skps/All/abc123/148/*.skp",
+ "gs://cluster-telemetry/swarming/skps/All/abc123/149/*.skp",
+ "gs://cluster-telemetry/swarming/skps/All/abc123/150/*.skp",
+ "gs://cluster-telemetry/swarming/skps/All/abc123/151/*.skp",
+ "gs://cluster-telemetry/swarming/skps/All/abc123/152/*.skp",
+ "gs://cluster-telemetry/swarming/skps/All/abc123/153/*.skp",
+ "gs://cluster-telemetry/swarming/skps/All/abc123/154/*.skp",
+ "gs://cluster-telemetry/swarming/skps/All/abc123/155/*.skp",
+ "gs://cluster-telemetry/swarming/skps/All/abc123/156/*.skp",
+ "gs://cluster-telemetry/swarming/skps/All/abc123/157/*.skp",
+ "gs://cluster-telemetry/swarming/skps/All/abc123/158/*.skp",
+ "gs://cluster-telemetry/swarming/skps/All/abc123/159/*.skp",
+ "gs://cluster-telemetry/swarming/skps/All/abc123/160/*.skp",
+ "gs://cluster-telemetry/swarming/skps/All/abc123/161/*.skp",
+ "gs://cluster-telemetry/swarming/skps/All/abc123/162/*.skp",
+ "gs://cluster-telemetry/swarming/skps/All/abc123/163/*.skp",
+ "gs://cluster-telemetry/swarming/skps/All/abc123/164/*.skp",
+ "gs://cluster-telemetry/swarming/skps/All/abc123/165/*.skp",
+ "gs://cluster-telemetry/swarming/skps/All/abc123/166/*.skp",
+ "gs://cluster-telemetry/swarming/skps/All/abc123/167/*.skp",
+ "gs://cluster-telemetry/swarming/skps/All/abc123/168/*.skp",
+ "gs://cluster-telemetry/swarming/skps/All/abc123/169/*.skp",
+ "gs://cluster-telemetry/swarming/skps/All/abc123/170/*.skp",
+ "gs://cluster-telemetry/swarming/skps/All/abc123/171/*.skp",
+ "gs://cluster-telemetry/swarming/skps/All/abc123/172/*.skp",
+ "gs://cluster-telemetry/swarming/skps/All/abc123/173/*.skp",
+ "gs://cluster-telemetry/swarming/skps/All/abc123/174/*.skp",
+ "gs://cluster-telemetry/swarming/skps/All/abc123/175/*.skp",
+ "gs://cluster-telemetry/swarming/skps/All/abc123/176/*.skp",
+ "gs://cluster-telemetry/swarming/skps/All/abc123/177/*.skp",
+ "gs://cluster-telemetry/swarming/skps/All/abc123/178/*.skp",
+ "gs://cluster-telemetry/swarming/skps/All/abc123/179/*.skp",
+ "gs://cluster-telemetry/swarming/skps/All/abc123/180/*.skp",
+ "gs://cluster-telemetry/swarming/skps/All/abc123/181/*.skp",
+ "gs://cluster-telemetry/swarming/skps/All/abc123/182/*.skp",
+ "gs://cluster-telemetry/swarming/skps/All/abc123/183/*.skp",
+ "gs://cluster-telemetry/swarming/skps/All/abc123/184/*.skp",
+ "gs://cluster-telemetry/swarming/skps/All/abc123/185/*.skp",
+ "gs://cluster-telemetry/swarming/skps/All/abc123/186/*.skp",
+ "gs://cluster-telemetry/swarming/skps/All/abc123/187/*.skp",
+ "gs://cluster-telemetry/swarming/skps/All/abc123/188/*.skp",
+ "gs://cluster-telemetry/swarming/skps/All/abc123/189/*.skp",
+ "gs://cluster-telemetry/swarming/skps/All/abc123/190/*.skp",
+ "gs://cluster-telemetry/swarming/skps/All/abc123/191/*.skp",
+ "gs://cluster-telemetry/swarming/skps/All/abc123/192/*.skp",
+ "gs://cluster-telemetry/swarming/skps/All/abc123/193/*.skp",
+ "gs://cluster-telemetry/swarming/skps/All/abc123/194/*.skp",
+ "gs://cluster-telemetry/swarming/skps/All/abc123/195/*.skp",
+ "gs://cluster-telemetry/swarming/skps/All/abc123/196/*.skp",
+ "gs://cluster-telemetry/swarming/skps/All/abc123/197/*.skp",
+ "gs://cluster-telemetry/swarming/skps/All/abc123/198/*.skp",
+ "gs://cluster-telemetry/swarming/skps/All/abc123/199/*.skp",
+ "[START_DIR]/skps/slave0"
+ ],
+ "infra_step": true,
+ "name": "gsutil cp"
+ },
+ {
+ "name": "$result",
+ "recipe_result": null,
+ "status_code": 0
+ }
+] \ No newline at end of file
diff --git a/infra/bots/recipe_modules/ct/example.py b/infra/bots/recipe_modules/ct/example.py
new file mode 100644
index 0000000000..3b3c3f22e3
--- /dev/null
+++ b/infra/bots/recipe_modules/ct/example.py
@@ -0,0 +1,25 @@
+# Copyright 2017 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 = [
+ 'ct',
+ 'recipe_engine/path',
+]
+
+
+def RunSteps(api):
+ api.ct.download_swarming_skps(
+ 'All', '0', 'abc123',
+ api.path['start_dir'].join('skps'),
+ start_range=100,
+ num_skps=100)
+
+
+def GenTests(api):
+ yield api.test('test')
+ yield (
+ api.test('failed_gsutil') +
+ api.step_data('gsutil cp', retcode=1)
+ )
diff --git a/infra/bots/recipe_modules/run/__init__.py b/infra/bots/recipe_modules/run/__init__.py
index e9a6f1c497..cb4c1ae0ee 100644
--- a/infra/bots/recipe_modules/run/__init__.py
+++ b/infra/bots/recipe_modules/run/__init__.py
@@ -11,7 +11,3 @@ DEPS = [
'recipe_engine/step',
'vars',
]
-
-
-# TODO(borenet): Add coverage
-DISABLE_STRICT_COVERAGE = True
diff --git a/infra/bots/recipe_modules/run/api.py b/infra/bots/recipe_modules/run/api.py
index 475bd56d28..ecec9f9db9 100644
--- a/infra/bots/recipe_modules/run/api.py
+++ b/infra/bots/recipe_modules/run/api.py
@@ -60,7 +60,7 @@ class SkiaStepApi(recipe_api.RecipeApi):
def readfile(self, filename, *args, **kwargs):
"""Convenience function for reading files."""
- name = kwargs.pop('name') or 'read %s' % self.m.path.basename(filename)
+ name = kwargs.pop('name', 'read %s' % self.m.path.basename(filename))
return self.m.file.read(name, filename, infra_step=True, *args, **kwargs)
def writefile(self, filename, contents):
diff --git a/infra/bots/recipe_modules/run/example.expected/test.json b/infra/bots/recipe_modules/run/example.expected/test.json
new file mode 100644
index 0000000000..250ca9cf17
--- /dev/null
+++ b/infra/bots/recipe_modules/run/example.expected/test.json
@@ -0,0 +1,260 @@
+[
+ {
+ "cmd": [
+ "false"
+ ],
+ "env": {
+ "BUILDTYPE": "Release_x64",
+ "CHROME_HEADLESS": "1",
+ "PATH": "%(PATH)s:RECIPE_PACKAGE_REPO[depot_tools]",
+ "SKIA_OUT": "[CUSTOM_C:\\_B_WORK]/skia/out/Build-Win-MSVC-x86_64-Release-Vulkan"
+ },
+ "name": "fail",
+ "~followup_annotations": [
+ "step returned non-zero exit code: 1",
+ "@@@STEP_FAILURE@@@"
+ ]
+ },
+ {
+ "cmd": [
+ "echo",
+ "do the thing"
+ ],
+ "env": {
+ "BUILDTYPE": "Release_x64",
+ "CHROME_HEADLESS": "1",
+ "PATH": "%(PATH)s:RECIPE_PACKAGE_REPO[depot_tools]",
+ "SKIA_OUT": "[CUSTOM_C:\\_B_WORK]/skia/out/Build-Win-MSVC-x86_64-Release-Vulkan"
+ },
+ "name": "do a thing"
+ },
+ {
+ "cmd": [
+ "echo",
+ "0"
+ ],
+ "env": {
+ "BUILDTYPE": "Release_x64",
+ "CHROME_HEADLESS": "1",
+ "PATH": "%(PATH)s:RECIPE_PACKAGE_REPO[depot_tools]",
+ "SKIA_OUT": "[CUSTOM_C:\\_B_WORK]/skia/out/Build-Win-MSVC-x86_64-Release-Vulkan"
+ },
+ "name": "run 0"
+ },
+ {
+ "cmd": [
+ "python",
+ "-u",
+ "\nimport shutil\nimport sys\nshutil.copy(sys.argv[1], sys.argv[2])\n",
+ "myfile.txt",
+ "/path/to/tmp/"
+ ],
+ "infra_step": true,
+ "name": "read myfile.txt"
+ },
+ {
+ "cmd": [
+ "python",
+ "-u",
+ "\nimport shutil\nimport sys\nshutil.copy(sys.argv[1], sys.argv[2])\n",
+ "contents",
+ "myfile.txt"
+ ],
+ "infra_step": true,
+ "name": "write myfile.txt"
+ },
+ {
+ "cmd": [
+ "python",
+ "-u",
+ "RECIPE_MODULE[build::file]/resources/fileutil.py",
+ "rmtree",
+ "mydir"
+ ],
+ "env": {
+ "PYTHONPATH": "[START_DIR]/skia/infra/bots/.recipe_deps/build/scripts"
+ },
+ "infra_step": true,
+ "name": "rmtree mydir"
+ },
+ {
+ "cmd": [
+ "env"
+ ],
+ "env": {
+ "BUILDTYPE": "Release_x64",
+ "CHROME_HEADLESS": "1",
+ "PATH": "mydir:%(PATH)s:RECIPE_PACKAGE_REPO[depot_tools]",
+ "SKIA_OUT": "[CUSTOM_C:\\_B_WORK]/skia/out/Build-Win-MSVC-x86_64-Release-Vulkan"
+ },
+ "name": "env"
+ },
+ {
+ "cmd": [
+ "python",
+ "-u",
+ "import errno\nimport glob\nimport os\nimport shutil\nimport sys\n\nsrc = sys.argv[1]\ndst = sys.argv[2]\nbuild_products_whitelist = ['dm', 'dm.exe', 'dm.app', 'nanobench.app', 'get_images_from_skps', 'get_images_from_skps.exe', 'nanobench', 'nanobench.exe', 'skpbench', '*.so', '*.dll', '*.dylib', 'skia_launcher', 'lib/*.so', 'iOSShell.app', 'iOSShell.ipa', 'visualbench', 'visualbench.exe', 'vulkan-1.dll']\n\ntry:\n os.makedirs(dst)\nexcept OSError as e:\n if e.errno != errno.EEXIST:\n raise\n\nfor pattern in build_products_whitelist:\n path = os.path.join(src, pattern)\n for f in glob.glob(path):\n dst_path = os.path.join(dst, os.path.relpath(f, src))\n if not os.path.isdir(os.path.dirname(dst_path)):\n os.makedirs(os.path.dirname(dst_path))\n print 'Copying build product %s to %s' % (f, dst_path)\n shutil.move(f, dst_path)\n",
+ "src",
+ "dst"
+ ],
+ "infra_step": true,
+ "name": "copy build products",
+ "~followup_annotations": [
+ "@@@STEP_LOG_LINE@python.inline@import errno@@@",
+ "@@@STEP_LOG_LINE@python.inline@import glob@@@",
+ "@@@STEP_LOG_LINE@python.inline@import os@@@",
+ "@@@STEP_LOG_LINE@python.inline@import shutil@@@",
+ "@@@STEP_LOG_LINE@python.inline@import sys@@@",
+ "@@@STEP_LOG_LINE@python.inline@@@@",
+ "@@@STEP_LOG_LINE@python.inline@src = sys.argv[1]@@@",
+ "@@@STEP_LOG_LINE@python.inline@dst = sys.argv[2]@@@",
+ "@@@STEP_LOG_LINE@python.inline@build_products_whitelist = ['dm', 'dm.exe', 'dm.app', 'nanobench.app', 'get_images_from_skps', 'get_images_from_skps.exe', 'nanobench', 'nanobench.exe', 'skpbench', '*.so', '*.dll', '*.dylib', 'skia_launcher', 'lib/*.so', 'iOSShell.app', 'iOSShell.ipa', 'visualbench', 'visualbench.exe', 'vulkan-1.dll']@@@",
+ "@@@STEP_LOG_LINE@python.inline@@@@",
+ "@@@STEP_LOG_LINE@python.inline@try:@@@",
+ "@@@STEP_LOG_LINE@python.inline@ os.makedirs(dst)@@@",
+ "@@@STEP_LOG_LINE@python.inline@except OSError as e:@@@",
+ "@@@STEP_LOG_LINE@python.inline@ if e.errno != errno.EEXIST:@@@",
+ "@@@STEP_LOG_LINE@python.inline@ raise@@@",
+ "@@@STEP_LOG_LINE@python.inline@@@@",
+ "@@@STEP_LOG_LINE@python.inline@for pattern in build_products_whitelist:@@@",
+ "@@@STEP_LOG_LINE@python.inline@ path = os.path.join(src, pattern)@@@",
+ "@@@STEP_LOG_LINE@python.inline@ for f in glob.glob(path):@@@",
+ "@@@STEP_LOG_LINE@python.inline@ dst_path = os.path.join(dst, os.path.relpath(f, src))@@@",
+ "@@@STEP_LOG_LINE@python.inline@ if not os.path.isdir(os.path.dirname(dst_path)):@@@",
+ "@@@STEP_LOG_LINE@python.inline@ os.makedirs(os.path.dirname(dst_path))@@@",
+ "@@@STEP_LOG_LINE@python.inline@ print 'Copying build product %s to %s' % (f, dst_path)@@@",
+ "@@@STEP_LOG_LINE@python.inline@ shutil.move(f, dst_path)@@@",
+ "@@@STEP_LOG_END@python.inline@@@"
+ ]
+ },
+ {
+ "cmd": [
+ "false"
+ ],
+ "env": {
+ "BUILDTYPE": "Release_x64",
+ "CHROME_HEADLESS": "1",
+ "PATH": "%(PATH)s:RECIPE_PACKAGE_REPO[depot_tools]",
+ "SKIA_OUT": "[CUSTOM_C:\\_B_WORK]/skia/out/Build-Win-MSVC-x86_64-Release-Vulkan"
+ },
+ "name": "retry fail",
+ "~followup_annotations": [
+ "step returned non-zero exit code: 1",
+ "@@@STEP_FAILURE@@@"
+ ]
+ },
+ {
+ "cmd": [
+ "false"
+ ],
+ "env": {
+ "BUILDTYPE": "Release_x64",
+ "CHROME_HEADLESS": "1",
+ "PATH": "%(PATH)s:RECIPE_PACKAGE_REPO[depot_tools]",
+ "SKIA_OUT": "[CUSTOM_C:\\_B_WORK]/skia/out/Build-Win-MSVC-x86_64-Release-Vulkan"
+ },
+ "name": "retry fail (attempt 2)",
+ "~followup_annotations": [
+ "step returned non-zero exit code: 1",
+ "@@@STEP_FAILURE@@@"
+ ]
+ },
+ {
+ "cmd": [
+ "false"
+ ],
+ "env": {
+ "BUILDTYPE": "Release_x64",
+ "CHROME_HEADLESS": "1",
+ "PATH": "%(PATH)s:RECIPE_PACKAGE_REPO[depot_tools]",
+ "SKIA_OUT": "[CUSTOM_C:\\_B_WORK]/skia/out/Build-Win-MSVC-x86_64-Release-Vulkan"
+ },
+ "name": "retry fail (attempt 3)",
+ "~followup_annotations": [
+ "step returned non-zero exit code: 1",
+ "@@@STEP_FAILURE@@@"
+ ]
+ },
+ {
+ "cmd": [
+ "false"
+ ],
+ "env": {
+ "BUILDTYPE": "Release_x64",
+ "CHROME_HEADLESS": "1",
+ "PATH": "%(PATH)s:RECIPE_PACKAGE_REPO[depot_tools]",
+ "SKIA_OUT": "[CUSTOM_C:\\_B_WORK]/skia/out/Build-Win-MSVC-x86_64-Release-Vulkan"
+ },
+ "name": "retry fail (attempt 4)",
+ "~followup_annotations": [
+ "step returned non-zero exit code: 1",
+ "@@@STEP_FAILURE@@@"
+ ]
+ },
+ {
+ "cmd": [
+ "false"
+ ],
+ "env": {
+ "BUILDTYPE": "Release_x64",
+ "CHROME_HEADLESS": "1",
+ "PATH": "%(PATH)s:RECIPE_PACKAGE_REPO[depot_tools]",
+ "SKIA_OUT": "[CUSTOM_C:\\_B_WORK]/skia/out/Build-Win-MSVC-x86_64-Release-Vulkan"
+ },
+ "name": "retry fail (attempt 5)",
+ "~followup_annotations": [
+ "step returned non-zero exit code: 1",
+ "@@@STEP_FAILURE@@@"
+ ]
+ },
+ {
+ "cmd": [
+ "false"
+ ],
+ "env": {
+ "BUILDTYPE": "Release_x64",
+ "CHROME_HEADLESS": "1",
+ "PATH": "%(PATH)s:RECIPE_PACKAGE_REPO[depot_tools]",
+ "SKIA_OUT": "[CUSTOM_C:\\_B_WORK]/skia/out/Build-Win-MSVC-x86_64-Release-Vulkan"
+ },
+ "name": "retry success",
+ "~followup_annotations": [
+ "step returned non-zero exit code: 1",
+ "@@@STEP_FAILURE@@@"
+ ]
+ },
+ {
+ "cmd": [
+ "false"
+ ],
+ "env": {
+ "BUILDTYPE": "Release_x64",
+ "CHROME_HEADLESS": "1",
+ "PATH": "%(PATH)s:RECIPE_PACKAGE_REPO[depot_tools]",
+ "SKIA_OUT": "[CUSTOM_C:\\_B_WORK]/skia/out/Build-Win-MSVC-x86_64-Release-Vulkan"
+ },
+ "name": "retry success (attempt 2)",
+ "~followup_annotations": [
+ "step returned non-zero exit code: 1",
+ "@@@STEP_FAILURE@@@"
+ ]
+ },
+ {
+ "cmd": [
+ "false"
+ ],
+ "env": {
+ "BUILDTYPE": "Release_x64",
+ "CHROME_HEADLESS": "1",
+ "PATH": "%(PATH)s:RECIPE_PACKAGE_REPO[depot_tools]",
+ "SKIA_OUT": "[CUSTOM_C:\\_B_WORK]/skia/out/Build-Win-MSVC-x86_64-Release-Vulkan"
+ },
+ "name": "retry success (attempt 3)"
+ },
+ {
+ "name": "$result",
+ "reason": "Failed build steps: fail, retry fail, retry fail (attempt 2), retry fail (attempt 3), retry fail (attempt 4), retry fail (attempt 5), retry success, retry success (attempt 2)",
+ "recipe_result": null,
+ "status_code": 1
+ }
+] \ No newline at end of file
diff --git a/infra/bots/recipe_modules/run/example.py b/infra/bots/recipe_modules/run/example.py
new file mode 100644
index 0000000000..fb61b48846
--- /dev/null
+++ b/infra/bots/recipe_modules/run/example.py
@@ -0,0 +1,69 @@
+# Copyright 2017 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 = [
+ 'recipe_engine/path',
+ 'recipe_engine/properties',
+ 'recipe_engine/step',
+ 'run',
+ 'vars',
+]
+
+
+def myfunc(api, i):
+ api.run(api.step, 'run %d' % i, cmd=['echo', str(i)])
+
+
+def RunSteps(api):
+ api.vars.setup()
+ api.run(api.step, 'fail', cmd=['false'], abort_on_failure=False)
+ api.run(api.step, 'do a thing', cmd=['echo', 'do the thing'])
+ assert len(api.run.failed_steps) == 1
+
+ # Run once.
+ for i in range(10):
+ api.run.run_once(myfunc, api, i)
+
+ # Read and write files.
+ api.run.readfile('myfile.txt')
+ api.run.writefile('myfile.txt', 'contents')
+ api.run.rmtree('mydir')
+
+ # Merge PATHs.
+ with api.step.context({'env': {'PATH': 'mydir:%(PATH)s'}}):
+ api.run(api.step, 'env', cmd=['env'])
+
+ # Copy build products.
+ api.run.copy_build_products('src', 'dst')
+
+ # Retries.
+ try:
+ api.run.with_retry(api.step, 'retry fail', 5, cmd=['false'])
+ except api.step.StepFailure:
+ pass
+ api.run.with_retry(api.step, 'retry success', 3, cmd=['false'])
+
+ # Check failure.
+ api.run.check_failure()
+
+
+def GenTests(api):
+ buildername = 'Build-Win-MSVC-x86_64-Release-Vulkan'
+ yield (
+ api.test('test') +
+ api.properties(buildername=buildername,
+ repository='https://skia.googlesource.com/skia.git',
+ revision='abc123',
+ path_config='kitchen',
+ swarm_out_dir='[SWARM_OUT_DIR]') +
+ api.step_data('fail', retcode=1) +
+ api.step_data('retry fail', retcode=1) +
+ api.step_data('retry fail (attempt 2)', retcode=1) +
+ api.step_data('retry fail (attempt 3)', retcode=1) +
+ api.step_data('retry fail (attempt 4)', retcode=1) +
+ api.step_data('retry fail (attempt 5)', retcode=1) +
+ api.step_data('retry success', retcode=1) +
+ api.step_data('retry success (attempt 2)', retcode=1)
+ )
diff --git a/infra/bots/recipe_modules/swarming/__init__.py b/infra/bots/recipe_modules/swarming/__init__.py
index cc099f61c0..3e05b02b1f 100644
--- a/infra/bots/recipe_modules/swarming/__init__.py
+++ b/infra/bots/recipe_modules/swarming/__init__.py
@@ -16,7 +16,3 @@ DEPS = [
'recipe_engine/step',
'run',
]
-
-
-# TODO(borenet): Add coverage
-DISABLE_STRICT_COVERAGE = True
diff --git a/infra/bots/recipe_modules/swarming/example.expected/test.json b/infra/bots/recipe_modules/swarming/example.expected/test.json
new file mode 100644
index 0000000000..310d828435
--- /dev/null
+++ b/infra/bots/recipe_modules/swarming/example.expected/test.json
@@ -0,0 +1,863 @@
+[
+ {
+ "cmd": [
+ "python",
+ "-u",
+ "RECIPE_MODULE[depot_tools::git]/resources/git_setup.py",
+ "--path",
+ "[START_DIR]/swarming.client",
+ "--url",
+ "https://chromium.googlesource.com/external/swarming.client.git"
+ ],
+ "name": "git setup (swarming_client)"
+ },
+ {
+ "cmd": [
+ "git",
+ "retry",
+ "fetch",
+ "origin",
+ "abc123"
+ ],
+ "cwd": "[START_DIR]/swarming.client",
+ "env": {
+ "PATH": "RECIPE_PACKAGE_REPO[depot_tools]:%(PATH)s"
+ },
+ "infra_step": true,
+ "name": "git fetch (swarming_client)"
+ },
+ {
+ "cmd": [
+ "git",
+ "checkout",
+ "-f",
+ "FETCH_HEAD"
+ ],
+ "cwd": "[START_DIR]/swarming.client",
+ "infra_step": true,
+ "name": "git checkout (swarming_client)"
+ },
+ {
+ "cmd": [
+ "git",
+ "rev-parse",
+ "HEAD"
+ ],
+ "cwd": "[START_DIR]/swarming.client",
+ "infra_step": true,
+ "name": "read revision",
+ "stdout": "/path/to/tmp/",
+ "~followup_annotations": [
+ "@@@STEP_TEXT@<br/>checked out 'deadbeef'<br/>@@@"
+ ]
+ },
+ {
+ "cmd": [
+ "git",
+ "clean",
+ "-f",
+ "-d",
+ "-x"
+ ],
+ "cwd": "[START_DIR]/swarming.client",
+ "infra_step": true,
+ "name": "git clean (swarming_client)"
+ },
+ {
+ "cmd": [
+ "git",
+ "submodule",
+ "sync"
+ ],
+ "cwd": "[START_DIR]/swarming.client",
+ "infra_step": true,
+ "name": "submodule sync (swarming_client)"
+ },
+ {
+ "cmd": [
+ "git",
+ "submodule",
+ "update",
+ "--init",
+ "--recursive"
+ ],
+ "cwd": "[START_DIR]/swarming.client",
+ "infra_step": true,
+ "name": "submodule update (swarming_client)"
+ },
+ {
+ "cmd": [
+ "python",
+ "-u",
+ "[START_DIR]/swarming.client/swarming.py",
+ "--version"
+ ],
+ "name": "swarming.py --version",
+ "stdout": "/path/to/tmp/",
+ "~followup_annotations": [
+ "@@@STEP_TEXT@0.8.6@@@"
+ ]
+ },
+ {
+ "cmd": [
+ "download_from_google_storage",
+ "--no_resume",
+ "--platform=linux*",
+ "--no_auth",
+ "--bucket",
+ "chromium-luci",
+ "-d",
+ "lmydirimydirnmydirumydirxmydir6mydir4"
+ ],
+ "env": {
+ "PATH": "RECIPE_PACKAGE_REPO[depot_tools]:%(PATH)s"
+ },
+ "name": "download luci-go linux"
+ },
+ {
+ "cmd": [
+ "download_from_google_storage",
+ "--no_resume",
+ "--platform=darwin",
+ "--no_auth",
+ "--bucket",
+ "chromium-luci",
+ "-d",
+ "mmydiramydircmydir6mydir4"
+ ],
+ "env": {
+ "PATH": "RECIPE_PACKAGE_REPO[depot_tools]:%(PATH)s"
+ },
+ "name": "download luci-go mac"
+ },
+ {
+ "cmd": [
+ "download_from_google_storage",
+ "--no_resume",
+ "--platform=win32",
+ "--no_auth",
+ "--bucket",
+ "chromium-luci",
+ "-d",
+ "wmydirimydirnmydir6mydir4"
+ ],
+ "env": {
+ "PATH": "RECIPE_PACKAGE_REPO[depot_tools]:%(PATH)s"
+ },
+ "name": "download luci-go win"
+ },
+ {
+ "cmd": [
+ "python",
+ "-u",
+ "RECIPE_MODULE[build::file]/resources/fileutil.py",
+ "rmtree",
+ "[START_DIR]/luci-go"
+ ],
+ "env": {
+ "PYTHONPATH": "[START_DIR]/skia/infra/bots/.recipe_deps/build/scripts"
+ },
+ "infra_step": true,
+ "name": "rmtree luci-go"
+ },
+ {
+ "cmd": [
+ "python",
+ "-u",
+ "\nimport shutil\nimport sys\nshutil.copytree(sys.argv[1], sys.argv[2], symlinks=bool(sys.argv[3]))\n",
+ "mydir",
+ "[START_DIR]/luci-go",
+ "0"
+ ],
+ "name": "Copy Go binary"
+ },
+ {
+ "cmd": [
+ "python",
+ "-u",
+ "\nimport sys, os\npath = sys.argv[1]\nmode = int(sys.argv[2])\nif not os.path.isdir(path):\n if os.path.exists(path):\n print \"%s exists but is not a dir\" % path\n sys.exit(1)\n os.makedirs(path, mode)\n",
+ "[START_DIR]/swarming_temp_dir",
+ "511"
+ ],
+ "name": "makedirs swarming tmp dir",
+ "~followup_annotations": [
+ "@@@STEP_LOG_LINE@python.inline@@@@",
+ "@@@STEP_LOG_LINE@python.inline@import sys, os@@@",
+ "@@@STEP_LOG_LINE@python.inline@path = sys.argv[1]@@@",
+ "@@@STEP_LOG_LINE@python.inline@mode = int(sys.argv[2])@@@",
+ "@@@STEP_LOG_LINE@python.inline@if not os.path.isdir(path):@@@",
+ "@@@STEP_LOG_LINE@python.inline@ if os.path.exists(path):@@@",
+ "@@@STEP_LOG_LINE@python.inline@ print \"%s exists but is not a dir\" % path@@@",
+ "@@@STEP_LOG_LINE@python.inline@ sys.exit(1)@@@",
+ "@@@STEP_LOG_LINE@python.inline@ os.makedirs(path, mode)@@@",
+ "@@@STEP_LOG_END@python.inline@@@"
+ ]
+ },
+ {
+ "cmd": [
+ "python",
+ "-u",
+ "\nimport shutil\nimport sys\nshutil.copy(sys.argv[1], sys.argv[2])\n",
+ "{\n \"args\": [\n \"--isolate\", \n \"isolate_path\", \n \"--isolated\", \n \"[START_DIR]/swarming_temp_dir/skia-task-task.isolated\", \n \"--config-variable\", \n \"OS\", \n \"linux\", \n \"--extra-variable\", \n \"myvar\", \n \"myval\"\n ], \n \"dir\": \"isolate_dir\", \n \"version\": 1\n}",
+ "[START_DIR]/swarming_temp_dir/task.isolated.gen.json"
+ ],
+ "name": "Write task.isolated.gen.json"
+ },
+ {
+ "cmd": [
+ "python",
+ "-u",
+ "RECIPE_MODULE[build::isolate]/resources/isolate.py",
+ "[START_DIR]/swarming.client",
+ "batcharchive",
+ "--dump-json",
+ "/path/to/tmp/json",
+ "--isolate-server",
+ "https://isolateserver.appspot.com",
+ "--verbose",
+ "[START_DIR]/swarming_temp_dir/task-0.isolated.gen.json",
+ "[START_DIR]/swarming_temp_dir/task-1.isolated.gen.json",
+ "[START_DIR]/swarming_temp_dir/task-2.isolated.gen.json",
+ "[START_DIR]/swarming_temp_dir/task-3.isolated.gen.json",
+ "[START_DIR]/swarming_temp_dir/task-4.isolated.gen.json"
+ ],
+ "name": "isolate tests",
+ "~followup_annotations": [
+ "@@@STEP_LOG_LINE@json.output@{@@@",
+ "@@@STEP_LOG_LINE@json.output@ \"task-0\": \"[dummy hash for task-0]\", @@@",
+ "@@@STEP_LOG_LINE@json.output@ \"task-1\": \"[dummy hash for task-1]\", @@@",
+ "@@@STEP_LOG_LINE@json.output@ \"task-2\": \"[dummy hash for task-2]\", @@@",
+ "@@@STEP_LOG_LINE@json.output@ \"task-3\": \"[dummy hash for task-3]\", @@@",
+ "@@@STEP_LOG_LINE@json.output@ \"task-4\": \"[dummy hash for task-4]\"@@@",
+ "@@@STEP_LOG_LINE@json.output@}@@@",
+ "@@@STEP_LOG_END@json.output@@@",
+ "@@@SET_BUILD_PROPERTY@swarm_hashes@{\"task-0\": \"[dummy hash for task-0]\", \"task-1\": \"[dummy hash for task-1]\", \"task-2\": \"[dummy hash for task-2]\", \"task-3\": \"[dummy hash for task-3]\", \"task-4\": \"[dummy hash for task-4]\"}@@@"
+ ]
+ },
+ {
+ "cmd": [
+ "python",
+ "-u",
+ "[START_DIR]/swarming.client/swarming.py",
+ "trigger",
+ "--swarming",
+ "https://chromium-swarm.appspot.com",
+ "--isolate-server",
+ "https://isolateserver.appspot.com",
+ "--priority",
+ "90",
+ "--shards",
+ "1",
+ "--task-name",
+ "task-4/Linux/[dummy has",
+ "--dump-json",
+ "/path/to/tmp/json",
+ "--expiration",
+ "72000",
+ "--io-timeout",
+ "2400",
+ "--hard-timeout",
+ "14400",
+ "--dimension",
+ "os",
+ "Linux",
+ "--tag",
+ "allow_milo:1",
+ "--tag",
+ "data:[dummy hash for task-4]",
+ "--tag",
+ "name:task-4",
+ "--tag",
+ "os:Linux",
+ "--tag",
+ "revision:abc123",
+ "--tag",
+ "stepname:task-4",
+ "[dummy hash for task-4]"
+ ],
+ "infra_step": true,
+ "name": "[trigger] task-4",
+ "~followup_annotations": [
+ "@@@STEP_TEXT@Run on OS: 'Linux'@@@",
+ "@@@STEP_LOG_LINE@json.output@{@@@",
+ "@@@STEP_LOG_LINE@json.output@ \"base_task_name\": \"task-4/Linux/[dummy has\", @@@",
+ "@@@STEP_LOG_LINE@json.output@ \"tasks\": {@@@",
+ "@@@STEP_LOG_LINE@json.output@ \"task-4/Linux/[dummy has\": {@@@",
+ "@@@STEP_LOG_LINE@json.output@ \"shard_index\": 0, @@@",
+ "@@@STEP_LOG_LINE@json.output@ \"task_id\": \"10000\", @@@",
+ "@@@STEP_LOG_LINE@json.output@ \"view_url\": \"https://chromium-swarm.appspot.com/user/task/10000\"@@@",
+ "@@@STEP_LOG_LINE@json.output@ }@@@",
+ "@@@STEP_LOG_LINE@json.output@ }@@@",
+ "@@@STEP_LOG_LINE@json.output@}@@@",
+ "@@@STEP_LOG_END@json.output@@@",
+ "@@@STEP_LINK@shard #0@https://chromium-swarm.appspot.com/user/task/10000@@@"
+ ]
+ },
+ {
+ "cmd": [
+ "python",
+ "-u",
+ "[START_DIR]/swarming.client/swarming.py",
+ "trigger",
+ "--swarming",
+ "https://chromium-swarm.appspot.com",
+ "--isolate-server",
+ "https://isolateserver.appspot.com",
+ "--priority",
+ "90",
+ "--shards",
+ "1",
+ "--task-name",
+ "task-2/Linux/[dummy has",
+ "--dump-json",
+ "/path/to/tmp/json",
+ "--expiration",
+ "72000",
+ "--io-timeout",
+ "2400",
+ "--hard-timeout",
+ "14400",
+ "--dimension",
+ "os",
+ "Linux",
+ "--tag",
+ "allow_milo:1",
+ "--tag",
+ "data:[dummy hash for task-2]",
+ "--tag",
+ "name:task-2",
+ "--tag",
+ "os:Linux",
+ "--tag",
+ "revision:abc123",
+ "--tag",
+ "stepname:task-2",
+ "[dummy hash for task-2]"
+ ],
+ "infra_step": true,
+ "name": "[trigger] task-2",
+ "~followup_annotations": [
+ "@@@STEP_TEXT@Run on OS: 'Linux'@@@",
+ "@@@STEP_LOG_LINE@json.output@{@@@",
+ "@@@STEP_LOG_LINE@json.output@ \"base_task_name\": \"task-2/Linux/[dummy has\", @@@",
+ "@@@STEP_LOG_LINE@json.output@ \"tasks\": {@@@",
+ "@@@STEP_LOG_LINE@json.output@ \"task-2/Linux/[dummy has\": {@@@",
+ "@@@STEP_LOG_LINE@json.output@ \"shard_index\": 0, @@@",
+ "@@@STEP_LOG_LINE@json.output@ \"task_id\": \"10000\", @@@",
+ "@@@STEP_LOG_LINE@json.output@ \"view_url\": \"https://chromium-swarm.appspot.com/user/task/10000\"@@@",
+ "@@@STEP_LOG_LINE@json.output@ }@@@",
+ "@@@STEP_LOG_LINE@json.output@ }@@@",
+ "@@@STEP_LOG_LINE@json.output@}@@@",
+ "@@@STEP_LOG_END@json.output@@@",
+ "@@@STEP_LINK@shard #0@https://chromium-swarm.appspot.com/user/task/10000@@@"
+ ]
+ },
+ {
+ "cmd": [
+ "python",
+ "-u",
+ "[START_DIR]/swarming.client/swarming.py",
+ "trigger",
+ "--swarming",
+ "https://chromium-swarm.appspot.com",
+ "--isolate-server",
+ "https://isolateserver.appspot.com",
+ "--priority",
+ "90",
+ "--shards",
+ "1",
+ "--task-name",
+ "task-3/Linux/[dummy has",
+ "--dump-json",
+ "/path/to/tmp/json",
+ "--expiration",
+ "72000",
+ "--io-timeout",
+ "2400",
+ "--hard-timeout",
+ "14400",
+ "--dimension",
+ "os",
+ "Linux",
+ "--tag",
+ "allow_milo:1",
+ "--tag",
+ "data:[dummy hash for task-3]",
+ "--tag",
+ "name:task-3",
+ "--tag",
+ "os:Linux",
+ "--tag",
+ "revision:abc123",
+ "--tag",
+ "stepname:task-3",
+ "[dummy hash for task-3]"
+ ],
+ "infra_step": true,
+ "name": "[trigger] task-3",
+ "~followup_annotations": [
+ "@@@STEP_TEXT@Run on OS: 'Linux'@@@",
+ "@@@STEP_LOG_LINE@json.output@{@@@",
+ "@@@STEP_LOG_LINE@json.output@ \"base_task_name\": \"task-3/Linux/[dummy has\", @@@",
+ "@@@STEP_LOG_LINE@json.output@ \"tasks\": {@@@",
+ "@@@STEP_LOG_LINE@json.output@ \"task-3/Linux/[dummy has\": {@@@",
+ "@@@STEP_LOG_LINE@json.output@ \"shard_index\": 0, @@@",
+ "@@@STEP_LOG_LINE@json.output@ \"task_id\": \"10000\", @@@",
+ "@@@STEP_LOG_LINE@json.output@ \"view_url\": \"https://chromium-swarm.appspot.com/user/task/10000\"@@@",
+ "@@@STEP_LOG_LINE@json.output@ }@@@",
+ "@@@STEP_LOG_LINE@json.output@ }@@@",
+ "@@@STEP_LOG_LINE@json.output@}@@@",
+ "@@@STEP_LOG_END@json.output@@@",
+ "@@@STEP_LINK@shard #0@https://chromium-swarm.appspot.com/user/task/10000@@@"
+ ]
+ },
+ {
+ "cmd": [
+ "python",
+ "-u",
+ "[START_DIR]/swarming.client/swarming.py",
+ "trigger",
+ "--swarming",
+ "https://chromium-swarm.appspot.com",
+ "--isolate-server",
+ "https://isolateserver.appspot.com",
+ "--priority",
+ "90",
+ "--shards",
+ "1",
+ "--task-name",
+ "task-0/Linux/[dummy has",
+ "--dump-json",
+ "/path/to/tmp/json",
+ "--expiration",
+ "72000",
+ "--io-timeout",
+ "2400",
+ "--hard-timeout",
+ "14400",
+ "--dimension",
+ "os",
+ "Linux",
+ "--tag",
+ "allow_milo:1",
+ "--tag",
+ "data:[dummy hash for task-0]",
+ "--tag",
+ "name:task-0",
+ "--tag",
+ "os:Linux",
+ "--tag",
+ "revision:abc123",
+ "--tag",
+ "stepname:task-0",
+ "[dummy hash for task-0]"
+ ],
+ "infra_step": true,
+ "name": "[trigger] task-0",
+ "~followup_annotations": [
+ "@@@STEP_TEXT@Run on OS: 'Linux'@@@",
+ "@@@STEP_LOG_LINE@json.output@{@@@",
+ "@@@STEP_LOG_LINE@json.output@ \"base_task_name\": \"task-0/Linux/[dummy has\", @@@",
+ "@@@STEP_LOG_LINE@json.output@ \"tasks\": {@@@",
+ "@@@STEP_LOG_LINE@json.output@ \"task-0/Linux/[dummy has\": {@@@",
+ "@@@STEP_LOG_LINE@json.output@ \"shard_index\": 0, @@@",
+ "@@@STEP_LOG_LINE@json.output@ \"task_id\": \"10000\", @@@",
+ "@@@STEP_LOG_LINE@json.output@ \"view_url\": \"https://chromium-swarm.appspot.com/user/task/10000\"@@@",
+ "@@@STEP_LOG_LINE@json.output@ }@@@",
+ "@@@STEP_LOG_LINE@json.output@ }@@@",
+ "@@@STEP_LOG_LINE@json.output@}@@@",
+ "@@@STEP_LOG_END@json.output@@@",
+ "@@@STEP_LINK@shard #0@https://chromium-swarm.appspot.com/user/task/10000@@@"
+ ]
+ },
+ {
+ "cmd": [
+ "python",
+ "-u",
+ "[START_DIR]/swarming.client/swarming.py",
+ "trigger",
+ "--swarming",
+ "https://chromium-swarm.appspot.com",
+ "--isolate-server",
+ "https://isolateserver.appspot.com",
+ "--priority",
+ "90",
+ "--shards",
+ "1",
+ "--task-name",
+ "task-1/Linux/[dummy has",
+ "--dump-json",
+ "/path/to/tmp/json",
+ "--expiration",
+ "72000",
+ "--io-timeout",
+ "2400",
+ "--hard-timeout",
+ "14400",
+ "--dimension",
+ "os",
+ "Linux",
+ "--tag",
+ "allow_milo:1",
+ "--tag",
+ "data:[dummy hash for task-1]",
+ "--tag",
+ "name:task-1",
+ "--tag",
+ "os:Linux",
+ "--tag",
+ "revision:abc123",
+ "--tag",
+ "stepname:task-1",
+ "[dummy hash for task-1]"
+ ],
+ "infra_step": true,
+ "name": "[trigger] task-1",
+ "~followup_annotations": [
+ "@@@STEP_TEXT@Run on OS: 'Linux'@@@",
+ "@@@STEP_LOG_LINE@json.output@{@@@",
+ "@@@STEP_LOG_LINE@json.output@ \"base_task_name\": \"task-1/Linux/[dummy has\", @@@",
+ "@@@STEP_LOG_LINE@json.output@ \"tasks\": {@@@",
+ "@@@STEP_LOG_LINE@json.output@ \"task-1/Linux/[dummy has\": {@@@",
+ "@@@STEP_LOG_LINE@json.output@ \"shard_index\": 0, @@@",
+ "@@@STEP_LOG_LINE@json.output@ \"task_id\": \"10000\", @@@",
+ "@@@STEP_LOG_LINE@json.output@ \"view_url\": \"https://chromium-swarm.appspot.com/user/task/10000\"@@@",
+ "@@@STEP_LOG_LINE@json.output@ }@@@",
+ "@@@STEP_LOG_LINE@json.output@ }@@@",
+ "@@@STEP_LOG_LINE@json.output@}@@@",
+ "@@@STEP_LOG_END@json.output@@@",
+ "@@@STEP_LINK@shard #0@https://chromium-swarm.appspot.com/user/task/10000@@@",
+ "@@@STEP_LINK@view steps on Milo@https://luci-milo.appspot.com/swarming/task/10000@@@"
+ ]
+ },
+ {
+ "cmd": [
+ "python",
+ "-u",
+ "[START_DIR]/swarming.client/swarming.py",
+ "collect",
+ "--swarming",
+ "https://chromium-swarm.appspot.com",
+ "--decorate",
+ "--print-status-updates",
+ "--json",
+ "{\"base_task_name\": \"task-4/Linux/[dummy has\", \"tasks\": {\"task-4/Linux/[dummy has\": {\"shard_index\": 0, \"task_id\": \"10000\", \"view_url\": \"https://chromium-swarm.appspot.com/user/task/10000\"}}}",
+ "--task-summary-json",
+ "/path/to/tmp/json",
+ "--task-output-dir",
+ "[START_DIR]/swarming_temp_dir/outputs/task-4"
+ ],
+ "name": "task-4",
+ "~followup_annotations": [
+ "@@@STEP_TEXT@Run on OS: 'Linux'<br>swarming pending 71s@@@",
+ "@@@STEP_LOG_LINE@swarming.summary@{@@@",
+ "@@@STEP_LOG_LINE@swarming.summary@ \"shards\": [@@@",
+ "@@@STEP_LOG_LINE@swarming.summary@ {@@@",
+ "@@@STEP_LOG_LINE@swarming.summary@ \"abandoned_ts\": null, @@@",
+ "@@@STEP_LOG_LINE@swarming.summary@ \"bot_id\": \"vm30\", @@@",
+ "@@@STEP_LOG_LINE@swarming.summary@ \"completed_ts\": \"2014-09-25T01:42:00.123\", @@@",
+ "@@@STEP_LOG_LINE@swarming.summary@ \"created_ts\": \"2014-09-25T01:41:00.123\", @@@",
+ "@@@STEP_LOG_LINE@swarming.summary@ \"durations\": [@@@",
+ "@@@STEP_LOG_LINE@swarming.summary@ 5.7, @@@",
+ "@@@STEP_LOG_LINE@swarming.summary@ 31.5@@@",
+ "@@@STEP_LOG_LINE@swarming.summary@ ], @@@",
+ "@@@STEP_LOG_LINE@swarming.summary@ \"exit_codes\": [@@@",
+ "@@@STEP_LOG_LINE@swarming.summary@ 0, @@@",
+ "@@@STEP_LOG_LINE@swarming.summary@ 0@@@",
+ "@@@STEP_LOG_LINE@swarming.summary@ ], @@@",
+ "@@@STEP_LOG_LINE@swarming.summary@ \"failure\": false, @@@",
+ "@@@STEP_LOG_LINE@swarming.summary@ \"id\": \"148aa78d7aa0000\", @@@",
+ "@@@STEP_LOG_LINE@swarming.summary@ \"internal_failure\": false, @@@",
+ "@@@STEP_LOG_LINE@swarming.summary@ \"isolated_out\": {@@@",
+ "@@@STEP_LOG_LINE@swarming.summary@ \"isolated\": \"abc123\", @@@",
+ "@@@STEP_LOG_LINE@swarming.summary@ \"isolatedserver\": \"https://isolateserver.appspot.com\", @@@",
+ "@@@STEP_LOG_LINE@swarming.summary@ \"namespace\": \"default-gzip\", @@@",
+ "@@@STEP_LOG_LINE@swarming.summary@ \"view_url\": \"blah\"@@@",
+ "@@@STEP_LOG_LINE@swarming.summary@ }, @@@",
+ "@@@STEP_LOG_LINE@swarming.summary@ \"modified_ts\": \"2014-09-25 01:42:00\", @@@",
+ "@@@STEP_LOG_LINE@swarming.summary@ \"name\": \"heartbeat-canary-2014-09-25_01:41:55-os=Windows\", @@@",
+ "@@@STEP_LOG_LINE@swarming.summary@ \"outputs\": [@@@",
+ "@@@STEP_LOG_LINE@swarming.summary@ \"Heart beat succeeded on win32.\\n\", @@@",
+ "@@@STEP_LOG_LINE@swarming.summary@ \"Foo\"@@@",
+ "@@@STEP_LOG_LINE@swarming.summary@ ], @@@",
+ "@@@STEP_LOG_LINE@swarming.summary@ \"outputs_ref\": {@@@",
+ "@@@STEP_LOG_LINE@swarming.summary@ \"view_url\": \"blah\"@@@",
+ "@@@STEP_LOG_LINE@swarming.summary@ }, @@@",
+ "@@@STEP_LOG_LINE@swarming.summary@ \"started_ts\": \"2014-09-25T01:42:11.123\", @@@",
+ "@@@STEP_LOG_LINE@swarming.summary@ \"state\": 112, @@@",
+ "@@@STEP_LOG_LINE@swarming.summary@ \"try_number\": 1, @@@",
+ "@@@STEP_LOG_LINE@swarming.summary@ \"user\": \"unknown\"@@@",
+ "@@@STEP_LOG_LINE@swarming.summary@ }@@@",
+ "@@@STEP_LOG_LINE@swarming.summary@ ]@@@",
+ "@@@STEP_LOG_LINE@swarming.summary@}@@@",
+ "@@@STEP_LOG_END@swarming.summary@@@",
+ "@@@STEP_LINK@shard #0 isolated out@blah@@@",
+ "@@@STEP_LINK@view steps on Milo@https://luci-milo.appspot.com/swarming/task/148aa78d7aa0000@@@"
+ ]
+ },
+ {
+ "cmd": [
+ "python",
+ "-u",
+ "[START_DIR]/swarming.client/swarming.py",
+ "collect",
+ "--swarming",
+ "https://chromium-swarm.appspot.com",
+ "--decorate",
+ "--print-status-updates",
+ "--json",
+ "{\"base_task_name\": \"task-2/Linux/[dummy has\", \"tasks\": {\"task-2/Linux/[dummy has\": {\"shard_index\": 0, \"task_id\": \"10000\", \"view_url\": \"https://chromium-swarm.appspot.com/user/task/10000\"}}}",
+ "--task-summary-json",
+ "/path/to/tmp/json",
+ "--task-output-dir",
+ "[START_DIR]/swarming_temp_dir/outputs/task-2"
+ ],
+ "name": "task-2",
+ "~followup_annotations": [
+ "@@@STEP_TEXT@Run on OS: 'Linux'<br>swarming pending 71s@@@",
+ "@@@STEP_LOG_LINE@swarming.summary@{@@@",
+ "@@@STEP_LOG_LINE@swarming.summary@ \"shards\": [@@@",
+ "@@@STEP_LOG_LINE@swarming.summary@ {@@@",
+ "@@@STEP_LOG_LINE@swarming.summary@ \"abandoned_ts\": null, @@@",
+ "@@@STEP_LOG_LINE@swarming.summary@ \"bot_id\": \"vm30\", @@@",
+ "@@@STEP_LOG_LINE@swarming.summary@ \"completed_ts\": \"2014-09-25T01:42:00.123\", @@@",
+ "@@@STEP_LOG_LINE@swarming.summary@ \"created_ts\": \"2014-09-25T01:41:00.123\", @@@",
+ "@@@STEP_LOG_LINE@swarming.summary@ \"durations\": [@@@",
+ "@@@STEP_LOG_LINE@swarming.summary@ 5.7, @@@",
+ "@@@STEP_LOG_LINE@swarming.summary@ 31.5@@@",
+ "@@@STEP_LOG_LINE@swarming.summary@ ], @@@",
+ "@@@STEP_LOG_LINE@swarming.summary@ \"exit_codes\": [@@@",
+ "@@@STEP_LOG_LINE@swarming.summary@ 0, @@@",
+ "@@@STEP_LOG_LINE@swarming.summary@ 0@@@",
+ "@@@STEP_LOG_LINE@swarming.summary@ ], @@@",
+ "@@@STEP_LOG_LINE@swarming.summary@ \"failure\": false, @@@",
+ "@@@STEP_LOG_LINE@swarming.summary@ \"id\": \"148aa78d7aa0000\", @@@",
+ "@@@STEP_LOG_LINE@swarming.summary@ \"internal_failure\": false, @@@",
+ "@@@STEP_LOG_LINE@swarming.summary@ \"isolated_out\": {@@@",
+ "@@@STEP_LOG_LINE@swarming.summary@ \"isolated\": \"abc123\", @@@",
+ "@@@STEP_LOG_LINE@swarming.summary@ \"isolatedserver\": \"https://isolateserver.appspot.com\", @@@",
+ "@@@STEP_LOG_LINE@swarming.summary@ \"namespace\": \"default-gzip\", @@@",
+ "@@@STEP_LOG_LINE@swarming.summary@ \"view_url\": \"blah\"@@@",
+ "@@@STEP_LOG_LINE@swarming.summary@ }, @@@",
+ "@@@STEP_LOG_LINE@swarming.summary@ \"modified_ts\": \"2014-09-25 01:42:00\", @@@",
+ "@@@STEP_LOG_LINE@swarming.summary@ \"name\": \"heartbeat-canary-2014-09-25_01:41:55-os=Windows\", @@@",
+ "@@@STEP_LOG_LINE@swarming.summary@ \"outputs\": [@@@",
+ "@@@STEP_LOG_LINE@swarming.summary@ \"Heart beat succeeded on win32.\\n\", @@@",
+ "@@@STEP_LOG_LINE@swarming.summary@ \"Foo\"@@@",
+ "@@@STEP_LOG_LINE@swarming.summary@ ], @@@",
+ "@@@STEP_LOG_LINE@swarming.summary@ \"outputs_ref\": {@@@",
+ "@@@STEP_LOG_LINE@swarming.summary@ \"view_url\": \"blah\"@@@",
+ "@@@STEP_LOG_LINE@swarming.summary@ }, @@@",
+ "@@@STEP_LOG_LINE@swarming.summary@ \"started_ts\": \"2014-09-25T01:42:11.123\", @@@",
+ "@@@STEP_LOG_LINE@swarming.summary@ \"state\": 112, @@@",
+ "@@@STEP_LOG_LINE@swarming.summary@ \"try_number\": 1, @@@",
+ "@@@STEP_LOG_LINE@swarming.summary@ \"user\": \"unknown\"@@@",
+ "@@@STEP_LOG_LINE@swarming.summary@ }@@@",
+ "@@@STEP_LOG_LINE@swarming.summary@ ]@@@",
+ "@@@STEP_LOG_LINE@swarming.summary@}@@@",
+ "@@@STEP_LOG_END@swarming.summary@@@",
+ "@@@STEP_LINK@shard #0 isolated out@blah@@@",
+ "@@@STEP_LINK@view steps on Milo@https://luci-milo.appspot.com/swarming/task/148aa78d7aa0000@@@"
+ ]
+ },
+ {
+ "cmd": [
+ "python",
+ "-u",
+ "[START_DIR]/swarming.client/swarming.py",
+ "collect",
+ "--swarming",
+ "https://chromium-swarm.appspot.com",
+ "--decorate",
+ "--print-status-updates",
+ "--json",
+ "{\"base_task_name\": \"task-3/Linux/[dummy has\", \"tasks\": {\"task-3/Linux/[dummy has\": {\"shard_index\": 0, \"task_id\": \"10000\", \"view_url\": \"https://chromium-swarm.appspot.com/user/task/10000\"}}}",
+ "--task-summary-json",
+ "/path/to/tmp/json",
+ "--task-output-dir",
+ "[START_DIR]/swarming_temp_dir/outputs/task-3"
+ ],
+ "name": "task-3",
+ "~followup_annotations": [
+ "@@@STEP_TEXT@Run on OS: 'Linux'<br>swarming pending 71s@@@",
+ "@@@STEP_LOG_LINE@swarming.summary@{@@@",
+ "@@@STEP_LOG_LINE@swarming.summary@ \"shards\": [@@@",
+ "@@@STEP_LOG_LINE@swarming.summary@ {@@@",
+ "@@@STEP_LOG_LINE@swarming.summary@ \"abandoned_ts\": null, @@@",
+ "@@@STEP_LOG_LINE@swarming.summary@ \"bot_id\": \"vm30\", @@@",
+ "@@@STEP_LOG_LINE@swarming.summary@ \"completed_ts\": \"2014-09-25T01:42:00.123\", @@@",
+ "@@@STEP_LOG_LINE@swarming.summary@ \"created_ts\": \"2014-09-25T01:41:00.123\", @@@",
+ "@@@STEP_LOG_LINE@swarming.summary@ \"durations\": [@@@",
+ "@@@STEP_LOG_LINE@swarming.summary@ 5.7, @@@",
+ "@@@STEP_LOG_LINE@swarming.summary@ 31.5@@@",
+ "@@@STEP_LOG_LINE@swarming.summary@ ], @@@",
+ "@@@STEP_LOG_LINE@swarming.summary@ \"exit_codes\": [@@@",
+ "@@@STEP_LOG_LINE@swarming.summary@ 0, @@@",
+ "@@@STEP_LOG_LINE@swarming.summary@ 0@@@",
+ "@@@STEP_LOG_LINE@swarming.summary@ ], @@@",
+ "@@@STEP_LOG_LINE@swarming.summary@ \"failure\": false, @@@",
+ "@@@STEP_LOG_LINE@swarming.summary@ \"id\": \"148aa78d7aa0000\", @@@",
+ "@@@STEP_LOG_LINE@swarming.summary@ \"internal_failure\": false, @@@",
+ "@@@STEP_LOG_LINE@swarming.summary@ \"isolated_out\": {@@@",
+ "@@@STEP_LOG_LINE@swarming.summary@ \"isolated\": \"abc123\", @@@",
+ "@@@STEP_LOG_LINE@swarming.summary@ \"isolatedserver\": \"https://isolateserver.appspot.com\", @@@",
+ "@@@STEP_LOG_LINE@swarming.summary@ \"namespace\": \"default-gzip\", @@@",
+ "@@@STEP_LOG_LINE@swarming.summary@ \"view_url\": \"blah\"@@@",
+ "@@@STEP_LOG_LINE@swarming.summary@ }, @@@",
+ "@@@STEP_LOG_LINE@swarming.summary@ \"modified_ts\": \"2014-09-25 01:42:00\", @@@",
+ "@@@STEP_LOG_LINE@swarming.summary@ \"name\": \"heartbeat-canary-2014-09-25_01:41:55-os=Windows\", @@@",
+ "@@@STEP_LOG_LINE@swarming.summary@ \"outputs\": [@@@",
+ "@@@STEP_LOG_LINE@swarming.summary@ \"Heart beat succeeded on win32.\\n\", @@@",
+ "@@@STEP_LOG_LINE@swarming.summary@ \"Foo\"@@@",
+ "@@@STEP_LOG_LINE@swarming.summary@ ], @@@",
+ "@@@STEP_LOG_LINE@swarming.summary@ \"outputs_ref\": {@@@",
+ "@@@STEP_LOG_LINE@swarming.summary@ \"view_url\": \"blah\"@@@",
+ "@@@STEP_LOG_LINE@swarming.summary@ }, @@@",
+ "@@@STEP_LOG_LINE@swarming.summary@ \"started_ts\": \"2014-09-25T01:42:11.123\", @@@",
+ "@@@STEP_LOG_LINE@swarming.summary@ \"state\": 112, @@@",
+ "@@@STEP_LOG_LINE@swarming.summary@ \"try_number\": 1, @@@",
+ "@@@STEP_LOG_LINE@swarming.summary@ \"user\": \"unknown\"@@@",
+ "@@@STEP_LOG_LINE@swarming.summary@ }@@@",
+ "@@@STEP_LOG_LINE@swarming.summary@ ]@@@",
+ "@@@STEP_LOG_LINE@swarming.summary@}@@@",
+ "@@@STEP_LOG_END@swarming.summary@@@",
+ "@@@STEP_LINK@shard #0 isolated out@blah@@@",
+ "@@@STEP_LINK@view steps on Milo@https://luci-milo.appspot.com/swarming/task/148aa78d7aa0000@@@"
+ ]
+ },
+ {
+ "cmd": [
+ "python",
+ "-u",
+ "[START_DIR]/swarming.client/swarming.py",
+ "collect",
+ "--swarming",
+ "https://chromium-swarm.appspot.com",
+ "--decorate",
+ "--print-status-updates",
+ "--json",
+ "{\"base_task_name\": \"task-0/Linux/[dummy has\", \"tasks\": {\"task-0/Linux/[dummy has\": {\"shard_index\": 0, \"task_id\": \"10000\", \"view_url\": \"https://chromium-swarm.appspot.com/user/task/10000\"}}}",
+ "--task-summary-json",
+ "/path/to/tmp/json",
+ "--task-output-dir",
+ "[START_DIR]/swarming_temp_dir/outputs/task-0"
+ ],
+ "name": "task-0",
+ "~followup_annotations": [
+ "@@@STEP_TEXT@Run on OS: 'Linux'<br>swarming pending 71s@@@",
+ "@@@STEP_LOG_LINE@swarming.summary@{@@@",
+ "@@@STEP_LOG_LINE@swarming.summary@ \"shards\": [@@@",
+ "@@@STEP_LOG_LINE@swarming.summary@ {@@@",
+ "@@@STEP_LOG_LINE@swarming.summary@ \"abandoned_ts\": null, @@@",
+ "@@@STEP_LOG_LINE@swarming.summary@ \"bot_id\": \"vm30\", @@@",
+ "@@@STEP_LOG_LINE@swarming.summary@ \"completed_ts\": \"2014-09-25T01:42:00.123\", @@@",
+ "@@@STEP_LOG_LINE@swarming.summary@ \"created_ts\": \"2014-09-25T01:41:00.123\", @@@",
+ "@@@STEP_LOG_LINE@swarming.summary@ \"durations\": [@@@",
+ "@@@STEP_LOG_LINE@swarming.summary@ 5.7, @@@",
+ "@@@STEP_LOG_LINE@swarming.summary@ 31.5@@@",
+ "@@@STEP_LOG_LINE@swarming.summary@ ], @@@",
+ "@@@STEP_LOG_LINE@swarming.summary@ \"exit_codes\": [@@@",
+ "@@@STEP_LOG_LINE@swarming.summary@ 0, @@@",
+ "@@@STEP_LOG_LINE@swarming.summary@ 0@@@",
+ "@@@STEP_LOG_LINE@swarming.summary@ ], @@@",
+ "@@@STEP_LOG_LINE@swarming.summary@ \"failure\": false, @@@",
+ "@@@STEP_LOG_LINE@swarming.summary@ \"id\": \"148aa78d7aa0000\", @@@",
+ "@@@STEP_LOG_LINE@swarming.summary@ \"internal_failure\": false, @@@",
+ "@@@STEP_LOG_LINE@swarming.summary@ \"isolated_out\": {@@@",
+ "@@@STEP_LOG_LINE@swarming.summary@ \"isolated\": \"abc123\", @@@",
+ "@@@STEP_LOG_LINE@swarming.summary@ \"isolatedserver\": \"https://isolateserver.appspot.com\", @@@",
+ "@@@STEP_LOG_LINE@swarming.summary@ \"namespace\": \"default-gzip\", @@@",
+ "@@@STEP_LOG_LINE@swarming.summary@ \"view_url\": \"blah\"@@@",
+ "@@@STEP_LOG_LINE@swarming.summary@ }, @@@",
+ "@@@STEP_LOG_LINE@swarming.summary@ \"modified_ts\": \"2014-09-25 01:42:00\", @@@",
+ "@@@STEP_LOG_LINE@swarming.summary@ \"name\": \"heartbeat-canary-2014-09-25_01:41:55-os=Windows\", @@@",
+ "@@@STEP_LOG_LINE@swarming.summary@ \"outputs\": [@@@",
+ "@@@STEP_LOG_LINE@swarming.summary@ \"Heart beat succeeded on win32.\\n\", @@@",
+ "@@@STEP_LOG_LINE@swarming.summary@ \"Foo\"@@@",
+ "@@@STEP_LOG_LINE@swarming.summary@ ], @@@",
+ "@@@STEP_LOG_LINE@swarming.summary@ \"outputs_ref\": {@@@",
+ "@@@STEP_LOG_LINE@swarming.summary@ \"view_url\": \"blah\"@@@",
+ "@@@STEP_LOG_LINE@swarming.summary@ }, @@@",
+ "@@@STEP_LOG_LINE@swarming.summary@ \"started_ts\": \"2014-09-25T01:42:11.123\", @@@",
+ "@@@STEP_LOG_LINE@swarming.summary@ \"state\": 112, @@@",
+ "@@@STEP_LOG_LINE@swarming.summary@ \"try_number\": 1, @@@",
+ "@@@STEP_LOG_LINE@swarming.summary@ \"user\": \"unknown\"@@@",
+ "@@@STEP_LOG_LINE@swarming.summary@ }@@@",
+ "@@@STEP_LOG_LINE@swarming.summary@ ]@@@",
+ "@@@STEP_LOG_LINE@swarming.summary@}@@@",
+ "@@@STEP_LOG_END@swarming.summary@@@",
+ "@@@STEP_LINK@shard #0 isolated out@blah@@@",
+ "@@@STEP_LINK@view steps on Milo@https://luci-milo.appspot.com/swarming/task/148aa78d7aa0000@@@"
+ ]
+ },
+ {
+ "cmd": [
+ "python",
+ "-u",
+ "[START_DIR]/swarming.client/swarming.py",
+ "collect",
+ "--swarming",
+ "https://chromium-swarm.appspot.com",
+ "--decorate",
+ "--print-status-updates",
+ "--json",
+ "{\"base_task_name\": \"task-1/Linux/[dummy has\", \"tasks\": {\"task-1/Linux/[dummy has\": {\"shard_index\": 0, \"task_id\": \"10000\", \"view_url\": \"https://chromium-swarm.appspot.com/user/task/10000\"}}}",
+ "--task-summary-json",
+ "/path/to/tmp/json",
+ "--task-output-dir",
+ "[START_DIR]/swarming_temp_dir/outputs/task-1"
+ ],
+ "name": "task-1",
+ "~followup_annotations": [
+ "@@@STEP_TEXT@Run on OS: 'Linux'<br>swarming pending 71s@@@",
+ "@@@STEP_LOG_LINE@swarming.summary@{@@@",
+ "@@@STEP_LOG_LINE@swarming.summary@ \"shards\": [@@@",
+ "@@@STEP_LOG_LINE@swarming.summary@ {@@@",
+ "@@@STEP_LOG_LINE@swarming.summary@ \"abandoned_ts\": null, @@@",
+ "@@@STEP_LOG_LINE@swarming.summary@ \"bot_id\": \"vm30\", @@@",
+ "@@@STEP_LOG_LINE@swarming.summary@ \"completed_ts\": \"2014-09-25T01:42:00.123\", @@@",
+ "@@@STEP_LOG_LINE@swarming.summary@ \"created_ts\": \"2014-09-25T01:41:00.123\", @@@",
+ "@@@STEP_LOG_LINE@swarming.summary@ \"durations\": [@@@",
+ "@@@STEP_LOG_LINE@swarming.summary@ 5.7, @@@",
+ "@@@STEP_LOG_LINE@swarming.summary@ 31.5@@@",
+ "@@@STEP_LOG_LINE@swarming.summary@ ], @@@",
+ "@@@STEP_LOG_LINE@swarming.summary@ \"exit_codes\": [@@@",
+ "@@@STEP_LOG_LINE@swarming.summary@ 0, @@@",
+ "@@@STEP_LOG_LINE@swarming.summary@ 0@@@",
+ "@@@STEP_LOG_LINE@swarming.summary@ ], @@@",
+ "@@@STEP_LOG_LINE@swarming.summary@ \"failure\": false, @@@",
+ "@@@STEP_LOG_LINE@swarming.summary@ \"id\": \"148aa78d7aa0000\", @@@",
+ "@@@STEP_LOG_LINE@swarming.summary@ \"internal_failure\": false, @@@",
+ "@@@STEP_LOG_LINE@swarming.summary@ \"isolated_out\": {@@@",
+ "@@@STEP_LOG_LINE@swarming.summary@ \"isolated\": \"abc123\", @@@",
+ "@@@STEP_LOG_LINE@swarming.summary@ \"isolatedserver\": \"https://isolateserver.appspot.com\", @@@",
+ "@@@STEP_LOG_LINE@swarming.summary@ \"namespace\": \"default-gzip\", @@@",
+ "@@@STEP_LOG_LINE@swarming.summary@ \"view_url\": \"blah\"@@@",
+ "@@@STEP_LOG_LINE@swarming.summary@ }, @@@",
+ "@@@STEP_LOG_LINE@swarming.summary@ \"modified_ts\": \"2014-09-25 01:42:00\", @@@",
+ "@@@STEP_LOG_LINE@swarming.summary@ \"name\": \"heartbeat-canary-2014-09-25_01:41:55-os=Windows\", @@@",
+ "@@@STEP_LOG_LINE@swarming.summary@ \"outputs\": [@@@",
+ "@@@STEP_LOG_LINE@swarming.summary@ \"Heart beat succeeded on win32.\\n\", @@@",
+ "@@@STEP_LOG_LINE@swarming.summary@ \"Foo\"@@@",
+ "@@@STEP_LOG_LINE@swarming.summary@ ], @@@",
+ "@@@STEP_LOG_LINE@swarming.summary@ \"outputs_ref\": {@@@",
+ "@@@STEP_LOG_LINE@swarming.summary@ \"view_url\": \"blah\"@@@",
+ "@@@STEP_LOG_LINE@swarming.summary@ }, @@@",
+ "@@@STEP_LOG_LINE@swarming.summary@ \"started_ts\": \"2014-09-25T01:42:11.123\", @@@",
+ "@@@STEP_LOG_LINE@swarming.summary@ \"state\": 112, @@@",
+ "@@@STEP_LOG_LINE@swarming.summary@ \"try_number\": 1, @@@",
+ "@@@STEP_LOG_LINE@swarming.summary@ \"user\": \"unknown\"@@@",
+ "@@@STEP_LOG_LINE@swarming.summary@ }@@@",
+ "@@@STEP_LOG_LINE@swarming.summary@ ]@@@",
+ "@@@STEP_LOG_LINE@swarming.summary@}@@@",
+ "@@@STEP_LOG_END@swarming.summary@@@",
+ "@@@STEP_LINK@shard #0 isolated out@blah@@@",
+ "@@@STEP_LINK@view steps on Milo@https://luci-milo.appspot.com/swarming/task/148aa78d7aa0000@@@"
+ ]
+ },
+ {
+ "name": "$result",
+ "recipe_result": null,
+ "status_code": 0
+ }
+] \ No newline at end of file
diff --git a/infra/bots/recipe_modules/swarming/example.py b/infra/bots/recipe_modules/swarming/example.py
new file mode 100644
index 0000000000..d862c480a6
--- /dev/null
+++ b/infra/bots/recipe_modules/swarming/example.py
@@ -0,0 +1,30 @@
+# Copyright 2017 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 = [
+ 'recipe_engine/path',
+ 'recipe_engine/properties',
+ 'recipe_engine/step',
+ 'swarming',
+]
+
+
+def RunSteps(api):
+ api.swarming.setup('mydir', swarming_rev='abc123')
+ api.swarming.create_isolated_gen_json(
+ 'isolate_path', 'isolate_dir', 'linux', 'task', {'myvar': 'myval'})
+ tasks_to_hashes = api.swarming.batcharchive(targets=[
+ 'task-%s' % num for num in range(5)])
+ tasks = api.swarming.trigger_swarming_tasks(
+ tasks_to_hashes, dimensions={'os': 'Linux'})
+ for t in tasks:
+ api.swarming.collect_swarming_task(t)
+
+
+def GenTests(api):
+ yield (
+ api.test('test') +
+ api.properties(revision='abc123')
+ )
diff --git a/infra/bots/recipe_modules/vars/__init__.py b/infra/bots/recipe_modules/vars/__init__.py
index d5cf1da80b..e0e951379f 100644
--- a/infra/bots/recipe_modules/vars/__init__.py
+++ b/infra/bots/recipe_modules/vars/__init__.py
@@ -12,7 +12,3 @@ DEPS = [
'recipe_engine/raw_io',
'recipe_engine/step',
]
-
-
-# TODO(borenet): Add coverage
-DISABLE_STRICT_COVERAGE = True
diff --git a/infra/bots/recipe_modules/vars/example.expected/Build-Ubuntu-GCC-x86_64-Release-Flutter_Android.json b/infra/bots/recipe_modules/vars/example.expected/Build-Ubuntu-GCC-x86_64-Release-Flutter_Android.json
new file mode 100644
index 0000000000..4594f9e6b9
--- /dev/null
+++ b/infra/bots/recipe_modules/vars/example.expected/Build-Ubuntu-GCC-x86_64-Release-Flutter_Android.json
@@ -0,0 +1,35 @@
+[
+ {
+ "cmd": [
+ "python",
+ "-u",
+ "import os\nprint os.environ.get('SWARMING_BOT_ID', '')\n"
+ ],
+ "name": "get swarming bot id",
+ "stdout": "/path/to/tmp/",
+ "~followup_annotations": [
+ "@@@STEP_LOG_LINE@python.inline@import os@@@",
+ "@@@STEP_LOG_LINE@python.inline@print os.environ.get('SWARMING_BOT_ID', '')@@@",
+ "@@@STEP_LOG_END@python.inline@@@"
+ ]
+ },
+ {
+ "cmd": [
+ "python",
+ "-u",
+ "import os\nprint os.environ.get('SWARMING_TASK_ID', '')\n"
+ ],
+ "name": "get swarming task id",
+ "stdout": "/path/to/tmp/",
+ "~followup_annotations": [
+ "@@@STEP_LOG_LINE@python.inline@import os@@@",
+ "@@@STEP_LOG_LINE@python.inline@print os.environ.get('SWARMING_TASK_ID', '')@@@",
+ "@@@STEP_LOG_END@python.inline@@@"
+ ]
+ },
+ {
+ "name": "$result",
+ "recipe_result": null,
+ "status_code": 0
+ }
+] \ No newline at end of file
diff --git a/infra/bots/recipe_modules/vars/example.expected/Build-Ubuntu-GCC-x86_64-Release-PDFium.json b/infra/bots/recipe_modules/vars/example.expected/Build-Ubuntu-GCC-x86_64-Release-PDFium.json
new file mode 100644
index 0000000000..4594f9e6b9
--- /dev/null
+++ b/infra/bots/recipe_modules/vars/example.expected/Build-Ubuntu-GCC-x86_64-Release-PDFium.json
@@ -0,0 +1,35 @@
+[
+ {
+ "cmd": [
+ "python",
+ "-u",
+ "import os\nprint os.environ.get('SWARMING_BOT_ID', '')\n"
+ ],
+ "name": "get swarming bot id",
+ "stdout": "/path/to/tmp/",
+ "~followup_annotations": [
+ "@@@STEP_LOG_LINE@python.inline@import os@@@",
+ "@@@STEP_LOG_LINE@python.inline@print os.environ.get('SWARMING_BOT_ID', '')@@@",
+ "@@@STEP_LOG_END@python.inline@@@"
+ ]
+ },
+ {
+ "cmd": [
+ "python",
+ "-u",
+ "import os\nprint os.environ.get('SWARMING_TASK_ID', '')\n"
+ ],
+ "name": "get swarming task id",
+ "stdout": "/path/to/tmp/",
+ "~followup_annotations": [
+ "@@@STEP_LOG_LINE@python.inline@import os@@@",
+ "@@@STEP_LOG_LINE@python.inline@print os.environ.get('SWARMING_TASK_ID', '')@@@",
+ "@@@STEP_LOG_END@python.inline@@@"
+ ]
+ },
+ {
+ "name": "$result",
+ "recipe_result": null,
+ "status_code": 0
+ }
+] \ No newline at end of file
diff --git a/infra/bots/recipe_modules/vars/example.expected/Housekeeper-Weekly-RecreateSKPs.json b/infra/bots/recipe_modules/vars/example.expected/Housekeeper-Weekly-RecreateSKPs.json
new file mode 100644
index 0000000000..4594f9e6b9
--- /dev/null
+++ b/infra/bots/recipe_modules/vars/example.expected/Housekeeper-Weekly-RecreateSKPs.json
@@ -0,0 +1,35 @@
+[
+ {
+ "cmd": [
+ "python",
+ "-u",
+ "import os\nprint os.environ.get('SWARMING_BOT_ID', '')\n"
+ ],
+ "name": "get swarming bot id",
+ "stdout": "/path/to/tmp/",
+ "~followup_annotations": [
+ "@@@STEP_LOG_LINE@python.inline@import os@@@",
+ "@@@STEP_LOG_LINE@python.inline@print os.environ.get('SWARMING_BOT_ID', '')@@@",
+ "@@@STEP_LOG_END@python.inline@@@"
+ ]
+ },
+ {
+ "cmd": [
+ "python",
+ "-u",
+ "import os\nprint os.environ.get('SWARMING_TASK_ID', '')\n"
+ ],
+ "name": "get swarming task id",
+ "stdout": "/path/to/tmp/",
+ "~followup_annotations": [
+ "@@@STEP_LOG_LINE@python.inline@import os@@@",
+ "@@@STEP_LOG_LINE@python.inline@print os.environ.get('SWARMING_TASK_ID', '')@@@",
+ "@@@STEP_LOG_END@python.inline@@@"
+ ]
+ },
+ {
+ "name": "$result",
+ "recipe_result": null,
+ "status_code": 0
+ }
+] \ No newline at end of file
diff --git a/infra/bots/recipe_modules/vars/example.expected/Perf-Chromecast-GCC-Chorizo-CPU-Cortex_A7-arm-Debug.json b/infra/bots/recipe_modules/vars/example.expected/Perf-Chromecast-GCC-Chorizo-CPU-Cortex_A7-arm-Debug.json
new file mode 100644
index 0000000000..4594f9e6b9
--- /dev/null
+++ b/infra/bots/recipe_modules/vars/example.expected/Perf-Chromecast-GCC-Chorizo-CPU-Cortex_A7-arm-Debug.json
@@ -0,0 +1,35 @@
+[
+ {
+ "cmd": [
+ "python",
+ "-u",
+ "import os\nprint os.environ.get('SWARMING_BOT_ID', '')\n"
+ ],
+ "name": "get swarming bot id",
+ "stdout": "/path/to/tmp/",
+ "~followup_annotations": [
+ "@@@STEP_LOG_LINE@python.inline@import os@@@",
+ "@@@STEP_LOG_LINE@python.inline@print os.environ.get('SWARMING_BOT_ID', '')@@@",
+ "@@@STEP_LOG_END@python.inline@@@"
+ ]
+ },
+ {
+ "cmd": [
+ "python",
+ "-u",
+ "import os\nprint os.environ.get('SWARMING_TASK_ID', '')\n"
+ ],
+ "name": "get swarming task id",
+ "stdout": "/path/to/tmp/",
+ "~followup_annotations": [
+ "@@@STEP_LOG_LINE@python.inline@import os@@@",
+ "@@@STEP_LOG_LINE@python.inline@print os.environ.get('SWARMING_TASK_ID', '')@@@",
+ "@@@STEP_LOG_END@python.inline@@@"
+ ]
+ },
+ {
+ "name": "$result",
+ "recipe_result": null,
+ "status_code": 0
+ }
+] \ No newline at end of file
diff --git a/infra/bots/recipe_modules/vars/example.expected/Perf-Ubuntu-Clang-GCE-CPU-AVX2-x86_64-Release-ASAN.json b/infra/bots/recipe_modules/vars/example.expected/Perf-Ubuntu-Clang-GCE-CPU-AVX2-x86_64-Release-ASAN.json
new file mode 100644
index 0000000000..4594f9e6b9
--- /dev/null
+++ b/infra/bots/recipe_modules/vars/example.expected/Perf-Ubuntu-Clang-GCE-CPU-AVX2-x86_64-Release-ASAN.json
@@ -0,0 +1,35 @@
+[
+ {
+ "cmd": [
+ "python",
+ "-u",
+ "import os\nprint os.environ.get('SWARMING_BOT_ID', '')\n"
+ ],
+ "name": "get swarming bot id",
+ "stdout": "/path/to/tmp/",
+ "~followup_annotations": [
+ "@@@STEP_LOG_LINE@python.inline@import os@@@",
+ "@@@STEP_LOG_LINE@python.inline@print os.environ.get('SWARMING_BOT_ID', '')@@@",
+ "@@@STEP_LOG_END@python.inline@@@"
+ ]
+ },
+ {
+ "cmd": [
+ "python",
+ "-u",
+ "import os\nprint os.environ.get('SWARMING_TASK_ID', '')\n"
+ ],
+ "name": "get swarming task id",
+ "stdout": "/path/to/tmp/",
+ "~followup_annotations": [
+ "@@@STEP_LOG_LINE@python.inline@import os@@@",
+ "@@@STEP_LOG_LINE@python.inline@print os.environ.get('SWARMING_TASK_ID', '')@@@",
+ "@@@STEP_LOG_END@python.inline@@@"
+ ]
+ },
+ {
+ "name": "$result",
+ "recipe_result": null,
+ "status_code": 0
+ }
+] \ No newline at end of file
diff --git a/infra/bots/recipe_modules/vars/example.expected/command_buffer.json b/infra/bots/recipe_modules/vars/example.expected/command_buffer.json
new file mode 100644
index 0000000000..4594f9e6b9
--- /dev/null
+++ b/infra/bots/recipe_modules/vars/example.expected/command_buffer.json
@@ -0,0 +1,35 @@
+[
+ {
+ "cmd": [
+ "python",
+ "-u",
+ "import os\nprint os.environ.get('SWARMING_BOT_ID', '')\n"
+ ],
+ "name": "get swarming bot id",
+ "stdout": "/path/to/tmp/",
+ "~followup_annotations": [
+ "@@@STEP_LOG_LINE@python.inline@import os@@@",
+ "@@@STEP_LOG_LINE@python.inline@print os.environ.get('SWARMING_BOT_ID', '')@@@",
+ "@@@STEP_LOG_END@python.inline@@@"
+ ]
+ },
+ {
+ "cmd": [
+ "python",
+ "-u",
+ "import os\nprint os.environ.get('SWARMING_TASK_ID', '')\n"
+ ],
+ "name": "get swarming task id",
+ "stdout": "/path/to/tmp/",
+ "~followup_annotations": [
+ "@@@STEP_LOG_LINE@python.inline@import os@@@",
+ "@@@STEP_LOG_LINE@python.inline@print os.environ.get('SWARMING_TASK_ID', '')@@@",
+ "@@@STEP_LOG_END@python.inline@@@"
+ ]
+ },
+ {
+ "name": "$result",
+ "recipe_result": null,
+ "status_code": 0
+ }
+] \ No newline at end of file
diff --git a/infra/bots/recipe_modules/vars/example.expected/flutter_trybot.json b/infra/bots/recipe_modules/vars/example.expected/flutter_trybot.json
new file mode 100644
index 0000000000..4594f9e6b9
--- /dev/null
+++ b/infra/bots/recipe_modules/vars/example.expected/flutter_trybot.json
@@ -0,0 +1,35 @@
+[
+ {
+ "cmd": [
+ "python",
+ "-u",
+ "import os\nprint os.environ.get('SWARMING_BOT_ID', '')\n"
+ ],
+ "name": "get swarming bot id",
+ "stdout": "/path/to/tmp/",
+ "~followup_annotations": [
+ "@@@STEP_LOG_LINE@python.inline@import os@@@",
+ "@@@STEP_LOG_LINE@python.inline@print os.environ.get('SWARMING_BOT_ID', '')@@@",
+ "@@@STEP_LOG_END@python.inline@@@"
+ ]
+ },
+ {
+ "cmd": [
+ "python",
+ "-u",
+ "import os\nprint os.environ.get('SWARMING_TASK_ID', '')\n"
+ ],
+ "name": "get swarming task id",
+ "stdout": "/path/to/tmp/",
+ "~followup_annotations": [
+ "@@@STEP_LOG_LINE@python.inline@import os@@@",
+ "@@@STEP_LOG_LINE@python.inline@print os.environ.get('SWARMING_TASK_ID', '')@@@",
+ "@@@STEP_LOG_END@python.inline@@@"
+ ]
+ },
+ {
+ "name": "$result",
+ "recipe_result": null,
+ "status_code": 0
+ }
+] \ No newline at end of file
diff --git a/infra/bots/recipe_modules/vars/example.expected/linux.json b/infra/bots/recipe_modules/vars/example.expected/linux.json
new file mode 100644
index 0000000000..7726ecb249
--- /dev/null
+++ b/infra/bots/recipe_modules/vars/example.expected/linux.json
@@ -0,0 +1,7 @@
+[
+ {
+ "name": "$result",
+ "recipe_result": null,
+ "status_code": 0
+ }
+] \ No newline at end of file
diff --git a/infra/bots/recipe_modules/vars/example.expected/pdfium_trybot.json b/infra/bots/recipe_modules/vars/example.expected/pdfium_trybot.json
new file mode 100644
index 0000000000..4594f9e6b9
--- /dev/null
+++ b/infra/bots/recipe_modules/vars/example.expected/pdfium_trybot.json
@@ -0,0 +1,35 @@
+[
+ {
+ "cmd": [
+ "python",
+ "-u",
+ "import os\nprint os.environ.get('SWARMING_BOT_ID', '')\n"
+ ],
+ "name": "get swarming bot id",
+ "stdout": "/path/to/tmp/",
+ "~followup_annotations": [
+ "@@@STEP_LOG_LINE@python.inline@import os@@@",
+ "@@@STEP_LOG_LINE@python.inline@print os.environ.get('SWARMING_BOT_ID', '')@@@",
+ "@@@STEP_LOG_END@python.inline@@@"
+ ]
+ },
+ {
+ "cmd": [
+ "python",
+ "-u",
+ "import os\nprint os.environ.get('SWARMING_TASK_ID', '')\n"
+ ],
+ "name": "get swarming task id",
+ "stdout": "/path/to/tmp/",
+ "~followup_annotations": [
+ "@@@STEP_LOG_LINE@python.inline@import os@@@",
+ "@@@STEP_LOG_LINE@python.inline@print os.environ.get('SWARMING_TASK_ID', '')@@@",
+ "@@@STEP_LOG_END@python.inline@@@"
+ ]
+ },
+ {
+ "name": "$result",
+ "recipe_result": null,
+ "status_code": 0
+ }
+] \ No newline at end of file
diff --git a/infra/bots/recipe_modules/vars/example.expected/test.json b/infra/bots/recipe_modules/vars/example.expected/test.json
new file mode 100644
index 0000000000..7726ecb249
--- /dev/null
+++ b/infra/bots/recipe_modules/vars/example.expected/test.json
@@ -0,0 +1,7 @@
+[
+ {
+ "name": "$result",
+ "recipe_result": null,
+ "status_code": 0
+ }
+] \ No newline at end of file
diff --git a/infra/bots/recipe_modules/vars/example.expected/win.json b/infra/bots/recipe_modules/vars/example.expected/win.json
new file mode 100644
index 0000000000..4594f9e6b9
--- /dev/null
+++ b/infra/bots/recipe_modules/vars/example.expected/win.json
@@ -0,0 +1,35 @@
+[
+ {
+ "cmd": [
+ "python",
+ "-u",
+ "import os\nprint os.environ.get('SWARMING_BOT_ID', '')\n"
+ ],
+ "name": "get swarming bot id",
+ "stdout": "/path/to/tmp/",
+ "~followup_annotations": [
+ "@@@STEP_LOG_LINE@python.inline@import os@@@",
+ "@@@STEP_LOG_LINE@python.inline@print os.environ.get('SWARMING_BOT_ID', '')@@@",
+ "@@@STEP_LOG_END@python.inline@@@"
+ ]
+ },
+ {
+ "cmd": [
+ "python",
+ "-u",
+ "import os\nprint os.environ.get('SWARMING_TASK_ID', '')\n"
+ ],
+ "name": "get swarming task id",
+ "stdout": "/path/to/tmp/",
+ "~followup_annotations": [
+ "@@@STEP_LOG_LINE@python.inline@import os@@@",
+ "@@@STEP_LOG_LINE@python.inline@print os.environ.get('SWARMING_TASK_ID', '')@@@",
+ "@@@STEP_LOG_END@python.inline@@@"
+ ]
+ },
+ {
+ "name": "$result",
+ "recipe_result": null,
+ "status_code": 0
+ }
+] \ No newline at end of file
diff --git a/infra/bots/recipe_modules/vars/example.expected/win_test.json b/infra/bots/recipe_modules/vars/example.expected/win_test.json
new file mode 100644
index 0000000000..4594f9e6b9
--- /dev/null
+++ b/infra/bots/recipe_modules/vars/example.expected/win_test.json
@@ -0,0 +1,35 @@
+[
+ {
+ "cmd": [
+ "python",
+ "-u",
+ "import os\nprint os.environ.get('SWARMING_BOT_ID', '')\n"
+ ],
+ "name": "get swarming bot id",
+ "stdout": "/path/to/tmp/",
+ "~followup_annotations": [
+ "@@@STEP_LOG_LINE@python.inline@import os@@@",
+ "@@@STEP_LOG_LINE@python.inline@print os.environ.get('SWARMING_BOT_ID', '')@@@",
+ "@@@STEP_LOG_END@python.inline@@@"
+ ]
+ },
+ {
+ "cmd": [
+ "python",
+ "-u",
+ "import os\nprint os.environ.get('SWARMING_TASK_ID', '')\n"
+ ],
+ "name": "get swarming task id",
+ "stdout": "/path/to/tmp/",
+ "~followup_annotations": [
+ "@@@STEP_LOG_LINE@python.inline@import os@@@",
+ "@@@STEP_LOG_LINE@python.inline@print os.environ.get('SWARMING_TASK_ID', '')@@@",
+ "@@@STEP_LOG_END@python.inline@@@"
+ ]
+ },
+ {
+ "name": "$result",
+ "recipe_result": null,
+ "status_code": 0
+ }
+] \ No newline at end of file
diff --git a/infra/bots/recipe_modules/vars/example.py b/infra/bots/recipe_modules/vars/example.py
new file mode 100644
index 0000000000..917f85db06
--- /dev/null
+++ b/infra/bots/recipe_modules/vars/example.py
@@ -0,0 +1,108 @@
+# Copyright 2017 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 = [
+ 'recipe_engine/properties',
+ 'vars',
+]
+
+
+def RunSteps(api):
+ api.vars.setup()
+ info = [
+ api.vars.upload_dm_results,
+ api.vars.upload_perf_results,
+ api.vars.swarming_bot_id,
+ api.vars.swarming_task_id,
+ ]
+ assert len(info) == 4 # Make pylint happy.
+
+
+def GenTests(api):
+ buildername = 'Build-Win-MSVC-x86_64-Release-Vulkan'
+ yield (
+ api.test('win') +
+ api.properties(buildername=buildername,
+ repository='https://skia.googlesource.com/skia.git',
+ revision='abc123',
+ path_config='kitchen',
+ swarm_out_dir='[SWARM_OUT_DIR]')
+ )
+
+ buildername = 'Build-Mac-Clang-x86_64-Debug-CommandBuffer'
+ yield (
+ api.test('command_buffer') +
+ api.properties(buildername=buildername,
+ repository='https://skia.googlesource.com/skia.git',
+ revision='abc123',
+ path_config='kitchen',
+ swarm_out_dir='[SWARM_OUT_DIR]')
+ )
+
+ buildername = 'Test-Win10-MSVC-ShuttleA-GPU-GTX660-x86_64-Debug'
+ yield (
+ api.test('win_test') +
+ api.properties(buildername=buildername,
+ repository='https://skia.googlesource.com/skia.git',
+ revision='abc123',
+ path_config='kitchen',
+ swarm_out_dir='[SWARM_OUT_DIR]',
+ patch_storage='gerrit') +
+ api.properties.tryserver(
+ buildername=buildername,
+ gerrit_project='skia',
+ gerrit_url='https://skia-review.googlesource.com/',
+ )
+ )
+
+ builder = 'Housekeeper-Weekly-RecreateSKPs'
+ yield (
+ api.test(builder) +
+ api.properties(buildername=builder,
+ repository='https://skia.googlesource.com/skia.git',
+ revision='abc123',
+ path_config='kitchen',
+ swarm_out_dir='[SWARM_OUT_DIR]')
+ )
+
+ builder = 'Perf-Chromecast-GCC-Chorizo-CPU-Cortex_A7-arm-Debug'
+ yield (
+ api.test(builder) +
+ api.properties(buildername=builder,
+ repository='https://skia.googlesource.com/skia.git',
+ revision='abc123',
+ path_config='kitchen',
+ swarm_out_dir='[SWARM_OUT_DIR]')
+ )
+
+ builder = 'Perf-Ubuntu-Clang-GCE-CPU-AVX2-x86_64-Release-ASAN'
+ yield (
+ api.test(builder) +
+ api.properties(buildername=builder,
+ repository='https://skia.googlesource.com/skia.git',
+ revision='abc123',
+ path_config='kitchen',
+ swarm_out_dir='[SWARM_OUT_DIR]')
+ )
+
+ builder = 'Build-Ubuntu-GCC-x86_64-Release-PDFium'
+ yield (
+ api.test(builder) +
+ api.properties(buildername=builder,
+ repository='https://skia.googlesource.com/skia.git',
+ revision='abc123',
+ path_config='kitchen',
+ swarm_out_dir='[SWARM_OUT_DIR]')
+ )
+
+ builder = 'Build-Ubuntu-GCC-x86_64-Release-Flutter_Android'
+ yield (
+ api.test(builder) +
+ api.properties(buildername=builder,
+ repository='https://skia.googlesource.com/skia.git',
+ revision='abc123',
+ path_config='kitchen',
+ swarm_out_dir='[SWARM_OUT_DIR]')
+ )