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/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
|
||||||
|
@ -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
|
||||||
|
@ -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" ]
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -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 | |
|
||||||
|
@ -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": [
|
||||||
|
@ -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": [
|
||||||
|
@ -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": [
|
||||||
|
@ -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"
|
|
||||||
]
|
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
}
|
}
|
||||||
|
@ -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"
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
},
|
},
|
||||||
|
@ -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
|
||||||
|
|
||||||
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
|
||||||
|
@ -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
|
||||||
|
@ -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" ]
|
||||||
}
|
}
|
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,
|
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.
|
@ -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.
|
@ -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
|
```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
|
||||||
|
|
@ -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_
|
@ -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_
|
@ -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_
|
@ -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_
|
@ -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_
|
@ -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
|
// 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_
|
@ -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_
|
@ -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_
|
@ -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_
|
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 |