Remove scenario_app/android and rename to ios_scenario_app. (#160992)

🚫 **BLOCKED** : Do not merge until
https://github.com/flutter/flutter/issues/161261 (additional test
coverage).

---

This PR eliminates (1) `scenario_app/android`, and all references to an
Android `scenario_app`, including documentation, CI configuration, build
rules, test runner, Android-side test application, and (2), to verify
and disambiguate the remains, renames the folder `ios_scenario_app`,
which is now accurate.

It also eliminates elements that were _only_ used in the Android-side
scenario_app, such as Firebase Test Lab uploading.

I would be open to doing this in phases if we thought it was better to
do so, but given its mostly a mechanical change (and by renaming the
directory, references can be checked merely by looking for
`/\bscenario_app/`, I believe this is safe to iterate on and eventually
merge after the holidays.

## Background

As of the merged mono-repo, there is no longer a requirement for the
engine to be testable as a standalone unit.

As an example,
[`%ENGINE%/testing/scenario_app`](3762f2e973/engine/src/flutter/testing/scenario_app),
which was intended to _emulate_ the Flutter framework (and some of
`flutter_tools` tooling), load the iOS and Android embedder, and run
various "scenarios" (which ran a combination of `dart:ui` code and
Android Java/iOS Obj-C) verifying golden-file screenshots.

Instead, it is now possible to write and run _real_ (full) Flutter apps
the same way that an end-user (or our own tests) would. One such example
is
[`dev/native_driver_test`](https://github.com/flutter/flutter/tree/master/dev/integration_tests/native_driver_test),
which is a full-fledged Flutter app, which uses standard tooling (i.e.
`flutter`), to test most of the same elements that previously were only
tested in the Android version of `scenario_app`.
This commit is contained in:
Matan Lurey 2025-01-27 19:43:46 -08:00 committed by GitHub
parent 281efca413
commit 9e273d5e6e
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
252 changed files with 164 additions and 6597 deletions

View File

@ -38,28 +38,9 @@ Modify the following files as described:
* `shell/platform/android/test_runner/build.gradle`: Bump `compileSdkVersion XX` to the latest version. * `shell/platform/android/test_runner/build.gradle`: Bump `compileSdkVersion XX` to the latest version.
* `shell/platform/android/AndroidManifest.xml`: Bump `android:targetSdkVersion=XX` to the latest version. * `shell/platform/android/AndroidManifest.xml`: Bump `android:targetSdkVersion=XX` to the latest version.
* `testing/android/native_activity/native_activity.gni`: Bump the reference to `build-tools/XX` in `android_buildtools` to the latest **build-tools** version and the reference to `android-XX` in `android_jar` to the latest version. * `testing/android/native_activity/native_activity.gni`: Bump the reference to `build-tools/XX` in `android_buildtools` to the latest **build-tools** version and the reference to `android-XX` in `android_jar` to the latest version.
* `testing/scenario_app/android/app/build.gradle`: Upgrade `buildToolsVersion` to the latest **build-tools** version and the `compileSdkVersion` and `targetSdkVersion` to the latest version.
* In all other android projects in `testing`: Upgrade the `compileSdkVersion` and `targetSdkVersion` in `android/app/build.gradle`.
This list may become outdated, so be sure to change any references to the old SDK version to the latest version in `build.gradle` files across the repo. This list may become outdated, so be sure to change any references to the old SDK version to the latest version in `build.gradle` files across the repo.
### Update our `android_virtual_device` dependency
1. Locate the desired Android Virtual Device (AVD) from https://chrome-infra-packages.appspot.com/p/chromium/tools/android/avd/linux-amd64/. You should look at the most recently updated AVD and verify that
it has the desired `generic_android<API#>.textpb` for the API version that you are modifying the engine to support. Then, determine its build_id number by clicking on the AVD instance you would like to use and looking for the build_id tag.
2. In each of the engine builders (at the time of writing: `ci/builders/standalone/linux_android_emulator_skia.json` & `ci/builders/standalone/linux_android_emulator.json`), find the `android_virtual_device` and `avd_cipd_version` dependency entries and update them to the versions you desire, e.g.
```json
{
"dependency": "android_virtual_device",
"version": "android_<API#>_google_apis_x64.textpb"
},
{
"dependency": "avd_cipd_version",
"version": "build_id:<build_id>"
}
```
## Next Steps: Update the Framework, Examples and Samples ## Next Steps: Update the Framework, Examples and Samples
* Templates in [the framework](https://github.com/flutter/flutter): Change `targetSdkVersion` in various `build.gradle.tmpl` files to use the new API version * Templates in [the framework](https://github.com/flutter/flutter): Change `targetSdkVersion` in various `build.gradle.tmpl` files to use the new API version

View File

@ -56,110 +56,6 @@ targets:
# local_engine schedules a bunch of other builds, so it's likely to timeout waiting for those builds to run. # local_engine schedules a bunch of other builds, so it's likely to timeout waiting for those builds to run.
timeout: 180 timeout: 180
- name: Linux linux_android_emulator_tests
bringup: true
enabled_branches:
- master
recipe: engine_v2/engine_v2
properties:
config_name: linux_android_emulator
dependencies: >-
[
{"dependency": "goldctl", "version": "git_revision:720a542f6fe4f92922c3b8f0fdcc4d2ac6bb83cd"}
]
timeout: 90
runIf:
- DEPS
- engine/src/flutter/.ci.yaml
- engine/src/flutter/ci/builders/linux_android_emulator.json
- engine/src/flutter/lib/ui/**
- engine/src/flutter/shell/platform/android/**
- engine/src/flutter/testing/scenario_app/**
- engine/src/flutter/testing/skia_gold_client/**
- name: Linux linux_android_emulator_tests_34
enabled_branches:
- master
recipe: engine_v2/engine_v2
properties:
config_name: linux_android_emulator_34
dependencies: >-
[
{"dependency": "goldctl", "version": "git_revision:720a542f6fe4f92922c3b8f0fdcc4d2ac6bb83cd"}
]
timeout: 90
runIf:
- DEPS
- engine/src/flutter/.ci.yaml
- engine/src/flutter/ci/builders/linux_android_emulator.json
- engine/src/flutter/lib/ui/**
- engine/src/flutter/shell/platform/android/**
- engine/src/flutter/testing/scenario_app/**
- engine/src/flutter/testing/skia_gold_client/**
- name: Linux linux_android_emulator_opengles_tests_34
enabled_branches:
- master
recipe: engine_v2/engine_v2
properties:
config_name: linux_android_emulator_opengles_34
dependencies: >-
[
{"dependency": "goldctl", "version": "git_revision:720a542f6fe4f92922c3b8f0fdcc4d2ac6bb83cd"}
]
timeout: 90
runIf:
- DEPS
- engine/src/flutter/.ci.yaml
- engine/src/flutter/ci/builders/linux_android_emulator_opengles_34.json
- engine/src/flutter/lib/ui/**
- engine/src/flutter/shell/platform/android/**
- engine/src/flutter/testing/scenario_app/**
- engine/src/flutter/testing/skia_gold_client/**
- name: Linux linux_android_emulator_skia_tests
bringup: true
enabled_branches:
- master
recipe: engine_v2/builder
properties:
config_name: linux_android_emulator_skia
kvm: "1"
dependencies: >-
[
{"dependency": "goldctl", "version": "git_revision:720a542f6fe4f92922c3b8f0fdcc4d2ac6bb83cd"}
]
timeout: 90
runIf:
- DEPS
- engine/src/flutter/.ci.yaml
- engine/src/flutter/ci/builders/linux_android_emulator.json
- engine/src/flutter/lib/ui/**
- engine/src/flutter/shell/platform/android/**
- engine/src/flutter/testing/scenario_app/**
- engine/src/flutter/testing/skia_gold_client/**
- name: Linux linux_android_emulator_skia_tests_34
enabled_branches:
- master
recipe: engine_v2/builder
properties:
config_name: linux_android_emulator_skia_34
kvm: "1"
dependencies: >-
[
{"dependency": "goldctl", "version": "git_revision:720a542f6fe4f92922c3b8f0fdcc4d2ac6bb83cd"}
]
timeout: 90
runIf:
- DEPS
- engine/src/flutter/.ci.yaml
- engine/src/flutter/ci/builders/linux_android_emulator.json
- engine/src/flutter/lib/ui/**
- engine/src/flutter/shell/platform/android/**
- engine/src/flutter/testing/scenario_app/**
- engine/src/flutter/testing/skia_gold_client/**
- name: Linux builder_cache - name: Linux builder_cache
enabled_branches: enabled_branches:
- master - master

View File

@ -159,8 +159,8 @@ group("flutter") {
} }
if ((flutter_runtime_mode == "debug" || flutter_runtime_mode == "profile") && if ((flutter_runtime_mode == "debug" || flutter_runtime_mode == "profile") &&
(is_ios || is_android)) { is_ios) {
public_deps += [ "//flutter/testing/scenario_app" ] public_deps += [ "//flutter/testing/ios_scenario_app" ]
} }
} }

View File

@ -263,13 +263,13 @@ $ ./run_tests.py --variant=host_debug_unopt_arm64 --type=engine
| impeller_dart_unittests | engine | | | impeller_dart_unittests | engine | |
| impeller_golden_tests | engine(mac) | Generates golden images for impeller (vulkan, metal, opengles). | | impeller_golden_tests | engine(mac) | Generates golden images for impeller (vulkan, metal, opengles). |
| impeller_unittests | engine | impeller unit tests and interactive tests | | impeller_unittests | engine | impeller unit tests and interactive tests |
| ios_scenario_app | android | Integration and golden tests for iOS. |
| ios_test_flutter | objc | dynamic library of objc tests to be run with XCTest | | ios_test_flutter | objc | dynamic library of objc tests to be run with XCTest |
| jni_unittests | engine(not windows) | | | jni_unittests | engine(not windows) | |
| no_dart_plugin_registrant_unittests | engine | | | no_dart_plugin_registrant_unittests | engine | |
| platform_view_android_delegate_unittests | engine(not windows) | | | platform_view_android_delegate_unittests | engine(not windows) | |
| runtime_unittests | engine | | | runtime_unittests | engine | |
| shell_unittests | engine(not windows) | | | shell_unittests | engine(not windows) | |
| scenario_app | android | Integration and golden tests for Android, iOS |
| tonic_unittests | engine | Unit tests for //third_party/tonic | | tonic_unittests | engine | Unit tests for //third_party/tonic |
| txt_unittests | engine(linux) | | | txt_unittests | engine(linux) | |
| ui_unittests | engine | | | ui_unittests | engine | |

View File

@ -196,27 +196,10 @@
"targets": [ "targets": [
"clang_x64/gen_snapshot", "clang_x64/gen_snapshot",
"default", "default",
"flutter/testing/scenario_app/android",
"flutter/shell/platform/android:abi_jars", "flutter/shell/platform/android:abi_jars",
"flutter/shell/platform/android:analyze_snapshot" "flutter/shell/platform/android:analyze_snapshot"
] ]
}, }
"tests": [
{
"env": {
"STORAGE_BUCKET": "gs://flutter_firebase_testlab_staging",
"GCP_PROJECT": "flutter-infra-staging"
},
"name": "test: Android Firebase Test",
"language": "python3",
"script": "flutter/ci/firebase_testlab.py",
"parameters": [
"--variant",
"ci/android_profile_arm64"
],
"test_if": "main"
}
]
}, },
{ {
"archives": [ "archives": [

View File

@ -26,13 +26,12 @@
} }
], ],
"name": "ci/android_emulator_debug_x64", "name": "ci/android_emulator_debug_x64",
"description": "Build for debug mode x64 Android emulator tests, and Impeller scenario app tests.", "description": "Build for debug mode x64 Android emulator tests.",
"ninja": { "ninja": {
"config": "ci/android_emulator_debug_x64", "config": "ci/android_emulator_debug_x64",
"targets": [ "targets": [
"flutter/impeller/toolkit/android:unittests", "flutter/impeller/toolkit/android:unittests",
"flutter/shell/platform/android:flutter_shell_native_unittests", "flutter/shell/platform/android:flutter_shell_native_unittests"
"flutter/testing/scenario_app"
] ]
}, },
"tests": [ "tests": [
@ -65,31 +64,6 @@
"name": "skia_gold_client/e2e_test", "name": "skia_gold_client/e2e_test",
"script": "flutter/testing/skia_gold_client/tool/e2e_test.dart", "script": "flutter/testing/skia_gold_client/tool/e2e_test.dart",
"max_attempts": 1 "max_attempts": 1
},
{
"language": "dart",
"name": "Android Scenario App Integration Tests (Impeller/Vulkan)",
"test_timeout_secs": 900,
"max_attempts": 2,
"test_dependencies": [
{
"dependency": "android_virtual_device",
"version": "android_35_google_apis_x64.textpb"
},
{
"dependency": "avd_cipd_version",
"version": "build_id:8733065022087935185"
}
],
"contexts": [
"android_virtual_device"
],
"script": "flutter/testing/scenario_app/bin/run_android_tests.dart",
"parameters": [
"--out-dir=../out/ci/android_emulator_debug_x64",
"--enable-impeller",
"--impeller-backend=vulkan"
]
} }
] ]
}, },
@ -124,8 +98,7 @@
"config": "ci/android_emulator_debug_x86", "config": "ci/android_emulator_debug_x86",
"targets": [ "targets": [
"flutter/impeller/toolkit/android:unittests", "flutter/impeller/toolkit/android:unittests",
"flutter/shell/platform/android:flutter_shell_native_unittests", "flutter/shell/platform/android:flutter_shell_native_unittests"
"flutter/testing/scenario_app"
] ]
}, },
"tests": [ "tests": [

View File

@ -26,13 +26,12 @@
} }
], ],
"name": "ci/android_emulator_debug_x64", "name": "ci/android_emulator_debug_x64",
"description": "Build for debug mode x64 Android emulator tests, and Impeller scenario app tests.", "description": "Build for debug mode x64 Android emulator tests.",
"ninja": { "ninja": {
"config": "ci/android_emulator_debug_x64", "config": "ci/android_emulator_debug_x64",
"targets": [ "targets": [
"flutter/impeller/toolkit/android:unittests", "flutter/impeller/toolkit/android:unittests",
"flutter/shell/platform/android:flutter_shell_native_unittests", "flutter/shell/platform/android:flutter_shell_native_unittests"
"flutter/testing/scenario_app"
] ]
}, },
"tests": [ "tests": [
@ -65,31 +64,6 @@
"name": "skia_gold_client/e2e_test", "name": "skia_gold_client/e2e_test",
"script": "flutter/testing/skia_gold_client/tool/e2e_test.dart", "script": "flutter/testing/skia_gold_client/tool/e2e_test.dart",
"max_attempts": 1 "max_attempts": 1
},
{
"language": "dart",
"name": "Android Scenario App Integration Tests (Impeller/Vulkan)",
"test_timeout_secs": 900,
"max_attempts": 2,
"test_dependencies": [
{
"dependency": "android_virtual_device",
"version": "android_34_google_apis_x64.textpb"
},
{
"dependency": "avd_cipd_version",
"version": "build_id:8733065022087935185"
}
],
"contexts": [
"android_virtual_device"
],
"script": "flutter/testing/scenario_app/bin/run_android_tests.dart",
"parameters": [
"--out-dir=../out/ci/android_emulator_debug_x64",
"--enable-impeller",
"--impeller-backend=vulkan"
]
} }
] ]
}, },
@ -124,8 +98,7 @@
"config": "ci/android_emulator_debug_x86", "config": "ci/android_emulator_debug_x86",
"targets": [ "targets": [
"flutter/impeller/toolkit/android:unittests", "flutter/impeller/toolkit/android:unittests",
"flutter/shell/platform/android:flutter_shell_native_unittests", "flutter/shell/platform/android:flutter_shell_native_unittests"
"flutter/testing/scenario_app"
] ]
}, },
"tests": [ "tests": [

View File

@ -26,13 +26,12 @@
} }
], ],
"name": "ci/android_emulator_debug_x64", "name": "ci/android_emulator_debug_x64",
"description": "Build for debug mode x64 Android emulator tests, and Impeller scenario app tests.", "description": "Build for debug mode x64 Android emulator tests.",
"ninja": { "ninja": {
"config": "ci/android_emulator_debug_x64", "config": "ci/android_emulator_debug_x64",
"targets": [ "targets": [
"flutter/impeller/toolkit/android:unittests", "flutter/impeller/toolkit/android:unittests",
"flutter/shell/platform/android:flutter_shell_native_unittests", "flutter/shell/platform/android:flutter_shell_native_unittests"
"flutter/testing/scenario_app"
] ]
}, },
"tests": [ "tests": [
@ -65,31 +64,6 @@
"name": "skia_gold_client/e2e_test", "name": "skia_gold_client/e2e_test",
"script": "flutter/testing/skia_gold_client/tool/e2e_test.dart", "script": "flutter/testing/skia_gold_client/tool/e2e_test.dart",
"max_attempts": 1 "max_attempts": 1
},
{
"language": "dart",
"name": "Android Scenario App Integration Tests (Impeller/GLES)",
"test_timeout_secs": 900,
"max_attempts": 2,
"test_dependencies": [
{
"dependency": "android_virtual_device",
"version": "android_34_google_apis_x64.textpb"
},
{
"dependency": "avd_cipd_version",
"version": "build_id:8733065022087935185"
}
],
"contexts": [
"android_virtual_device"
],
"script": "flutter/testing/scenario_app/bin/run_android_tests.dart",
"parameters": [
"--out-dir=../out/ci/android_emulator_debug_x64",
"--enable-impeller",
"--impeller-backend=opengles"
]
} }
] ]
} }

View File

@ -249,7 +249,7 @@
"ninja": { "ninja": {
"config": "ci/ios_debug_unopt_sim", "config": "ci/ios_debug_unopt_sim",
"targets": [ "targets": [
"flutter/testing/scenario_app", "flutter/testing/ios_scenario_app",
"flutter/shell/platform/darwin/ios:ios_test_flutter" "flutter/shell/platform/darwin/ios:ios_test_flutter"
] ]
}, },
@ -273,7 +273,7 @@
"parameters": [ "parameters": [
"ci/ios_debug_unopt_sim" "ci/ios_debug_unopt_sim"
], ],
"script": "flutter/testing/scenario_app/run_ios_tests.sh" "script": "flutter/testing/ios_scenario_app/run_ios_tests.sh"
} }
] ]
}, },
@ -377,7 +377,7 @@
"ninja": { "ninja": {
"config": "ci/ios_debug_unopt_sim_arm64", "config": "ci/ios_debug_unopt_sim_arm64",
"targets": [ "targets": [
"flutter/testing/scenario_app", "flutter/testing/ios_scenario_app",
"flutter/shell/platform/darwin/ios:ios_test_flutter" "flutter/shell/platform/darwin/ios:ios_test_flutter"
] ]
}, },
@ -401,7 +401,7 @@
"parameters": [ "parameters": [
"ci/ios_debug_unopt_sim_arm64" "ci/ios_debug_unopt_sim_arm64"
], ],
"script": "flutter/testing/scenario_app/run_ios_tests.sh" "script": "flutter/testing/ios_scenario_app/run_ios_tests.sh"
} }
] ]
@ -446,7 +446,7 @@
"ninja": { "ninja": {
"config": "ci/ios_debug_unopt_sim_arm64_extension_safe", "config": "ci/ios_debug_unopt_sim_arm64_extension_safe",
"targets": [ "targets": [
"flutter/testing/scenario_app", "flutter/testing/ios_scenario_app",
"flutter/shell/platform/darwin/ios:ios_test_flutter" "flutter/shell/platform/darwin/ios:ios_test_flutter"
] ]
}, },
@ -470,7 +470,7 @@
"parameters": [ "parameters": [
"ci/ios_debug_unopt_sim_arm64_extension_safe" "ci/ios_debug_unopt_sim_arm64_extension_safe"
], ],
"script": "flutter/testing/scenario_app/run_ios_tests.sh" "script": "flutter/testing/ios_scenario_app/run_ios_tests.sh"
} }
] ]
}, },

View File

@ -1,81 +0,0 @@
{
"gclient_variables": {
"use_rbe": true
},
"gn": [
"--android",
"--android-cpu=x64",
"--no-lto",
"--rbe",
"--no-goma",
"--target-dir",
"ci/android_emulator_skia_debug_x64"
],
"dependencies": [
{
"dependency": "goldctl",
"version": "git_revision:720a542f6fe4f92922c3b8f0fdcc4d2ac6bb83cd"
}
],
"name": "ci/android_emulator_skia_debug_x64",
"description": "Build for debug mode x64 Android Skia scenario app tests.",
"ninja": {
"config": "ci/android_emulator_skia_debug_x64",
"targets": [
"flutter/impeller/toolkit/android:unittests",
"flutter/shell/platform/android:flutter_shell_native_unittests",
"flutter/testing/scenario_app"
]
},
"tests": [
{
"language": "dart",
"name": "Android Scenario App Integration Tests (Skia)",
"test_timeout_secs": 900,
"max_attempts": 2,
"test_dependencies": [
{
"dependency": "android_virtual_device",
"version": "android_35_google_apis_x64.textpb"
},
{
"dependency": "avd_cipd_version",
"version": "build_id:8733065022087935185"
}
],
"contexts": [
"android_virtual_device"
],
"script": "flutter/testing/scenario_app/bin/run_android_tests.dart",
"parameters": [
"--out-dir=../out/ci/android_emulator_skia_debug_x64",
"--no-enable-impeller"
]
},
{
"language": "dart",
"name": "Android Scenario App Integration Tests (Skia, SurfaceTexture)",
"test_timeout_secs": 900,
"max_attempts": 2,
"test_dependencies": [
{
"dependency": "android_virtual_device",
"version": "android_35_google_apis_x64.textpb"
},
{
"dependency": "avd_cipd_version",
"version": "build_id:8733065022087935185"
}
],
"contexts": [
"android_virtual_device"
],
"script": "flutter/testing/scenario_app/bin/run_android_tests.dart",
"parameters": [
"--out-dir=../out/ci/android_emulator_skia_debug_x64",
"--no-enable-impeller",
"--force-surface-producer-surface-texture"
]
}
]
}

View File

@ -1,81 +0,0 @@
{
"gclient_variables": {
"use_rbe": true
},
"gn": [
"--android",
"--android-cpu=x64",
"--no-lto",
"--rbe",
"--no-goma",
"--target-dir",
"ci/android_emulator_skia_debug_x64"
],
"dependencies": [
{
"dependency": "goldctl",
"version": "git_revision:720a542f6fe4f92922c3b8f0fdcc4d2ac6bb83cd"
}
],
"name": "ci/android_emulator_skia_debug_x64",
"description": "Build for debug mode x64 Android Skia scenario app tests.",
"ninja": {
"config": "ci/android_emulator_skia_debug_x64",
"targets": [
"flutter/impeller/toolkit/android:unittests",
"flutter/shell/platform/android:flutter_shell_native_unittests",
"flutter/testing/scenario_app"
]
},
"tests": [
{
"language": "dart",
"name": "Android Scenario App Integration Tests (Skia)",
"test_timeout_secs": 900,
"max_attempts": 2,
"test_dependencies": [
{
"dependency": "android_virtual_device",
"version": "android_34_google_apis_x64.textpb"
},
{
"dependency": "avd_cipd_version",
"version": "build_id:8733065022087935185"
}
],
"contexts": [
"android_virtual_device"
],
"script": "flutter/testing/scenario_app/bin/run_android_tests.dart",
"parameters": [
"--out-dir=../out/ci/android_emulator_skia_debug_x64",
"--no-enable-impeller"
]
},
{
"language": "dart",
"name": "Android Scenario App Integration Tests (Skia, SurfaceTexture)",
"test_timeout_secs": 900,
"max_attempts": 2,
"test_dependencies": [
{
"dependency": "android_virtual_device",
"version": "android_34_google_apis_x64.textpb"
},
{
"dependency": "avd_cipd_version",
"version": "build_id:8733065022087935185"
}
],
"contexts": [
"android_virtual_device"
],
"script": "flutter/testing/scenario_app/bin/run_android_tests.dart",
"parameters": [
"--out-dir=../out/ci/android_emulator_skia_debug_x64",
"--no-enable-impeller",
"--force-surface-producer-surface-texture"
]
}
]
}

View File

@ -1,164 +0,0 @@
#!/usr/bin/env python3
#
# Copyright 2013 The Flutter Authors. All rights reserved.
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.
import argparse
import glob
import re
import os
import subprocess
import sys
from compatibility_helper import byte_str_decode
if 'STORAGE_BUCKET' not in os.environ:
print('The GCP storage bucket must be provided as an environment variable.')
sys.exit(1)
BUCKET = os.environ['STORAGE_BUCKET']
if 'GCP_PROJECT' not in os.environ:
print('The GCP project must be provided as an environment variable.')
sys.exit(1)
PROJECT = os.environ['GCP_PROJECT']
# Exit codes returned by the FTL command that signal an infrastructure failure.
FTL_INFRA_FAILURE_CODES = [1, 15, 20]
# Maximum number of retries done if an infrastructure failure occurs.
MAX_RETRY_ATTEMPTS = 2
script_dir = os.path.dirname(os.path.realpath(__file__))
buildroot_dir = os.path.abspath(os.path.join(script_dir, '..', '..'))
out_dir = os.path.join(buildroot_dir, 'out')
error_re = re.compile(r'[EF]/flutter.+')
def run_firebase_test(apk, results_dir):
# game-loop tests are meant for OpenGL apps.
# This type of test will give the application a handle to a file, and
# we'll write the timeline JSON to that file.
# See https://firebase.google.com/docs/test-lab/android/game-loop
# Pixel 5. As of this commit, this is a highly available device in FTL.
process = subprocess.Popen(
[
'gcloud',
'--project',
PROJECT,
'firebase',
'test',
'android',
'run',
'--type',
'game-loop',
'--app',
apk,
'--timeout',
'2m',
'--results-bucket',
BUCKET,
'--results-dir',
results_dir,
'--device',
'model=shiba,version=34',
],
stdout=subprocess.PIPE,
stderr=subprocess.STDOUT,
universal_newlines=True,
)
return process
def check_logcat(results_dir):
logcat = subprocess.check_output(['gsutil', 'cat', '%s/%s/*/logcat' % (BUCKET, results_dir)])
logcat = byte_str_decode(logcat)
if not logcat:
sys.exit(1)
logcat_matches = error_re.findall(logcat)
if logcat_matches:
print('Errors in logcat:')
print(logcat_matches)
sys.exit(1)
def check_timeline(results_dir):
gsutil_du = subprocess.check_output([
'gsutil', 'du',
'%s/%s/*/game_loop_results/results_scenario_0.json' % (BUCKET, results_dir)
])
gsutil_du = byte_str_decode(gsutil_du)
gsutil_du = gsutil_du.strip()
if gsutil_du == '0':
print('Failed to produce a timeline.')
sys.exit(1)
def main():
parser = argparse.ArgumentParser()
parser.add_argument(
'--variant',
dest='variant',
action='store',
default='android_profile_arm64',
help='The engine variant to run tests for.'
)
parser.add_argument(
'--build-id',
default=os.environ.get('SWARMING_TASK_ID', 'local_test'),
help='A unique build identifier for this test. Used to sort results in the GCS bucket.'
)
args = parser.parse_args()
apks_dir = os.path.join(out_dir, args.variant, 'firebase_apks')
apks = set(glob.glob('%s/*.apk' % apks_dir))
if not apks:
print('No APKs found at %s' % apks_dir)
return 1
git_revision = subprocess.check_output(['git', 'rev-parse', 'HEAD'], cwd=script_dir)
git_revision = byte_str_decode(git_revision)
git_revision = git_revision.strip()
for retry in range(MAX_RETRY_ATTEMPTS):
if retry > 0:
print('Retrying %s' % apks)
results = []
for apk in sorted(apks):
results_dir = '%s/%s/%s' % (os.path.basename(apk), git_revision, args.build_id)
process = run_firebase_test(apk, results_dir)
results.append((apk, results_dir, process))
for apk, results_dir, process in results:
print('===== Test output for %s' % apk)
for line in iter(process.stdout.readline, ''):
print(line.strip())
return_code = process.wait()
if return_code in FTL_INFRA_FAILURE_CODES:
print('Firebase test %s failed with infrastructure error code: %s' % (apk, return_code))
continue
if return_code != 0:
print('Firebase test %s failed with code: %s' % (apk, return_code))
sys.exit(return_code)
print('Checking logcat for %s' % results_dir)
check_logcat(results_dir)
# scenario_app produces a timeline, but the android image test does not.
if 'scenario' in apk:
print('Checking timeline for %s' % results_dir)
check_timeline(results_dir)
apks.remove(apk)
if not apks:
break
return 0
if __name__ == '__main__':
sys.exit(main())

View File

@ -1,13 +0,0 @@
#!/bin/bash
#
# Copyright 2013 The Flutter Authors. All rights reserved.
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.
# TODO(dnfield): delete this script once recipes point to the python version.
set -e
CURRENT_DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" >/dev/null 2>&1 && pwd )"
python $CURRENT_DIR/firebase_testlab.py

View File

@ -153,39 +153,9 @@ submitting PRs to the `flutter/engine` repository.
### End-to-end tests ### End-to-end tests
End-to-end tests exercise the entire Android embedding with the C++ engine on End-to-end tests for the Android embedder exist as part of the test suites
a real Android runtime in an emulator. It's an integration test ensuring that in the root of the monorepo. See
the engine as a whole on Android is functioning correctly. [`dev/integration_tests`](../../../../../dev/integration_tests/).
The project containing the Android end-to-end engine test is at
https://github.com/flutter/engine/tree/main/testing/scenario_app/android.
This test project is build similarly to a normal Flutter app. The Dart code is
compiled into AOT and the Android part is compiled via Gradle with a dependency
on the prebuilt local engine. The built app then installed and executed on an
emulator.
Unlike a normal Flutter app, the Flutter framework on the Dart side is a
lightweight fake at https://github.com/flutter/engine/tree/main/testing/scenario_app/lib
that implements some of the basic functionalities of `dart:ui` Window rather
than using the real Flutter framework at `flutter/flutter`.
The end-to-end test can be executed by running:
```
testing/scenario_app/run_android_tests.sh
```
Additional end-to-end instrumented tests can be added to https://github.com/flutter/engine/tree/main/testing/scenario_app/android/app/src/androidTest/java/dev/flutter/scenarios.
If supporting logic is needed for the test case, it can be added to the
Android app under-test in https://github.com/flutter/engine/tree/main/testing/scenario_app/android/app/src/main/java/dev/flutter/scenarios
or to the fake Flutter framework under-test in https://github.com/flutter/engine/tree/main/testing/scenario_app/lib.
As best practice, favor adding unit tests if possible since instrumented tests
are, by nature, non-hermetic, slow and flaky.
End-to-end tests on Android are run on presubmit for flutter/engine PRs.
## Objective-C - iOS embedding ## Objective-C - iOS embedding
@ -268,7 +238,7 @@ a headless iOS simulator. It's an integration test ensuring that
the engine as a whole on iOS is functioning correctly. the engine as a whole on iOS is functioning correctly.
The project containing the iOS end-to-end engine test is at The project containing the iOS end-to-end engine test is at
https://github.com/flutter/engine/tree/main/testing/scenario_app/ios. https://github.com/flutter/engine/tree/main/testing/ios_scenario_app/ios.
This test project is build similarly to a normal debug Flutter app. The Dart This test project is build similarly to a normal debug Flutter app. The Dart
code is bundled in JIT mode and is brought into Xcode with a `.framework` code is bundled in JIT mode and is brought into Xcode with a `.framework`
@ -276,21 +246,21 @@ dependency on the prebuilt local engine. It's then installed and executed on a
simulator via Xcode. simulator via Xcode.
Unlike a normal Flutter app, the Flutter framework on the Dart side is a Unlike a normal Flutter app, the Flutter framework on the Dart side is a
lightweight fake at https://github.com/flutter/engine/tree/main/testing/scenario_app/lib lightweight fake at https://github.com/flutter/engine/tree/main/testing/ios_scenario_app/lib
that implements some of the basic functionalities of `dart:ui` Window rather that implements some of the basic functionalities of `dart:ui` Window rather
than using the real Flutter framework at `flutter/flutter`. than using the real Flutter framework at `flutter/flutter`.
The end-to-end test can be executed by running: The end-to-end test can be executed by running:
``` ```sh
testing/scenario_app/run_ios_tests.sh testing/ios_scenario_app/run_ios_tests.sh
``` ```
Additional end-to-end instrumented tests can be added to https://github.com/flutter/engine/tree/main/testing/scenario_app/ios/Scenarios/ScenariosTests. Additional end-to-end instrumented tests can be added to https://github.com/flutter/engine/tree/main/testing/ios_scenario_app/ios/Scenarios/ScenariosTests.
If supporting logic is needed for the test case, it can be added to the If supporting logic is needed for the test case, it can be added to the
Android app under-test in https://github.com/flutter/engine/tree/main/testing/scenario_app/ios/Scenarios/Scenarios Android app under-test in https://github.com/flutter/engine/tree/main/testing/ios_scenario_app/ios/Scenarios/Scenarios
or to the fake Flutter framework under-test in https://github.com/flutter/engine/tree/main/testing/scenario_app/lib. or to the fake Flutter framework under-test in https://github.com/flutter/engine/tree/main/testing/ios_scenario_app/lib.
As best practice, favor adding unit tests if possible since end-to-end tests As best practice, favor adding unit tests if possible since end-to-end tests
are, by nature, non-hermetic, slow and flaky. are, by nature, non-hermetic, slow and flaky.
@ -323,7 +293,7 @@ and [Ninja](https://ninja-build.org/) build systems to use a version of the Dart
SDK specified in the `DEPS` file to create a `sky_engine` Dart package. Then it SDK specified in the `DEPS` file to create a `sky_engine` Dart package. Then it
compiles and runs each `_test.dart` file under `testing/dart`. compiles and runs each `_test.dart` file under `testing/dart`.
To debug the test, open `src/out/ios_debug_sim_unopt/scenario_app/Scenarios.xcodeproj` in To debug the test, open `src/out/ios_debug_sim_unopt/ios_scenario_app/Scenarios.xcodeproj` in
Xcode and hit CMD+U. Xcode and hit CMD+U.
Dart unit tests are executed during pre-submit on our CI system when submitting Dart unit tests are executed during pre-submit on our CI system when submitting

View File

@ -86,7 +86,7 @@ workspace:
- shell/vmservice - shell/vmservice
- testing/benchmark - testing/benchmark
- testing/dart - testing/dart
- testing/scenario_app - testing/ios_scenario_app
- testing/skia_gold_client - testing/skia_gold_client
- testing/smoke_test_failure - testing/smoke_test_failure
- testing/symbols - testing/symbols

View File

@ -5,16 +5,14 @@
import("//flutter/build/dart/rules.gni") import("//flutter/build/dart/rules.gni")
import("//flutter/testing/rules/runtime_mode.gni") import("//flutter/testing/rules/runtime_mode.gni")
flutter_snapshot("scenario_app_snapshot") { flutter_snapshot("ios_scenario_app_snapshot") {
main_dart = "lib/main.dart" main_dart = "lib/main.dart"
} }
if (!is_aot) { if (!is_aot) {
if (is_android) { if (is_ios) {
_flutter_assets_dir = "$root_out_dir/scenario_app/app/assets/flutter_assets"
} else if (is_ios) {
_flutter_assets_dir = _flutter_assets_dir =
"$root_out_dir/scenario_app/Scenarios/App.framework/flutter_assets" "$root_out_dir/ios_scenario_app/Scenarios/App.framework/flutter_assets"
} else { } else {
assert(false) assert(false)
} }
@ -27,21 +25,17 @@ if (!is_aot) {
"$target_gen_dir/kernel_blob.bin", "$target_gen_dir/kernel_blob.bin",
] ]
outputs = [ "$_flutter_assets_dir/{{source_file_part}}" ] outputs = [ "$_flutter_assets_dir/{{source_file_part}}" ]
deps = [ ":scenario_app_snapshot" ] deps = [ ":ios_scenario_app_snapshot" ]
} }
} }
group("scenario_app") { group("ios_scenario_app") {
deps = [ ":scenario_app_snapshot" ] deps = [ ":ios_scenario_app_snapshot" ]
if (!is_aot) { if (!is_aot) {
deps += [ ":copy_jit_assets" ] deps += [ ":copy_jit_assets" ]
} }
if (is_android) {
deps += [ "android" ]
}
if (is_ios) { if (is_ios) {
deps += [ "ios" ] deps += [ "ios" ]
} }

View File

@ -0,0 +1,28 @@
# Scenario App
[![GitHub Issues or Pull Requests by label](https://img.shields.io/github/issues/flutter/flutter/e%3A%20scenario-app)](https://github.com/flutter/flutter/issues?q=is%3Aopen+is%3Aissue+label%3A%22e%3A+scenario-app%22)
This package simulates a Flutter app that uses the engine (`dart:ui`) only,
in conjunction with iOS-specific embedding code that simulates the use of the
engine in a real app (such as plugins and platform views).
[`run_ios_tests.sh`](run_ios_tests.sh) is used to run the tests on a simulator.
See also:
- [File an issue][file_issue] with the `e: scenario-app` label.
- [`lib/`](lib/), the Dart code and instrumentation for the scenario app.
- [`ios/`](ios/), the iOS-side native code and tests.
[file_issue]: https://github.com/flutter/flutter/issues/new?labels=e:%20scenario-app,engine,team-ios
## Adding a New Scenario
Create a new subclass of [Scenario](lib/src/scenario.dart) and add it to the map
in [scenarios.dart](lib/src/scenarios.dart). For an example, see
[animated_color_square.dart](lib/src/animated_color_square.dart), which draws a
continuously animating colored square that bounces off the sides of the
viewport.
Then set the scenario from the iOS app by calling `set_scenario` on platform
channel `driver`.

View File

@ -265,7 +265,7 @@ void _createDevice({
required String iosEngineVariant, required String iosEngineVariant,
}) { }) {
final scenarioPath = path.normalize( final scenarioPath = path.normalize(
path.join(engine.outDir.path, iosEngineVariant, 'scenario_app', 'Scenarios'), path.join(engine.outDir.path, iosEngineVariant, 'ios_scenario_app', 'Scenarios'),
); );
// Create a temporary directory to store the test results. // Create a temporary directory to store the test results.

View File

@ -7,7 +7,7 @@ import("//flutter/testing/rules/runtime_mode.gni")
import("$dart_src/build/dart/copy_tree.gni") import("$dart_src/build/dart/copy_tree.gni")
_app_framework_dir = "$root_out_dir/scenario_app/Scenarios/App.framework" _app_framework_dir = "$root_out_dir/ios_scenario_app/Scenarios/App.framework"
shared_library("app_framework_dylib") { shared_library("app_framework_dylib") {
visibility = [ ":*" ] visibility = [ ":*" ]
@ -22,7 +22,7 @@ shared_library("app_framework_dylib") {
ldflags = [ "-Wl,-install_name,@rpath/App.framework/App" ] ldflags = [ "-Wl,-install_name,@rpath/App.framework/App" ]
deps = [ "//flutter/testing/scenario_app:scenario_app_snapshot" ] deps = [ "//flutter/testing/ios_scenario_app:ios_scenario_app_snapshot" ]
} }
copy("copy_dylib") { copy("copy_dylib") {
@ -45,7 +45,7 @@ copy_trees("scenario_ios") {
target = "copy_ios_xcodeproj" target = "copy_ios_xcodeproj"
visibility = [ ":*" ] visibility = [ ":*" ]
source = "." source = "."
dest = "$root_out_dir/scenario_app" dest = "$root_out_dir/ios_scenario_app"
# Ignore any stale App.framework or Flutter.xcframework files from # Ignore any stale App.framework or Flutter.xcframework files from
# historical builds. # historical builds.

View File

@ -0,0 +1,14 @@
// Copyright 2013 The Flutter Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#ifndef FLUTTER_TESTING_IOS_SCENARIO_APP_IOS_FLUTTERAPPEXTENSIONTESTHOST_FLUTTERAPPEXTENSIONTESTHOST_APPDELEGATE_H_
#define FLUTTER_TESTING_IOS_SCENARIO_APP_IOS_FLUTTERAPPEXTENSIONTESTHOST_FLUTTERAPPEXTENSIONTESTHOST_APPDELEGATE_H_
#import <UIKit/UIKit.h>
@interface AppDelegate : UIResponder <UIApplicationDelegate>
@end
#endif // FLUTTER_TESTING_IOS_SCENARIO_APP_IOS_FLUTTERAPPEXTENSIONTESTHOST_FLUTTERAPPEXTENSIONTESTHOST_APPDELEGATE_H_

View File

@ -0,0 +1,16 @@
// Copyright 2013 The Flutter Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#ifndef FLUTTER_TESTING_IOS_SCENARIO_APP_IOS_FLUTTERAPPEXTENSIONTESTHOST_FLUTTERAPPEXTENSIONTESTHOST_SCENEDELEGATE_H_
#define FLUTTER_TESTING_IOS_SCENARIO_APP_IOS_FLUTTERAPPEXTENSIONTESTHOST_FLUTTERAPPEXTENSIONTESTHOST_SCENEDELEGATE_H_
#import <UIKit/UIKit.h>
@interface SceneDelegate : UIResponder <UIWindowSceneDelegate>
@property(strong, nonatomic) UIWindow* window;
@end
#endif // FLUTTER_TESTING_IOS_SCENARIO_APP_IOS_FLUTTERAPPEXTENSIONTESTHOST_FLUTTERAPPEXTENSIONTESTHOST_SCENEDELEGATE_H_

View File

@ -0,0 +1,14 @@
// Copyright 2013 The Flutter Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#ifndef FLUTTER_TESTING_IOS_SCENARIO_APP_IOS_FLUTTERAPPEXTENSIONTESTHOST_FLUTTERAPPEXTENSIONTESTHOST_VIEWCONTROLLER_H_
#define FLUTTER_TESTING_IOS_SCENARIO_APP_IOS_FLUTTERAPPEXTENSIONTESTHOST_FLUTTERAPPEXTENSIONTESTHOST_VIEWCONTROLLER_H_
#import <UIKit/UIKit.h>
@interface ViewController : UIViewController
@end
#endif // FLUTTER_TESTING_IOS_SCENARIO_APP_IOS_FLUTTERAPPEXTENSIONTESTHOST_FLUTTERAPPEXTENSIONTESTHOST_VIEWCONTROLLER_H_

View File

@ -9,18 +9,18 @@ run:
```sh ```sh
# From the root of the engine repository # From the root of the engine repository
$ ./testing/scenario_app/run_ios_tests.sh ios_debug_sim_unopt $ ./testing/ios_scenario_app/run_ios_tests.sh ios_debug_sim_unopt
``` ```
or: or:
```sh ```sh
# From the root of the engine repository # From the root of the engine repository
$ ./testing/scenario_app/run_ios_tests.sh ios_debug_sim_unopt_arm64 $ ./testing/ios_scenario_app/run_ios_tests.sh ios_debug_sim_unopt_arm64
``` ```
To run or debug in Xcode, open the xcodeproj file located in To run or debug in Xcode, open the xcodeproj file located in
`<engine_out_dir>/ios_debug_sim_unopt/scenario_app/Scenarios/Scenarios.xcodeproj`. `<engine_out_dir>/ios_debug_sim_unopt/ios_scenario_app/Scenarios/Scenarios.xcodeproj`.
## CI Configuration ## CI Configuration

View File

@ -2,8 +2,8 @@
// Use of this source code is governed by a BSD-style license that can be // Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file. // found in the LICENSE file.
#ifndef FLUTTER_TESTING_SCENARIO_APP_IOS_SCENARIOS_SCENARIOS_APPDELEGATE_H_ #ifndef FLUTTER_TESTING_IOS_SCENARIO_APP_IOS_SCENARIOS_SCENARIOS_APPDELEGATE_H_
#define FLUTTER_TESTING_SCENARIO_APP_IOS_SCENARIOS_SCENARIOS_APPDELEGATE_H_ #define FLUTTER_TESTING_IOS_SCENARIO_APP_IOS_SCENARIOS_SCENARIOS_APPDELEGATE_H_
#import <Flutter/Flutter.h> #import <Flutter/Flutter.h>
#import <UIKit/UIKit.h> #import <UIKit/UIKit.h>
@ -12,4 +12,4 @@
@end @end
#endif // FLUTTER_TESTING_SCENARIO_APP_IOS_SCENARIOS_SCENARIOS_APPDELEGATE_H_ #endif // FLUTTER_TESTING_IOS_SCENARIO_APP_IOS_SCENARIOS_SCENARIOS_APPDELEGATE_H_

View File

@ -2,8 +2,8 @@
// Use of this source code is governed by a BSD-style license that can be // Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file. // found in the LICENSE file.
#ifndef FLUTTER_TESTING_SCENARIO_APP_IOS_SCENARIOS_SCENARIOS_CONTINUOUSTEXTURE_H_ #ifndef FLUTTER_TESTING_IOS_SCENARIO_APP_IOS_SCENARIOS_SCENARIOS_CONTINUOUSTEXTURE_H_
#define FLUTTER_TESTING_SCENARIO_APP_IOS_SCENARIOS_SCENARIOS_CONTINUOUSTEXTURE_H_ #define FLUTTER_TESTING_IOS_SCENARIO_APP_IOS_SCENARIOS_SCENARIOS_CONTINUOUSTEXTURE_H_
#import <Flutter/Flutter.h> #import <Flutter/Flutter.h>
#import <Foundation/Foundation.h> #import <Foundation/Foundation.h>
@ -22,4 +22,4 @@ NS_ASSUME_NONNULL_BEGIN
NS_ASSUME_NONNULL_END NS_ASSUME_NONNULL_END
#endif // FLUTTER_TESTING_SCENARIO_APP_IOS_SCENARIOS_SCENARIOS_CONTINUOUSTEXTURE_H_ #endif // FLUTTER_TESTING_IOS_SCENARIO_APP_IOS_SCENARIOS_SCENARIOS_CONTINUOUSTEXTURE_H_

View File

@ -2,8 +2,8 @@
// Use of this source code is governed by a BSD-style license that can be // Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file. // found in the LICENSE file.
#ifndef FLUTTER_TESTING_SCENARIO_APP_IOS_SCENARIOS_SCENARIOS_FLUTTERENGINE_SCENARIOSTEST_H_ #ifndef FLUTTER_TESTING_IOS_SCENARIO_APP_IOS_SCENARIOS_SCENARIOS_FLUTTERENGINE_SCENARIOSTEST_H_
#define FLUTTER_TESTING_SCENARIO_APP_IOS_SCENARIOS_SCENARIOS_FLUTTERENGINE_SCENARIOSTEST_H_ #define FLUTTER_TESTING_IOS_SCENARIO_APP_IOS_SCENARIOS_SCENARIOS_FLUTTERENGINE_SCENARIOSTEST_H_
#import <Flutter/Flutter.h> #import <Flutter/Flutter.h>
@ -18,4 +18,4 @@ NS_ASSUME_NONNULL_BEGIN
@end @end
NS_ASSUME_NONNULL_END NS_ASSUME_NONNULL_END
#endif // FLUTTER_TESTING_SCENARIO_APP_IOS_SCENARIOS_SCENARIOS_FLUTTERENGINE_SCENARIOSTEST_H_ #endif // FLUTTER_TESTING_IOS_SCENARIO_APP_IOS_SCENARIOS_SCENARIOS_FLUTTERENGINE_SCENARIOSTEST_H_

View File

@ -2,8 +2,8 @@
// Use of this source code is governed by a BSD-style license that can be // Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file. // found in the LICENSE file.
#ifndef FLUTTER_TESTING_SCENARIO_APP_IOS_SCENARIOS_SCENARIOS_SCREENBEFOREFLUTTER_H_ #ifndef FLUTTER_TESTING_IOS_SCENARIO_APP_IOS_SCENARIOS_SCENARIOS_SCREENBEFOREFLUTTER_H_
#define FLUTTER_TESTING_SCENARIO_APP_IOS_SCENARIOS_SCENARIOS_SCREENBEFOREFLUTTER_H_ #define FLUTTER_TESTING_IOS_SCENARIO_APP_IOS_SCENARIOS_SCENARIOS_SCREENBEFOREFLUTTER_H_
#import <Flutter/Flutter.h> #import <Flutter/Flutter.h>
@ -16,4 +16,4 @@
@end @end
#endif // FLUTTER_TESTING_SCENARIO_APP_IOS_SCENARIOS_SCENARIOS_SCREENBEFOREFLUTTER_H_ #endif // FLUTTER_TESTING_IOS_SCENARIO_APP_IOS_SCENARIOS_SCENARIOS_SCREENBEFOREFLUTTER_H_

View File

@ -2,8 +2,8 @@
// Use of this source code is governed by a BSD-style license that can be // Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file. // found in the LICENSE file.
#ifndef FLUTTER_TESTING_SCENARIO_APP_IOS_SCENARIOS_SCENARIOS_TEXTPLATFORMVIEW_H_ #ifndef FLUTTER_TESTING_IOS_SCENARIO_APP_IOS_SCENARIOS_SCENARIOS_TEXTPLATFORMVIEW_H_
#define FLUTTER_TESTING_SCENARIO_APP_IOS_SCENARIOS_SCENARIOS_TEXTPLATFORMVIEW_H_ #define FLUTTER_TESTING_IOS_SCENARIO_APP_IOS_SCENARIOS_SCENARIOS_TEXTPLATFORMVIEW_H_
#import <Flutter/Flutter.h> #import <Flutter/Flutter.h>
@ -25,4 +25,4 @@ NS_ASSUME_NONNULL_BEGIN
NS_ASSUME_NONNULL_END NS_ASSUME_NONNULL_END
#endif // FLUTTER_TESTING_SCENARIO_APP_IOS_SCENARIOS_SCENARIOS_TEXTPLATFORMVIEW_H_ #endif // FLUTTER_TESTING_IOS_SCENARIO_APP_IOS_SCENARIOS_SCENARIOS_TEXTPLATFORMVIEW_H_

View File

@ -0,0 +1,15 @@
// Copyright 2013 The Flutter Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#ifndef FLUTTER_TESTING_IOS_SCENARIO_APP_IOS_SCENARIOS_SCENARIOSSHARE_SHAREVIEWCONTROLLER_H_
#define FLUTTER_TESTING_IOS_SCENARIO_APP_IOS_SCENARIOS_SCENARIOSSHARE_SHAREVIEWCONTROLLER_H_
#import <Flutter/Flutter.h>
#import <UIKit/UIKit.h>
@interface ShareViewController : FlutterViewController
@end
#endif // FLUTTER_TESTING_IOS_SCENARIO_APP_IOS_SCENARIOS_SCENARIOSSHARE_SHAREVIEWCONTROLLER_H_

View File

@ -2,8 +2,8 @@
// Use of this source code is governed by a BSD-style license that can be // Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file. // found in the LICENSE file.
#ifndef FLUTTER_TESTING_SCENARIO_APP_IOS_SCENARIOS_SCENARIOSUITESTS_GOLDENIMAGE_H_ #ifndef FLUTTER_TESTING_IOS_SCENARIO_APP_IOS_SCENARIOS_SCENARIOSUITESTS_GOLDENIMAGE_H_
#define FLUTTER_TESTING_SCENARIO_APP_IOS_SCENARIOS_SCENARIOSUITESTS_GOLDENIMAGE_H_ #define FLUTTER_TESTING_IOS_SCENARIO_APP_IOS_SCENARIOS_SCENARIOSUITESTS_GOLDENIMAGE_H_
#import <UIKit/UIKit.h> #import <UIKit/UIKit.h>
@ -28,4 +28,4 @@ NS_ASSUME_NONNULL_BEGIN
NS_ASSUME_NONNULL_END NS_ASSUME_NONNULL_END
#endif // FLUTTER_TESTING_SCENARIO_APP_IOS_SCENARIOS_SCENARIOSUITESTS_GOLDENIMAGE_H_ #endif // FLUTTER_TESTING_IOS_SCENARIO_APP_IOS_SCENARIOS_SCENARIOSUITESTS_GOLDENIMAGE_H_

View File

@ -2,8 +2,8 @@
// Use of this source code is governed by a BSD-style license that can be // Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file. // found in the LICENSE file.
#ifndef FLUTTER_TESTING_SCENARIO_APP_IOS_SCENARIOS_SCENARIOSUITESTS_GOLDENPLATFORMVIEWTESTS_H_ #ifndef FLUTTER_TESTING_IOS_SCENARIO_APP_IOS_SCENARIOS_SCENARIOSUITESTS_GOLDENPLATFORMVIEWTESTS_H_
#define FLUTTER_TESTING_SCENARIO_APP_IOS_SCENARIOS_SCENARIOSUITESTS_GOLDENPLATFORMVIEWTESTS_H_ #define FLUTTER_TESTING_IOS_SCENARIO_APP_IOS_SCENARIOS_SCENARIOSUITESTS_GOLDENPLATFORMVIEWTESTS_H_
#import <XCTest/XCTest.h> #import <XCTest/XCTest.h>
#import "GoldenTestManager.h" #import "GoldenTestManager.h"
@ -34,4 +34,4 @@ NS_ASSUME_NONNULL_BEGIN
NS_ASSUME_NONNULL_END NS_ASSUME_NONNULL_END
#endif // FLUTTER_TESTING_SCENARIO_APP_IOS_SCENARIOS_SCENARIOSUITESTS_GOLDENPLATFORMVIEWTESTS_H_ #endif // FLUTTER_TESTING_IOS_SCENARIO_APP_IOS_SCENARIOS_SCENARIOSUITESTS_GOLDENPLATFORMVIEWTESTS_H_

View File

@ -2,8 +2,8 @@
// Use of this source code is governed by a BSD-style license that can be // Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file. // found in the LICENSE file.
#ifndef FLUTTER_TESTING_SCENARIO_APP_IOS_SCENARIOS_SCENARIOSUITESTS_GOLDENTESTMANAGER_H_ #ifndef FLUTTER_TESTING_IOS_SCENARIO_APP_IOS_SCENARIOS_SCENARIOSUITESTS_GOLDENTESTMANAGER_H_
#define FLUTTER_TESTING_SCENARIO_APP_IOS_SCENARIOS_SCENARIOSUITESTS_GOLDENTESTMANAGER_H_ #define FLUTTER_TESTING_IOS_SCENARIO_APP_IOS_SCENARIOS_SCENARIOSUITESTS_GOLDENTESTMANAGER_H_
#import <Foundation/Foundation.h> #import <Foundation/Foundation.h>
#import <XCTest/XCTest.h> #import <XCTest/XCTest.h>
@ -37,4 +37,4 @@ const extern double kDefaultRmseThreshold;
NS_ASSUME_NONNULL_END NS_ASSUME_NONNULL_END
#endif // FLUTTER_TESTING_SCENARIO_APP_IOS_SCENARIOS_SCENARIOSUITESTS_GOLDENTESTMANAGER_H_ #endif // FLUTTER_TESTING_IOS_SCENARIO_APP_IOS_SCENARIOS_SCENARIOSUITESTS_GOLDENTESTMANAGER_H_

View File

@ -2,8 +2,8 @@
// Use of this source code is governed by a BSD-style license that can be // Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file. // found in the LICENSE file.
#ifndef FLUTTER_TESTING_SCENARIO_APP_IOS_SCENARIOS_SCENARIOSUITESTS_STATUSBARTEST_H_ #ifndef FLUTTER_TESTING_IOS_SCENARIO_APP_IOS_SCENARIOS_SCENARIOSUITESTS_STATUSBARTEST_H_
#define FLUTTER_TESTING_SCENARIO_APP_IOS_SCENARIOS_SCENARIOSUITESTS_STATUSBARTEST_H_ #define FLUTTER_TESTING_IOS_SCENARIO_APP_IOS_SCENARIOS_SCENARIOSUITESTS_STATUSBARTEST_H_
#import <XCTest/XCTest.h> #import <XCTest/XCTest.h>
@ -15,4 +15,4 @@ NS_ASSUME_NONNULL_BEGIN
NS_ASSUME_NONNULL_END NS_ASSUME_NONNULL_END
#endif // FLUTTER_TESTING_SCENARIO_APP_IOS_SCENARIOS_SCENARIOSUITESTS_STATUSBARTEST_H_ #endif // FLUTTER_TESTING_IOS_SCENARIO_APP_IOS_SCENARIOS_SCENARIOSUITESTS_STATUSBARTEST_H_

Some files were not shown because too many files have changed in this diff Show More