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

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

---

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

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

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

## Background

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

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

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

View File

@ -38,28 +38,9 @@ Modify the following files as described:
* `shell/platform/android/test_runner/build.gradle`: Bump `compileSdkVersion XX` to the latest version.
* `shell/platform/android/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

View File

@ -56,110 +56,6 @@ targets:
# local_engine schedules a bunch of other builds, so it's likely to timeout waiting for those builds to run.
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

View File

@ -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" ]
}
}

View File

@ -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 | |

View File

@ -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": [

View File

@ -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": [

View File

@ -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": [

View File

@ -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"
]
}
]
}

View File

@ -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"
}
]
},

View File

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

View File

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

View File

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

View File

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

View File

@ -153,39 +153,9 @@ submitting PRs to the `flutter/engine` repository.
### End-to-end tests
End-to-end tests 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

View File

@ -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

View File

@ -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" ]
}

View File

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

View File

@ -265,7 +265,7 @@ void _createDevice({
required String iosEngineVariant,
}) {
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.

View File

@ -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.

View File

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

View File

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

View File

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

View File

@ -9,18 +9,18 @@ run:
```sh
# 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

View File

@ -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_

View File

@ -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_

View File

@ -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_

View File

@ -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_

View File

@ -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_

View File

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

View File

@ -2,8 +2,8 @@
// Use of this source code is governed by a BSD-style license that can be
// 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_

View File

@ -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_

View File

@ -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_

View File

@ -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_

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