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`.
@ -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/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/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.
|
||||
|
||||
### 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
|
||||
|
||||
* Templates in [the framework](https://github.com/flutter/flutter): Change `targetSdkVersion` in various `build.gradle.tmpl` files to use the new API version
|
||||
|
@ -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.
|
||||
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
|
||||
enabled_branches:
|
||||
- master
|
||||
|
@ -159,8 +159,8 @@ group("flutter") {
|
||||
}
|
||||
|
||||
if ((flutter_runtime_mode == "debug" || flutter_runtime_mode == "profile") &&
|
||||
(is_ios || is_android)) {
|
||||
public_deps += [ "//flutter/testing/scenario_app" ]
|
||||
is_ios) {
|
||||
public_deps += [ "//flutter/testing/ios_scenario_app" ]
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -263,13 +263,13 @@ $ ./run_tests.py --variant=host_debug_unopt_arm64 --type=engine
|
||||
| impeller_dart_unittests | engine | |
|
||||
| impeller_golden_tests | engine(mac) | Generates golden images for impeller (vulkan, metal, opengles). |
|
||||
| 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 |
|
||||
| jni_unittests | engine(not windows) | |
|
||||
| no_dart_plugin_registrant_unittests | engine | |
|
||||
| platform_view_android_delegate_unittests | engine(not windows) | |
|
||||
| runtime_unittests | engine | |
|
||||
| shell_unittests | engine(not windows) | |
|
||||
| scenario_app | android | Integration and golden tests for Android, iOS |
|
||||
| tonic_unittests | engine | Unit tests for //third_party/tonic |
|
||||
| txt_unittests | engine(linux) | |
|
||||
| ui_unittests | engine | |
|
||||
|
@ -196,27 +196,10 @@
|
||||
"targets": [
|
||||
"clang_x64/gen_snapshot",
|
||||
"default",
|
||||
"flutter/testing/scenario_app/android",
|
||||
"flutter/shell/platform/android:abi_jars",
|
||||
"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": [
|
||||
|
@ -26,13 +26,12 @@
|
||||
}
|
||||
],
|
||||
"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": {
|
||||
"config": "ci/android_emulator_debug_x64",
|
||||
"targets": [
|
||||
"flutter/impeller/toolkit/android:unittests",
|
||||
"flutter/shell/platform/android:flutter_shell_native_unittests",
|
||||
"flutter/testing/scenario_app"
|
||||
"flutter/shell/platform/android:flutter_shell_native_unittests"
|
||||
]
|
||||
},
|
||||
"tests": [
|
||||
@ -65,31 +64,6 @@
|
||||
"name": "skia_gold_client/e2e_test",
|
||||
"script": "flutter/testing/skia_gold_client/tool/e2e_test.dart",
|
||||
"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",
|
||||
"targets": [
|
||||
"flutter/impeller/toolkit/android:unittests",
|
||||
"flutter/shell/platform/android:flutter_shell_native_unittests",
|
||||
"flutter/testing/scenario_app"
|
||||
"flutter/shell/platform/android:flutter_shell_native_unittests"
|
||||
]
|
||||
},
|
||||
"tests": [
|
||||
|
@ -26,13 +26,12 @@
|
||||
}
|
||||
],
|
||||
"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": {
|
||||
"config": "ci/android_emulator_debug_x64",
|
||||
"targets": [
|
||||
"flutter/impeller/toolkit/android:unittests",
|
||||
"flutter/shell/platform/android:flutter_shell_native_unittests",
|
||||
"flutter/testing/scenario_app"
|
||||
"flutter/shell/platform/android:flutter_shell_native_unittests"
|
||||
]
|
||||
},
|
||||
"tests": [
|
||||
@ -65,31 +64,6 @@
|
||||
"name": "skia_gold_client/e2e_test",
|
||||
"script": "flutter/testing/skia_gold_client/tool/e2e_test.dart",
|
||||
"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",
|
||||
"targets": [
|
||||
"flutter/impeller/toolkit/android:unittests",
|
||||
"flutter/shell/platform/android:flutter_shell_native_unittests",
|
||||
"flutter/testing/scenario_app"
|
||||
"flutter/shell/platform/android:flutter_shell_native_unittests"
|
||||
]
|
||||
},
|
||||
"tests": [
|
||||
|
@ -26,13 +26,12 @@
|
||||
}
|
||||
],
|
||||
"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": {
|
||||
"config": "ci/android_emulator_debug_x64",
|
||||
"targets": [
|
||||
"flutter/impeller/toolkit/android:unittests",
|
||||
"flutter/shell/platform/android:flutter_shell_native_unittests",
|
||||
"flutter/testing/scenario_app"
|
||||
"flutter/shell/platform/android:flutter_shell_native_unittests"
|
||||
]
|
||||
},
|
||||
"tests": [
|
||||
@ -65,31 +64,6 @@
|
||||
"name": "skia_gold_client/e2e_test",
|
||||
"script": "flutter/testing/skia_gold_client/tool/e2e_test.dart",
|
||||
"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"
|
||||
]
|
||||
}
|
||||
]
|
||||
}
|
||||
|
@ -249,7 +249,7 @@
|
||||
"ninja": {
|
||||
"config": "ci/ios_debug_unopt_sim",
|
||||
"targets": [
|
||||
"flutter/testing/scenario_app",
|
||||
"flutter/testing/ios_scenario_app",
|
||||
"flutter/shell/platform/darwin/ios:ios_test_flutter"
|
||||
]
|
||||
},
|
||||
@ -273,7 +273,7 @@
|
||||
"parameters": [
|
||||
"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": {
|
||||
"config": "ci/ios_debug_unopt_sim_arm64",
|
||||
"targets": [
|
||||
"flutter/testing/scenario_app",
|
||||
"flutter/testing/ios_scenario_app",
|
||||
"flutter/shell/platform/darwin/ios:ios_test_flutter"
|
||||
]
|
||||
},
|
||||
@ -401,7 +401,7 @@
|
||||
"parameters": [
|
||||
"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": {
|
||||
"config": "ci/ios_debug_unopt_sim_arm64_extension_safe",
|
||||
"targets": [
|
||||
"flutter/testing/scenario_app",
|
||||
"flutter/testing/ios_scenario_app",
|
||||
"flutter/shell/platform/darwin/ios:ios_test_flutter"
|
||||
]
|
||||
},
|
||||
@ -470,7 +470,7 @@
|
||||
"parameters": [
|
||||
"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"
|
||||
}
|
||||
]
|
||||
},
|
||||
|
@ -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"
|
||||
]
|
||||
}
|
||||
]
|
||||
}
|
@ -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"
|
||||
]
|
||||
}
|
||||
]
|
||||
}
|
@ -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())
|
@ -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
|
@ -153,39 +153,9 @@ submitting PRs to the `flutter/engine` repository.
|
||||
|
||||
### End-to-end tests
|
||||
|
||||
End-to-end tests exercise the entire Android embedding with the C++ engine on
|
||||
a real Android runtime in an emulator. It's an integration test ensuring that
|
||||
the engine as a whole on Android is functioning correctly.
|
||||
|
||||
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.
|
||||
End-to-end tests for the Android embedder exist as part of the test suites
|
||||
in the root of the monorepo. See
|
||||
[`dev/integration_tests`](../../../../../dev/integration_tests/).
|
||||
|
||||
## 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 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
|
||||
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.
|
||||
|
||||
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
|
||||
than using the real Flutter framework at `flutter/flutter`.
|
||||
|
||||
The end-to-end test can be executed by running:
|
||||
|
||||
```
|
||||
testing/scenario_app/run_ios_tests.sh
|
||||
```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
|
||||
Android app under-test in https://github.com/flutter/engine/tree/main/testing/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.
|
||||
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/ios_scenario_app/lib.
|
||||
|
||||
As best practice, favor adding unit tests if possible since end-to-end tests
|
||||
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
|
||||
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.
|
||||
|
||||
Dart unit tests are executed during pre-submit on our CI system when submitting
|
||||
|
@ -86,7 +86,7 @@ workspace:
|
||||
- shell/vmservice
|
||||
- testing/benchmark
|
||||
- testing/dart
|
||||
- testing/scenario_app
|
||||
- testing/ios_scenario_app
|
||||
- testing/skia_gold_client
|
||||
- testing/smoke_test_failure
|
||||
- testing/symbols
|
||||
|
@ -5,16 +5,14 @@
|
||||
import("//flutter/build/dart/rules.gni")
|
||||
import("//flutter/testing/rules/runtime_mode.gni")
|
||||
|
||||
flutter_snapshot("scenario_app_snapshot") {
|
||||
flutter_snapshot("ios_scenario_app_snapshot") {
|
||||
main_dart = "lib/main.dart"
|
||||
}
|
||||
|
||||
if (!is_aot) {
|
||||
if (is_android) {
|
||||
_flutter_assets_dir = "$root_out_dir/scenario_app/app/assets/flutter_assets"
|
||||
} else if (is_ios) {
|
||||
if (is_ios) {
|
||||
_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 {
|
||||
assert(false)
|
||||
}
|
||||
@ -27,21 +25,17 @@ if (!is_aot) {
|
||||
"$target_gen_dir/kernel_blob.bin",
|
||||
]
|
||||
outputs = [ "$_flutter_assets_dir/{{source_file_part}}" ]
|
||||
deps = [ ":scenario_app_snapshot" ]
|
||||
deps = [ ":ios_scenario_app_snapshot" ]
|
||||
}
|
||||
}
|
||||
|
||||
group("scenario_app") {
|
||||
deps = [ ":scenario_app_snapshot" ]
|
||||
group("ios_scenario_app") {
|
||||
deps = [ ":ios_scenario_app_snapshot" ]
|
||||
|
||||
if (!is_aot) {
|
||||
deps += [ ":copy_jit_assets" ]
|
||||
}
|
||||
|
||||
if (is_android) {
|
||||
deps += [ "android" ]
|
||||
}
|
||||
|
||||
if (is_ios) {
|
||||
deps += [ "ios" ]
|
||||
}
|
28
engine/src/flutter/testing/ios_scenario_app/README.md
Normal file
@ -0,0 +1,28 @@
|
||||
# Scenario 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`.
|
@ -265,7 +265,7 @@ void _createDevice({
|
||||
required String iosEngineVariant,
|
||||
}) {
|
||||
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.
|
@ -7,7 +7,7 @@ import("//flutter/testing/rules/runtime_mode.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") {
|
||||
visibility = [ ":*" ]
|
||||
@ -22,7 +22,7 @@ shared_library("app_framework_dylib") {
|
||||
|
||||
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") {
|
||||
@ -45,7 +45,7 @@ copy_trees("scenario_ios") {
|
||||
target = "copy_ios_xcodeproj"
|
||||
visibility = [ ":*" ]
|
||||
source = "."
|
||||
dest = "$root_out_dir/scenario_app"
|
||||
dest = "$root_out_dir/ios_scenario_app"
|
||||
|
||||
# Ignore any stale App.framework or Flutter.xcframework files from
|
||||
# historical builds.
|
@ -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_
|
@ -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_
|
@ -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_
|
@ -9,18 +9,18 @@ run:
|
||||
|
||||
```sh
|
||||
# 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:
|
||||
|
||||
```sh
|
||||
# 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
|
||||
`<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
|
||||
|
@ -2,8 +2,8 @@
|
||||
// Use of this source code is governed by a BSD-style license that can be
|
||||
// found in the LICENSE file.
|
||||
|
||||
#ifndef FLUTTER_TESTING_SCENARIO_APP_IOS_SCENARIOS_SCENARIOS_APPDELEGATE_H_
|
||||
#define FLUTTER_TESTING_SCENARIO_APP_IOS_SCENARIOS_SCENARIOS_APPDELEGATE_H_
|
||||
#ifndef FLUTTER_TESTING_IOS_SCENARIO_APP_IOS_SCENARIOS_SCENARIOS_APPDELEGATE_H_
|
||||
#define FLUTTER_TESTING_IOS_SCENARIO_APP_IOS_SCENARIOS_SCENARIOS_APPDELEGATE_H_
|
||||
|
||||
#import <Flutter/Flutter.h>
|
||||
#import <UIKit/UIKit.h>
|
||||
@ -12,4 +12,4 @@
|
||||
|
||||
@end
|
||||
|
||||
#endif // FLUTTER_TESTING_SCENARIO_APP_IOS_SCENARIOS_SCENARIOS_APPDELEGATE_H_
|
||||
#endif // FLUTTER_TESTING_IOS_SCENARIO_APP_IOS_SCENARIOS_SCENARIOS_APPDELEGATE_H_
|
@ -2,8 +2,8 @@
|
||||
// Use of this source code is governed by a BSD-style license that can be
|
||||
// found in the LICENSE file.
|
||||
|
||||
#ifndef FLUTTER_TESTING_SCENARIO_APP_IOS_SCENARIOS_SCENARIOS_CONTINUOUSTEXTURE_H_
|
||||
#define FLUTTER_TESTING_SCENARIO_APP_IOS_SCENARIOS_SCENARIOS_CONTINUOUSTEXTURE_H_
|
||||
#ifndef FLUTTER_TESTING_IOS_SCENARIO_APP_IOS_SCENARIOS_SCENARIOS_CONTINUOUSTEXTURE_H_
|
||||
#define FLUTTER_TESTING_IOS_SCENARIO_APP_IOS_SCENARIOS_SCENARIOS_CONTINUOUSTEXTURE_H_
|
||||
|
||||
#import <Flutter/Flutter.h>
|
||||
#import <Foundation/Foundation.h>
|
||||
@ -22,4 +22,4 @@ NS_ASSUME_NONNULL_BEGIN
|
||||
|
||||
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_
|
@ -2,8 +2,8 @@
|
||||
// Use of this source code is governed by a BSD-style license that can be
|
||||
// found in the LICENSE file.
|
||||
|
||||
#ifndef FLUTTER_TESTING_SCENARIO_APP_IOS_SCENARIOS_SCENARIOS_FLUTTERENGINE_SCENARIOSTEST_H_
|
||||
#define 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_IOS_SCENARIO_APP_IOS_SCENARIOS_SCENARIOS_FLUTTERENGINE_SCENARIOSTEST_H_
|
||||
|
||||
#import <Flutter/Flutter.h>
|
||||
|
||||
@ -18,4 +18,4 @@ NS_ASSUME_NONNULL_BEGIN
|
||||
@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_
|
@ -2,8 +2,8 @@
|
||||
// Use of this source code is governed by a BSD-style license that can be
|
||||
// found in the LICENSE file.
|
||||
|
||||
#ifndef FLUTTER_TESTING_SCENARIO_APP_IOS_SCENARIOS_SCENARIOS_SCREENBEFOREFLUTTER_H_
|
||||
#define FLUTTER_TESTING_SCENARIO_APP_IOS_SCENARIOS_SCENARIOS_SCREENBEFOREFLUTTER_H_
|
||||
#ifndef FLUTTER_TESTING_IOS_SCENARIO_APP_IOS_SCENARIOS_SCENARIOS_SCREENBEFOREFLUTTER_H_
|
||||
#define FLUTTER_TESTING_IOS_SCENARIO_APP_IOS_SCENARIOS_SCENARIOS_SCREENBEFOREFLUTTER_H_
|
||||
|
||||
#import <Flutter/Flutter.h>
|
||||
|
||||
@ -16,4 +16,4 @@
|
||||
|
||||
@end
|
||||
|
||||
#endif // FLUTTER_TESTING_SCENARIO_APP_IOS_SCENARIOS_SCENARIOS_SCREENBEFOREFLUTTER_H_
|
||||
#endif // FLUTTER_TESTING_IOS_SCENARIO_APP_IOS_SCENARIOS_SCENARIOS_SCREENBEFOREFLUTTER_H_
|
@ -2,8 +2,8 @@
|
||||
// Use of this source code is governed by a BSD-style license that can be
|
||||
// found in the LICENSE file.
|
||||
|
||||
#ifndef FLUTTER_TESTING_SCENARIO_APP_IOS_SCENARIOS_SCENARIOS_TEXTPLATFORMVIEW_H_
|
||||
#define FLUTTER_TESTING_SCENARIO_APP_IOS_SCENARIOS_SCENARIOS_TEXTPLATFORMVIEW_H_
|
||||
#ifndef FLUTTER_TESTING_IOS_SCENARIO_APP_IOS_SCENARIOS_SCENARIOS_TEXTPLATFORMVIEW_H_
|
||||
#define FLUTTER_TESTING_IOS_SCENARIO_APP_IOS_SCENARIOS_SCENARIOS_TEXTPLATFORMVIEW_H_
|
||||
|
||||
#import <Flutter/Flutter.h>
|
||||
|
||||
@ -25,4 +25,4 @@ NS_ASSUME_NONNULL_BEGIN
|
||||
|
||||
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_
|
@ -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_
|
@ -2,8 +2,8 @@
|
||||
// Use of this source code is governed by a BSD-style license that can be
|
||||
// found in the LICENSE file.
|
||||
|
||||
#ifndef FLUTTER_TESTING_SCENARIO_APP_IOS_SCENARIOS_SCENARIOSUITESTS_GOLDENIMAGE_H_
|
||||
#define FLUTTER_TESTING_SCENARIO_APP_IOS_SCENARIOS_SCENARIOSUITESTS_GOLDENIMAGE_H_
|
||||
#ifndef FLUTTER_TESTING_IOS_SCENARIO_APP_IOS_SCENARIOS_SCENARIOSUITESTS_GOLDENIMAGE_H_
|
||||
#define FLUTTER_TESTING_IOS_SCENARIO_APP_IOS_SCENARIOS_SCENARIOSUITESTS_GOLDENIMAGE_H_
|
||||
|
||||
#import <UIKit/UIKit.h>
|
||||
|
||||
@ -28,4 +28,4 @@ NS_ASSUME_NONNULL_BEGIN
|
||||
|
||||
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_
|
@ -2,8 +2,8 @@
|
||||
// Use of this source code is governed by a BSD-style license that can be
|
||||
// found in the LICENSE file.
|
||||
|
||||
#ifndef FLUTTER_TESTING_SCENARIO_APP_IOS_SCENARIOS_SCENARIOSUITESTS_GOLDENPLATFORMVIEWTESTS_H_
|
||||
#define FLUTTER_TESTING_SCENARIO_APP_IOS_SCENARIOS_SCENARIOSUITESTS_GOLDENPLATFORMVIEWTESTS_H_
|
||||
#ifndef FLUTTER_TESTING_IOS_SCENARIO_APP_IOS_SCENARIOS_SCENARIOSUITESTS_GOLDENPLATFORMVIEWTESTS_H_
|
||||
#define FLUTTER_TESTING_IOS_SCENARIO_APP_IOS_SCENARIOS_SCENARIOSUITESTS_GOLDENPLATFORMVIEWTESTS_H_
|
||||
|
||||
#import <XCTest/XCTest.h>
|
||||
#import "GoldenTestManager.h"
|
||||
@ -34,4 +34,4 @@ NS_ASSUME_NONNULL_BEGIN
|
||||
|
||||
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_
|
@ -2,8 +2,8 @@
|
||||
// Use of this source code is governed by a BSD-style license that can be
|
||||
// found in the LICENSE file.
|
||||
|
||||
#ifndef FLUTTER_TESTING_SCENARIO_APP_IOS_SCENARIOS_SCENARIOSUITESTS_GOLDENTESTMANAGER_H_
|
||||
#define FLUTTER_TESTING_SCENARIO_APP_IOS_SCENARIOS_SCENARIOSUITESTS_GOLDENTESTMANAGER_H_
|
||||
#ifndef FLUTTER_TESTING_IOS_SCENARIO_APP_IOS_SCENARIOS_SCENARIOSUITESTS_GOLDENTESTMANAGER_H_
|
||||
#define FLUTTER_TESTING_IOS_SCENARIO_APP_IOS_SCENARIOS_SCENARIOSUITESTS_GOLDENTESTMANAGER_H_
|
||||
|
||||
#import <Foundation/Foundation.h>
|
||||
#import <XCTest/XCTest.h>
|
||||
@ -37,4 +37,4 @@ const extern double kDefaultRmseThreshold;
|
||||
|
||||
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_
|
@ -2,8 +2,8 @@
|
||||
// Use of this source code is governed by a BSD-style license that can be
|
||||
// found in the LICENSE file.
|
||||
|
||||
#ifndef FLUTTER_TESTING_SCENARIO_APP_IOS_SCENARIOS_SCENARIOSUITESTS_STATUSBARTEST_H_
|
||||
#define FLUTTER_TESTING_SCENARIO_APP_IOS_SCENARIOS_SCENARIOSUITESTS_STATUSBARTEST_H_
|
||||
#ifndef FLUTTER_TESTING_IOS_SCENARIO_APP_IOS_SCENARIOS_SCENARIOSUITESTS_STATUSBARTEST_H_
|
||||
#define FLUTTER_TESTING_IOS_SCENARIO_APP_IOS_SCENARIOS_SCENARIOSUITESTS_STATUSBARTEST_H_
|
||||
|
||||
#import <XCTest/XCTest.h>
|
||||
|
||||
@ -15,4 +15,4 @@ NS_ASSUME_NONNULL_BEGIN
|
||||
|
||||
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_
|
Before Width: | Height: | Size: 23 KiB After Width: | Height: | Size: 23 KiB |
Before Width: | Height: | Size: 23 KiB After Width: | Height: | Size: 23 KiB |
Before Width: | Height: | Size: 31 KiB After Width: | Height: | Size: 31 KiB |
Before Width: | Height: | Size: 31 KiB After Width: | Height: | Size: 31 KiB |
Before Width: | Height: | Size: 24 KiB After Width: | Height: | Size: 24 KiB |
Before Width: | Height: | Size: 23 KiB After Width: | Height: | Size: 23 KiB |