Don't hardcode test filters.

Read gtest_filters.yaml to determine disabled tests.
diff --git a/recipe_modules/adhoc_validation/examples/full.expected/invalid_validation.json b/recipe_modules/adhoc_validation/examples/full.expected/invalid_validation.json
index 79d8ab8..c806571 100644
--- a/recipe_modules/adhoc_validation/examples/full.expected/invalid_validation.json
+++ b/recipe_modules/adhoc_validation/examples/full.expected/invalid_validation.json
@@ -7,8 +7,18 @@
       "The recipe has crashed at point 'Uncaught exception'!",
       "",
       "Traceback (most recent call last):",
+      "  File \"RECIPE_REPO[recipe_engine]/recipe_engine/internal/engine.py\", in run_steps",
+      "    raw_result = recipe_obj.run_steps(api, engine)",
+      "  File \"RECIPE_REPO[recipe_engine]/recipe_engine/internal/recipe_deps.py\", in run_steps",
+      "    properties_def, api=api)",
+      "  File \"RECIPE_REPO[recipe_engine]/recipe_engine/internal/property_invoker.py\", in invoke_with_properties",
+      "    arg_names, **additional_args)",
+      "  File \"RECIPE_REPO[recipe_engine]/recipe_engine/internal/property_invoker.py\", in _invoke_with_properties",
+      "    return callable_obj(*props, **additional_args)",
       "  File \"RECIPE_REPO[flutter]/recipe_modules/adhoc_validation/examples/full.py\", line 19, in RunSteps",
       "    api.adhoc_validation.run('Docs', validation, {}, {})",
+      "  File \"RECIPE_REPO[recipe_engine]/recipe_engine/recipe_api.py\", in _inner",
+      "    return func(*a, **kw)",
       "  File \"RECIPE_REPO[flutter]/recipe_modules/adhoc_validation/api.py\", line 37, in run",
       "    raise AssertionError(msg)",
       "AssertionError: invalid is not listed in available_validations."
diff --git a/recipe_modules/bucket_util/examples/full.expected/upload_packages_tiggers_exception_and_package_exists.json b/recipe_modules/bucket_util/examples/full.expected/upload_packages_tiggers_exception_and_package_exists.json
index 9f8a956..7bfa68d 100644
--- a/recipe_modules/bucket_util/examples/full.expected/upload_packages_tiggers_exception_and_package_exists.json
+++ b/recipe_modules/bucket_util/examples/full.expected/upload_packages_tiggers_exception_and_package_exists.json
@@ -38,12 +38,26 @@
       "The recipe has crashed at point 'Uncaught exception'!",
       "",
       "Traceback (most recent call last):",
+      "  File \"RECIPE_REPO[recipe_engine]/recipe_engine/internal/engine.py\", in run_steps",
+      "    raw_result = recipe_obj.run_steps(api, engine)",
+      "  File \"RECIPE_REPO[recipe_engine]/recipe_engine/internal/recipe_deps.py\", in run_steps",
+      "    properties_def, api=api)",
+      "  File \"RECIPE_REPO[recipe_engine]/recipe_engine/internal/property_invoker.py\", in invoke_with_properties",
+      "    arg_names, **additional_args)",
+      "  File \"RECIPE_REPO[recipe_engine]/recipe_engine/internal/property_invoker.py\", in _invoke_with_properties",
+      "    return callable_obj(*props, **additional_args)",
       "  File \"RECIPE_REPO[flutter]/recipe_modules/bucket_util/examples/full.py\", line 22, in RunSteps",
       "    'test1.zip') # zip_name",
+      "  File \"RECIPE_REPO[recipe_engine]/recipe_engine/recipe_api.py\", in _inner",
+      "    return func(*a, **kw)",
       "  File \"RECIPE_REPO[flutter]/recipe_modules/bucket_util/api.py\", line 47, in upload_folder",
       "    bucket_name=bucket_name)",
+      "  File \"RECIPE_REPO[recipe_engine]/recipe_engine/recipe_api.py\", in _inner",
+      "    return func(*a, **kw)",
       "  File \"RECIPE_REPO[flutter]/recipe_modules/bucket_util/api.py\", line 81, in upload_folder_and_files",
       "    self.safe_upload(local_zip, remote_zip, bucket_name=bucket_name)",
+      "  File \"RECIPE_REPO[recipe_engine]/recipe_engine/recipe_api.py\", in _inner",
+      "    return func(*a, **kw)",
       "  File \"RECIPE_REPO[flutter]/recipe_modules/bucket_util/api.py\", line 124, in safe_upload",
       "    raise AssertionError('%s already exists on cloud storage' % cloud_path)",
       "AssertionError: gs://flutter_infra_release/flutter/00000000-0000-0000-0000-000000001337/test1.zip already exists on cloud storage"
diff --git a/recipe_modules/json_util/examples/validate_json.expected/try invalid key.json b/recipe_modules/json_util/examples/validate_json.expected/try invalid key.json
index b200b5b..a91bfc3 100644
--- a/recipe_modules/json_util/examples/validate_json.expected/try invalid key.json
+++ b/recipe_modules/json_util/examples/validate_json.expected/try invalid key.json
@@ -47,10 +47,22 @@
       "The recipe has crashed at point 'Uncaught exception'!",
       "",
       "Traceback (most recent call last):",
+      "  File \"RECIPE_REPO[recipe_engine]/recipe_engine/internal/engine.py\", in run_steps",
+      "    raw_result = recipe_obj.run_steps(api, engine)",
+      "  File \"RECIPE_REPO[recipe_engine]/recipe_engine/internal/recipe_deps.py\", in run_steps",
+      "    properties_def, api=api)",
+      "  File \"RECIPE_REPO[recipe_engine]/recipe_engine/internal/property_invoker.py\", in invoke_with_properties",
+      "    arg_names, **additional_args)",
+      "  File \"RECIPE_REPO[recipe_engine]/recipe_engine/internal/property_invoker.py\", in _invoke_with_properties",
+      "    return callable_obj(*props, **additional_args)",
       "  File \"RECIPE_REPO[flutter]/recipe_modules/json_util/examples/validate_json.py\", line 14, in RunSteps",
       "    api.json_util.validate_json(api.path['cache'])",
+      "  File \"RECIPE_REPO[recipe_engine]/recipe_engine/recipe_api.py\", in _inner",
+      "    return func(*a, **kw)",
       "  File \"RECIPE_REPO[flutter]/recipe_modules/json_util/api.py\", line 23, in validate_json",
       "    self.validate_builder_schema('try', try_json_data)",
+      "  File \"RECIPE_REPO[recipe_engine]/recipe_engine/recipe_api.py\", in _inner",
+      "    return func(*a, **kw)",
       "  File \"RECIPE_REPO[flutter]/recipe_modules/json_util/api.py\", line 76, in validate_builder_schema",
       "    (key, self.m.json.dumps(builder))",
       "ValueError: Unsupported key: abc in builder: {\"abc\": \"def\"}"
diff --git a/recipe_modules/json_util/examples/validate_json.expected/try missing key name.json b/recipe_modules/json_util/examples/validate_json.expected/try missing key name.json
index 3d16917..776dd7f 100644
--- a/recipe_modules/json_util/examples/validate_json.expected/try missing key name.json
+++ b/recipe_modules/json_util/examples/validate_json.expected/try missing key name.json
@@ -47,10 +47,22 @@
       "The recipe has crashed at point 'Uncaught exception'!",
       "",
       "Traceback (most recent call last):",
+      "  File \"RECIPE_REPO[recipe_engine]/recipe_engine/internal/engine.py\", in run_steps",
+      "    raw_result = recipe_obj.run_steps(api, engine)",
+      "  File \"RECIPE_REPO[recipe_engine]/recipe_engine/internal/recipe_deps.py\", in run_steps",
+      "    properties_def, api=api)",
+      "  File \"RECIPE_REPO[recipe_engine]/recipe_engine/internal/property_invoker.py\", in invoke_with_properties",
+      "    arg_names, **additional_args)",
+      "  File \"RECIPE_REPO[recipe_engine]/recipe_engine/internal/property_invoker.py\", in _invoke_with_properties",
+      "    return callable_obj(*props, **additional_args)",
       "  File \"RECIPE_REPO[flutter]/recipe_modules/json_util/examples/validate_json.py\", line 14, in RunSteps",
       "    api.json_util.validate_json(api.path['cache'])",
+      "  File \"RECIPE_REPO[recipe_engine]/recipe_engine/recipe_api.py\", in _inner",
+      "    return func(*a, **kw)",
       "  File \"RECIPE_REPO[flutter]/recipe_modules/json_util/api.py\", line 23, in validate_json",
       "    self.validate_builder_schema('try', try_json_data)",
+      "  File \"RECIPE_REPO[recipe_engine]/recipe_engine/recipe_api.py\", in _inner",
+      "    return func(*a, **kw)",
       "  File \"RECIPE_REPO[flutter]/recipe_modules/json_util/api.py\", line 85, in validate_builder_schema",
       "    'Missing key: name in builder: %s' % self.m.json.dumps(builder)",
       "ValueError: Missing key: name in builder: {\"repo\": \"abc\"}"
diff --git a/recipe_modules/json_util/examples/validate_json.expected/try missing key repo.json b/recipe_modules/json_util/examples/validate_json.expected/try missing key repo.json
index f110246..b4c7dd6 100644
--- a/recipe_modules/json_util/examples/validate_json.expected/try missing key repo.json
+++ b/recipe_modules/json_util/examples/validate_json.expected/try missing key repo.json
@@ -47,10 +47,22 @@
       "The recipe has crashed at point 'Uncaught exception'!",
       "",
       "Traceback (most recent call last):",
+      "  File \"RECIPE_REPO[recipe_engine]/recipe_engine/internal/engine.py\", in run_steps",
+      "    raw_result = recipe_obj.run_steps(api, engine)",
+      "  File \"RECIPE_REPO[recipe_engine]/recipe_engine/internal/recipe_deps.py\", in run_steps",
+      "    properties_def, api=api)",
+      "  File \"RECIPE_REPO[recipe_engine]/recipe_engine/internal/property_invoker.py\", in invoke_with_properties",
+      "    arg_names, **additional_args)",
+      "  File \"RECIPE_REPO[recipe_engine]/recipe_engine/internal/property_invoker.py\", in _invoke_with_properties",
+      "    return callable_obj(*props, **additional_args)",
       "  File \"RECIPE_REPO[flutter]/recipe_modules/json_util/examples/validate_json.py\", line 14, in RunSteps",
       "    api.json_util.validate_json(api.path['cache'])",
+      "  File \"RECIPE_REPO[recipe_engine]/recipe_engine/recipe_api.py\", in _inner",
+      "    return func(*a, **kw)",
       "  File \"RECIPE_REPO[flutter]/recipe_modules/json_util/api.py\", line 23, in validate_json",
       "    self.validate_builder_schema('try', try_json_data)",
+      "  File \"RECIPE_REPO[recipe_engine]/recipe_engine/recipe_api.py\", in _inner",
+      "    return func(*a, **kw)",
       "  File \"RECIPE_REPO[flutter]/recipe_modules/json_util/api.py\", line 81, in validate_builder_schema",
       "    'Missing key: repo in builder: %s' % self.m.json.dumps(builder)",
       "ValueError: Missing key: repo in builder: {\"name\": \"abc\"}"
diff --git a/recipe_modules/repo_util/examples/unsupported.expected/unsupported.json b/recipe_modules/repo_util/examples/unsupported.expected/unsupported.json
index 48fb382..52d12ff 100644
--- a/recipe_modules/repo_util/examples/unsupported.expected/unsupported.json
+++ b/recipe_modules/repo_util/examples/unsupported.expected/unsupported.json
@@ -7,8 +7,18 @@
       "The recipe has crashed at point 'Uncaught exception'!",
       "",
       "Traceback (most recent call last):",
+      "  File \"RECIPE_REPO[recipe_engine]/recipe_engine/internal/engine.py\", in run_steps",
+      "    raw_result = recipe_obj.run_steps(api, engine)",
+      "  File \"RECIPE_REPO[recipe_engine]/recipe_engine/internal/recipe_deps.py\", in run_steps",
+      "    properties_def, api=api)",
+      "  File \"RECIPE_REPO[recipe_engine]/recipe_engine/internal/property_invoker.py\", in invoke_with_properties",
+      "    arg_names, **additional_args)",
+      "  File \"RECIPE_REPO[recipe_engine]/recipe_engine/internal/property_invoker.py\", in _invoke_with_properties",
+      "    return callable_obj(*props, **additional_args)",
       "  File \"RECIPE_REPO[flutter]/recipe_modules/repo_util/examples/unsupported.py\", line 15, in RunSteps",
       "    api.path['start_dir'].join('unsupported_repo'))",
+      "  File \"RECIPE_REPO[recipe_engine]/recipe_engine/recipe_api.py\", in _inner",
+      "    return func(*a, **kw)",
       "  File \"RECIPE_REPO[flutter]/recipe_modules/repo_util/api.py\", line 94, in checkout",
       "    raise ValueError('Unsupported repo: %s' % name)",
       "ValueError: Unsupported repo: unsupported_repo"
diff --git a/recipe_modules/web_util/examples/full.expected/fail case.json b/recipe_modules/web_util/examples/full.expected/fail case.json
index eede892..e4fddfb 100644
--- a/recipe_modules/web_util/examples/full.expected/fail case.json
+++ b/recipe_modules/web_util/examples/full.expected/fail case.json
@@ -7,8 +7,18 @@
       "The recipe has crashed at point 'Uncaught exception'!",
       "",
       "Traceback (most recent call last):",
+      "  File \"RECIPE_REPO[recipe_engine]/recipe_engine/internal/engine.py\", in run_steps",
+      "    raw_result = recipe_obj.run_steps(api, engine)",
+      "  File \"RECIPE_REPO[recipe_engine]/recipe_engine/internal/recipe_deps.py\", in run_steps",
+      "    properties_def, api=api)",
+      "  File \"RECIPE_REPO[recipe_engine]/recipe_engine/internal/property_invoker.py\", in invoke_with_properties",
+      "    arg_names, **additional_args)",
+      "  File \"RECIPE_REPO[recipe_engine]/recipe_engine/internal/property_invoker.py\", in _invoke_with_properties",
+      "    return callable_obj(*props, **additional_args)",
       "  File \"RECIPE_REPO[flutter]/recipe_modules/web_util/examples/full.py\", line 23, in RunSteps",
       "    api.web_util.prepare_dependencies(engine_checkout_path)",
+      "  File \"RECIPE_REPO[recipe_engine]/recipe_engine/recipe_api.py\", in _inner",
+      "    return func(*a, **kw)",
       "  File \"RECIPE_REPO[flutter]/recipe_modules/web_util/api.py\", line 172, in prepare_dependencies",
       "    raise ValueError('Dependency %s not available.' % dep)",
       "ValueError: Dependency invalid_dependency not available."
diff --git a/recipes/devicelab/devicelab_drone.expected/no-task-name.json b/recipes/devicelab/devicelab_drone.expected/no-task-name.json
index 6758846..6c46ac1 100644
--- a/recipes/devicelab/devicelab_drone.expected/no-task-name.json
+++ b/recipes/devicelab/devicelab_drone.expected/no-task-name.json
@@ -7,6 +7,14 @@
       "The recipe has crashed at point 'Uncaught exception'!",
       "",
       "Traceback (most recent call last):",
+      "  File \"RECIPE_REPO[recipe_engine]/recipe_engine/internal/engine.py\", in run_steps",
+      "    raw_result = recipe_obj.run_steps(api, engine)",
+      "  File \"RECIPE_REPO[recipe_engine]/recipe_engine/internal/recipe_deps.py\", in run_steps",
+      "    properties_def, api=api)",
+      "  File \"RECIPE_REPO[recipe_engine]/recipe_engine/internal/property_invoker.py\", in invoke_with_properties",
+      "    arg_names, **additional_args)",
+      "  File \"RECIPE_REPO[recipe_engine]/recipe_engine/internal/property_invoker.py\", in _invoke_with_properties",
+      "    return callable_obj(*props, **additional_args)",
       "  File \"RECIPE_REPO[flutter]/recipes/devicelab/devicelab_drone.py\", line 31, in RunSteps",
       "    raise ValueError('A task_name property is required')",
       "ValueError: A task_name property is required"
diff --git a/recipes/devicelab/devicelab_drone_1_26_0.expected/no-task-name.json b/recipes/devicelab/devicelab_drone_1_26_0.expected/no-task-name.json
index 95f0f86..5d8f97e 100644
--- a/recipes/devicelab/devicelab_drone_1_26_0.expected/no-task-name.json
+++ b/recipes/devicelab/devicelab_drone_1_26_0.expected/no-task-name.json
@@ -7,6 +7,14 @@
       "The recipe has crashed at point 'Uncaught exception'!",
       "",
       "Traceback (most recent call last):",
+      "  File \"RECIPE_REPO[recipe_engine]/recipe_engine/internal/engine.py\", in run_steps",
+      "    raw_result = recipe_obj.run_steps(api, engine)",
+      "  File \"RECIPE_REPO[recipe_engine]/recipe_engine/internal/recipe_deps.py\", in run_steps",
+      "    properties_def, api=api)",
+      "  File \"RECIPE_REPO[recipe_engine]/recipe_engine/internal/property_invoker.py\", in invoke_with_properties",
+      "    arg_names, **additional_args)",
+      "  File \"RECIPE_REPO[recipe_engine]/recipe_engine/internal/property_invoker.py\", in _invoke_with_properties",
+      "    return callable_obj(*props, **additional_args)",
       "  File \"RECIPE_REPO[flutter]/recipes/devicelab/devicelab_drone_1_26_0.py\", line 31, in RunSteps",
       "    raise ValueError('A task_name property is required')",
       "ValueError: A task_name property is required"
diff --git a/recipes/devicelab/devicelab_drone_1_27_0.expected/no-task-name.json b/recipes/devicelab/devicelab_drone_1_27_0.expected/no-task-name.json
index eaafc64..899cf1d 100644
--- a/recipes/devicelab/devicelab_drone_1_27_0.expected/no-task-name.json
+++ b/recipes/devicelab/devicelab_drone_1_27_0.expected/no-task-name.json
@@ -7,6 +7,14 @@
       "The recipe has crashed at point 'Uncaught exception'!",
       "",
       "Traceback (most recent call last):",
+      "  File \"RECIPE_REPO[recipe_engine]/recipe_engine/internal/engine.py\", in run_steps",
+      "    raw_result = recipe_obj.run_steps(api, engine)",
+      "  File \"RECIPE_REPO[recipe_engine]/recipe_engine/internal/recipe_deps.py\", in run_steps",
+      "    properties_def, api=api)",
+      "  File \"RECIPE_REPO[recipe_engine]/recipe_engine/internal/property_invoker.py\", in invoke_with_properties",
+      "    arg_names, **additional_args)",
+      "  File \"RECIPE_REPO[recipe_engine]/recipe_engine/internal/property_invoker.py\", in _invoke_with_properties",
+      "    return callable_obj(*props, **additional_args)",
       "  File \"RECIPE_REPO[flutter]/recipes/devicelab/devicelab_drone_1_27_0.py\", line 31, in RunSteps",
       "    raise ValueError('A task_name property is required')",
       "ValueError: A task_name property is required"
diff --git a/recipes/engine/web_engine_drone.expected/linux-error.json b/recipes/engine/web_engine_drone.expected/linux-error.json
index 9162573..4b3a18f 100644
--- a/recipes/engine/web_engine_drone.expected/linux-error.json
+++ b/recipes/engine/web_engine_drone.expected/linux-error.json
@@ -218,8 +218,14 @@
       "The recipe has crashed at point 'Uncaught exception'!",
       "",
       "Traceback (most recent call last):",
+      "  File \"RECIPE_REPO[recipe_engine]/recipe_engine/internal/engine.py\", in run_steps",
+      "    raw_result = recipe_obj.run_steps(api, engine)",
+      "  File \"RECIPE_REPO[recipe_engine]/recipe_engine/internal/recipe_deps.py\", in run_steps",
+      "    recipe_result = self.global_symbols['RunSteps'](*args)",
       "  File \"RECIPE_REPO[flutter]/recipes/engine/web_engine_drone.py\", line 78, in RunSteps",
       "    api.web_util.prepare_dependencies(checkout)",
+      "  File \"RECIPE_REPO[recipe_engine]/recipe_engine/recipe_api.py\", in _inner",
+      "    return func(*a, **kw)",
       "  File \"RECIPE_REPO[flutter]/recipe_modules/web_util/api.py\", line 172, in prepare_dependencies",
       "    raise ValueError('Dependency %s not available.' % dep)",
       "ValueError: Dependency invalid_dependency not available."
diff --git a/recipes/engine/web_engine_drone_1_26_0.expected/linux-error.json b/recipes/engine/web_engine_drone_1_26_0.expected/linux-error.json
index 2365f11..73a7bbc 100644
--- a/recipes/engine/web_engine_drone_1_26_0.expected/linux-error.json
+++ b/recipes/engine/web_engine_drone_1_26_0.expected/linux-error.json
@@ -218,8 +218,14 @@
       "The recipe has crashed at point 'Uncaught exception'!",
       "",
       "Traceback (most recent call last):",
+      "  File \"RECIPE_REPO[recipe_engine]/recipe_engine/internal/engine.py\", in run_steps",
+      "    raw_result = recipe_obj.run_steps(api, engine)",
+      "  File \"RECIPE_REPO[recipe_engine]/recipe_engine/internal/recipe_deps.py\", in run_steps",
+      "    recipe_result = self.global_symbols['RunSteps'](*args)",
       "  File \"RECIPE_REPO[flutter]/recipes/engine/web_engine_drone_1_26_0.py\", line 76, in RunSteps",
       "    api.web_util.prepare_dependencies(checkout)",
+      "  File \"RECIPE_REPO[recipe_engine]/recipe_engine/recipe_api.py\", in _inner",
+      "    return func(*a, **kw)",
       "  File \"RECIPE_REPO[flutter]/recipe_modules/web_util/api.py\", line 172, in prepare_dependencies",
       "    raise ValueError('Dependency %s not available.' % dep)",
       "ValueError: Dependency invalid_dependency not available."
diff --git a/recipes/engine/web_engine_drone_1_27_0.expected/linux-error.json b/recipes/engine/web_engine_drone_1_27_0.expected/linux-error.json
index ec08626..1a3c66e 100644
--- a/recipes/engine/web_engine_drone_1_27_0.expected/linux-error.json
+++ b/recipes/engine/web_engine_drone_1_27_0.expected/linux-error.json
@@ -218,8 +218,14 @@
       "The recipe has crashed at point 'Uncaught exception'!",
       "",
       "Traceback (most recent call last):",
+      "  File \"RECIPE_REPO[recipe_engine]/recipe_engine/internal/engine.py\", in run_steps",
+      "    raw_result = recipe_obj.run_steps(api, engine)",
+      "  File \"RECIPE_REPO[recipe_engine]/recipe_engine/internal/recipe_deps.py\", in run_steps",
+      "    recipe_result = self.global_symbols['RunSteps'](*args)",
       "  File \"RECIPE_REPO[flutter]/recipes/engine/web_engine_drone_1_27_0.py\", line 76, in RunSteps",
       "    api.web_util.prepare_dependencies(checkout)",
+      "  File \"RECIPE_REPO[recipe_engine]/recipe_engine/recipe_api.py\", in _inner",
+      "    return func(*a, **kw)",
       "  File \"RECIPE_REPO[flutter]/recipe_modules/web_util/api.py\", line 172, in prepare_dependencies",
       "    raise ValueError('Dependency %s not available.' % dep)",
       "ValueError: Dependency invalid_dependency not available."
diff --git a/recipes/femu_test.expected/no_zircon_file.json b/recipes/femu_test.expected/no_zircon_file.json
index b0862d2..d6f2c96 100644
--- a/recipes/femu_test.expected/no_zircon_file.json
+++ b/recipes/femu_test.expected/no_zircon_file.json
@@ -513,6 +513,89 @@
     "name": "Package Fuchsia Artifacts"
   },
   {
+    "cmd": [],
+    "name": "Retrieve list of gtest filters",
+    "~followup_annotations": [
+      "@@@STEP_LOG_LINE@yaml@txt_tests: -ParagraphTest.*@@@",
+      "@@@STEP_LOG_LINE@yaml@fml_tests: -MessageLoop.TimeSensistiveTest_*:FileTest.CanTruncateAndWrite:FileTest.CreateDirectoryStructure@@@",
+      "@@@STEP_LOG_END@yaml@@@"
+    ]
+  },
+  {
+    "cmd": [
+      "vpython",
+      "-u",
+      "RECIPE_MODULE[recipe_engine::file]/resources/fileutil.py",
+      "--json-output",
+      "/path/to/tmp/json",
+      "copy",
+      "[CACHE]/builder/src/flutter/testing/fuchsia/gtest_filters.yaml",
+      "/path/to/tmp/"
+    ],
+    "cwd": "[CACHE]/builder",
+    "env": {
+      "GOMA_DIR": "[CACHE]/goma/client"
+    },
+    "env_prefixes": {
+      "PATH": [
+        "[CACHE]/builder/src/third_party/dart/tools/sdks/dart-sdk/bin"
+      ]
+    },
+    "env_suffixes": {
+      "DEPOT_TOOLS_UPDATE": [
+        "0"
+      ],
+      "PATH": [
+        "RECIPE_REPO[depot_tools]"
+      ]
+    },
+    "infra_step": true,
+    "name": "Retrieve list of gtest filters.read",
+    "~followup_annotations": [
+      "@@@STEP_NEST_LEVEL@1@@@",
+      "@@@STEP_LOG_LINE@gtest_filters.yaml@txt_tests: -ParagraphTest.*@@@",
+      "@@@STEP_LOG_LINE@gtest_filters.yaml@fml_tests: -MessageLoop.TimeSensistiveTest_*:FileTest.CanTruncateAndWrite:FileTest.CreateDirectoryStructure@@@",
+      "@@@STEP_LOG_END@gtest_filters.yaml@@@"
+    ]
+  },
+  {
+    "cmd": [
+      "vpython",
+      "-u",
+      "RECIPE_MODULE[flutter::yaml]/resources/parse_yaml.py",
+      "--yaml_file",
+      "[CACHE]/builder/src/flutter/testing/fuchsia/gtest_filters.yaml",
+      "--json_file",
+      "/path/to/tmp/json"
+    ],
+    "cwd": "[CACHE]/builder",
+    "env": {
+      "GOMA_DIR": "[CACHE]/goma/client"
+    },
+    "env_prefixes": {
+      "PATH": [
+        "[CACHE]/builder/src/third_party/dart/tools/sdks/dart-sdk/bin"
+      ]
+    },
+    "env_suffixes": {
+      "DEPOT_TOOLS_UPDATE": [
+        "0"
+      ],
+      "PATH": [
+        "RECIPE_REPO[depot_tools]"
+      ]
+    },
+    "name": "Retrieve list of gtest filters.parse",
+    "~followup_annotations": [
+      "@@@STEP_NEST_LEVEL@1@@@",
+      "@@@STEP_LOG_LINE@json.output@{@@@",
+      "@@@STEP_LOG_LINE@json.output@  \"fml_tests\": \"-MessageLoop.TimeSensistiveTest_*:FileTest.CanTruncateAndWrite:FileTest.CreateDirectoryStructure\", @@@",
+      "@@@STEP_LOG_LINE@json.output@  \"txt_tests\": \"-ParagraphTest.*\"@@@",
+      "@@@STEP_LOG_LINE@json.output@}@@@",
+      "@@@STEP_LOG_END@json.output@@@"
+    ]
+  },
+  {
     "cmd": [
       "vpython",
       "-u",
diff --git a/recipes/femu_test.expected/start_femu_with_vdl.json b/recipes/femu_test.expected/start_femu_with_vdl.json
index ef1db44..ca7a306 100644
--- a/recipes/femu_test.expected/start_femu_with_vdl.json
+++ b/recipes/femu_test.expected/start_femu_with_vdl.json
@@ -513,6 +513,89 @@
     "name": "Package Fuchsia Artifacts"
   },
   {
+    "cmd": [],
+    "name": "Retrieve list of gtest filters",
+    "~followup_annotations": [
+      "@@@STEP_LOG_LINE@yaml@txt_tests: -ParagraphTest.*@@@",
+      "@@@STEP_LOG_LINE@yaml@fml_tests: -MessageLoop.TimeSensistiveTest_*:FileTest.CanTruncateAndWrite:FileTest.CreateDirectoryStructure@@@",
+      "@@@STEP_LOG_END@yaml@@@"
+    ]
+  },
+  {
+    "cmd": [
+      "vpython",
+      "-u",
+      "RECIPE_MODULE[recipe_engine::file]/resources/fileutil.py",
+      "--json-output",
+      "/path/to/tmp/json",
+      "copy",
+      "[CACHE]/builder/src/flutter/testing/fuchsia/gtest_filters.yaml",
+      "/path/to/tmp/"
+    ],
+    "cwd": "[CACHE]/builder",
+    "env": {
+      "GOMA_DIR": "[CACHE]/goma/client"
+    },
+    "env_prefixes": {
+      "PATH": [
+        "[CACHE]/builder/src/third_party/dart/tools/sdks/dart-sdk/bin"
+      ]
+    },
+    "env_suffixes": {
+      "DEPOT_TOOLS_UPDATE": [
+        "0"
+      ],
+      "PATH": [
+        "RECIPE_REPO[depot_tools]"
+      ]
+    },
+    "infra_step": true,
+    "name": "Retrieve list of gtest filters.read",
+    "~followup_annotations": [
+      "@@@STEP_NEST_LEVEL@1@@@",
+      "@@@STEP_LOG_LINE@gtest_filters.yaml@txt_tests: -ParagraphTest.*@@@",
+      "@@@STEP_LOG_LINE@gtest_filters.yaml@fml_tests: -MessageLoop.TimeSensistiveTest_*:FileTest.CanTruncateAndWrite:FileTest.CreateDirectoryStructure@@@",
+      "@@@STEP_LOG_END@gtest_filters.yaml@@@"
+    ]
+  },
+  {
+    "cmd": [
+      "vpython",
+      "-u",
+      "RECIPE_MODULE[flutter::yaml]/resources/parse_yaml.py",
+      "--yaml_file",
+      "[CACHE]/builder/src/flutter/testing/fuchsia/gtest_filters.yaml",
+      "--json_file",
+      "/path/to/tmp/json"
+    ],
+    "cwd": "[CACHE]/builder",
+    "env": {
+      "GOMA_DIR": "[CACHE]/goma/client"
+    },
+    "env_prefixes": {
+      "PATH": [
+        "[CACHE]/builder/src/third_party/dart/tools/sdks/dart-sdk/bin"
+      ]
+    },
+    "env_suffixes": {
+      "DEPOT_TOOLS_UPDATE": [
+        "0"
+      ],
+      "PATH": [
+        "RECIPE_REPO[depot_tools]"
+      ]
+    },
+    "name": "Retrieve list of gtest filters.parse",
+    "~followup_annotations": [
+      "@@@STEP_NEST_LEVEL@1@@@",
+      "@@@STEP_LOG_LINE@json.output@{@@@",
+      "@@@STEP_LOG_LINE@json.output@  \"fml_tests\": \"-MessageLoop.TimeSensistiveTest_*:FileTest.CanTruncateAndWrite:FileTest.CreateDirectoryStructure\", @@@",
+      "@@@STEP_LOG_LINE@json.output@  \"txt_tests\": \"-ParagraphTest.*\"@@@",
+      "@@@STEP_LOG_LINE@json.output@}@@@",
+      "@@@STEP_LOG_END@json.output@@@"
+    ]
+  },
+  {
     "cmd": [
       "vpython",
       "-u",
diff --git a/recipes/femu_test.py b/recipes/femu_test.py
index b6f0566..3ff0c4e 100644
--- a/recipes/femu_test.py
+++ b/recipes/femu_test.py
@@ -17,6 +17,7 @@
     'depot_tools/depot_tools',
     'flutter/json_util',
     'flutter/repo_util',
+    'flutter/yaml',
     'fuchsia/display_util',
     'fuchsia/sdk',
     'fuchsia/ssh',
@@ -176,35 +177,14 @@
 
 def TestFuchsiaFEMU(api):
   """Run flutter tests on FEMU."""
+  checkout = GetCheckoutPath(api)
+  gtest_filters_file = checkout.join('flutter', 'testing', 'fuchsia',
+                                     'gtest_filters.yaml')
+  gtest_filters = api.yaml.read('Retrieve list of gtest filters',
+                                gtest_filters_file, api.json.output())
   test_args = {
-      'txt_tests':
-          '--gtest_filter=-ParagraphTest.*',
-      'fml_tests':
-          '--gtest_filter=-MessageLoop.TimeSensistiveTest_*:FileTest.CanTruncateAndWrite:FileTest.CreateDirectoryStructure',
-      'shell_tests':
-          (
-              '--gtest_filter=-'
-              'ShellTest.ReportTimingsIsCalledLaterInReleaseMode:'
-              'ShellTest.ReportTimingsIsCalledSoonerInNonReleaseMode:'
-              'ShellTest.CacheSkSLWorks:'
-              'ShellTest.FrameRasterizedCallbackIsCalled:'
-              'ShellTest.ExternalEmbedderNoThreadMerger:'
-              'ShellTest.OnPlatformViewDestroyWithoutRasterThreadMerger:'
-              'ShellTest.ReportTimingsIsCalledImmediatelyAfterTheFirstFrame:'
-              'ShellTest.DisallowedDartVMFlag:'
-              'ShellTest.SetResourceCacheSize:'
-              'ShellTest.SetResourceCacheSizeEarly:'
-              'ShellTest.SetResourceCacheSizeNotifiesDart:'
-              'ShellTest.Screenshot:'
-              'ShellTest.RasterizerScreenshot:'
-              'ShellTest.DiscardLayerTreeOnResize:'
-              'SkpWarmupTest.Basic:'
-              'SkpWarmupTest.Image:'
-              'FuchsiaShellTest.LocaltimesVaryOnTimezoneChanges'),
-      'flutter_runner_scenic_tests':
-          '--gtest_filter=-SessionConnectionTest.*:CalculateNextLatchPointTest.*',
-      'flutter_runner_tests':
-          '--gtest_filter=-EngineTest.SkpWarmup',
+    test_type: '--gtest_filter={filter}'.format(filter=gtest_filter)
+    for test_type, gtest_filter in gtest_filters.json.output.items()
   }
   flutter_tests, root_dir, isolated_hash = IsolateSymlink(api)
   cmd = ['./run_vdl_test.sh']
@@ -337,6 +317,18 @@
           ),
       ),
       api.step_data(
+          'Retrieve list of gtest filters.parse',
+          api.json.output({
+            'txt_tests': '-ParagraphTest.*',
+            'fml_tests': '-MessageLoop.TimeSensistiveTest_*:FileTest.CanTruncateAndWrite:FileTest.CreateDirectoryStructure'
+          })
+      ),
+      api.step_data(
+          'Retrieve list of gtest filters.read',
+          api.file.read_text('''txt_tests: -ParagraphTest.*
+fml_tests: -MessageLoop.TimeSensistiveTest_*:FileTest.CanTruncateAndWrite:FileTest.CreateDirectoryStructure''')
+      ),
+      api.step_data(
           'Read manifest',
           api.file.read_json({'id': '0.20200101.0.1'}),
       ),
@@ -384,6 +376,18 @@
               vdl_version='g3-revision:vdl_fuchsia_xxxxxxxx_RC00',
           ),),
       api.step_data(
+          'Retrieve list of gtest filters.parse',
+          api.json.output({
+            'txt_tests': '-ParagraphTest.*',
+            'fml_tests': '-MessageLoop.TimeSensistiveTest_*:FileTest.CanTruncateAndWrite:FileTest.CreateDirectoryStructure'
+          })
+      ),
+      api.step_data(
+          'Retrieve list of gtest filters.read',
+          api.file.read_text('''txt_tests: -ParagraphTest.*
+fml_tests: -MessageLoop.TimeSensistiveTest_*:FileTest.CanTruncateAndWrite:FileTest.CreateDirectoryStructure''')
+      ),
+      api.step_data(
           'Read manifest',
           api.file.read_json({'id': '0.20200101.0.1'}),
       ),