From 9e273d5e6e2e75336f26951a09aba0f5656a7e77 Mon Sep 17 00:00:00 2001 From: Matan Lurey Date: Mon, 27 Jan 2025 19:43:46 -0800 Subject: [PATCH] Remove `scenario_app/android` and rename to `ios_scenario_app`. (#160992) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 🚫 **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`](https://github.com/flutter/flutter/tree/3762f2e9731ce97808fb2d78805f6712be83654d/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`. --- .../Upgrading-Engine's-Android-API-version.md | 19 - engine/src/flutter/.ci.yaml | 104 -- engine/src/flutter/BUILD.gn | 4 +- engine/src/flutter/CONTRIBUTING.md | 2 +- .../ci/builders/linux_android_aot_engine.json | 19 +- .../ci/builders/linux_android_emulator.json | 33 +- .../builders/linux_android_emulator_34.json | 33 +- .../linux_android_emulator_opengles_34.json | 30 +- engine/src/flutter/ci/builders/mac_unopt.json | 12 +- .../linux_android_emulator_skia.json | 81 -- .../linux_android_emulator_skia_34.json | 81 -- engine/src/flutter/ci/firebase_testlab.py | 164 --- engine/src/flutter/ci/firebase_testlab.sh | 13 - .../docs/testing/Testing-the-engine.md | 52 +- engine/src/flutter/pubspec.yaml | 2 +- .../.gitignore | 0 .../BUILD.gn | 18 +- .../testing/ios_scenario_app/README.md | 28 + .../bin/run_ios_tests.dart | 2 +- .../ios/AppFrameworkInfo.plist | 0 .../ios/BUILD.gn | 6 +- .../project.pbxproj | 0 .../contents.xcworkspacedata | 0 .../xcshareddata/IDEWorkspaceChecks.plist | 0 .../FlutterAppExtensionTestHost/AppDelegate.h | 14 + .../FlutterAppExtensionTestHost/AppDelegate.m | 0 .../AccentColor.colorset/Contents.json | 0 .../AppIcon.appiconset/Contents.json | 0 .../Assets.xcassets/Contents.json | 0 .../Base.lproj/LaunchScreen.storyboard | 0 .../Base.lproj/Main.storyboard | 0 .../FlutterAppExtensionTestHost/Info.plist | 0 .../Info_Skia.plist | 0 .../SceneDelegate.h | 16 + .../SceneDelegate.m | 0 .../ViewController.h | 14 + .../ViewController.m | 0 .../FlutterAppExtensionTestHost/main.m | 0 .../ios/README.md | 6 +- .../contents.xcworkspacedata | 0 .../xcshareddata/IDEWorkspaceChecks.plist | 0 .../xcshareddata/WorkspaceSettings.xcsettings | 0 .../ios/Scenarios/.gitignore | 0 .../Scenarios.xcodeproj/project.pbxproj | 0 .../contents.xcworkspacedata | 0 .../xcshareddata/IDEWorkspaceChecks.plist | 0 .../xcshareddata/WorkspaceSettings.xcsettings | 0 .../xcshareddata/xcschemes/Scenarios.xcscheme | 0 .../ios/Scenarios/Scenarios/AppDelegate.h | 6 +- .../ios/Scenarios/Scenarios/AppDelegate.m | 0 .../AppIcon.appiconset/Contents.json | 0 .../Scenarios/Assets.xcassets/Contents.json | 0 .../Scenarios/Scenarios/ContinuousTexture.h | 6 +- .../Scenarios/Scenarios/ContinuousTexture.m | 0 .../Scenarios/FlutterEngine+ScenariosTest.h | 6 +- .../Scenarios/FlutterEngine+ScenariosTest.m | 0 .../ios/Scenarios/Scenarios/Info.plist | 0 .../ios/Scenarios/Scenarios/Info_Skia.plist | 0 .../Scenarios/Scenarios/ScreenBeforeFlutter.h | 6 +- .../Scenarios/Scenarios/ScreenBeforeFlutter.m | 0 .../Scenarios/Scenarios/TextPlatformView.h | 6 +- .../Scenarios/Scenarios/TextPlatformView.m | 0 .../ios/Scenarios/Scenarios/main.m | 0 .../Base.lproj/MainInterface.storyboard | 0 .../ios/Scenarios/ScenariosShare/Info.plist | 0 .../Scenarios/ScenariosShare/Info_Skia.plist | 0 .../ScenariosShare/ShareViewController.h | 15 + .../ScenariosShare/ShareViewController.m | 0 .../ScenariosTests/AppLifecycleTests.m | 0 .../ScenariosTests/FlutterEngineTest.m | 0 .../FlutterViewControllerInitialRouteTest.m | 0 .../FlutterViewControllerTest.m | 0 .../ios/Scenarios/ScenariosTests/Info.plist | 0 .../Scenarios/ScenariosTests/Info_Skia.plist | 0 .../Scenarios/ScenariosTests/ScenariosTests.m | 0 .../ScenariosUITests/AppExtensionTests.m | 0 .../ScenariosUITests/BogusFontTextTest.m | 0 .../ScenariosUITests/DarwinSystemFontTests.m | 0 .../Scenarios/ScenariosUITests/GoldenImage.h | 6 +- .../Scenarios/ScenariosUITests/GoldenImage.m | 0 .../GoldenPlatformViewTests.h | 6 +- .../GoldenPlatformViewTests.m | 0 .../ScenariosUITests/GoldenTestManager.h | 6 +- .../ScenariosUITests/GoldenTestManager.m | 0 .../ios/Scenarios/ScenariosUITests/Info.plist | 0 .../ScenariosUITests/Info_Skia.plist | 0 .../LocalizationInitializationTest.m | 0 .../PlatformViewGestureRecognizerTests.m | 0 .../ScenariosUITests/PlatformViewUITests.m | 0 .../ios/Scenarios/ScenariosUITests/README.md | 0 .../ScenariosUITests/SpawnEngineTest.m | 0 .../ScenariosUITests/StatusBarTest.h | 6 +- .../ScenariosUITests/StatusBarTest.m | 0 .../UnobstructedPlatformViewTests.m | 0 ...one SE (3rd generation)_17.0_simulator.png | Bin ...one SE (3rd generation)_17.0_simulator.png | Bin ...one SE (3rd generation)_17.0_simulator.png | Bin ...one SE (3rd generation)_17.0_simulator.png | Bin ...one SE (3rd generation)_17.0_simulator.png | Bin ...one SE (3rd generation)_17.0_simulator.png | Bin ...one SE (3rd generation)_17.0_simulator.png | Bin ...one SE (3rd generation)_17.0_simulator.png | Bin ...one SE (3rd generation)_17.0_simulator.png | Bin ...one SE (3rd generation)_17.0_simulator.png | Bin ...one SE (3rd generation)_17.0_simulator.png | Bin ...one SE (3rd generation)_17.0_simulator.png | Bin ...one SE (3rd generation)_17.0_simulator.png | Bin ...one SE (3rd generation)_17.0_simulator.png | Bin ...one SE (3rd generation)_17.0_simulator.png | Bin ...one SE (3rd generation)_17.0_simulator.png | Bin ...one SE (3rd generation)_17.0_simulator.png | Bin ...one SE (3rd generation)_17.0_simulator.png | Bin ...one SE (3rd generation)_17.0_simulator.png | Bin ...one SE (3rd generation)_17.0_simulator.png | Bin ...one SE (3rd generation)_17.0_simulator.png | Bin ...one SE (3rd generation)_17.0_simulator.png | Bin ...one SE (3rd generation)_17.0_simulator.png | Bin ...one SE (3rd generation)_17.0_simulator.png | Bin ...one SE (3rd generation)_17.0_simulator.png | Bin ...one SE (3rd generation)_17.0_simulator.png | Bin ...one SE (3rd generation)_17.0_simulator.png | Bin ...one SE (3rd generation)_17.0_simulator.png | Bin ...one SE (3rd generation)_17.0_simulator.png | Bin ...one SE (3rd generation)_17.0_simulator.png | Bin ...one SE (3rd generation)_17.0_simulator.png | Bin ...one SE (3rd generation)_17.0_simulator.png | Bin ...one SE (3rd generation)_17.0_simulator.png | Bin ...one SE (3rd generation)_17.0_simulator.png | Bin ...one SE (3rd generation)_17.0_simulator.png | Bin ...one SE (3rd generation)_17.0_simulator.png | Bin ...one SE (3rd generation)_17.0_simulator.png | Bin ...one SE (3rd generation)_17.0_simulator.png | Bin ...one SE (3rd generation)_17.0_simulator.png | Bin ...one SE (3rd generation)_17.0_simulator.png | Bin ...one SE (3rd generation)_17.0_simulator.png | Bin ...one SE (3rd generation)_17.0_simulator.png | Bin ...one SE (3rd generation)_17.0_simulator.png | Bin ...one SE (3rd generation)_17.0_simulator.png | Bin ...one SE (3rd generation)_17.0_simulator.png | Bin ...one SE (3rd generation)_17.0_simulator.png | Bin ...one SE (3rd generation)_17.0_simulator.png | Bin ...one SE (3rd generation)_17.0_simulator.png | Bin ...one SE (3rd generation)_17.0_simulator.png | Bin ...one SE (3rd generation)_17.0_simulator.png | Bin ...one SE (3rd generation)_17.0_simulator.png | Bin ...one SE (3rd generation)_17.0_simulator.png | Bin ...one SE (3rd generation)_17.0_simulator.png | Bin ...one SE (3rd generation)_17.0_simulator.png | Bin ...one SE (3rd generation)_17.0_simulator.png | Bin ...one SE (3rd generation)_17.0_simulator.png | Bin ...one SE (3rd generation)_17.0_simulator.png | Bin ...one SE (3rd generation)_17.0_simulator.png | Bin ...one SE (3rd generation)_17.0_simulator.png | Bin ...one SE (3rd generation)_17.0_simulator.png | Bin ...one SE (3rd generation)_17.0_simulator.png | Bin ...one SE (3rd generation)_17.0_simulator.png | Bin ...one SE (3rd generation)_17.0_simulator.png | Bin ...one SE (3rd generation)_17.0_simulator.png | Bin ...one SE (3rd generation)_17.0_simulator.png | Bin ...one SE (3rd generation)_17.0_simulator.png | Bin ...one SE (3rd generation)_17.0_simulator.png | Bin ...one SE (3rd generation)_17.0_simulator.png | Bin ...one SE (3rd generation)_17.0_simulator.png | Bin ...one SE (3rd generation)_17.0_simulator.png | Bin ...one SE (3rd generation)_17.0_simulator.png | Bin ...one SE (3rd generation)_17.0_simulator.png | Bin ...one SE (3rd generation)_17.0_simulator.png | Bin ...one SE (3rd generation)_17.0_simulator.png | Bin .../ScenariosUITests/iPadGestureTests.m | 0 .../ios/app_stub.c | 0 .../lib/main.dart | 0 .../lib/src/animated_color_square.dart | 0 .../lib/src/bogus_font_text.dart | 0 .../lib/src/channel_util.dart | 0 .../src/darwin_app_extension_scenario.dart | 0 .../lib/src/darwin_system_font.dart | 0 .../lib/src/get_bitmap_scenario.dart | 0 .../lib/src/initial_route_reply.dart | 0 .../lib/src/locale_initialization.dart | 0 .../lib/src/platform_view.dart | 0 .../lib/src/poppable_screen.dart | 0 .../lib/src/scenario.dart | 0 .../lib/src/scenarios.dart | 0 .../lib/src/solid_blue.dart | 0 .../lib/src/texture.dart | 0 .../lib/src/touches_scenario.dart | 0 .../pubspec.yaml | 2 +- .../run_ios_tests.sh | 2 +- engine/src/flutter/testing/run_tests.py | 8 - .../flutter/testing/scenario_app/README.md | 46 - .../testing/scenario_app/android/.gitignore | 15 - .../testing/scenario_app/android/BUILD.gn | 89 -- .../testing/scenario_app/android/README.md | 391 ------ .../scenario_app/android/app/.gitignore | 1 - .../scenario_app/android/app/build.gradle | 105 -- .../android/app/proguard-rules.pro | 21 - .../java/dev/flutter/TestRunner.java | 48 - .../scenarios/ExampleInstrumentedTest.java | 29 - .../scenariosui/DrawSolidBlueScreenTest.java | 27 - .../scenariosui/ExternalTextureTests.java | 50 - .../flutter/scenariosui/MemoryLeakTests.java | 36 - .../scenariosui/PlatformTextureUiTests.java | 131 -- .../scenariosui/PlatformViewUiTests.java | 131 -- ...rmViewWithSurfaceViewBadContextUiTest.java | 45 - ...ewWithSurfaceViewHybridFallbackUiTest.java | 47 - ...atformViewWithSurfaceViewHybridUiTest.java | 44 - .../PlatformViewWithSurfaceViewUiTest.java | 143 --- .../PlatformViewWithTextureViewUiTest.java | 129 -- .../flutter/scenariosui/ScreenshotUtil.java | 132 -- .../flutter/scenariosui/SpawnEngineTests.java | 39 - .../scenariosui/SpawnMultiEngineTest.java | 37 - .../android/app/src/main/AndroidManifest.xml | 61 - .../android/app/src/main/assets/sample.mp4 | Bin 38874 -> 0 bytes .../ExternalTextureFlutterActivity.java | 449 ------- .../scenarios/PlatformViewsActivity.java | 42 - .../scenarios/SpawnMultiEngineActivity.java | 32 - .../scenarios/SpawnedEngineActivity.java | 31 - .../scenarios/SurfacePlatformViewFactory.java | 112 -- .../dev/flutter/scenarios/TestActivity.java | 121 -- .../scenarios/TestableFlutterActivity.java | 52 - .../scenarios/TextPlatformViewFactory.java | 68 -- .../scenarios/TexturePlatformViewFactory.java | 114 -- .../app/src/main/res/values/colors.xml | 6 - .../app/src/main/res/values/styles.xml | 12 - .../main/res/xml/data_extraction_rules.xml | 18 - .../xml/extraction_config_11_and_below.xml | 8 - .../testing/scenario_app/android/build.gradle | 50 - .../android/expected_golden_output.txt | 57 - .../scenario_app/android/gradle.properties | 4 - .../scenario_app/android/settings.gradle | 1 - .../testing/scenario_app/bin/README.md | 8 - .../scenario_app/bin/run_android_tests.dart | 659 ---------- .../bin/utils/adb_logcat_filtering.dart | 182 --- .../scenario_app/bin/utils/environment.dart | 41 - .../testing/scenario_app/bin/utils/logs.dart | 51 - .../scenario_app/bin/utils/options.dart | 305 ----- .../bin/utils/process_manager_extension.dart | 65 - .../bin/utils/sample_adb_logcat.txt | 1077 ----------------- .../bin/utils/screenshot_transformer.dart | 72 -- .../FlutterAppExtensionTestHost/AppDelegate.h | 14 - .../SceneDelegate.h | 16 - .../ViewController.h | 14 - .../ios/Runner/GeneratedPluginRegistrant.h | 19 - .../ios/Runner/GeneratedPluginRegistrant.m | 14 - .../ScenariosShare/ShareViewController.h | 15 - .../test/adb_log_filter_test.dart | 134 -- .../test/src/fake_adb_logcat.dart | 139 --- .../tool/deflake_android_tests.sh | 73 -- .../scenario_app/tool/logcat_reader.dart | 45 - .../flutter/tools/engine_tool/lib/src/gn.dart | 2 +- .../test/commands/build_command_test.dart | 6 +- engine/src/flutter/tools/pub_get_offline.py | 2 +- 252 files changed, 164 insertions(+), 6597 deletions(-) delete mode 100644 engine/src/flutter/ci/builders/standalone/linux_android_emulator_skia.json delete mode 100644 engine/src/flutter/ci/builders/standalone/linux_android_emulator_skia_34.json delete mode 100755 engine/src/flutter/ci/firebase_testlab.py delete mode 100755 engine/src/flutter/ci/firebase_testlab.sh rename engine/src/flutter/testing/{scenario_app => ios_scenario_app}/.gitignore (100%) rename engine/src/flutter/testing/{scenario_app => ios_scenario_app}/BUILD.gn (65%) create mode 100644 engine/src/flutter/testing/ios_scenario_app/README.md rename engine/src/flutter/testing/{scenario_app => ios_scenario_app}/bin/run_ios_tests.dart (99%) rename engine/src/flutter/testing/{scenario_app => ios_scenario_app}/ios/AppFrameworkInfo.plist (100%) rename engine/src/flutter/testing/{scenario_app => ios_scenario_app}/ios/BUILD.gn (88%) rename engine/src/flutter/testing/{scenario_app => ios_scenario_app}/ios/FlutterAppExtensionTestHost/FlutterAppExtensionTestHost.xcodeproj/project.pbxproj (100%) rename engine/src/flutter/testing/{scenario_app => ios_scenario_app}/ios/FlutterAppExtensionTestHost/FlutterAppExtensionTestHost.xcodeproj/project.xcworkspace/contents.xcworkspacedata (100%) rename engine/src/flutter/testing/{scenario_app => ios_scenario_app}/ios/FlutterAppExtensionTestHost/FlutterAppExtensionTestHost.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist (100%) create mode 100644 engine/src/flutter/testing/ios_scenario_app/ios/FlutterAppExtensionTestHost/FlutterAppExtensionTestHost/AppDelegate.h rename engine/src/flutter/testing/{scenario_app => ios_scenario_app}/ios/FlutterAppExtensionTestHost/FlutterAppExtensionTestHost/AppDelegate.m (100%) rename engine/src/flutter/testing/{scenario_app => ios_scenario_app}/ios/FlutterAppExtensionTestHost/FlutterAppExtensionTestHost/Assets.xcassets/AccentColor.colorset/Contents.json (100%) rename engine/src/flutter/testing/{scenario_app => ios_scenario_app}/ios/FlutterAppExtensionTestHost/FlutterAppExtensionTestHost/Assets.xcassets/AppIcon.appiconset/Contents.json (100%) rename engine/src/flutter/testing/{scenario_app => ios_scenario_app}/ios/FlutterAppExtensionTestHost/FlutterAppExtensionTestHost/Assets.xcassets/Contents.json (100%) rename engine/src/flutter/testing/{scenario_app => ios_scenario_app}/ios/FlutterAppExtensionTestHost/FlutterAppExtensionTestHost/Base.lproj/LaunchScreen.storyboard (100%) rename engine/src/flutter/testing/{scenario_app => ios_scenario_app}/ios/FlutterAppExtensionTestHost/FlutterAppExtensionTestHost/Base.lproj/Main.storyboard (100%) rename engine/src/flutter/testing/{scenario_app => ios_scenario_app}/ios/FlutterAppExtensionTestHost/FlutterAppExtensionTestHost/Info.plist (100%) rename engine/src/flutter/testing/{scenario_app => ios_scenario_app}/ios/FlutterAppExtensionTestHost/FlutterAppExtensionTestHost/Info_Skia.plist (100%) create mode 100644 engine/src/flutter/testing/ios_scenario_app/ios/FlutterAppExtensionTestHost/FlutterAppExtensionTestHost/SceneDelegate.h rename engine/src/flutter/testing/{scenario_app => ios_scenario_app}/ios/FlutterAppExtensionTestHost/FlutterAppExtensionTestHost/SceneDelegate.m (100%) create mode 100644 engine/src/flutter/testing/ios_scenario_app/ios/FlutterAppExtensionTestHost/FlutterAppExtensionTestHost/ViewController.h rename engine/src/flutter/testing/{scenario_app => ios_scenario_app}/ios/FlutterAppExtensionTestHost/FlutterAppExtensionTestHost/ViewController.m (100%) rename engine/src/flutter/testing/{scenario_app => ios_scenario_app}/ios/FlutterAppExtensionTestHost/FlutterAppExtensionTestHost/main.m (100%) rename engine/src/flutter/testing/{scenario_app => ios_scenario_app}/ios/README.md (89%) rename engine/src/flutter/testing/{scenario_app => ios_scenario_app}/ios/Scenarios.xcworkspace/contents.xcworkspacedata (100%) rename engine/src/flutter/testing/{scenario_app => ios_scenario_app}/ios/Scenarios.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist (100%) rename engine/src/flutter/testing/{scenario_app => ios_scenario_app}/ios/Scenarios.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings (100%) rename engine/src/flutter/testing/{scenario_app => ios_scenario_app}/ios/Scenarios/.gitignore (100%) rename engine/src/flutter/testing/{scenario_app => ios_scenario_app}/ios/Scenarios/Scenarios.xcodeproj/project.pbxproj (100%) rename engine/src/flutter/testing/{scenario_app => ios_scenario_app}/ios/Scenarios/Scenarios.xcodeproj/project.xcworkspace/contents.xcworkspacedata (100%) rename engine/src/flutter/testing/{scenario_app => ios_scenario_app}/ios/Scenarios/Scenarios.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist (100%) rename engine/src/flutter/testing/{scenario_app => ios_scenario_app}/ios/Scenarios/Scenarios.xcodeproj/project.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings (100%) rename engine/src/flutter/testing/{scenario_app => ios_scenario_app}/ios/Scenarios/Scenarios.xcodeproj/xcshareddata/xcschemes/Scenarios.xcscheme (100%) rename engine/src/flutter/testing/{scenario_app => ios_scenario_app}/ios/Scenarios/Scenarios/AppDelegate.h (52%) rename engine/src/flutter/testing/{scenario_app => ios_scenario_app}/ios/Scenarios/Scenarios/AppDelegate.m (100%) rename engine/src/flutter/testing/{scenario_app => ios_scenario_app}/ios/Scenarios/Scenarios/Assets.xcassets/AppIcon.appiconset/Contents.json (100%) rename engine/src/flutter/testing/{scenario_app => ios_scenario_app}/ios/Scenarios/Scenarios/Assets.xcassets/Contents.json (100%) rename engine/src/flutter/testing/{scenario_app => ios_scenario_app}/ios/Scenarios/Scenarios/ContinuousTexture.h (66%) rename engine/src/flutter/testing/{scenario_app => ios_scenario_app}/ios/Scenarios/Scenarios/ContinuousTexture.m (100%) rename engine/src/flutter/testing/{scenario_app => ios_scenario_app}/ios/Scenarios/Scenarios/FlutterEngine+ScenariosTest.h (71%) rename engine/src/flutter/testing/{scenario_app => ios_scenario_app}/ios/Scenarios/Scenarios/FlutterEngine+ScenariosTest.m (100%) rename engine/src/flutter/testing/{scenario_app => ios_scenario_app}/ios/Scenarios/Scenarios/Info.plist (100%) rename engine/src/flutter/testing/{scenario_app => ios_scenario_app}/ios/Scenarios/Scenarios/Info_Skia.plist (100%) rename engine/src/flutter/testing/{scenario_app => ios_scenario_app}/ios/Scenarios/Scenarios/ScreenBeforeFlutter.h (62%) rename engine/src/flutter/testing/{scenario_app => ios_scenario_app}/ios/Scenarios/Scenarios/ScreenBeforeFlutter.m (100%) rename engine/src/flutter/testing/{scenario_app => ios_scenario_app}/ios/Scenarios/Scenarios/TextPlatformView.h (73%) rename engine/src/flutter/testing/{scenario_app => ios_scenario_app}/ios/Scenarios/Scenarios/TextPlatformView.m (100%) rename engine/src/flutter/testing/{scenario_app => ios_scenario_app}/ios/Scenarios/Scenarios/main.m (100%) rename engine/src/flutter/testing/{scenario_app => ios_scenario_app}/ios/Scenarios/ScenariosShare/Base.lproj/MainInterface.storyboard (100%) rename engine/src/flutter/testing/{scenario_app => ios_scenario_app}/ios/Scenarios/ScenariosShare/Info.plist (100%) rename engine/src/flutter/testing/{scenario_app => ios_scenario_app}/ios/Scenarios/ScenariosShare/Info_Skia.plist (100%) create mode 100644 engine/src/flutter/testing/ios_scenario_app/ios/Scenarios/ScenariosShare/ShareViewController.h rename engine/src/flutter/testing/{scenario_app => ios_scenario_app}/ios/Scenarios/ScenariosShare/ShareViewController.m (100%) rename engine/src/flutter/testing/{scenario_app => ios_scenario_app}/ios/Scenarios/ScenariosTests/AppLifecycleTests.m (100%) rename engine/src/flutter/testing/{scenario_app => ios_scenario_app}/ios/Scenarios/ScenariosTests/FlutterEngineTest.m (100%) rename engine/src/flutter/testing/{scenario_app => ios_scenario_app}/ios/Scenarios/ScenariosTests/FlutterViewControllerInitialRouteTest.m (100%) rename engine/src/flutter/testing/{scenario_app => ios_scenario_app}/ios/Scenarios/ScenariosTests/FlutterViewControllerTest.m (100%) rename engine/src/flutter/testing/{scenario_app => ios_scenario_app}/ios/Scenarios/ScenariosTests/Info.plist (100%) rename engine/src/flutter/testing/{scenario_app => ios_scenario_app}/ios/Scenarios/ScenariosTests/Info_Skia.plist (100%) rename engine/src/flutter/testing/{scenario_app => ios_scenario_app}/ios/Scenarios/ScenariosTests/ScenariosTests.m (100%) rename engine/src/flutter/testing/{scenario_app => ios_scenario_app}/ios/Scenarios/ScenariosUITests/AppExtensionTests.m (100%) rename engine/src/flutter/testing/{scenario_app => ios_scenario_app}/ios/Scenarios/ScenariosUITests/BogusFontTextTest.m (100%) rename engine/src/flutter/testing/{scenario_app => ios_scenario_app}/ios/Scenarios/ScenariosUITests/DarwinSystemFontTests.m (100%) rename engine/src/flutter/testing/{scenario_app => ios_scenario_app}/ios/Scenarios/ScenariosUITests/GoldenImage.h (74%) rename engine/src/flutter/testing/{scenario_app => ios_scenario_app}/ios/Scenarios/ScenariosUITests/GoldenImage.m (100%) rename engine/src/flutter/testing/{scenario_app => ios_scenario_app}/ios/Scenarios/ScenariosUITests/GoldenPlatformViewTests.h (78%) rename engine/src/flutter/testing/{scenario_app => ios_scenario_app}/ios/Scenarios/ScenariosUITests/GoldenPlatformViewTests.m (100%) rename engine/src/flutter/testing/{scenario_app => ios_scenario_app}/ios/Scenarios/ScenariosUITests/GoldenTestManager.h (80%) rename engine/src/flutter/testing/{scenario_app => ios_scenario_app}/ios/Scenarios/ScenariosUITests/GoldenTestManager.m (100%) rename engine/src/flutter/testing/{scenario_app => ios_scenario_app}/ios/Scenarios/ScenariosUITests/Info.plist (100%) rename engine/src/flutter/testing/{scenario_app => ios_scenario_app}/ios/Scenarios/ScenariosUITests/Info_Skia.plist (100%) rename engine/src/flutter/testing/{scenario_app => ios_scenario_app}/ios/Scenarios/ScenariosUITests/LocalizationInitializationTest.m (100%) rename engine/src/flutter/testing/{scenario_app => ios_scenario_app}/ios/Scenarios/ScenariosUITests/PlatformViewGestureRecognizerTests.m (100%) rename engine/src/flutter/testing/{scenario_app => ios_scenario_app}/ios/Scenarios/ScenariosUITests/PlatformViewUITests.m (100%) rename engine/src/flutter/testing/{scenario_app => ios_scenario_app}/ios/Scenarios/ScenariosUITests/README.md (100%) rename engine/src/flutter/testing/{scenario_app => ios_scenario_app}/ios/Scenarios/ScenariosUITests/SpawnEngineTest.m (100%) rename engine/src/flutter/testing/{scenario_app => ios_scenario_app}/ios/Scenarios/ScenariosUITests/StatusBarTest.h (56%) rename engine/src/flutter/testing/{scenario_app => ios_scenario_app}/ios/Scenarios/ScenariosUITests/StatusBarTest.m (100%) rename engine/src/flutter/testing/{scenario_app => ios_scenario_app}/ios/Scenarios/ScenariosUITests/UnobstructedPlatformViewTests.m (100%) rename engine/src/flutter/testing/{scenario_app => ios_scenario_app}/ios/Scenarios/ScenariosUITests/golden_bogus_font_text_iPhone SE (3rd generation)_17.0_simulator.png (100%) rename engine/src/flutter/testing/{scenario_app => ios_scenario_app}/ios/Scenarios/ScenariosUITests/golden_bogus_font_text_impeller_iPhone SE (3rd generation)_17.0_simulator.png (100%) rename engine/src/flutter/testing/{scenario_app => ios_scenario_app}/ios/Scenarios/ScenariosUITests/golden_darwin_system_font_iPhone SE (3rd generation)_17.0_simulator.png (100%) rename engine/src/flutter/testing/{scenario_app => ios_scenario_app}/ios/Scenarios/ScenariosUITests/golden_darwin_system_font_impeller_iPhone SE (3rd generation)_17.0_simulator.png (100%) rename engine/src/flutter/testing/{scenario_app => ios_scenario_app}/ios/Scenarios/ScenariosUITests/golden_non_full_screen_flutter_view_platform_view_iPhone SE (3rd generation)_17.0_simulator.png (100%) rename engine/src/flutter/testing/{scenario_app => ios_scenario_app}/ios/Scenarios/ScenariosUITests/golden_non_full_screen_flutter_view_platform_view_impeller_iPhone SE (3rd generation)_17.0_simulator.png (100%) rename engine/src/flutter/testing/{scenario_app => ios_scenario_app}/ios/Scenarios/ScenariosUITests/golden_platform_view_clippath_iPhone SE (3rd generation)_17.0_simulator.png (100%) rename engine/src/flutter/testing/{scenario_app => ios_scenario_app}/ios/Scenarios/ScenariosUITests/golden_platform_view_clippath_impeller_iPhone SE (3rd generation)_17.0_simulator.png (100%) rename engine/src/flutter/testing/{scenario_app => ios_scenario_app}/ios/Scenarios/ScenariosUITests/golden_platform_view_clippath_multiple_clips_iPhone SE (3rd generation)_17.0_simulator.png (100%) rename engine/src/flutter/testing/{scenario_app => ios_scenario_app}/ios/Scenarios/ScenariosUITests/golden_platform_view_clippath_multiple_clips_impeller_iPhone SE (3rd generation)_17.0_simulator.png (100%) rename engine/src/flutter/testing/{scenario_app => ios_scenario_app}/ios/Scenarios/ScenariosUITests/golden_platform_view_clippath_with_transform_iPhone SE (3rd generation)_17.0_simulator.png (100%) rename engine/src/flutter/testing/{scenario_app => ios_scenario_app}/ios/Scenarios/ScenariosUITests/golden_platform_view_clippath_with_transform_impeller_iPhone SE (3rd generation)_17.0_simulator.png (100%) rename engine/src/flutter/testing/{scenario_app => ios_scenario_app}/ios/Scenarios/ScenariosUITests/golden_platform_view_clippath_with_transform_multiple_clips_iPhone SE (3rd generation)_17.0_simulator.png (100%) rename engine/src/flutter/testing/{scenario_app => ios_scenario_app}/ios/Scenarios/ScenariosUITests/golden_platform_view_clippath_with_transform_multiple_clips_impeller_iPhone SE (3rd generation)_17.0_simulator.png (100%) rename engine/src/flutter/testing/{scenario_app => ios_scenario_app}/ios/Scenarios/ScenariosUITests/golden_platform_view_cliprect_after_moved_iPhone SE (3rd generation)_17.0_simulator.png (100%) rename engine/src/flutter/testing/{scenario_app => ios_scenario_app}/ios/Scenarios/ScenariosUITests/golden_platform_view_cliprect_after_moved_impeller_iPhone SE (3rd generation)_17.0_simulator.png (100%) rename engine/src/flutter/testing/{scenario_app => ios_scenario_app}/ios/Scenarios/ScenariosUITests/golden_platform_view_cliprect_after_moved_multiple_clips_iPhone SE (3rd generation)_17.0_simulator.png (100%) rename engine/src/flutter/testing/{scenario_app => ios_scenario_app}/ios/Scenarios/ScenariosUITests/golden_platform_view_cliprect_after_moved_multiple_clips_impeller_iPhone SE (3rd generation)_17.0_simulator.png (100%) rename engine/src/flutter/testing/{scenario_app => ios_scenario_app}/ios/Scenarios/ScenariosUITests/golden_platform_view_cliprect_iPhone SE (3rd generation)_17.0_simulator.png (100%) rename engine/src/flutter/testing/{scenario_app => ios_scenario_app}/ios/Scenarios/ScenariosUITests/golden_platform_view_cliprect_impeller_iPhone SE (3rd generation)_17.0_simulator.png (100%) rename engine/src/flutter/testing/{scenario_app => ios_scenario_app}/ios/Scenarios/ScenariosUITests/golden_platform_view_cliprect_multiple_clips_iPhone SE (3rd generation)_17.0_simulator.png (100%) rename engine/src/flutter/testing/{scenario_app => ios_scenario_app}/ios/Scenarios/ScenariosUITests/golden_platform_view_cliprect_multiple_clips_impeller_iPhone SE (3rd generation)_17.0_simulator.png (100%) rename engine/src/flutter/testing/{scenario_app => ios_scenario_app}/ios/Scenarios/ScenariosUITests/golden_platform_view_cliprect_with_transform_iPhone SE (3rd generation)_17.0_simulator.png (100%) rename engine/src/flutter/testing/{scenario_app => ios_scenario_app}/ios/Scenarios/ScenariosUITests/golden_platform_view_cliprect_with_transform_impeller_iPhone SE (3rd generation)_17.0_simulator.png (100%) rename engine/src/flutter/testing/{scenario_app => ios_scenario_app}/ios/Scenarios/ScenariosUITests/golden_platform_view_cliprect_with_transform_multiple_clips_iPhone SE (3rd generation)_17.0_simulator.png (100%) rename engine/src/flutter/testing/{scenario_app => ios_scenario_app}/ios/Scenarios/ScenariosUITests/golden_platform_view_cliprect_with_transform_multiple_clips_impeller_iPhone SE (3rd generation)_17.0_simulator.png (100%) rename engine/src/flutter/testing/{scenario_app => ios_scenario_app}/ios/Scenarios/ScenariosUITests/golden_platform_view_cliprrect_iPhone SE (3rd generation)_17.0_simulator.png (100%) rename engine/src/flutter/testing/{scenario_app => ios_scenario_app}/ios/Scenarios/ScenariosUITests/golden_platform_view_cliprrect_impeller_iPhone SE (3rd generation)_17.0_simulator.png (100%) rename engine/src/flutter/testing/{scenario_app => ios_scenario_app}/ios/Scenarios/ScenariosUITests/golden_platform_view_cliprrect_multiple_clips_iPhone SE (3rd generation)_17.0_simulator.png (100%) rename engine/src/flutter/testing/{scenario_app => ios_scenario_app}/ios/Scenarios/ScenariosUITests/golden_platform_view_cliprrect_multiple_clips_impeller_iPhone SE (3rd generation)_17.0_simulator.png (100%) rename engine/src/flutter/testing/{scenario_app => ios_scenario_app}/ios/Scenarios/ScenariosUITests/golden_platform_view_cliprrect_with_transform_iPhone SE (3rd generation)_17.0_simulator.png (100%) rename engine/src/flutter/testing/{scenario_app => ios_scenario_app}/ios/Scenarios/ScenariosUITests/golden_platform_view_cliprrect_with_transform_impeller_iPhone SE (3rd generation)_17.0_simulator.png (100%) rename engine/src/flutter/testing/{scenario_app => ios_scenario_app}/ios/Scenarios/ScenariosUITests/golden_platform_view_cliprrect_with_transform_multiple_clips_iPhone SE (3rd generation)_17.0_simulator.png (100%) rename engine/src/flutter/testing/{scenario_app => ios_scenario_app}/ios/Scenarios/ScenariosUITests/golden_platform_view_cliprrect_with_transform_multiple_clips_impeller_iPhone SE (3rd generation)_17.0_simulator.png (100%) rename engine/src/flutter/testing/{scenario_app => ios_scenario_app}/ios/Scenarios/ScenariosUITests/golden_platform_view_iPhone SE (3rd generation)_17.0_simulator.png (100%) rename engine/src/flutter/testing/{scenario_app => ios_scenario_app}/ios/Scenarios/ScenariosUITests/golden_platform_view_impeller_iPhone SE (3rd generation)_17.0_simulator.png (100%) rename engine/src/flutter/testing/{scenario_app => ios_scenario_app}/ios/Scenarios/ScenariosUITests/golden_platform_view_large_cliprrect_iPhone SE (3rd generation)_17.0_simulator.png (100%) rename engine/src/flutter/testing/{scenario_app => ios_scenario_app}/ios/Scenarios/ScenariosUITests/golden_platform_view_large_cliprrect_impeller_iPhone SE (3rd generation)_17.0_simulator.png (100%) rename engine/src/flutter/testing/{scenario_app => ios_scenario_app}/ios/Scenarios/ScenariosUITests/golden_platform_view_large_cliprrect_multiple_clips_iPhone SE (3rd generation)_17.0_simulator.png (100%) rename engine/src/flutter/testing/{scenario_app => ios_scenario_app}/ios/Scenarios/ScenariosUITests/golden_platform_view_large_cliprrect_multiple_clips_impeller_iPhone SE (3rd generation)_17.0_simulator.png (100%) rename engine/src/flutter/testing/{scenario_app => ios_scenario_app}/ios/Scenarios/ScenariosUITests/golden_platform_view_large_cliprrect_with_transform_iPhone SE (3rd generation)_17.0_simulator.png (100%) rename engine/src/flutter/testing/{scenario_app => ios_scenario_app}/ios/Scenarios/ScenariosUITests/golden_platform_view_large_cliprrect_with_transform_impeller_iPhone SE (3rd generation)_17.0_simulator.png (100%) rename engine/src/flutter/testing/{scenario_app => ios_scenario_app}/ios/Scenarios/ScenariosUITests/golden_platform_view_large_cliprrect_with_transform_multiple_clips_iPhone SE (3rd generation)_17.0_simulator.png (100%) rename engine/src/flutter/testing/{scenario_app => ios_scenario_app}/ios/Scenarios/ScenariosUITests/golden_platform_view_large_cliprrect_with_transform_multiple_clips_impeller_iPhone SE (3rd generation)_17.0_simulator.png (100%) rename engine/src/flutter/testing/{scenario_app => ios_scenario_app}/ios/Scenarios/ScenariosUITests/golden_platform_view_multiple_background_foreground_iPhone SE (3rd generation)_17.0_simulator.png (100%) rename engine/src/flutter/testing/{scenario_app => ios_scenario_app}/ios/Scenarios/ScenariosUITests/golden_platform_view_multiple_background_foreground_impeller_iPhone SE (3rd generation)_17.0_simulator.png (100%) rename engine/src/flutter/testing/{scenario_app => ios_scenario_app}/ios/Scenarios/ScenariosUITests/golden_platform_view_multiple_iPhone SE (3rd generation)_17.0_simulator.png (100%) rename engine/src/flutter/testing/{scenario_app => ios_scenario_app}/ios/Scenarios/ScenariosUITests/golden_platform_view_multiple_impeller_iPhone SE (3rd generation)_17.0_simulator.png (100%) rename engine/src/flutter/testing/{scenario_app => ios_scenario_app}/ios/Scenarios/ScenariosUITests/golden_platform_view_opacity_iPhone SE (3rd generation)_17.0_simulator.png (100%) rename engine/src/flutter/testing/{scenario_app => ios_scenario_app}/ios/Scenarios/ScenariosUITests/golden_platform_view_opacity_impeller_iPhone SE (3rd generation)_17.0_simulator.png (100%) rename engine/src/flutter/testing/{scenario_app => ios_scenario_app}/ios/Scenarios/ScenariosUITests/golden_platform_view_rotate_iPhone SE (3rd generation)_17.0_simulator.png (100%) rename engine/src/flutter/testing/{scenario_app => ios_scenario_app}/ios/Scenarios/ScenariosUITests/golden_platform_view_rotate_impeller_iPhone SE (3rd generation)_17.0_simulator.png (100%) rename engine/src/flutter/testing/{scenario_app => ios_scenario_app}/ios/Scenarios/ScenariosUITests/golden_platform_view_transform_iPhone SE (3rd generation)_17.0_simulator.png (100%) rename engine/src/flutter/testing/{scenario_app => ios_scenario_app}/ios/Scenarios/ScenariosUITests/golden_platform_view_transform_impeller_iPhone SE (3rd generation)_17.0_simulator.png (100%) rename engine/src/flutter/testing/{scenario_app => ios_scenario_app}/ios/Scenarios/ScenariosUITests/golden_platform_view_with_negative_backdrop_filter_iPhone SE (3rd generation)_17.0_simulator.png (100%) rename engine/src/flutter/testing/{scenario_app => ios_scenario_app}/ios/Scenarios/ScenariosUITests/golden_platform_view_with_negative_backdrop_filter_impeller_iPhone SE (3rd generation)_17.0_simulator.png (100%) rename engine/src/flutter/testing/{scenario_app => ios_scenario_app}/ios/Scenarios/ScenariosUITests/golden_platform_view_with_other_backdrop_filter_iPhone SE (3rd generation)_17.0_simulator.png (100%) rename engine/src/flutter/testing/{scenario_app => ios_scenario_app}/ios/Scenarios/ScenariosUITests/golden_platform_view_with_other_backdrop_filter_impeller_iPhone SE (3rd generation)_17.0_simulator.png (100%) rename engine/src/flutter/testing/{scenario_app => ios_scenario_app}/ios/Scenarios/ScenariosUITests/golden_spawn_engine_works_iPhone SE (3rd generation)_17.0_simulator.png (100%) rename engine/src/flutter/testing/{scenario_app => ios_scenario_app}/ios/Scenarios/ScenariosUITests/golden_spawn_engine_works_impeller_iPhone SE (3rd generation)_17.0_simulator.png (100%) rename engine/src/flutter/testing/{scenario_app => ios_scenario_app}/ios/Scenarios/ScenariosUITests/golden_two_platform_view_clip_path_iPhone SE (3rd generation)_17.0_simulator.png (100%) rename engine/src/flutter/testing/{scenario_app => ios_scenario_app}/ios/Scenarios/ScenariosUITests/golden_two_platform_view_clip_path_impeller_iPhone SE (3rd generation)_17.0_simulator.png (100%) rename engine/src/flutter/testing/{scenario_app => ios_scenario_app}/ios/Scenarios/ScenariosUITests/golden_two_platform_view_clip_path_multiple_clips_iPhone SE (3rd generation)_17.0_simulator.png (100%) rename engine/src/flutter/testing/{scenario_app => ios_scenario_app}/ios/Scenarios/ScenariosUITests/golden_two_platform_view_clip_path_multiple_clips_impeller_iPhone SE (3rd generation)_17.0_simulator.png (100%) rename engine/src/flutter/testing/{scenario_app => ios_scenario_app}/ios/Scenarios/ScenariosUITests/golden_two_platform_view_clip_rect_iPhone SE (3rd generation)_17.0_simulator.png (100%) rename engine/src/flutter/testing/{scenario_app => ios_scenario_app}/ios/Scenarios/ScenariosUITests/golden_two_platform_view_clip_rect_impeller_iPhone SE (3rd generation)_17.0_simulator.png (100%) rename engine/src/flutter/testing/{scenario_app => ios_scenario_app}/ios/Scenarios/ScenariosUITests/golden_two_platform_view_clip_rect_multiple_clips_iPhone SE (3rd generation)_17.0_simulator.png (100%) rename engine/src/flutter/testing/{scenario_app => ios_scenario_app}/ios/Scenarios/ScenariosUITests/golden_two_platform_view_clip_rect_multiple_clips_impeller_iPhone SE (3rd generation)_17.0_simulator.png (100%) rename engine/src/flutter/testing/{scenario_app => ios_scenario_app}/ios/Scenarios/ScenariosUITests/golden_two_platform_view_clip_rrect_iPhone SE (3rd generation)_17.0_simulator.png (100%) rename engine/src/flutter/testing/{scenario_app => ios_scenario_app}/ios/Scenarios/ScenariosUITests/golden_two_platform_view_clip_rrect_impeller_iPhone SE (3rd generation)_17.0_simulator.png (100%) rename engine/src/flutter/testing/{scenario_app => ios_scenario_app}/ios/Scenarios/ScenariosUITests/golden_two_platform_view_clip_rrect_multiple_clips_iPhone SE (3rd generation)_17.0_simulator.png (100%) rename engine/src/flutter/testing/{scenario_app => ios_scenario_app}/ios/Scenarios/ScenariosUITests/golden_two_platform_view_clip_rrect_multiple_clips_impeller_iPhone SE (3rd generation)_17.0_simulator.png (100%) rename engine/src/flutter/testing/{scenario_app => ios_scenario_app}/ios/Scenarios/ScenariosUITests/golden_two_platform_views_with_other_backdrop_filter_iPhone SE (3rd generation)_17.0_simulator.png (100%) rename engine/src/flutter/testing/{scenario_app => ios_scenario_app}/ios/Scenarios/ScenariosUITests/golden_two_platform_views_with_other_backdrop_filter_impeller_iPhone SE (3rd generation)_17.0_simulator.png (100%) rename engine/src/flutter/testing/{scenario_app => ios_scenario_app}/ios/Scenarios/ScenariosUITests/iPadGestureTests.m (100%) rename engine/src/flutter/testing/{scenario_app => ios_scenario_app}/ios/app_stub.c (100%) rename engine/src/flutter/testing/{scenario_app => ios_scenario_app}/lib/main.dart (100%) rename engine/src/flutter/testing/{scenario_app => ios_scenario_app}/lib/src/animated_color_square.dart (100%) rename engine/src/flutter/testing/{scenario_app => ios_scenario_app}/lib/src/bogus_font_text.dart (100%) rename engine/src/flutter/testing/{scenario_app => ios_scenario_app}/lib/src/channel_util.dart (100%) rename engine/src/flutter/testing/{scenario_app => ios_scenario_app}/lib/src/darwin_app_extension_scenario.dart (100%) rename engine/src/flutter/testing/{scenario_app => ios_scenario_app}/lib/src/darwin_system_font.dart (100%) rename engine/src/flutter/testing/{scenario_app => ios_scenario_app}/lib/src/get_bitmap_scenario.dart (100%) rename engine/src/flutter/testing/{scenario_app => ios_scenario_app}/lib/src/initial_route_reply.dart (100%) rename engine/src/flutter/testing/{scenario_app => ios_scenario_app}/lib/src/locale_initialization.dart (100%) rename engine/src/flutter/testing/{scenario_app => ios_scenario_app}/lib/src/platform_view.dart (100%) rename engine/src/flutter/testing/{scenario_app => ios_scenario_app}/lib/src/poppable_screen.dart (100%) rename engine/src/flutter/testing/{scenario_app => ios_scenario_app}/lib/src/scenario.dart (100%) rename engine/src/flutter/testing/{scenario_app => ios_scenario_app}/lib/src/scenarios.dart (100%) rename engine/src/flutter/testing/{scenario_app => ios_scenario_app}/lib/src/solid_blue.dart (100%) rename engine/src/flutter/testing/{scenario_app => ios_scenario_app}/lib/src/texture.dart (100%) rename engine/src/flutter/testing/{scenario_app => ios_scenario_app}/lib/src/touches_scenario.dart (100%) rename engine/src/flutter/testing/{scenario_app => ios_scenario_app}/pubspec.yaml (95%) rename engine/src/flutter/testing/{scenario_app => ios_scenario_app}/run_ios_tests.sh (95%) delete mode 100644 engine/src/flutter/testing/scenario_app/README.md delete mode 100644 engine/src/flutter/testing/scenario_app/android/.gitignore delete mode 100644 engine/src/flutter/testing/scenario_app/android/BUILD.gn delete mode 100644 engine/src/flutter/testing/scenario_app/android/README.md delete mode 100644 engine/src/flutter/testing/scenario_app/android/app/.gitignore delete mode 100644 engine/src/flutter/testing/scenario_app/android/app/build.gradle delete mode 100644 engine/src/flutter/testing/scenario_app/android/app/proguard-rules.pro delete mode 100644 engine/src/flutter/testing/scenario_app/android/app/src/androidTest/java/dev/flutter/TestRunner.java delete mode 100644 engine/src/flutter/testing/scenario_app/android/app/src/androidTest/java/dev/flutter/scenarios/ExampleInstrumentedTest.java delete mode 100644 engine/src/flutter/testing/scenario_app/android/app/src/androidTest/java/dev/flutter/scenariosui/DrawSolidBlueScreenTest.java delete mode 100644 engine/src/flutter/testing/scenario_app/android/app/src/androidTest/java/dev/flutter/scenariosui/ExternalTextureTests.java delete mode 100644 engine/src/flutter/testing/scenario_app/android/app/src/androidTest/java/dev/flutter/scenariosui/MemoryLeakTests.java delete mode 100644 engine/src/flutter/testing/scenario_app/android/app/src/androidTest/java/dev/flutter/scenariosui/PlatformTextureUiTests.java delete mode 100644 engine/src/flutter/testing/scenario_app/android/app/src/androidTest/java/dev/flutter/scenariosui/PlatformViewUiTests.java delete mode 100644 engine/src/flutter/testing/scenario_app/android/app/src/androidTest/java/dev/flutter/scenariosui/PlatformViewWithSurfaceViewBadContextUiTest.java delete mode 100644 engine/src/flutter/testing/scenario_app/android/app/src/androidTest/java/dev/flutter/scenariosui/PlatformViewWithSurfaceViewHybridFallbackUiTest.java delete mode 100644 engine/src/flutter/testing/scenario_app/android/app/src/androidTest/java/dev/flutter/scenariosui/PlatformViewWithSurfaceViewHybridUiTest.java delete mode 100644 engine/src/flutter/testing/scenario_app/android/app/src/androidTest/java/dev/flutter/scenariosui/PlatformViewWithSurfaceViewUiTest.java delete mode 100644 engine/src/flutter/testing/scenario_app/android/app/src/androidTest/java/dev/flutter/scenariosui/PlatformViewWithTextureViewUiTest.java delete mode 100644 engine/src/flutter/testing/scenario_app/android/app/src/androidTest/java/dev/flutter/scenariosui/ScreenshotUtil.java delete mode 100644 engine/src/flutter/testing/scenario_app/android/app/src/androidTest/java/dev/flutter/scenariosui/SpawnEngineTests.java delete mode 100644 engine/src/flutter/testing/scenario_app/android/app/src/androidTest/java/dev/flutter/scenariosui/SpawnMultiEngineTest.java delete mode 100644 engine/src/flutter/testing/scenario_app/android/app/src/main/AndroidManifest.xml delete mode 100644 engine/src/flutter/testing/scenario_app/android/app/src/main/assets/sample.mp4 delete mode 100644 engine/src/flutter/testing/scenario_app/android/app/src/main/java/dev/flutter/scenarios/ExternalTextureFlutterActivity.java delete mode 100644 engine/src/flutter/testing/scenario_app/android/app/src/main/java/dev/flutter/scenarios/PlatformViewsActivity.java delete mode 100644 engine/src/flutter/testing/scenario_app/android/app/src/main/java/dev/flutter/scenarios/SpawnMultiEngineActivity.java delete mode 100644 engine/src/flutter/testing/scenario_app/android/app/src/main/java/dev/flutter/scenarios/SpawnedEngineActivity.java delete mode 100644 engine/src/flutter/testing/scenario_app/android/app/src/main/java/dev/flutter/scenarios/SurfacePlatformViewFactory.java delete mode 100644 engine/src/flutter/testing/scenario_app/android/app/src/main/java/dev/flutter/scenarios/TestActivity.java delete mode 100644 engine/src/flutter/testing/scenario_app/android/app/src/main/java/dev/flutter/scenarios/TestableFlutterActivity.java delete mode 100644 engine/src/flutter/testing/scenario_app/android/app/src/main/java/dev/flutter/scenarios/TextPlatformViewFactory.java delete mode 100644 engine/src/flutter/testing/scenario_app/android/app/src/main/java/dev/flutter/scenarios/TexturePlatformViewFactory.java delete mode 100644 engine/src/flutter/testing/scenario_app/android/app/src/main/res/values/colors.xml delete mode 100644 engine/src/flutter/testing/scenario_app/android/app/src/main/res/values/styles.xml delete mode 100644 engine/src/flutter/testing/scenario_app/android/app/src/main/res/xml/data_extraction_rules.xml delete mode 100644 engine/src/flutter/testing/scenario_app/android/app/src/main/res/xml/extraction_config_11_and_below.xml delete mode 100644 engine/src/flutter/testing/scenario_app/android/build.gradle delete mode 100644 engine/src/flutter/testing/scenario_app/android/expected_golden_output.txt delete mode 100644 engine/src/flutter/testing/scenario_app/android/gradle.properties delete mode 100644 engine/src/flutter/testing/scenario_app/android/settings.gradle delete mode 100644 engine/src/flutter/testing/scenario_app/bin/README.md delete mode 100644 engine/src/flutter/testing/scenario_app/bin/run_android_tests.dart delete mode 100644 engine/src/flutter/testing/scenario_app/bin/utils/adb_logcat_filtering.dart delete mode 100644 engine/src/flutter/testing/scenario_app/bin/utils/environment.dart delete mode 100644 engine/src/flutter/testing/scenario_app/bin/utils/logs.dart delete mode 100644 engine/src/flutter/testing/scenario_app/bin/utils/options.dart delete mode 100644 engine/src/flutter/testing/scenario_app/bin/utils/process_manager_extension.dart delete mode 100644 engine/src/flutter/testing/scenario_app/bin/utils/sample_adb_logcat.txt delete mode 100644 engine/src/flutter/testing/scenario_app/bin/utils/screenshot_transformer.dart delete mode 100644 engine/src/flutter/testing/scenario_app/ios/FlutterAppExtensionTestHost/FlutterAppExtensionTestHost/AppDelegate.h delete mode 100644 engine/src/flutter/testing/scenario_app/ios/FlutterAppExtensionTestHost/FlutterAppExtensionTestHost/SceneDelegate.h delete mode 100644 engine/src/flutter/testing/scenario_app/ios/FlutterAppExtensionTestHost/FlutterAppExtensionTestHost/ViewController.h delete mode 100644 engine/src/flutter/testing/scenario_app/ios/Runner/GeneratedPluginRegistrant.h delete mode 100644 engine/src/flutter/testing/scenario_app/ios/Runner/GeneratedPluginRegistrant.m delete mode 100644 engine/src/flutter/testing/scenario_app/ios/Scenarios/ScenariosShare/ShareViewController.h delete mode 100644 engine/src/flutter/testing/scenario_app/test/adb_log_filter_test.dart delete mode 100644 engine/src/flutter/testing/scenario_app/test/src/fake_adb_logcat.dart delete mode 100755 engine/src/flutter/testing/scenario_app/tool/deflake_android_tests.sh delete mode 100644 engine/src/flutter/testing/scenario_app/tool/logcat_reader.dart diff --git a/docs/platforms/android/Upgrading-Engine's-Android-API-version.md b/docs/platforms/android/Upgrading-Engine's-Android-API-version.md index 07c13b9351..38817e62c9 100644 --- a/docs/platforms/android/Upgrading-Engine's-Android-API-version.md +++ b/docs/platforms/android/Upgrading-Engine's-Android-API-version.md @@ -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.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__google_apis_x64.textpb" -}, -{ - "dependency": "avd_cipd_version", - "version": "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 diff --git a/engine/src/flutter/.ci.yaml b/engine/src/flutter/.ci.yaml index 616d4a033b..7bb25a4b84 100644 --- a/engine/src/flutter/.ci.yaml +++ b/engine/src/flutter/.ci.yaml @@ -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 diff --git a/engine/src/flutter/BUILD.gn b/engine/src/flutter/BUILD.gn index b5720381d1..ac36e26ad0 100644 --- a/engine/src/flutter/BUILD.gn +++ b/engine/src/flutter/BUILD.gn @@ -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" ] } } diff --git a/engine/src/flutter/CONTRIBUTING.md b/engine/src/flutter/CONTRIBUTING.md index 1fe14d3640..2251fe1237 100644 --- a/engine/src/flutter/CONTRIBUTING.md +++ b/engine/src/flutter/CONTRIBUTING.md @@ -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 | | diff --git a/engine/src/flutter/ci/builders/linux_android_aot_engine.json b/engine/src/flutter/ci/builders/linux_android_aot_engine.json index fd6b8a3015..9496e7a790 100644 --- a/engine/src/flutter/ci/builders/linux_android_aot_engine.json +++ b/engine/src/flutter/ci/builders/linux_android_aot_engine.json @@ -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": [ diff --git a/engine/src/flutter/ci/builders/linux_android_emulator.json b/engine/src/flutter/ci/builders/linux_android_emulator.json index 7a4fd87b45..2ff2383ac4 100644 --- a/engine/src/flutter/ci/builders/linux_android_emulator.json +++ b/engine/src/flutter/ci/builders/linux_android_emulator.json @@ -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": [ diff --git a/engine/src/flutter/ci/builders/linux_android_emulator_34.json b/engine/src/flutter/ci/builders/linux_android_emulator_34.json index 7060806c1c..15b0841c3d 100644 --- a/engine/src/flutter/ci/builders/linux_android_emulator_34.json +++ b/engine/src/flutter/ci/builders/linux_android_emulator_34.json @@ -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": [ diff --git a/engine/src/flutter/ci/builders/linux_android_emulator_opengles_34.json b/engine/src/flutter/ci/builders/linux_android_emulator_opengles_34.json index e251d97e85..14df68d2d5 100644 --- a/engine/src/flutter/ci/builders/linux_android_emulator_opengles_34.json +++ b/engine/src/flutter/ci/builders/linux_android_emulator_opengles_34.json @@ -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" - ] } ] } diff --git a/engine/src/flutter/ci/builders/mac_unopt.json b/engine/src/flutter/ci/builders/mac_unopt.json index 55ac551533..746e049acb 100644 --- a/engine/src/flutter/ci/builders/mac_unopt.json +++ b/engine/src/flutter/ci/builders/mac_unopt.json @@ -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" } ] }, diff --git a/engine/src/flutter/ci/builders/standalone/linux_android_emulator_skia.json b/engine/src/flutter/ci/builders/standalone/linux_android_emulator_skia.json deleted file mode 100644 index 148552a96a..0000000000 --- a/engine/src/flutter/ci/builders/standalone/linux_android_emulator_skia.json +++ /dev/null @@ -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" - ] - } - ] -} diff --git a/engine/src/flutter/ci/builders/standalone/linux_android_emulator_skia_34.json b/engine/src/flutter/ci/builders/standalone/linux_android_emulator_skia_34.json deleted file mode 100644 index 88e6c68cc6..0000000000 --- a/engine/src/flutter/ci/builders/standalone/linux_android_emulator_skia_34.json +++ /dev/null @@ -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" - ] - } - ] -} diff --git a/engine/src/flutter/ci/firebase_testlab.py b/engine/src/flutter/ci/firebase_testlab.py deleted file mode 100755 index d27277827a..0000000000 --- a/engine/src/flutter/ci/firebase_testlab.py +++ /dev/null @@ -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()) diff --git a/engine/src/flutter/ci/firebase_testlab.sh b/engine/src/flutter/ci/firebase_testlab.sh deleted file mode 100755 index 38bb393626..0000000000 --- a/engine/src/flutter/ci/firebase_testlab.sh +++ /dev/null @@ -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 diff --git a/engine/src/flutter/docs/testing/Testing-the-engine.md b/engine/src/flutter/docs/testing/Testing-the-engine.md index aba1ad8d39..67304aa68d 100644 --- a/engine/src/flutter/docs/testing/Testing-the-engine.md +++ b/engine/src/flutter/docs/testing/Testing-the-engine.md @@ -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 diff --git a/engine/src/flutter/pubspec.yaml b/engine/src/flutter/pubspec.yaml index d64b16a5bf..da48e95322 100644 --- a/engine/src/flutter/pubspec.yaml +++ b/engine/src/flutter/pubspec.yaml @@ -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 diff --git a/engine/src/flutter/testing/scenario_app/.gitignore b/engine/src/flutter/testing/ios_scenario_app/.gitignore similarity index 100% rename from engine/src/flutter/testing/scenario_app/.gitignore rename to engine/src/flutter/testing/ios_scenario_app/.gitignore diff --git a/engine/src/flutter/testing/scenario_app/BUILD.gn b/engine/src/flutter/testing/ios_scenario_app/BUILD.gn similarity index 65% rename from engine/src/flutter/testing/scenario_app/BUILD.gn rename to engine/src/flutter/testing/ios_scenario_app/BUILD.gn index 1f5c39791c..94413cc3b0 100644 --- a/engine/src/flutter/testing/scenario_app/BUILD.gn +++ b/engine/src/flutter/testing/ios_scenario_app/BUILD.gn @@ -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" ] } diff --git a/engine/src/flutter/testing/ios_scenario_app/README.md b/engine/src/flutter/testing/ios_scenario_app/README.md new file mode 100644 index 0000000000..4efafa00be --- /dev/null +++ b/engine/src/flutter/testing/ios_scenario_app/README.md @@ -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`. diff --git a/engine/src/flutter/testing/scenario_app/bin/run_ios_tests.dart b/engine/src/flutter/testing/ios_scenario_app/bin/run_ios_tests.dart similarity index 99% rename from engine/src/flutter/testing/scenario_app/bin/run_ios_tests.dart rename to engine/src/flutter/testing/ios_scenario_app/bin/run_ios_tests.dart index 24c0a3b2cc..54c4c726fd 100644 --- a/engine/src/flutter/testing/scenario_app/bin/run_ios_tests.dart +++ b/engine/src/flutter/testing/ios_scenario_app/bin/run_ios_tests.dart @@ -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. diff --git a/engine/src/flutter/testing/scenario_app/ios/AppFrameworkInfo.plist b/engine/src/flutter/testing/ios_scenario_app/ios/AppFrameworkInfo.plist similarity index 100% rename from engine/src/flutter/testing/scenario_app/ios/AppFrameworkInfo.plist rename to engine/src/flutter/testing/ios_scenario_app/ios/AppFrameworkInfo.plist diff --git a/engine/src/flutter/testing/scenario_app/ios/BUILD.gn b/engine/src/flutter/testing/ios_scenario_app/ios/BUILD.gn similarity index 88% rename from engine/src/flutter/testing/scenario_app/ios/BUILD.gn rename to engine/src/flutter/testing/ios_scenario_app/ios/BUILD.gn index 089de90141..41cefc87cb 100644 --- a/engine/src/flutter/testing/scenario_app/ios/BUILD.gn +++ b/engine/src/flutter/testing/ios_scenario_app/ios/BUILD.gn @@ -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. diff --git a/engine/src/flutter/testing/scenario_app/ios/FlutterAppExtensionTestHost/FlutterAppExtensionTestHost.xcodeproj/project.pbxproj b/engine/src/flutter/testing/ios_scenario_app/ios/FlutterAppExtensionTestHost/FlutterAppExtensionTestHost.xcodeproj/project.pbxproj similarity index 100% rename from engine/src/flutter/testing/scenario_app/ios/FlutterAppExtensionTestHost/FlutterAppExtensionTestHost.xcodeproj/project.pbxproj rename to engine/src/flutter/testing/ios_scenario_app/ios/FlutterAppExtensionTestHost/FlutterAppExtensionTestHost.xcodeproj/project.pbxproj diff --git a/engine/src/flutter/testing/scenario_app/ios/FlutterAppExtensionTestHost/FlutterAppExtensionTestHost.xcodeproj/project.xcworkspace/contents.xcworkspacedata b/engine/src/flutter/testing/ios_scenario_app/ios/FlutterAppExtensionTestHost/FlutterAppExtensionTestHost.xcodeproj/project.xcworkspace/contents.xcworkspacedata similarity index 100% rename from engine/src/flutter/testing/scenario_app/ios/FlutterAppExtensionTestHost/FlutterAppExtensionTestHost.xcodeproj/project.xcworkspace/contents.xcworkspacedata rename to engine/src/flutter/testing/ios_scenario_app/ios/FlutterAppExtensionTestHost/FlutterAppExtensionTestHost.xcodeproj/project.xcworkspace/contents.xcworkspacedata diff --git a/engine/src/flutter/testing/scenario_app/ios/FlutterAppExtensionTestHost/FlutterAppExtensionTestHost.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist b/engine/src/flutter/testing/ios_scenario_app/ios/FlutterAppExtensionTestHost/FlutterAppExtensionTestHost.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist similarity index 100% rename from engine/src/flutter/testing/scenario_app/ios/FlutterAppExtensionTestHost/FlutterAppExtensionTestHost.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist rename to engine/src/flutter/testing/ios_scenario_app/ios/FlutterAppExtensionTestHost/FlutterAppExtensionTestHost.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist diff --git a/engine/src/flutter/testing/ios_scenario_app/ios/FlutterAppExtensionTestHost/FlutterAppExtensionTestHost/AppDelegate.h b/engine/src/flutter/testing/ios_scenario_app/ios/FlutterAppExtensionTestHost/FlutterAppExtensionTestHost/AppDelegate.h new file mode 100644 index 0000000000..537ca6bd7e --- /dev/null +++ b/engine/src/flutter/testing/ios_scenario_app/ios/FlutterAppExtensionTestHost/FlutterAppExtensionTestHost/AppDelegate.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_APPDELEGATE_H_ +#define FLUTTER_TESTING_IOS_SCENARIO_APP_IOS_FLUTTERAPPEXTENSIONTESTHOST_FLUTTERAPPEXTENSIONTESTHOST_APPDELEGATE_H_ + +#import + +@interface AppDelegate : UIResponder + +@end + +#endif // FLUTTER_TESTING_IOS_SCENARIO_APP_IOS_FLUTTERAPPEXTENSIONTESTHOST_FLUTTERAPPEXTENSIONTESTHOST_APPDELEGATE_H_ diff --git a/engine/src/flutter/testing/scenario_app/ios/FlutterAppExtensionTestHost/FlutterAppExtensionTestHost/AppDelegate.m b/engine/src/flutter/testing/ios_scenario_app/ios/FlutterAppExtensionTestHost/FlutterAppExtensionTestHost/AppDelegate.m similarity index 100% rename from engine/src/flutter/testing/scenario_app/ios/FlutterAppExtensionTestHost/FlutterAppExtensionTestHost/AppDelegate.m rename to engine/src/flutter/testing/ios_scenario_app/ios/FlutterAppExtensionTestHost/FlutterAppExtensionTestHost/AppDelegate.m diff --git a/engine/src/flutter/testing/scenario_app/ios/FlutterAppExtensionTestHost/FlutterAppExtensionTestHost/Assets.xcassets/AccentColor.colorset/Contents.json b/engine/src/flutter/testing/ios_scenario_app/ios/FlutterAppExtensionTestHost/FlutterAppExtensionTestHost/Assets.xcassets/AccentColor.colorset/Contents.json similarity index 100% rename from engine/src/flutter/testing/scenario_app/ios/FlutterAppExtensionTestHost/FlutterAppExtensionTestHost/Assets.xcassets/AccentColor.colorset/Contents.json rename to engine/src/flutter/testing/ios_scenario_app/ios/FlutterAppExtensionTestHost/FlutterAppExtensionTestHost/Assets.xcassets/AccentColor.colorset/Contents.json diff --git a/engine/src/flutter/testing/scenario_app/ios/FlutterAppExtensionTestHost/FlutterAppExtensionTestHost/Assets.xcassets/AppIcon.appiconset/Contents.json b/engine/src/flutter/testing/ios_scenario_app/ios/FlutterAppExtensionTestHost/FlutterAppExtensionTestHost/Assets.xcassets/AppIcon.appiconset/Contents.json similarity index 100% rename from engine/src/flutter/testing/scenario_app/ios/FlutterAppExtensionTestHost/FlutterAppExtensionTestHost/Assets.xcassets/AppIcon.appiconset/Contents.json rename to engine/src/flutter/testing/ios_scenario_app/ios/FlutterAppExtensionTestHost/FlutterAppExtensionTestHost/Assets.xcassets/AppIcon.appiconset/Contents.json diff --git a/engine/src/flutter/testing/scenario_app/ios/FlutterAppExtensionTestHost/FlutterAppExtensionTestHost/Assets.xcassets/Contents.json b/engine/src/flutter/testing/ios_scenario_app/ios/FlutterAppExtensionTestHost/FlutterAppExtensionTestHost/Assets.xcassets/Contents.json similarity index 100% rename from engine/src/flutter/testing/scenario_app/ios/FlutterAppExtensionTestHost/FlutterAppExtensionTestHost/Assets.xcassets/Contents.json rename to engine/src/flutter/testing/ios_scenario_app/ios/FlutterAppExtensionTestHost/FlutterAppExtensionTestHost/Assets.xcassets/Contents.json diff --git a/engine/src/flutter/testing/scenario_app/ios/FlutterAppExtensionTestHost/FlutterAppExtensionTestHost/Base.lproj/LaunchScreen.storyboard b/engine/src/flutter/testing/ios_scenario_app/ios/FlutterAppExtensionTestHost/FlutterAppExtensionTestHost/Base.lproj/LaunchScreen.storyboard similarity index 100% rename from engine/src/flutter/testing/scenario_app/ios/FlutterAppExtensionTestHost/FlutterAppExtensionTestHost/Base.lproj/LaunchScreen.storyboard rename to engine/src/flutter/testing/ios_scenario_app/ios/FlutterAppExtensionTestHost/FlutterAppExtensionTestHost/Base.lproj/LaunchScreen.storyboard diff --git a/engine/src/flutter/testing/scenario_app/ios/FlutterAppExtensionTestHost/FlutterAppExtensionTestHost/Base.lproj/Main.storyboard b/engine/src/flutter/testing/ios_scenario_app/ios/FlutterAppExtensionTestHost/FlutterAppExtensionTestHost/Base.lproj/Main.storyboard similarity index 100% rename from engine/src/flutter/testing/scenario_app/ios/FlutterAppExtensionTestHost/FlutterAppExtensionTestHost/Base.lproj/Main.storyboard rename to engine/src/flutter/testing/ios_scenario_app/ios/FlutterAppExtensionTestHost/FlutterAppExtensionTestHost/Base.lproj/Main.storyboard diff --git a/engine/src/flutter/testing/scenario_app/ios/FlutterAppExtensionTestHost/FlutterAppExtensionTestHost/Info.plist b/engine/src/flutter/testing/ios_scenario_app/ios/FlutterAppExtensionTestHost/FlutterAppExtensionTestHost/Info.plist similarity index 100% rename from engine/src/flutter/testing/scenario_app/ios/FlutterAppExtensionTestHost/FlutterAppExtensionTestHost/Info.plist rename to engine/src/flutter/testing/ios_scenario_app/ios/FlutterAppExtensionTestHost/FlutterAppExtensionTestHost/Info.plist diff --git a/engine/src/flutter/testing/scenario_app/ios/FlutterAppExtensionTestHost/FlutterAppExtensionTestHost/Info_Skia.plist b/engine/src/flutter/testing/ios_scenario_app/ios/FlutterAppExtensionTestHost/FlutterAppExtensionTestHost/Info_Skia.plist similarity index 100% rename from engine/src/flutter/testing/scenario_app/ios/FlutterAppExtensionTestHost/FlutterAppExtensionTestHost/Info_Skia.plist rename to engine/src/flutter/testing/ios_scenario_app/ios/FlutterAppExtensionTestHost/FlutterAppExtensionTestHost/Info_Skia.plist diff --git a/engine/src/flutter/testing/ios_scenario_app/ios/FlutterAppExtensionTestHost/FlutterAppExtensionTestHost/SceneDelegate.h b/engine/src/flutter/testing/ios_scenario_app/ios/FlutterAppExtensionTestHost/FlutterAppExtensionTestHost/SceneDelegate.h new file mode 100644 index 0000000000..96c0f422ba --- /dev/null +++ b/engine/src/flutter/testing/ios_scenario_app/ios/FlutterAppExtensionTestHost/FlutterAppExtensionTestHost/SceneDelegate.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 + +@interface SceneDelegate : UIResponder + +@property(strong, nonatomic) UIWindow* window; + +@end + +#endif // FLUTTER_TESTING_IOS_SCENARIO_APP_IOS_FLUTTERAPPEXTENSIONTESTHOST_FLUTTERAPPEXTENSIONTESTHOST_SCENEDELEGATE_H_ diff --git a/engine/src/flutter/testing/scenario_app/ios/FlutterAppExtensionTestHost/FlutterAppExtensionTestHost/SceneDelegate.m b/engine/src/flutter/testing/ios_scenario_app/ios/FlutterAppExtensionTestHost/FlutterAppExtensionTestHost/SceneDelegate.m similarity index 100% rename from engine/src/flutter/testing/scenario_app/ios/FlutterAppExtensionTestHost/FlutterAppExtensionTestHost/SceneDelegate.m rename to engine/src/flutter/testing/ios_scenario_app/ios/FlutterAppExtensionTestHost/FlutterAppExtensionTestHost/SceneDelegate.m diff --git a/engine/src/flutter/testing/ios_scenario_app/ios/FlutterAppExtensionTestHost/FlutterAppExtensionTestHost/ViewController.h b/engine/src/flutter/testing/ios_scenario_app/ios/FlutterAppExtensionTestHost/FlutterAppExtensionTestHost/ViewController.h new file mode 100644 index 0000000000..91568a9a00 --- /dev/null +++ b/engine/src/flutter/testing/ios_scenario_app/ios/FlutterAppExtensionTestHost/FlutterAppExtensionTestHost/ViewController.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 + +@interface ViewController : UIViewController + +@end + +#endif // FLUTTER_TESTING_IOS_SCENARIO_APP_IOS_FLUTTERAPPEXTENSIONTESTHOST_FLUTTERAPPEXTENSIONTESTHOST_VIEWCONTROLLER_H_ diff --git a/engine/src/flutter/testing/scenario_app/ios/FlutterAppExtensionTestHost/FlutterAppExtensionTestHost/ViewController.m b/engine/src/flutter/testing/ios_scenario_app/ios/FlutterAppExtensionTestHost/FlutterAppExtensionTestHost/ViewController.m similarity index 100% rename from engine/src/flutter/testing/scenario_app/ios/FlutterAppExtensionTestHost/FlutterAppExtensionTestHost/ViewController.m rename to engine/src/flutter/testing/ios_scenario_app/ios/FlutterAppExtensionTestHost/FlutterAppExtensionTestHost/ViewController.m diff --git a/engine/src/flutter/testing/scenario_app/ios/FlutterAppExtensionTestHost/FlutterAppExtensionTestHost/main.m b/engine/src/flutter/testing/ios_scenario_app/ios/FlutterAppExtensionTestHost/FlutterAppExtensionTestHost/main.m similarity index 100% rename from engine/src/flutter/testing/scenario_app/ios/FlutterAppExtensionTestHost/FlutterAppExtensionTestHost/main.m rename to engine/src/flutter/testing/ios_scenario_app/ios/FlutterAppExtensionTestHost/FlutterAppExtensionTestHost/main.m diff --git a/engine/src/flutter/testing/scenario_app/ios/README.md b/engine/src/flutter/testing/ios_scenario_app/ios/README.md similarity index 89% rename from engine/src/flutter/testing/scenario_app/ios/README.md rename to engine/src/flutter/testing/ios_scenario_app/ios/README.md index bec7319661..2c68562ddf 100644 --- a/engine/src/flutter/testing/scenario_app/ios/README.md +++ b/engine/src/flutter/testing/ios_scenario_app/ios/README.md @@ -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 -`/ios_debug_sim_unopt/scenario_app/Scenarios/Scenarios.xcodeproj`. +`/ios_debug_sim_unopt/ios_scenario_app/Scenarios/Scenarios.xcodeproj`. ## CI Configuration diff --git a/engine/src/flutter/testing/scenario_app/ios/Scenarios.xcworkspace/contents.xcworkspacedata b/engine/src/flutter/testing/ios_scenario_app/ios/Scenarios.xcworkspace/contents.xcworkspacedata similarity index 100% rename from engine/src/flutter/testing/scenario_app/ios/Scenarios.xcworkspace/contents.xcworkspacedata rename to engine/src/flutter/testing/ios_scenario_app/ios/Scenarios.xcworkspace/contents.xcworkspacedata diff --git a/engine/src/flutter/testing/scenario_app/ios/Scenarios.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist b/engine/src/flutter/testing/ios_scenario_app/ios/Scenarios.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist similarity index 100% rename from engine/src/flutter/testing/scenario_app/ios/Scenarios.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist rename to engine/src/flutter/testing/ios_scenario_app/ios/Scenarios.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist diff --git a/engine/src/flutter/testing/scenario_app/ios/Scenarios.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings b/engine/src/flutter/testing/ios_scenario_app/ios/Scenarios.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings similarity index 100% rename from engine/src/flutter/testing/scenario_app/ios/Scenarios.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings rename to engine/src/flutter/testing/ios_scenario_app/ios/Scenarios.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings diff --git a/engine/src/flutter/testing/scenario_app/ios/Scenarios/.gitignore b/engine/src/flutter/testing/ios_scenario_app/ios/Scenarios/.gitignore similarity index 100% rename from engine/src/flutter/testing/scenario_app/ios/Scenarios/.gitignore rename to engine/src/flutter/testing/ios_scenario_app/ios/Scenarios/.gitignore diff --git a/engine/src/flutter/testing/scenario_app/ios/Scenarios/Scenarios.xcodeproj/project.pbxproj b/engine/src/flutter/testing/ios_scenario_app/ios/Scenarios/Scenarios.xcodeproj/project.pbxproj similarity index 100% rename from engine/src/flutter/testing/scenario_app/ios/Scenarios/Scenarios.xcodeproj/project.pbxproj rename to engine/src/flutter/testing/ios_scenario_app/ios/Scenarios/Scenarios.xcodeproj/project.pbxproj diff --git a/engine/src/flutter/testing/scenario_app/ios/Scenarios/Scenarios.xcodeproj/project.xcworkspace/contents.xcworkspacedata b/engine/src/flutter/testing/ios_scenario_app/ios/Scenarios/Scenarios.xcodeproj/project.xcworkspace/contents.xcworkspacedata similarity index 100% rename from engine/src/flutter/testing/scenario_app/ios/Scenarios/Scenarios.xcodeproj/project.xcworkspace/contents.xcworkspacedata rename to engine/src/flutter/testing/ios_scenario_app/ios/Scenarios/Scenarios.xcodeproj/project.xcworkspace/contents.xcworkspacedata diff --git a/engine/src/flutter/testing/scenario_app/ios/Scenarios/Scenarios.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist b/engine/src/flutter/testing/ios_scenario_app/ios/Scenarios/Scenarios.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist similarity index 100% rename from engine/src/flutter/testing/scenario_app/ios/Scenarios/Scenarios.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist rename to engine/src/flutter/testing/ios_scenario_app/ios/Scenarios/Scenarios.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist diff --git a/engine/src/flutter/testing/scenario_app/ios/Scenarios/Scenarios.xcodeproj/project.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings b/engine/src/flutter/testing/ios_scenario_app/ios/Scenarios/Scenarios.xcodeproj/project.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings similarity index 100% rename from engine/src/flutter/testing/scenario_app/ios/Scenarios/Scenarios.xcodeproj/project.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings rename to engine/src/flutter/testing/ios_scenario_app/ios/Scenarios/Scenarios.xcodeproj/project.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings diff --git a/engine/src/flutter/testing/scenario_app/ios/Scenarios/Scenarios.xcodeproj/xcshareddata/xcschemes/Scenarios.xcscheme b/engine/src/flutter/testing/ios_scenario_app/ios/Scenarios/Scenarios.xcodeproj/xcshareddata/xcschemes/Scenarios.xcscheme similarity index 100% rename from engine/src/flutter/testing/scenario_app/ios/Scenarios/Scenarios.xcodeproj/xcshareddata/xcschemes/Scenarios.xcscheme rename to engine/src/flutter/testing/ios_scenario_app/ios/Scenarios/Scenarios.xcodeproj/xcshareddata/xcschemes/Scenarios.xcscheme diff --git a/engine/src/flutter/testing/scenario_app/ios/Scenarios/Scenarios/AppDelegate.h b/engine/src/flutter/testing/ios_scenario_app/ios/Scenarios/Scenarios/AppDelegate.h similarity index 52% rename from engine/src/flutter/testing/scenario_app/ios/Scenarios/Scenarios/AppDelegate.h rename to engine/src/flutter/testing/ios_scenario_app/ios/Scenarios/Scenarios/AppDelegate.h index 46ac1558cc..8441048729 100644 --- a/engine/src/flutter/testing/scenario_app/ios/Scenarios/Scenarios/AppDelegate.h +++ b/engine/src/flutter/testing/ios_scenario_app/ios/Scenarios/Scenarios/AppDelegate.h @@ -2,8 +2,8 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -#ifndef FLUTTER_TESTING_SCENARIO_APP_IOS_SCENARIOS_SCENARIOS_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 #import @@ -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_ diff --git a/engine/src/flutter/testing/scenario_app/ios/Scenarios/Scenarios/AppDelegate.m b/engine/src/flutter/testing/ios_scenario_app/ios/Scenarios/Scenarios/AppDelegate.m similarity index 100% rename from engine/src/flutter/testing/scenario_app/ios/Scenarios/Scenarios/AppDelegate.m rename to engine/src/flutter/testing/ios_scenario_app/ios/Scenarios/Scenarios/AppDelegate.m diff --git a/engine/src/flutter/testing/scenario_app/ios/Scenarios/Scenarios/Assets.xcassets/AppIcon.appiconset/Contents.json b/engine/src/flutter/testing/ios_scenario_app/ios/Scenarios/Scenarios/Assets.xcassets/AppIcon.appiconset/Contents.json similarity index 100% rename from engine/src/flutter/testing/scenario_app/ios/Scenarios/Scenarios/Assets.xcassets/AppIcon.appiconset/Contents.json rename to engine/src/flutter/testing/ios_scenario_app/ios/Scenarios/Scenarios/Assets.xcassets/AppIcon.appiconset/Contents.json diff --git a/engine/src/flutter/testing/scenario_app/ios/Scenarios/Scenarios/Assets.xcassets/Contents.json b/engine/src/flutter/testing/ios_scenario_app/ios/Scenarios/Scenarios/Assets.xcassets/Contents.json similarity index 100% rename from engine/src/flutter/testing/scenario_app/ios/Scenarios/Scenarios/Assets.xcassets/Contents.json rename to engine/src/flutter/testing/ios_scenario_app/ios/Scenarios/Scenarios/Assets.xcassets/Contents.json diff --git a/engine/src/flutter/testing/scenario_app/ios/Scenarios/Scenarios/ContinuousTexture.h b/engine/src/flutter/testing/ios_scenario_app/ios/Scenarios/Scenarios/ContinuousTexture.h similarity index 66% rename from engine/src/flutter/testing/scenario_app/ios/Scenarios/Scenarios/ContinuousTexture.h rename to engine/src/flutter/testing/ios_scenario_app/ios/Scenarios/Scenarios/ContinuousTexture.h index 4e4422dad3..652cd9fc41 100644 --- a/engine/src/flutter/testing/scenario_app/ios/Scenarios/Scenarios/ContinuousTexture.h +++ b/engine/src/flutter/testing/ios_scenario_app/ios/Scenarios/Scenarios/ContinuousTexture.h @@ -2,8 +2,8 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -#ifndef FLUTTER_TESTING_SCENARIO_APP_IOS_SCENARIOS_SCENARIOS_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 #import @@ -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_ diff --git a/engine/src/flutter/testing/scenario_app/ios/Scenarios/Scenarios/ContinuousTexture.m b/engine/src/flutter/testing/ios_scenario_app/ios/Scenarios/Scenarios/ContinuousTexture.m similarity index 100% rename from engine/src/flutter/testing/scenario_app/ios/Scenarios/Scenarios/ContinuousTexture.m rename to engine/src/flutter/testing/ios_scenario_app/ios/Scenarios/Scenarios/ContinuousTexture.m diff --git a/engine/src/flutter/testing/scenario_app/ios/Scenarios/Scenarios/FlutterEngine+ScenariosTest.h b/engine/src/flutter/testing/ios_scenario_app/ios/Scenarios/Scenarios/FlutterEngine+ScenariosTest.h similarity index 71% rename from engine/src/flutter/testing/scenario_app/ios/Scenarios/Scenarios/FlutterEngine+ScenariosTest.h rename to engine/src/flutter/testing/ios_scenario_app/ios/Scenarios/Scenarios/FlutterEngine+ScenariosTest.h index 1e746199b6..8a4b07802c 100644 --- a/engine/src/flutter/testing/scenario_app/ios/Scenarios/Scenarios/FlutterEngine+ScenariosTest.h +++ b/engine/src/flutter/testing/ios_scenario_app/ios/Scenarios/Scenarios/FlutterEngine+ScenariosTest.h @@ -2,8 +2,8 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -#ifndef FLUTTER_TESTING_SCENARIO_APP_IOS_SCENARIOS_SCENARIOS_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 @@ -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_ diff --git a/engine/src/flutter/testing/scenario_app/ios/Scenarios/Scenarios/FlutterEngine+ScenariosTest.m b/engine/src/flutter/testing/ios_scenario_app/ios/Scenarios/Scenarios/FlutterEngine+ScenariosTest.m similarity index 100% rename from engine/src/flutter/testing/scenario_app/ios/Scenarios/Scenarios/FlutterEngine+ScenariosTest.m rename to engine/src/flutter/testing/ios_scenario_app/ios/Scenarios/Scenarios/FlutterEngine+ScenariosTest.m diff --git a/engine/src/flutter/testing/scenario_app/ios/Scenarios/Scenarios/Info.plist b/engine/src/flutter/testing/ios_scenario_app/ios/Scenarios/Scenarios/Info.plist similarity index 100% rename from engine/src/flutter/testing/scenario_app/ios/Scenarios/Scenarios/Info.plist rename to engine/src/flutter/testing/ios_scenario_app/ios/Scenarios/Scenarios/Info.plist diff --git a/engine/src/flutter/testing/scenario_app/ios/Scenarios/Scenarios/Info_Skia.plist b/engine/src/flutter/testing/ios_scenario_app/ios/Scenarios/Scenarios/Info_Skia.plist similarity index 100% rename from engine/src/flutter/testing/scenario_app/ios/Scenarios/Scenarios/Info_Skia.plist rename to engine/src/flutter/testing/ios_scenario_app/ios/Scenarios/Scenarios/Info_Skia.plist diff --git a/engine/src/flutter/testing/scenario_app/ios/Scenarios/Scenarios/ScreenBeforeFlutter.h b/engine/src/flutter/testing/ios_scenario_app/ios/Scenarios/Scenarios/ScreenBeforeFlutter.h similarity index 62% rename from engine/src/flutter/testing/scenario_app/ios/Scenarios/Scenarios/ScreenBeforeFlutter.h rename to engine/src/flutter/testing/ios_scenario_app/ios/Scenarios/Scenarios/ScreenBeforeFlutter.h index bf184129aa..f8f7f2c36b 100644 --- a/engine/src/flutter/testing/scenario_app/ios/Scenarios/Scenarios/ScreenBeforeFlutter.h +++ b/engine/src/flutter/testing/ios_scenario_app/ios/Scenarios/Scenarios/ScreenBeforeFlutter.h @@ -2,8 +2,8 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -#ifndef FLUTTER_TESTING_SCENARIO_APP_IOS_SCENARIOS_SCENARIOS_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 @@ -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_ diff --git a/engine/src/flutter/testing/scenario_app/ios/Scenarios/Scenarios/ScreenBeforeFlutter.m b/engine/src/flutter/testing/ios_scenario_app/ios/Scenarios/Scenarios/ScreenBeforeFlutter.m similarity index 100% rename from engine/src/flutter/testing/scenario_app/ios/Scenarios/Scenarios/ScreenBeforeFlutter.m rename to engine/src/flutter/testing/ios_scenario_app/ios/Scenarios/Scenarios/ScreenBeforeFlutter.m diff --git a/engine/src/flutter/testing/scenario_app/ios/Scenarios/Scenarios/TextPlatformView.h b/engine/src/flutter/testing/ios_scenario_app/ios/Scenarios/Scenarios/TextPlatformView.h similarity index 73% rename from engine/src/flutter/testing/scenario_app/ios/Scenarios/Scenarios/TextPlatformView.h rename to engine/src/flutter/testing/ios_scenario_app/ios/Scenarios/Scenarios/TextPlatformView.h index c145f93236..6a9389c7a9 100644 --- a/engine/src/flutter/testing/scenario_app/ios/Scenarios/Scenarios/TextPlatformView.h +++ b/engine/src/flutter/testing/ios_scenario_app/ios/Scenarios/Scenarios/TextPlatformView.h @@ -2,8 +2,8 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -#ifndef FLUTTER_TESTING_SCENARIO_APP_IOS_SCENARIOS_SCENARIOS_TEXTPLATFORMVIEW_H_ -#define FLUTTER_TESTING_SCENARIO_APP_IOS_SCENARIOS_SCENARIOS_TEXTPLATFORMVIEW_H_ +#ifndef FLUTTER_TESTING_IOS_SCENARIO_APP_IOS_SCENARIOS_SCENARIOS_TEXTPLATFORMVIEW_H_ +#define FLUTTER_TESTING_IOS_SCENARIO_APP_IOS_SCENARIOS_SCENARIOS_TEXTPLATFORMVIEW_H_ #import @@ -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_ diff --git a/engine/src/flutter/testing/scenario_app/ios/Scenarios/Scenarios/TextPlatformView.m b/engine/src/flutter/testing/ios_scenario_app/ios/Scenarios/Scenarios/TextPlatformView.m similarity index 100% rename from engine/src/flutter/testing/scenario_app/ios/Scenarios/Scenarios/TextPlatformView.m rename to engine/src/flutter/testing/ios_scenario_app/ios/Scenarios/Scenarios/TextPlatformView.m diff --git a/engine/src/flutter/testing/scenario_app/ios/Scenarios/Scenarios/main.m b/engine/src/flutter/testing/ios_scenario_app/ios/Scenarios/Scenarios/main.m similarity index 100% rename from engine/src/flutter/testing/scenario_app/ios/Scenarios/Scenarios/main.m rename to engine/src/flutter/testing/ios_scenario_app/ios/Scenarios/Scenarios/main.m diff --git a/engine/src/flutter/testing/scenario_app/ios/Scenarios/ScenariosShare/Base.lproj/MainInterface.storyboard b/engine/src/flutter/testing/ios_scenario_app/ios/Scenarios/ScenariosShare/Base.lproj/MainInterface.storyboard similarity index 100% rename from engine/src/flutter/testing/scenario_app/ios/Scenarios/ScenariosShare/Base.lproj/MainInterface.storyboard rename to engine/src/flutter/testing/ios_scenario_app/ios/Scenarios/ScenariosShare/Base.lproj/MainInterface.storyboard diff --git a/engine/src/flutter/testing/scenario_app/ios/Scenarios/ScenariosShare/Info.plist b/engine/src/flutter/testing/ios_scenario_app/ios/Scenarios/ScenariosShare/Info.plist similarity index 100% rename from engine/src/flutter/testing/scenario_app/ios/Scenarios/ScenariosShare/Info.plist rename to engine/src/flutter/testing/ios_scenario_app/ios/Scenarios/ScenariosShare/Info.plist diff --git a/engine/src/flutter/testing/scenario_app/ios/Scenarios/ScenariosShare/Info_Skia.plist b/engine/src/flutter/testing/ios_scenario_app/ios/Scenarios/ScenariosShare/Info_Skia.plist similarity index 100% rename from engine/src/flutter/testing/scenario_app/ios/Scenarios/ScenariosShare/Info_Skia.plist rename to engine/src/flutter/testing/ios_scenario_app/ios/Scenarios/ScenariosShare/Info_Skia.plist diff --git a/engine/src/flutter/testing/ios_scenario_app/ios/Scenarios/ScenariosShare/ShareViewController.h b/engine/src/flutter/testing/ios_scenario_app/ios/Scenarios/ScenariosShare/ShareViewController.h new file mode 100644 index 0000000000..81215ba4fd --- /dev/null +++ b/engine/src/flutter/testing/ios_scenario_app/ios/Scenarios/ScenariosShare/ShareViewController.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 +#import + +@interface ShareViewController : FlutterViewController + +@end + +#endif // FLUTTER_TESTING_IOS_SCENARIO_APP_IOS_SCENARIOS_SCENARIOSSHARE_SHAREVIEWCONTROLLER_H_ diff --git a/engine/src/flutter/testing/scenario_app/ios/Scenarios/ScenariosShare/ShareViewController.m b/engine/src/flutter/testing/ios_scenario_app/ios/Scenarios/ScenariosShare/ShareViewController.m similarity index 100% rename from engine/src/flutter/testing/scenario_app/ios/Scenarios/ScenariosShare/ShareViewController.m rename to engine/src/flutter/testing/ios_scenario_app/ios/Scenarios/ScenariosShare/ShareViewController.m diff --git a/engine/src/flutter/testing/scenario_app/ios/Scenarios/ScenariosTests/AppLifecycleTests.m b/engine/src/flutter/testing/ios_scenario_app/ios/Scenarios/ScenariosTests/AppLifecycleTests.m similarity index 100% rename from engine/src/flutter/testing/scenario_app/ios/Scenarios/ScenariosTests/AppLifecycleTests.m rename to engine/src/flutter/testing/ios_scenario_app/ios/Scenarios/ScenariosTests/AppLifecycleTests.m diff --git a/engine/src/flutter/testing/scenario_app/ios/Scenarios/ScenariosTests/FlutterEngineTest.m b/engine/src/flutter/testing/ios_scenario_app/ios/Scenarios/ScenariosTests/FlutterEngineTest.m similarity index 100% rename from engine/src/flutter/testing/scenario_app/ios/Scenarios/ScenariosTests/FlutterEngineTest.m rename to engine/src/flutter/testing/ios_scenario_app/ios/Scenarios/ScenariosTests/FlutterEngineTest.m diff --git a/engine/src/flutter/testing/scenario_app/ios/Scenarios/ScenariosTests/FlutterViewControllerInitialRouteTest.m b/engine/src/flutter/testing/ios_scenario_app/ios/Scenarios/ScenariosTests/FlutterViewControllerInitialRouteTest.m similarity index 100% rename from engine/src/flutter/testing/scenario_app/ios/Scenarios/ScenariosTests/FlutterViewControllerInitialRouteTest.m rename to engine/src/flutter/testing/ios_scenario_app/ios/Scenarios/ScenariosTests/FlutterViewControllerInitialRouteTest.m diff --git a/engine/src/flutter/testing/scenario_app/ios/Scenarios/ScenariosTests/FlutterViewControllerTest.m b/engine/src/flutter/testing/ios_scenario_app/ios/Scenarios/ScenariosTests/FlutterViewControllerTest.m similarity index 100% rename from engine/src/flutter/testing/scenario_app/ios/Scenarios/ScenariosTests/FlutterViewControllerTest.m rename to engine/src/flutter/testing/ios_scenario_app/ios/Scenarios/ScenariosTests/FlutterViewControllerTest.m diff --git a/engine/src/flutter/testing/scenario_app/ios/Scenarios/ScenariosTests/Info.plist b/engine/src/flutter/testing/ios_scenario_app/ios/Scenarios/ScenariosTests/Info.plist similarity index 100% rename from engine/src/flutter/testing/scenario_app/ios/Scenarios/ScenariosTests/Info.plist rename to engine/src/flutter/testing/ios_scenario_app/ios/Scenarios/ScenariosTests/Info.plist diff --git a/engine/src/flutter/testing/scenario_app/ios/Scenarios/ScenariosTests/Info_Skia.plist b/engine/src/flutter/testing/ios_scenario_app/ios/Scenarios/ScenariosTests/Info_Skia.plist similarity index 100% rename from engine/src/flutter/testing/scenario_app/ios/Scenarios/ScenariosTests/Info_Skia.plist rename to engine/src/flutter/testing/ios_scenario_app/ios/Scenarios/ScenariosTests/Info_Skia.plist diff --git a/engine/src/flutter/testing/scenario_app/ios/Scenarios/ScenariosTests/ScenariosTests.m b/engine/src/flutter/testing/ios_scenario_app/ios/Scenarios/ScenariosTests/ScenariosTests.m similarity index 100% rename from engine/src/flutter/testing/scenario_app/ios/Scenarios/ScenariosTests/ScenariosTests.m rename to engine/src/flutter/testing/ios_scenario_app/ios/Scenarios/ScenariosTests/ScenariosTests.m diff --git a/engine/src/flutter/testing/scenario_app/ios/Scenarios/ScenariosUITests/AppExtensionTests.m b/engine/src/flutter/testing/ios_scenario_app/ios/Scenarios/ScenariosUITests/AppExtensionTests.m similarity index 100% rename from engine/src/flutter/testing/scenario_app/ios/Scenarios/ScenariosUITests/AppExtensionTests.m rename to engine/src/flutter/testing/ios_scenario_app/ios/Scenarios/ScenariosUITests/AppExtensionTests.m diff --git a/engine/src/flutter/testing/scenario_app/ios/Scenarios/ScenariosUITests/BogusFontTextTest.m b/engine/src/flutter/testing/ios_scenario_app/ios/Scenarios/ScenariosUITests/BogusFontTextTest.m similarity index 100% rename from engine/src/flutter/testing/scenario_app/ios/Scenarios/ScenariosUITests/BogusFontTextTest.m rename to engine/src/flutter/testing/ios_scenario_app/ios/Scenarios/ScenariosUITests/BogusFontTextTest.m diff --git a/engine/src/flutter/testing/scenario_app/ios/Scenarios/ScenariosUITests/DarwinSystemFontTests.m b/engine/src/flutter/testing/ios_scenario_app/ios/Scenarios/ScenariosUITests/DarwinSystemFontTests.m similarity index 100% rename from engine/src/flutter/testing/scenario_app/ios/Scenarios/ScenariosUITests/DarwinSystemFontTests.m rename to engine/src/flutter/testing/ios_scenario_app/ios/Scenarios/ScenariosUITests/DarwinSystemFontTests.m diff --git a/engine/src/flutter/testing/scenario_app/ios/Scenarios/ScenariosUITests/GoldenImage.h b/engine/src/flutter/testing/ios_scenario_app/ios/Scenarios/ScenariosUITests/GoldenImage.h similarity index 74% rename from engine/src/flutter/testing/scenario_app/ios/Scenarios/ScenariosUITests/GoldenImage.h rename to engine/src/flutter/testing/ios_scenario_app/ios/Scenarios/ScenariosUITests/GoldenImage.h index 2be1e5c2e3..57198327b7 100644 --- a/engine/src/flutter/testing/scenario_app/ios/Scenarios/ScenariosUITests/GoldenImage.h +++ b/engine/src/flutter/testing/ios_scenario_app/ios/Scenarios/ScenariosUITests/GoldenImage.h @@ -2,8 +2,8 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -#ifndef FLUTTER_TESTING_SCENARIO_APP_IOS_SCENARIOS_SCENARIOSUITESTS_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 @@ -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_ diff --git a/engine/src/flutter/testing/scenario_app/ios/Scenarios/ScenariosUITests/GoldenImage.m b/engine/src/flutter/testing/ios_scenario_app/ios/Scenarios/ScenariosUITests/GoldenImage.m similarity index 100% rename from engine/src/flutter/testing/scenario_app/ios/Scenarios/ScenariosUITests/GoldenImage.m rename to engine/src/flutter/testing/ios_scenario_app/ios/Scenarios/ScenariosUITests/GoldenImage.m diff --git a/engine/src/flutter/testing/scenario_app/ios/Scenarios/ScenariosUITests/GoldenPlatformViewTests.h b/engine/src/flutter/testing/ios_scenario_app/ios/Scenarios/ScenariosUITests/GoldenPlatformViewTests.h similarity index 78% rename from engine/src/flutter/testing/scenario_app/ios/Scenarios/ScenariosUITests/GoldenPlatformViewTests.h rename to engine/src/flutter/testing/ios_scenario_app/ios/Scenarios/ScenariosUITests/GoldenPlatformViewTests.h index 901d45448d..6fd0965b77 100644 --- a/engine/src/flutter/testing/scenario_app/ios/Scenarios/ScenariosUITests/GoldenPlatformViewTests.h +++ b/engine/src/flutter/testing/ios_scenario_app/ios/Scenarios/ScenariosUITests/GoldenPlatformViewTests.h @@ -2,8 +2,8 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -#ifndef FLUTTER_TESTING_SCENARIO_APP_IOS_SCENARIOS_SCENARIOSUITESTS_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 #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_ diff --git a/engine/src/flutter/testing/scenario_app/ios/Scenarios/ScenariosUITests/GoldenPlatformViewTests.m b/engine/src/flutter/testing/ios_scenario_app/ios/Scenarios/ScenariosUITests/GoldenPlatformViewTests.m similarity index 100% rename from engine/src/flutter/testing/scenario_app/ios/Scenarios/ScenariosUITests/GoldenPlatformViewTests.m rename to engine/src/flutter/testing/ios_scenario_app/ios/Scenarios/ScenariosUITests/GoldenPlatformViewTests.m diff --git a/engine/src/flutter/testing/scenario_app/ios/Scenarios/ScenariosUITests/GoldenTestManager.h b/engine/src/flutter/testing/ios_scenario_app/ios/Scenarios/ScenariosUITests/GoldenTestManager.h similarity index 80% rename from engine/src/flutter/testing/scenario_app/ios/Scenarios/ScenariosUITests/GoldenTestManager.h rename to engine/src/flutter/testing/ios_scenario_app/ios/Scenarios/ScenariosUITests/GoldenTestManager.h index 04a74705c5..4fd156d4b0 100644 --- a/engine/src/flutter/testing/scenario_app/ios/Scenarios/ScenariosUITests/GoldenTestManager.h +++ b/engine/src/flutter/testing/ios_scenario_app/ios/Scenarios/ScenariosUITests/GoldenTestManager.h @@ -2,8 +2,8 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -#ifndef FLUTTER_TESTING_SCENARIO_APP_IOS_SCENARIOS_SCENARIOSUITESTS_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 #import @@ -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_ diff --git a/engine/src/flutter/testing/scenario_app/ios/Scenarios/ScenariosUITests/GoldenTestManager.m b/engine/src/flutter/testing/ios_scenario_app/ios/Scenarios/ScenariosUITests/GoldenTestManager.m similarity index 100% rename from engine/src/flutter/testing/scenario_app/ios/Scenarios/ScenariosUITests/GoldenTestManager.m rename to engine/src/flutter/testing/ios_scenario_app/ios/Scenarios/ScenariosUITests/GoldenTestManager.m diff --git a/engine/src/flutter/testing/scenario_app/ios/Scenarios/ScenariosUITests/Info.plist b/engine/src/flutter/testing/ios_scenario_app/ios/Scenarios/ScenariosUITests/Info.plist similarity index 100% rename from engine/src/flutter/testing/scenario_app/ios/Scenarios/ScenariosUITests/Info.plist rename to engine/src/flutter/testing/ios_scenario_app/ios/Scenarios/ScenariosUITests/Info.plist diff --git a/engine/src/flutter/testing/scenario_app/ios/Scenarios/ScenariosUITests/Info_Skia.plist b/engine/src/flutter/testing/ios_scenario_app/ios/Scenarios/ScenariosUITests/Info_Skia.plist similarity index 100% rename from engine/src/flutter/testing/scenario_app/ios/Scenarios/ScenariosUITests/Info_Skia.plist rename to engine/src/flutter/testing/ios_scenario_app/ios/Scenarios/ScenariosUITests/Info_Skia.plist diff --git a/engine/src/flutter/testing/scenario_app/ios/Scenarios/ScenariosUITests/LocalizationInitializationTest.m b/engine/src/flutter/testing/ios_scenario_app/ios/Scenarios/ScenariosUITests/LocalizationInitializationTest.m similarity index 100% rename from engine/src/flutter/testing/scenario_app/ios/Scenarios/ScenariosUITests/LocalizationInitializationTest.m rename to engine/src/flutter/testing/ios_scenario_app/ios/Scenarios/ScenariosUITests/LocalizationInitializationTest.m diff --git a/engine/src/flutter/testing/scenario_app/ios/Scenarios/ScenariosUITests/PlatformViewGestureRecognizerTests.m b/engine/src/flutter/testing/ios_scenario_app/ios/Scenarios/ScenariosUITests/PlatformViewGestureRecognizerTests.m similarity index 100% rename from engine/src/flutter/testing/scenario_app/ios/Scenarios/ScenariosUITests/PlatformViewGestureRecognizerTests.m rename to engine/src/flutter/testing/ios_scenario_app/ios/Scenarios/ScenariosUITests/PlatformViewGestureRecognizerTests.m diff --git a/engine/src/flutter/testing/scenario_app/ios/Scenarios/ScenariosUITests/PlatformViewUITests.m b/engine/src/flutter/testing/ios_scenario_app/ios/Scenarios/ScenariosUITests/PlatformViewUITests.m similarity index 100% rename from engine/src/flutter/testing/scenario_app/ios/Scenarios/ScenariosUITests/PlatformViewUITests.m rename to engine/src/flutter/testing/ios_scenario_app/ios/Scenarios/ScenariosUITests/PlatformViewUITests.m diff --git a/engine/src/flutter/testing/scenario_app/ios/Scenarios/ScenariosUITests/README.md b/engine/src/flutter/testing/ios_scenario_app/ios/Scenarios/ScenariosUITests/README.md similarity index 100% rename from engine/src/flutter/testing/scenario_app/ios/Scenarios/ScenariosUITests/README.md rename to engine/src/flutter/testing/ios_scenario_app/ios/Scenarios/ScenariosUITests/README.md diff --git a/engine/src/flutter/testing/scenario_app/ios/Scenarios/ScenariosUITests/SpawnEngineTest.m b/engine/src/flutter/testing/ios_scenario_app/ios/Scenarios/ScenariosUITests/SpawnEngineTest.m similarity index 100% rename from engine/src/flutter/testing/scenario_app/ios/Scenarios/ScenariosUITests/SpawnEngineTest.m rename to engine/src/flutter/testing/ios_scenario_app/ios/Scenarios/ScenariosUITests/SpawnEngineTest.m diff --git a/engine/src/flutter/testing/scenario_app/ios/Scenarios/ScenariosUITests/StatusBarTest.h b/engine/src/flutter/testing/ios_scenario_app/ios/Scenarios/ScenariosUITests/StatusBarTest.h similarity index 56% rename from engine/src/flutter/testing/scenario_app/ios/Scenarios/ScenariosUITests/StatusBarTest.h rename to engine/src/flutter/testing/ios_scenario_app/ios/Scenarios/ScenariosUITests/StatusBarTest.h index 1312246dab..6ad57d758e 100644 --- a/engine/src/flutter/testing/scenario_app/ios/Scenarios/ScenariosUITests/StatusBarTest.h +++ b/engine/src/flutter/testing/ios_scenario_app/ios/Scenarios/ScenariosUITests/StatusBarTest.h @@ -2,8 +2,8 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -#ifndef FLUTTER_TESTING_SCENARIO_APP_IOS_SCENARIOS_SCENARIOSUITESTS_STATUSBARTEST_H_ -#define FLUTTER_TESTING_SCENARIO_APP_IOS_SCENARIOS_SCENARIOSUITESTS_STATUSBARTEST_H_ +#ifndef FLUTTER_TESTING_IOS_SCENARIO_APP_IOS_SCENARIOS_SCENARIOSUITESTS_STATUSBARTEST_H_ +#define FLUTTER_TESTING_IOS_SCENARIO_APP_IOS_SCENARIOS_SCENARIOSUITESTS_STATUSBARTEST_H_ #import @@ -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_ diff --git a/engine/src/flutter/testing/scenario_app/ios/Scenarios/ScenariosUITests/StatusBarTest.m b/engine/src/flutter/testing/ios_scenario_app/ios/Scenarios/ScenariosUITests/StatusBarTest.m similarity index 100% rename from engine/src/flutter/testing/scenario_app/ios/Scenarios/ScenariosUITests/StatusBarTest.m rename to engine/src/flutter/testing/ios_scenario_app/ios/Scenarios/ScenariosUITests/StatusBarTest.m diff --git a/engine/src/flutter/testing/scenario_app/ios/Scenarios/ScenariosUITests/UnobstructedPlatformViewTests.m b/engine/src/flutter/testing/ios_scenario_app/ios/Scenarios/ScenariosUITests/UnobstructedPlatformViewTests.m similarity index 100% rename from engine/src/flutter/testing/scenario_app/ios/Scenarios/ScenariosUITests/UnobstructedPlatformViewTests.m rename to engine/src/flutter/testing/ios_scenario_app/ios/Scenarios/ScenariosUITests/UnobstructedPlatformViewTests.m diff --git a/engine/src/flutter/testing/scenario_app/ios/Scenarios/ScenariosUITests/golden_bogus_font_text_iPhone SE (3rd generation)_17.0_simulator.png b/engine/src/flutter/testing/ios_scenario_app/ios/Scenarios/ScenariosUITests/golden_bogus_font_text_iPhone SE (3rd generation)_17.0_simulator.png similarity index 100% rename from engine/src/flutter/testing/scenario_app/ios/Scenarios/ScenariosUITests/golden_bogus_font_text_iPhone SE (3rd generation)_17.0_simulator.png rename to engine/src/flutter/testing/ios_scenario_app/ios/Scenarios/ScenariosUITests/golden_bogus_font_text_iPhone SE (3rd generation)_17.0_simulator.png diff --git a/engine/src/flutter/testing/scenario_app/ios/Scenarios/ScenariosUITests/golden_bogus_font_text_impeller_iPhone SE (3rd generation)_17.0_simulator.png b/engine/src/flutter/testing/ios_scenario_app/ios/Scenarios/ScenariosUITests/golden_bogus_font_text_impeller_iPhone SE (3rd generation)_17.0_simulator.png similarity index 100% rename from engine/src/flutter/testing/scenario_app/ios/Scenarios/ScenariosUITests/golden_bogus_font_text_impeller_iPhone SE (3rd generation)_17.0_simulator.png rename to engine/src/flutter/testing/ios_scenario_app/ios/Scenarios/ScenariosUITests/golden_bogus_font_text_impeller_iPhone SE (3rd generation)_17.0_simulator.png diff --git a/engine/src/flutter/testing/scenario_app/ios/Scenarios/ScenariosUITests/golden_darwin_system_font_iPhone SE (3rd generation)_17.0_simulator.png b/engine/src/flutter/testing/ios_scenario_app/ios/Scenarios/ScenariosUITests/golden_darwin_system_font_iPhone SE (3rd generation)_17.0_simulator.png similarity index 100% rename from engine/src/flutter/testing/scenario_app/ios/Scenarios/ScenariosUITests/golden_darwin_system_font_iPhone SE (3rd generation)_17.0_simulator.png rename to engine/src/flutter/testing/ios_scenario_app/ios/Scenarios/ScenariosUITests/golden_darwin_system_font_iPhone SE (3rd generation)_17.0_simulator.png diff --git a/engine/src/flutter/testing/scenario_app/ios/Scenarios/ScenariosUITests/golden_darwin_system_font_impeller_iPhone SE (3rd generation)_17.0_simulator.png b/engine/src/flutter/testing/ios_scenario_app/ios/Scenarios/ScenariosUITests/golden_darwin_system_font_impeller_iPhone SE (3rd generation)_17.0_simulator.png similarity index 100% rename from engine/src/flutter/testing/scenario_app/ios/Scenarios/ScenariosUITests/golden_darwin_system_font_impeller_iPhone SE (3rd generation)_17.0_simulator.png rename to engine/src/flutter/testing/ios_scenario_app/ios/Scenarios/ScenariosUITests/golden_darwin_system_font_impeller_iPhone SE (3rd generation)_17.0_simulator.png diff --git a/engine/src/flutter/testing/scenario_app/ios/Scenarios/ScenariosUITests/golden_non_full_screen_flutter_view_platform_view_iPhone SE (3rd generation)_17.0_simulator.png b/engine/src/flutter/testing/ios_scenario_app/ios/Scenarios/ScenariosUITests/golden_non_full_screen_flutter_view_platform_view_iPhone SE (3rd generation)_17.0_simulator.png similarity index 100% rename from engine/src/flutter/testing/scenario_app/ios/Scenarios/ScenariosUITests/golden_non_full_screen_flutter_view_platform_view_iPhone SE (3rd generation)_17.0_simulator.png rename to engine/src/flutter/testing/ios_scenario_app/ios/Scenarios/ScenariosUITests/golden_non_full_screen_flutter_view_platform_view_iPhone SE (3rd generation)_17.0_simulator.png diff --git a/engine/src/flutter/testing/scenario_app/ios/Scenarios/ScenariosUITests/golden_non_full_screen_flutter_view_platform_view_impeller_iPhone SE (3rd generation)_17.0_simulator.png b/engine/src/flutter/testing/ios_scenario_app/ios/Scenarios/ScenariosUITests/golden_non_full_screen_flutter_view_platform_view_impeller_iPhone SE (3rd generation)_17.0_simulator.png similarity index 100% rename from engine/src/flutter/testing/scenario_app/ios/Scenarios/ScenariosUITests/golden_non_full_screen_flutter_view_platform_view_impeller_iPhone SE (3rd generation)_17.0_simulator.png rename to engine/src/flutter/testing/ios_scenario_app/ios/Scenarios/ScenariosUITests/golden_non_full_screen_flutter_view_platform_view_impeller_iPhone SE (3rd generation)_17.0_simulator.png diff --git a/engine/src/flutter/testing/scenario_app/ios/Scenarios/ScenariosUITests/golden_platform_view_clippath_iPhone SE (3rd generation)_17.0_simulator.png b/engine/src/flutter/testing/ios_scenario_app/ios/Scenarios/ScenariosUITests/golden_platform_view_clippath_iPhone SE (3rd generation)_17.0_simulator.png similarity index 100% rename from engine/src/flutter/testing/scenario_app/ios/Scenarios/ScenariosUITests/golden_platform_view_clippath_iPhone SE (3rd generation)_17.0_simulator.png rename to engine/src/flutter/testing/ios_scenario_app/ios/Scenarios/ScenariosUITests/golden_platform_view_clippath_iPhone SE (3rd generation)_17.0_simulator.png diff --git a/engine/src/flutter/testing/scenario_app/ios/Scenarios/ScenariosUITests/golden_platform_view_clippath_impeller_iPhone SE (3rd generation)_17.0_simulator.png b/engine/src/flutter/testing/ios_scenario_app/ios/Scenarios/ScenariosUITests/golden_platform_view_clippath_impeller_iPhone SE (3rd generation)_17.0_simulator.png similarity index 100% rename from engine/src/flutter/testing/scenario_app/ios/Scenarios/ScenariosUITests/golden_platform_view_clippath_impeller_iPhone SE (3rd generation)_17.0_simulator.png rename to engine/src/flutter/testing/ios_scenario_app/ios/Scenarios/ScenariosUITests/golden_platform_view_clippath_impeller_iPhone SE (3rd generation)_17.0_simulator.png diff --git a/engine/src/flutter/testing/scenario_app/ios/Scenarios/ScenariosUITests/golden_platform_view_clippath_multiple_clips_iPhone SE (3rd generation)_17.0_simulator.png b/engine/src/flutter/testing/ios_scenario_app/ios/Scenarios/ScenariosUITests/golden_platform_view_clippath_multiple_clips_iPhone SE (3rd generation)_17.0_simulator.png similarity index 100% rename from engine/src/flutter/testing/scenario_app/ios/Scenarios/ScenariosUITests/golden_platform_view_clippath_multiple_clips_iPhone SE (3rd generation)_17.0_simulator.png rename to engine/src/flutter/testing/ios_scenario_app/ios/Scenarios/ScenariosUITests/golden_platform_view_clippath_multiple_clips_iPhone SE (3rd generation)_17.0_simulator.png diff --git a/engine/src/flutter/testing/scenario_app/ios/Scenarios/ScenariosUITests/golden_platform_view_clippath_multiple_clips_impeller_iPhone SE (3rd generation)_17.0_simulator.png b/engine/src/flutter/testing/ios_scenario_app/ios/Scenarios/ScenariosUITests/golden_platform_view_clippath_multiple_clips_impeller_iPhone SE (3rd generation)_17.0_simulator.png similarity index 100% rename from engine/src/flutter/testing/scenario_app/ios/Scenarios/ScenariosUITests/golden_platform_view_clippath_multiple_clips_impeller_iPhone SE (3rd generation)_17.0_simulator.png rename to engine/src/flutter/testing/ios_scenario_app/ios/Scenarios/ScenariosUITests/golden_platform_view_clippath_multiple_clips_impeller_iPhone SE (3rd generation)_17.0_simulator.png diff --git a/engine/src/flutter/testing/scenario_app/ios/Scenarios/ScenariosUITests/golden_platform_view_clippath_with_transform_iPhone SE (3rd generation)_17.0_simulator.png b/engine/src/flutter/testing/ios_scenario_app/ios/Scenarios/ScenariosUITests/golden_platform_view_clippath_with_transform_iPhone SE (3rd generation)_17.0_simulator.png similarity index 100% rename from engine/src/flutter/testing/scenario_app/ios/Scenarios/ScenariosUITests/golden_platform_view_clippath_with_transform_iPhone SE (3rd generation)_17.0_simulator.png rename to engine/src/flutter/testing/ios_scenario_app/ios/Scenarios/ScenariosUITests/golden_platform_view_clippath_with_transform_iPhone SE (3rd generation)_17.0_simulator.png diff --git a/engine/src/flutter/testing/scenario_app/ios/Scenarios/ScenariosUITests/golden_platform_view_clippath_with_transform_impeller_iPhone SE (3rd generation)_17.0_simulator.png b/engine/src/flutter/testing/ios_scenario_app/ios/Scenarios/ScenariosUITests/golden_platform_view_clippath_with_transform_impeller_iPhone SE (3rd generation)_17.0_simulator.png similarity index 100% rename from engine/src/flutter/testing/scenario_app/ios/Scenarios/ScenariosUITests/golden_platform_view_clippath_with_transform_impeller_iPhone SE (3rd generation)_17.0_simulator.png rename to engine/src/flutter/testing/ios_scenario_app/ios/Scenarios/ScenariosUITests/golden_platform_view_clippath_with_transform_impeller_iPhone SE (3rd generation)_17.0_simulator.png diff --git a/engine/src/flutter/testing/scenario_app/ios/Scenarios/ScenariosUITests/golden_platform_view_clippath_with_transform_multiple_clips_iPhone SE (3rd generation)_17.0_simulator.png b/engine/src/flutter/testing/ios_scenario_app/ios/Scenarios/ScenariosUITests/golden_platform_view_clippath_with_transform_multiple_clips_iPhone SE (3rd generation)_17.0_simulator.png similarity index 100% rename from engine/src/flutter/testing/scenario_app/ios/Scenarios/ScenariosUITests/golden_platform_view_clippath_with_transform_multiple_clips_iPhone SE (3rd generation)_17.0_simulator.png rename to engine/src/flutter/testing/ios_scenario_app/ios/Scenarios/ScenariosUITests/golden_platform_view_clippath_with_transform_multiple_clips_iPhone SE (3rd generation)_17.0_simulator.png diff --git a/engine/src/flutter/testing/scenario_app/ios/Scenarios/ScenariosUITests/golden_platform_view_clippath_with_transform_multiple_clips_impeller_iPhone SE (3rd generation)_17.0_simulator.png b/engine/src/flutter/testing/ios_scenario_app/ios/Scenarios/ScenariosUITests/golden_platform_view_clippath_with_transform_multiple_clips_impeller_iPhone SE (3rd generation)_17.0_simulator.png similarity index 100% rename from engine/src/flutter/testing/scenario_app/ios/Scenarios/ScenariosUITests/golden_platform_view_clippath_with_transform_multiple_clips_impeller_iPhone SE (3rd generation)_17.0_simulator.png rename to engine/src/flutter/testing/ios_scenario_app/ios/Scenarios/ScenariosUITests/golden_platform_view_clippath_with_transform_multiple_clips_impeller_iPhone SE (3rd generation)_17.0_simulator.png diff --git a/engine/src/flutter/testing/scenario_app/ios/Scenarios/ScenariosUITests/golden_platform_view_cliprect_after_moved_iPhone SE (3rd generation)_17.0_simulator.png b/engine/src/flutter/testing/ios_scenario_app/ios/Scenarios/ScenariosUITests/golden_platform_view_cliprect_after_moved_iPhone SE (3rd generation)_17.0_simulator.png similarity index 100% rename from engine/src/flutter/testing/scenario_app/ios/Scenarios/ScenariosUITests/golden_platform_view_cliprect_after_moved_iPhone SE (3rd generation)_17.0_simulator.png rename to engine/src/flutter/testing/ios_scenario_app/ios/Scenarios/ScenariosUITests/golden_platform_view_cliprect_after_moved_iPhone SE (3rd generation)_17.0_simulator.png diff --git a/engine/src/flutter/testing/scenario_app/ios/Scenarios/ScenariosUITests/golden_platform_view_cliprect_after_moved_impeller_iPhone SE (3rd generation)_17.0_simulator.png b/engine/src/flutter/testing/ios_scenario_app/ios/Scenarios/ScenariosUITests/golden_platform_view_cliprect_after_moved_impeller_iPhone SE (3rd generation)_17.0_simulator.png similarity index 100% rename from engine/src/flutter/testing/scenario_app/ios/Scenarios/ScenariosUITests/golden_platform_view_cliprect_after_moved_impeller_iPhone SE (3rd generation)_17.0_simulator.png rename to engine/src/flutter/testing/ios_scenario_app/ios/Scenarios/ScenariosUITests/golden_platform_view_cliprect_after_moved_impeller_iPhone SE (3rd generation)_17.0_simulator.png diff --git a/engine/src/flutter/testing/scenario_app/ios/Scenarios/ScenariosUITests/golden_platform_view_cliprect_after_moved_multiple_clips_iPhone SE (3rd generation)_17.0_simulator.png b/engine/src/flutter/testing/ios_scenario_app/ios/Scenarios/ScenariosUITests/golden_platform_view_cliprect_after_moved_multiple_clips_iPhone SE (3rd generation)_17.0_simulator.png similarity index 100% rename from engine/src/flutter/testing/scenario_app/ios/Scenarios/ScenariosUITests/golden_platform_view_cliprect_after_moved_multiple_clips_iPhone SE (3rd generation)_17.0_simulator.png rename to engine/src/flutter/testing/ios_scenario_app/ios/Scenarios/ScenariosUITests/golden_platform_view_cliprect_after_moved_multiple_clips_iPhone SE (3rd generation)_17.0_simulator.png diff --git a/engine/src/flutter/testing/scenario_app/ios/Scenarios/ScenariosUITests/golden_platform_view_cliprect_after_moved_multiple_clips_impeller_iPhone SE (3rd generation)_17.0_simulator.png b/engine/src/flutter/testing/ios_scenario_app/ios/Scenarios/ScenariosUITests/golden_platform_view_cliprect_after_moved_multiple_clips_impeller_iPhone SE (3rd generation)_17.0_simulator.png similarity index 100% rename from engine/src/flutter/testing/scenario_app/ios/Scenarios/ScenariosUITests/golden_platform_view_cliprect_after_moved_multiple_clips_impeller_iPhone SE (3rd generation)_17.0_simulator.png rename to engine/src/flutter/testing/ios_scenario_app/ios/Scenarios/ScenariosUITests/golden_platform_view_cliprect_after_moved_multiple_clips_impeller_iPhone SE (3rd generation)_17.0_simulator.png diff --git a/engine/src/flutter/testing/scenario_app/ios/Scenarios/ScenariosUITests/golden_platform_view_cliprect_iPhone SE (3rd generation)_17.0_simulator.png b/engine/src/flutter/testing/ios_scenario_app/ios/Scenarios/ScenariosUITests/golden_platform_view_cliprect_iPhone SE (3rd generation)_17.0_simulator.png similarity index 100% rename from engine/src/flutter/testing/scenario_app/ios/Scenarios/ScenariosUITests/golden_platform_view_cliprect_iPhone SE (3rd generation)_17.0_simulator.png rename to engine/src/flutter/testing/ios_scenario_app/ios/Scenarios/ScenariosUITests/golden_platform_view_cliprect_iPhone SE (3rd generation)_17.0_simulator.png diff --git a/engine/src/flutter/testing/scenario_app/ios/Scenarios/ScenariosUITests/golden_platform_view_cliprect_impeller_iPhone SE (3rd generation)_17.0_simulator.png b/engine/src/flutter/testing/ios_scenario_app/ios/Scenarios/ScenariosUITests/golden_platform_view_cliprect_impeller_iPhone SE (3rd generation)_17.0_simulator.png similarity index 100% rename from engine/src/flutter/testing/scenario_app/ios/Scenarios/ScenariosUITests/golden_platform_view_cliprect_impeller_iPhone SE (3rd generation)_17.0_simulator.png rename to engine/src/flutter/testing/ios_scenario_app/ios/Scenarios/ScenariosUITests/golden_platform_view_cliprect_impeller_iPhone SE (3rd generation)_17.0_simulator.png diff --git a/engine/src/flutter/testing/scenario_app/ios/Scenarios/ScenariosUITests/golden_platform_view_cliprect_multiple_clips_iPhone SE (3rd generation)_17.0_simulator.png b/engine/src/flutter/testing/ios_scenario_app/ios/Scenarios/ScenariosUITests/golden_platform_view_cliprect_multiple_clips_iPhone SE (3rd generation)_17.0_simulator.png similarity index 100% rename from engine/src/flutter/testing/scenario_app/ios/Scenarios/ScenariosUITests/golden_platform_view_cliprect_multiple_clips_iPhone SE (3rd generation)_17.0_simulator.png rename to engine/src/flutter/testing/ios_scenario_app/ios/Scenarios/ScenariosUITests/golden_platform_view_cliprect_multiple_clips_iPhone SE (3rd generation)_17.0_simulator.png diff --git a/engine/src/flutter/testing/scenario_app/ios/Scenarios/ScenariosUITests/golden_platform_view_cliprect_multiple_clips_impeller_iPhone SE (3rd generation)_17.0_simulator.png b/engine/src/flutter/testing/ios_scenario_app/ios/Scenarios/ScenariosUITests/golden_platform_view_cliprect_multiple_clips_impeller_iPhone SE (3rd generation)_17.0_simulator.png similarity index 100% rename from engine/src/flutter/testing/scenario_app/ios/Scenarios/ScenariosUITests/golden_platform_view_cliprect_multiple_clips_impeller_iPhone SE (3rd generation)_17.0_simulator.png rename to engine/src/flutter/testing/ios_scenario_app/ios/Scenarios/ScenariosUITests/golden_platform_view_cliprect_multiple_clips_impeller_iPhone SE (3rd generation)_17.0_simulator.png diff --git a/engine/src/flutter/testing/scenario_app/ios/Scenarios/ScenariosUITests/golden_platform_view_cliprect_with_transform_iPhone SE (3rd generation)_17.0_simulator.png b/engine/src/flutter/testing/ios_scenario_app/ios/Scenarios/ScenariosUITests/golden_platform_view_cliprect_with_transform_iPhone SE (3rd generation)_17.0_simulator.png similarity index 100% rename from engine/src/flutter/testing/scenario_app/ios/Scenarios/ScenariosUITests/golden_platform_view_cliprect_with_transform_iPhone SE (3rd generation)_17.0_simulator.png rename to engine/src/flutter/testing/ios_scenario_app/ios/Scenarios/ScenariosUITests/golden_platform_view_cliprect_with_transform_iPhone SE (3rd generation)_17.0_simulator.png diff --git a/engine/src/flutter/testing/scenario_app/ios/Scenarios/ScenariosUITests/golden_platform_view_cliprect_with_transform_impeller_iPhone SE (3rd generation)_17.0_simulator.png b/engine/src/flutter/testing/ios_scenario_app/ios/Scenarios/ScenariosUITests/golden_platform_view_cliprect_with_transform_impeller_iPhone SE (3rd generation)_17.0_simulator.png similarity index 100% rename from engine/src/flutter/testing/scenario_app/ios/Scenarios/ScenariosUITests/golden_platform_view_cliprect_with_transform_impeller_iPhone SE (3rd generation)_17.0_simulator.png rename to engine/src/flutter/testing/ios_scenario_app/ios/Scenarios/ScenariosUITests/golden_platform_view_cliprect_with_transform_impeller_iPhone SE (3rd generation)_17.0_simulator.png diff --git a/engine/src/flutter/testing/scenario_app/ios/Scenarios/ScenariosUITests/golden_platform_view_cliprect_with_transform_multiple_clips_iPhone SE (3rd generation)_17.0_simulator.png b/engine/src/flutter/testing/ios_scenario_app/ios/Scenarios/ScenariosUITests/golden_platform_view_cliprect_with_transform_multiple_clips_iPhone SE (3rd generation)_17.0_simulator.png similarity index 100% rename from engine/src/flutter/testing/scenario_app/ios/Scenarios/ScenariosUITests/golden_platform_view_cliprect_with_transform_multiple_clips_iPhone SE (3rd generation)_17.0_simulator.png rename to engine/src/flutter/testing/ios_scenario_app/ios/Scenarios/ScenariosUITests/golden_platform_view_cliprect_with_transform_multiple_clips_iPhone SE (3rd generation)_17.0_simulator.png diff --git a/engine/src/flutter/testing/scenario_app/ios/Scenarios/ScenariosUITests/golden_platform_view_cliprect_with_transform_multiple_clips_impeller_iPhone SE (3rd generation)_17.0_simulator.png b/engine/src/flutter/testing/ios_scenario_app/ios/Scenarios/ScenariosUITests/golden_platform_view_cliprect_with_transform_multiple_clips_impeller_iPhone SE (3rd generation)_17.0_simulator.png similarity index 100% rename from engine/src/flutter/testing/scenario_app/ios/Scenarios/ScenariosUITests/golden_platform_view_cliprect_with_transform_multiple_clips_impeller_iPhone SE (3rd generation)_17.0_simulator.png rename to engine/src/flutter/testing/ios_scenario_app/ios/Scenarios/ScenariosUITests/golden_platform_view_cliprect_with_transform_multiple_clips_impeller_iPhone SE (3rd generation)_17.0_simulator.png diff --git a/engine/src/flutter/testing/scenario_app/ios/Scenarios/ScenariosUITests/golden_platform_view_cliprrect_iPhone SE (3rd generation)_17.0_simulator.png b/engine/src/flutter/testing/ios_scenario_app/ios/Scenarios/ScenariosUITests/golden_platform_view_cliprrect_iPhone SE (3rd generation)_17.0_simulator.png similarity index 100% rename from engine/src/flutter/testing/scenario_app/ios/Scenarios/ScenariosUITests/golden_platform_view_cliprrect_iPhone SE (3rd generation)_17.0_simulator.png rename to engine/src/flutter/testing/ios_scenario_app/ios/Scenarios/ScenariosUITests/golden_platform_view_cliprrect_iPhone SE (3rd generation)_17.0_simulator.png diff --git a/engine/src/flutter/testing/scenario_app/ios/Scenarios/ScenariosUITests/golden_platform_view_cliprrect_impeller_iPhone SE (3rd generation)_17.0_simulator.png b/engine/src/flutter/testing/ios_scenario_app/ios/Scenarios/ScenariosUITests/golden_platform_view_cliprrect_impeller_iPhone SE (3rd generation)_17.0_simulator.png similarity index 100% rename from engine/src/flutter/testing/scenario_app/ios/Scenarios/ScenariosUITests/golden_platform_view_cliprrect_impeller_iPhone SE (3rd generation)_17.0_simulator.png rename to engine/src/flutter/testing/ios_scenario_app/ios/Scenarios/ScenariosUITests/golden_platform_view_cliprrect_impeller_iPhone SE (3rd generation)_17.0_simulator.png diff --git a/engine/src/flutter/testing/scenario_app/ios/Scenarios/ScenariosUITests/golden_platform_view_cliprrect_multiple_clips_iPhone SE (3rd generation)_17.0_simulator.png b/engine/src/flutter/testing/ios_scenario_app/ios/Scenarios/ScenariosUITests/golden_platform_view_cliprrect_multiple_clips_iPhone SE (3rd generation)_17.0_simulator.png similarity index 100% rename from engine/src/flutter/testing/scenario_app/ios/Scenarios/ScenariosUITests/golden_platform_view_cliprrect_multiple_clips_iPhone SE (3rd generation)_17.0_simulator.png rename to engine/src/flutter/testing/ios_scenario_app/ios/Scenarios/ScenariosUITests/golden_platform_view_cliprrect_multiple_clips_iPhone SE (3rd generation)_17.0_simulator.png diff --git a/engine/src/flutter/testing/scenario_app/ios/Scenarios/ScenariosUITests/golden_platform_view_cliprrect_multiple_clips_impeller_iPhone SE (3rd generation)_17.0_simulator.png b/engine/src/flutter/testing/ios_scenario_app/ios/Scenarios/ScenariosUITests/golden_platform_view_cliprrect_multiple_clips_impeller_iPhone SE (3rd generation)_17.0_simulator.png similarity index 100% rename from engine/src/flutter/testing/scenario_app/ios/Scenarios/ScenariosUITests/golden_platform_view_cliprrect_multiple_clips_impeller_iPhone SE (3rd generation)_17.0_simulator.png rename to engine/src/flutter/testing/ios_scenario_app/ios/Scenarios/ScenariosUITests/golden_platform_view_cliprrect_multiple_clips_impeller_iPhone SE (3rd generation)_17.0_simulator.png diff --git a/engine/src/flutter/testing/scenario_app/ios/Scenarios/ScenariosUITests/golden_platform_view_cliprrect_with_transform_iPhone SE (3rd generation)_17.0_simulator.png b/engine/src/flutter/testing/ios_scenario_app/ios/Scenarios/ScenariosUITests/golden_platform_view_cliprrect_with_transform_iPhone SE (3rd generation)_17.0_simulator.png similarity index 100% rename from engine/src/flutter/testing/scenario_app/ios/Scenarios/ScenariosUITests/golden_platform_view_cliprrect_with_transform_iPhone SE (3rd generation)_17.0_simulator.png rename to engine/src/flutter/testing/ios_scenario_app/ios/Scenarios/ScenariosUITests/golden_platform_view_cliprrect_with_transform_iPhone SE (3rd generation)_17.0_simulator.png diff --git a/engine/src/flutter/testing/scenario_app/ios/Scenarios/ScenariosUITests/golden_platform_view_cliprrect_with_transform_impeller_iPhone SE (3rd generation)_17.0_simulator.png b/engine/src/flutter/testing/ios_scenario_app/ios/Scenarios/ScenariosUITests/golden_platform_view_cliprrect_with_transform_impeller_iPhone SE (3rd generation)_17.0_simulator.png similarity index 100% rename from engine/src/flutter/testing/scenario_app/ios/Scenarios/ScenariosUITests/golden_platform_view_cliprrect_with_transform_impeller_iPhone SE (3rd generation)_17.0_simulator.png rename to engine/src/flutter/testing/ios_scenario_app/ios/Scenarios/ScenariosUITests/golden_platform_view_cliprrect_with_transform_impeller_iPhone SE (3rd generation)_17.0_simulator.png diff --git a/engine/src/flutter/testing/scenario_app/ios/Scenarios/ScenariosUITests/golden_platform_view_cliprrect_with_transform_multiple_clips_iPhone SE (3rd generation)_17.0_simulator.png b/engine/src/flutter/testing/ios_scenario_app/ios/Scenarios/ScenariosUITests/golden_platform_view_cliprrect_with_transform_multiple_clips_iPhone SE (3rd generation)_17.0_simulator.png similarity index 100% rename from engine/src/flutter/testing/scenario_app/ios/Scenarios/ScenariosUITests/golden_platform_view_cliprrect_with_transform_multiple_clips_iPhone SE (3rd generation)_17.0_simulator.png rename to engine/src/flutter/testing/ios_scenario_app/ios/Scenarios/ScenariosUITests/golden_platform_view_cliprrect_with_transform_multiple_clips_iPhone SE (3rd generation)_17.0_simulator.png diff --git a/engine/src/flutter/testing/scenario_app/ios/Scenarios/ScenariosUITests/golden_platform_view_cliprrect_with_transform_multiple_clips_impeller_iPhone SE (3rd generation)_17.0_simulator.png b/engine/src/flutter/testing/ios_scenario_app/ios/Scenarios/ScenariosUITests/golden_platform_view_cliprrect_with_transform_multiple_clips_impeller_iPhone SE (3rd generation)_17.0_simulator.png similarity index 100% rename from engine/src/flutter/testing/scenario_app/ios/Scenarios/ScenariosUITests/golden_platform_view_cliprrect_with_transform_multiple_clips_impeller_iPhone SE (3rd generation)_17.0_simulator.png rename to engine/src/flutter/testing/ios_scenario_app/ios/Scenarios/ScenariosUITests/golden_platform_view_cliprrect_with_transform_multiple_clips_impeller_iPhone SE (3rd generation)_17.0_simulator.png diff --git a/engine/src/flutter/testing/scenario_app/ios/Scenarios/ScenariosUITests/golden_platform_view_iPhone SE (3rd generation)_17.0_simulator.png b/engine/src/flutter/testing/ios_scenario_app/ios/Scenarios/ScenariosUITests/golden_platform_view_iPhone SE (3rd generation)_17.0_simulator.png similarity index 100% rename from engine/src/flutter/testing/scenario_app/ios/Scenarios/ScenariosUITests/golden_platform_view_iPhone SE (3rd generation)_17.0_simulator.png rename to engine/src/flutter/testing/ios_scenario_app/ios/Scenarios/ScenariosUITests/golden_platform_view_iPhone SE (3rd generation)_17.0_simulator.png diff --git a/engine/src/flutter/testing/scenario_app/ios/Scenarios/ScenariosUITests/golden_platform_view_impeller_iPhone SE (3rd generation)_17.0_simulator.png b/engine/src/flutter/testing/ios_scenario_app/ios/Scenarios/ScenariosUITests/golden_platform_view_impeller_iPhone SE (3rd generation)_17.0_simulator.png similarity index 100% rename from engine/src/flutter/testing/scenario_app/ios/Scenarios/ScenariosUITests/golden_platform_view_impeller_iPhone SE (3rd generation)_17.0_simulator.png rename to engine/src/flutter/testing/ios_scenario_app/ios/Scenarios/ScenariosUITests/golden_platform_view_impeller_iPhone SE (3rd generation)_17.0_simulator.png diff --git a/engine/src/flutter/testing/scenario_app/ios/Scenarios/ScenariosUITests/golden_platform_view_large_cliprrect_iPhone SE (3rd generation)_17.0_simulator.png b/engine/src/flutter/testing/ios_scenario_app/ios/Scenarios/ScenariosUITests/golden_platform_view_large_cliprrect_iPhone SE (3rd generation)_17.0_simulator.png similarity index 100% rename from engine/src/flutter/testing/scenario_app/ios/Scenarios/ScenariosUITests/golden_platform_view_large_cliprrect_iPhone SE (3rd generation)_17.0_simulator.png rename to engine/src/flutter/testing/ios_scenario_app/ios/Scenarios/ScenariosUITests/golden_platform_view_large_cliprrect_iPhone SE (3rd generation)_17.0_simulator.png diff --git a/engine/src/flutter/testing/scenario_app/ios/Scenarios/ScenariosUITests/golden_platform_view_large_cliprrect_impeller_iPhone SE (3rd generation)_17.0_simulator.png b/engine/src/flutter/testing/ios_scenario_app/ios/Scenarios/ScenariosUITests/golden_platform_view_large_cliprrect_impeller_iPhone SE (3rd generation)_17.0_simulator.png similarity index 100% rename from engine/src/flutter/testing/scenario_app/ios/Scenarios/ScenariosUITests/golden_platform_view_large_cliprrect_impeller_iPhone SE (3rd generation)_17.0_simulator.png rename to engine/src/flutter/testing/ios_scenario_app/ios/Scenarios/ScenariosUITests/golden_platform_view_large_cliprrect_impeller_iPhone SE (3rd generation)_17.0_simulator.png diff --git a/engine/src/flutter/testing/scenario_app/ios/Scenarios/ScenariosUITests/golden_platform_view_large_cliprrect_multiple_clips_iPhone SE (3rd generation)_17.0_simulator.png b/engine/src/flutter/testing/ios_scenario_app/ios/Scenarios/ScenariosUITests/golden_platform_view_large_cliprrect_multiple_clips_iPhone SE (3rd generation)_17.0_simulator.png similarity index 100% rename from engine/src/flutter/testing/scenario_app/ios/Scenarios/ScenariosUITests/golden_platform_view_large_cliprrect_multiple_clips_iPhone SE (3rd generation)_17.0_simulator.png rename to engine/src/flutter/testing/ios_scenario_app/ios/Scenarios/ScenariosUITests/golden_platform_view_large_cliprrect_multiple_clips_iPhone SE (3rd generation)_17.0_simulator.png diff --git a/engine/src/flutter/testing/scenario_app/ios/Scenarios/ScenariosUITests/golden_platform_view_large_cliprrect_multiple_clips_impeller_iPhone SE (3rd generation)_17.0_simulator.png b/engine/src/flutter/testing/ios_scenario_app/ios/Scenarios/ScenariosUITests/golden_platform_view_large_cliprrect_multiple_clips_impeller_iPhone SE (3rd generation)_17.0_simulator.png similarity index 100% rename from engine/src/flutter/testing/scenario_app/ios/Scenarios/ScenariosUITests/golden_platform_view_large_cliprrect_multiple_clips_impeller_iPhone SE (3rd generation)_17.0_simulator.png rename to engine/src/flutter/testing/ios_scenario_app/ios/Scenarios/ScenariosUITests/golden_platform_view_large_cliprrect_multiple_clips_impeller_iPhone SE (3rd generation)_17.0_simulator.png diff --git a/engine/src/flutter/testing/scenario_app/ios/Scenarios/ScenariosUITests/golden_platform_view_large_cliprrect_with_transform_iPhone SE (3rd generation)_17.0_simulator.png b/engine/src/flutter/testing/ios_scenario_app/ios/Scenarios/ScenariosUITests/golden_platform_view_large_cliprrect_with_transform_iPhone SE (3rd generation)_17.0_simulator.png similarity index 100% rename from engine/src/flutter/testing/scenario_app/ios/Scenarios/ScenariosUITests/golden_platform_view_large_cliprrect_with_transform_iPhone SE (3rd generation)_17.0_simulator.png rename to engine/src/flutter/testing/ios_scenario_app/ios/Scenarios/ScenariosUITests/golden_platform_view_large_cliprrect_with_transform_iPhone SE (3rd generation)_17.0_simulator.png diff --git a/engine/src/flutter/testing/scenario_app/ios/Scenarios/ScenariosUITests/golden_platform_view_large_cliprrect_with_transform_impeller_iPhone SE (3rd generation)_17.0_simulator.png b/engine/src/flutter/testing/ios_scenario_app/ios/Scenarios/ScenariosUITests/golden_platform_view_large_cliprrect_with_transform_impeller_iPhone SE (3rd generation)_17.0_simulator.png similarity index 100% rename from engine/src/flutter/testing/scenario_app/ios/Scenarios/ScenariosUITests/golden_platform_view_large_cliprrect_with_transform_impeller_iPhone SE (3rd generation)_17.0_simulator.png rename to engine/src/flutter/testing/ios_scenario_app/ios/Scenarios/ScenariosUITests/golden_platform_view_large_cliprrect_with_transform_impeller_iPhone SE (3rd generation)_17.0_simulator.png diff --git a/engine/src/flutter/testing/scenario_app/ios/Scenarios/ScenariosUITests/golden_platform_view_large_cliprrect_with_transform_multiple_clips_iPhone SE (3rd generation)_17.0_simulator.png b/engine/src/flutter/testing/ios_scenario_app/ios/Scenarios/ScenariosUITests/golden_platform_view_large_cliprrect_with_transform_multiple_clips_iPhone SE (3rd generation)_17.0_simulator.png similarity index 100% rename from engine/src/flutter/testing/scenario_app/ios/Scenarios/ScenariosUITests/golden_platform_view_large_cliprrect_with_transform_multiple_clips_iPhone SE (3rd generation)_17.0_simulator.png rename to engine/src/flutter/testing/ios_scenario_app/ios/Scenarios/ScenariosUITests/golden_platform_view_large_cliprrect_with_transform_multiple_clips_iPhone SE (3rd generation)_17.0_simulator.png diff --git a/engine/src/flutter/testing/scenario_app/ios/Scenarios/ScenariosUITests/golden_platform_view_large_cliprrect_with_transform_multiple_clips_impeller_iPhone SE (3rd generation)_17.0_simulator.png b/engine/src/flutter/testing/ios_scenario_app/ios/Scenarios/ScenariosUITests/golden_platform_view_large_cliprrect_with_transform_multiple_clips_impeller_iPhone SE (3rd generation)_17.0_simulator.png similarity index 100% rename from engine/src/flutter/testing/scenario_app/ios/Scenarios/ScenariosUITests/golden_platform_view_large_cliprrect_with_transform_multiple_clips_impeller_iPhone SE (3rd generation)_17.0_simulator.png rename to engine/src/flutter/testing/ios_scenario_app/ios/Scenarios/ScenariosUITests/golden_platform_view_large_cliprrect_with_transform_multiple_clips_impeller_iPhone SE (3rd generation)_17.0_simulator.png diff --git a/engine/src/flutter/testing/scenario_app/ios/Scenarios/ScenariosUITests/golden_platform_view_multiple_background_foreground_iPhone SE (3rd generation)_17.0_simulator.png b/engine/src/flutter/testing/ios_scenario_app/ios/Scenarios/ScenariosUITests/golden_platform_view_multiple_background_foreground_iPhone SE (3rd generation)_17.0_simulator.png similarity index 100% rename from engine/src/flutter/testing/scenario_app/ios/Scenarios/ScenariosUITests/golden_platform_view_multiple_background_foreground_iPhone SE (3rd generation)_17.0_simulator.png rename to engine/src/flutter/testing/ios_scenario_app/ios/Scenarios/ScenariosUITests/golden_platform_view_multiple_background_foreground_iPhone SE (3rd generation)_17.0_simulator.png diff --git a/engine/src/flutter/testing/scenario_app/ios/Scenarios/ScenariosUITests/golden_platform_view_multiple_background_foreground_impeller_iPhone SE (3rd generation)_17.0_simulator.png b/engine/src/flutter/testing/ios_scenario_app/ios/Scenarios/ScenariosUITests/golden_platform_view_multiple_background_foreground_impeller_iPhone SE (3rd generation)_17.0_simulator.png similarity index 100% rename from engine/src/flutter/testing/scenario_app/ios/Scenarios/ScenariosUITests/golden_platform_view_multiple_background_foreground_impeller_iPhone SE (3rd generation)_17.0_simulator.png rename to engine/src/flutter/testing/ios_scenario_app/ios/Scenarios/ScenariosUITests/golden_platform_view_multiple_background_foreground_impeller_iPhone SE (3rd generation)_17.0_simulator.png diff --git a/engine/src/flutter/testing/scenario_app/ios/Scenarios/ScenariosUITests/golden_platform_view_multiple_iPhone SE (3rd generation)_17.0_simulator.png b/engine/src/flutter/testing/ios_scenario_app/ios/Scenarios/ScenariosUITests/golden_platform_view_multiple_iPhone SE (3rd generation)_17.0_simulator.png similarity index 100% rename from engine/src/flutter/testing/scenario_app/ios/Scenarios/ScenariosUITests/golden_platform_view_multiple_iPhone SE (3rd generation)_17.0_simulator.png rename to engine/src/flutter/testing/ios_scenario_app/ios/Scenarios/ScenariosUITests/golden_platform_view_multiple_iPhone SE (3rd generation)_17.0_simulator.png diff --git a/engine/src/flutter/testing/scenario_app/ios/Scenarios/ScenariosUITests/golden_platform_view_multiple_impeller_iPhone SE (3rd generation)_17.0_simulator.png b/engine/src/flutter/testing/ios_scenario_app/ios/Scenarios/ScenariosUITests/golden_platform_view_multiple_impeller_iPhone SE (3rd generation)_17.0_simulator.png similarity index 100% rename from engine/src/flutter/testing/scenario_app/ios/Scenarios/ScenariosUITests/golden_platform_view_multiple_impeller_iPhone SE (3rd generation)_17.0_simulator.png rename to engine/src/flutter/testing/ios_scenario_app/ios/Scenarios/ScenariosUITests/golden_platform_view_multiple_impeller_iPhone SE (3rd generation)_17.0_simulator.png diff --git a/engine/src/flutter/testing/scenario_app/ios/Scenarios/ScenariosUITests/golden_platform_view_opacity_iPhone SE (3rd generation)_17.0_simulator.png b/engine/src/flutter/testing/ios_scenario_app/ios/Scenarios/ScenariosUITests/golden_platform_view_opacity_iPhone SE (3rd generation)_17.0_simulator.png similarity index 100% rename from engine/src/flutter/testing/scenario_app/ios/Scenarios/ScenariosUITests/golden_platform_view_opacity_iPhone SE (3rd generation)_17.0_simulator.png rename to engine/src/flutter/testing/ios_scenario_app/ios/Scenarios/ScenariosUITests/golden_platform_view_opacity_iPhone SE (3rd generation)_17.0_simulator.png diff --git a/engine/src/flutter/testing/scenario_app/ios/Scenarios/ScenariosUITests/golden_platform_view_opacity_impeller_iPhone SE (3rd generation)_17.0_simulator.png b/engine/src/flutter/testing/ios_scenario_app/ios/Scenarios/ScenariosUITests/golden_platform_view_opacity_impeller_iPhone SE (3rd generation)_17.0_simulator.png similarity index 100% rename from engine/src/flutter/testing/scenario_app/ios/Scenarios/ScenariosUITests/golden_platform_view_opacity_impeller_iPhone SE (3rd generation)_17.0_simulator.png rename to engine/src/flutter/testing/ios_scenario_app/ios/Scenarios/ScenariosUITests/golden_platform_view_opacity_impeller_iPhone SE (3rd generation)_17.0_simulator.png diff --git a/engine/src/flutter/testing/scenario_app/ios/Scenarios/ScenariosUITests/golden_platform_view_rotate_iPhone SE (3rd generation)_17.0_simulator.png b/engine/src/flutter/testing/ios_scenario_app/ios/Scenarios/ScenariosUITests/golden_platform_view_rotate_iPhone SE (3rd generation)_17.0_simulator.png similarity index 100% rename from engine/src/flutter/testing/scenario_app/ios/Scenarios/ScenariosUITests/golden_platform_view_rotate_iPhone SE (3rd generation)_17.0_simulator.png rename to engine/src/flutter/testing/ios_scenario_app/ios/Scenarios/ScenariosUITests/golden_platform_view_rotate_iPhone SE (3rd generation)_17.0_simulator.png diff --git a/engine/src/flutter/testing/scenario_app/ios/Scenarios/ScenariosUITests/golden_platform_view_rotate_impeller_iPhone SE (3rd generation)_17.0_simulator.png b/engine/src/flutter/testing/ios_scenario_app/ios/Scenarios/ScenariosUITests/golden_platform_view_rotate_impeller_iPhone SE (3rd generation)_17.0_simulator.png similarity index 100% rename from engine/src/flutter/testing/scenario_app/ios/Scenarios/ScenariosUITests/golden_platform_view_rotate_impeller_iPhone SE (3rd generation)_17.0_simulator.png rename to engine/src/flutter/testing/ios_scenario_app/ios/Scenarios/ScenariosUITests/golden_platform_view_rotate_impeller_iPhone SE (3rd generation)_17.0_simulator.png diff --git a/engine/src/flutter/testing/scenario_app/ios/Scenarios/ScenariosUITests/golden_platform_view_transform_iPhone SE (3rd generation)_17.0_simulator.png b/engine/src/flutter/testing/ios_scenario_app/ios/Scenarios/ScenariosUITests/golden_platform_view_transform_iPhone SE (3rd generation)_17.0_simulator.png similarity index 100% rename from engine/src/flutter/testing/scenario_app/ios/Scenarios/ScenariosUITests/golden_platform_view_transform_iPhone SE (3rd generation)_17.0_simulator.png rename to engine/src/flutter/testing/ios_scenario_app/ios/Scenarios/ScenariosUITests/golden_platform_view_transform_iPhone SE (3rd generation)_17.0_simulator.png diff --git a/engine/src/flutter/testing/scenario_app/ios/Scenarios/ScenariosUITests/golden_platform_view_transform_impeller_iPhone SE (3rd generation)_17.0_simulator.png b/engine/src/flutter/testing/ios_scenario_app/ios/Scenarios/ScenariosUITests/golden_platform_view_transform_impeller_iPhone SE (3rd generation)_17.0_simulator.png similarity index 100% rename from engine/src/flutter/testing/scenario_app/ios/Scenarios/ScenariosUITests/golden_platform_view_transform_impeller_iPhone SE (3rd generation)_17.0_simulator.png rename to engine/src/flutter/testing/ios_scenario_app/ios/Scenarios/ScenariosUITests/golden_platform_view_transform_impeller_iPhone SE (3rd generation)_17.0_simulator.png diff --git a/engine/src/flutter/testing/scenario_app/ios/Scenarios/ScenariosUITests/golden_platform_view_with_negative_backdrop_filter_iPhone SE (3rd generation)_17.0_simulator.png b/engine/src/flutter/testing/ios_scenario_app/ios/Scenarios/ScenariosUITests/golden_platform_view_with_negative_backdrop_filter_iPhone SE (3rd generation)_17.0_simulator.png similarity index 100% rename from engine/src/flutter/testing/scenario_app/ios/Scenarios/ScenariosUITests/golden_platform_view_with_negative_backdrop_filter_iPhone SE (3rd generation)_17.0_simulator.png rename to engine/src/flutter/testing/ios_scenario_app/ios/Scenarios/ScenariosUITests/golden_platform_view_with_negative_backdrop_filter_iPhone SE (3rd generation)_17.0_simulator.png diff --git a/engine/src/flutter/testing/scenario_app/ios/Scenarios/ScenariosUITests/golden_platform_view_with_negative_backdrop_filter_impeller_iPhone SE (3rd generation)_17.0_simulator.png b/engine/src/flutter/testing/ios_scenario_app/ios/Scenarios/ScenariosUITests/golden_platform_view_with_negative_backdrop_filter_impeller_iPhone SE (3rd generation)_17.0_simulator.png similarity index 100% rename from engine/src/flutter/testing/scenario_app/ios/Scenarios/ScenariosUITests/golden_platform_view_with_negative_backdrop_filter_impeller_iPhone SE (3rd generation)_17.0_simulator.png rename to engine/src/flutter/testing/ios_scenario_app/ios/Scenarios/ScenariosUITests/golden_platform_view_with_negative_backdrop_filter_impeller_iPhone SE (3rd generation)_17.0_simulator.png diff --git a/engine/src/flutter/testing/scenario_app/ios/Scenarios/ScenariosUITests/golden_platform_view_with_other_backdrop_filter_iPhone SE (3rd generation)_17.0_simulator.png b/engine/src/flutter/testing/ios_scenario_app/ios/Scenarios/ScenariosUITests/golden_platform_view_with_other_backdrop_filter_iPhone SE (3rd generation)_17.0_simulator.png similarity index 100% rename from engine/src/flutter/testing/scenario_app/ios/Scenarios/ScenariosUITests/golden_platform_view_with_other_backdrop_filter_iPhone SE (3rd generation)_17.0_simulator.png rename to engine/src/flutter/testing/ios_scenario_app/ios/Scenarios/ScenariosUITests/golden_platform_view_with_other_backdrop_filter_iPhone SE (3rd generation)_17.0_simulator.png diff --git a/engine/src/flutter/testing/scenario_app/ios/Scenarios/ScenariosUITests/golden_platform_view_with_other_backdrop_filter_impeller_iPhone SE (3rd generation)_17.0_simulator.png b/engine/src/flutter/testing/ios_scenario_app/ios/Scenarios/ScenariosUITests/golden_platform_view_with_other_backdrop_filter_impeller_iPhone SE (3rd generation)_17.0_simulator.png similarity index 100% rename from engine/src/flutter/testing/scenario_app/ios/Scenarios/ScenariosUITests/golden_platform_view_with_other_backdrop_filter_impeller_iPhone SE (3rd generation)_17.0_simulator.png rename to engine/src/flutter/testing/ios_scenario_app/ios/Scenarios/ScenariosUITests/golden_platform_view_with_other_backdrop_filter_impeller_iPhone SE (3rd generation)_17.0_simulator.png diff --git a/engine/src/flutter/testing/scenario_app/ios/Scenarios/ScenariosUITests/golden_spawn_engine_works_iPhone SE (3rd generation)_17.0_simulator.png b/engine/src/flutter/testing/ios_scenario_app/ios/Scenarios/ScenariosUITests/golden_spawn_engine_works_iPhone SE (3rd generation)_17.0_simulator.png similarity index 100% rename from engine/src/flutter/testing/scenario_app/ios/Scenarios/ScenariosUITests/golden_spawn_engine_works_iPhone SE (3rd generation)_17.0_simulator.png rename to engine/src/flutter/testing/ios_scenario_app/ios/Scenarios/ScenariosUITests/golden_spawn_engine_works_iPhone SE (3rd generation)_17.0_simulator.png diff --git a/engine/src/flutter/testing/scenario_app/ios/Scenarios/ScenariosUITests/golden_spawn_engine_works_impeller_iPhone SE (3rd generation)_17.0_simulator.png b/engine/src/flutter/testing/ios_scenario_app/ios/Scenarios/ScenariosUITests/golden_spawn_engine_works_impeller_iPhone SE (3rd generation)_17.0_simulator.png similarity index 100% rename from engine/src/flutter/testing/scenario_app/ios/Scenarios/ScenariosUITests/golden_spawn_engine_works_impeller_iPhone SE (3rd generation)_17.0_simulator.png rename to engine/src/flutter/testing/ios_scenario_app/ios/Scenarios/ScenariosUITests/golden_spawn_engine_works_impeller_iPhone SE (3rd generation)_17.0_simulator.png diff --git a/engine/src/flutter/testing/scenario_app/ios/Scenarios/ScenariosUITests/golden_two_platform_view_clip_path_iPhone SE (3rd generation)_17.0_simulator.png b/engine/src/flutter/testing/ios_scenario_app/ios/Scenarios/ScenariosUITests/golden_two_platform_view_clip_path_iPhone SE (3rd generation)_17.0_simulator.png similarity index 100% rename from engine/src/flutter/testing/scenario_app/ios/Scenarios/ScenariosUITests/golden_two_platform_view_clip_path_iPhone SE (3rd generation)_17.0_simulator.png rename to engine/src/flutter/testing/ios_scenario_app/ios/Scenarios/ScenariosUITests/golden_two_platform_view_clip_path_iPhone SE (3rd generation)_17.0_simulator.png diff --git a/engine/src/flutter/testing/scenario_app/ios/Scenarios/ScenariosUITests/golden_two_platform_view_clip_path_impeller_iPhone SE (3rd generation)_17.0_simulator.png b/engine/src/flutter/testing/ios_scenario_app/ios/Scenarios/ScenariosUITests/golden_two_platform_view_clip_path_impeller_iPhone SE (3rd generation)_17.0_simulator.png similarity index 100% rename from engine/src/flutter/testing/scenario_app/ios/Scenarios/ScenariosUITests/golden_two_platform_view_clip_path_impeller_iPhone SE (3rd generation)_17.0_simulator.png rename to engine/src/flutter/testing/ios_scenario_app/ios/Scenarios/ScenariosUITests/golden_two_platform_view_clip_path_impeller_iPhone SE (3rd generation)_17.0_simulator.png diff --git a/engine/src/flutter/testing/scenario_app/ios/Scenarios/ScenariosUITests/golden_two_platform_view_clip_path_multiple_clips_iPhone SE (3rd generation)_17.0_simulator.png b/engine/src/flutter/testing/ios_scenario_app/ios/Scenarios/ScenariosUITests/golden_two_platform_view_clip_path_multiple_clips_iPhone SE (3rd generation)_17.0_simulator.png similarity index 100% rename from engine/src/flutter/testing/scenario_app/ios/Scenarios/ScenariosUITests/golden_two_platform_view_clip_path_multiple_clips_iPhone SE (3rd generation)_17.0_simulator.png rename to engine/src/flutter/testing/ios_scenario_app/ios/Scenarios/ScenariosUITests/golden_two_platform_view_clip_path_multiple_clips_iPhone SE (3rd generation)_17.0_simulator.png diff --git a/engine/src/flutter/testing/scenario_app/ios/Scenarios/ScenariosUITests/golden_two_platform_view_clip_path_multiple_clips_impeller_iPhone SE (3rd generation)_17.0_simulator.png b/engine/src/flutter/testing/ios_scenario_app/ios/Scenarios/ScenariosUITests/golden_two_platform_view_clip_path_multiple_clips_impeller_iPhone SE (3rd generation)_17.0_simulator.png similarity index 100% rename from engine/src/flutter/testing/scenario_app/ios/Scenarios/ScenariosUITests/golden_two_platform_view_clip_path_multiple_clips_impeller_iPhone SE (3rd generation)_17.0_simulator.png rename to engine/src/flutter/testing/ios_scenario_app/ios/Scenarios/ScenariosUITests/golden_two_platform_view_clip_path_multiple_clips_impeller_iPhone SE (3rd generation)_17.0_simulator.png diff --git a/engine/src/flutter/testing/scenario_app/ios/Scenarios/ScenariosUITests/golden_two_platform_view_clip_rect_iPhone SE (3rd generation)_17.0_simulator.png b/engine/src/flutter/testing/ios_scenario_app/ios/Scenarios/ScenariosUITests/golden_two_platform_view_clip_rect_iPhone SE (3rd generation)_17.0_simulator.png similarity index 100% rename from engine/src/flutter/testing/scenario_app/ios/Scenarios/ScenariosUITests/golden_two_platform_view_clip_rect_iPhone SE (3rd generation)_17.0_simulator.png rename to engine/src/flutter/testing/ios_scenario_app/ios/Scenarios/ScenariosUITests/golden_two_platform_view_clip_rect_iPhone SE (3rd generation)_17.0_simulator.png diff --git a/engine/src/flutter/testing/scenario_app/ios/Scenarios/ScenariosUITests/golden_two_platform_view_clip_rect_impeller_iPhone SE (3rd generation)_17.0_simulator.png b/engine/src/flutter/testing/ios_scenario_app/ios/Scenarios/ScenariosUITests/golden_two_platform_view_clip_rect_impeller_iPhone SE (3rd generation)_17.0_simulator.png similarity index 100% rename from engine/src/flutter/testing/scenario_app/ios/Scenarios/ScenariosUITests/golden_two_platform_view_clip_rect_impeller_iPhone SE (3rd generation)_17.0_simulator.png rename to engine/src/flutter/testing/ios_scenario_app/ios/Scenarios/ScenariosUITests/golden_two_platform_view_clip_rect_impeller_iPhone SE (3rd generation)_17.0_simulator.png diff --git a/engine/src/flutter/testing/scenario_app/ios/Scenarios/ScenariosUITests/golden_two_platform_view_clip_rect_multiple_clips_iPhone SE (3rd generation)_17.0_simulator.png b/engine/src/flutter/testing/ios_scenario_app/ios/Scenarios/ScenariosUITests/golden_two_platform_view_clip_rect_multiple_clips_iPhone SE (3rd generation)_17.0_simulator.png similarity index 100% rename from engine/src/flutter/testing/scenario_app/ios/Scenarios/ScenariosUITests/golden_two_platform_view_clip_rect_multiple_clips_iPhone SE (3rd generation)_17.0_simulator.png rename to engine/src/flutter/testing/ios_scenario_app/ios/Scenarios/ScenariosUITests/golden_two_platform_view_clip_rect_multiple_clips_iPhone SE (3rd generation)_17.0_simulator.png diff --git a/engine/src/flutter/testing/scenario_app/ios/Scenarios/ScenariosUITests/golden_two_platform_view_clip_rect_multiple_clips_impeller_iPhone SE (3rd generation)_17.0_simulator.png b/engine/src/flutter/testing/ios_scenario_app/ios/Scenarios/ScenariosUITests/golden_two_platform_view_clip_rect_multiple_clips_impeller_iPhone SE (3rd generation)_17.0_simulator.png similarity index 100% rename from engine/src/flutter/testing/scenario_app/ios/Scenarios/ScenariosUITests/golden_two_platform_view_clip_rect_multiple_clips_impeller_iPhone SE (3rd generation)_17.0_simulator.png rename to engine/src/flutter/testing/ios_scenario_app/ios/Scenarios/ScenariosUITests/golden_two_platform_view_clip_rect_multiple_clips_impeller_iPhone SE (3rd generation)_17.0_simulator.png diff --git a/engine/src/flutter/testing/scenario_app/ios/Scenarios/ScenariosUITests/golden_two_platform_view_clip_rrect_iPhone SE (3rd generation)_17.0_simulator.png b/engine/src/flutter/testing/ios_scenario_app/ios/Scenarios/ScenariosUITests/golden_two_platform_view_clip_rrect_iPhone SE (3rd generation)_17.0_simulator.png similarity index 100% rename from engine/src/flutter/testing/scenario_app/ios/Scenarios/ScenariosUITests/golden_two_platform_view_clip_rrect_iPhone SE (3rd generation)_17.0_simulator.png rename to engine/src/flutter/testing/ios_scenario_app/ios/Scenarios/ScenariosUITests/golden_two_platform_view_clip_rrect_iPhone SE (3rd generation)_17.0_simulator.png diff --git a/engine/src/flutter/testing/scenario_app/ios/Scenarios/ScenariosUITests/golden_two_platform_view_clip_rrect_impeller_iPhone SE (3rd generation)_17.0_simulator.png b/engine/src/flutter/testing/ios_scenario_app/ios/Scenarios/ScenariosUITests/golden_two_platform_view_clip_rrect_impeller_iPhone SE (3rd generation)_17.0_simulator.png similarity index 100% rename from engine/src/flutter/testing/scenario_app/ios/Scenarios/ScenariosUITests/golden_two_platform_view_clip_rrect_impeller_iPhone SE (3rd generation)_17.0_simulator.png rename to engine/src/flutter/testing/ios_scenario_app/ios/Scenarios/ScenariosUITests/golden_two_platform_view_clip_rrect_impeller_iPhone SE (3rd generation)_17.0_simulator.png diff --git a/engine/src/flutter/testing/scenario_app/ios/Scenarios/ScenariosUITests/golden_two_platform_view_clip_rrect_multiple_clips_iPhone SE (3rd generation)_17.0_simulator.png b/engine/src/flutter/testing/ios_scenario_app/ios/Scenarios/ScenariosUITests/golden_two_platform_view_clip_rrect_multiple_clips_iPhone SE (3rd generation)_17.0_simulator.png similarity index 100% rename from engine/src/flutter/testing/scenario_app/ios/Scenarios/ScenariosUITests/golden_two_platform_view_clip_rrect_multiple_clips_iPhone SE (3rd generation)_17.0_simulator.png rename to engine/src/flutter/testing/ios_scenario_app/ios/Scenarios/ScenariosUITests/golden_two_platform_view_clip_rrect_multiple_clips_iPhone SE (3rd generation)_17.0_simulator.png diff --git a/engine/src/flutter/testing/scenario_app/ios/Scenarios/ScenariosUITests/golden_two_platform_view_clip_rrect_multiple_clips_impeller_iPhone SE (3rd generation)_17.0_simulator.png b/engine/src/flutter/testing/ios_scenario_app/ios/Scenarios/ScenariosUITests/golden_two_platform_view_clip_rrect_multiple_clips_impeller_iPhone SE (3rd generation)_17.0_simulator.png similarity index 100% rename from engine/src/flutter/testing/scenario_app/ios/Scenarios/ScenariosUITests/golden_two_platform_view_clip_rrect_multiple_clips_impeller_iPhone SE (3rd generation)_17.0_simulator.png rename to engine/src/flutter/testing/ios_scenario_app/ios/Scenarios/ScenariosUITests/golden_two_platform_view_clip_rrect_multiple_clips_impeller_iPhone SE (3rd generation)_17.0_simulator.png diff --git a/engine/src/flutter/testing/scenario_app/ios/Scenarios/ScenariosUITests/golden_two_platform_views_with_other_backdrop_filter_iPhone SE (3rd generation)_17.0_simulator.png b/engine/src/flutter/testing/ios_scenario_app/ios/Scenarios/ScenariosUITests/golden_two_platform_views_with_other_backdrop_filter_iPhone SE (3rd generation)_17.0_simulator.png similarity index 100% rename from engine/src/flutter/testing/scenario_app/ios/Scenarios/ScenariosUITests/golden_two_platform_views_with_other_backdrop_filter_iPhone SE (3rd generation)_17.0_simulator.png rename to engine/src/flutter/testing/ios_scenario_app/ios/Scenarios/ScenariosUITests/golden_two_platform_views_with_other_backdrop_filter_iPhone SE (3rd generation)_17.0_simulator.png diff --git a/engine/src/flutter/testing/scenario_app/ios/Scenarios/ScenariosUITests/golden_two_platform_views_with_other_backdrop_filter_impeller_iPhone SE (3rd generation)_17.0_simulator.png b/engine/src/flutter/testing/ios_scenario_app/ios/Scenarios/ScenariosUITests/golden_two_platform_views_with_other_backdrop_filter_impeller_iPhone SE (3rd generation)_17.0_simulator.png similarity index 100% rename from engine/src/flutter/testing/scenario_app/ios/Scenarios/ScenariosUITests/golden_two_platform_views_with_other_backdrop_filter_impeller_iPhone SE (3rd generation)_17.0_simulator.png rename to engine/src/flutter/testing/ios_scenario_app/ios/Scenarios/ScenariosUITests/golden_two_platform_views_with_other_backdrop_filter_impeller_iPhone SE (3rd generation)_17.0_simulator.png diff --git a/engine/src/flutter/testing/scenario_app/ios/Scenarios/ScenariosUITests/iPadGestureTests.m b/engine/src/flutter/testing/ios_scenario_app/ios/Scenarios/ScenariosUITests/iPadGestureTests.m similarity index 100% rename from engine/src/flutter/testing/scenario_app/ios/Scenarios/ScenariosUITests/iPadGestureTests.m rename to engine/src/flutter/testing/ios_scenario_app/ios/Scenarios/ScenariosUITests/iPadGestureTests.m diff --git a/engine/src/flutter/testing/scenario_app/ios/app_stub.c b/engine/src/flutter/testing/ios_scenario_app/ios/app_stub.c similarity index 100% rename from engine/src/flutter/testing/scenario_app/ios/app_stub.c rename to engine/src/flutter/testing/ios_scenario_app/ios/app_stub.c diff --git a/engine/src/flutter/testing/scenario_app/lib/main.dart b/engine/src/flutter/testing/ios_scenario_app/lib/main.dart similarity index 100% rename from engine/src/flutter/testing/scenario_app/lib/main.dart rename to engine/src/flutter/testing/ios_scenario_app/lib/main.dart diff --git a/engine/src/flutter/testing/scenario_app/lib/src/animated_color_square.dart b/engine/src/flutter/testing/ios_scenario_app/lib/src/animated_color_square.dart similarity index 100% rename from engine/src/flutter/testing/scenario_app/lib/src/animated_color_square.dart rename to engine/src/flutter/testing/ios_scenario_app/lib/src/animated_color_square.dart diff --git a/engine/src/flutter/testing/scenario_app/lib/src/bogus_font_text.dart b/engine/src/flutter/testing/ios_scenario_app/lib/src/bogus_font_text.dart similarity index 100% rename from engine/src/flutter/testing/scenario_app/lib/src/bogus_font_text.dart rename to engine/src/flutter/testing/ios_scenario_app/lib/src/bogus_font_text.dart diff --git a/engine/src/flutter/testing/scenario_app/lib/src/channel_util.dart b/engine/src/flutter/testing/ios_scenario_app/lib/src/channel_util.dart similarity index 100% rename from engine/src/flutter/testing/scenario_app/lib/src/channel_util.dart rename to engine/src/flutter/testing/ios_scenario_app/lib/src/channel_util.dart diff --git a/engine/src/flutter/testing/scenario_app/lib/src/darwin_app_extension_scenario.dart b/engine/src/flutter/testing/ios_scenario_app/lib/src/darwin_app_extension_scenario.dart similarity index 100% rename from engine/src/flutter/testing/scenario_app/lib/src/darwin_app_extension_scenario.dart rename to engine/src/flutter/testing/ios_scenario_app/lib/src/darwin_app_extension_scenario.dart diff --git a/engine/src/flutter/testing/scenario_app/lib/src/darwin_system_font.dart b/engine/src/flutter/testing/ios_scenario_app/lib/src/darwin_system_font.dart similarity index 100% rename from engine/src/flutter/testing/scenario_app/lib/src/darwin_system_font.dart rename to engine/src/flutter/testing/ios_scenario_app/lib/src/darwin_system_font.dart diff --git a/engine/src/flutter/testing/scenario_app/lib/src/get_bitmap_scenario.dart b/engine/src/flutter/testing/ios_scenario_app/lib/src/get_bitmap_scenario.dart similarity index 100% rename from engine/src/flutter/testing/scenario_app/lib/src/get_bitmap_scenario.dart rename to engine/src/flutter/testing/ios_scenario_app/lib/src/get_bitmap_scenario.dart diff --git a/engine/src/flutter/testing/scenario_app/lib/src/initial_route_reply.dart b/engine/src/flutter/testing/ios_scenario_app/lib/src/initial_route_reply.dart similarity index 100% rename from engine/src/flutter/testing/scenario_app/lib/src/initial_route_reply.dart rename to engine/src/flutter/testing/ios_scenario_app/lib/src/initial_route_reply.dart diff --git a/engine/src/flutter/testing/scenario_app/lib/src/locale_initialization.dart b/engine/src/flutter/testing/ios_scenario_app/lib/src/locale_initialization.dart similarity index 100% rename from engine/src/flutter/testing/scenario_app/lib/src/locale_initialization.dart rename to engine/src/flutter/testing/ios_scenario_app/lib/src/locale_initialization.dart diff --git a/engine/src/flutter/testing/scenario_app/lib/src/platform_view.dart b/engine/src/flutter/testing/ios_scenario_app/lib/src/platform_view.dart similarity index 100% rename from engine/src/flutter/testing/scenario_app/lib/src/platform_view.dart rename to engine/src/flutter/testing/ios_scenario_app/lib/src/platform_view.dart diff --git a/engine/src/flutter/testing/scenario_app/lib/src/poppable_screen.dart b/engine/src/flutter/testing/ios_scenario_app/lib/src/poppable_screen.dart similarity index 100% rename from engine/src/flutter/testing/scenario_app/lib/src/poppable_screen.dart rename to engine/src/flutter/testing/ios_scenario_app/lib/src/poppable_screen.dart diff --git a/engine/src/flutter/testing/scenario_app/lib/src/scenario.dart b/engine/src/flutter/testing/ios_scenario_app/lib/src/scenario.dart similarity index 100% rename from engine/src/flutter/testing/scenario_app/lib/src/scenario.dart rename to engine/src/flutter/testing/ios_scenario_app/lib/src/scenario.dart diff --git a/engine/src/flutter/testing/scenario_app/lib/src/scenarios.dart b/engine/src/flutter/testing/ios_scenario_app/lib/src/scenarios.dart similarity index 100% rename from engine/src/flutter/testing/scenario_app/lib/src/scenarios.dart rename to engine/src/flutter/testing/ios_scenario_app/lib/src/scenarios.dart diff --git a/engine/src/flutter/testing/scenario_app/lib/src/solid_blue.dart b/engine/src/flutter/testing/ios_scenario_app/lib/src/solid_blue.dart similarity index 100% rename from engine/src/flutter/testing/scenario_app/lib/src/solid_blue.dart rename to engine/src/flutter/testing/ios_scenario_app/lib/src/solid_blue.dart diff --git a/engine/src/flutter/testing/scenario_app/lib/src/texture.dart b/engine/src/flutter/testing/ios_scenario_app/lib/src/texture.dart similarity index 100% rename from engine/src/flutter/testing/scenario_app/lib/src/texture.dart rename to engine/src/flutter/testing/ios_scenario_app/lib/src/texture.dart diff --git a/engine/src/flutter/testing/scenario_app/lib/src/touches_scenario.dart b/engine/src/flutter/testing/ios_scenario_app/lib/src/touches_scenario.dart similarity index 100% rename from engine/src/flutter/testing/scenario_app/lib/src/touches_scenario.dart rename to engine/src/flutter/testing/ios_scenario_app/lib/src/touches_scenario.dart diff --git a/engine/src/flutter/testing/scenario_app/pubspec.yaml b/engine/src/flutter/testing/ios_scenario_app/pubspec.yaml similarity index 95% rename from engine/src/flutter/testing/scenario_app/pubspec.yaml rename to engine/src/flutter/testing/ios_scenario_app/pubspec.yaml index b720088b87..fb655502b3 100644 --- a/engine/src/flutter/testing/scenario_app/pubspec.yaml +++ b/engine/src/flutter/testing/ios_scenario_app/pubspec.yaml @@ -2,7 +2,7 @@ # Use of this source code is governed by a BSD-style license that can be # found in the LICENSE file. -name: scenario_app +name: ios_scenario_app publish_to: none # Required for workspace support. diff --git a/engine/src/flutter/testing/scenario_app/run_ios_tests.sh b/engine/src/flutter/testing/ios_scenario_app/run_ios_tests.sh similarity index 95% rename from engine/src/flutter/testing/scenario_app/run_ios_tests.sh rename to engine/src/flutter/testing/ios_scenario_app/run_ios_tests.sh index 901396d01d..07b620def0 100755 --- a/engine/src/flutter/testing/scenario_app/run_ios_tests.sh +++ b/engine/src/flutter/testing/ios_scenario_app/run_ios_tests.sh @@ -41,5 +41,5 @@ DART="${DART_BIN}/dart" "$DART" \ --disable-dart-dev \ - testing/scenario_app/bin/run_ios_tests.dart \ + testing/ios_scenario_app/bin/run_ios_tests.dart \ "$@" diff --git a/engine/src/flutter/testing/run_tests.py b/engine/src/flutter/testing/run_tests.py index 8c602e54cf..9022e4be30 100755 --- a/engine/src/flutter/testing/run_tests.py +++ b/engine/src/flutter/testing/run_tests.py @@ -766,13 +766,6 @@ def run_android_tests(android_variant='android_debug_unopt', adb_path=None): run_android_unittest('flutter_shell_native_unittests', android_variant, adb_path) run_android_unittest('impeller_toolkit_android_unittests', android_variant, adb_path) - systrace_test = os.path.join(BUILDROOT_DIR, 'flutter', 'testing', 'android_systrace_test.py') - scenario_apk = os.path.join(OUT_DIR, android_variant, 'firebase_apks', 'scenario_app.apk') - run_cmd([ - systrace_test, '--adb-path', adb_path, '--apk-path', scenario_apk, '--package-name', - 'dev.flutter.scenarios', '--activity-name', '.PlatformViewsActivity' - ]) - def run_objc_tests(ios_variant='ios_debug_sim_unopt', test_filter=None): """Runs Objective-C XCTest unit tests for the iOS embedding""" @@ -970,7 +963,6 @@ def build_dart_host_test_list(build_dir): os.path.join('flutter', 'ci'), os.path.join('flutter', 'flutter_frontend_server'), os.path.join('flutter', 'testing', 'skia_gold_client'), - os.path.join('flutter', 'testing', 'scenario_app'), os.path.join('flutter', 'tools', 'api_check'), os.path.join('flutter', 'tools', 'build_bucket_golden_scraper'), os.path.join('flutter', 'tools', 'clang_tidy'), diff --git a/engine/src/flutter/testing/scenario_app/README.md b/engine/src/flutter/testing/scenario_app/README.md deleted file mode 100644 index 8e2fb2ad66..0000000000 --- a/engine/src/flutter/testing/scenario_app/README.md +++ /dev/null @@ -1,46 +0,0 @@ -# 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 Android and iOS-specific embedding code that simulates the -use of the engine in a real app (such as plugins and platform views). - -The [`bin/run_android_tests.dart`](bin/run_android_tests.dart) and -[`run_ios_tests.sh`](run_ios_tests.sh) are then used to run the tests on a -connected device or emulator. - -See also: - -- [File an issue][file_issue] with the `e: scenario-app` label. -- [`bin/`](bin/), the entry point for running Android integration tests. -- [`lib/`](lib/), the Dart code and instrumentation for the scenario app. -- [`ios/`](ios/), the iOS-side native code and tests. -- [`android/`](android/), the Android-side native code and tests. - -[file_issue]: https://github.com/flutter/flutter/issues/new?labels=e:%20scenario-app,engine,team-engine - -## Running a smoke test on Firebase TestLab - -To run the smoke test on Firebase TestLab test, build `android_profile_arm64`, -and run [`./ci/firebase_testlab.py`](../../ci/firebase_testlab.py), or pass -`--variant` to run a different configuration. - -```sh -# From the root of the engine repository -$ ./ci/firebase_testlab.py --variant android_debug_arm64 -``` - -> [!NOTE] -> These instructions were not verified at the time of writing/refactoring. - -## 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 Android or iOS app by calling `set_scenario` on -platform channel `driver`. diff --git a/engine/src/flutter/testing/scenario_app/android/.gitignore b/engine/src/flutter/testing/scenario_app/android/.gitignore deleted file mode 100644 index 88b214e755..0000000000 --- a/engine/src/flutter/testing/scenario_app/android/.gitignore +++ /dev/null @@ -1,15 +0,0 @@ -*.iml -.gradle -/local.properties -.settings -/.idea/caches -/.idea/libraries -/.idea/modules.xml -/.idea/workspace.xml -/.idea/navEditor.xml -/.idea/assetWizardSettings.xml -.DS_Store -/build -/captures -.externalNativeBuild -.cache diff --git a/engine/src/flutter/testing/scenario_app/android/BUILD.gn b/engine/src/flutter/testing/scenario_app/android/BUILD.gn deleted file mode 100644 index 31b3169ba9..0000000000 --- a/engine/src/flutter/testing/scenario_app/android/BUILD.gn +++ /dev/null @@ -1,89 +0,0 @@ -# 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("//flutter/testing/rules/android.gni") - -_android_sources = [ - "app/build.gradle", - "app/src/androidTest/java/dev/flutter/TestRunner.java", - "app/src/androidTest/java/dev/flutter/scenarios/ExampleInstrumentedTest.java", - "app/src/androidTest/java/dev/flutter/scenariosui/DrawSolidBlueScreenTest.java", - "app/src/androidTest/java/dev/flutter/scenariosui/ExternalTextureTests.java", - "app/src/androidTest/java/dev/flutter/scenariosui/MemoryLeakTests.java", - "app/src/androidTest/java/dev/flutter/scenariosui/PlatformTextureUiTests.java", - "app/src/androidTest/java/dev/flutter/scenariosui/PlatformViewUiTests.java", - "app/src/androidTest/java/dev/flutter/scenariosui/PlatformViewWithSurfaceViewBadContextUiTest.java", - "app/src/androidTest/java/dev/flutter/scenariosui/PlatformViewWithSurfaceViewHybridFallbackUiTest.java", - "app/src/androidTest/java/dev/flutter/scenariosui/PlatformViewWithSurfaceViewHybridUiTest.java", - "app/src/androidTest/java/dev/flutter/scenariosui/PlatformViewWithSurfaceViewUiTest.java", - "app/src/androidTest/java/dev/flutter/scenariosui/PlatformViewWithTextureViewUiTest.java", - "app/src/androidTest/java/dev/flutter/scenariosui/ScreenshotUtil.java", - "app/src/androidTest/java/dev/flutter/scenariosui/SpawnEngineTests.java", - "app/src/androidTest/java/dev/flutter/scenariosui/SpawnMultiEngineTest.java", - "app/src/main/AndroidManifest.xml", - "app/src/main/assets/sample.mp4", - "app/src/main/java/dev/flutter/scenarios/ExternalTextureFlutterActivity.java", - "app/src/main/java/dev/flutter/scenarios/PlatformViewsActivity.java", - "app/src/main/java/dev/flutter/scenarios/SpawnMultiEngineActivity.java", - "app/src/main/java/dev/flutter/scenarios/SpawnedEngineActivity.java", - "app/src/main/java/dev/flutter/scenarios/SurfacePlatformViewFactory.java", - "app/src/main/java/dev/flutter/scenarios/TestActivity.java", - "app/src/main/java/dev/flutter/scenarios/TestableFlutterActivity.java", - "app/src/main/java/dev/flutter/scenarios/TextPlatformViewFactory.java", - "app/src/main/java/dev/flutter/scenarios/TexturePlatformViewFactory.java", - "app/src/main/res/values/colors.xml", - "app/src/main/res/values/styles.xml", - "app/src/main/res/xml/data_extraction_rules.xml", - "app/src/main/res/xml/extraction_config_11_and_below.xml", - "build.gradle", -] - -gradle_task("android_lint") { - app_name = "scenario_app" - task = "lint" - gradle_project_dir = rebase_path(".") - sources = _android_sources - outputs = [ "$root_out_dir/scenario_app/reports/lint-results.xml" ] - deps = [ "//flutter/testing/scenario_app:scenario_app_snapshot" ] -} - -gradle_task("build_apk") { - app_name = "scenario_app" - task = "assembleDebug" - gradle_project_dir = rebase_path(".") - sources = _android_sources - outputs = [ "$root_out_dir/scenario_app/app/outputs/apk/debug/app-debug.apk" ] - - deps = [ - ":android_lint", - "//flutter/testing/scenario_app:scenario_app_snapshot", - ] -} - -gradle_task("build_test_apk") { - app_name = "scenario_app" - task = ":app:packageDebugAndroidTest" - gradle_project_dir = rebase_path(".") - sources = _android_sources - outputs = [ "$root_out_dir/scenario_app/app/outputs/apk/androidTest/debug/app-debug-androidTest.apk" ] - - deps = [ - ":android_lint", - "//flutter/testing/scenario_app:scenario_app_snapshot", - ] -} - -copy("firebase_apk") { - sources = get_target_outputs(":build_apk") - outputs = [ "$root_out_dir/firebase_apks/scenario_app.apk" ] - deps = [ ":build_apk" ] -} - -group("android") { - deps = [ - ":build_apk", - ":build_test_apk", - ":firebase_apk", - ] -} diff --git a/engine/src/flutter/testing/scenario_app/android/README.md b/engine/src/flutter/testing/scenario_app/android/README.md deleted file mode 100644 index 65164ac91a..0000000000 --- a/engine/src/flutter/testing/scenario_app/android/README.md +++ /dev/null @@ -1,391 +0,0 @@ -# Scenario App: Android Tests and Test Runner - -End-to-end tests and test infrastructure for the Flutter engine on Android. - -> [!IMPORTANT] -> There are several **known issues** with this test suite: -> -> - [#144407](https://github.com/flutter/flutter/issues/144407): "Newer Android" -> tests are missing expected cropping and rotation. -> - [#144365](https://github.com/flutter/flutter/issues/144365): Tests that use -> `ExternalTextureFlutterActivity` sometimes do not render. -> - [#144232](https://github.com/flutter/flutter/issues/144232): Impeller Vulkan -> sometimes hangs on emulators. -> - [#144352](https://github.com/flutter/flutter/issues/144352): Skia Gold -> sometimes is missing expected diffs. - ---- - -Top topics covered in this document include (but are not limited to): - -- [Running the Tests](#running-the-tests) -- [Contributing](#contributing) -- [Project History](#project-history) -- [Troubleshooting](#troubleshooting) -- [Getting Help](#getting-help) - -## Introduction - -This package simulates a Flutter app that uses the engine (`dart:ui`) only, in -conjunction with Android-specific embedding code that simulates the use of the -engine in a real app (such as plugins and platform views). - -A custom test runner, [`run_android_tests.dart`](bin/run_android_tests.dart), is -used to run the tests on a connected device or emulator, and report the results, -including screenshots (golden files) and logs from `adb logcat`. - -In the following architecture diagram: - -> href="https://github.com/flutter/flutter/wiki/The-Engine-architecture" -> title="The Engine architecture"> width="300" -> alt="Anatomy of a Flutter app" -> src="https://raw.githubusercontent.com/flutter/engine/main/docs/app_anatomy.svg" -> /> - -- The Dart app is represented by [`lib/main.dart`](../lib/main.dart). -- There is no framework code. -- `dart:ui` and the engine are the same as in a real app. -- Android-specific application code is in this directory - ([`android/`](./)). -- The runner is a _custom_ test runner, - [`run_android_tests.dart`](bin/run_android_tests.dart). - -### Scope of Testing - -The tests in this package are end-to-end tests that _specifically_ exercise the -engine and Android-specific embedding code. They are not [unit tests][1] for the -engine or the framework, and are not designed to test the behavior of the -framework or specific plugins, but rather to simulate the use of a framework -or plugins downstream of the engine. - -In other words, we test "does the engine work on Android?" without a dependency -on either the Flutter framework, Flutter tooling, or any specific plugins. - -[1]: ../../../shell/platform/android - -### Golden Comparisons - -Many of the Android-specific interactions with the engine are visual, such as -[external textures](https://api.flutter.dev/flutter/widgets/Texture-class.html) -or [platform views](https://docs.flutter.dev/platform-integration/android/platform-views), -and as such, the tests in this package use golden screenshot file comparisons to -verify the correctness of the engine's output. - -For example, in [`ExternalTextureTests_testMediaSurface`](https://flutter-engine-gold.skia.org/search?corpus=flutter-engine&include_ignored=false&left_filter=name%3DExternalTextureTests_testMediaSurface&max_rgba=0&min_rgba=0&negative=true¬_at_head=false&positive=true&reference_image_required=false&right_filter=&sort=descending&untriaged=true), a [video](app/src/main/assets/sample.mp4) is converted to an external texture and displayed in a Flutter app. The test takes a screenshot of the app and compares it to a golden file: - -Two pictures, the top one Flutter and the bottom Android - -_The top picture is the Flutter app, and the bottom picture is just Android._ - -See also: - -- [`tools/compare_goldens`](../../../tools/compare_goldens). - -## Prerequisites - -If you've never worked in the `flutter/engine` repository before, you will -need to setup a development environment that is quite different from a typical -Flutter app or even working on the Flutter framework. It will take roughly -30 minutes to an hour to setup an environment, depending on your familiarity -with the tools and the speed of your internet connection. - -See also: - -- [Setting up the Engine](https://github.com/flutter/flutter/wiki/Setting-up-the-Engine-development-environment) -- [Rebuilding the Tests](#rebuilding-the-tests) - -### Android SDK - -It's highly recommended to use the engine's vendored Android SDK, which once -you have the engine set up, you can find at -`$ENGINE/src/flutter/third_party/android_tools/sdk`. Testing or running with -other versions of the SDK may work, but it's _not guaranteed_, and might have -different results. - -Consider also placing this directory in the `ANDROID_HOME` environment variable: - -```sh -export ANDROID_HOME=$ENGINE/src/flutter/third_party/android_tools/sdk -``` - -### Device or Emulator - -The tests in this package require a connected device or emulator to run. The -device or emulator should be running the same version of Android as the CI -configuration (there are issues with crashes and other problems on older -emulators in particular). - -> [!CAUTION] -> -> [#144561](https://github.com/flutter/flutter/issues/144561): The emulator -> vendored in the engine checkout is old and [has a known issue with Vulkan](https://github.com/flutter/flutter/issues/144232). -> -> If you're working locally, you can update your copy by running: -> -> ```sh -> $ANDROID_HOME/cmdline-tools/latest/bin/sdkmanager --install emulator -> ``` - -### Additional Dependencies - -While not required, it is **strongly recommended** to use an IDE such as -[Android Studio](https://developer.android.com/studio) when contributing to the -Android side of the test suite, as it will provide a better development -experience such as code completion, debugging, and more: - -Screenshot of Android Studio with Autocompletion - -> [!TIP] -> -> Android Studio is expected to work _out of the box_ in this directory. -> -> If you encounter any issues, please [file a bug](#getting-help). - -## Running the Tests - -The [test runner](../bin/run_android_tests.dart) is a Dart script that installs -the test app and test suite on a connected device or emulator, runs the tests, -and reports the results including screenshots (golden files) and logs from -`adb logcat`. - -From the `$ENGINE/src/flutter` directory, run: - -```sh -dart ./testing/scenario_app/bin/run_android_tests.dart -``` - -By default when run locally, the test runner: - -- Uses the engine-wide default graphics backend for Android. -- Uses the last built Android-specific engine artifacts (i.e. `$ENGINE/src/out/android_*/`). -- Will not diff screenshots, but does save them to a logs directory. - -### Rebuilding the Tests - -If you've made changes to any file in `scenario_app`, incluing the Dart code -in `lib/` or the Android code in `android/`, you will need to rebuild the -tests before running them. - -To rebuild the `scenario_app` for the `android_debug_unopt_arm64` variant: - -```sh -ninja -C out/android_debug_unopt_arm64 scenario_app -``` - -See also: - -- [Compiling the Engine](https://github.com/flutter/flutter/wiki/Compiling-the-engine) - -### Common Options - -A list of options can be found by running: - -```sh -dart ./testing/scenario_app/bin/run_android_tests.dart --help -``` - -Frequently used options include: - -- `--out-dir`: Which engine artifacts to use (e.g. - `--out-dir=../out/android_debug_unopt_arm64`). - -- `--logs-dir`: Where to save full `adb logcat` logs and screenshots. - -- `--[no]-enable-impeller`: Enables/disables use of the Impeller graphics - backend. - -- `--impeller-backend`: Use a specific Impeller backend (e.g. - `--impeller-backend=opengles`). - -- `--force-surface-producer-surface-texture`: Force the use of `SurfaceTexture`s - for plugin code that uses `SurfaceProducer`s. This instruments the same code - path that is used for Android API versions that are <= 28 without requiring - an older emulator or device. - -- `--smoke-test=`: Runs a specific test, instead of all tests. - -### Advanced Options - -When debugging the runner itself, you can use the `--verbose` flag to see more -detailed output, including additional options such as configuring which binary -of `adb` to use: - -```sh -dart ./testing/scenario_app/bin/run_android_tests.dart --help --verbose -``` - -See also: - -- [`bin/utils/options.dart`](../bin/utils/options.dart). - -### CI Configuration - -See [`ci/builders`](../../../ci/builders) and grep for `run_android_tests.dart`: - -```sh -grep -r run_android_tests.dart ci/builders -``` - -> [!NOTE] -> The Impeller OpenGLES backend tests are only run on staging (`bringup: true`) -> and as such are **non-blocking**. We expect to stabilize and run these tests -> as part of a wider release of the Impeller OpenGLES backend. - -#### Older Android - -"Older Android" refers to "code paths to support older Android API levels". -Specifically, these configurations use -`--force-surface-producer-surface-texture` (see [above](#common-options) for -details). - -| Backend | CI Configuration | CI History | Skia Gold | -| ----------------- | --------------------------- | ---------------------------------------------- | ------------------------- | -| Skia | [`ci/builders`][skia-st-ci] | [Presubmit][skia-try], [Postsubmit][skia-prod] | [Skia Gold][skia-st-gold] | -| Impeller OpenGLES | [`ci/builders`][imp-st-ci] | [Staging][imp-staging] | N/A | - -[skia-try]: https://ci.chromium.org/ui/p/flutter/builders/try/Linux%20linux_android_emulator_skia_tests -[skia-prod]: https://ci.chromium.org/ui/p/flutter/builders/prod/Linux%20linux_android_emulator_skia_tests -[imp-staging]: https://ci.chromium.org/ui/p/flutter/builders/staging/Linux%20linux_android_emulator_opengles_tests -[impeller-try]: https://ci.chromium.org/ui/p/flutter/builders/try/Linux%20linux_android_emulator_tests -[impeller-prod]: https://ci.chromium.org/ui/p/flutter/builders/prod/Linux%20linux_android_emulator_tests -[skia-st-ci]: https://github.com/search?q=repo%3Aflutter%2Fengine+path%3Aci%2Fbuilders+%22--no-enable-impeller%22+%22run_android_tests.dart%22+%22--force-surface-producer-surface-texture%22&type=code -[skia-st-gold]: https://flutter-engine-gold.skia.org/search?left_filter=ForceSurfaceProducerSurfaceTexture%3Dtrue%26GraphicsBackend%3Dskia&negative=true&positive=true&right_filter=AndroidAPILevel%3D34%26GraphicsBackend%3Dskia -[imp-st-ci]: https://github.com/search?q=repo%3Aflutter%2Fengine+path%3Aci%2Fbuilders+%22--impeller-backend%3Dopengles%22+%22run_android_tests.dart%22+%22--force-surface-producer-surface-texture%22&type=code -[imp-st-gold]: https://flutter-engine-gold.skia.org/search?left_filter=ForceSurfaceProducerSurfaceTexture%3Dtrue%26GraphicsBackend%3Dimpeller-opengles&negative=true&positive=true&right_filter=AndroidAPILevel%3D34%26GraphicsBackend%3Dskia - -#### Newer Android - -| Backend | CI Configuration | CI History | Skia Gold | -| ----------------- | ---------------------------- | ------------------------------------------------------ | ------------------------ | -| Skia | [`ci/builders`][skia-ci] | [Presubmit][skia-try], [Postsubmit][skia-prod] | [Skia Gold][skia-gold] | -| Impeller OpenGLES | [`ci/builders`][imp-gles-ci] | [Staging][imp-staging] | N/A | -| Impeller Vulkan | [`ci/builders`][imp-vk-ci] | [Presubmit][impeller-try], [Postsubmit][impeller-prod] | [Skia Gold][imp-vk-gold] | - -[skia-ci]: https://github.com/search?q=repo%3Aflutter%2Fengine+path%3Aci%2Fbuilders+%22--no-enable-impeller%22+%22run_android_tests.dart%22&type=code -[skia-gold]: https://flutter-engine-gold.skia.org/search?left_filter=ForceSurfaceProducerSurfaceTexture%3Dfalse%26GraphicsBackend%3Dskia&negative=true&positive=true&right_filter=AndroidAPILevel%3D34%26GraphicsBackend%3Dskia -[imp-gles-ci]: https://github.com/search?q=repo%3Aflutter%2Fengine+path%3Aci%2Fbuilders+%22--impeller-backend%3Dopengles%22+%22run_android_tests.dart%22&type=code -[imp-vk-ci]: https://github.com/search?q=repo%3Aflutter%2Fengine+path%3Aci%2Fbuilders+%22--impeller-backend%3Dvulkan%22+%22run_android_tests.dart%22&type=code -[imp-vk-gold]: https://flutter-engine-gold.skia.org/search?left_filter=ForceSurfaceProducerSurfaceTexture%3Dfalse%26GraphicsBackend%3Dimpeller-vulkan&negative=true&positive=true&right_filter=AndroidAPILevel%3D34%26GraphicsBackend%3Dskia - -## Contributing - -[![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) - -Contributions to this package are welcome, as it is a critical part of the -engine's test suite. - -### Anatomy of a Test - -A "test" in practice is a combination of roughly 3 components: - -1. An Android _[JUnit test][]_ that configures and launches an Android activity. -2. An Android _[activity][]_, which simulates the Android side of a plugin or - platform view. -3. A Dart _[scenario][]_, which simulates the Flutter side of an application. - -[junit test]: ./app/src/androidTest/java/dev/flutter/scenariosui/DrawSolidBlueScreenTest.java -[activity]: ./app/src/main/java/dev/flutter/scenarios/ExternalTextureFlutterActivity.java -[scenario]: ../lib/src/solid_blue.dart - -While every test suite has exactly one JUnit-instrumented class, each test can -have many activities and scenarios, each with their own configuration, setup, -and assertions. Not all of this is desirable, but it is the current state of -the test suite. - -A test might also take a screenshot. See the _Skia Gold_ links in -[CI Configuration](#ci-configuration) for examples. - -### Project History - -This test suite was [originally written in 2019](https://github.com/flutter/engine/pull/10007) -with a goal of: - -> \[being\] suitable for embedders to do integration testing with - it has no -> dependencies on the flutter_tools or framework, and so will not fail/flake -> based on variances in those downstream. - -Unfortunately, the Android side of the test suite was never fully operational, -and the tests, even if failing, were accidentally be reported as passing on CI. -In 2024, as the team got closer to shipping our new graphics backend, -[Impeller](https://docs.flutter.dev/perf/impeller) on Android, it was clear that -we needed a reliable test suite for the engine on Android, particularly for -visual tests around external textures and platform views. - -So, this package was revived and updated to be a (more) reliable test suite for -the engine on Android. It's by no means complete -([contributions welcome](#contributing)), but it did successfully catch at least -one bug that would not have been detected automatically otherwise. - -_Go forth and test the engine on Android!_ - -## Troubleshooting - -If you encounter any issues, please [file a bug](#getting-help). - -### My test is failing on CI - -If a test is failing on CI, it's likely that the test is failing locally as -well. Try the steps in [running the Tests](#running-the-tests) to reproduce the -failure locally, and then debug the failure as you would any other test. If this -is your first time working on the engine, you may need to setup a development -environment first (see [prerequisites](#prerequisites)). - -The test runner makes extensive use of logging and screenshots to help debug -failures. If you're not sure where to start, try looking at the logs and -screenshots to see if they provide any clues (you'll need them to file a bug -anyway). - -`test: Android Scenario App Integration Tests (Impeller/Vulkan)` -on [LUCI](https://ci.chromium.org/ui/p/flutter/builders/try/Linux%20Engine%20Drone/2079486/overview) produces these logs: - -![Screenshot of Logs](https://github.com/flutter/flutter/assets/168174/fed8fae6-bcd2-4e6e-a074-c2c37f34a770) - -The files include a screenshot of each test, and a _full_ logcat log from the -device (you might find it easier trying the `stdout` of the test first, which -uses rudimentary log filtering). In the case of multiple runs, the logs are -prefixed with the test configuration and run attempt. - -### Gradle is failing due to an "not part of the dependency lock state" error - -If you update dependencies in the `app/build.gradle` file, you may encounter an -error (probably in CI) that looks like: - -```txt -FAILED: scenario_app/reports/lint-results.xml -vpython3 ../../flutter/testing/rules/run_gradle.py /b/s/w/ir/cache/builder/src/flutter/testing/scenario_app/android lint --no-daemon -Pflutter_jar=/b/s/w/ir/cache/builder/src/out/android_emulator_skia_debug_x64/flutter.jar -Pout_dir=/b/s/w/ir/cache/builder/src/out/android_emulator_skia_debug_x64/scenario_app --project-cache-dir=/b/s/w/ir/cache/builder/src/out/android_emulator_skia_debug_x64/scenario_app/.gradle --gradle-user-home=/b/s/w/ir/cache/builder/src/out/android_emulator_skia_debug_x64/scenario_app/.gradle - -FAILURE: Build failed with an exception. - -* What went wrong: -Execution failed for task ':app:checkDebugAarMetadata'. -> Could not resolve all files for configuration ':app:debugRuntimeClasspath'. - > Resolved 'org.hamcrest:hamcrest-core:1.3' which is not part of the dependency lock state - > Resolved 'com.google.code.findbugs:jsr305:2.0.2' which is not part of the dependency lock state -``` - -This is because [`gradle.lockfile`](./app/gradle.lockfile) is out of date. To -update it, run: - -```sh -cd testing/scenario_app/android -$ENGINE_SRC/flutter/third_party/gradle/bin/gradle app:dependencies --write-locks -``` - -## Getting Help - -To suggest changes, or highlight problems, please [file an issue](https://github.com/flutter/flutter/issues/new?labels=e:%20scenario-app,engine,platform-android,fyi-android,team-engine). - -If you're not sure where to start, or need help debugging or contributing, you -can also reach out to [`hackers-android`](https://discord.com/channels/608014603317936148/846507907876257822) on Discord, or the Flutter engine team internally. There is -no full-time maintainer of this package, so be prepared to do some of the -legwork yourself. diff --git a/engine/src/flutter/testing/scenario_app/android/app/.gitignore b/engine/src/flutter/testing/scenario_app/android/app/.gitignore deleted file mode 100644 index 796b96d1c4..0000000000 --- a/engine/src/flutter/testing/scenario_app/android/app/.gitignore +++ /dev/null @@ -1 +0,0 @@ -/build diff --git a/engine/src/flutter/testing/scenario_app/android/app/build.gradle b/engine/src/flutter/testing/scenario_app/android/app/build.gradle deleted file mode 100644 index 57ed70ea84..0000000000 --- a/engine/src/flutter/testing/scenario_app/android/app/build.gradle +++ /dev/null @@ -1,105 +0,0 @@ -apply plugin: 'com.android.application' -apply plugin: 'kotlin-android' - -android { - namespace = "dev.flutter.scenarios" - lintOptions { - abortOnError true - checkAllWarnings true - showAll true - warningsAsErrors true - checkTestSources true - textOutput 'stdout' - htmlReport false - xmlReport true - xmlOutput file("${rootProject.buildDir}/reports/lint-results.xml") - // UnpackedNativeCode can break stack unwinding - see b/193408481 - // NewerVersionAvailable and GradleDependency need to be taken care of - // by a roller rather than as part of CI. - // The others are irrelevant for a test application. - disable 'UnpackedNativeCode','MissingApplicationIcon','GoogleAppIndexingApiWarning','GoogleAppIndexingWarning','GradleDependency','NewerVersionAvailable','Registered' - } - buildToolsVersion = '35.0.0-rc4' - compileSdk 35 - compileOptions { - sourceCompatibility JavaVersion.VERSION_11 - targetCompatibility JavaVersion.VERSION_11 - } - defaultConfig { - applicationId 'dev.flutter.scenarios' - minSdkVersion 21 - targetSdkVersion 35 - versionCode 1 - versionName '1.0' - testInstrumentationRunner 'dev.flutter.TestRunner' - testInstrumentationRunnerArgument 'listener', 'leakcanary.FailTestOnLeakRunListener' - testInstrumentationRunnerArguments clearPackageData: 'true' - } - buildTypes { - release { - minifyEnabled false - proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro' - } - } - sourceSets.main { - assets.srcDirs += "${project.buildDir}/assets" - if (project.hasProperty('libapp')) { - jni.srcDirs = [] - jniLibs.srcDirs = [project.property('libapp')] - } - } -} - -dependencies { - // Please *don't* add embedding dependencies to this file. - // The embedding dependencies are configured in tools/androidx/files.json. - // Only add test dependencies. - - if (project.hasProperty('flutter_jar')) { - implementation files(project.property('flutter_jar')) - } - implementation 'androidx.constraintlayout:constraintlayout:1.1.3' - implementation 'com.google.android.material:material:1.0.0' - implementation 'androidx.test.ext:junit:1.1.5' - androidTestImplementation 'junit:junit:4.12' - androidTestImplementation 'androidx.test:runner:1.2.0' - androidTestImplementation 'androidx.test:rules:1.2.0' - androidTestImplementation 'androidx.test.espresso:espresso-core:3.2.0' - androidTestImplementation 'com.google.guava:guava:30.1-android' - - def leakcanary_version = '2.7' - androidTestImplementation "com.squareup.leakcanary:leakcanary-android:$leakcanary_version" - androidTestImplementation "com.squareup.leakcanary:leakcanary-android-instrumentation:$leakcanary_version" -} - -// Configure the embedding dependencies. -apply from: new File(rootDir, '../../../tools/androidx/configure.gradle').absolutePath; -configureDependencies(new File(rootDir, '../../..')) { dependency -> - dependencies { - implementation "$dependency" - } -} - -tasks.register('generateLockfiles') { - rootProject.subprojects.each { subproject -> - def gradle = "${rootProject.projectDir}/../../../third_party/gradle/bin/gradle" - rootProject.exec { - workingDir rootProject.projectDir - executable gradle - args ":${subproject.name}:dependencies", "--write-locks" - } - } -} - -// Override the kotlin language/api version to avoid warnings from -// usages in leakcanaary. -tasks.withType(org.jetbrains.kotlin.gradle.tasks.KotlinCompile).all { - sourceCompatibility = JavaVersion.VERSION_1_8 - targetCompatibility = JavaVersion.VERSION_1_8 - - kotlinOptions { - jvmTarget = '1.8' - apiVersion = '1.4' - languageVersion = '1.4' - } -} diff --git a/engine/src/flutter/testing/scenario_app/android/app/proguard-rules.pro b/engine/src/flutter/testing/scenario_app/android/app/proguard-rules.pro deleted file mode 100644 index f1b424510d..0000000000 --- a/engine/src/flutter/testing/scenario_app/android/app/proguard-rules.pro +++ /dev/null @@ -1,21 +0,0 @@ -# Add project specific ProGuard rules here. -# You can control the set of applied configuration files using the -# proguardFiles setting in build.gradle. -# -# For more details, see -# http://developer.android.com/guide/developing/tools/proguard.html - -# If your project uses WebView with JS, uncomment the following -# and specify the fully qualified class name to the JavaScript interface -# class: -#-keepclassmembers class fqcn.of.javascript.interface.for.webview { -# public *; -#} - -# Uncomment this to preserve the line number information for -# debugging stack traces. -#-keepattributes SourceFile,LineNumberTable - -# If you keep the line number information, uncomment this to -# hide the original source file name. -#-renamesourcefileattribute SourceFile diff --git a/engine/src/flutter/testing/scenario_app/android/app/src/androidTest/java/dev/flutter/TestRunner.java b/engine/src/flutter/testing/scenario_app/android/app/src/androidTest/java/dev/flutter/TestRunner.java deleted file mode 100644 index a8dc96ef5a..0000000000 --- a/engine/src/flutter/testing/scenario_app/android/app/src/androidTest/java/dev/flutter/TestRunner.java +++ /dev/null @@ -1,48 +0,0 @@ -// 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. - -package dev.flutter; - -import android.os.Bundle; -import androidx.annotation.Nullable; -import androidx.test.runner.AndroidJUnitRunner; -import dev.flutter.scenariosui.ScreenshotUtil; -import io.flutter.FlutterInjector; -import io.flutter.embedding.engine.renderer.FlutterRenderer; - -public class TestRunner extends AndroidJUnitRunner { - @Override - public void onCreate(@Nullable Bundle arguments) { - String[] engineArguments = null; - assert arguments != null; - if ("true".equals(arguments.getString("enable-impeller"))) { - // Set up the global settings object so that Impeller is enabled for all tests. - engineArguments = - new String[] { - "--enable-impeller=true", - "--impeller-backend=" + arguments.getString("impeller-backend", "vulkan") - }; - } else { - engineArguments = new String[] {"--enable-impeller=false"}; - } - FlutterRenderer.debugDisableSurfaceClear = true; - if ("true".equals(arguments.getString("force-surface-producer-surface-texture"))) { - // Set a test flag to force the SurfaceProducer to use SurfaceTexture. - FlutterRenderer.debugForceSurfaceProducerGlTextures = true; - } - // For consistency, just always initilaize FlutterJNI etc. - FlutterInjector.instance().flutterLoader().startInitialization(getTargetContext()); - FlutterInjector.instance() - .flutterLoader() - .ensureInitializationComplete(getTargetContext(), engineArguments); - ScreenshotUtil.onCreate(); - super.onCreate(arguments); - } - - @Override - public void finish(int resultCode, @Nullable Bundle results) { - ScreenshotUtil.finish(); - super.finish(resultCode, results); - } -} diff --git a/engine/src/flutter/testing/scenario_app/android/app/src/androidTest/java/dev/flutter/scenarios/ExampleInstrumentedTest.java b/engine/src/flutter/testing/scenario_app/android/app/src/androidTest/java/dev/flutter/scenarios/ExampleInstrumentedTest.java deleted file mode 100644 index 61e9a293d0..0000000000 --- a/engine/src/flutter/testing/scenario_app/android/app/src/androidTest/java/dev/flutter/scenarios/ExampleInstrumentedTest.java +++ /dev/null @@ -1,29 +0,0 @@ -// 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. - -package dev.flutter.scenarios; - -import static org.junit.Assert.*; - -import android.content.Context; -import androidx.test.ext.junit.runners.AndroidJUnit4; -import androidx.test.platform.app.InstrumentationRegistry; -import org.junit.Test; -import org.junit.runner.RunWith; - -/** - * Instrumented test, which will execute on an Android device. - * - * @see Testing documentation - */ -@RunWith(AndroidJUnit4.class) -public class ExampleInstrumentedTest { - @Test - public void useAppContext() { - // Context of the app under test. - Context appContext = InstrumentationRegistry.getInstrumentation().getTargetContext(); - - assertEquals("dev.flutter.scenarios", appContext.getPackageName()); - } -} diff --git a/engine/src/flutter/testing/scenario_app/android/app/src/androidTest/java/dev/flutter/scenariosui/DrawSolidBlueScreenTest.java b/engine/src/flutter/testing/scenario_app/android/app/src/androidTest/java/dev/flutter/scenariosui/DrawSolidBlueScreenTest.java deleted file mode 100644 index 35b9ad52e2..0000000000 --- a/engine/src/flutter/testing/scenario_app/android/app/src/androidTest/java/dev/flutter/scenariosui/DrawSolidBlueScreenTest.java +++ /dev/null @@ -1,27 +0,0 @@ -package dev.flutter.scenariosui; - -import android.content.Intent; -import androidx.annotation.NonNull; -import androidx.test.ext.junit.runners.AndroidJUnit4; -import androidx.test.filters.LargeTest; -import androidx.test.rule.ActivityTestRule; -import dev.flutter.scenarios.PlatformViewsActivity; -import org.junit.Rule; -import org.junit.Test; -import org.junit.runner.RunWith; - -@RunWith(AndroidJUnit4.class) -@LargeTest -public final class DrawSolidBlueScreenTest { - @Rule @NonNull - public ActivityTestRule activityRule = - new ActivityTestRule<>( - PlatformViewsActivity.class, /*initialTouchMode=*/ false, /*launchActivity=*/ false); - - @Test - public void test() throws Exception { - Intent intent = new Intent(Intent.ACTION_MAIN); - intent.putExtra("scenario_name", "solid_blue"); - ScreenshotUtil.capture(activityRule.launchActivity(intent), "DrawSolidBlueScreenTest"); - } -} diff --git a/engine/src/flutter/testing/scenario_app/android/app/src/androidTest/java/dev/flutter/scenariosui/ExternalTextureTests.java b/engine/src/flutter/testing/scenario_app/android/app/src/androidTest/java/dev/flutter/scenariosui/ExternalTextureTests.java deleted file mode 100644 index 38383810ae..0000000000 --- a/engine/src/flutter/testing/scenario_app/android/app/src/androidTest/java/dev/flutter/scenariosui/ExternalTextureTests.java +++ /dev/null @@ -1,50 +0,0 @@ -// 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. - -package dev.flutter.scenariosui; - -import android.content.Intent; -import androidx.annotation.NonNull; -import androidx.test.ext.junit.runners.AndroidJUnit4; -import androidx.test.filters.LargeTest; -import androidx.test.rule.ActivityTestRule; -import dev.flutter.scenarios.ExternalTextureFlutterActivity; -import org.junit.Before; -import org.junit.Rule; -import org.junit.Test; -import org.junit.runner.RunWith; - -@RunWith(AndroidJUnit4.class) -@LargeTest -public class ExternalTextureTests { - private Intent intent; - - @Rule @NonNull - public ActivityTestRule activityRule = - new ActivityTestRule<>( - ExternalTextureFlutterActivity.class, - /*initialTouchMode=*/ false, - /*launchActivity=*/ false); - - @Before - public void setUp() { - intent = new Intent(Intent.ACTION_MAIN); - } - - @Test - public void testCanvasSurface() throws Exception { - intent.putExtra("scenario_name", "display_texture"); - intent.putExtra("surface_renderer", "canvas"); - ScreenshotUtil.capture( - activityRule.launchActivity(intent), "ExternalTextureTests_testCanvasSurface"); - } - - @Test - public void testMediaSurface() throws Exception { - intent.putExtra("scenario_name", "display_texture"); - intent.putExtra("surface_renderer", "media"); - ScreenshotUtil.capture( - activityRule.launchActivity(intent), "ExternalTextureTests_testMediaSurface"); - } -} diff --git a/engine/src/flutter/testing/scenario_app/android/app/src/androidTest/java/dev/flutter/scenariosui/MemoryLeakTests.java b/engine/src/flutter/testing/scenario_app/android/app/src/androidTest/java/dev/flutter/scenariosui/MemoryLeakTests.java deleted file mode 100644 index 72df6e3f1b..0000000000 --- a/engine/src/flutter/testing/scenario_app/android/app/src/androidTest/java/dev/flutter/scenariosui/MemoryLeakTests.java +++ /dev/null @@ -1,36 +0,0 @@ -// 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. - -package dev.flutter.scenariosui; - -import android.content.Intent; -import androidx.annotation.NonNull; -import androidx.test.ext.junit.runners.AndroidJUnit4; -import androidx.test.filters.LargeTest; -import androidx.test.rule.ActivityTestRule; -import dev.flutter.scenarios.PlatformViewsActivity; -import leakcanary.FailTestOnLeak; -import org.junit.Rule; -import org.junit.Test; -import org.junit.runner.RunWith; - -@RunWith(AndroidJUnit4.class) -@LargeTest -public class MemoryLeakTests { - @Rule @NonNull - public ActivityTestRule activityRule = - new ActivityTestRule<>( - PlatformViewsActivity.class, /*initialTouchMode=*/ false, /*launchActivity=*/ false); - - @Test - @FailTestOnLeak - public void platformViewHybridComposition_launchActivityFinishAndLaunchAgain() throws Exception { - Intent intent = new Intent(Intent.ACTION_MAIN); - intent.putExtra("scenario_name", "platform_view"); - intent.putExtra("use_android_view", true); - intent.putExtra("view_type", PlatformViewsActivity.TEXT_VIEW_PV); - - activityRule.launchActivity(intent); - } -} diff --git a/engine/src/flutter/testing/scenario_app/android/app/src/androidTest/java/dev/flutter/scenariosui/PlatformTextureUiTests.java b/engine/src/flutter/testing/scenario_app/android/app/src/androidTest/java/dev/flutter/scenariosui/PlatformTextureUiTests.java deleted file mode 100644 index dda4c04278..0000000000 --- a/engine/src/flutter/testing/scenario_app/android/app/src/androidTest/java/dev/flutter/scenariosui/PlatformTextureUiTests.java +++ /dev/null @@ -1,131 +0,0 @@ -// 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. - -package dev.flutter.scenariosui; - -import android.app.Instrumentation; -import android.content.Intent; -import android.content.pm.ActivityInfo; -import androidx.annotation.NonNull; -import androidx.test.ext.junit.runners.AndroidJUnit4; -import androidx.test.filters.LargeTest; -import androidx.test.platform.app.InstrumentationRegistry; -import androidx.test.rule.ActivityTestRule; -import dev.flutter.scenarios.PlatformViewsActivity; -import org.junit.Before; -import org.junit.Rule; -import org.junit.Test; -import org.junit.runner.RunWith; - -@RunWith(AndroidJUnit4.class) -@LargeTest -public class PlatformTextureUiTests { - private Instrumentation instrumentation; - private Intent intent; - - @Rule @NonNull - public ActivityTestRule activityRule = - new ActivityTestRule<>( - PlatformViewsActivity.class, /*initialTouchMode=*/ false, /*launchActivity=*/ false); - - private static String goldName(String suffix) { - return "PlatformTextureUiTests_" + suffix; - } - - @Before - public void setUp() { - instrumentation = InstrumentationRegistry.getInstrumentation(); - intent = new Intent(Intent.ACTION_MAIN); - // Render a texture. - intent.putExtra("use_android_view", false); - intent.putExtra("view_type", PlatformViewsActivity.TEXT_VIEW_PV); - } - - @Test - public void testPlatformView() throws Exception { - intent.putExtra("scenario_name", "platform_view"); - ScreenshotUtil.capture(activityRule.launchActivity(intent), goldName("testPlatformView")); - } - - @Test - public void testPlatformViewMultiple() throws Exception { - intent.putExtra("scenario_name", "platform_view_multiple"); - ScreenshotUtil.capture( - activityRule.launchActivity(intent), goldName("testPlatformViewMultiple")); - } - - @Test - public void testPlatformViewMultipleBackgroundForeground() throws Exception { - intent.putExtra("scenario_name", "platform_view_multiple_background_foreground"); - ScreenshotUtil.capture( - activityRule.launchActivity(intent), - goldName("testPlatformViewMultipleBackgroundForeground")); - } - - @Test - public void testPlatformViewCliprect() throws Exception { - intent.putExtra("scenario_name", "platform_view_cliprect"); - ScreenshotUtil.capture( - activityRule.launchActivity(intent), goldName("testPlatformViewCliprect")); - } - - @Test - public void testPlatformViewCliprrect() throws Exception { - intent.putExtra("scenario_name", "platform_view_cliprrect"); - ScreenshotUtil.capture( - activityRule.launchActivity(intent), goldName("testPlatformViewCliprrect")); - } - - @Test - public void testPlatformViewClippath() throws Exception { - intent.putExtra("scenario_name", "platform_view_clippath"); - ScreenshotUtil.capture( - activityRule.launchActivity(intent), goldName("testPlatformViewClippath")); - } - - @Test - public void testPlatformViewTransform() throws Exception { - intent.putExtra("scenario_name", "platform_view_transform"); - ScreenshotUtil.capture( - activityRule.launchActivity(intent), goldName("testPlatformViewTransform")); - } - - @Test - public void testPlatformViewOpacity() throws Exception { - intent.putExtra("scenario_name", "platform_view_opacity"); - ScreenshotUtil.capture( - activityRule.launchActivity(intent), goldName("testPlatformViewOpacity")); - } - - @Test - public void testPlatformViewRotate() throws Exception { - intent.putExtra("scenario_name", "platform_view_rotate"); - PlatformViewsActivity activity = activityRule.launchActivity(intent); - activity.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE); - instrumentation.waitForIdleSync(); - ScreenshotUtil.capture(activity, goldName("testPlatformViewRotate")); - } - - @Test - public void testPlatformViewMultipleWithoutOverlays() throws Exception { - intent.putExtra("scenario_name", "platform_view_multiple_without_overlays"); - ScreenshotUtil.capture( - activityRule.launchActivity(intent), goldName("testPlatformViewMultipleWithoutOverlays")); - } - - @Test - public void testPlatformViewTwoIntersectingOverlays() throws Exception { - intent.putExtra("scenario_name", "platform_view_two_intersecting_overlays"); - ScreenshotUtil.capture( - activityRule.launchActivity(intent), goldName("testPlatformViewTwoIntersectingOverlays")); - } - - @Test - public void testPlatformViewWithoutOverlayIntersection() throws Exception { - intent.putExtra("scenario_name", "platform_view_no_overlay_intersection"); - ScreenshotUtil.capture( - activityRule.launchActivity(intent), - goldName("testPlatformViewWithoutOverlayIntersection")); - } -} diff --git a/engine/src/flutter/testing/scenario_app/android/app/src/androidTest/java/dev/flutter/scenariosui/PlatformViewUiTests.java b/engine/src/flutter/testing/scenario_app/android/app/src/androidTest/java/dev/flutter/scenariosui/PlatformViewUiTests.java deleted file mode 100644 index 3a9aca458a..0000000000 --- a/engine/src/flutter/testing/scenario_app/android/app/src/androidTest/java/dev/flutter/scenariosui/PlatformViewUiTests.java +++ /dev/null @@ -1,131 +0,0 @@ -// 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. - -package dev.flutter.scenariosui; - -import android.app.Instrumentation; -import android.content.Intent; -import android.content.pm.ActivityInfo; -import androidx.annotation.NonNull; -import androidx.test.ext.junit.runners.AndroidJUnit4; -import androidx.test.filters.LargeTest; -import androidx.test.platform.app.InstrumentationRegistry; -import androidx.test.rule.ActivityTestRule; -import dev.flutter.scenarios.PlatformViewsActivity; -import org.junit.Before; -import org.junit.Rule; -import org.junit.Test; -import org.junit.runner.RunWith; - -@RunWith(AndroidJUnit4.class) -@LargeTest -public class PlatformViewUiTests { - private Instrumentation instrumentation; - private Intent intent; - - @Rule @NonNull - public ActivityTestRule activityRule = - new ActivityTestRule<>( - PlatformViewsActivity.class, /*initialTouchMode=*/ false, /*launchActivity=*/ false); - - private static String goldName(String suffix) { - return "PlatformViewUiTests_" + suffix; - } - - @Before - public void setUp() { - instrumentation = InstrumentationRegistry.getInstrumentation(); - intent = new Intent(Intent.ACTION_MAIN); - // Render a native android view. - intent.putExtra("use_android_view", true); - intent.putExtra("view_type", PlatformViewsActivity.TEXT_VIEW_PV); - } - - @Test - public void testPlatformView() throws Exception { - intent.putExtra("scenario_name", "platform_view"); - ScreenshotUtil.capture(activityRule.launchActivity(intent), goldName("testPlatformView")); - } - - @Test - public void testPlatformViewMultiple() throws Exception { - intent.putExtra("scenario_name", "platform_view_multiple"); - ScreenshotUtil.capture( - activityRule.launchActivity(intent), goldName("testPlatformViewMultiple")); - } - - @Test - public void testPlatformViewMultipleBackgroundForeground() throws Exception { - intent.putExtra("scenario_name", "platform_view_multiple_background_foreground"); - ScreenshotUtil.capture( - activityRule.launchActivity(intent), - goldName("testPlatformViewMultipleBackgroundForeground")); - } - - @Test - public void testPlatformViewCliprect() throws Exception { - intent.putExtra("scenario_name", "platform_view_cliprect"); - ScreenshotUtil.capture( - activityRule.launchActivity(intent), goldName("testPlatformViewCliprect")); - } - - @Test - public void testPlatformViewCliprrect() throws Exception { - intent.putExtra("scenario_name", "platform_view_cliprrect"); - ScreenshotUtil.capture( - activityRule.launchActivity(intent), goldName("testPlatformViewCliprrect")); - } - - @Test - public void testPlatformViewClippath() throws Exception { - intent.putExtra("scenario_name", "platform_view_clippath"); - ScreenshotUtil.capture( - activityRule.launchActivity(intent), goldName("testPlatformViewClippath")); - } - - @Test - public void testPlatformViewTransform() throws Exception { - intent.putExtra("scenario_name", "platform_view_transform"); - ScreenshotUtil.capture( - activityRule.launchActivity(intent), goldName("testPlatformViewTransform")); - } - - @Test - public void testPlatformViewOpacity() throws Exception { - intent.putExtra("scenario_name", "platform_view_opacity"); - ScreenshotUtil.capture( - activityRule.launchActivity(intent), goldName("testPlatformViewOpacity")); - } - - @Test - public void testPlatformViewRotate() throws Exception { - intent.putExtra("scenario_name", "platform_view_rotate"); - PlatformViewsActivity activity = activityRule.launchActivity(intent); - activity.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE); - instrumentation.waitForIdleSync(); - ScreenshotUtil.capture(activity, goldName("testPlatformViewRotate")); - } - - @Test - public void testPlatformViewMultipleWithoutOverlays() throws Exception { - intent.putExtra("scenario_name", "platform_view_multiple_without_overlays"); - ScreenshotUtil.capture( - activityRule.launchActivity(intent), goldName("testPlatformViewMultipleWithoutOverlays")); - } - - @Test - public void testPlatformViewTwoIntersectingOverlays() throws Exception { - intent.putExtra("scenario_name", "platform_view_two_intersecting_overlays"); - ScreenshotUtil.capture( - activityRule.launchActivity(intent), goldName("testPlatformViewTwoIntersectingOverlays")); - } - - @Test - public void testPlatformViewWithoutOverlayIntersection() throws Exception { - intent.putExtra("scenario_name", "platform_view_no_overlay_intersection"); - ScreenshotUtil.capture( - activityRule.launchActivity(intent), - goldName("testPlatformViewWithoutOverlayIntersection")); - } -} diff --git a/engine/src/flutter/testing/scenario_app/android/app/src/androidTest/java/dev/flutter/scenariosui/PlatformViewWithSurfaceViewBadContextUiTest.java b/engine/src/flutter/testing/scenario_app/android/app/src/androidTest/java/dev/flutter/scenariosui/PlatformViewWithSurfaceViewBadContextUiTest.java deleted file mode 100644 index 46892d5d8e..0000000000 --- a/engine/src/flutter/testing/scenario_app/android/app/src/androidTest/java/dev/flutter/scenariosui/PlatformViewWithSurfaceViewBadContextUiTest.java +++ /dev/null @@ -1,45 +0,0 @@ -// 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. - -package dev.flutter.scenariosui; - -import android.content.Intent; -import androidx.annotation.NonNull; -import androidx.test.ext.junit.runners.AndroidJUnit4; -import androidx.test.filters.LargeTest; -import androidx.test.rule.ActivityTestRule; -import dev.flutter.scenarios.PlatformViewsActivity; -import org.junit.Before; -import org.junit.Rule; -import org.junit.Test; -import org.junit.runner.RunWith; - -@RunWith(AndroidJUnit4.class) -@LargeTest -public class PlatformViewWithSurfaceViewBadContextUiTest { - Intent intent; - - @Rule @NonNull - public ActivityTestRule activityRule = - new ActivityTestRule<>( - PlatformViewsActivity.class, /*initialTouchMode=*/ false, /*launchActivity=*/ false); - - private static String goldName(String suffix) { - return "PlatformViewWithSurfaceViewBadContextUiTest_" + suffix; - } - - @Before - public void setUp() { - intent = new Intent(Intent.ACTION_MAIN); - // Render a texture. - intent.putExtra("use_android_view", false); - intent.putExtra("view_type", PlatformViewsActivity.SURFACE_VIEW_BAD_CONTEXT_PV); - } - - @Test - public void testPlatformView() throws Exception { - intent.putExtra("scenario_name", "platform_view"); - ScreenshotUtil.capture(activityRule.launchActivity(intent), goldName("testPlatformView")); - } -} diff --git a/engine/src/flutter/testing/scenario_app/android/app/src/androidTest/java/dev/flutter/scenariosui/PlatformViewWithSurfaceViewHybridFallbackUiTest.java b/engine/src/flutter/testing/scenario_app/android/app/src/androidTest/java/dev/flutter/scenariosui/PlatformViewWithSurfaceViewHybridFallbackUiTest.java deleted file mode 100644 index b0e37456dd..0000000000 --- a/engine/src/flutter/testing/scenario_app/android/app/src/androidTest/java/dev/flutter/scenariosui/PlatformViewWithSurfaceViewHybridFallbackUiTest.java +++ /dev/null @@ -1,47 +0,0 @@ -// 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. - -package dev.flutter.scenariosui; - -import android.content.Intent; -import androidx.annotation.NonNull; -import androidx.test.ext.junit.runners.AndroidJUnit4; -import androidx.test.filters.LargeTest; -import androidx.test.rule.ActivityTestRule; -import dev.flutter.scenarios.PlatformViewsActivity; -import org.junit.Before; -import org.junit.Rule; -import org.junit.Test; -import org.junit.runner.RunWith; - -@RunWith(AndroidJUnit4.class) -@LargeTest -public class PlatformViewWithSurfaceViewHybridFallbackUiTest { - Intent intent; - - @Rule @NonNull - public ActivityTestRule activityRule = - new ActivityTestRule<>( - PlatformViewsActivity.class, /*initialTouchMode=*/ false, /*launchActivity=*/ false); - - private static String goldName(String suffix) { - return "PlatformViewWithSurfaceViewHybridFallbackUiTest_" + suffix; - } - - @Before - public void setUp() { - intent = new Intent(Intent.ACTION_MAIN); - // Request TLHC with fallback to HC. - intent.putExtra("use_android_view", false); - intent.putExtra("expect_android_view_fallback", true); - // Use a SurfaceView to trigger fallback. - intent.putExtra("view_type", PlatformViewsActivity.SURFACE_VIEW_PV); - } - - @Test - public void testPlatformView() throws Exception { - intent.putExtra("scenario_name", "platform_view"); - ScreenshotUtil.capture(activityRule.launchActivity(intent), goldName("testPlatformView")); - } -} diff --git a/engine/src/flutter/testing/scenario_app/android/app/src/androidTest/java/dev/flutter/scenariosui/PlatformViewWithSurfaceViewHybridUiTest.java b/engine/src/flutter/testing/scenario_app/android/app/src/androidTest/java/dev/flutter/scenariosui/PlatformViewWithSurfaceViewHybridUiTest.java deleted file mode 100644 index 0200b439bb..0000000000 --- a/engine/src/flutter/testing/scenario_app/android/app/src/androidTest/java/dev/flutter/scenariosui/PlatformViewWithSurfaceViewHybridUiTest.java +++ /dev/null @@ -1,44 +0,0 @@ -// 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. - -package dev.flutter.scenariosui; - -import android.content.Intent; -import androidx.annotation.NonNull; -import androidx.test.ext.junit.runners.AndroidJUnit4; -import androidx.test.filters.LargeTest; -import androidx.test.rule.ActivityTestRule; -import dev.flutter.scenarios.PlatformViewsActivity; -import org.junit.Before; -import org.junit.Rule; -import org.junit.Test; -import org.junit.runner.RunWith; - -@RunWith(AndroidJUnit4.class) -@LargeTest -public class PlatformViewWithSurfaceViewHybridUiTest { - Intent intent; - - @Rule @NonNull - public ActivityTestRule activityRule = - new ActivityTestRule<>( - PlatformViewsActivity.class, /*initialTouchMode=*/ false, /*launchActivity=*/ false); - - private static String goldName(String suffix) { - return "PlatformViewWithSurfaceViewHybridUiTest_" + suffix; - } - - @Before - public void setUp() { - intent = new Intent(Intent.ACTION_MAIN); - intent.putExtra("use_android_view", true); - intent.putExtra("view_type", PlatformViewsActivity.SURFACE_VIEW_PV); - } - - @Test - public void testPlatformView() throws Exception { - intent.putExtra("scenario_name", "platform_view"); - ScreenshotUtil.capture(activityRule.launchActivity(intent), goldName("testPlatformView")); - } -} diff --git a/engine/src/flutter/testing/scenario_app/android/app/src/androidTest/java/dev/flutter/scenariosui/PlatformViewWithSurfaceViewUiTest.java b/engine/src/flutter/testing/scenario_app/android/app/src/androidTest/java/dev/flutter/scenariosui/PlatformViewWithSurfaceViewUiTest.java deleted file mode 100644 index 67680def2e..0000000000 --- a/engine/src/flutter/testing/scenario_app/android/app/src/androidTest/java/dev/flutter/scenariosui/PlatformViewWithSurfaceViewUiTest.java +++ /dev/null @@ -1,143 +0,0 @@ -// 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. - -package dev.flutter.scenariosui; - -import android.app.Instrumentation; -import android.content.Intent; -import android.content.pm.ActivityInfo; -import androidx.annotation.NonNull; -import androidx.test.ext.junit.runners.AndroidJUnit4; -import androidx.test.filters.LargeTest; -import androidx.test.platform.app.InstrumentationRegistry; -import androidx.test.rule.ActivityTestRule; -import dev.flutter.scenarios.PlatformViewsActivity; -import org.junit.Before; -import org.junit.Ignore; -import org.junit.Rule; -import org.junit.Test; -import org.junit.runner.RunWith; - -@RunWith(AndroidJUnit4.class) -@LargeTest -public class PlatformViewWithSurfaceViewUiTest { - private Instrumentation instrumentation; - private Intent intent; - - @Rule @NonNull - public ActivityTestRule activityRule = - new ActivityTestRule<>( - PlatformViewsActivity.class, /*initialTouchMode=*/ false, /*launchActivity=*/ false); - - private static String goldName(String suffix) { - return "PlatformViewWithSurfaceViewUiTest_" + suffix; - } - - @Before - public void setUp() { - instrumentation = InstrumentationRegistry.getInstrumentation(); - intent = new Intent(Intent.ACTION_MAIN); - // Render a texture. - intent.putExtra("use_android_view", false); - intent.putExtra("view_type", PlatformViewsActivity.SURFACE_VIEW_PV); - } - - @Test - public void testPlatformView() throws Exception { - intent.putExtra("scenario_name", "platform_view"); - ScreenshotUtil.capture(activityRule.launchActivity(intent), goldName("testPlatformView")); - } - - @Test - public void testPlatformViewMultiple() throws Exception { - intent.putExtra("scenario_name", "platform_view_multiple"); - ScreenshotUtil.capture( - activityRule.launchActivity(intent), goldName("testPlatformViewMultiple")); - } - - @Test - public void testPlatformViewMultipleBackgroundForeground() throws Exception { - intent.putExtra("scenario_name", "platform_view_multiple_background_foreground"); - ScreenshotUtil.capture( - activityRule.launchActivity(intent), - goldName("testPlatformViewMultipleBackgroundForeground")); - } - - @Test - public void testPlatformViewCliprect() throws Exception { - intent.putExtra("scenario_name", "platform_view_cliprect"); - ScreenshotUtil.capture( - activityRule.launchActivity(intent), goldName("testPlatformViewCliprect")); - } - - @Test - public void testPlatformViewCliprrect() throws Exception { - intent.putExtra("scenario_name", "platform_view_cliprrect"); - ScreenshotUtil.capture( - activityRule.launchActivity(intent), goldName("testPlatformViewCliprrect")); - } - - @Test - public void testPlatformViewClippath() throws Exception { - intent.putExtra("scenario_name", "platform_view_clippath"); - ScreenshotUtil.capture( - activityRule.launchActivity(intent), goldName("testPlatformViewClippath")); - } - - @Test - public void testPlatformViewTransform() throws Exception { - intent.putExtra("scenario_name", "platform_view_transform"); - ScreenshotUtil.capture( - activityRule.launchActivity(intent), goldName("testPlatformViewTransform")); - } - - @Test - public void testPlatformViewOpacity() throws Exception { - intent.putExtra("scenario_name", "platform_view_opacity"); - ScreenshotUtil.capture( - activityRule.launchActivity(intent), goldName("testPlatformViewOpacity")); - } - - @Test - public void testPlatformViewRotate() throws Exception { - intent.putExtra("scenario_name", "platform_view_rotate"); - PlatformViewsActivity activity = activityRule.launchActivity(intent); - activity.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE); - instrumentation.waitForIdleSync(); - ScreenshotUtil.capture(activity, goldName("testPlatformViewRotate")); - } - - @Test - public void testPlatformViewMultipleWithoutOverlays() throws Exception { - intent.putExtra("scenario_name", "platform_view_multiple_without_overlays"); - ScreenshotUtil.capture( - activityRule.launchActivity(intent), goldName("testPlatformViewMultipleWithoutOverlays")); - } - - @Test - public void testPlatformViewTwoIntersectingOverlays() throws Exception { - intent.putExtra("scenario_name", "platform_view_two_intersecting_overlays"); - ScreenshotUtil.capture( - activityRule.launchActivity(intent), goldName("testPlatformViewTwoIntersectingOverlays")); - } - - @Test - public void testPlatformViewWithoutOverlayIntersection() throws Exception { - intent.putExtra("scenario_name", "platform_view_no_overlay_intersection"); - ScreenshotUtil.capture( - activityRule.launchActivity(intent), - goldName("testPlatformViewWithoutOverlayIntersection")); - } - - // TODO(dnfield): This is not safe until https://github.com/flutter/flutter/issues/31990 - // is resolved. - @Ignore("not safe until https://github.com/flutter/flutter/issues/31990 is resolved") - @Test - public void testPlatformViewLargerThanDisplaySize() throws Exception { - // Regression test for https://github.com/flutter/flutter/issues/28978. - intent.putExtra("scenario_name", "platform_view_larger_than_display_size"); - ScreenshotUtil.capture( - activityRule.launchActivity(intent), goldName("testPlatformViewLargerThanDisplaySize")); - } -} diff --git a/engine/src/flutter/testing/scenario_app/android/app/src/androidTest/java/dev/flutter/scenariosui/PlatformViewWithTextureViewUiTest.java b/engine/src/flutter/testing/scenario_app/android/app/src/androidTest/java/dev/flutter/scenariosui/PlatformViewWithTextureViewUiTest.java deleted file mode 100644 index ff0e28f792..0000000000 --- a/engine/src/flutter/testing/scenario_app/android/app/src/androidTest/java/dev/flutter/scenariosui/PlatformViewWithTextureViewUiTest.java +++ /dev/null @@ -1,129 +0,0 @@ -// 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. - -package dev.flutter.scenariosui; - -import android.app.Instrumentation; -import android.content.Intent; -import android.content.pm.ActivityInfo; -import androidx.annotation.NonNull; -import androidx.test.ext.junit.runners.AndroidJUnit4; -import androidx.test.filters.LargeTest; -import androidx.test.platform.app.InstrumentationRegistry; -import androidx.test.rule.ActivityTestRule; -import dev.flutter.scenarios.PlatformViewsActivity; -import org.junit.Before; -import org.junit.Rule; -import org.junit.Test; -import org.junit.runner.RunWith; - -@RunWith(AndroidJUnit4.class) -@LargeTest -public class PlatformViewWithTextureViewUiTest { - private Instrumentation instrumentation; - private Intent intent; - - @Rule @NonNull - public ActivityTestRule activityRule = - new ActivityTestRule<>( - PlatformViewsActivity.class, /*initialTouchMode=*/ false, /*launchActivity=*/ false); - - private static String goldName(String suffix) { - return "PlatformViewWithTextureViewUiTest_" + suffix; - } - - @Before - public void setUp() { - instrumentation = InstrumentationRegistry.getInstrumentation(); - intent = new Intent(Intent.ACTION_MAIN); - intent.putExtra("view_type", PlatformViewsActivity.TEXTURE_VIEW_PV); - } - - @Test - public void testPlatformView() throws Exception { - intent.putExtra("scenario_name", "platform_view"); - ScreenshotUtil.capture(activityRule.launchActivity(intent), goldName("testPlatformView")); - } - - @Test - public void testPlatformViewMultiple() throws Exception { - intent.putExtra("scenario_name", "platform_view_multiple"); - ScreenshotUtil.capture( - activityRule.launchActivity(intent), goldName("testPlatformViewMultiple")); - } - - @Test - public void testPlatformViewMultipleBackgroundForeground() throws Exception { - intent.putExtra("scenario_name", "platform_view_multiple_background_foreground"); - ScreenshotUtil.capture( - activityRule.launchActivity(intent), - goldName("testPlatformViewMultipleBackgroundForeground")); - } - - @Test - public void testPlatformViewCliprect() throws Exception { - intent.putExtra("scenario_name", "platform_view_cliprect"); - ScreenshotUtil.capture( - activityRule.launchActivity(intent), goldName("testPlatformViewCliprect")); - } - - @Test - public void testPlatformViewCliprrect() throws Exception { - intent.putExtra("scenario_name", "platform_view_cliprrect"); - ScreenshotUtil.capture( - activityRule.launchActivity(intent), goldName("testPlatformViewCliprrect")); - } - - @Test - public void testPlatformViewClippath() throws Exception { - intent.putExtra("scenario_name", "platform_view_clippath"); - ScreenshotUtil.capture( - activityRule.launchActivity(intent), goldName("testPlatformViewClippath")); - } - - @Test - public void testPlatformViewTransform() throws Exception { - intent.putExtra("scenario_name", "platform_view_transform"); - ScreenshotUtil.capture( - activityRule.launchActivity(intent), goldName("testPlatformViewTransform")); - } - - @Test - public void testPlatformViewOpacity() throws Exception { - intent.putExtra("scenario_name", "platform_view_opacity"); - ScreenshotUtil.capture( - activityRule.launchActivity(intent), goldName("testPlatformViewOpacity")); - } - - @Test - public void testPlatformViewRotate() throws Exception { - intent.putExtra("scenario_name", "platform_view_rotate"); - PlatformViewsActivity activity = activityRule.launchActivity(intent); - activity.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE); - instrumentation.waitForIdleSync(); - ScreenshotUtil.capture(activity, goldName("testPlatformViewRotate")); - } - - @Test - public void testPlatformViewMultipleWithoutOverlays() throws Exception { - intent.putExtra("scenario_name", "platform_view_multiple_without_overlays"); - ScreenshotUtil.capture( - activityRule.launchActivity(intent), goldName("testPlatformViewMultipleWithoutOverlays")); - } - - @Test - public void testPlatformViewTwoIntersectingOverlays() throws Exception { - intent.putExtra("scenario_name", "platform_view_two_intersecting_overlays"); - ScreenshotUtil.capture( - activityRule.launchActivity(intent), goldName("testPlatformViewTwoIntersectingOverlays")); - } - - @Test - public void testPlatformViewWithoutOverlayIntersection() throws Exception { - intent.putExtra("scenario_name", "platform_view_no_overlay_intersection"); - ScreenshotUtil.capture( - activityRule.launchActivity(intent), - goldName("testPlatformViewWithoutOverlayIntersection")); - } -} diff --git a/engine/src/flutter/testing/scenario_app/android/app/src/androidTest/java/dev/flutter/scenariosui/ScreenshotUtil.java b/engine/src/flutter/testing/scenario_app/android/app/src/androidTest/java/dev/flutter/scenariosui/ScreenshotUtil.java deleted file mode 100644 index eea233ef71..0000000000 --- a/engine/src/flutter/testing/scenario_app/android/app/src/androidTest/java/dev/flutter/scenariosui/ScreenshotUtil.java +++ /dev/null @@ -1,132 +0,0 @@ -// 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. - -package dev.flutter.scenariosui; - -import androidx.annotation.NonNull; -import dev.flutter.scenarios.TestableFlutterActivity; -import java.io.IOException; -import java.io.InputStream; -import java.io.OutputStream; -import java.net.InetAddress; -import java.net.Socket; -import java.nio.ByteBuffer; -import java.util.concurrent.CountDownLatch; -import java.util.concurrent.Executor; -import java.util.concurrent.Executors; - -/** - * Allows to capture screenshots, and transfers the screenshots to the host where they can be - * further proccessed. On a LUCI environment, the screenshots are sent to Skia Gold. - */ -public class ScreenshotUtil { - private static final int PORT = 3000; - - private static Connection conn; - private static Executor executor; - - private static class Connection { - final Socket clientSocket; - final OutputStream out; - final InputStream in; - - Connection(Socket socket) throws IOException { - clientSocket = socket; - out = socket.getOutputStream(); - in = socket.getInputStream(); - } - - synchronized void writeFile(String name) throws IOException { - final ByteBuffer buffer = ByteBuffer.allocate(name.length() + 12); - // See ScreenshotBlobTransformer#bind in screenshot_transformer.dart for consumer side. - buffer.putInt(name.length()); - buffer.putInt(0); - buffer.putInt(0); - buffer.put(name.getBytes()); - final byte[] bytes = buffer.array(); - out.write(bytes, 0, bytes.length); - out.flush(); - - // Wait on run_android_tests.dart to write a single byte into the socket - // as a signal that adb screencapture has completed. - in.read(); - } - - synchronized void close() throws IOException { - clientSocket.close(); - } - } - - /** Starts the connection with the host. */ - public static synchronized void onCreate() { - if (executor == null) { - executor = Executors.newSingleThreadExecutor(); - } - if (conn == null) { - executor.execute( - () -> { - try { - final Socket socket = new Socket(InetAddress.getLoopbackAddress(), PORT); - conn = new Connection(socket); - } catch (IOException e) { - throw new RuntimeException(e); - } - }); - } - } - - /** Closes the connection with the host. */ - public static synchronized void finish() { - if (executor != null && conn != null) { - executor.execute( - () -> { - try { - conn.close(); - conn = null; - } catch (IOException e) { - throw new RuntimeException(e); - } - }); - } - } - - /** - * Sends the file to the host. - * - * @param filename The file name. - * @param fileContent The file content. - */ - public static synchronized void writeFile( - @NonNull String filename, @NonNull CountDownLatch latch) { - if (executor != null && conn != null) { - executor.execute( - () -> { - try { - conn.writeFile(filename); - } catch (IOException e) { - throw new RuntimeException(e); - } finally { - latch.countDown(); - } - }); - } - } - - /** - * Captures a screenshot of the activity, and sends the screenshot bytes to the host where it is - * further processed. - * - *

The activity must be already launched. - * - * @param activity The target activity. - * @param fileName The name of the file. - */ - public static void capture(@NonNull TestableFlutterActivity activity, @NonNull String captureName) - throws Exception { - CountDownLatch latch = new CountDownLatch(1); - activity.waitUntilFlutterRendered(); - ScreenshotUtil.writeFile(captureName, latch); - latch.await(); - } -} diff --git a/engine/src/flutter/testing/scenario_app/android/app/src/androidTest/java/dev/flutter/scenariosui/SpawnEngineTests.java b/engine/src/flutter/testing/scenario_app/android/app/src/androidTest/java/dev/flutter/scenariosui/SpawnEngineTests.java deleted file mode 100644 index e378589a99..0000000000 --- a/engine/src/flutter/testing/scenario_app/android/app/src/androidTest/java/dev/flutter/scenariosui/SpawnEngineTests.java +++ /dev/null @@ -1,39 +0,0 @@ -// 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. - -package dev.flutter.scenariosui; - -import android.content.Intent; -import androidx.annotation.NonNull; -import androidx.test.ext.junit.runners.AndroidJUnit4; -import androidx.test.filters.LargeTest; -import androidx.test.rule.ActivityTestRule; -import dev.flutter.scenarios.SpawnedEngineActivity; -import org.junit.Before; -import org.junit.Rule; -import org.junit.Test; -import org.junit.runner.RunWith; - -@RunWith(AndroidJUnit4.class) -@LargeTest -public class SpawnEngineTests { - Intent intent; - - @Rule @NonNull - public ActivityTestRule activityRule = - new ActivityTestRule<>( - SpawnedEngineActivity.class, /*initialTouchMode=*/ false, /*launchActivity=*/ false); - - @Before - public void setUp() { - intent = new Intent(Intent.ACTION_MAIN); - } - - @Test - public void testSpawnedEngine() throws Exception { - intent.putExtra("scenario_name", "spawn_engine_works"); - ScreenshotUtil.capture( - activityRule.launchActivity(intent), "SpawnEngineTests_testSpawnedEngine"); - } -} diff --git a/engine/src/flutter/testing/scenario_app/android/app/src/androidTest/java/dev/flutter/scenariosui/SpawnMultiEngineTest.java b/engine/src/flutter/testing/scenario_app/android/app/src/androidTest/java/dev/flutter/scenariosui/SpawnMultiEngineTest.java deleted file mode 100644 index 36855f0cf7..0000000000 --- a/engine/src/flutter/testing/scenario_app/android/app/src/androidTest/java/dev/flutter/scenariosui/SpawnMultiEngineTest.java +++ /dev/null @@ -1,37 +0,0 @@ -// 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. - -package dev.flutter.scenariosui; - -import android.content.Intent; -import androidx.annotation.NonNull; -import androidx.test.ext.junit.runners.AndroidJUnit4; -import androidx.test.filters.LargeTest; -import androidx.test.rule.ActivityTestRule; -import dev.flutter.scenarios.SpawnMultiEngineActivity; -import org.junit.Before; -import org.junit.Rule; -import org.junit.Test; -import org.junit.runner.RunWith; - -@RunWith(AndroidJUnit4.class) -@LargeTest -public class SpawnMultiEngineTest { - Intent intent; - - @Rule @NonNull - public ActivityTestRule activityRule = - new ActivityTestRule<>( - SpawnMultiEngineActivity.class, /*initialTouchMode=*/ false, /*launchActivity=*/ false); - - @Before - public void setUp() { - intent = new Intent(Intent.ACTION_MAIN); - } - - @Test - public void testSpawnedEngine() throws Exception { - activityRule.launchActivity(intent); - } -} diff --git a/engine/src/flutter/testing/scenario_app/android/app/src/main/AndroidManifest.xml b/engine/src/flutter/testing/scenario_app/android/app/src/main/AndroidManifest.xml deleted file mode 100644 index 20e937e294..0000000000 --- a/engine/src/flutter/testing/scenario_app/android/app/src/main/AndroidManifest.xml +++ /dev/null @@ -1,61 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/engine/src/flutter/testing/scenario_app/android/app/src/main/assets/sample.mp4 b/engine/src/flutter/testing/scenario_app/android/app/src/main/assets/sample.mp4 deleted file mode 100644 index 540551e39d69298141efeb5b0c70f4714341123d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 38874 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%0AOO(_Q{vDcF9_ z>W_77>J3fD4R1B2<5VB%+6WzPd?V|WD9>zr`L2kX<`f^6x4%}LxVCX}ozpoEz0%&P z>;>Nw>gW4~Uyz;A(IYD~Gb*cR7MI2LpObQ?^ex>wo9W}XJ!>a;`=#G2-&!{7@awfR ze#g$7{_jX{-m#5rlk8`TocuF&`>zTAOeUX>e|*hUO%lD$K zx2-%qe%0RCV#t^0B)@r2I)8iq{O-fc!(Y~k*6!GO^T+X;4+7IT*KzwEviYH3VkNFG zvq2!}N)rvBld}6%uesmtdDucdQ!2|%sVo`f7`}m9sMW1@+xR7TCy|eSI2-PGtPd&3F7i zh`)$EwOwMTiQ%*f67tI@olTZ?>S}bT{cz_!zwn0C2?FMq6H^_(?YlqI)xP9a!VAgz zbJmNNaUQjHIZ-Yi!YhA9=HT?je&CsEs*Ry#;=Uo30Y+acrcP}eY>-*VgtB?y@i~99-t(|!$EDc)3Fk#XDD~3~EB%2&G zlsCP2eRkB-k4a}VpHBCbHQ8vUak~pZQl5+1$ybFPAo4Q6a4x9o;##GKVZEPi%3-y-pVL8OtC(}WMK8h?_%-geOUu2NdKU3_0T*Xhq* z2CX;R>?T#oGiAmZ739|CJ`y%ly?@g0$a59_U(F3V=l0L`<>(Zj6Xj~~>1)UVq2TCG z!Qn>RJp(MKe>ovFZ^zPwd-_#ZBtP2Ps@CJa=kgS>g57pS@jWMRp8dB>bEiG))qrC? z=R_1j{+7(z*U0CP$=T&M)xOa4*L|nI8ZjCS?p=v%^WK~Pet0(U>0i6o9VdE(LwRgw z`aG6=9q3oF!}F!^1fxyLOowcz^+_Af=llL=*XrXBwC>BLmmInC@~VzmXp8Ok_x`8z z+(NA?HZH$;OQ>F?x$0mZ+x*S%l9c%$G0iPwan00s4PEfB_VJwkjwcr zyXs~8-I#sKp2y7RK0QxaAnI%{&i&_+TZ?`f>z2nNTlcW$Z17iIm#~3P$2H({3BQ@$ zmwT6Xq=(9H`FSYHxIKY0{d;i0>*wudU8h=0SMIo`b-g^{p3A!@<^MR2FE&}HU{iWo zHEKJLqm@PQi_80`=swx*%hGI7r5Yt6c5Xo?>)DK}+iFAIrDmCxU7y5v(#_-R1<8A% zP1XIYk1JXwifz=6&35d$%@qH&xODzwkC`lw&p4Kq>Ifa%=r&im>EN0vtZ z?qj>FU$MWqBpjk7?^2&+;lYoUXkurDSH$ERz{Lo0i;*wkeakHIt+C3tP~&ze9tAU+z&}bg!hF*DAP6@$Jx8ovUcWMd2Kzst!<^?BcXuG7zdN5 zHT%OB)k~~e^Y{DY%vAR)JgR$TlTxNcD9thw&7OMty#2muyA?&80`ku2FL&uKIMm`X zZ_b>1di%aFFi$jJ{FnQo!DGRLJJ(D&68h$z$EW6X|9*wXZ`yQopLJJ)U8VoY+Z|bR z)t!`oHy6r%Kc1hzBYfqL13~k}Jddw>o36S|Y6<7UxgCy83`Pg~eH~*CZr^rp-O5u> zwnk+fKD9IfoFSx6dqalFsDh-coKSD_Z>~U8i?t;yNdnv#*)@MOhcx>P%NW z7|^>-(|AU9;q=vBI;ZMApK;CUn-@2^xLEqaceaZh(+{>Dm75~URie?d>z}{$+?WiB zi;YWG96qD-ci(oFQ_(u{%gq$u-F>WdSTN}DdF4begI_P1C4Y&%@SZfe=f;Y}BRShO z_wVnR=WcI&H#=#8Ug^E}7Z(<@EDS!tVU=Ec@z>ln@4By^UO18Ukab3r!EGzCYixEB0sF zHZHR@FK!mxnHjeI>wQ19)Z3=p4UAr{x&K@7KF95P?*FR68sQyEis$F*tKSM@`L8o| zfvKy?GTx~&x-%@6wmAGxYR_ww_In@fHMP7gH*@`#MTvfsXNVuFTFXDZPv~rI@x3X_ zzxQ*0vT?m}(e{T~(?(^p!=E${O-$dIv_7li_3Jh^brIh5y}M5YSf0OecuG<2EFShP z{PXrb^}D)ecWKY6S%=b|dap}Yf5cQbCuWoWX9vBhM+J9O22SqW5;Rwj>BA=D-AZ+r z&d+TAo~U_!S@exEmk*jDzt@W-W<}+#xRAeO)ApkWQ@SjsrbU#r)>!Syd3p=Z?* z#;UVrUUp9W=7SH1l;)_%vf7%LZ{tcdiR%}J+<@E z89rY{qnSP88f>chy{oNLyw9soR!&(b@Lf*i?VpaTYv!5;pFSb5{$@#r`ozz>-t%NU z&C6UfE4_60r>=QsH@{i0e1H8<&ZhLW)9U~3=oK-}PT3GGyRIWy=8~@Gm+(8Y?%($C z+O#9J=lz^J7aSWS_g%bF>B6~xF6XSdFIQ>pb-XiG@ZX<%H{LdFuZq#A(GS%9e8+Id zrzG1cZkrVJwsjv|zWj)hp5|?hg(uv$?>Xfi%Qm<3t825h<+X}$3vYSwEvtF8=qHc3 z;*3HyH<4c#vKBKj+IBB_wEw?h>&;d{n+uZoBxvU9-~M&()i@{QCFrY{RvG6U}$uo4xh?CBLwZ zwW<>WFFYzPW9GcJ@RNs`3j49Tf}e{g%QFP*y~buIJy+i{gGc4)-{XmQYxk?QE|YLj z6P$G}H9yrVCv!sKt?EwqE5|P8O!=@fb2hhehwV8xpZW!jJLk{6y5D=k*{`!DE-|#- z*FMIwd%=xgf3{Ztyr7iEH0|Eq|4W6El|D?$z3l4f#i?+}aNWO$v0HNag7b`y{|eq# z)IGa;<>4Jd59V32t1sPQb8W%<=9=2$J`C1tx4e6PYePox<%e14R&d`7yLZsqZU3l8^(#`+X#}8|q|Jkpj z>mlZmd~x+tqlc`Y+uSRJYmk zzMFEVA??kb2+|Y6q#od0-TdEFeW&2krZw-T zz5e9)`P9eT{_`~ak8CtrURS#)Gk;n=tHb2!k$>-rKI-EZ2^XB(A^j{SGI~`W!)a5N z@Tm@0g~RzoUPn|P5x&#F^};~?!1KlX+b6N!(i6Mg`zW*fhCpp-YUHG<2)+{!I_iCH z%FCX2jbHij)UJdJZ}z#}e5Pr$;r?v-_q$x*J=`a?hV_XV1H%oij~iMK@p!#i^4{Pt z^Yz5sIhtjm0?&O<*34~R#%viqTaWOTPHd>1(-?LlxRj6iy5o;Wt|!+e zM|1Bx{Cnlc6YFN#>wih$>eKV}P}?6lb7S)=_o&CWihJZL=FWXLKjOoO-_QEAV$Am1 zoYI}h_(kiB!`un8c6I0%y>zK<^9Q{q>OlG9I_B2kB~ zcS*N5JdHo)bkEIW`Siorc-A`KsC?Jfu(vsgb83ZJt$E5U{#0rR?k|!+TJr) z&GJ^)RNESD^D(z~v~rp3P#M4Na+%9Y^O}7--U}IDoUw12c+|w*r;oZ!`gSY)i<92g zHio|oPyVo(H)T@|$HC(PzYovZ>zd12SsyF=%H)*6rrnn|g}CTdP5Aa}f5Z~S*fVpa z9$e?h5e=L9%tLvTm6wuU4`Y6p#`H@ZvsYi7f5c1X#(qo%XrpI4)rrFzirGS)-mDt9zl^*{Xc%;`#&E~?_xftxW)TS$Y-BD zzh9rfaJOku{T=Nt-6wnonIb15)-Qaw;)9z?8w>xfm=*GUTRJTp{8D433r~2zetb~L zGIz$5eQg_euGxGk)^lj^yIx$BNpwO?wafzF8O279kXN8cwh)MhVWdSLR4!QDaX?zTLl4fE3 z$!+mY{=51S?%vvO^kQb$<-acLTd(-BWfgZ!RlceW;>k z&t@efv3YP=F4^6qFqT6;> z<6lJ0xAm_lK0SNK&Lr<&;*GcAw+WocG7HvCy z_k)+`(~mlP>~-(X^iZ54oyUFbZE1k0;KA&|P4jmCY})^6da%^GY2i0*&15!Qp6Rwj zdC69f^-fc+Ok$jM^nTUxi-PmbSb57Iny&1TX^a?CbzY{-!ch214`c*w0dHYiu*S!`#pdfeV&4EX! z4$NxT2t2X!WWv!2PdTS=IL@}3;hd>jSD``0JNqn=vIm)gCHV&3cemcsoNK|tpwMe= zTI+oEWr@$7$F?nunR~isZOVSplot>Z+aXk|wj$sB_Cr%)q5QT!wl$TyVSkuIQ*|Qz z-%OUgr+Oyc?*z}=)3U#9zTBvt_q)AC?)_TMvs*2kDi&Vte0t*D%h&I|Y;fDMvDd0O zW6E549OmcEB;Jd`m)R)#Cn6Lj!{M|0|x<5~! z?SG_{{%f)w*WWu2x7=jCBpMR6S^14{_V0B$ciud>JZTd>*r)*09e46uf=1C^`BDS#_pln#{_l1^jjIEQH`Es($L!Lb{g_@l0tRGDamu)`4U@x%v&Cf%u0>{KUV%aOg zzE>>HzgK&ydD-dIr$4qn%Qf7#%W)rztoF{`mi&E(F4=F)=>6H=pm&quQG?F{uUei< z&wnoYrzX$3x@VH9#774;^Xr>gChdqgJ z4W*A#LA8v_Y?k!9e|6n00qOW%J^ z=IOy8U9VjJO*(g_bL!KqB{UpjE$Uag9r?3;uR-+#NyS?mS85&;2&`GX)5!8_XteG( z<82IXS?LC^w0_i`^PeB|HM{mzdt3n1nsyt8!p(Z=Kc?#c@L|y6bg2;etg2_o?3b4o z(q16@@##NZVkT8KUN>zD)A=6PFxTKoG^6Op^QLDt+W)K1FS~SV$BXlVFYB(( zON;q*v_8*JI^`*I^yBcLij5Zy6kA@+obp_jwf{hh)#cYhy?XCW4H!<{f3CTtq-4@5 zzC{{~6AOO(l~(#K*&cq;PCBV{=DcH}1@nIgoSp7=?-IAw`a=G^ToJwp<|lc(q-UOd za;7n_@zBIHmSb(gdh2(&E?oP5?~_@Z^=5`_{ogmEXE~#2>$O6*1zpSKuiWl-{n556 z{I~w=z+UaZNh{e_9gSH#$w`0jua+}U!gGQaUD+mU^Xaxw=)51c(+zX1@_wCFaSd_v z`5AiS(=nEgxi|mnN#7T|oA=_r_uA<6*R{2VHy+=RuKFW-^UIsoMIEPB_s#u1C%?2~ zrM|oOa^sjtwRSPl)w@!@T)XSg&|X%?pS$9G_`2g$zkiYpWwEz5W|rV_IyHIfw*CD- zOgNc7d3x>T+o9YPDHEg>F*Vb97QyZ_RF*?|2z|U zP-)Ex{emBgnp{@53qRVt_Gn&W<0p`&_CQ3;K-l)8NSY&Sk4@^^c>+OOHobWAX%ovC z=f`)oTOP7cbK~v%C_G2_zmS#eIz^ZN61?X5ec>0B4LNqtmYVixjl&$>-7)i3d!3E% z{1J6oef!j#nZHa{$ENx0{mCMly89;2gFm0@_$LZ(%r@!SFTO_b#3c`zTZ-{tZXJl+ zon0OjKjUZE;mp z#{8mlQ@*ZR@vouyKv#`c-i8@LY(>#ho2_jCWU zMS*;ut)={GiXRzrwy5hH^yE3%FPM8gbL#eW`te&rQg@lx?^ZbfZE2Ud$R5AB0uMhr zI_yq!>x-0Rx++^tZG(s8B>jD+ zg57?;nqzC_iPGbRx?U-U+dwl=_?oG9c z?|zQYUe>Qm!eYCuW?S>@yCW9xD5CtN*Y+*b{zjj6h`OWKxgbjLFaMV10ug^zkzB_cQ+nyY=hla*)7AF0m(+?n zr#n6K3%a~8#kKNXOzi!qpZD{e*STu(K~$aPvvR4U_at8MYg z_PUSQ-*p`4RC{=x{cE1ERGhQQ_thrG-??6OdEDr3Dm&-$=4b7K?hPv9dtJUU>ONIH zTl8k}z5l#?oXg)jR&NNf|Nco=&DZ2k!EM9$L9-1E9(k!Q3M&2dIXNJc_1C*t#kI>{ z#7HSFjeam`b%x8~4Zn-;X&--nbE8e-9Jhrrb4=rEnGcp8EpnQBk}EFY<^Pn$k|{h_ zo;ijwKJEDCHMRd^#)C8W+PJQ7_+R;Bo4IktdADqnjxt_W^X~X0_3Q=f;t$9EeNfSm zebcir#^>##09NxG@1Mr^?fKKsm6c^(;@aQx?e#?IxVp^!jCIvdzD7qg-MpNXuG98Z zEI;n=rSfX_>Z8WntRmMOc%}2u?&!z==_h`~E9^JgpJpVu<5>%b`{Z90ud}CVFdp() z=Q@9%*Gx8(gs&U6X4!2hyz(vKxZ#SFqm`mFk6fE#9%K7{QfGVdw8@v`E_0-i-?_)GU1{2)e(yu(`K9}}b9vc*I`MawkO@<%MDAXlfG^r{cU0#)_%cli zP|66d%c-#bmHV4L?wrTnbA1g_x*m?kiyGE1Tx2rAFu1B{d2*R^>gxA-4U*N-^|v1i z81T=|l3`I?!94qHVc@rfU)&CHuNm7X*Fi^W2+L zF7B0L^?adpT8+)mtz72Ku|03I+Gn>~pYz;s-RDeGv1-|^T>-1Vy}z(?#&Nm#9cpKq zzcGn)*&j3tc)^~rNiy+8-@As6h3S=k+iZHoZB`1c)3{x6)r9ZpftTvX^nU7In95am zsn6^L+hKOA{dH~kbVEbyyn@ds{ElG$_FXS4tdGZU@mbwdmC}nBe_6-za*D$FYaB}L z%(m?|M;`26`TZmZdz<64lQn^tS8iMH&~f~QRFv(sfTamcw-z;6Ty`?puJ)6oTUTw( z%7TxR3-e#~A6~vzrc%&fHX&&Kk-;lh5)1jOrR=pWSnq%z^2e*TX0MeLjNrh4QV@%@>| z<7!a$@lGu>`<1)l&$g-6`QJ}`EO6cLjoh7MtC@L@UXi<&_CR&1u+-Y3CF$pc-(E9Z z)7qG{O{L;R(ic@n{XHg%KfE8iL_F0uFH(+RU1=bbR~0@>J|go*oZ_tf6FU8eY|?pZ zBjX-V{n1_e$hq^%jGM6*4gVi{Y?*1h`RJu{7Qfy`iiI4|p7C|xZwQHl_Dn{#iXWXt=GuGaw}}{mv05#+R>d zdOp3;`eE5(E>`yB7s2d-TNz^>&hMD^MMQeLtomHN7j|uIch}DpP1N*bQI_2M;Zb(X z|FqmE7aXfgF717CH`#lCH2(&JO^>JS`4rCc;vnbi4RMzRuD+OD$-k$jU~BTyUS-$S zSMD;X$sZIDs(WRt(PhwS*}Yh@;Cb_!NWap4}Az6&sH2 zI(zVe=L>_}pL4r*ZB_f$8M4UcaB`v>YtDq{%YCy1PV`(8?rLn9F0YgT^&g+QB9DeRciYN!g*|`vtu8=z zb4jbB-(GN~t_MH7vfAXDcuX$W-ckbPskAGA~d0-{Mc6j<-tE^qh-4zr;Oee6jO{n}e3=@`%gRE#m)gej=85 z$nq7F)IFWbS&J&%g1h%_mNuDu;`*d{p^D#5t3?U+-dmpexYh~bVw|vcIM-){9 zZl0)_btCLj-mCH-kAwNTPR}})(7+_~|I(tQOhLtOe`bX&Ul(3=&-hp7am!s6do2BD zunX-lcSwD){P`Yr3*JTN?B*?a>VIg#M&~Lam*fYljMqATE9qtnOjq%hcvvN_d&_QN zw5qnd=3)oAf=iF}c(0eTKcCJP>hZ{1_vrq$+D~uHVEpy4VWa%v9|ynmccoXZ%e~Q| zv~ug>tm!wZb!Fe*x_RDrgN>chR92O#-%A%JaP!XWnCV%xcwS}k>Vg{6W98G0A{GDH zEuVHJIx5qHh5Oc_2Wp)16Sil3bN{(~D}%-JO?OfXZ1gUs?K;9K`+@IT>gs1)E99?C z-Pu&mW$scFbB^KOp1DSi$wwGCj@~I;?E9Nx^G9bZ?cF7AE25Jhuhd+#@c8tK%->5- z?2D6oedL}ro4U3Rf5^0u=MP(Y|9@`H=3-v-xNFdpB(cYpBecUyTX1RSH8L|dZ%}h1s&DQ7RFE>9+O}n}Mfd7$R z|J=2^J7r6DX%sJ*s3cai@3U9*<{c}PHczWFJ#fJz!q;HESi(BJl&Gp}p3ma0t67;# z99aLQUNPIg@wUBpf7{_n46o8Pe{ZaMaVvbf-I)a6DQRw}KApWdQHgs;@O_?dy3UeQ zXSxNeIlVElt?7JdV6=9&jMmbYuzS9>50`E-`k(CF+U>II>@gIligqcNp`u1 zU2kmjjFY|{=H12VquN@%L3Vpou+_`U*&JqPwy2!B8Pr`O7PzwHV2|ALS5~q)3fFq) zD)ucI~g1t;=)xGg^DXinsi&I&G?W zG{rjnWR^Eb4KV? zOC|S@d2v;R^A-i{GzevOs&KEItFNK>d$sxg;-3~%#U}pT-G8XPlsRD4q5~p6R*?pN zE6-=UAGQ(wY!I*e*XEt;#@kCotDhcCGZVJBv1hlkUX zhWBC%LvUmK!^BApM=pKZ$DUrK^X0hTMXrgN{+0VUleqE%-yeKwxY)MJ)}*ITxFY-O zyrNWVjzcVGeGe{+Iimf;e2xCmeP8#MDsO$T>*6%?lN-M${7%Vr%=ocw#^afD!8X;a=fu zh9)npEwld=?qD?e6>)rygw58%n^M6@w>Q1+-~B8wJD}XNk6X@vChr;%fH$~ z<+$ji8Iu<@|G2(NCMwXdqIIIYy9C1t$(@gnDcgN9Z+iOor~J)jx+jYz&+pxFaq)+E z)8ZdaZz`?KZpz-AxK!MWH`lOoWk96X^PjQd^G$o@*l#Q9&N#8d#olk@L##<*8gDwRJKbEsV3CbIL@u7CXcf!dp|Zkp`d@Z4t2 z;+O?#jeT#Qsds!|>wRp+?}EkdlQQgAo?r6ex#2}um#>F+T;`bDdrhSv!Zp?M1m^^u zW5MTT{A@ToZ;RQtFPA+e%Ie#?%V%@9*7aQJ=|z7RFkO(+R{VHyy6IVM&&fNZHf~ft z*0n?Py|7<`>8-zqR~*q8e|oHyUr;RWWUbyLQdx zL+W3at|(*qz?-Y(y=v;h@D**>uC3(VT`cg_){=qmOSWocop0XkUq2id|8M``d)T$# zZsz;T3>$l9|H@0}Q{I2o;6$dVufk35WixZu=ENNB*1i7C=6du$w_}DD=SpMub(&h8 zTbh^J>wZ?H=SGU|hMk^TnjvlTTa=~tL?!yNZ*Tdr@WBde!*5D52`jpmidz^8&);hq zbUR_QZh&k^uerXC^6~3`_YOIDTTOMKiOviyq5 z4v!=J_BPX3t-qRh{8rJ#DxL2OW@c@2|MfViwnN%<+Pb5^TsPi5x@BTpOLp?j*9`pxtS{reX$t<=umlYji(w&Y*;w5)d36ql;paD2qs ze0owtlEkThzVEZr;(i-FTe`uxqoODMyW%E~)%O)*r)vaXs{ZeGRW#yu(&NgK!juUt z37%qi_uXCOk*nG;!>8U>&$cs|3!P5&ZV!~Fk>wnr_Y6Ymb$b1-gdD) z3iufMZk6zxq@uU+e~sSFe_0t*pP(Dd=Dpba?uM%Aexd4zDraaMguP_WkYW zr_z@^n|e-a>yZK$*{7vTSx?pERD9;QxODS!!L71aduOXJQk?GlTIro;(DRkn|CO^( zzGhmnoip?OjKYOG|DJtt*tg98%QOCk_M*qExl_WH-bHqXy?kJ)2%I9cPkSD+}v z{pl+YXxqJuuZj8;xc~Ef`?XfOu78&tR*DK0n^a=1nBBlI^T?uwnrywkyjfoxU({$C zZ~7x1@>)*m$3%Zey-vH2$L}7HuA6va=Yus2&m~HPg452mKm76Tll1y+d}}vu|G8;F zp#D$)DjB|?zyI|)etPxY?sBe^-=QhSnfJLhx{gnM(xnslS|$DZ$tjaJ*Jpg)zi{h^ zcP=HN^`>H@I4H#O%q+(jAwpJ%Q-H;_FI+O?h6TaI_*r`R2JM@b>wpDSKrghnPPd< zHox&#$a(i>y_%TP%pH2&4+*bWlbgswQTFYgTJ&(hKBHlD!^Wc_SA7*RU`EnN1D`$l*C1IOY zoO;-kb{@+TO86)qz0Kfh=;ia8dSATqRya*H2z6dIE%UAO{-RSy-hJb^<=gn{yUhQ_ zbFc0N@A30Jvsi1v)eBi?J$DP;vZ=RdPu){{|HPaRZA}L@{bRqcbZB1t!^c`n%-?ye zxUg=n{B_|?T>*dES^~n~m+e`4e!&M>yO$~Vo_l*(X6)mrmlpWr=yX(I*{Y8_ZhPnC zidxRjVBg)dbHVfHC%&l#*2#8UU)g-JAH{idq7BO_EbC@1g3wZt2YLDGGl zYmfIo|C)1F;gHuuu4k9Bbh8Y(B}(?LOnwn`_U{{>Cq`BmjqE(b&QTz6K}GC#^gW`u38*?rrEr8TBz zW7d~VdS|?>;8)^G|htpz{~2=e~E1+gR0B9+-BZ!{C$U94t$kAZAD7&?JWhy3d*`qUU|No$9$)V+xVC4KK%*5*`uCI zWScXex>I11TVwjhD*aB*m#||WU+VkcFJfJ|!o#-z#Do(!r$)DXKkHME^z8P1aOlA{ z%X`!KHm{4GZ}s@_w4<`$e&m!Ueq3&B`SSjr)mlg1`2Sh#zRh#p3;Sq|pFJ{L=RG|c zp7EsP%IBAB9!@o~eRpuf*896n14W8v#_ZpH@u%fJd5Z&`;BpSwhS$18oth=dJH_7FJynV&~%f?pAD;`Ttm{8Klefr9| zI5pWbLF>F{glO2d7ya7)$Nb0Yiv1Qr)8hZVwli>RNMEUNG^X&P=s;1mk`!;Oy z`gwBlS5fPdquE>SynTe!uFN+uyk?lXJ@kNe*`c+0o6a%^Pl()fz+bmxPg~a8>HPbS zu}?@!T^VcO!n&S6WZv~%?_Bw(@g=GJ{WZCctDMoOFYC>NPFD8kp3~OZ_ibspl{LqE z32pP}U8?+*v6}$x2 zRTTB`_sr^2W>;T){dJRZfdad1<->W;wAnqoQnD2jLS}E)Yv&O-d0k1n-1A8J!kUT| zvW)f(a+xA`C)z&K%F(P#Ue<5vteXzG6{Z!rQ-XJ&rfc zFJH0Byvlad=>3tp0`BQC<@;>}O7G5;zt^qi+9>^(XV3M06FuinQ};V}N;f#4l_Tm) zkMCoKXS;tEKQ-nuFZ{S>S>exGfeG6Le`nlYn)v*k$Ikb0|5MdY%z9z0Gr{!MDGl3` z<|n^vTA!(nRS3_UxISBE%AYjTgDcH;b`+US3^55+i@I}cmp#ABq-d$A<_gPq>hoUC z*&p&Objq_`K_Rx!W%Twv-@Itils#j3&j;=% zpG_00xSE_UTk7ZaOz+mN=ku48HeBym6*19?yER=<$qyZ`Qwj zG0EM2*<9D#dPZzprp=ttaO|2C)9v^2-sXSB-y-%I8Zft$Adb#P7h@7>@-G6FJt?fJY_-~)?vWat- zE{d?b>ToIG?2r3%W?y?6@M3ndu;IPP1MYXvg-h7~*t^5;gRXJWeCIb|S#_K9Ax2h{#QdsrL)$t_O`EG z_E#o%vudZOpLWmN6U_#K?{ij$RIqQz)Y>C2!QHyhea;8A!xit2-;??As`yN~op0l* zA9G(6tdNP^eox};jSE*2pI&V6{CDb>c*6D>#;~h7ZF}vyRdP&9EU)1IWN!_>=-f_wzH#$sUVP3ONs&4jip_^XZyf%l^+NPB5cqFu+ z!#$g6!Q)4(^Bj(SylEGH^pDTmpt3biPyU>Hz9sF{;y+78+1LD=n3N>#=EA=%`Ut1n zUtKfv)iw3aQ~6@{pIz>?sri+)fc>?<5|_)f8eWNX&xnsP`lXeZX?H$Q)OYQMNLiT! zPHZ`@rs9uvZ(e%H)BLdD+%~?xO1)I&=RO%c8~hskwcfV=KEINgV@0vslEZ&CbZ-l* zl2ENVXxDS_Rlsz&m&@#X%CCMgj{Nj5Y0az!*I3oHU(MYgujMqQb^ZH1E6d$iBxX(( z^3ShrYk%5R}v%Qr0f`B$K6*Pp2;gWrbfpRZjOay-c^ z(N-YrpNPY0qqK?gn-Vnk`s(q&xUt``>hkTby(}W$R`~_Jd<*{=H89LS>B}2aX5@H7 zW9zlY2ab8~^Y4sU;IQ&~fWx+n(dskhxtZC{Dp{s5BsYZqON|zf%a&N0_cKefBy)xT zmN#X$YtPkb{&c%-yf4&vN34bOjmE>un%2z~p_2_RDtmFYUCt`obN%w}eFyS*4V&sV z{76pRW0++9aJ#$O#`((w7yPt&lkc3Bte(&Kwb-?%N29>|?}OVKQOTcV7EBj9D00>C z&mK)yP3!&BZP!oyVEOjw-KF1*&scAC46aYUnD;pH_W!Ck5{j&5uJP_y|DL_F)L=pV z;dLoz+-_ZuyHI0uc5S}>yG_rd4qe{!`QZDWTIaJ%+H|LQ#^g5hod>^G+0h<~&z5GqkRv zXzH}|fSHL_A!75{wa?krZ_)njW$h_jSGF|5Pb+Bu5k;@M;$j{~K5k1M&AVR@yY6!F z#&i8yUjyELH1C?L*#2nEF?QWei8HzTTO0kK9$Ra?m0^~~nip?tjTSUN(3W0%_1j$U zx{XXt+nRpMZL15`RZ8xG)5!Z8MfsJ+*Z*g#ShnuI@hNuV4M&HXXUS4p z+EtH&p6=B9l^uFN>+Wk8vD|0T%#l0~1f3-_=HHZ1m=OLa*vWR$WrddOjy;bxE10=W z*0qa$zP@&*;s<5U#?|XWo~@pp>(3Ojc)}`Y?Ka`PTWSI}FXk_u`^lGABI#1`1E=r> z50dleZHuaTC($!)vX@i-n)OpTH~%^1@+|%;gZbyL?nS*0)1+6M@49?9=2E;b-|Uwh z6U-+0zPPsg#O4+IH6LFLjk2&2R?et9`s!iux7ftB!t;}Sm03zfo}PKO&@WnN(&-63 zb8L>K@6Xx0_4M935rNYb&FfoZUGJO-TpsdP!s=Qwm-^YQS|3^yS8{#RG@X&#xlEgf zV`HpK#}W5sImfp&oz+y(c~{>$@2}^r4+otD?3>*d|7~9G+or3#Ay($42kB$Qyi7qen%H7zVMYvb?9@8WQStbak-sA4>*Te5%!bvM3zzHU#2r-slegaK z;2xHhP5%SGCUkzZ)#|)m$k(}Y2J2s(Q5_&JeRmXFp^sc7=PnjD; zEVgPnG$&>z9&S7I`k*Vb;xA8zw+|LZ9NIoPL@{VPlhn@T$(_}XTitIgk373tEVp&z ztA>xC3_i^4II8(U&E50U#%)XsR~(O7Sam(Hh|#-t&YWD6y-)Sjmi*8D|G_Lb^0xZ~ z!~E=%_F`Kea0`e(bGo(vmh-jkxobF98u-nM{dHwh{dd_*g6{kx>D&grRR#PuQRW<4 z*QDzbUpl3}l%9I!^!D9-`!4bFujQ<^e17(?f`^R7gjELHrt`1Oa5L< zb~WvM-sZ-mdcy8`&KQA0vsNeGy4L-A?v!xeIreYjF3E@VlqUU^tKCp| zu2k(nq=edz`YgTb=kjYR92)f2u?il~E&23e(h(QsAFm$o5bb?3?fEqUanoZ(GNl0~bC%83`Npaep*RT0! z2~F8>wkB4-c;e9mFEmqcZn|c}TkWN5;su>Ay_Nl%P=M@Y8qAhWK^Yr;ESN!f_vRcBI=pj7wSR>yQ z;g~5icjm6jep2(+BdM|C4PSeS<;0W|u}QPlBEoK|FN`bvDLL&`hkEws3inehH~*IZ z(IvK}VcmuqOY8Q}WJ=DxdEwHHbj_n}k~7?TDl%VeH`;RP&X3ML+YdLtufF+b=_iGR zGxI_Y1ZJ4d2r|%&c3!bA&hP*n-r zCak4pG2_NrPu98mMr>=JoxgZ<68k!X%dx^{ueNUq^yJ!b;|kB*jn{JJu73K-Vsm?0 zkgK!qm&gx}B3DHFo*9b=m|R%CHY$*@u?t~ zMO;by@~06A%a$7C#=o9B#EVGV3P5q>N zW@?Psf8U*df+H`TyexNFc3XDkyOR30#`pWH{_vlzW32P@Ja_czOV{5gYl60P>Rn(E z+UGa7dWqSm3K6GJxgU$>w!K@;r5Ns8e<#qF`B4jZ^&`fHt`ASWH&>kzzpejjvF$^% zjI8fod&sNP^8=N&Sw;en#TOtn<=0uk!JSll#RQdJj+x_W} z{$63XsFh5a+3Hvlyj}5e%waZ|aGv}p-e6H}XB@F2=<1Q2*8l&0&aTKl-F2+v z&&6VwzYp9`%+xz1Um1LPg>r6$h1Z;)_hS|ce4QoHzhL_9r=KRph;J0qc&?*(Z)d_4 z-j9_(&)Q7sHITK^N^9G)yJ1hbeN;xU$0?6(({Fm&JmRs4YAQC@suKU}J$+8enJ+Ql zK0SHTqtN`~-`t##`2}}`R2^lfX0>)-`KOil^wsPo*~c#%E%?%DZumxT>Iqx#>{}bk zIMP)g-~Qd8n60_{*ujlIXFhD~{eAh&)?#+EPcu%scb3f9ux$H(qu?GLAFj+xR`Vkz zd-kgA((P`r|9Q$T<%ohULt)c|#Mn73Vt-$Mnzj7*XMV$mbys5=w{6tOt1tP>vf)+q zkH?PNQvaPgqPL7?){QUhCO!^X>bKTBH&gi;e3AK9m5nn)KGQb6GPNYG{~}K|w~K|z z26P=ZYk9eRogW`-c|qMvBNg9}MvkV_=6?&LWKVN1<6!+V@4PCjpXq_TT|SvN?6W2- zJ{CyT^1rwE!fi20KVc5j#Zeblr>bsZj#N_FBW>ZR@?!sGRq6M=eZBwWeYLhdDqg{M zLF(SMhgVDQTq)GI+<5xes`C233u<*_&!kE^-0}?Ucij4Xo8W^j6Q{7-KXUjKc7C?q zDgK?)8x^${O1kcueKlsANpb4O*HX89C+v69@oVr)`+K}+&ac_#PD=zV&7$(JKmD{_ zU(M;uFM%VbA_1;PgkreOYNhKXQ>+4Nr8JL-ix#kY7it)2oY!39J-wSF!)o7t-gVO} z&T1Ze)1ss%Cbc(Tr+gVhtaJEHm)N>o+oNl@byU7|+`8IU^i7fHgSknMrdw=M%RZT; zsI}O??fA=CO$sY>g?F7<-aDOJ#?*9DnPnhvn&#%S4`06H|G3q?&VA|Zh12v>ce5?q zF3hKO>&Rlk>&Z+ZZ|3LUesVX4J@{^h3;X)%Z+3k7y=2847P}jl*Waie=Svb$@px2RqGDoFUFzFLR=o@!^#BNg=tq&(%8l2N8a{9?+fUbUVG+CUODqfAm*n`;W~yjy|#CGAK5efv*Fla zb=Lf51*_;Sog+d?OU`x|O}#ozdH>7DyESv(&RluG(*D=<0_z!V z`@dRF{<7;@S$)8d2+QpCXHMU$%zdLc{r2v^4;dJkMRN1=%NQ6Ka&pTuQW#JG^9u$B z<`)c%3?PJ%VMH*&EHu6YSP&<{#K6F0S5lOi&A`AAQ<4p~lNm`h)HIOYNTMJnR0hNZ zV>CY4-UD#As-&ir6f-a|$fV{Jmw?rSrJ&}5^)hbDP037TU|>+lO#!L3bqQQ zkb!|gB?TfUlTwrlQUekO$@7#J= API_LEVELS.API_23) { - // CanvasSurfaceRenderer doesn't work correctly when used with ImageSurfaceRenderer. - // Use MediaSurfaceRenderer for now. - return new ImageSurfaceRenderer(selectSurfaceRenderer("media")); - } else { - throw new RuntimeException("ImageSurfaceRenderer not supported"); - } - case "media": - return new MediaSurfaceRenderer(this::createMediaExtractor); - case "canvas": - default: - return new CanvasSurfaceRenderer(); - } - } - - private MediaExtractor createMediaExtractor() { - // Sample Video generated with FFMPEG. - // ffmpeg -loop 1 -i ~/engine/src/flutter/lib/ui/fixtures/DashInNooglerHat.jpg -c:v libx264 - // -profile:v main -level:v 5.2 -t 1 -r 1 -vf scale=192:256 -b:v 1M sample.mp4 - try { - MediaExtractor extractor = new MediaExtractor(); - try (AssetFileDescriptor afd = getAssets().openFd("sample.mp4")) { - extractor.setDataSource(afd.getFileDescriptor(), afd.getStartOffset(), afd.getLength()); - } - return extractor; - } catch (IOException e) { - e.printStackTrace(); - throw new RuntimeException(e); - } - } - - @Override - public void onPause() { - flutterRenderer.destroy(); - surfaceProducer.release(); - super.onPause(); - } - - @Override - public void onFlutterUiDisplayed() { - surfaceProducer = - Objects.requireNonNull(getFlutterEngine()).getRenderer().createSurfaceProducer(); - surfaceProducer.setSize(SURFACE_WIDTH, SURFACE_HEIGHT); - flutterRenderer.attach(surfaceProducer.getSurface(), firstFrameLatch); - flutterRenderer.repaint(); - textureId = surfaceProducer.id(); - - super.onFlutterUiDisplayed(); - } - - @Override - protected void getScenarioParams(@NonNull Map args) { - super.getScenarioParams(args); - args.put("texture_id", textureId); - args.put("texture_width", SURFACE_WIDTH); - args.put("texture_height", SURFACE_HEIGHT); - } - - private interface SurfaceRenderer { - void attach(Surface surface, CountDownLatch onFirstFrame); - - void repaint(); - - void destroy(); - } - - /** Paints a simple gradient onto the attached Surface. */ - private static class CanvasSurfaceRenderer implements SurfaceRenderer { - private Surface surface; - private CountDownLatch onFirstFrame; - - protected CanvasSurfaceRenderer() {} - - @Override - public void attach(Surface surface, CountDownLatch onFirstFrame) { - this.surface = surface; - this.onFirstFrame = onFirstFrame; - } - - @Override - public void repaint() { - Canvas canvas = - VERSION.SDK_INT >= API_LEVELS.API_23 - ? surface.lockHardwareCanvas() - : surface.lockCanvas(null); - Paint paint = new Paint(); - paint.setShader( - new LinearGradient( - 0.0f, - 0.0f, - canvas.getWidth(), - canvas.getHeight(), - new int[] { - // Cyan (#00FFFF) - 0xFF00FFFF, - // Magenta (#FF00FF) - 0xFFFF00FF, - // Yellow (#FFFF00) - 0xFFFFFF00, - }, - null, - TileMode.REPEAT)); - canvas.drawPaint(paint); - surface.unlockCanvasAndPost(canvas); - - if (onFirstFrame != null) { - onFirstFrame.countDown(); - onFirstFrame = null; - } - } - - @Override - public void destroy() {} - } - - /** Decodes a sample video into the attached Surface. */ - private static class MediaSurfaceRenderer implements SurfaceRenderer { - private final Supplier extractorSupplier; - private CountDownLatch onFirstFrame; - - private Surface surface; - private MediaExtractor extractor; - private MediaFormat format; - private Thread decodeThread; - - protected MediaSurfaceRenderer(Supplier extractorSupplier) { - this.extractorSupplier = extractorSupplier; - } - - @Override - public void attach(Surface surface, CountDownLatch onFirstFrame) { - this.surface = surface; - this.onFirstFrame = onFirstFrame; - - extractor = extractorSupplier.get(); - format = extractor.getTrackFormat(0); - - decodeThread = new Thread(this::decodeThreadMain); - decodeThread.start(); - } - - private void decodeThreadMain() { - try { - MediaCodec codec = - MediaCodec.createDecoderByType( - Objects.requireNonNull(format.getString(MediaFormat.KEY_MIME))); - codec.configure(format, surface, null, 0); - codec.start(); - - // Track 0 is always the video track, since the sample video doesn't contain audio. - extractor.selectTrack(0); - - MediaCodec.BufferInfo bufferInfo = new MediaCodec.BufferInfo(); - boolean seenEOS = false; - long startTimeNs = System.nanoTime(); - int frameCount = 0; - - while (true) { - // Move samples (video frames) from the extractor into the decoder, as long as we haven't - // consumed all samples. - if (!seenEOS) { - int inputBufferIndex = codec.dequeueInputBuffer(-1); - ByteBuffer inputBuffer = codec.getInputBuffer(inputBufferIndex); - assert inputBuffer != null; - int sampleSize = extractor.readSampleData(inputBuffer, 0); - if (sampleSize >= 0) { - long presentationTimeUs = extractor.getSampleTime(); - codec.queueInputBuffer(inputBufferIndex, 0, sampleSize, presentationTimeUs, 0); - extractor.advance(); - } else { - codec.queueInputBuffer( - inputBufferIndex, 0, 0, 0, MediaCodec.BUFFER_FLAG_END_OF_STREAM); - seenEOS = true; - } - } - - // Then consume decoded video frames from the decoder. These frames are automatically - // pushed to the attached Surface, so this schedules them for present. - int outputBufferIndex = codec.dequeueOutputBuffer(bufferInfo, 10000); - boolean lastBuffer = (bufferInfo.flags & MediaCodec.BUFFER_FLAG_END_OF_STREAM) != 0; - if (outputBufferIndex >= 0) { - if (bufferInfo.size > 0) { - if (onFirstFrame != null) { - onFirstFrame.countDown(); - onFirstFrame = null; - } - Log.w(TAG, "Presenting frame " + frameCount); - frameCount++; - - codec.releaseOutputBuffer( - outputBufferIndex, startTimeNs + (bufferInfo.presentationTimeUs * 1000)); - } - } - - // Exit the loop if there are no more frames available. - if (lastBuffer) { - break; - } - } - - codec.stop(); - codec.release(); - extractor.release(); - } catch (IOException e) { - e.printStackTrace(); - throw new RuntimeException(e); - } - } - - @Override - public void repaint() {} - - @Override - public void destroy() { - try { - decodeThread.join(); - } catch (InterruptedException e) { - e.printStackTrace(); - throw new RuntimeException(e); - } - } - } - - /** - * Takes frames from the inner SurfaceRenderer and feeds it through an ImageReader and ImageWriter - * pair. - */ - @RequiresApi(API_LEVELS.API_23) - private static class ImageSurfaceRenderer implements SurfaceRenderer { - private final SurfaceRenderer inner; - private CountDownLatch onFirstFrame; - private ImageReader reader; - private ImageWriter writer; - - private Handler handler; - private HandlerThread handlerThread; - - private boolean canReadImage = true; - private boolean canWriteImage = true; - - protected ImageSurfaceRenderer(SurfaceRenderer inner) { - this.inner = inner; - } - - @Override - public void attach(Surface surface, CountDownLatch onFirstFrame) { - this.onFirstFrame = onFirstFrame; - if (VERSION.SDK_INT >= API_LEVELS.API_29) { - // On Android Q+, use PRIVATE image format. - // Also let the frame producer know the images will - // be sampled from by the GPU. - writer = ImageWriter.newInstance(surface, 3, ImageFormat.PRIVATE); - reader = - ImageReader.newInstance( - SURFACE_WIDTH, - SURFACE_HEIGHT, - ImageFormat.PRIVATE, - 2, - HardwareBuffer.USAGE_GPU_SAMPLED_IMAGE); - } else { - // Before Android Q, this will change the format of the surface to match the images. - writer = ImageWriter.newInstance(surface, 3); - reader = ImageReader.newInstance(SURFACE_WIDTH, SURFACE_HEIGHT, writer.getFormat(), 2); - } - inner.attach(reader.getSurface(), null); - - handlerThread = new HandlerThread("image reader/writer thread"); - handlerThread.start(); - - handler = new Handler(handlerThread.getLooper()); - reader.setOnImageAvailableListener(this::onImageAvailable, handler); - writer.setOnImageReleasedListener(this::onImageReleased, handler); - } - - private void onImageAvailable(ImageReader reader) { - Log.v(TAG, "Image available"); - - if (!canWriteImage) { - // If the ImageWriter hasn't released the latest image, don't attempt to enqueue another - // image. - // Otherwise the reader writer pair locks up if the writer runs behind, as the reader runs - // out of images and the writer has no more space for images. - canReadImage = true; - return; - } - - canReadImage = false; - Image image = reader.acquireLatestImage(); - try { - canWriteImage = false; - writer.queueInputImage(image); - } catch (IllegalStateException e) { - // If the output surface disconnects, this method will be interrupted with an - // IllegalStateException. - // Simply log and return. - Log.i(TAG, "Surface disconnected from ImageWriter", e); - image.close(); - } - - Log.v(TAG, "Output image"); - - if (onFirstFrame != null) { - onFirstFrame.countDown(); - onFirstFrame = null; - } - } - - private void tryAcquireImage() { - if (canReadImage) { - onImageAvailable(reader); - } - } - - private void onImageReleased(ImageWriter imageWriter) { - Log.v(TAG, "Image released"); - - if (!canWriteImage) { - canWriteImage = true; - if (canReadImage) { - // Try acquire the image in a handler message, as we may have another call to - // onImageAvailable in the thread's message queue. - handler.post(this::tryAcquireImage); - } - } - } - - @Override - public void repaint() { - inner.repaint(); - } - - @Override - public void destroy() { - Log.i(TAG, "Destroying ImageSurfaceRenderer"); - inner.destroy(); - handler.post(this::destroyReaderWriter); - } - - private void destroyReaderWriter() { - writer.close(); - Log.i(TAG, "ImageWriter destroyed"); - reader.close(); - Log.i(TAG, "ImageReader destroyed"); - handlerThread.quitSafely(); - } - } -} diff --git a/engine/src/flutter/testing/scenario_app/android/app/src/main/java/dev/flutter/scenarios/PlatformViewsActivity.java b/engine/src/flutter/testing/scenario_app/android/app/src/main/java/dev/flutter/scenarios/PlatformViewsActivity.java deleted file mode 100644 index 80cde94422..0000000000 --- a/engine/src/flutter/testing/scenario_app/android/app/src/main/java/dev/flutter/scenarios/PlatformViewsActivity.java +++ /dev/null @@ -1,42 +0,0 @@ -// 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. - -package dev.flutter.scenarios; - -import androidx.annotation.NonNull; -import io.flutter.embedding.engine.FlutterEngine; - -public class PlatformViewsActivity extends TestActivity { - // WARNING: These strings must all be exactly the same length to avoid - // breaking the 'create' method's manual encoding in the test. See the - // TODO(stuartmorgan) about encoding alignment in platform_view.dart - public static final String TEXT_VIEW_PV = "scenarios/textPlatformView"; - public static final String SURFACE_VIEW_PV = "scenarios/surfacePlatformV"; - public static final String SURFACE_VIEW_BAD_CONTEXT_PV = "scenarios/surfaceVBadCntxt"; - public static final String TEXTURE_VIEW_PV = "scenarios/texturePlatformV"; - - @Override - public void configureFlutterEngine(@NonNull FlutterEngine flutterEngine) { - super.configureFlutterEngine(flutterEngine); - flutterEngine - .getPlatformViewsController() - .getRegistry() - .registerViewFactory(TEXT_VIEW_PV, new TextPlatformViewFactory()); - - flutterEngine - .getPlatformViewsController() - .getRegistry() - .registerViewFactory(SURFACE_VIEW_PV, new SurfacePlatformViewFactory(true)); - - flutterEngine - .getPlatformViewsController() - .getRegistry() - .registerViewFactory(SURFACE_VIEW_BAD_CONTEXT_PV, new SurfacePlatformViewFactory(false)); - - flutterEngine - .getPlatformViewsController() - .getRegistry() - .registerViewFactory(TEXTURE_VIEW_PV, new TexturePlatformViewFactory()); - } -} diff --git a/engine/src/flutter/testing/scenario_app/android/app/src/main/java/dev/flutter/scenarios/SpawnMultiEngineActivity.java b/engine/src/flutter/testing/scenario_app/android/app/src/main/java/dev/flutter/scenarios/SpawnMultiEngineActivity.java deleted file mode 100644 index d95adbd29c..0000000000 --- a/engine/src/flutter/testing/scenario_app/android/app/src/main/java/dev/flutter/scenarios/SpawnMultiEngineActivity.java +++ /dev/null @@ -1,32 +0,0 @@ -// 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. - -package dev.flutter.scenarios; - -import android.content.Context; -import androidx.annotation.NonNull; -import io.flutter.embedding.engine.FlutterEngine; -import io.flutter.embedding.engine.FlutterEngineGroup; - -public class SpawnMultiEngineActivity extends TestActivity { - static final String TAG = "Scenarios"; - - @Override - @NonNull - public FlutterEngine provideFlutterEngine(@NonNull Context context) { - FlutterEngineGroup engineGroup = new FlutterEngineGroup(context); - FlutterEngineGroup.Options options = - new FlutterEngineGroup.Options(context).setAutomaticallyRegisterPlugins(false); - FlutterEngine firstEngine = engineGroup.createAndRunEngine(options); - - FlutterEngine secondEngine = engineGroup.createAndRunEngine(options); - - // Check that a new engine can be spawned from the group even if the group's - // original engine has been destroyed. - firstEngine.destroy(); - FlutterEngine thirdEngine = engineGroup.createAndRunEngine(options); - - return thirdEngine; - } -} diff --git a/engine/src/flutter/testing/scenario_app/android/app/src/main/java/dev/flutter/scenarios/SpawnedEngineActivity.java b/engine/src/flutter/testing/scenario_app/android/app/src/main/java/dev/flutter/scenarios/SpawnedEngineActivity.java deleted file mode 100644 index 6026893f99..0000000000 --- a/engine/src/flutter/testing/scenario_app/android/app/src/main/java/dev/flutter/scenarios/SpawnedEngineActivity.java +++ /dev/null @@ -1,31 +0,0 @@ -// 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. - -package dev.flutter.scenarios; - -import android.content.Context; -import androidx.annotation.NonNull; -import io.flutter.embedding.engine.FlutterEngine; -import io.flutter.embedding.engine.FlutterEngineGroup; - -public class SpawnedEngineActivity extends TestActivity { - static final String TAG = "Scenarios"; - - @Override - @NonNull - public FlutterEngine provideFlutterEngine(@NonNull Context context) { - FlutterEngineGroup engineGroup = new FlutterEngineGroup(context); - FlutterEngineGroup.Options options = - new FlutterEngineGroup.Options(context).setAutomaticallyRegisterPlugins(false); - engineGroup.createAndRunEngine(options); - - FlutterEngine secondEngine = engineGroup.createAndRunEngine(options); - - secondEngine - .getDartExecutor() - .setMessageHandler("take_screenshot", (byteBuffer, binaryReply) -> notifyFlutterRendered()); - - return secondEngine; - } -} diff --git a/engine/src/flutter/testing/scenario_app/android/app/src/main/java/dev/flutter/scenarios/SurfacePlatformViewFactory.java b/engine/src/flutter/testing/scenario_app/android/app/src/main/java/dev/flutter/scenarios/SurfacePlatformViewFactory.java deleted file mode 100644 index 0524d3428b..0000000000 --- a/engine/src/flutter/testing/scenario_app/android/app/src/main/java/dev/flutter/scenarios/SurfacePlatformViewFactory.java +++ /dev/null @@ -1,112 +0,0 @@ -// 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. - -package dev.flutter.scenarios; - -import static io.flutter.Build.API_LEVELS; - -import android.annotation.TargetApi; -import android.content.Context; -import android.content.ContextWrapper; -import android.graphics.Canvas; -import android.graphics.Color; -import android.graphics.Paint; -import android.view.Surface; -import android.view.SurfaceHolder; -import android.view.SurfaceView; -import android.view.View; -import androidx.annotation.NonNull; -import androidx.annotation.Nullable; -import io.flutter.Log; -import io.flutter.plugin.common.MessageCodec; -import io.flutter.plugin.common.StringCodec; -import io.flutter.plugin.platform.PlatformView; -import io.flutter.plugin.platform.PlatformViewFactory; -import java.nio.ByteBuffer; - -@TargetApi(API_LEVELS.API_23) -public final class SurfacePlatformViewFactory extends PlatformViewFactory { - private boolean preserveContext; - - SurfacePlatformViewFactory(boolean preserveContext) { - super( - new MessageCodec() { - @Nullable - @Override - public ByteBuffer encodeMessage(@Nullable Object o) { - if (o instanceof String) { - return StringCodec.INSTANCE.encodeMessage((String) o); - } - return null; - } - - @Nullable - @Override - public Object decodeMessage(@Nullable ByteBuffer byteBuffer) { - return StringCodec.INSTANCE.decodeMessage(byteBuffer); - } - }); - this.preserveContext = preserveContext; - } - - @SuppressWarnings("unchecked") - @Override - @NonNull - public PlatformView create(@NonNull Context context, int id, @Nullable Object args) { - if (preserveContext) { - return new SurfacePlatformView(context); - } else { - final Context differentContext = new ContextWrapper(context); - return new SurfacePlatformView(differentContext); - } - } - - private static class SurfacePlatformView implements PlatformView { - static String TAG = "SurfacePlatformView"; - - final SurfaceView surfaceView; - - @SuppressWarnings("unchecked") - SurfacePlatformView(@NonNull final Context context) { - surfaceView = new SurfaceView(context); - surfaceView - .getHolder() - .addCallback( - new SurfaceHolder.Callback() { - @Override - public void surfaceCreated(SurfaceHolder holder) { - Log.i(TAG, "surfaceCreated"); - final Surface surface = holder.getSurface(); - final Canvas canvas = surface.lockHardwareCanvas(); - canvas.drawColor(Color.WHITE); - - final Paint paint = new Paint(); - paint.setColor(Color.RED); - canvas.drawCircle(canvas.getWidth() / 2, canvas.getHeight() / 2, 20, paint); - surface.unlockCanvasAndPost(canvas); - } - - @Override - public void surfaceChanged( - SurfaceHolder holder, int format, int width, int height) { - Log.i(TAG, "surfaceChanged"); - } - - @Override - public void surfaceDestroyed(SurfaceHolder holder) { - Log.i(TAG, "surfaceDestroyed"); - } - }); - } - - @Override - @NonNull - public View getView() { - return surfaceView; - } - - @Override - public void dispose() {} - } -} diff --git a/engine/src/flutter/testing/scenario_app/android/app/src/main/java/dev/flutter/scenarios/TestActivity.java b/engine/src/flutter/testing/scenario_app/android/app/src/main/java/dev/flutter/scenarios/TestActivity.java deleted file mode 100644 index c3b8b31e1e..0000000000 --- a/engine/src/flutter/testing/scenario_app/android/app/src/main/java/dev/flutter/scenarios/TestActivity.java +++ /dev/null @@ -1,121 +0,0 @@ -// 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. - -package dev.flutter.scenarios; - -import android.content.Context; -import android.content.Intent; -import android.os.Bundle; -import android.os.Handler; -import android.os.Looper; -import android.view.Window; -import androidx.annotation.NonNull; -import androidx.annotation.Nullable; -import androidx.core.view.WindowCompat; -import androidx.core.view.WindowInsetsCompat; -import androidx.core.view.WindowInsetsControllerCompat; -import io.flutter.FlutterInjector; -import io.flutter.embedding.engine.FlutterShellArgs; -import io.flutter.embedding.engine.loader.FlutterLoader; -import io.flutter.plugin.common.JSONMethodCodec; -import io.flutter.plugin.common.MethodChannel; -import java.util.HashMap; -import java.util.Map; -import java.util.Objects; -import java.util.concurrent.atomic.AtomicBoolean; - -public abstract class TestActivity extends TestableFlutterActivity { - @Override - protected void onCreate(@Nullable Bundle savedInstanceState) { - super.onCreate(savedInstanceState); - hideSystemBars(getWindow()); - testFlutterLoaderCallbackWhenInitializedTwice(); - } - - @Override - protected void onDestroy() { - super.onDestroy(); - } - - @Override - @NonNull - public FlutterShellArgs getFlutterShellArgs() { - FlutterShellArgs args = FlutterShellArgs.fromIntent(getIntent()); - args.add(FlutterShellArgs.ARG_TRACE_STARTUP); - args.add(FlutterShellArgs.ARG_ENABLE_DART_PROFILING); - args.add(FlutterShellArgs.ARG_VERBOSE_LOGGING); - return args; - } - - @Override - public void onFlutterUiDisplayed() { - final Intent launchIntent = getIntent(); - MethodChannel channel = - new MethodChannel( - Objects.requireNonNull(getFlutterEngine()).getDartExecutor(), - "driver", - JSONMethodCodec.INSTANCE); - Map test = new HashMap<>(2); - if (launchIntent.hasExtra("scenario_name")) { - test.put("name", launchIntent.getStringExtra("scenario_name")); - } else { - test.put("name", "animated_color_square"); - } - test.put("use_android_view", launchIntent.getBooleanExtra("use_android_view", false)); - test.put( - "expect_android_view_fallback", - launchIntent.getBooleanExtra("expect_android_view_fallback", false)); - test.put("view_type", launchIntent.getStringExtra("view_type")); - getScenarioParams(test); - channel.invokeMethod("set_scenario", test); - } - - /** - * Populates test-specific parameters that are sent to the Dart test scenario. - * - * @param args The map of test arguments - */ - protected void getScenarioParams(@NonNull Map args) {} - - /** - * This method verifies that {@link - * io.flutter.embedding.engine.loader.FlutterLoader#ensureInitializationCompleteAsync(Context, - * String[], Handler, Runnable)} invokes its callback when called after initialization. - */ - protected void testFlutterLoaderCallbackWhenInitializedTwice() { - FlutterLoader flutterLoader = FlutterInjector.instance().flutterLoader(); - - // Flutter is probably already loaded in this app based on - // code that ran before this method. Nonetheless, invoke the - // blocking initialization here to ensure it's initialized. - flutterLoader.startInitialization(getApplicationContext()); - flutterLoader.ensureInitializationComplete(getApplication(), new String[] {}); - - // Now that Flutter is loaded, invoke ensureInitializationCompleteAsync with - // a callback and verify that the callback is invoked. - Handler mainHandler = new Handler(Looper.getMainLooper()); - - final AtomicBoolean didInvokeCallback = new AtomicBoolean(false); - - flutterLoader.ensureInitializationCompleteAsync( - getApplication(), new String[] {}, mainHandler, () -> didInvokeCallback.set(true)); - - mainHandler.post( - () -> { - if (!didInvokeCallback.get()) { - throw new RuntimeException( - "Failed test: FlutterLoader#ensureInitializationCompleteAsync() did not invoke its callback."); - } - }); - } - - private static void hideSystemBars(Window window) { - final WindowInsetsControllerCompat insetController = - WindowCompat.getInsetsController(window, window.getDecorView()); - assert insetController != null; - insetController.setSystemBarsBehavior( - WindowInsetsControllerCompat.BEHAVIOR_SHOW_TRANSIENT_BARS_BY_SWIPE); - insetController.hide(WindowInsetsCompat.Type.systemBars()); - } -} diff --git a/engine/src/flutter/testing/scenario_app/android/app/src/main/java/dev/flutter/scenarios/TestableFlutterActivity.java b/engine/src/flutter/testing/scenario_app/android/app/src/main/java/dev/flutter/scenarios/TestableFlutterActivity.java deleted file mode 100644 index 69c9dd0260..0000000000 --- a/engine/src/flutter/testing/scenario_app/android/app/src/main/java/dev/flutter/scenarios/TestableFlutterActivity.java +++ /dev/null @@ -1,52 +0,0 @@ -// 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. - -package dev.flutter.scenarios; - -import android.os.Bundle; -import android.view.WindowManager; -import androidx.annotation.NonNull; -import androidx.annotation.Nullable; -import io.flutter.embedding.android.FlutterActivity; -import io.flutter.embedding.engine.FlutterEngine; -import java.util.concurrent.CountDownLatch; - -public abstract class TestableFlutterActivity extends FlutterActivity { - private final CountDownLatch flutterUiRenderedLatch = new CountDownLatch(1); - - @Override - public void configureFlutterEngine(@NonNull FlutterEngine flutterEngine) { - // Do not call super. We have no plugins to register, and the automatic - // registration will fail and print a scary exception in the logs. - flutterEngine - .getDartExecutor() - .setMessageHandler("take_screenshot", (byteBuffer, binaryReply) -> notifyFlutterRendered()); - } - - @Override - protected void onCreate(@Nullable Bundle savedInstanceState) { - super.onCreate(savedInstanceState); - - // On newer versions of Android, this is the default. Because these tests are being used to take - // screenshots on Skia Gold, we don't want any of the System UI to show up, even for older API - // versions (i.e. 28). - // - // See also: - // https://github.com/flutter/engine/blob/a9081cce1f0dd730577a36ee1ca6d7af5cdc5a9b/shell/platform/android/io/flutter/embedding/android/FlutterView.java#L696 - // https://github.com/flutter/flutter/issues/143471 - getWindow().addFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN); - } - - protected void notifyFlutterRendered() { - flutterUiRenderedLatch.countDown(); - } - - public void waitUntilFlutterRendered() { - try { - flutterUiRenderedLatch.await(); - } catch (InterruptedException e) { - throw new RuntimeException(e); - } - } -} diff --git a/engine/src/flutter/testing/scenario_app/android/app/src/main/java/dev/flutter/scenarios/TextPlatformViewFactory.java b/engine/src/flutter/testing/scenario_app/android/app/src/main/java/dev/flutter/scenarios/TextPlatformViewFactory.java deleted file mode 100644 index 407e49796b..0000000000 --- a/engine/src/flutter/testing/scenario_app/android/app/src/main/java/dev/flutter/scenarios/TextPlatformViewFactory.java +++ /dev/null @@ -1,68 +0,0 @@ -// 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. - -package dev.flutter.scenarios; - -import android.content.Context; -import android.graphics.Color; -import android.view.View; -import android.widget.TextView; -import androidx.annotation.NonNull; -import androidx.annotation.Nullable; -import io.flutter.plugin.common.MessageCodec; -import io.flutter.plugin.common.StringCodec; -import io.flutter.plugin.platform.PlatformView; -import io.flutter.plugin.platform.PlatformViewFactory; -import java.nio.ByteBuffer; - -public final class TextPlatformViewFactory extends PlatformViewFactory { - TextPlatformViewFactory() { - super( - new MessageCodec() { - @Nullable - @Override - public ByteBuffer encodeMessage(@Nullable Object o) { - if (o instanceof String) { - return StringCodec.INSTANCE.encodeMessage((String) o); - } - return null; - } - - @Nullable - @Override - public Object decodeMessage(@Nullable ByteBuffer byteBuffer) { - return StringCodec.INSTANCE.decodeMessage(byteBuffer); - } - }); - } - - @SuppressWarnings("unchecked") - @Override - @NonNull - public PlatformView create(@NonNull Context context, int id, @Nullable Object args) { - String params = (String) args; - return new TextPlatformView(context, id, params); - } - - private static class TextPlatformView implements PlatformView { - final TextView textView; - - @SuppressWarnings("unchecked") - TextPlatformView(@NonNull final Context context, int id, @Nullable String params) { - textView = new TextView(context); - textView.setTextSize(72); - textView.setBackgroundColor(Color.WHITE); - textView.setText(params); - } - - @Override - @NonNull - public View getView() { - return textView; - } - - @Override - public void dispose() {} - } -} diff --git a/engine/src/flutter/testing/scenario_app/android/app/src/main/java/dev/flutter/scenarios/TexturePlatformViewFactory.java b/engine/src/flutter/testing/scenario_app/android/app/src/main/java/dev/flutter/scenarios/TexturePlatformViewFactory.java deleted file mode 100644 index 8664780374..0000000000 --- a/engine/src/flutter/testing/scenario_app/android/app/src/main/java/dev/flutter/scenarios/TexturePlatformViewFactory.java +++ /dev/null @@ -1,114 +0,0 @@ -// 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. - -package dev.flutter.scenarios; - -import static io.flutter.Build.API_LEVELS; - -import android.annotation.TargetApi; -import android.content.Context; -import android.graphics.Canvas; -import android.graphics.Color; -import android.graphics.Paint; -import android.graphics.SurfaceTexture; -import android.view.Choreographer; -import android.view.TextureView; -import android.view.View; -import androidx.annotation.NonNull; -import androidx.annotation.Nullable; -import io.flutter.Log; -import io.flutter.plugin.common.MessageCodec; -import io.flutter.plugin.common.StringCodec; -import io.flutter.plugin.platform.PlatformView; -import io.flutter.plugin.platform.PlatformViewFactory; -import java.nio.ByteBuffer; - -@TargetApi(API_LEVELS.API_23) -public final class TexturePlatformViewFactory extends PlatformViewFactory { - TexturePlatformViewFactory() { - super( - new MessageCodec() { - @Nullable - @Override - public ByteBuffer encodeMessage(@Nullable Object o) { - if (o instanceof String) { - return StringCodec.INSTANCE.encodeMessage((String) o); - } - return null; - } - - @Nullable - @Override - public Object decodeMessage(@Nullable ByteBuffer byteBuffer) { - return StringCodec.INSTANCE.decodeMessage(byteBuffer); - } - }); - } - - @SuppressWarnings("unchecked") - @Override - @NonNull - public PlatformView create(@NonNull Context context, int id, @Nullable Object args) { - return new TexturePlatformView(context); - } - - private static class TexturePlatformView implements PlatformView { - static String TAG = "TexturePlatformView"; - - final TextureView textureView; - - @SuppressWarnings("unchecked") - TexturePlatformView(@NonNull final Context context) { - textureView = new TextureView(context); - textureView.setSurfaceTextureListener( - new TextureView.SurfaceTextureListener() { - @Override - public void onSurfaceTextureAvailable(SurfaceTexture surface, int width, int height) { - Log.i(TAG, "onSurfaceTextureAvailable"); - final Canvas canvas = textureView.lockCanvas(); - canvas.drawColor(Color.WHITE); - - final Paint paint = new Paint(); - paint.setColor(Color.GREEN); - canvas.drawCircle(canvas.getWidth() / 2, canvas.getHeight() / 2, 20, paint); - textureView.unlockCanvasAndPost(canvas); - Choreographer.getInstance() - .postFrameCallbackDelayed( - new Choreographer.FrameCallback() { - @Override - public void doFrame(long frameTimeNanos) { - textureView.invalidate(); - } - }, - 500); - } - - @Override - public boolean onSurfaceTextureDestroyed(SurfaceTexture surface) { - Log.i(TAG, "onSurfaceTextureDestroyed"); - return true; - } - - @Override - public void onSurfaceTextureSizeChanged(SurfaceTexture surface, int width, int height) { - Log.i(TAG, "onSurfaceTextureSizeChanged"); - } - - @Override - public void onSurfaceTextureUpdated(SurfaceTexture surface) { - Log.i(TAG, "onSurfaceTextureUpdated"); - } - }); - } - - @Override - @NonNull - public View getView() { - return textureView; - } - - @Override - public void dispose() {} - } -} diff --git a/engine/src/flutter/testing/scenario_app/android/app/src/main/res/values/colors.xml b/engine/src/flutter/testing/scenario_app/android/app/src/main/res/values/colors.xml deleted file mode 100644 index 69b22338c6..0000000000 --- a/engine/src/flutter/testing/scenario_app/android/app/src/main/res/values/colors.xml +++ /dev/null @@ -1,6 +0,0 @@ - - - #008577 - #00574B - #D81B60 - diff --git a/engine/src/flutter/testing/scenario_app/android/app/src/main/res/values/styles.xml b/engine/src/flutter/testing/scenario_app/android/app/src/main/res/values/styles.xml deleted file mode 100644 index af4477a1bc..0000000000 --- a/engine/src/flutter/testing/scenario_app/android/app/src/main/res/values/styles.xml +++ /dev/null @@ -1,12 +0,0 @@ - - - - - - diff --git a/engine/src/flutter/testing/scenario_app/android/app/src/main/res/xml/data_extraction_rules.xml b/engine/src/flutter/testing/scenario_app/android/app/src/main/res/xml/data_extraction_rules.xml deleted file mode 100644 index 9ec01e6da1..0000000000 --- a/engine/src/flutter/testing/scenario_app/android/app/src/main/res/xml/data_extraction_rules.xml +++ /dev/null @@ -1,18 +0,0 @@ - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/engine/src/flutter/testing/scenario_app/android/app/src/main/res/xml/extraction_config_11_and_below.xml b/engine/src/flutter/testing/scenario_app/android/app/src/main/res/xml/extraction_config_11_and_below.xml deleted file mode 100644 index ff293d0205..0000000000 --- a/engine/src/flutter/testing/scenario_app/android/app/src/main/res/xml/extraction_config_11_and_below.xml +++ /dev/null @@ -1,8 +0,0 @@ - - - - - - - - \ No newline at end of file diff --git a/engine/src/flutter/testing/scenario_app/android/build.gradle b/engine/src/flutter/testing/scenario_app/android/build.gradle deleted file mode 100644 index 0c0f4cb5e0..0000000000 --- a/engine/src/flutter/testing/scenario_app/android/build.gradle +++ /dev/null @@ -1,50 +0,0 @@ -// Top-level build file where you can add configuration options common to all sub-projects/modules. - -buildscript { - repositories { - google() - mavenCentral() - } - dependencies { - classpath 'com.facebook.testing.screenshot:plugin:0.12.0' - // leakcanary uses Kotlin. This app does not, but the plugin is - // needed to specify language version options. - // Gradle 8.0 requires minimum kotlin 1.6.10 - // https://docs.gradle.org/current/userguide/upgrading_version_7.html#legacy_incrementaltaskinputs_api - classpath 'org.jetbrains.kotlin:kotlin-gradle-plugin:1.7.10' - // Requries Minimum AGP 7.3. - // https://docs.gradle.org/current/userguide/upgrading_version_7.html#legacy_incrementaltaskinputs_api - classpath 'com.android.tools.build:gradle:8.2.0' - - - // NOTE: Do not place your application dependencies here; they belong - // in the individual module build.gradle files - } - configurations.classpath { - resolutionStrategy.activateDependencyLocking() - } -} - -allprojects { - repositories { - google() - mavenCentral() - } -} - -rootProject.buildDir = project.hasProperty('out_dir') - ? project.property('out_dir') - : '../build' - -subprojects { - project.buildDir = "${rootProject.buildDir}/${project.name}" - project.evaluationDependsOn(':app') - - dependencyLocking { - lockAllConfigurations() - } -} - -task clean(type: Delete) { - delete rootProject.buildDir -} diff --git a/engine/src/flutter/testing/scenario_app/android/expected_golden_output.txt b/engine/src/flutter/testing/scenario_app/android/expected_golden_output.txt deleted file mode 100644 index 2d4b3ad7b4..0000000000 --- a/engine/src/flutter/testing/scenario_app/android/expected_golden_output.txt +++ /dev/null @@ -1,57 +0,0 @@ -DrawSolidBlueScreenTest.png -ExternalTextureTests_testCanvasSurface.png -ExternalTextureTests_testMediaSurface.png -PlatformTextureUiTests_testPlatformView.png -PlatformTextureUiTests_testPlatformViewClippath.png -PlatformTextureUiTests_testPlatformViewCliprect.png -PlatformTextureUiTests_testPlatformViewCliprrect.png -PlatformTextureUiTests_testPlatformViewMultiple.png -PlatformTextureUiTests_testPlatformViewMultipleBackgroundForeground.png -PlatformTextureUiTests_testPlatformViewMultipleWithoutOverlays.png -PlatformTextureUiTests_testPlatformViewOpacity.png -PlatformTextureUiTests_testPlatformViewRotate.png -PlatformTextureUiTests_testPlatformViewTransform.png -PlatformTextureUiTests_testPlatformViewTwoIntersectingOverlays.png -PlatformTextureUiTests_testPlatformViewWithoutOverlayIntersection.png -PlatformViewUiTests_testPlatformView.png -PlatformViewUiTests_testPlatformViewClippath.png -PlatformViewUiTests_testPlatformViewCliprect.png -PlatformViewUiTests_testPlatformViewCliprrect.png -PlatformViewUiTests_testPlatformViewMultiple.png -PlatformViewUiTests_testPlatformViewMultipleBackgroundForeground.png -PlatformViewUiTests_testPlatformViewMultipleWithoutOverlays.png -PlatformViewUiTests_testPlatformViewOpacity.png -PlatformViewUiTests_testPlatformViewRotate.png -PlatformViewUiTests_testPlatformViewTransform.png -PlatformViewUiTests_testPlatformViewTwoIntersectingOverlays.png -PlatformViewUiTests_testPlatformViewWithoutOverlayIntersection.png -PlatformViewWithSurfaceViewBadContextUiTest_testPlatformView.png -PlatformViewWithSurfaceViewHybridFallbackUiTest_testPlatformView.png -PlatformViewWithSurfaceViewHybridUiTest_testPlatformView.png -PlatformViewWithSurfaceViewUiTest_testPlatformView.png -PlatformViewWithSurfaceViewUiTest_testPlatformViewClippath.png -PlatformViewWithSurfaceViewUiTest_testPlatformViewCliprect.png -PlatformViewWithSurfaceViewUiTest_testPlatformViewCliprrect.png -PlatformViewWithSurfaceViewUiTest_testPlatformViewMultiple.png -PlatformViewWithSurfaceViewUiTest_testPlatformViewMultipleBackgroundForeground.png -PlatformViewWithSurfaceViewUiTest_testPlatformViewMultipleWithoutOverlays.png -PlatformViewWithSurfaceViewUiTest_testPlatformViewOpacity.png -PlatformViewWithSurfaceViewUiTest_testPlatformViewRotate.png -PlatformViewWithSurfaceViewUiTest_testPlatformViewTransform.png -PlatformViewWithSurfaceViewUiTest_testPlatformViewTwoIntersectingOverlays.png -PlatformViewWithSurfaceViewUiTest_testPlatformViewWithoutOverlayIntersection.png -PlatformViewWithTextureViewUiTest_testPlatformView.png -PlatformViewWithTextureViewUiTest_testPlatformViewClippath.png -PlatformViewWithTextureViewUiTest_testPlatformViewCliprect.png -PlatformViewWithTextureViewUiTest_testPlatformViewCliprrect.png -PlatformViewWithTextureViewUiTest_testPlatformViewMultiple.png -PlatformViewWithTextureViewUiTest_testPlatformViewMultipleBackgroundForeground.png -PlatformViewWithTextureViewUiTest_testPlatformViewMultipleWithoutOverlays.png -PlatformViewWithTextureViewUiTest_testPlatformViewOpacity.png -PlatformViewWithTextureViewUiTest_testPlatformViewRotate.png -PlatformViewWithTextureViewUiTest_testPlatformViewTransform.png -PlatformViewWithTextureViewUiTest_testPlatformViewTwoIntersectingOverlays.png -PlatformViewWithTextureViewUiTest_testPlatformViewWithoutOverlayIntersection.png -SpawnEngineTests_testSpawnedEngine.png -logcat.txt -noop.txt diff --git a/engine/src/flutter/testing/scenario_app/android/gradle.properties b/engine/src/flutter/testing/scenario_app/android/gradle.properties deleted file mode 100644 index 0b5c48ae64..0000000000 --- a/engine/src/flutter/testing/scenario_app/android/gradle.properties +++ /dev/null @@ -1,4 +0,0 @@ -org.gradle.jvmargs=-Xmx2048M -android.useAndroidX=true -android.enableJetifier=true -android.builder.sdkDownload=false diff --git a/engine/src/flutter/testing/scenario_app/android/settings.gradle b/engine/src/flutter/testing/scenario_app/android/settings.gradle deleted file mode 100644 index e7b4def49c..0000000000 --- a/engine/src/flutter/testing/scenario_app/android/settings.gradle +++ /dev/null @@ -1 +0,0 @@ -include ':app' diff --git a/engine/src/flutter/testing/scenario_app/bin/README.md b/engine/src/flutter/testing/scenario_app/bin/README.md deleted file mode 100644 index 9dd9b9d5b5..0000000000 --- a/engine/src/flutter/testing/scenario_app/bin/README.md +++ /dev/null @@ -1,8 +0,0 @@ -# Scenario App Android Test Runner - -This directory contains code specific to running Android integration tests. - -The tests are uploaded and run on the device using `adb`, and screenshots are -captured and compared using Skia Gold (if available, for example on CI). - -See [running the tests](../android/README.md#running-the-tests) for more information. diff --git a/engine/src/flutter/testing/scenario_app/bin/run_android_tests.dart b/engine/src/flutter/testing/scenario_app/bin/run_android_tests.dart deleted file mode 100644 index 7b79e8e326..0000000000 --- a/engine/src/flutter/testing/scenario_app/bin/run_android_tests.dart +++ /dev/null @@ -1,659 +0,0 @@ -// 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 'dart:async'; -import 'dart:convert'; -import 'dart:io'; - -import 'package:dir_contents_diff/dir_contents_diff.dart' show dirContentsDiff; -import 'package:engine_repo_tools/engine_repo_tools.dart'; -import 'package:path/path.dart'; -import 'package:process/process.dart'; -import 'package:skia_gold_client/skia_gold_client.dart'; - -import 'utils/adb_logcat_filtering.dart'; -import 'utils/environment.dart'; -import 'utils/logs.dart'; -import 'utils/options.dart'; -import 'utils/process_manager_extension.dart'; -import 'utils/screenshot_transformer.dart'; - -// If you update the arguments, update the documentation in the README.md file. -void main(List args) async { - // Get some basic environment information to guide the rest of the program. - final Environment environment = Environment( - isCi: Platform.environment['LUCI_CONTEXT'] != null, - showVerbose: Options.showVerbose(args), - logsDir: Platform.environment['FLUTTER_LOGS_DIR'], - ); - - // Determine if the CWD is within an engine checkout. - final Engine? localEngineDir = Engine.tryFindWithin(); - - // Show usage if requested. - if (Options.showUsage(args)) { - stdout.writeln(Options.usage(environment: environment, localEngineDir: localEngineDir)); - return; - } - - // Parse the command line arguments. - final Options options; - try { - options = Options.parse(args, environment: environment, localEngine: localEngineDir); - } on FormatException catch (error) { - stderr.writeln(error); - stderr.writeln(Options.usage(environment: environment, localEngineDir: localEngineDir)); - exitCode = 1; - return; - } - - // Capture CTRL-C. - late final StreamSubscription onSigint; - - // Capture requested termination. The goal is to catch timeouts. - late final StreamSubscription onSigterm; - void cancelSignalHandlers() { - onSigint.cancel(); - onSigterm.cancel(); - } - - runZonedGuarded( - () async { - onSigint = ProcessSignal.sigint.watch().listen((_) { - cancelSignalHandlers(); - panic(['Received SIGINT']); - }); - onSigterm = ProcessSignal.sigterm.watch().listen((_) { - cancelSignalHandlers(); - panic(['Received SIGTERM']); - }); - await _run( - verbose: options.verbose, - outDir: Directory(options.outDir), - adb: File(options.adb), - smokeTestFullPath: options.smokeTest, - useSkiaGold: options.useSkiaGold, - enableImpeller: options.enableImpeller, - impellerBackend: _ImpellerBackend.tryParse(options.impellerBackend), - logsDir: Directory(options.logsDir), - contentsGolden: options.outputContentsGolden, - ndkStack: options.ndkStack, - forceSurfaceProducerSurfaceTexture: options.forceSurfaceProducerSurfaceTexture, - prefixLogsPerRun: options.prefixLogsPerRun, - recordScreen: options.recordScreen, - ); - onSigint.cancel(); - exit(0); - }, - (Object error, StackTrace stackTrace) { - onSigint.cancel(); - if (error is! Panic) { - stderr.writeln('Unhandled error: $error'); - stderr.writeln(stackTrace); - } - exitCode = 1; - }, - ); -} - -const int _tcpPort = 3001; - -enum _ImpellerBackend { - vulkan, - opengles; - - static _ImpellerBackend? tryParse(String? value) { - for (final _ImpellerBackend backend in _ImpellerBackend.values) { - if (backend.name == value) { - return backend; - } - } - return null; - } -} - -Future _run({ - required bool verbose, - required Directory outDir, - required File adb, - required String? smokeTestFullPath, - required bool useSkiaGold, - required bool enableImpeller, - required _ImpellerBackend? impellerBackend, - required Directory logsDir, - required String? contentsGolden, - required String ndkStack, - required bool forceSurfaceProducerSurfaceTexture, - required bool prefixLogsPerRun, - required bool recordScreen, -}) async { - const ProcessManager pm = LocalProcessManager(); - final String scenarioAppPath = join(outDir.path, 'scenario_app'); - - // Due to the CI environment, the logs directory persists between runs and - // even different builds. Because we're checking the output directory after - // each run, we need a clean logs directory to avoid false positives. - // - // Only after the runner is done, we can move the logs to the final location. - // - // See [_copyFiles] below and https://github.com/flutter/flutter/issues/144402. - final Directory finalLogsDir = logsDir..createSync(recursive: true); - logsDir = Directory.systemTemp.createTempSync('scenario_app_test_logs.'); - final String logcatPath = join(logsDir.path, 'logcat.txt'); - - final String screenshotPath = logsDir.path; - final String apkOutPath = join(scenarioAppPath, 'app', 'outputs', 'apk'); - final File testApk = File(join(apkOutPath, 'androidTest', 'debug', 'app-debug-androidTest.apk')); - final File appApk = File(join(apkOutPath, 'debug', 'app-debug.apk')); - log('writing logs and screenshots to ${logsDir.path}'); - - if (!testApk.existsSync()) { - panic([ - 'test apk does not exist: ${testApk.path}', - 'make sure to build the selected engine variant', - ]); - } - - if (!appApk.existsSync()) { - panic([ - 'app apk does not exist: ${appApk.path}', - 'make sure to build the selected engine variant', - ]); - } - - // Start a TCP socket in the host, and forward it to the device that runs the tests. - // This allows the test process to start a connection with the host, and write the bytes - // for the screenshots. - // On LUCI, the host uploads the screenshots to Skia Gold. - SkiaGoldClient? skiaGoldClient; - late final ServerSocket server; - final List> pendingComparisons = >[]; - final List pendingConnections = []; - int comparisonsFailed = 0; - await step('Starting server...', () async { - server = await ServerSocket.bind(InternetAddress.anyIPv4, _tcpPort); - if (verbose) { - stdout.writeln('listening on host ${server.address.address}:${server.port}'); - } - server.listen((Socket client) { - if (verbose) { - stdout.writeln('client connected ${client.remoteAddress.address}:${client.remotePort}'); - } - pendingConnections.add(client); - client - .transform(const ScreenshotBlobTransformer()) - .listen( - (Screenshot screenshot) async { - final String fileName = screenshot.filename; - final String filePath = join(screenshotPath, fileName); - { - const String remotePath = '/data/local/tmp/flutter_screenshot.png'; - ProcessResult result = await pm.run([ - 'adb', - 'shell', - 'screencap', - '-p', - remotePath, - ]); - if (result.exitCode != 0) { - panic(['Failed to capture screenshot']); - } - result = await pm.run(['adb', 'pull', remotePath, filePath]); - if (result.exitCode != 0) { - panic(['Failed to pull screenshot']); - } - result = await pm.run(['adb', 'shell', 'rm', remotePath]); - if (result.exitCode != 0) { - stderr.writeln('Warning: failed to delete old screenshot on device.'); - } - } - // Write a single byte into the socket as a signal to ScreenshotUtil.java - // that the screenshot was taken. - client.write(0x8); - - assert(skiaGoldClient != null, 'expected Skia Gold client'); - final File goldenFile = File(filePath); - if (verbose) { - log('wrote ${goldenFile.absolute.path}'); - } - if (SkiaGoldClient.isAvailable()) { - final Future comparison = skiaGoldClient! - .addImg( - fileName, - goldenFile, - screenshotSize: screenshot.pixelCount, - // Each color channel can be off by 2. - pixelColorDelta: 8, - ) - .then((_) => logImportant('skia gold comparison succeeded: $fileName')) - .catchError((Object error) { - logWarning('skia gold comparison failed: $error'); - comparisonsFailed++; - }); - pendingComparisons.add(comparison); - } - }, - onDone: () { - pendingConnections.remove(client); - }, - ); - }); - }); - - late Process logcatProcess; - late Future logcatProcessExitCode; - _ImpellerBackend? actualImpellerBackend; - Process? screenRecordProcess; - - final IOSink logcat = File(logcatPath).openWrite(); - try { - await step('Creating screenshot directory `$screenshotPath`...', () async { - Directory(screenshotPath).createSync(recursive: true); - }); - - await step('Starting logcat...', () async { - final int exitCode = await pm.runAndForward([adb.path, 'logcat', '-c']); - if (exitCode != 0) { - panic(['could not clear logs']); - } - - logcatProcess = await pm.start([adb.path, 'logcat', '-T', '1']); - final (Future logcatExitCode, Stream logcatOutput) = getProcessStreams( - logcatProcess, - ); - - logcatProcessExitCode = logcatExitCode; - String? filterProcessId; - - logcatOutput.listen( - (String line) { - // Always write to the full log. - logcat.writeln(line); - if (enableImpeller && - actualImpellerBackend == null && - line.contains('Using the Impeller rendering backend')) { - if (line.contains('OpenGLES')) { - actualImpellerBackend = _ImpellerBackend.opengles; - } else if (line.contains('Vulkan')) { - actualImpellerBackend = _ImpellerBackend.vulkan; - } else { - panic([ - 'Impeller was enabled, but $line did not contain "OpenGLES" or "Vulkan".', - ]); - } - } - - // Conditionally parse and write to stderr. - final AdbLogLine? adbLogLine = AdbLogLine.tryParse(line); - if (verbose || adbLogLine == null) { - log(line); - return; - } - - // If we haven't already found a process ID, try to find one. - // The process ID will help us filter out logs from other processes. - filterProcessId ??= adbLogLine.tryParseProcess(); - - // If this is a "verbose" log, possibly skip it. - final bool isVerbose = adbLogLine.isVerbose(filterProcessId: filterProcessId); - if (isVerbose || filterProcessId == null) { - // We've requested verbose output, so print everything. - if (verbose) { - adbLogLine.printFormatted(); - } - return; - } - - // It's a non-verbose log, so print it. - adbLogLine.printFormatted(); - }, - onError: (Object? err) { - if (verbose) { - logWarning('logcat stream error: $err'); - } - }, - ); - }); - - await step('Configuring emulator...', () async { - final int exitCode = await pm.runAndForward([ - adb.path, - 'shell', - 'settings', - 'put', - 'secure', - 'immersive_mode_confirmations', - 'confirmed', - ]); - if (exitCode != 0) { - panic(['could not configure emulator']); - } - }); - - await step('Get API level of connected device...', () async { - final ProcessResult apiLevelProcessResult = await pm.run([ - adb.path, - 'shell', - 'getprop', - 'ro.build.version.sdk', - ]); - if (apiLevelProcessResult.exitCode != 0) { - panic(['could not get API level of the connected device']); - } - final String connectedDeviceAPILevel = (apiLevelProcessResult.stdout as String).trim(); - final Map dimensions = { - 'AndroidAPILevel': connectedDeviceAPILevel, - 'GraphicsBackend': enableImpeller ? 'impeller-${impellerBackend!.name}' : 'skia', - 'ForceSurfaceProducerSurfaceTexture': '$forceSurfaceProducerSurfaceTexture', - }; - log('using dimensions: ${json.encode(dimensions)}'); - skiaGoldClient = SkiaGoldClient(outDir, dimensions: dimensions); - }); - - await step('Skia Gold auth...', () async { - if (SkiaGoldClient.isAvailable()) { - await skiaGoldClient!.auth(); - log('skia gold client is available'); - } else { - if (useSkiaGold) { - panic(['skia gold client is unavailable']); - } else { - log('skia gold client is unavaialble'); - } - } - }); - - await step('Reverse port...', () async { - final int exitCode = await pm.runAndForward([ - adb.path, - 'reverse', - 'tcp:3000', - 'tcp:$_tcpPort', - ]); - if (exitCode != 0) { - panic(['could not forward port']); - } - }); - - await step('Installing app APK...', () async { - final int exitCode = await pm.runAndForward([adb.path, 'install', appApk.path]); - if (exitCode != 0) { - panic(['could not install app apk']); - } - }); - - await step('Installing test APK...', () async { - final int exitCode = await pm.runAndForward([adb.path, 'install', testApk.path]); - if (exitCode != 0) { - panic(['could not install test apk']); - } - }); - - if (recordScreen) { - await step('Recording screen...', () async { - // Create a /tmp directory on the device to store the screen recording. - final int exitCode = await pm.runAndForward([ - adb.path, - 'shell', - 'mkdir', - '-p', - join(_emulatorStoragePath, 'tmp'), - ]); - if (exitCode != 0) { - panic(['could not create /tmp directory on device']); - } - final String screenRecordingPath = join(_emulatorStoragePath, 'tmp', 'screen.mp4'); - screenRecordProcess = await pm.start([ - adb.path, - 'shell', - 'screenrecord', - '--time-limit=0', - '--bugreport', - screenRecordingPath, - ]); - log('writing screen recording to $screenRecordingPath'); - }); - } - - await step('Running instrumented tests...', () async { - final (int exitCode, StringBuffer out) = await pm.runAndCapture([ - adb.path, - 'shell', - 'am', - 'instrument', - '-w', - '--no-window-animation', - if (smokeTestFullPath != null) '-e class $smokeTestFullPath', - if (enableImpeller) '-e enable-impeller true' else '-e enable-impeller false', - if (impellerBackend != null) '-e impeller-backend ${impellerBackend.name}', - if (forceSurfaceProducerSurfaceTexture) '-e force-surface-producer-surface-texture true', - 'dev.flutter.scenarios.test/dev.flutter.TestRunner', - ]); - if (exitCode != 0) { - panic(['instrumented tests failed to run']); - } - // Unfortunately adb shell am instrument does not return a non-zero exit - // code when tests fail, but it does seem to print "FAILURES!!!" to - // stdout, so we can use that as a signal that something went wrong. - if (out.toString().contains('FAILURES!!!')) { - stdout.write(out); - panic(['1 or more tests failed']); - } else if (comparisonsFailed > 0) { - panic(['$comparisonsFailed Skia Gold comparisons failed']); - } - }); - - if (enableImpeller) { - await step('Validating Impeller...', () async { - final _ImpellerBackend expectedImpellerBackend = impellerBackend ?? _ImpellerBackend.vulkan; - if (actualImpellerBackend != expectedImpellerBackend) { - panic([ - '--enable-impeller was specified and expected to find "${expectedImpellerBackend.name}", which did not match "${actualImpellerBackend?.name ?? ''}".', - ]); - } - }); - } - - await step('Wait for pending Skia gold comparisons...', () async { - await Future.wait(pendingComparisons); - }); - - final bool allTestsRun = smokeTestFullPath == null; - final bool checkGoldens = contentsGolden != null; - if (allTestsRun && checkGoldens) { - // Check the output here. - await step('Check output files...', () async { - // TODO(matanlurey): Resolve this in a better way. On CI this file always exists. - File(join(screenshotPath, 'noop.txt')).writeAsStringSync(''); - // TODO(gaaclarke): We should move this into dir_contents_diff. - final String diffScreenhotPath = absolute(screenshotPath); - _withTemporaryCwd(absolute(dirname(contentsGolden)), () { - final int exitCode = dirContentsDiff(basename(contentsGolden), diffScreenhotPath); - if (exitCode != 0) { - panic(['Output contents incorrect.']); - } - }); - }); - } - } finally { - // The finally clause is entered if: - // - The tests have completed successfully. - // - Any step has failed. - // - // Do *NOT* throw exceptions or errors in this block, as these are cleanup - // steps and the program is about to exit. Instead, just log the error and - // continue with the cleanup. - - await server.close(); - for (final Socket client in pendingConnections.toList()) { - client.close(); - } - - await step('Killing test app and test runner...', () async { - final int exitCode = await pm.runAndForward([ - adb.path, - 'shell', - 'am', - 'force-stop', - 'dev.flutter.scenarios', - ]); - if (exitCode != 0) { - logError('could not kill test app'); - } - }); - - if (screenRecordProcess != null) { - await step('Killing screen recording process...', () async { - // Kill the screen recording process. - screenRecordProcess!.kill(ProcessSignal.sigkill); - await screenRecordProcess!.exitCode; - - // Pull the screen recording from the device. - final String screenRecordingPath = join(_emulatorStoragePath, 'tmp', 'screen.mp4'); - final String screenRecordingLocalPath = join(logsDir.path, 'screen.mp4'); - final int exitCode = await pm.runAndForward([ - adb.path, - 'pull', - screenRecordingPath, - screenRecordingLocalPath, - ]); - if (exitCode != 0) { - logError('could not pull screen recording from device'); - } - - log('wrote screen recording to $screenRecordingLocalPath'); - - // Remove the screen recording from the device. - final int removeExitCode = await pm.runAndForward([ - adb.path, - 'shell', - 'rm', - screenRecordingPath, - ]); - if (removeExitCode != 0) { - logError('could not remove screen recording from device'); - } - }); - } - - await step('Killing logcat process...', () async { - final bool delivered = logcatProcess.kill(ProcessSignal.sigkill); - assert(delivered); - await logcatProcessExitCode; - }); - - await step('Flush logcat...', () async { - await logcat.flush(); - await logcat.close(); - log('wrote logcat to $logcatPath'); - - // Copy the logs to the final location. - // Optionally prefix the logs with a run number and backend name. - // See https://github.com/flutter/flutter/issues/144402. - final StringBuffer prefix = StringBuffer(); - if (prefixLogsPerRun) { - final int rerunNumber = _getAndIncrementRerunNumber(finalLogsDir.path); - prefix.write('run_$rerunNumber.'); - if (enableImpeller) { - prefix.write('impeller'); - } else { - prefix.write('skia'); - } - if (enableImpeller) { - prefix.write('_${impellerBackend!.name}'); - } - if (forceSurfaceProducerSurfaceTexture) { - prefix.write('_force-st'); - } - prefix.write('.'); - } - _copyFiles(source: logsDir, destination: finalLogsDir, prefix: prefix.toString()); - }); - - await step('Symbolize stack traces', () async { - final ProcessResult result = await pm.run([ - ndkStack, - '-sym', - outDir.path, - '-dump', - logcatPath, - ]); - if (result.exitCode != 0) { - panic(['Failed to symbolize stack traces']); - } - }); - - await step('Remove reverse port...', () async { - final int exitCode = await pm.runAndForward([ - adb.path, - 'reverse', - '--remove', - 'tcp:3000', - ]); - if (exitCode != 0) { - logError('could not unforward port'); - } - }); - - await step('Uninstalling app APK...', () async { - final int exitCode = await pm.runAndForward([ - adb.path, - 'uninstall', - 'dev.flutter.scenarios', - ]); - if (exitCode != 0) { - logError('could not uninstall app apk'); - } - }); - - await step('Uninstalling test APK...', () async { - final int exitCode = await pm.runAndForward([ - adb.path, - 'uninstall', - 'dev.flutter.scenarios.test', - ]); - if (exitCode != 0) { - logError('could not uninstall app apk'); - } - }); - } -} - -const String _emulatorStoragePath = '/storage/emulated/0/Download'; - -void _withTemporaryCwd(String path, void Function() callback) { - final String originalCwd = Directory.current.path; - Directory.current = Directory(path).path; - - try { - callback(); - } finally { - Directory.current = originalCwd; - } -} - -/// Reads the file named `reruns.txt` in the logs directory and returns the number of reruns. -/// -/// If the file does not exist, it is created with the number 1 and that number is returned. -int _getAndIncrementRerunNumber(String logsDir) { - final File rerunFile = File(join(logsDir, 'reruns.txt')); - if (!rerunFile.existsSync()) { - rerunFile.writeAsStringSync('1'); - return 1; - } - final int rerunNumber = int.parse(rerunFile.readAsStringSync()) + 1; - rerunFile.writeAsStringSync(rerunNumber.toString()); - return rerunNumber; -} - -/// Copies the contents of [source] to [destination], optionally adding a [prefix] to the destination path. -/// -/// This function is used to copy the screenshots from the device to the logs directory. -void _copyFiles({required Directory source, required Directory destination, String prefix = ''}) { - for (final FileSystemEntity entity in source.listSync()) { - if (entity is File) { - entity.copySync(join(destination.path, prefix + basename(entity.path))); - } - } -} diff --git a/engine/src/flutter/testing/scenario_app/bin/utils/adb_logcat_filtering.dart b/engine/src/flutter/testing/scenario_app/bin/utils/adb_logcat_filtering.dart deleted file mode 100644 index f1534a26e7..0000000000 --- a/engine/src/flutter/testing/scenario_app/bin/utils/adb_logcat_filtering.dart +++ /dev/null @@ -1,182 +0,0 @@ -// 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. - -/// Some notes about filtering `adb logcat` output, especially as a result of -/// running `adb shell` to instrument the app and test scripts, as it's -/// non-trivial and error-prone. -/// -/// 1. It's probably worth keeping `ActivityManager` lines unconditionally. -/// They are the most important ones, and they are not too verbose (for -/// example, they don't typically contain stack traces). -/// -/// 2. `ActivityManager` starts with the application name and process ID: -/// -/// ```txt -/// [stdout] 02-15 10:20:36.914 1735 1752 I ActivityManager: Start proc 6840:dev.flutter.scenarios/u0a98 for added application dev.flutter.scenarios -/// ``` -/// -/// The "application" comes from the file `android/app/build.gradle` under -/// `android > defaultConfig > applicationId`. -/// -/// 3. Once we have the process ID, we can filter the logcat output further: -/// -/// ```txt -/// [stdout] 02-15 10:20:37.430 6840 6840 E GeneratedPluginsRegister: Tried to automatically register plugins with FlutterEngine (io.flutter.embedding.engine.FlutterEngine@144d737) but could not find or invoke the GeneratedPluginRegistrant. -/// ``` -/// -/// A sample output of `adb logcat` command lives in `./sample_adb_logcat.txt`. -/// -/// See also: . -library; - -import 'package:meta/meta.dart'; - -import 'logs.dart'; - -/// Represents a line of `adb logcat` output parsed into a structured form. -/// -/// For example the line: -/// ```txt -/// 02-22 13:54:39.839 549 3683 I ActivityManager: Force stopping dev.flutter.scenarios appid=10226 user=0: start instr -/// ``` -/// -/// ## Implementation notes -/// -/// The reason this is an extension type and not a class is partially to use the -/// language feature, and partially because extension types work really well -/// with lazy parsing. -extension type const AdbLogLine._(Match _match) { - // RegEx that parses into the following groups: - // 1. The time of the log message, such as `02-22 13:54:39.839`. - // 2. The process ID. - // 3. The thread ID. - // 4. The character representing the severity of the log message, such as `I`. - // 5. The tag, such as `ActivityManager`. - // 6. The actual log message. - // - // This regex is simple versus being more precise. Feel free to improve it. - static final RegExp _pattern = RegExp( - r'(\d+-\d+\s[\d|:]+\.\d+)\s+(\d+)\s+(\d+)\s(\w)\s(\S+)\s*:\s*(.*)', - ); - - /// Parses the given [adbLogCatLine] into a structured form. - /// - /// Returns `null` if the line does not match the expected format. - static AdbLogLine? tryParse(String adbLogCatLine) { - final Match? match = _pattern.firstMatch(adbLogCatLine); - return match == null ? null : AdbLogLine._(match); - } - - /// Tries to parse the process that was started, if the log line is about it. - String? tryParseProcess() { - if (name == activityManagerTag && message.startsWith('Start proc')) { - // ActivityManager: Start proc 4475:dev.flutter.scenarios/u0a190 for added application ... - final RegExpMatch? match = RegExp( - 'Start proc (\\d+):$flutterProcessName', - ).firstMatch(message); - return match?.group(1); - } - return null; - } - - @visibleForTesting - static const String activityManagerTag = 'ActivityManager'; - - @visibleForTesting - static const String flutterProcessName = 'dev.flutter.scenarios'; - - @visibleForTesting - static const Set knownNoiseTags = { - 'CCodec', - 'CCodecBufferChannel', - 'CCodecConfig', - 'Codec2Client', - 'ColorUtils', - 'DMABUFHEAPS', - 'Gralloc4', - 'MediaCodec', - 'MonitoringInstr', - 'ResourceExtractor', - 'UsageTrackerFacilitator', - 'hw-BpHwBinder', - 'ziparchive', - }; - - @visibleForTesting - static const Set knownUsefulTags = {activityManagerTag}; - - @visibleForTesting - static const Set knownUsefulErrorTags = {'androidemu', 'THREAD_STATE'}; - - /// Returns `true` if the log line is verbose. - bool isVerbose({String? filterProcessId}) => !_isRelevant(filterProcessId: filterProcessId); - bool _isRelevant({String? filterProcessId}) { - // Fatal errors are always useful. - if (severity == 'F') { - return true; - } - - // Verbose and debug logs are rarely useful. - if (severity == 'V' || severity == 'D') { - return false; - } - - if (knownNoiseTags.contains(name)) { - return false; - } - - if (knownUsefulTags.contains(name)) { - return true; - } - - if (severity == 'E' && knownUsefulErrorTags.contains(name)) { - return true; - } - - // If a process ID is specified, exclude logs _not_ from that process. - if (filterProcessId == null) { - // YOLO, let's keep it anyway. - return name.toLowerCase().contains('flutter') || message.toLowerCase().contains('flutter'); - } - - return process == filterProcessId; - } - - /// Logs the line to the console. - void printFormatted() { - final String formatted = '$time [$severity] $name: $message'; - if (severity == 'W' || severity == 'E' || severity == 'F') { - logWarning(formatted); - } else if (name == 'TestRunner') { - logImportant(formatted); - } else { - log(formatted); - } - } - - /// The full line of `adb logcat` output. - String get line => _match.group(0)!; - - /// The time of the log message, such as `02-22 13:54:39.839`. - String get time => _match.group(1)!; - - /// The process ID. - String get process => _match.group(2)!; - - /// The thread ID. - String get thread => _match.group(3)!; - - /// The character representing the severity of the log message, such as `I`. - String get severity => _match.group(4)!; - - /// The tag, such as `ActivityManager`. - String get name => _match.group(5)!; - - /// The actual log message. - String get message => _match.group(6)!; - - String toDebugString() { - return 'AdbLogLine(time: $time, process: $process, thread: $thread, severity: $severity, name: $name, message: $message)'; - } -} diff --git a/engine/src/flutter/testing/scenario_app/bin/utils/environment.dart b/engine/src/flutter/testing/scenario_app/bin/utils/environment.dart deleted file mode 100644 index 0d2ffa93c7..0000000000 --- a/engine/src/flutter/testing/scenario_app/bin/utils/environment.dart +++ /dev/null @@ -1,41 +0,0 @@ -// 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 'package:meta/meta.dart'; - -/// An overridable collection of values provided by the environment. -@immutable -final class Environment { - /// Creates a new environment from the given values. - const Environment({required this.isCi, required this.showVerbose, required this.logsDir}); - - /// Whether the current program is running on a CI environment. - /// - /// Useful for determining if certain features should be enabled or disabled - /// based on the environment, or to add safety checks (for example, using - /// confusing or ambiguous flags). - final bool isCi; - - /// Whether the user has requested verbose logging and program output. - final bool showVerbose; - - /// What directory to store logs and screenshots in. - final String? logsDir; - - @override - bool operator ==(Object o) { - return o is Environment && - o.isCi == isCi && - o.showVerbose == showVerbose && - o.logsDir == logsDir; - } - - @override - int get hashCode => Object.hash(isCi, showVerbose, logsDir); - - @override - String toString() { - return 'Environment(isCi: $isCi, showVerbose: $showVerbose, logsDir: $logsDir)'; - } -} diff --git a/engine/src/flutter/testing/scenario_app/bin/utils/logs.dart b/engine/src/flutter/testing/scenario_app/bin/utils/logs.dart deleted file mode 100644 index 34e1715ae7..0000000000 --- a/engine/src/flutter/testing/scenario_app/bin/utils/logs.dart +++ /dev/null @@ -1,51 +0,0 @@ -// 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 'dart:io'; - -bool _supportsAnsi = stdout.supportsAnsiEscapes; -String _green = _supportsAnsi ? '\u001b[1;32m' : ''; -String _red = _supportsAnsi ? '\u001b[31m' : ''; -String _yellow = _supportsAnsi ? '\u001b[33m' : ''; -String _gray = _supportsAnsi ? '\u001b[90m' : ''; -String _reset = _supportsAnsi ? '\u001B[0m' : ''; - -Future step(String msg, Future Function() fn) async { - stdout.writeln('-> $_green$msg$_reset'); - try { - await fn(); - } catch (_) { - stderr.writeln('~~ ${_red}Failed$_reset'); - rethrow; - } finally { - stdout.writeln('<- ${_gray}Done$_reset'); - } -} - -void _logWithColor(String color, String msg) { - stdout.writeln('$color$msg$_reset'); -} - -void log(String msg) { - _logWithColor(_gray, msg); -} - -void logImportant(String msg) { - stdout.writeln(msg); -} - -void logWarning(String msg) { - _logWithColor(_yellow, msg); -} - -void logError(String msg) { - _logWithColor(_red, msg); -} - -final class Panic extends Error {} - -Never panic(List messages) { - messages.forEach(logError); - throw Panic(); -} diff --git a/engine/src/flutter/testing/scenario_app/bin/utils/options.dart b/engine/src/flutter/testing/scenario_app/bin/utils/options.dart deleted file mode 100644 index d7f3407de4..0000000000 --- a/engine/src/flutter/testing/scenario_app/bin/utils/options.dart +++ /dev/null @@ -1,305 +0,0 @@ -import 'dart:io' as io; - -import 'package:args/args.dart'; -import 'package:engine_repo_tools/engine_repo_tools.dart'; -import 'package:path/path.dart' as p; - -import 'environment.dart'; - -/// Command line options and parser for the Android `scenario_app` test runner. -extension type const Options._(ArgResults _args) { - /// Parses the command line [args] into a set of options. - /// - /// Throws a [FormatException] if command line arguments are invalid. - factory Options.parse( - List args, { - required Environment environment, - required Engine? localEngine, - }) { - final ArgResults results = _parser(environment, localEngine).parse(args); - final Options options = Options._(results); - - // The 'adb' tool must exist. - if (results['adb'] == null) { - throw const FormatException('The --adb option must be set.'); - } else if (!io.File(options.adb).existsSync()) { - throw FormatException('The adb tool does not exist at ${options.adb}.'); - } - - // The 'ndk-stack' tool must exist. - if (results['ndk-stack'] == null) { - throw const FormatException('The --ndk-stack option must be set.'); - } else if (!io.File(options.ndkStack).existsSync()) { - throw FormatException('The ndk-stack tool does not exist at ${options.ndkStack}.'); - } - - // The 'out-dir' must exist. - if (results['out-dir'] == null) { - throw const FormatException('The --out-dir option must be set.'); - } else if (!io.Directory(options.outDir).existsSync()) { - throw FormatException('The out directory does not exist at ${options.outDir}.'); - } - - return options; - } - - /// Whether usage information should be shown based on command line [args]. - /// - /// This is a shortcut that can be used to determine if the usage information - /// before parsing the remaining command line arguments. For example: - /// - /// ```dart - /// void main(List args) { - /// if (Options.showUsage(args)) { - /// stdout.writeln(Options.usage); - /// return; - /// } - /// final options = Options.parse(args); - /// // ... - /// } - /// ``` - static bool showUsage(List args) { - // If any of the arguments are '--help' or -'h'. - return args.isNotEmpty && - args.any((String arg) { - return arg == '--help' || arg == '-h'; - }); - } - - /// Whether verbose logging should be enabled based on command line [args]. - /// - /// This is a shortcut that can be used to determine if verbose logging should - /// be enabled before parsing the remaining command line arguments. For - /// example: - /// - /// ```dart - /// void main(List args) { - /// final bool verbose = Options.showVerbose(args); - /// // ... - /// } - /// ``` - static bool showVerbose(List args) { - // If any of the arguments are '--verbose' or -'v'. - return args.isNotEmpty && - args.any((String arg) { - return arg == '--verbose' || arg == '-v'; - }); - } - - /// Returns usage information for the `scenario_app` test runner. - /// - /// If [verbose] is `true`, then additional options are shown. - static String usage({required Environment environment, required Engine? localEngineDir}) { - return _parser(environment, localEngineDir).usage; - } - - /// Parses the command line [args] into a set of options. - /// - /// Unlike [_miniParser], this parser includes all options. - static ArgParser _parser(Environment environment, Engine? localEngine) { - final bool hideUnusualOptions = !environment.showVerbose; - return ArgParser(usageLineLength: 120) - ..addFlag('verbose', abbr: 'v', help: 'Enable verbose logging', negatable: false) - ..addFlag('help', abbr: 'h', help: 'Print usage information', negatable: false) - ..addFlag( - 'use-skia-gold', - help: - 'Whether to use Skia Gold to compare screenshots. Defaults to true ' - 'on CI and false otherwise.', - defaultsTo: environment.isCi, - hide: hideUnusualOptions, - ) - ..addFlag( - 'enable-impeller', - help: - 'Whether to enable Impeller as the graphics backend. If true, the ' - 'test runner will use --impeller-backend if set, otherwise the ' - 'default backend will be used. To explicitly run with the Skia ' - 'backend, set this to false (--no-enable-impeller).', - ) - ..addFlag( - 'force-surface-producer-surface-texture', - help: - 'Whether to force the use of SurfaceTexture as the SurfaceProducer ' - 'rendering strategy. This is used to emulate the behavior of older ' - 'devices that do not support ImageReader, or to explicitly test ' - 'SurfaceTexture path for rendering plugins still using the older ' - 'createSurfaceTexture() API.', - negatable: false, - ) - ..addFlag( - 'prefix-logs-per-run', - help: 'Whether to prefix logs with a per-run unique identifier.', - defaultsTo: environment.isCi, - hide: hideUnusualOptions, - ) - ..addFlag('record-screen', help: 'Whether to record the screen during the test run.') - ..addOption( - 'impeller-backend', - help: - 'The graphics backend to use when --enable-impeller is true. ' - 'Unlike the similar option when launching an app, there is no ' - 'fallback; that is, either Vulkan or OpenGLES must be specified. ', - allowed: ['vulkan', 'opengles'], - defaultsTo: 'vulkan', - ) - ..addOption( - 'logs-dir', - help: 'Path to a directory where logs and screenshots are stored.', - defaultsTo: environment.logsDir, - ) - ..addOption( - 'adb', - help: - 'Path to the Android Debug Bridge (adb) executable. ' - 'If the current working directory is within the engine repository, ' - 'defaults to ' - './flutter/third_party/android_tools/sdk/platform-tools/adb.', - defaultsTo: - localEngine != null - ? p.join( - localEngine.srcDir.path, - 'flutter', - 'third_party', - 'android_tools', - 'sdk', - 'platform-tools', - 'adb', - ) - : null, - valueHelp: 'path/to/adb', - hide: hideUnusualOptions, - ) - ..addOption( - 'ndk-stack', - help: - 'Path to the NDK stack tool. Defaults to the checked-in version in ' - 'flutter/third_party/android_tools if the current working ' - 'directory is within the engine repository on a supported ' - 'platform.', - defaultsTo: - localEngine != null && - (io.Platform.isLinux || io.Platform.isMacOS || io.Platform.isWindows) - ? p.join( - localEngine.srcDir.path, - 'flutter', - 'third_party', - 'android_tools', - 'ndk', - 'prebuilt', - () { - if (io.Platform.isLinux) { - return 'linux-x86_64'; - } else if (io.Platform.isMacOS) { - return 'darwin-x86_64'; - } else if (io.Platform.isWindows) { - return 'windows-x86_64'; - } else { - // Unreachable. - throw UnsupportedError( - 'Unsupported platform: ${io.Platform.operatingSystem}', - ); - } - }(), - 'bin', - 'ndk-stack', - ) - : null, - valueHelp: 'path/to/ndk-stack', - hide: hideUnusualOptions, - ) - ..addOption( - 'out-dir', - help: - 'Path to a out/{variant} directory where the APKs are built. ' - 'Defaults to the latest updated out/ directory that starts with ' - '"android_" if the current working directory is within the engine ' - 'repository.', - defaultsTo: - environment.isCi - ? null - : localEngine - ?.outputs() - .where((Output o) => p.basename(o.path.path).startsWith('android_')) - .firstOrNull - ?.path - .path, - mandatory: environment.isCi, - valueHelp: 'path/to/out/android_variant', - ) - ..addOption( - 'smoke-test', - help: - 'Fully qualified class name of a single test to run. For example ' - 'try "dev.flutter.scenarios.EngineLaunchE2ETest" or ' - '"dev.flutter.scenariosui.ExternalTextureTests".', - valueHelp: 'package.ClassName', - ) - ..addOption( - 'output-contents-golden', - help: - 'Path to a file that contains the expected filenames of golden ' - 'files. If the current working directory is within the engine ' - 'repository, defaults to ./testing/scenario_app/android/' - 'expected_golden_output.txt.', - defaultsTo: - localEngine != null - ? p.join( - localEngine.flutterDir.path, - 'testing', - 'scenario_app', - 'android', - 'expected_golden_output.txt', - ) - : null, - valueHelp: 'path/to/golden.txt', - ); - } - - /// Whether verbose logging should be enabled. - bool get verbose => _args['verbose'] as bool; - - /// Whether usage information should be shown. - bool get help => _args['help'] as bool; - - /// Whether to use Skia Gold to compare screenshots. - bool get useSkiaGold => _args['use-skia-gold'] as bool; - - /// Whether to enable Impeller as the graphics backend. - bool get enableImpeller => _args['enable-impeller'] as bool; - - /// Whether to record the screen during the test run. - bool get recordScreen => _args['record-screen'] as bool; - - /// The graphics backend to use when --enable-impeller is true. - String get impellerBackend => _args['impeller-backend'] as String; - - /// Path to a directory where logs and screenshots are stored. - String get logsDir { - final String? logsDir = _args['logs-dir'] as String?; - return logsDir ?? p.join(outDir, 'logs'); - } - - /// Path to the Android Debug Bridge (adb) executable. - String get adb => _args['adb'] as String; - - /// Path to the NDK stack tool. - String get ndkStack => _args['ndk-stack'] as String; - - /// Path to a out/{variant} directory where the APKs are built. - String get outDir => _args['out-dir'] as String; - - /// Fully qualified class name of a single test to run. - String? get smokeTest => _args['smoke-test'] as String?; - - /// Path to a file that contains the expected filenames of golden files. - String? get outputContentsGolden => _args['output-contents-golden'] as String; - - /// Whether to force the use of `SurfaceTexture` for `SurfaceProducer`. - bool get forceSurfaceProducerSurfaceTexture { - return _args['force-surface-producer-surface-texture'] as bool; - } - - /// Whether to prefix logs with a per-run unique identifier. - bool get prefixLogsPerRun => _args['prefix-logs-per-run'] as bool; -} diff --git a/engine/src/flutter/testing/scenario_app/bin/utils/process_manager_extension.dart b/engine/src/flutter/testing/scenario_app/bin/utils/process_manager_extension.dart deleted file mode 100644 index e23e4e7b7e..0000000000 --- a/engine/src/flutter/testing/scenario_app/bin/utils/process_manager_extension.dart +++ /dev/null @@ -1,65 +0,0 @@ -// 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 'dart:async'; -import 'dart:convert'; -import 'dart:io'; - -import 'package:process/process.dart'; - -(Future exitCode, Stream output) getProcessStreams(Process process) { - final Completer stdoutCompleter = Completer(); - final Completer stderrCompleter = Completer(); - final StreamController outputController = StreamController(); - - final StreamSubscription stdoutSub = process.stdout - .transform(utf8.decoder) - .transform(const LineSplitter()) - .listen(outputController.add, onDone: stdoutCompleter.complete); - - // From looking at historic logs, it seems that the stderr output is rare. - // Instead of prefacing every line with [stdout] unnecessarily, we'll just - // use [stderr] to indicate that it's from the stderr stream. - // - // For example, a historic log which has 0 occurrences of stderr: - // https://gist.github.com/matanlurey/84cf9c903ef6d507dcb63d4c303ca45f - final StreamSubscription stderrSub = process.stderr - .transform(utf8.decoder) - .transform(const LineSplitter()) - .map((String line) => '[stderr] $line') - .listen(outputController.add, onDone: stderrCompleter.complete); - - final Future exitCode = process.exitCode.then((int code) async { - await (stdoutSub.cancel(), stderrSub.cancel()).wait; - outputController.close(); - return code; - }); - - return (exitCode, outputController.stream); -} - -/// Pipes the [process] streams and writes them to [out] sink. -/// -/// If [out] is null, then the current [Process.stdout] is used as the sink. -Future pipeProcessStreams(Process process, {StringSink? out}) async { - out ??= stdout; - - final (Future exitCode, Stream output) = getProcessStreams(process); - output.listen(out.writeln); - return exitCode; -} - -extension RunAndForward on ProcessManager { - /// Runs [cmd], and forwards the stdout and stderr pipes to the current process stdout pipe. - Future runAndForward(List cmd) async { - return pipeProcessStreams(await start(cmd), out: stdout); - } - - /// Runs [cmd], and captures the stdout and stderr pipes. - Future<(int, StringBuffer)> runAndCapture(List cmd) async { - final StringBuffer buffer = StringBuffer(); - final int exitCode = await pipeProcessStreams(await start(cmd), out: buffer); - return (exitCode, buffer); - } -} diff --git a/engine/src/flutter/testing/scenario_app/bin/utils/sample_adb_logcat.txt b/engine/src/flutter/testing/scenario_app/bin/utils/sample_adb_logcat.txt deleted file mode 100644 index 900d4dbd10..0000000000 --- a/engine/src/flutter/testing/scenario_app/bin/utils/sample_adb_logcat.txt +++ /dev/null @@ -1,1077 +0,0 @@ -[stdout] --------- beginning of main -[stdout] 02-15 10:20:33.023 1735 1941 I GnssLocationProvider: WakeLock acquired by sendMessage(REPORT_SV_STATUS, 0, com.android.server.location.GnssLocationProvider$SvStatusInfo@ac23b3f) -[stdout] 02-15 10:20:33.023 1735 1749 I GnssLocationProvider: WakeLock released by handleMessage(REPORT_SV_STATUS, 0, com.android.server.location.GnssLocationProvider$SvStatusInfo@ac23b3f) -[stdout] 02-15 10:20:34.028 1735 1941 I GnssLocationProvider: WakeLock acquired by sendMessage(REPORT_SV_STATUS, 0, com.android.server.location.GnssLocationProvider$SvStatusInfo@47a9c0c) -[stdout] 02-15 10:20:34.028 1735 1749 I GnssLocationProvider: WakeLock released by handleMessage(REPORT_SV_STATUS, 0, com.android.server.location.GnssLocationProvider$SvStatusInfo@47a9c0c) -[stdout] 02-15 10:20:35.033 1735 1941 I GnssLocationProvider: WakeLock acquired by sendMessage(REPORT_SV_STATUS, 0, com.android.server.location.GnssLocationProvider$SvStatusInfo@1084955) -[stdout] 02-15 10:20:35.033 1735 1749 I GnssLocationProvider: WakeLock released by handleMessage(REPORT_SV_STATUS, 0, com.android.server.location.GnssLocationProvider$SvStatusInfo@1084955) -[stdout] 02-15 10:20:36.036 1735 1941 I GnssLocationProvider: WakeLock acquired by sendMessage(REPORT_SV_STATUS, 0, com.android.server.location.GnssLocationProvider$SvStatusInfo@39d4f6a) -[stdout] 02-15 10:20:36.036 1735 1749 I GnssLocationProvider: WakeLock released by handleMessage(REPORT_SV_STATUS, 0, com.android.server.location.GnssLocationProvider$SvStatusInfo@39d4f6a) -[stdout] 02-15 10:20:36.232 1735 1747 W system_server: Long monitor contention with owner PackageInstaller (1783) at java.lang.Object android.util.ArrayMap.get(java.lang.Object)(ArrayMap.java:420) waiters=0 in void com.android.server.pm.PackageInstallerSession.write(org.xmlpull.v1.XmlSerializer, java.io.File) for 1.347s -[stdout] 02-15 10:20:36.238 1735 3071 W system_server: Long monitor contention with owner Binder:1735_2 (1747) at void com.android.server.pm.PackageInstallerService$InternalCallback.onSessionSealedBlocking(com.android.server.pm.PackageInstallerSession)(PackageInstallerService.java:1136) waiters=0 in android.content.pm.PackageInstaller$SessionInfo com.android.server.pm.PackageInstallerService.getSessionInfo(int) for 1.354s -[stdout] --------- beginning of system -[stdout] 02-15 10:20:36.657 1735 1763 D PackageManager: Instant App installer not found with android.intent.action.INSTALL_INSTANT_APP_PACKAGE -[stdout] 02-15 10:20:36.657 1735 1763 D PackageManager: Clear ephemeral installer activity -[stdout] 02-15 10:20:36.658 1735 1763 V BackupManagerService: restoreAtInstall pkg=dev.flutter.scenarios token=d restoreSet=0 -[stdout] 02-15 10:20:36.658 1735 1763 V BackupManagerService: Finishing install immediately -[stdout] 02-15 10:20:36.666 1578 1784 E : Couldn't opendir /data/app/vmdl831937340.tmp: No such file or directory -[stdout] 02-15 10:20:36.666 1578 1784 E installd: Failed to delete /data/app/vmdl831937340.tmp: No such file or directory -[stdout] 02-15 10:20:36.668 3621 3621 I CarrierServices: [2] RcsAutoStartReceiver.b: carrierServicesJibeServiceEnabled changed from true to true -[stdout] 02-15 10:20:36.668 3621 3621 I CarrierServices: [2] RcsAutoStartReceiver.b: enableRcs changed from true to true -[stdout] 02-15 10:20:36.668 3621 3621 I CarrierServices: [2] RcsAutoStartReceiver.b: RcsAutoStartReceiver triggered. Fetching RCS State. Action: android.intent.action.PACKAGE_ADDED -[stdout] 02-15 10:20:36.669 3621 3621 I CarrierServices: [2] aws.a: Migration binding to RcsMigrationService -[stdout] 02-15 10:20:36.670 1735 1811 I InputReader: Reconfiguring input devices. changes=0x00000010 -[stdout] 02-15 10:20:36.673 1735 3071 W BroadcastQueue: Background execution not allowed: receiving Intent { act=android.intent.action.PACKAGE_ADDED dat=package:dev.flutter.scenarios flg=0x4000010 (has extras) } to com.android.musicfx/.Compatibility$Receiver -[stdout] 02-15 10:20:36.673 1735 1750 W BroadcastQueue: Background execution not allowed: receiving Intent { act=android.intent.action.PACKAGE_ADDED dat=package:dev.flutter.scenarios flg=0x4000010 (has extras) } to com.google.android.gms/.games.chimera.GamesSystemBroadcastReceiverProxy -[stdout] 02-15 10:20:36.674 1735 1750 W BroadcastQueue: Background execution not allowed: receiving Intent { act=android.intent.action.PACKAGE_ADDED dat=package:dev.flutter.scenarios flg=0x4000010 (has extras) } to com.google.android.gms/.gass.chimera.PackageChangeBroadcastReceiver -[stdout] 02-15 10:20:36.674 1735 1750 W BroadcastQueue: Background execution not allowed: receiving Intent { act=android.intent.action.PACKAGE_ADDED dat=package:dev.flutter.scenarios flg=0x4000010 (has extras) } to com.google.android.gms/.chimera.GmsIntentOperationService$PersistentTrustedReceiver -[stdout] 02-15 10:20:36.674 1735 1750 W BroadcastQueue: Background execution not allowed: receiving Intent { act=android.intent.action.PACKAGE_ADDED dat=package:dev.flutter.scenarios flg=0x4000010 (has extras) } to com.google.android.googlequicksearchbox/com.google.android.apps.gsa.googlequicksearchbox.GelStubAppWatcher -[stdout] 02-15 10:20:36.674 1735 1750 W BroadcastQueue: Background execution not allowed: receiving Intent { act=android.intent.action.PACKAGE_ADDED dat=package:dev.flutter.scenarios flg=0x4000010 (has extras) } to com.google.android.ims/.receivers.RcsAutoStartReceiver -[stdout] 02-15 10:20:36.678 1735 1751 D AutofillUI: destroySaveUiUiThread(): already destroyed -[stdout] 02-15 10:20:36.679 2863 2863 I Bugle : returning RCS state provider. -[stdout] 02-15 10:20:36.681 2863 2972 I CarrierServices: [168] inq.shouldUseCarrierServicesApkForV1Apis: Checking if using CarrierServices.apk is possible. Enabled: true, isAtLeastM: true, runningInsideBugle: true -[stdout] 02-15 10:20:36.681 2863 2972 I CarrierServices: [168] inq.e: Network Operator: 310260 -[stdout] 02-15 10:20:36.681 1964 1964 D CarrierSvcBindHelper: No carrier app for: 0 -[stdout] 02-15 10:20:36.681 1735 1735 I Telecom : DefaultDialerCache: Refreshing default dialer for user 0: now com.google.android.dialer: DDC.oR@AQE -[stdout] 02-15 10:20:36.682 1735 1735 V BackupManagerConstants: getFullBackupIntervalMilliseconds(...) returns 86400000 -[stdout] 02-15 10:20:36.683 1964 1964 D ImsResolver: maybeAddedImsService, packageName: dev.flutter.scenarios -[stdout] 02-15 10:20:36.683 1964 1964 D CarrierConfigLoader: mHandler: 9 phoneId: 0 -[stdout] 02-15 10:20:36.683 2863 2972 I CarrierServices: [168] inq.e: carrierWithOldEcApis: false -[stdout] 02-15 10:20:36.683 2863 2972 I CarrierServices: [168] inq.e: hasDialerThatSupportsNewEc: false -[stdout] 02-15 10:20:36.684 1735 1749 D AutofillManagerServiceImpl: Set component for user 0 as AutofillServiceInfo[ServiceInfo{96b5821 com.google.android.gms.autofill.service.AutofillService}, settings:com.google.android.gms.autofill.ui.AutofillSettingsActivity, hasCompatPckgs:false] -[stdout] 02-15 10:20:36.686 2863 2972 W RcsProvisioning: Failed to read configuration: /data/user/0/com.google.android.apps.messaging/files/rcsconfig (No such file or directory) -[stdout] 02-15 10:20:36.686 2863 2972 W RcsProvisioning: java.io.FileNotFoundException: /data/user/0/com.google.android.apps.messaging/files/rcsconfig (No such file or directory) -[stdout] 02-15 10:20:36.686 2863 2972 W RcsProvisioning: at java.io.FileInputStream.open0(Native Method) -[stdout] 02-15 10:20:36.686 2863 2972 W RcsProvisioning: at java.io.FileInputStream.open(FileInputStream.java:231) -[stdout] 02-15 10:20:36.686 2863 2972 W RcsProvisioning: at java.io.FileInputStream.(FileInputStream.java:165) -[stdout] 02-15 10:20:36.686 2863 2972 W RcsProvisioning: at android.app.ContextImpl.openFileInput(ContextImpl.java:560) -[stdout] 02-15 10:20:36.686 2863 2972 W RcsProvisioning: at android.content.ContextWrapper.openFileInput(ContextWrapper.java:202) -[stdout] 02-15 10:20:36.686 2863 2972 W RcsProvisioning: at ion.a(SourceFile:2) -[stdout] 02-15 10:20:36.686 2863 2972 W RcsProvisioning: at idl.a(SourceFile:4) -[stdout] 02-15 10:20:36.686 2863 2972 W RcsProvisioning: at idm.a(SourceFile:7) -[stdout] 02-15 10:20:36.686 2863 2972 W RcsProvisioning: at com.google.android.apps.messaging.rcsmigration.RcsStateProvider.buildRcsState(SourceFile:81) -[stdout] 02-15 10:20:36.686 2863 2972 W RcsProvisioning: at com.google.android.apps.messaging.rcsmigration.RcsStateProvider.getRcsState(SourceFile:6) -[stdout] 02-15 10:20:36.686 2863 2972 W RcsProvisioning: at com.google.android.ims.rcsmigration.IRcsStateProvider$Stub.dispatchTransaction(SourceFile:10) -[stdout] 02-15 10:20:36.686 2863 2972 W RcsProvisioning: at com.google.android.aidl.BaseStub.onTransact(SourceFile:18) -[stdout] 02-15 10:20:36.686 2863 2972 W RcsProvisioning: at android.os.Binder.execTransact(Binder.java:731) -[stdout] 02-15 10:20:36.686 2863 2972 D RcsProvisioning: Retrieving backup token -[stdout] 02-15 10:20:36.686 2863 2972 D RcsProvisioning: Exception while getting subscriber Id. Using default -[stdout] 02-15 10:20:36.696 4721 6807 I FontLog : Package dev.flutter.scenarios has no metadata [CONTEXT service_id=132 ] -[stdout] 02-15 10:20:36.696 4721 6807 W GCM : Unexpected forwarded intent: Intent { act=android.intent.action.PACKAGE_ADDED dat=package:dev.flutter.scenarios flg=0x4000010 pkg=com.google.android.gms cmp=com.google.android.gms/.chimera.PersistentIntentOperationService (has extras) } -[stdout] 02-15 10:20:36.697 4721 6809 W GCM : Unexpected forwarded intent: Intent { act=android.intent.action.PACKAGE_ADDED dat=package:dev.flutter.scenarios flg=0x4000010 pkg=com.google.android.gms cmp=com.google.android.gms/.chimera.PersistentIntentOperationService (has extras) } -[stdout] 02-15 10:20:36.698 4770 6815 I Auth : [SupervisedAccountIntentOperation] onHandleIntent(): android.intent.action.PACKAGE_ADDED -[stdout] 02-15 10:20:36.699 4770 4770 D BoundBrokerSvc: onBind: Intent { act=com.google.android.gms.common.BIND_SHARED_PREFS pkg=com.google.android.gms } -[stdout] 02-15 10:20:36.699 4770 4770 D BoundBrokerSvc: Loading bound service for intent: Intent { act=com.google.android.gms.common.BIND_SHARED_PREFS pkg=com.google.android.gms } -[stdout] 02-15 10:20:36.699 4770 6804 I BlockstoreStorage: Clearing Blockstore Data for package dev.flutter.scenarios [CONTEXT service_id=258 ] -[stdout] 02-15 10:20:36.700 4770 6804 I BlockstoreStorage: No metadata found. Skipping deletion. [CONTEXT service_id=258 ] -[stdout] 02-15 10:20:36.701 4770 4770 D BoundBrokerSvc: onUnbind: Intent { act=com.google.android.gms.common.BIND_SHARED_PREFS pkg=com.google.android.gms } -[stdout] 02-15 10:20:36.706 4721 4769 E BluetoothAdapter: Bluetooth binder is null -[stdout] 02-15 10:20:36.711 4721 4769 W ChimeraUtils: Module com.google.android.gms.nearby_en has empty metadata display_name_string_id -[stdout] 02-15 10:20:36.711 4721 4769 W ChimeraUtils: Module com.google.android.gms.nearby_en has empty metadata display_name_string_id -[stdout] 02-15 10:20:36.719 4770 4876 E Icing : Couldn't handle android.intent.action.PACKAGE_ADDED intent due to initialization failure. -[stdout] 02-15 10:20:36.726 4770 4876 I Icing : IndexChimeraService.getServiceInterface callingPackage=com.google.android.gms componentName=ContactsIndexer serviceId=33 -[stdout] 02-15 10:20:36.726 4770 4876 W Icing : IndexManager failed to initialize. SearchIndex.API is unavailable. -[stdout] 02-15 10:20:36.727 4770 6817 W IcingInternalCorpora: Failed to get global search sources -[stdout] 02-15 10:20:36.729 4770 6818 I ChimeraConfigurator: Starting update, reason: 4 urgentFeatures: pay:-1 -[stdout] 02-15 10:20:36.732 4770 6818 W FeatureMgr: Attempted to request and unrequest the same feature: antifingerprinting. Ignoring unrequest. -[stdout] 02-15 10:20:36.733 4770 4876 W Icing : IndexManager failed to initialize. AppIndex.API is unavailable. -[stdout] 02-15 10:20:36.734 4770 4770 W GmscoreIpa: Apps indexing failed. [CONTEXT service_id=255 ] -[stdout] 02-15 10:20:36.734 4770 4770 W GmscoreIpa: ciev: API: AppIndexing.API is not available on this device. Connection failed with: ConnectionResult{statusCode=API_UNAVAILABLE, resolution=null, message=null} -[stdout] 02-15 10:20:36.734 4770 4770 W GmscoreIpa: at ciez.a(:com.google.android.gms@214515028@21.45.15 (100400-411636772):2) -[stdout] 02-15 10:20:36.734 4770 4770 W GmscoreIpa: at wlo.c(:com.google.android.gms@214515028@21.45.15 (100400-411636772):0) -[stdout] 02-15 10:20:36.734 4770 4770 W GmscoreIpa: at wof.p(:com.google.android.gms@214515028@21.45.15 (100400-411636772):4) -[stdout] 02-15 10:20:36.734 4770 4770 W GmscoreIpa: at wof.d(:com.google.android.gms@214515028@21.45.15 (100400-411636772):0) -[stdout] 02-15 10:20:36.734 4770 4770 W GmscoreIpa: at wof.g(:com.google.android.gms@214515028@21.45.15 (100400-411636772):19) -[stdout] 02-15 10:20:36.734 4770 4770 W GmscoreIpa: at wof.onConnectionFailed(:com.google.android.gms@214515028@21.45.15 (100400-411636772):0) -[stdout] 02-15 10:20:36.734 4770 4770 W GmscoreIpa: at xgi.gE(:com.google.android.gms@214515028@21.45.15 (100400-411636772):0) -[stdout] 02-15 10:20:36.734 4770 4770 W GmscoreIpa: at xfi.b(:com.google.android.gms@214515028@21.45.15 (100400-411636772):1) -[stdout] 02-15 10:20:36.734 4770 4770 W GmscoreIpa: at xez.a(:com.google.android.gms@214515028@21.45.15 (100400-411636772):7) -[stdout] 02-15 10:20:36.734 4770 4770 W GmscoreIpa: at xfc.handleMessage(:com.google.android.gms@214515028@21.45.15 (100400-411636772):23) -[stdout] 02-15 10:20:36.734 4770 4770 W GmscoreIpa: at android.os.Handler.dispatchMessage(Handler.java:106) -[stdout] 02-15 10:20:36.734 4770 4770 W GmscoreIpa: at alyk.jj(:com.google.android.gms@214515028@21.45.15 (100400-411636772):0) -[stdout] 02-15 10:20:36.734 4770 4770 W GmscoreIpa: at alyk.dispatchMessage(:com.google.android.gms@214515028@21.45.15 (100400-411636772):11) -[stdout] 02-15 10:20:36.734 4770 4770 W GmscoreIpa: at android.os.Looper.loop(Looper.java:193) -[stdout] 02-15 10:20:36.734 4770 4770 W GmscoreIpa: at android.os.HandlerThread.run(HandlerThread.java:65) -[stdout] 02-15 10:20:36.741 4770 4876 I Icing : IndexChimeraService.getServiceInterface callingPackage=com.google.android.gms componentName=AppsCorpus serviceId=36 -[stdout] 02-15 10:20:36.741 4770 4876 W Icing : IndexManager failed to initialize. SearchIndex.API is unavailable. -[stdout] 02-15 10:20:36.742 4770 6632 W IcingInternalCorpora: Couldn't fetch status for corpus apps -[stdout] 02-15 10:20:36.745 4770 6818 I GmsDebugLogger: [73] 1801 -[stdout] 02-15 10:20:36.746 4770 6818 I GmsDebugLogger: [30] [Pay.optional:214515100000] -[stdout] 02-15 10:20:36.747 4770 6818 W ChimeraConfigService: Retry attempt was throttled. [CONTEXT service_id=264 ] -[stdout] 02-15 10:20:36.747 4770 6818 I GmsDebugLogger: [83] 1 [pay] -[stdout] 02-15 10:20:36.782 1735 1763 D PackageManager: Instant App installer not found with android.intent.action.INSTALL_INSTANT_APP_PACKAGE -[stdout] 02-15 10:20:36.782 1735 1763 D PackageManager: Clear ephemeral installer activity -[stdout] 02-15 10:20:36.782 1735 1763 V BackupManagerService: restoreAtInstall pkg=dev.flutter.scenarios.test token=e restoreSet=0 -[stdout] 02-15 10:20:36.783 1735 1763 V BackupManagerService: Finishing install immediately -[stdout] 02-15 10:20:36.786 1578 1784 E : Couldn't opendir /data/app/vmdl1936275788.tmp: No such file or directory -[stdout] 02-15 10:20:36.786 1578 1784 E installd: Failed to delete /data/app/vmdl1936275788.tmp: No such file or directory -[stdout] 02-15 10:20:36.798 1735 1749 W system_server: Unknown chunk type '200'. -[stdout] 02-15 10:20:36.802 1735 1811 I InputReader: Reconfiguring input devices. changes=0x00000010 -[stdout] 02-15 10:20:36.803 1735 1836 W BroadcastQueue: Background execution not allowed: receiving Intent { act=android.intent.action.PACKAGE_ADDED dat=package:dev.flutter.scenarios.test flg=0x4000010 (has extras) } to com.android.musicfx/.Compatibility$Receiver -[stdout] 02-15 10:20:36.803 1735 1750 W BroadcastQueue: Background execution not allowed: receiving Intent { act=android.intent.action.PACKAGE_ADDED dat=package:dev.flutter.scenarios.test flg=0x4000010 (has extras) } to com.google.android.gms/.games.chimera.GamesSystemBroadcastReceiverProxy -[stdout] 02-15 10:20:36.803 1735 1750 W BroadcastQueue: Background execution not allowed: receiving Intent { act=android.intent.action.PACKAGE_ADDED dat=package:dev.flutter.scenarios.test flg=0x4000010 (has extras) } to com.google.android.gms/.gass.chimera.PackageChangeBroadcastReceiver -[stdout] 02-15 10:20:36.803 1735 1735 I Telecom : DefaultDialerCache: Refreshing default dialer for user 0: now com.google.android.dialer: DDC.oR@AQU -[stdout] 02-15 10:20:36.803 1735 1750 W BroadcastQueue: Background execution not allowed: receiving Intent { act=android.intent.action.PACKAGE_ADDED dat=package:dev.flutter.scenarios.test flg=0x4000010 (has extras) } to com.google.android.gms/.chimera.GmsIntentOperationService$PersistentTrustedReceiver -[stdout] 02-15 10:20:36.803 1735 1750 W BroadcastQueue: Background execution not allowed: receiving Intent { act=android.intent.action.PACKAGE_ADDED dat=package:dev.flutter.scenarios.test flg=0x4000010 (has extras) } to com.google.android.googlequicksearchbox/com.google.android.apps.gsa.googlequicksearchbox.GelStubAppWatcher -[stdout] 02-15 10:20:36.803 1735 1750 W BroadcastQueue: Background execution not allowed: receiving Intent { act=android.intent.action.PACKAGE_ADDED dat=package:dev.flutter.scenarios.test flg=0x4000010 (has extras) } to com.google.android.ims/.receivers.RcsAutoStartReceiver -[stdout] 02-15 10:20:36.804 1735 1735 V BackupManagerConstants: getFullBackupIntervalMilliseconds(...) returns 86400000 -[stdout] 02-15 10:20:36.807 1735 1751 D AutofillUI: destroySaveUiUiThread(): already destroyed -[stdout] 02-15 10:20:36.807 1735 1749 D AutofillManagerServiceImpl: Set component for user 0 as AutofillServiceInfo[ServiceInfo{51b1cd5 com.google.android.gms.autofill.service.AutofillService}, settings:com.google.android.gms.autofill.ui.AutofillSettingsActivity, hasCompatPckgs:false] -[stdout] 02-15 10:20:36.813 1964 1964 D CarrierSvcBindHelper: No carrier app for: 0 -[stdout] 02-15 10:20:36.815 1964 1964 D ImsResolver: maybeAddedImsService, packageName: dev.flutter.scenarios.test -[stdout] 02-15 10:20:36.815 1964 1964 D CarrierConfigLoader: mHandler: 9 phoneId: 0 -[stdout] 02-15 10:20:36.817 4721 6812 W GCM : Unexpected forwarded intent: Intent { act=android.intent.action.PACKAGE_ADDED dat=package:dev.flutter.scenarios.test flg=0x4000010 pkg=com.google.android.gms cmp=com.google.android.gms/.chimera.PersistentIntentOperationService (has extras) } -[stdout] 02-15 10:20:36.817 4721 6800 W GCM : Unexpected forwarded intent: Intent { act=android.intent.action.PACKAGE_ADDED dat=package:dev.flutter.scenarios.test flg=0x4000010 pkg=com.google.android.gms cmp=com.google.android.gms/.chimera.PersistentIntentOperationService (has extras) } -[stdout] 02-15 10:20:36.817 4721 6810 I FontLog : Package dev.flutter.scenarios.test has no metadata [CONTEXT service_id=132 ] -[stdout] 02-15 10:20:36.818 4770 6817 I Auth : [SupervisedAccountIntentOperation] onHandleIntent(): android.intent.action.PACKAGE_ADDED -[stdout] 02-15 10:20:36.819 4770 4770 D BoundBrokerSvc: onBind: Intent { act=com.google.android.gms.common.BIND_SHARED_PREFS pkg=com.google.android.gms } -[stdout] 02-15 10:20:36.819 4770 4770 D BoundBrokerSvc: Loading bound service for intent: Intent { act=com.google.android.gms.common.BIND_SHARED_PREFS pkg=com.google.android.gms } -[stdout] 02-15 10:20:36.819 4770 6816 I BlockstoreStorage: Clearing Blockstore Data for package dev.flutter.scenarios.test [CONTEXT service_id=258 ] -[stdout] 02-15 10:20:36.819 4770 6816 I BlockstoreStorage: No metadata found. Skipping deletion. [CONTEXT service_id=258 ] -[stdout] 02-15 10:20:36.819 4770 4770 D BoundBrokerSvc: onUnbind: Intent { act=com.google.android.gms.common.BIND_SHARED_PREFS pkg=com.google.android.gms } -[stdout] 02-15 10:20:36.823 4770 4876 E Icing : Couldn't handle android.intent.action.PACKAGE_ADDED intent due to initialization failure. -[stdout] 02-15 10:20:36.825 4721 4809 E BluetoothAdapter: Bluetooth binder is null -[stdout] 02-15 10:20:36.826 2863 2972 D RcsProvisioning: No backup token found -[stdout] 02-15 10:20:36.826 2863 2972 D RcsProvisioning: Retrieving backup token -[stdout] 02-15 10:20:36.826 2863 2972 D RcsProvisioning: Exception while getting subscriber Id. Using default -[stdout] 02-15 10:20:36.826 4721 4809 W ChimeraUtils: Module com.google.android.gms.nearby_en has empty metadata display_name_string_id -[stdout] 02-15 10:20:36.826 4721 4809 W ChimeraUtils: Module com.google.android.gms.nearby_en has empty metadata display_name_string_id -[stdout] 02-15 10:20:36.833 4770 4876 I Icing : IndexChimeraService.getServiceInterface callingPackage=com.google.android.gms componentName=ContactsIndexer serviceId=33 -[stdout] 02-15 10:20:36.833 4770 4876 W Icing : IndexManager failed to initialize. SearchIndex.API is unavailable. -[stdout] 02-15 10:20:36.836 4770 6817 W IcingInternalCorpora: Failed to get global search sources -[stdout] 02-15 10:20:36.863 6827 6827 D AndroidRuntime: >>>>>> START com.android.internal.os.RuntimeInit uid 2000 <<<<<< -[stdout] 02-15 10:20:36.871 4770 6817 I ChimeraConfigurator: Starting update, reason: 4 urgentFeatures: pay:-1 -[stdout] 02-15 10:20:36.875 4770 6817 W FeatureMgr: Attempted to request and unrequest the same feature: antifingerprinting. Ignoring unrequest. -[stdout] 02-15 10:20:36.876 4770 4876 W Icing : IndexManager failed to initialize. AppIndex.API is unavailable. -[stdout] 02-15 10:20:36.877 4770 4770 W GmscoreIpa: Apps indexing failed. [CONTEXT service_id=255 ] -[stdout] 02-15 10:20:36.877 4770 4770 W GmscoreIpa: ciev: API: AppIndexing.API is not available on this device. Connection failed with: ConnectionResult{statusCode=API_UNAVAILABLE, resolution=null, message=null} -[stdout] 02-15 10:20:36.877 4770 4770 W GmscoreIpa: at ciez.a(:com.google.android.gms@214515028@21.45.15 (100400-411636772):2) -[stdout] 02-15 10:20:36.877 4770 4770 W GmscoreIpa: at wlo.c(:com.google.android.gms@214515028@21.45.15 (100400-411636772):0) -[stdout] 02-15 10:20:36.877 4770 4770 W GmscoreIpa: at wof.p(:com.google.android.gms@214515028@21.45.15 (100400-411636772):4) -[stdout] 02-15 10:20:36.877 4770 4770 W GmscoreIpa: at wof.d(:com.google.android.gms@214515028@21.45.15 (100400-411636772):0) -[stdout] 02-15 10:20:36.877 4770 4770 W GmscoreIpa: at wof.g(:com.google.android.gms@214515028@21.45.15 (100400-411636772):19) -[stdout] 02-15 10:20:36.877 4770 4770 W GmscoreIpa: at wof.onConnectionFailed(:com.google.android.gms@214515028@21.45.15 (100400-411636772):0) -[stdout] 02-15 10:20:36.877 4770 4770 W GmscoreIpa: at xgi.gE(:com.google.android.gms@214515028@21.45.15 (100400-411636772):0) -[stdout] 02-15 10:20:36.877 4770 4770 W GmscoreIpa: at xfi.b(:com.google.android.gms@214515028@21.45.15 (100400-411636772):1) -[stdout] 02-15 10:20:36.877 4770 4770 W GmscoreIpa: at xez.a(:com.google.android.gms@214515028@21.45.15 (100400-411636772):7) -[stdout] 02-15 10:20:36.877 4770 4770 W GmscoreIpa: at xfc.handleMessage(:com.google.android.gms@214515028@21.45.15 (100400-411636772):23) -[stdout] 02-15 10:20:36.877 4770 4770 W GmscoreIpa: at android.os.Handler.dispatchMessage(Handler.java:106) -[stdout] 02-15 10:20:36.877 4770 4770 W GmscoreIpa: at alyk.jj(:com.google.android.gms@214515028@21.45.15 (100400-411636772):0) -[stdout] 02-15 10:20:36.877 4770 4770 W GmscoreIpa: at alyk.dispatchMessage(:com.google.android.gms@214515028@21.45.15 (100400-411636772):11) -[stdout] 02-15 10:20:36.877 4770 4770 W GmscoreIpa: at android.os.Looper.loop(Looper.java:193) -[stdout] 02-15 10:20:36.877 4770 4770 W GmscoreIpa: at android.os.HandlerThread.run(HandlerThread.java:65) -[stdout] 02-15 10:20:36.886 4770 4876 I Icing : IndexChimeraService.getServiceInterface callingPackage=com.google.android.gms componentName=AppsCorpus serviceId=36 -[stdout] 02-15 10:20:36.886 4770 4876 W Icing : IndexManager failed to initialize. SearchIndex.API is unavailable. -[stdout] 02-15 10:20:36.886 6827 6827 I app_process: The ClassLoaderContext is a special shared library. -[stdout] 02-15 10:20:36.886 4770 6820 W IcingInternalCorpora: Couldn't fetch status for corpus apps -[stdout] 02-15 10:20:36.893 4770 6817 I GmsDebugLogger: [73] 1801 -[stdout] 02-15 10:20:36.895 4770 6817 I GmsDebugLogger: [30] [Pay.optional:214515100000] -[stdout] 02-15 10:20:36.896 4770 6817 W ChimeraConfigService: Retry attempt was throttled. [CONTEXT service_id=264 ] -[stdout] 02-15 10:20:36.896 4770 6817 I GmsDebugLogger: [83] 1 [pay] -[stdout] 02-15 10:20:36.899 6827 6827 D AndroidRuntime: Calling main entry com.android.commands.am.Am -[stdout] 02-15 10:20:36.903 1735 1836 I ActivityManager: Force stopping dev.flutter.scenarios appid=10098 user=0: start instr -[stdout] 02-15 10:20:36.908 6840 6840 I utter.scenario: Late-enabling -Xcheck:jni -[stdout] 02-15 10:20:36.914 1735 1752 I ActivityManager: Start proc 6840:dev.flutter.scenarios/u0a98 for added application dev.flutter.scenarios -[stdout] 02-15 10:20:36.931 6840 6840 W ActivityThread: Package uses different ABI(s) than its instrumentation: package[dev.flutter.scenarios]: arm64-v8a, null instrumentation[dev.flutter.scenarios.test]: null, null -[stdout] 02-15 10:20:36.932 6840 6840 I utter.scenario: The ClassLoaderContext is a special shared library. -[stdout] 02-15 10:20:36.932 6840 6840 I utter.scenario: The ClassLoaderContext is a special shared library. -[stdout] 02-15 10:20:36.966 2863 2972 D RcsProvisioning: No backup token found -[stdout] 02-15 10:20:36.968 2863 2972 W RcsProvisioning: Failed to read configuration: /data/user/0/com.google.android.apps.messaging/files/rcsconfig (No such file or directory) -[stdout] 02-15 10:20:36.968 2863 2972 W RcsProvisioning: java.io.FileNotFoundException: /data/user/0/com.google.android.apps.messaging/files/rcsconfig (No such file or directory) -[stdout] 02-15 10:20:36.968 2863 2972 W RcsProvisioning: at java.io.FileInputStream.open0(Native Method) -[stdout] 02-15 10:20:36.968 2863 2972 W RcsProvisioning: at java.io.FileInputStream.open(FileInputStream.java:231) -[stdout] 02-15 10:20:36.968 2863 2972 W RcsProvisioning: at java.io.FileInputStream.(FileInputStream.java:165) -[stdout] 02-15 10:20:36.968 2863 2972 W RcsProvisioning: at android.app.ContextImpl.openFileInput(ContextImpl.java:560) -[stdout] 02-15 10:20:36.968 2863 2972 W RcsProvisioning: at android.content.ContextWrapper.openFileInput(ContextWrapper.java:202) -[stdout] 02-15 10:20:36.968 2863 2972 W RcsProvisioning: at ion.a(SourceFile:2) -[stdout] 02-15 10:20:36.968 2863 2972 W RcsProvisioning: at idl.a(SourceFile:4) -[stdout] 02-15 10:20:36.968 2863 2972 W RcsProvisioning: at idm.a(SourceFile:7) -[stdout] 02-15 10:20:36.968 2863 2972 W RcsProvisioning: at iez.buildConferencesFileName(SourceFile:30) -[stdout] 02-15 10:20:36.968 2863 2972 W RcsProvisioning: at com.google.android.apps.messaging.rcsmigration.RcsStateProvider.buildRcsState(SourceFile:129) -[stdout] 02-15 10:20:36.968 2863 2972 W RcsProvisioning: at com.google.android.apps.messaging.rcsmigration.RcsStateProvider.getRcsState(SourceFile:6) -[stdout] 02-15 10:20:36.968 2863 2972 W RcsProvisioning: at com.google.android.ims.rcsmigration.IRcsStateProvider$Stub.dispatchTransaction(SourceFile:10) -[stdout] 02-15 10:20:36.968 2863 2972 W RcsProvisioning: at com.google.android.aidl.BaseStub.onTransact(SourceFile:18) -[stdout] 02-15 10:20:36.968 2863 2972 W RcsProvisioning: at android.os.Binder.execTransact(Binder.java:731) -[stdout] 02-15 10:20:36.968 2863 2972 D RcsProvisioning: Retrieving backup token -[stdout] 02-15 10:20:36.968 2863 2972 D RcsProvisioning: Exception while getting subscriber Id. Using default -[stdout] 02-15 10:20:37.038 1735 1941 I GnssLocationProvider: WakeLock acquired by sendMessage(REPORT_SV_STATUS, 0, com.android.server.location.GnssLocationProvider$SvStatusInfo@3bc90c1) -[stdout] 02-15 10:20:37.039 1735 1749 I GnssLocationProvider: WakeLock released by handleMessage(REPORT_SV_STATUS, 0, com.android.server.location.GnssLocationProvider$SvStatusInfo@3bc90c1) -[stdout] 02-15 10:20:37.054 6840 6840 I utter.scenario: The ClassLoaderContext is a special shared library. -[stdout] 02-15 10:20:37.055 6840 6840 I utter.scenario: The ClassLoaderContext is a special shared library. -[stdout] 02-15 10:20:37.108 2863 2972 D RcsProvisioning: No backup token found -[stdout] 02-15 10:20:37.108 2863 2972 E CarrierServices: [168] iez.getFile: File not found.: /data/user/0/com.google.android.apps.messaging/files/httpft_pending (No such file or directory) -[stdout] 02-15 10:20:37.108 2863 2972 E CarrierServices: java.io.FileInputStream.open0(Native Method) -[stdout] 02-15 10:20:37.108 2863 2972 E CarrierServices: java.io.FileInputStream.open(FileInputStream.java:231) -[stdout] 02-15 10:20:37.108 2863 2972 E CarrierServices: java.io.FileInputStream.(FileInputStream.java:165) -[stdout] 02-15 10:20:37.108 2863 2972 E CarrierServices: android.app.ContextImpl.openFileInput(ContextImpl.java:560) -[stdout] 02-15 10:20:37.108 2863 2972 E CarrierServices: android.content.ContextWrapper.openFileInput(ContextWrapper.java:202) -[stdout] 02-15 10:20:37.108 2863 2972 E CarrierServices: iez.getFile(SourceFile:20) -[stdout] 02-15 10:20:37.108 2863 2972 E CarrierServices: com.google.android.apps.messaging.rcsmigration.RcsStateProvider.buildRcsState(SourceFile:136) -[stdout] 02-15 10:20:37.108 2863 2972 E CarrierServices: com.google.android.apps.messaging.rcsmigration.RcsStateProvider.getRcsState(SourceFile:6) -[stdout] 02-15 10:20:37.108 2863 2972 E CarrierServices: com.google.android.ims.rcsmigration.IRcsStateProvider$Stub.dispatchTransaction(SourceFile:10) -[stdout] 02-15 10:20:37.108 2863 2972 E CarrierServices: com.google.android.aidl.BaseStub.onTransact(SourceFile:18) -[stdout] 02-15 10:20:37.108 2863 2972 E CarrierServices: android.os.Binder.execTransact(Binder.java:731) -[stdout] 02-15 10:20:37.109 3621 6687 I CarrierServices: [236] awt.doInBackground: Saving RCS State -[stdout] 02-15 10:20:37.109 3621 6687 I CarrierServices: [236] awt.doInBackground: Old operation mode: 2 -[stdout] 02-15 10:20:37.109 3621 3621 I CarrierServices: [2] RcsAutoStartReceiver.b: carrierServicesJibeServiceEnabled changed from true to true -[stdout] 02-15 10:20:37.109 3621 3621 I CarrierServices: [2] RcsAutoStartReceiver.b: enableRcs changed from true to true -[stdout] 02-15 10:20:37.109 3621 3621 I CarrierServices: [2] RcsAutoStartReceiver.b: RcsAutoStartReceiver triggered. Fetching RCS State. Action: android.intent.action.PACKAGE_ADDED -[stdout] 02-15 10:20:37.110 3621 3621 I CarrierServices: [2] aws.a: Migration binding to RcsMigrationService -[stdout] 02-15 10:20:37.111 2863 4286 I CarrierServices: [209] inq.shouldUseCarrierServicesApkForV1Apis: Checking if using CarrierServices.apk is possible. Enabled: true, isAtLeastM: true, runningInsideBugle: true -[stdout] 02-15 10:20:37.111 2863 4286 I CarrierServices: [209] inq.e: Network Operator: 310260 -[stdout] 02-15 10:20:37.111 2863 4286 I CarrierServices: [209] inq.e: carrierWithOldEcApis: false -[stdout] 02-15 10:20:37.111 2863 4286 I CarrierServices: [209] inq.e: hasDialerThatSupportsNewEc: false -[stdout] 02-15 10:20:37.112 2863 4286 W RcsProvisioning: Failed to read configuration: /data/user/0/com.google.android.apps.messaging/files/rcsconfig (No such file or directory) -[stdout] 02-15 10:20:37.112 2863 4286 W RcsProvisioning: java.io.FileNotFoundException: /data/user/0/com.google.android.apps.messaging/files/rcsconfig (No such file or directory) -[stdout] 02-15 10:20:37.112 2863 4286 W RcsProvisioning: at java.io.FileInputStream.open0(Native Method) -[stdout] 02-15 10:20:37.112 2863 4286 W RcsProvisioning: at java.io.FileInputStream.open(FileInputStream.java:231) -[stdout] 02-15 10:20:37.112 2863 4286 W RcsProvisioning: at java.io.FileInputStream.(FileInputStream.java:165) -[stdout] 02-15 10:20:37.112 2863 4286 W RcsProvisioning: at android.app.ContextImpl.openFileInput(ContextImpl.java:560) -[stdout] 02-15 10:20:37.112 2863 4286 W RcsProvisioning: at android.content.ContextWrapper.openFileInput(ContextWrapper.java:202) -[stdout] 02-15 10:20:37.112 2863 4286 W RcsProvisioning: at ion.a(SourceFile:2) -[stdout] 02-15 10:20:37.112 2863 4286 W RcsProvisioning: at idl.a(SourceFile:4) -[stdout] 02-15 10:20:37.112 2863 4286 W RcsProvisioning: at idm.a(SourceFile:7) -[stdout] 02-15 10:20:37.112 2863 4286 W RcsProvisioning: at com.google.android.apps.messaging.rcsmigration.RcsStateProvider.buildRcsState(SourceFile:81) -[stdout] 02-15 10:20:37.112 2863 4286 W RcsProvisioning: at com.google.android.apps.messaging.rcsmigration.RcsStateProvider.getRcsState(SourceFile:6) -[stdout] 02-15 10:20:37.112 2863 4286 W RcsProvisioning: at com.google.android.ims.rcsmigration.IRcsStateProvider$Stub.dispatchTransaction(SourceFile:10) -[stdout] 02-15 10:20:37.112 2863 4286 W RcsProvisioning: at com.google.android.aidl.BaseStub.onTransact(SourceFile:18) -[stdout] 02-15 10:20:37.112 2863 4286 W RcsProvisioning: at android.os.Binder.execTransact(Binder.java:731) -[stdout] 02-15 10:20:37.112 2863 4286 D RcsProvisioning: Retrieving backup token -[stdout] 02-15 10:20:37.112 2863 4286 D RcsProvisioning: Exception while getting subscriber Id. Using default -[stdout] 02-15 10:20:37.112 3621 6687 I CarrierServices: [236] awt.doInBackground: New operation mode: 2 -[stdout] 02-15 10:20:37.172 6840 6840 W utter.scenario: Accessing hidden method Landroid/app/Instrumentation;->execStartActivity(Landroid/content/Context;Landroid/os/IBinder;Landroid/os/IBinder;Landroid/app/Activity;Landroid/content/Intent;ILandroid/os/Bundle;)Landroid/app/Instrumentation$ActivityResult; (light greylist, linking) -[stdout] 02-15 10:20:37.172 6840 6840 W utter.scenario: Accessing hidden method Landroid/app/Instrumentation;->execStartActivity(Landroid/content/Context;Landroid/os/IBinder;Landroid/os/IBinder;Ljava/lang/String;Landroid/content/Intent;ILandroid/os/Bundle;)Landroid/app/Instrumentation$ActivityResult; (light greylist, linking) -[stdout] 02-15 10:20:37.177 6840 6840 I MonitoringInstr: Instrumentation started! -[stdout] 02-15 10:20:37.178 6840 6840 I MonitoringInstr: Setting context classloader to 'dalvik.system.PathClassLoader[DexPathList[[zip file "/system/framework/android.test.runner.jar", zip file "/system/framework/android.test.mock.jar", zip file "/data/app/dev.flutter.scenarios.test-KKXe9YDNYEL7yOuj25XZ6g==/base.apk", zip file "/data/app/dev.flutter.scenarios-rlxf5VuTV43PTiaP6mOD-g==/base.apk"],nativeLibraryDirectories=[/data/app/dev.flutter.scenarios.test-KKXe9YDNYEL7yOuj25XZ6g==/lib/arm64, /data/app/dev.flutter.scenarios-rlxf5VuTV43PTiaP6mOD-g==/lib/arm64, /data/app/dev.flutter.scenarios.test-KKXe9YDNYEL7yOuj25XZ6g==/base.apk!/lib/arm64-v8a, /data/app/dev.flutter.scenarios-rlxf5VuTV43PTiaP6mOD-g==/base.apk!/lib/arm64-v8a, /system/lib64]]]', Original: 'dalvik.system.PathClassLoader[DexPathList[[zip file "/system/framework/android.test.runner.jar", zip file "/system/framework/android.test.mock.jar", zip file "/data/app/dev.flutter.scenarios.test-KKXe9YDNYEL7yOuj25XZ6g==/base.apk", zip file "/data/app/dev.flutter.scenarios-rlxf5VuTV43PTiaP6mOD-g==/base.apk"],nativeLibraryDirectories=[/data/app/dev.flutter.scenarios.test-KKXe9YDNYEL7yOuj25XZ6g==/lib/arm64, /data/app/dev.flutter.scenarios-rlxf5VuTV43PTiaP6mOD-g==/lib/arm64, /data/app/dev.flutter.scenarios.test-KKXe9YDNYEL7yOuj25XZ6g==/base.apk!/lib/arm64-v8a, /data/app/dev.flutter.scenarios-rlxf5VuTV43PTiaP6mOD-g==/base.apk!/lib/arm64-v8a, /system/lib64]]]' -[stdout] 02-15 10:20:37.181 6840 6840 I MonitoringInstr: No JSBridge. -[stdout] 02-15 10:20:37.182 6840 6861 I MonitoringInstr: Setting context classloader to 'dalvik.system.PathClassLoader[DexPathList[[zip file "/system/framework/android.test.runner.jar", zip file "/system/framework/android.test.mock.jar", zip file "/data/app/dev.flutter.scenarios.test-KKXe9YDNYEL7yOuj25XZ6g==/base.apk", zip file "/data/app/dev.flutter.scenarios-rlxf5VuTV43PTiaP6mOD-g==/base.apk"],nativeLibraryDirectories=[/data/app/dev.flutter.scenarios.test-KKXe9YDNYEL7yOuj25XZ6g==/lib/arm64, /data/app/dev.flutter.scenarios-rlxf5VuTV43PTiaP6mOD-g==/lib/arm64, /data/app/dev.flutter.scenarios.test-KKXe9YDNYEL7yOuj25XZ6g==/base.apk!/lib/arm64-v8a, /data/app/dev.flutter.scenarios-rlxf5VuTV43PTiaP6mOD-g==/base.apk!/lib/arm64-v8a, /system/lib64]]]', Original: 'dalvik.system.PathClassLoader[DexPathList[[zip file "/system/framework/android.test.runner.jar", zip file "/system/framework/android.test.mock.jar", zip file "/data/app/dev.flutter.scenarios.test-KKXe9YDNYEL7yOuj25XZ6g==/base.apk", zip file "/data/app/dev.flutter.scenarios-rlxf5VuTV43PTiaP6mOD-g==/base.apk"],nativeLibraryDirectories=[/data/app/dev.flutter.scenarios.test-KKXe9YDNYEL7yOuj25XZ6g==/lib/arm64, /data/app/dev.flutter.scenarios-rlxf5VuTV43PTiaP6mOD-g==/lib/arm64, /data/app/dev.flutter.scenarios.test-KKXe9YDNYEL7yOuj25XZ6g==/base.apk!/lib/arm64-v8a, /data/app/dev.flutter.scenarios-rlxf5VuTV43PTiaP6mOD-g==/base.apk!/lib/arm64-v8a, /system/lib64]]]' -[stdout] 02-15 10:20:37.183 6840 6863 I ResourceExtractor: Resource version mismatch res_timestamp-1-1708021236564 -[stdout] 02-15 10:20:37.187 6840 6861 I UsageTrackerFacilitator: Usage tracking enabled -[stdout] 02-15 10:20:37.188 6840 6861 I TestRequestBuilder: Scanning classpath to find tests in paths [/data/app/dev.flutter.scenarios.test-KKXe9YDNYEL7yOuj25XZ6g==/base.apk] -[stdout] 02-15 10:20:37.188 6840 6861 W utter.scenario: Opening an oat file without a class loader. Are you using the deprecated DexFile APIs? -[stdout] 02-15 10:20:37.229 6840 6863 I ResourceExtractor: Extracted baseline resource assets/flutter_assets/kernel_blob.bin -[stdout] 02-15 10:20:37.246 2863 4286 D RcsProvisioning: No backup token found -[stdout] 02-15 10:20:37.246 2863 4286 D RcsProvisioning: Retrieving backup token -[stdout] 02-15 10:20:37.246 2863 4286 D RcsProvisioning: Exception while getting subscriber Id. Using default -[stdout] 02-15 10:20:37.307 6840 6863 I ResourceExtractor: Extracted baseline resource assets/flutter_assets/isolate_snapshot_data -[stdout] 02-15 10:20:37.364 6840 6861 D TestExecutor: Adding listener androidx.test.internal.runner.listener.LogRunListener -[stdout] 02-15 10:20:37.364 6840 6861 D TestExecutor: Adding listener androidx.test.internal.runner.listener.InstrumentationResultPrinter -[stdout] 02-15 10:20:37.364 6840 6861 D TestExecutor: Adding listener androidx.test.internal.runner.listener.ActivityFinisherRunListener -[stdout] 02-15 10:20:37.369 6840 6861 I TestRunner: run started: 66 tests -[stdout] 02-15 10:20:37.371 6840 6861 I TestRunner: started: smokeTestEngineLaunch(dev.flutter.scenarios.EngineLaunchE2ETest) -[stdout] 02-15 10:20:37.371 6840 6840 I MonitoringInstr: Activities that are still in CREATED to STOPPED: 0 -[stdout] 02-15 10:20:37.372 6840 6840 W utter.scenarios: type=1400 audit(0.0:71): avc: denied { read } for name="max_map_count" dev="proc" ino=60316 scontext=u:r:untrusted_app:s0:c98,c256,c512,c768 tcontext=u:object_r:proc_max_map_count:s0 tclass=file permissive=0 -[stdout] 02-15 10:20:37.386 2863 4286 D RcsProvisioning: No backup token found -[stdout] 02-15 10:20:37.387 6840 6840 D HostConnection: HostConnection::get() New Host Connection established 0x758aed7120, tid 6840 -[stdout] 02-15 10:20:37.388 6840 6840 D HostConnection: HostComposition ext ANDROID_EMU_CHECKSUM_HELPER_v1 ANDROID_EMU_sync_buffer_data GL_OES_EGL_image_external_essl3 GL_OES_vertex_array_object GL_KHR_texture_compression_astc_ldr ANDROID_EMU_host_side_tracing ANDROID_EMU_gles_max_version_3_0 -[stdout] 02-15 10:20:37.388 2863 4286 W RcsProvisioning: Failed to read configuration: /data/user/0/com.google.android.apps.messaging/files/rcsconfig (No such file or directory) -[stdout] 02-15 10:20:37.389 2863 4286 W RcsProvisioning: java.io.FileNotFoundException: /data/user/0/com.google.android.apps.messaging/files/rcsconfig (No such file or directory) -[stdout] 02-15 10:20:37.389 2863 4286 W RcsProvisioning: at java.io.FileInputStream.open0(Native Method) -[stdout] 02-15 10:20:37.389 2863 4286 W RcsProvisioning: at java.io.FileInputStream.open(FileInputStream.java:231) -[stdout] 02-15 10:20:37.389 2863 4286 W RcsProvisioning: at java.io.FileInputStream.(FileInputStream.java:165) -[stdout] 02-15 10:20:37.389 2863 4286 W RcsProvisioning: at android.app.ContextImpl.openFileInput(ContextImpl.java:560) -[stdout] 02-15 10:20:37.389 2863 4286 W RcsProvisioning: at android.content.ContextWrapper.openFileInput(ContextWrapper.java:202) -[stdout] 02-15 10:20:37.389 2863 4286 W RcsProvisioning: at ion.a(SourceFile:2) -[stdout] 02-15 10:20:37.389 2863 4286 W RcsProvisioning: at idl.a(SourceFile:4) -[stdout] 02-15 10:20:37.389 2863 4286 W RcsProvisioning: at idm.a(SourceFile:7) -[stdout] 02-15 10:20:37.389 2863 4286 W RcsProvisioning: at iez.buildConferencesFileName(SourceFile:30) -[stdout] 02-15 10:20:37.389 2863 4286 W RcsProvisioning: at com.google.android.apps.messaging.rcsmigration.RcsStateProvider.buildRcsState(SourceFile:129) -[stdout] 02-15 10:20:37.389 2863 4286 W RcsProvisioning: at com.google.android.apps.messaging.rcsmigration.RcsStateProvider.getRcsState(SourceFile:6) -[stdout] 02-15 10:20:37.389 2863 4286 W RcsProvisioning: at com.google.android.ims.rcsmigration.IRcsStateProvider$Stub.dispatchTransaction(SourceFile:10) -[stdout] 02-15 10:20:37.389 2863 4286 W RcsProvisioning: at com.google.android.aidl.BaseStub.onTransact(SourceFile:18) -[stdout] 02-15 10:20:37.389 2863 4286 W RcsProvisioning: at android.os.Binder.execTransact(Binder.java:731) -[stdout] 02-15 10:20:37.389 2863 4286 D RcsProvisioning: Retrieving backup token -[stdout] 02-15 10:20:37.389 2863 4286 D RcsProvisioning: Exception while getting subscriber Id. Using default -[stdout] 02-15 10:20:37.389 6840 6840 I ConfigStore: android::hardware::configstore::V1_0::ISurfaceFlingerConfigs::hasWideColorDisplay retrieved: 0 -[stdout] 02-15 10:20:37.389 6840 6840 I ConfigStore: android::hardware::configstore::V1_0::ISurfaceFlingerConfigs::hasHDRDisplay retrieved: 0 -[stdout] 02-15 10:20:37.390 6840 6840 D eglCodecCommon: setVertexArrayObject: set vao to 0 (0) 0 0 -[stdout] 02-15 10:20:37.390 6840 6840 D EGL_emulation: eglCreateContext: 0x758aed8020: maj 3 min 0 rcv 3 -[stdout] 02-15 10:20:37.390 6840 6840 D eglCodecCommon: setVertexArrayObject: set vao to 0 (0) 0 0 -[stdout] 02-15 10:20:37.390 6840 6840 D EGL_emulation: eglCreateContext: 0x758aed80c0: maj 3 min 0 rcv 3 -[stdout] 02-15 10:20:37.391 6840 6869 D HostConnection: HostConnection::get() New Host Connection established 0x758aed8340, tid 6869 -[stdout] 02-15 10:20:37.391 6840 6869 D HostConnection: HostComposition ext ANDROID_EMU_CHECKSUM_HELPER_v1 ANDROID_EMU_sync_buffer_data GL_OES_EGL_image_external_essl3 GL_OES_vertex_array_object GL_KHR_texture_compression_astc_ldr ANDROID_EMU_host_side_tracing ANDROID_EMU_gles_max_version_3_0 -[stdout] 02-15 10:20:37.392 6840 6869 D EGL_emulation: eglMakeCurrent: 0x758aed80c0: ver 3 0 (tinfo 0x75894bcf60) -[stdout] 02-15 10:20:37.430 6840 6840 E GeneratedPluginsRegister: Tried to automatically register plugins with FlutterEngine (io.flutter.embedding.engine.FlutterEngine@144d737) but could not find or invoke the GeneratedPluginRegistrant. -[stdout] 02-15 10:20:37.431 6840 6840 E GeneratedPluginsRegister: Received exception while registering -[stdout] 02-15 10:20:37.431 6840 6840 E GeneratedPluginsRegister: java.lang.ClassNotFoundException: io.flutter.plugins.GeneratedPluginRegistrant -[stdout] 02-15 10:20:37.431 6840 6840 E GeneratedPluginsRegister: at java.lang.Class.classForName(Native Method) -[stdout] 02-15 10:20:37.431 6840 6840 E GeneratedPluginsRegister: at java.lang.Class.forName(Class.java:453) -[stdout] 02-15 10:20:37.431 6840 6840 E GeneratedPluginsRegister: at java.lang.Class.forName(Class.java:378) -[stdout] 02-15 10:20:37.431 6840 6840 E GeneratedPluginsRegister: at io.flutter.embedding.engine.plugins.util.GeneratedPluginRegister.registerGeneratedPlugins(GeneratedPluginRegister.java:77) -[stdout] 02-15 10:20:37.431 6840 6840 E GeneratedPluginsRegister: at io.flutter.embedding.engine.FlutterEngine.(FlutterEngine.java:385) -[stdout] 02-15 10:20:37.431 6840 6840 E GeneratedPluginsRegister: at io.flutter.embedding.engine.FlutterEngine.(FlutterEngine.java:287) -[stdout] 02-15 10:20:37.431 6840 6840 E GeneratedPluginsRegister: at io.flutter.embedding.engine.FlutterEngine.(FlutterEngine.java:268) -[stdout] 02-15 10:20:37.431 6840 6840 E GeneratedPluginsRegister: at io.flutter.embedding.engine.FlutterEngine.(FlutterEngine.java:248) -[stdout] 02-15 10:20:37.431 6840 6840 E GeneratedPluginsRegister: at io.flutter.embedding.engine.FlutterEngine.(FlutterEngine.java:168) -[stdout] 02-15 10:20:37.431 6840 6840 E GeneratedPluginsRegister: at io.flutter.embedding.engine.FlutterEngine.(FlutterEngine.java:159) -[stdout] 02-15 10:20:37.431 6840 6840 E GeneratedPluginsRegister: at dev.flutter.scenarios.EngineLaunchE2ETest.lambda$smokeTestEngineLaunch$0(EngineLaunchE2ETest.java:36) -[stdout] 02-15 10:20:37.431 6840 6840 E GeneratedPluginsRegister: at dev.flutter.scenarios.EngineLaunchE2ETest$$ExternalSyntheticLambda0.run(Unknown Source:4) -[stdout] 02-15 10:20:37.431 6840 6840 E GeneratedPluginsRegister: at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:458) -[stdout] 02-15 10:20:37.431 6840 6840 E GeneratedPluginsRegister: at java.util.concurrent.FutureTask.run(FutureTask.java:266) -[stdout] 02-15 10:20:37.431 6840 6840 E GeneratedPluginsRegister: at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:458) -[stdout] 02-15 10:20:37.431 6840 6840 E GeneratedPluginsRegister: at java.util.concurrent.FutureTask.run(FutureTask.java:266) -[stdout] 02-15 10:20:37.431 6840 6840 E GeneratedPluginsRegister: at android.app.Instrumentation$SyncRunnable.run(Instrumentation.java:2163) -[stdout] 02-15 10:20:37.431 6840 6840 E GeneratedPluginsRegister: at android.os.Handler.handleCallback(Handler.java:873) -[stdout] 02-15 10:20:37.431 6840 6840 E GeneratedPluginsRegister: at android.os.Handler.dispatchMessage(Handler.java:99) -[stdout] 02-15 10:20:37.431 6840 6840 E GeneratedPluginsRegister: at android.os.Looper.loop(Looper.java:193) -[stdout] 02-15 10:20:37.431 6840 6840 E GeneratedPluginsRegister: at android.app.ActivityThread.main(ActivityThread.java:6669) -[stdout] 02-15 10:20:37.431 6840 6840 E GeneratedPluginsRegister: at java.lang.reflect.Method.invoke(Native Method) -[stdout] 02-15 10:20:37.431 6840 6840 E GeneratedPluginsRegister: at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:493) -[stdout] 02-15 10:20:37.431 6840 6840 E GeneratedPluginsRegister: at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:858) -[stdout] 02-15 10:20:37.431 6840 6840 E GeneratedPluginsRegister: Caused by: java.lang.ClassNotFoundException: Didn't find class "io.flutter.plugins.GeneratedPluginRegistrant" on path: DexPathList[[zip file "/system/framework/android.test.runner.jar", zip file "/system/framework/android.test.mock.jar", zip file "/data/app/dev.flutter.scenarios.test-KKXe9YDNYEL7yOuj25XZ6g==/base.apk", zip file "/data/app/dev.flutter.scenarios-rlxf5VuTV43PTiaP6mOD-g==/base.apk"],nativeLibraryDirectories=[/data/app/dev.flutter.scenarios.test-KKXe9YDNYEL7yOuj25XZ6g==/lib/arm64, /data/app/dev.flutter.scenarios-rlxf5VuTV43PTiaP6mOD-g==/lib/arm64, /data/app/dev.flutter.scenarios.test-KKXe9YDNYEL7yOuj25XZ6g==/base.apk!/lib/arm64-v8a, /data/app/dev.flutter.scenarios-rlxf5VuTV43PTiaP6mOD-g==/base.apk!/lib/arm64-v8a, /system/lib64]] -[stdout] 02-15 10:20:37.431 6840 6840 E GeneratedPluginsRegister: at dalvik.system.BaseDexClassLoader.findClass(BaseDexClassLoader.java:134) -[stdout] 02-15 10:20:37.431 6840 6840 E GeneratedPluginsRegister: at java.lang.ClassLoader.loadClass(ClassLoader.java:379) -[stdout] 02-15 10:20:37.431 6840 6840 E GeneratedPluginsRegister: at java.lang.ClassLoader.loadClass(ClassLoader.java:312) -[stdout] 02-15 10:20:37.431 6840 6840 E GeneratedPluginsRegister: ... 24 more -[stdout] 02-15 10:20:37.463 6840 6876 I flutter : The Dart VM service is listening on http://127.0.0.1:46424/ubaMX7XzZVU=/ -[stdout] 02-15 10:20:37.465 6840 6867 W utter.scenario: Accessing hidden method Landroid/os/Trace;->asyncTraceBegin(JLjava/lang/String;I)V (light greylist, reflection) -[stdout] 02-15 10:20:37.465 6840 6840 W utter.scenario: Accessing hidden method Landroid/os/Trace;->asyncTraceEnd(JLjava/lang/String;I)V (light greylist, reflection) -[stdout] 02-15 10:20:37.470 6840 6861 I TestRunner: finished: smokeTestEngineLaunch(dev.flutter.scenarios.EngineLaunchE2ETest) -[stdout] 02-15 10:20:37.470 6840 6840 I MonitoringInstr: Activities that are still in CREATED to STOPPED: 0 -[stdout] 02-15 10:20:37.470 6840 6861 I TestRunner: started: useAppContext(dev.flutter.scenarios.ExampleInstrumentedTest) -[stdout] 02-15 10:20:37.471 6840 6840 I MonitoringInstr: Activities that are still in CREATED to STOPPED: 0 -[stdout] 02-15 10:20:37.471 6840 6861 I TestRunner: finished: useAppContext(dev.flutter.scenarios.ExampleInstrumentedTest) -[stdout] 02-15 10:20:37.471 6840 6840 I MonitoringInstr: Activities that are still in CREATED to STOPPED: 0 -[stdout] 02-15 10:20:37.472 6840 6861 I TestRunner: started: testCroppedRotatedMediaSurface_bottomLeft_90(dev.flutter.scenariosui.ExternalTextureTests) -[stdout] 02-15 10:20:37.472 6840 6840 I MonitoringInstr: Activities that are still in CREATED to STOPPED: 0 -[stdout] 02-15 10:20:37.474 1735 1836 I ActivityManager: START u0 {act=android.intent.action.MAIN flg=0x14000000 cmp=dev.flutter.scenarios/.ExternalTextureFlutterActivity (has extras)} from uid 10098 -[stdout] 02-15 10:20:37.479 6840 6840 W ActivityThread: handleWindowVisibility: no activity for token android.os.BinderProxy@22f6c0e -[stdout] 02-15 10:20:37.482 6840 6840 I utter.scenario: Rejecting re-init on previously-failed class java.lang.Class: java.lang.NoClassDefFoundError: Failed resolution of: Landroid/window/OnBackInvokedCallback; -[stdout] 02-15 10:20:37.482 6840 6840 I utter.scenario: at java.lang.Object java.lang.Class.newInstance() (Class.java:-2) -[stdout] 02-15 10:20:37.482 6840 6840 I utter.scenario: at android.app.Activity android.app.AppComponentFactory.instantiateActivity(java.lang.ClassLoader, java.lang.String, android.content.Intent) (AppComponentFactory.java:69) -[stdout] 02-15 10:20:37.482 6840 6840 I utter.scenario: at android.app.Activity androidx.core.app.CoreComponentFactory.instantiateActivity(java.lang.ClassLoader, java.lang.String, android.content.Intent) (CoreComponentFactory.java:45) -[stdout] 02-15 10:20:37.482 6840 6840 I utter.scenario: at android.app.Activity android.app.Instrumentation.newActivity(java.lang.ClassLoader, java.lang.String, android.content.Intent) (Instrumentation.java:1215) -[stdout] 02-15 10:20:37.482 6840 6840 I utter.scenario: at android.app.Activity androidx.test.runner.MonitoringInstrumentation.newActivity(java.lang.ClassLoader, java.lang.String, android.content.Intent) (MonitoringInstrumentation.java:789) -[stdout] 02-15 10:20:37.482 6840 6840 I utter.scenario: at android.app.Activity android.app.ActivityThread.performLaunchActivity(android.app.ActivityThread$ActivityClientRecord, android.content.Intent) (ActivityThread.java:2831) -[stdout] 02-15 10:20:37.482 6840 6840 I utter.scenario: at android.app.Activity android.app.ActivityThread.handleLaunchActivity(android.app.ActivityThread$ActivityClientRecord, android.app.servertransaction.PendingTransactionActions, android.content.Intent) (ActivityThread.java:3048) -[stdout] 02-15 10:20:37.482 6840 6840 I utter.scenario: at void android.app.servertransaction.LaunchActivityItem.execute(android.app.ClientTransactionHandler, android.os.IBinder, android.app.servertransaction.PendingTransactionActions) (LaunchActivityItem.java:78) -[stdout] 02-15 10:20:37.482 6840 6840 I utter.scenario: at void android.app.servertransaction.TransactionExecutor.executeCallbacks(android.app.servertransaction.ClientTransaction) (TransactionExecutor.java:108) -[stdout] 02-15 10:20:37.482 6840 6840 I utter.scenario: at void android.app.servertransaction.TransactionExecutor.execute(android.app.servertransaction.ClientTransaction) (TransactionExecutor.java:68) -[stdout] 02-15 10:20:37.482 6840 6840 I utter.scenario: at void android.app.ActivityThread$H.handleMessage(android.os.Message) (ActivityThread.java:1808) -[stdout] 02-15 10:20:37.482 6840 6840 I utter.scenario: at void android.os.Handler.dispatchMessage(android.os.Message) (Handler.java:106) -[stdout] 02-15 10:20:37.482 6840 6840 I utter.scenario: at void android.os.Looper.loop() (Looper.java:193) -[stdout] 02-15 10:20:37.482 6840 6840 I utter.scenario: at void android.app.ActivityThread.main(java.lang.String[]) (ActivityThread.java:6669) -[stdout] 02-15 10:20:37.482 6840 6840 I utter.scenario: at java.lang.Object java.lang.reflect.Method.invoke(java.lang.Object, java.lang.Object[]) (Method.java:-2) -[stdout] 02-15 10:20:37.482 6840 6840 I utter.scenario: at void com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run() (RuntimeInit.java:493) -[stdout] 02-15 10:20:37.482 6840 6840 I utter.scenario: at void com.android.internal.os.ZygoteInit.main(java.lang.String[]) (ZygoteInit.java:858) -[stdout] 02-15 10:20:37.482 6840 6840 I utter.scenario: Caused by: java.lang.ClassNotFoundException: Didn't find class "android.window.OnBackInvokedCallback" on path: DexPathList[[zip file "/system/framework/android.test.runner.jar", zip file "/system/framework/android.test.mock.jar", zip file "/data/app/dev.flutter.scenarios.test-KKXe9YDNYEL7yOuj25XZ6g==/base.apk", zip file "/data/app/dev.flutter.scenarios-rlxf5VuTV43PTiaP6mOD-g==/base.apk"],nativeLibraryDirectories=[/data/app/dev.flutter.scenarios.test-KKXe9YDNYEL7yOuj25XZ6g==/lib/arm64, /data/app/dev.flutter.scenarios-rlxf5VuTV43PTiaP6mOD-g==/lib/arm64, /data/app/dev.flutter.scenarios.test-KKXe9YDNYEL7yOuj25XZ6g==/base.apk!/lib/arm64-v8a, /data/app/dev.flutter.scenarios-rlxf5VuTV43PTiaP6mOD-g==/base.apk!/lib/arm64-v8a, /system/lib64]] -[stdout] 02-15 10:20:37.482 6840 6840 I utter.scenario: at java.lang.Class dalvik.system.BaseDexClassLoader.findClass(java.lang.String) (BaseDexClassLoader.java:134) -[stdout] 02-15 10:20:37.482 6840 6840 I utter.scenario: at java.lang.Class java.lang.ClassLoader.loadClass(java.lang.String, boolean) (ClassLoader.java:379) -[stdout] 02-15 10:20:37.482 6840 6840 I utter.scenario: at java.lang.Class java.lang.ClassLoader.loadClass(java.lang.String) (ClassLoader.java:312) -[stdout] 02-15 10:20:37.482 6840 6840 I utter.scenario: at java.lang.Object java.lang.Class.newInstance() (Class.java:-2) -[stdout] 02-15 10:20:37.482 6840 6840 I utter.scenario: at android.app.Activity android.app.AppComponentFactory.instantiateActivity(java.lang.ClassLoader, java.lang.String, android.content.Intent) (AppComponentFactory.java:69) -[stdout] 02-15 10:20:37.482 6840 6840 I utter.scenario: at android.app.Activity androidx.core.app.CoreComponentFactory.instantiateActivity(java.lang.ClassLoader, java.lang.String, android.content.Intent) (CoreComponentFactory.java:45) -[stdout] 02-15 10:20:37.482 6840 6840 I utter.scenario: at android.app.Activity android.app.Instrumentation.newActivity(java.lang.ClassLoader, java.lang.String, android.content.Intent) (Instrumentation.java:1215) -[stdout] 02-15 10:20:37.482 6840 6840 I utter.scenario: at android.app.Activity androidx.test.runner.MonitoringInstrumentation.newActivity(java.lang.ClassLoader, java.lang.String, android.content.Intent) (MonitoringInstrumentation.java:789) -[stdout] 02-15 10:20:37.482 6840 6840 I utter.scenario: at android.app.Activity android.app.ActivityThread.performLaunchActivity(android.app.ActivityThread$ActivityClientRecord, android.content.Intent) (ActivityThread.java:2831) -[stdout] 02-15 10:20:37.482 6840 6840 I utter.scenario: at android.app.Activity android.app.ActivityThread.handleLaunchActivity(android.app.ActivityThread$ActivityClientRecord, android.app.servertransaction.PendingTransactionActions, android.content.Intent) (ActivityThread.java:3048) -[stdout] 02-15 10:20:37.482 6840 6840 I utter.scenario: at void android.app.servertransaction.LaunchActivityItem.execute(android.app.ClientTransactionHandler, android.os.IBinder, android.app.servertransaction.PendingTransactionActions) (LaunchActivityItem.java:78) -[stdout] 02-15 10:20:37.482 6840 6840 I utter.scenario: at void android.app.servertransaction.TransactionExecutor.executeCallbacks(android.app.servertransaction.ClientTransaction) (TransactionExecutor.java:108) -[stdout] 02-15 10:20:37.482 6840 6840 I utter.scenario: at void android.app.servertransaction.TransactionExecutor.execute(android.app.servertransaction.ClientTransaction) (TransactionExecutor.java:68) -[stdout] 02-15 10:20:37.482 6840 6840 I utter.scenario: at void android.app.ActivityThread$H.handleMessage(android.os.Message) (ActivityThread.java:1808) -[stdout] 02-15 10:20:37.482 6840 6840 I utter.scenario: at void android.os.Handler.dispatchMessage(android.os.Message) (Handler.java:106) -[stdout] 02-15 10:20:37.482 6840 6840 I utter.scenario: at void android.os.Looper.loop() (Looper.java:193) -[stdout] 02-15 10:20:37.482 6840 6840 I utter.scenario: at void android.app.ActivityThread.main(java.lang.String[]) (ActivityThread.java:6669) -[stdout] 02-15 10:20:37.482 6840 6840 I utter.scenario: at java.lang.Object java.lang.reflect.Method.invoke(java.lang.Object, java.lang.Object[]) (Method.java:-2) -[stdout] 02-15 10:20:37.482 6840 6840 I utter.scenario: at void com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run() (RuntimeInit.java:493) -[stdout] 02-15 10:20:37.482 6840 6840 I utter.scenario: at void com.android.internal.os.ZygoteInit.main(java.lang.String[]) (ZygoteInit.java:858) -[stdout] 02-15 10:20:37.482 6840 6840 I utter.scenario: -[stdout] 02-15 10:20:37.482 6840 6840 I utter.scenario: Rejecting re-init on previously-failed class java.lang.Class: java.lang.NoClassDefFoundError: Failed resolution of: Landroid/window/OnBackInvokedCallback; -[stdout] 02-15 10:20:37.482 6840 6840 I utter.scenario: at java.lang.Object java.lang.Class.newInstance() (Class.java:-2) -[stdout] 02-15 10:20:37.482 6840 6840 I utter.scenario: at android.app.Activity android.app.AppComponentFactory.instantiateActivity(java.lang.ClassLoader, java.lang.String, android.content.Intent) (AppComponentFactory.java:69) -[stdout] 02-15 10:20:37.482 6840 6840 I utter.scenario: at android.app.Activity androidx.core.app.CoreComponentFactory.instantiateActivity(java.lang.ClassLoader, java.lang.String, android.content.Intent) (CoreComponentFactory.java:45) -[stdout] 02-15 10:20:37.482 6840 6840 I utter.scenario: at android.app.Activity android.app.Instrumentation.newActivity(java.lang.ClassLoader, java.lang.String, android.content.Intent) (Instrumentation.java:1215) -[stdout] 02-15 10:20:37.482 6840 6840 I utter.scenario: at android.app.Activity androidx.test.runner.MonitoringInstrumentation.newActivity(java.lang.ClassLoader, java.lang.String, android.content.Intent) (MonitoringInstrumentation.java:789) -[stdout] 02-15 10:20:37.482 6840 6840 I utter.scenario: at android.app.Activity android.app.ActivityThread.performLaunchActivity(android.app.ActivityThread$ActivityClientRecord, android.content.Intent) (ActivityThread.java:2831) -[stdout] 02-15 10:20:37.482 6840 6840 I utter.scenario: at android.app.Activity android.app.ActivityThread.handleLaunchActivity(android.app.ActivityThread$ActivityClientRecord, android.app.servertransaction.PendingTransactionActions, android.content.Intent) (ActivityThread.java:3048) -[stdout] 02-15 10:20:37.482 6840 6840 I utter.scenario: at void android.app.servertransaction.LaunchActivityItem.execute(android.app.ClientTransactionHandler, android.os.IBinder, android.app.servertransaction.PendingTransactionActions) (LaunchActivityItem.java:78) -[stdout] 02-15 10:20:37.482 6840 6840 I utter.scenario: at void android.app.servertransaction.TransactionExecutor.executeCallbacks(android.app.servertransaction.ClientTransaction) (TransactionExecutor.java:108) -[stdout] 02-15 10:20:37.482 6840 6840 I utter.scenario: at void android.app.servertransaction.TransactionExecutor.execute(android.app.servertransaction.ClientTransaction) (TransactionExecutor.java:68) -[stdout] 02-15 10:20:37.482 6840 6840 I utter.scenario: at void android.app.ActivityThread$H.handleMessage(android.os.Message) (ActivityThread.java:1808) -[stdout] 02-15 10:20:37.482 6840 6840 I utter.scenario: at void android.os.Handler.dispatchMessage(android.os.Message) (Handler.java:106) -[stdout] 02-15 10:20:37.482 6840 6840 I utter.scenario: at void android.os.Looper.loop() (Looper.java:193) -[stdout] 02-15 10:20:37.482 6840 6840 I utter.scenario: at void android.app.ActivityThread.main(java.lang.String[]) (ActivityThread.java:6669) -[stdout] 02-15 10:20:37.482 6840 6840 I utter.scenario: at java.lang.Object java.lang.reflect.Method.invoke(java.lang.Object, java.lang.Object[]) (Method.java:-2) -[stdout] 02-15 10:20:37.482 6840 6840 I utter.scenario: at void com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run() (RuntimeInit.java:493) -[stdout] 02-15 10:20:37.482 6840 6840 I utter.scenario: at void com.android.internal.os.ZygoteInit.main(java.lang.String[]) (ZygoteInit.java:858) -[stdout] 02-15 10:20:37.482 6840 6840 I utter.scenario: Caused by: java.lang.ClassNotFoundException: Didn't find class "android.window.OnBackInvokedCallback" on path: DexPathList[[zip file "/system/framework/android.test.runner.jar", zip file "/system/framework/android.test.mock.jar", zip file "/data/app/dev.flutter.scenarios.test-KKXe9YDNYEL7yOuj25XZ6g==/base.apk", zip file "/data/app/dev.flutter.scenarios-rlxf5VuTV43PTiaP6mOD-g==/base.apk"],nativeLibraryDirectories=[/data/app/dev.flutter.scenarios.test-KKXe9YDNYEL7yOuj25XZ6g==/lib/arm64, /data/app/dev.flutter.scenarios-rlxf5VuTV43PTiaP6mOD-g==/lib/arm64, /data/app/dev.flutter.scenarios.test-KKXe9YDNYEL7yOuj25XZ6g==/base.apk!/lib/arm64-v8a, /data/app/dev.flutter.scenarios-rlxf5VuTV43PTiaP6mOD-g==/base.apk!/lib/arm64-v8a, /system/lib64]] -[stdout] 02-15 10:20:37.482 6840 6840 I utter.scenario: at java.lang.Class dalvik.system.BaseDexClassLoader.findClass(java.lang.String) (BaseDexClassLoader.java:134) -[stdout] 02-15 10:20:37.482 6840 6840 I utter.scenario: at java.lang.Class java.lang.ClassLoader.loadClass(java.lang.String, boolean) (ClassLoader.java:379) -[stdout] 02-15 10:20:37.482 6840 6840 I utter.scenario: at java.lang.Class java.lang.ClassLoader.loadClass(java.lang.String) (ClassLoader.java:312) -[stdout] 02-15 10:20:37.482 6840 6840 I utter.scenario: at java.lang.Object java.lang.Class.newInstance() (Class.java:-2) -[stdout] 02-15 10:20:37.482 6840 6840 I utter.scenario: at android.app.Activity android.app.AppComponentFactory.instantiateActivity(java.lang.ClassLoader, java.lang.String, android.content.Intent) (AppComponentFactory.java:69) -[stdout] 02-15 10:20:37.482 6840 6840 I utter.scenario: at android.app.Activity androidx.core.app.CoreComponentFactory.instantiateActivity(java.lang.ClassLoader, java.lang.String, android.content.Intent) (CoreComponentFactory.java:45) -[stdout] 02-15 10:20:37.482 6840 6840 I utter.scenario: at android.app.Activity android.app.Instrumentation.newActivity(java.lang.ClassLoader, java.lang.String, android.content.Intent) (Instrumentation.java:1215) -[stdout] 02-15 10:20:37.482 6840 6840 I utter.scenario: at android.app.Activity androidx.test.runner.MonitoringInstrumentation.newActivity(java.lang.ClassLoader, java.lang.String, android.content.Intent) (MonitoringInstrumentation.java:789) -[stdout] 02-15 10:20:37.482 6840 6840 I utter.scenario: at android.app.Activity android.app.ActivityThread.performLaunchActivity(android.app.ActivityThread$ActivityClientRecord, android.content.Intent) (ActivityThread.java:2831) -[stdout] 02-15 10:20:37.482 6840 6840 I utter.scenario: at android.app.Activity android.app.ActivityThread.handleLaunchActivity(android.app.ActivityThread$ActivityClientRecord, android.app.servertransaction.PendingTransactionActions, android.content.Intent) (ActivityThread.java:3048) -[stdout] 02-15 10:20:37.482 6840 6840 I utter.scenario: at void android.app.servertransaction.LaunchActivityItem.execute(android.app.ClientTransactionHandler, android.os.IBinder, android.app.servertransaction.PendingTransactionActions) (LaunchActivityItem.java:78) -[stdout] 02-15 10:20:37.482 6840 6840 I utter.scenario: at void android.app.servertransaction.TransactionExecutor.executeCallbacks(android.app.servertransaction.ClientTransaction) (TransactionExecutor.java:108) -[stdout] 02-15 10:20:37.482 6840 6840 I utter.scenario: at void android.app.servertransaction.TransactionExecutor.execute(android.app.servertransaction.ClientTransaction) (TransactionExecutor.java:68) -[stdout] 02-15 10:20:37.482 6840 6840 I utter.scenario: at void android.app.ActivityThread$H.handleMessage(android.os.Message) (ActivityThread.java:1808) -[stdout] 02-15 10:20:37.482 6840 6840 I utter.scenario: at void android.os.Handler.dispatchMessage(android.os.Message) (Handler.java:106) -[stdout] 02-15 10:20:37.482 6840 6840 I utter.scenario: at void android.os.Looper.loop() (Looper.java:193) -[stdout] 02-15 10:20:37.482 6840 6840 I utter.scenario: at void android.app.ActivityThread.main(java.lang.String[]) (ActivityThread.java:6669) -[stdout] 02-15 10:20:37.482 6840 6840 I utter.scenario: at java.lang.Object java.lang.reflect.Method.invoke(java.lang.Object, java.lang.Object[]) (Method.java:-2) -[stdout] 02-15 10:20:37.482 6840 6840 I utter.scenario: at void com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run() (RuntimeInit.java:493) -[stdout] 02-15 10:20:37.482 6840 6840 I utter.scenario: at void com.android.internal.os.ZygoteInit.main(java.lang.String[]) (ZygoteInit.java:858) -[stdout] 02-15 10:20:37.482 6840 6840 I utter.scenario: -[stdout] 02-15 10:20:37.484 6840 6840 D LifecycleMonitor: Lifecycle status change: dev.flutter.scenarios.ExternalTextureFlutterActivity@8bbd5c5 in: PRE_ON_CREATE -[stdout] 02-15 10:20:37.486 6840 6840 D eglCodecCommon: setVertexArrayObject: set vao to 0 (0) 0 0 -[stdout] 02-15 10:20:37.486 6840 6840 D EGL_emulation: eglCreateContext: 0x758aed82a0: maj 3 min 0 rcv 3 -[stdout] 02-15 10:20:37.486 6840 6840 D eglCodecCommon: setVertexArrayObject: set vao to 0 (0) 0 0 -[stdout] 02-15 10:20:37.486 6840 6840 D EGL_emulation: eglCreateContext: 0x758aed8f20: maj 3 min 0 rcv 3 -[stdout] 02-15 10:20:37.487 6840 6882 D HostConnection: HostConnection::get() New Host Connection established 0x758c844ee0, tid 6882 -[stdout] 02-15 10:20:37.495 6840 6882 D HostConnection: HostComposition ext ANDROID_EMU_CHECKSUM_HELPER_v1 ANDROID_EMU_sync_buffer_data GL_OES_EGL_image_external_essl3 GL_OES_vertex_array_object GL_KHR_texture_compression_astc_ldr ANDROID_EMU_host_side_tracing ANDROID_EMU_gles_max_version_3_0 -[stdout] 02-15 10:20:37.495 6840 6882 D EGL_emulation: eglMakeCurrent: 0x758aed8f20: ver 3 0 (tinfo 0x7575cee720) -[stdout] 02-15 10:20:37.502 6840 6840 D OpenGLRenderer: Skia GL Pipeline -[stdout] 02-15 10:20:37.508 1384 2162 D gralloc_ranchu: gralloc_alloc: Creating ashmem region of size 10371072 -[stdout] 02-15 10:20:37.522 6840 6840 W utter.scenario: Accessing hidden method Landroid/view/accessibility/AccessibilityNodeInfo;->getSourceNodeId()J (light greylist, reflection) -[stdout] 02-15 10:20:37.522 6840 6840 W utter.scenario: Accessing hidden method Landroid/view/accessibility/AccessibilityRecord;->getSourceNodeId()J (light greylist, reflection) -[stdout] 02-15 10:20:37.522 6840 6840 W utter.scenario: Accessing hidden field Landroid/view/accessibility/AccessibilityNodeInfo;->mChildNodeIds:Landroid/util/LongArray; (light greylist, reflection) -[stdout] 02-15 10:20:37.522 6840 6840 W utter.scenario: Accessing hidden method Landroid/util/LongArray;->get(I)J (light greylist, reflection) -[stdout] 02-15 10:20:37.524 2863 4286 D RcsProvisioning: No backup token found -[stdout] 02-15 10:20:37.524 2863 4286 E CarrierServices: [209] iez.getFile: File not found.: /data/user/0/com.google.android.apps.messaging/files/httpft_pending (No such file or directory) -[stdout] 02-15 10:20:37.524 2863 4286 E CarrierServices: java.io.FileInputStream.open0(Native Method) -[stdout] 02-15 10:20:37.524 2863 4286 E CarrierServices: java.io.FileInputStream.open(FileInputStream.java:231) -[stdout] 02-15 10:20:37.524 2863 4286 E CarrierServices: java.io.FileInputStream.(FileInputStream.java:165) -[stdout] 02-15 10:20:37.524 2863 4286 E CarrierServices: android.app.ContextImpl.openFileInput(ContextImpl.java:560) -[stdout] 02-15 10:20:37.524 2863 4286 E CarrierServices: android.content.ContextWrapper.openFileInput(ContextWrapper.java:202) -[stdout] 02-15 10:20:37.524 2863 4286 E CarrierServices: iez.getFile(SourceFile:20) -[stdout] 02-15 10:20:37.524 2863 4286 E CarrierServices: com.google.android.apps.messaging.rcsmigration.RcsStateProvider.buildRcsState(SourceFile:136) -[stdout] 02-15 10:20:37.524 2863 4286 E CarrierServices: com.google.android.apps.messaging.rcsmigration.RcsStateProvider.getRcsState(SourceFile:6) -[stdout] 02-15 10:20:37.524 2863 4286 E CarrierServices: com.google.android.ims.rcsmigration.IRcsStateProvider$Stub.dispatchTransaction(SourceFile:10) -[stdout] 02-15 10:20:37.524 2863 4286 E CarrierServices: com.google.android.aidl.BaseStub.onTransact(SourceFile:18) -[stdout] 02-15 10:20:37.524 2863 4286 E CarrierServices: android.os.Binder.execTransact(Binder.java:731) -[stdout] 02-15 10:20:37.525 3621 6584 I CarrierServices: [234] awt.doInBackground: Saving RCS State -[stdout] 02-15 10:20:37.525 3621 6584 I CarrierServices: [234] awt.doInBackground: Old operation mode: 2 -[stdout] 02-15 10:20:37.525 3621 6584 I CarrierServices: [234] awt.doInBackground: New operation mode: 2 -[stdout] 02-15 10:20:37.526 2863 4286 I CarrierServices: [209] RcsStateProvider.onMigrationComplete: Migration complete. -[stdout] 02-15 10:20:37.526 2863 4286 I CarrierServices: [209] inq.shouldUseCarrierServicesApkForV1Apis: Checking if using CarrierServices.apk is possible. Enabled: true, isAtLeastM: true, runningInsideBugle: true -[stdout] 02-15 10:20:37.527 2863 4286 I CarrierServices: [209] inq.e: Network Operator: 310260 -[stdout] 02-15 10:20:37.527 2863 4286 I CarrierServices: [209] inq.e: carrierWithOldEcApis: false -[stdout] 02-15 10:20:37.527 2863 4286 I CarrierServices: [209] inq.e: hasDialerThatSupportsNewEc: false -[stdout] 02-15 10:20:37.527 2863 4286 I CarrierServices: [209] RcsStateProvider.onMigrationComplete: Rcs Engine should be running in cs.apk. Stopping JibeService. -[stdout] 02-15 10:20:37.528 2863 4286 I CarrierServices: [209] RcsStateProvider.onMigrationComplete: JibeService stopped: true -[stdout] 02-15 10:20:37.529 2863 4286 I CarrierServices: [209] inq.e: Network Operator: 310260 -[stdout] 02-15 10:20:37.529 2863 4286 I CarrierServices: [209] inq.e: carrierWithOldEcApis: false -[stdout] 02-15 10:20:37.529 2863 4286 I CarrierServices: [209] inq.e: hasDialerThatSupportsNewEc: false -[stdout] 02-15 10:20:37.529 2863 4286 I CarrierServices: [209] jsn.connect: shouldUseCarrierServicesJibeService: true, CarrierServices rcs service found: true -[stdout] 02-15 10:20:37.529 2863 4286 I CarrierServices: [209] jsn.connect: Binding to JibeService in CarrierServices. -[stdout] 02-15 10:20:37.530 2863 2863 D RcsClientLib: Service com.google.android.rcs.client.chatsession.ChatSessionService connected. Will notify listeners: true -[stdout] 02-15 10:20:37.530 2863 2863 V BugleRcs: com.google.android.rcs.client.chatsession.ChatSessionService RCS service connected -[stdout] 02-15 10:20:37.530 2863 4286 I CarrierServices: [209] inq.e: Network Operator: 310260 -[stdout] 02-15 10:20:37.531 2863 4286 I CarrierServices: [209] inq.e: carrierWithOldEcApis: false -[stdout] 02-15 10:20:37.531 2863 4286 I CarrierServices: [209] inq.e: hasDialerThatSupportsNewEc: false -[stdout] 02-15 10:20:37.531 2863 4286 I CarrierServices: [209] jsn.connect: shouldUseCarrierServicesJibeService: true, CarrierServices rcs service found: true -[stdout] 02-15 10:20:37.531 2863 4286 I CarrierServices: [209] jsn.connect: Binding to JibeService in CarrierServices. -[stdout] 02-15 10:20:37.531 2863 2863 D RcsClientLib: Service com.google.android.rcs.client.events.EventService connected. Will notify listeners: true -[stdout] 02-15 10:20:37.531 2863 2863 V BugleRcs: com.google.android.rcs.client.events.EventService RCS service connected -[stdout] 02-15 10:20:37.532 2863 4286 I CarrierServices: [209] inq.e: Network Operator: 310260 -[stdout] 02-15 10:20:37.532 2863 4286 I CarrierServices: [209] inq.e: carrierWithOldEcApis: false -[stdout] 02-15 10:20:37.532 2863 4286 I CarrierServices: [209] inq.e: hasDialerThatSupportsNewEc: false -[stdout] 02-15 10:20:37.533 2863 4286 I CarrierServices: [209] jsn.connect: shouldUseCarrierServicesJibeService: true, CarrierServices rcs service found: true -[stdout] 02-15 10:20:37.533 2863 4286 I CarrierServices: [209] jsn.connect: Binding to JibeService in CarrierServices. -[stdout] 02-15 10:20:37.533 2863 2863 D RcsClientLib: Service com.google.android.rcs.client.contacts.ContactsService connected. Will notify listeners: true -[stdout] 02-15 10:20:37.533 2863 2863 V BugleRcs: com.google.android.rcs.client.contacts.ContactsService RCS service connected -[stdout] 02-15 10:20:37.534 2863 4286 I CarrierServices: [209] inq.e: Network Operator: 310260 -[stdout] 02-15 10:20:37.534 2863 4286 I CarrierServices: [209] inq.e: carrierWithOldEcApis: false -[stdout] 02-15 10:20:37.534 2863 4286 I CarrierServices: [209] inq.e: hasDialerThatSupportsNewEc: false -[stdout] 02-15 10:20:37.534 2863 4286 I CarrierServices: [209] jsn.connect: shouldUseCarrierServicesJibeService: true, CarrierServices rcs service found: true -[stdout] 02-15 10:20:37.534 2863 4286 I CarrierServices: [209] jsn.connect: Binding to JibeService in CarrierServices. -[stdout] 02-15 10:20:37.535 2863 2863 D RcsClientLib: Service com.google.android.rcs.client.filetransfer.FileTransferService connected. Will notify listeners: true -[stdout] 02-15 10:20:37.535 2863 2863 V BugleRcs: com.google.android.rcs.client.filetransfer.FileTransferService RCS service connected -[stdout] 02-15 10:20:37.535 2863 4286 I CarrierServices: [209] inq.e: Network Operator: 310260 -[stdout] 02-15 10:20:37.536 2863 4286 I CarrierServices: [209] inq.e: carrierWithOldEcApis: false -[stdout] 02-15 10:20:37.536 2863 4286 I CarrierServices: [209] inq.e: hasDialerThatSupportsNewEc: false -[stdout] 02-15 10:20:37.536 2863 4286 I CarrierServices: [209] jsn.connect: shouldUseCarrierServicesJibeService: true, CarrierServices rcs service found: true -[stdout] 02-15 10:20:37.536 2863 4286 I CarrierServices: [209] jsn.connect: Binding to JibeService in CarrierServices. -[stdout] 02-15 10:20:37.536 2863 2863 D RcsClientLib: Service com.google.android.rcs.client.locationsharing.LocationSharingService connected. Will notify listeners: true -[stdout] 02-15 10:20:37.536 2863 2863 V BugleRcs: com.google.android.rcs.client.locationsharing.LocationSharingService RCS service connected -[stdout] 02-15 10:20:37.536 2863 4286 I CarrierServices: [209] inq.e: Network Operator: 310260 -[stdout] 02-15 10:20:37.536 2863 4286 I CarrierServices: [209] inq.e: carrierWithOldEcApis: false -[stdout] 02-15 10:20:37.536 2863 4286 I CarrierServices: [209] inq.e: hasDialerThatSupportsNewEc: false -[stdout] 02-15 10:20:37.537 2863 4286 I CarrierServices: [209] jsn.connect: shouldUseCarrierServicesJibeService: true, CarrierServices rcs service found: true -[stdout] 02-15 10:20:37.537 2863 4286 I CarrierServices: [209] jsn.connect: Binding to JibeService in CarrierServices. -[stdout] 02-15 10:20:37.537 2863 2863 D RcsClientLib: Service com.google.android.rcs.client.ims.ImsConnectionTrackerService connected. Will notify listeners: true -[stdout] 02-15 10:20:37.537 2863 2863 V BugleRcs: com.google.android.rcs.client.ims.ImsConnectionTrackerService RCS service connected -[stdout] 02-15 10:20:37.537 2863 2863 V BugleRcs: kicking off RCS sending/receiving -[stdout] 02-15 10:20:37.537 2863 2863 V BugleAction: no RCS because we're not registered -[stdout] 02-15 10:20:37.538 2863 4286 I CarrierServices: [209] inq.e: Network Operator: 310260 -[stdout] 02-15 10:20:37.538 2863 4286 I CarrierServices: [209] inq.e: carrierWithOldEcApis: false -[stdout] 02-15 10:20:37.538 2863 4286 I CarrierServices: [209] inq.e: hasDialerThatSupportsNewEc: false -[stdout] 02-15 10:20:37.538 2863 4286 I CarrierServices: [209] jsn.connect: shouldUseCarrierServicesJibeService: true, CarrierServices rcs service found: true -[stdout] 02-15 10:20:37.538 2863 4286 I CarrierServices: [209] jsn.connect: Binding to JibeService in CarrierServices. -[stdout] 02-15 10:20:37.538 2863 2863 D RcsClientLib: Service com.google.android.rcs.client.profile.RcsProfileService connected. Will notify listeners: true -[stdout] 02-15 10:20:37.538 2863 2863 V BugleRcs: com.google.android.rcs.client.profile.RcsProfileService RCS service connected -[stdout] 02-15 10:20:37.538 2863 2863 V BugleRcs: kicking off RCS sending/receiving -[stdout] 02-15 10:20:37.538 2863 2863 V BugleAction: no RCS because we're not registered -[stdout] 02-15 10:20:37.538 3621 3657 W CarrierServices: [190] bmc.a: No config URL. RCS will be disabled! -[stdout] 02-15 10:20:37.538 2863 2863 I BugleRcs: RcsAvailability ACS url: null -[stdout] 02-15 10:20:37.539 2863 4286 I CarrierServices: [209] inq.e: Network Operator: 310260 -[stdout] 02-15 10:20:37.539 2863 4286 I CarrierServices: [209] inq.e: carrierWithOldEcApis: false -[stdout] 02-15 10:20:37.539 2863 4286 I CarrierServices: [209] inq.e: hasDialerThatSupportsNewEc: false -[stdout] 02-15 10:20:37.539 2863 4286 I CarrierServices: [209] jsn.connect: shouldUseCarrierServicesJibeService: true, CarrierServices rcs service found: true -[stdout] 02-15 10:20:37.539 2863 4286 I CarrierServices: [209] jsn.connect: Binding to JibeService in CarrierServices. -[stdout] 02-15 10:20:37.539 2863 2863 D RcsClientLib: Service com.google.android.rcs.client.businessinfo.BusinessInfoService connected. Will notify listeners: true -[stdout] 02-15 10:20:37.539 2863 2863 V BugleRcs: com.google.android.rcs.client.businessinfo.BusinessInfoService RCS service connected -[stdout] 02-15 10:20:37.539 2863 2863 V BugleRcs: kicking off RCS sending/receiving -[stdout] 02-15 10:20:37.540 2863 2863 V BugleAction: no RCS because we're not registered -[stdout] 02-15 10:20:37.540 3621 3657 W CarrierServices: [190] bmc.a: No config URL. RCS will be disabled! -[stdout] 02-15 10:20:37.540 2863 2863 I BugleRcs: RcsAvailability ACS url: null -[stdout] 02-15 10:20:37.540 6840 6862 W FlutterJNI: FlutterJNI.loadLibrary called more than once -[stdout] 02-15 10:20:37.540 6840 6865 W FlutterJNI: FlutterJNI.prefetchDefaultFontManager called more than once -[stdout] 02-15 10:20:37.540 6840 6883 I ResourceExtractor: Found extracted resources res_timestamp-1-1708021236564 -[stdout] 02-15 10:20:37.541 6840 6840 W FlutterJNI: FlutterJNI.init called more than once -[stdout] 02-15 10:20:37.541 2863 4286 W RcsProvisioning: Failed to read configuration: /data/user/0/com.google.android.apps.messaging/files/rcsconfig (No such file or directory) -[stdout] 02-15 10:20:37.541 2863 4286 W RcsProvisioning: java.io.FileNotFoundException: /data/user/0/com.google.android.apps.messaging/files/rcsconfig (No such file or directory) -[stdout] 02-15 10:20:37.541 2863 4286 W RcsProvisioning: at java.io.FileInputStream.open0(Native Method) -[stdout] 02-15 10:20:37.541 2863 4286 W RcsProvisioning: at java.io.FileInputStream.open(FileInputStream.java:231) -[stdout] 02-15 10:20:37.541 2863 4286 W RcsProvisioning: at java.io.FileInputStream.(FileInputStream.java:165) -[stdout] 02-15 10:20:37.541 2863 4286 W RcsProvisioning: at android.app.ContextImpl.openFileInput(ContextImpl.java:560) -[stdout] 02-15 10:20:37.541 2863 4286 W RcsProvisioning: at android.content.ContextWrapper.openFileInput(ContextWrapper.java:202) -[stdout] 02-15 10:20:37.541 2863 4286 W RcsProvisioning: at ion.a(SourceFile:2) -[stdout] 02-15 10:20:37.541 2863 4286 W RcsProvisioning: at idl.a(SourceFile:4) -[stdout] 02-15 10:20:37.541 2863 4286 W RcsProvisioning: at idm.a(SourceFile:7) -[stdout] 02-15 10:20:37.541 2863 4286 W RcsProvisioning: at com.google.android.apps.messaging.rcsmigration.RcsStateProvider.onMigrationComplete(SourceFile:27) -[stdout] 02-15 10:20:37.541 2863 4286 W RcsProvisioning: at com.google.android.ims.rcsmigration.IRcsStateProvider$Stub.dispatchTransaction(SourceFile:14) -[stdout] 02-15 10:20:37.541 2863 4286 W RcsProvisioning: at com.google.android.aidl.BaseStub.onTransact(SourceFile:18) -[stdout] 02-15 10:20:37.541 2863 4286 W RcsProvisioning: at android.os.Binder.execTransact(Binder.java:731) -[stdout] 02-15 10:20:37.541 2863 4286 D RcsProvisioning: Retrieving backup token -[stdout] 02-15 10:20:37.541 2863 4286 D RcsProvisioning: Exception while getting subscriber Id. Using default -[stdout] 02-15 10:20:37.541 6840 6840 W utter.scenario: Accessing hidden method Landroid/media/ImageWriter;->newInstance(Landroid/view/Surface;II)Landroid/media/ImageWriter; (dark greylist, linking) -[stdout] 02-15 10:20:37.543 6840 6840 D LifecycleMonitor: Lifecycle status change: dev.flutter.scenarios.ExternalTextureFlutterActivity@8bbd5c5 in: CREATED -[stdout] 02-15 10:20:37.543 6840 6840 D LifecycleMonitor: Lifecycle status change: dev.flutter.scenarios.ExternalTextureFlutterActivity@8bbd5c5 in: STARTED -[stdout] 02-15 10:20:37.544 6840 6840 D LifecycleMonitor: Lifecycle status change: dev.flutter.scenarios.ExternalTextureFlutterActivity@8bbd5c5 in: RESUMED -[stdout] 02-15 10:20:37.546 1572 1709 E SurfaceFlinger: ro.sf.lcd_density must be defined as a build property -[stdout] 02-15 10:20:37.568 6840 6840 I utter.scenario: Rejecting re-init on previously-failed class java.lang.Class: java.lang.NoClassDefFoundError: Failed resolution of: Landroidx/window/sidecar/SidecarInterface$SidecarCallback; -[stdout] 02-15 10:20:37.568 6840 6840 I utter.scenario: at androidx.window.layout.ExtensionInterfaceCompat androidx.window.layout.SidecarWindowBackend$Companion.initAndVerifyExtension(android.content.Context) (SidecarWindowBackend.kt:200) -[stdout] 02-15 10:20:37.568 6840 6840 I utter.scenario: at androidx.window.layout.SidecarWindowBackend androidx.window.layout.SidecarWindowBackend$Companion.getInstance(android.content.Context) (SidecarWindowBackend.kt:184) -[stdout] 02-15 10:20:37.568 6840 6840 I utter.scenario: at androidx.window.layout.WindowBackend androidx.window.layout.WindowInfoTracker$Companion.windowBackend$window_release(android.content.Context) (WindowInfoTracker.kt:86) -[stdout] 02-15 10:20:37.568 6840 6840 I utter.scenario: at androidx.window.layout.WindowInfoTracker androidx.window.layout.WindowInfoTracker$Companion.getOrCreate(android.content.Context) (WindowInfoTracker.kt:70) -[stdout] 02-15 10:20:37.568 6840 6840 I utter.scenario: at io.flutter.embedding.android.WindowInfoRepositoryCallbackAdapterWrapper io.flutter.embedding.android.FlutterView.createWindowInfoRepo() (FlutterView.java:491) -[stdout] 02-15 10:20:37.568 6840 6840 I utter.scenario: at void io.flutter.embedding.android.FlutterView.onAttachedToWindow() (FlutterView.java:511) -[stdout] 02-15 10:20:37.568 6840 6840 I utter.scenario: at void android.view.View.dispatchAttachedToWindow(android.view.View$AttachInfo, int) (View.java:18347) -[stdout] 02-15 10:20:37.568 6840 6840 I utter.scenario: at void android.view.ViewGroup.dispatchAttachedToWindow(android.view.View$AttachInfo, int) (ViewGroup.java:3397) -[stdout] 02-15 10:20:37.568 6840 6840 I utter.scenario: at void android.view.ViewGroup.dispatchAttachedToWindow(android.view.View$AttachInfo, int) (ViewGroup.java:3404) -[stdout] 02-15 10:20:37.568 6840 6840 I chatty : uid=10098(dev.flutter.scenarios) identical 1 line -[stdout] 02-15 10:20:37.568 6840 6840 I utter.scenario: at void android.view.ViewGroup.dispatchAttachedToWindow(android.view.View$AttachInfo, int) (ViewGroup.java:3404) -[stdout] 02-15 10:20:37.568 6840 6840 I utter.scenario: at void android.view.ViewRootImpl.performTraversals() (ViewRootImpl.java:1761) -[stdout] 02-15 10:20:37.568 6840 6840 I utter.scenario: at void android.view.ViewRootImpl.doTraversal() (ViewRootImpl.java:1460) -[stdout] 02-15 10:20:37.568 6840 6840 I utter.scenario: at void android.view.ViewRootImpl$TraversalRunnable.run() (ViewRootImpl.java:7183) -[stdout] 02-15 10:20:37.568 6840 6840 I utter.scenario: at void android.view.Choreographer$CallbackRecord.run(long) (Choreographer.java:949) -[stdout] 02-15 10:20:37.568 6840 6840 I utter.scenario: at void android.view.Choreographer.doCallbacks(int, long) (Choreographer.java:761) -[stdout] 02-15 10:20:37.568 6840 6840 I utter.scenario: at void android.view.Choreographer.doFrame(long, int) (Choreographer.java:696) -[stdout] 02-15 10:20:37.568 6840 6840 I utter.scenario: at void android.view.Choreographer$FrameDisplayEventReceiver.run() (Choreographer.java:935) -[stdout] 02-15 10:20:37.568 6840 6840 I utter.scenario: at void android.os.Handler.handleCallback(android.os.Message) (Handler.java:873) -[stdout] 02-15 10:20:37.568 6840 6840 I utter.scenario: at void android.os.Handler.dispatchMessage(android.os.Message) (Handler.java:99) -[stdout] 02-15 10:20:37.568 6840 6840 I utter.scenario: at void android.os.Looper.loop() (Looper.java:193) -[stdout] 02-15 10:20:37.568 6840 6840 I utter.scenario: at void android.app.ActivityThread.main(java.lang.String[]) (ActivityThread.java:6669) -[stdout] 02-15 10:20:37.568 6840 6840 I utter.scenario: at java.lang.Object java.lang.reflect.Method.invoke(java.lang.Object, java.lang.Object[]) (Method.java:-2) -[stdout] 02-15 10:20:37.568 6840 6840 I utter.scenario: at void com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run() (RuntimeInit.java:493) -[stdout] 02-15 10:20:37.568 6840 6840 I utter.scenario: at void com.android.internal.os.ZygoteInit.main(java.lang.String[]) (ZygoteInit.java:858) -[stdout] 02-15 10:20:37.568 6840 6840 I utter.scenario: Caused by: java.lang.ClassNotFoundException: Didn't find class "androidx.window.sidecar.SidecarInterface$SidecarCallback" on path: DexPathList[[zip file "/system/framework/android.test.runner.jar", zip file "/system/framework/android.test.mock.jar", zip file "/data/app/dev.flutter.scenarios.test-KKXe9YDNYEL7yOuj25XZ6g==/base.apk", zip file "/data/app/dev.flutter.scenarios-rlxf5VuTV43PTiaP6mOD-g==/base.apk"],nativeLibraryDirectories=[/data/app/dev.flutter.scenarios.test-KKXe9YDNYEL7yOuj25XZ6g==/lib/arm64, /data/app/dev.flutter.scenarios-rlxf5VuTV43PTiaP6mOD-g==/lib/arm64, /data/app/dev.flutter.scenarios.test-KKXe9YDNYEL7yOuj25XZ6g==/base.apk!/lib/arm64-v8a, /data/app/dev.flutter.scenarios-rlxf5VuTV43PTiaP6mOD-g==/base.apk!/lib/arm64-v8a, /system/lib64]] -[stdout] 02-15 10:20:37.568 6840 6840 I utter.scenario: at java.lang.Class dalvik.system.BaseDexClassLoader.findClass(java.lang.String) (BaseDexClassLoader.java:134) -[stdout] 02-15 10:20:37.568 6840 6840 I utter.scenario: at java.lang.Class java.lang.ClassLoader.loadClass(java.lang.String, boolean) (ClassLoader.java:379) -[stdout] 02-15 10:20:37.568 6840 6840 I utter.scenario: at java.lang.Class java.lang.ClassLoader.loadClass(java.lang.String) (ClassLoader.java:312) -[stdout] 02-15 10:20:37.568 6840 6840 I utter.scenario: at androidx.window.layout.ExtensionInterfaceCompat androidx.window.layout.SidecarWindowBackend$Companion.initAndVerifyExtension(android.content.Context) (SidecarWindowBackend.kt:200) -[stdout] 02-15 10:20:37.568 6840 6840 I utter.scenario: at androidx.window.layout.SidecarWindowBackend androidx.window.layout.SidecarWindowBackend$Companion.getInstance(android.content.Context) (SidecarWindowBackend.kt:184) -[stdout] 02-15 10:20:37.568 6840 6840 I utter.scenario: at androidx.window.layout.WindowBackend androidx.window.layout.WindowInfoTracker$Companion.windowBackend$window_release(android.content.Context) (WindowInfoTracker.kt:86) -[stdout] 02-15 10:20:37.568 6840 6840 I utter.scenario: at androidx.window.layout.WindowInfoTracker androidx.window.layout.WindowInfoTracker$Companion.getOrCreate(android.content.Context) (WindowInfoTracker.kt:70) -[stdout] 02-15 10:20:37.568 6840 6840 I utter.scenario: at io.flutter.embedding.android.WindowInfoRepositoryCallbackAdapterWrapper io.flutter.embedding.android.FlutterView.createWindowInfoRepo() (FlutterView.java:491) -[stdout] 02-15 10:20:37.568 6840 6840 I utter.scenario: at void io.flutter.embedding.android.FlutterView.onAttachedToWindow() (FlutterView.java:511) -[stdout] 02-15 10:20:37.568 6840 6840 I utter.scenario: at void android.view.View.dispatchAttachedToWindow(android.view.View$AttachInfo, int) (View.java:18347) -[stdout] 02-15 10:20:37.568 6840 6840 I utter.scenario: at void android.view.ViewGroup.dispatchAttachedToWindow(android.view.View$AttachInfo, int) (ViewGroup.java:3397) -[stdout] 02-15 10:20:37.568 6840 6840 I utter.scenario: at void android.view.ViewGroup.dispatchAttachedToWindow(android.view.View$AttachInfo, int) (ViewGroup.java:3404) -[stdout] 02-15 10:20:37.568 6840 6840 I chatty : uid=10098(dev.flutter.scenarios) identical 1 line -[stdout] 02-15 10:20:37.568 6840 6840 I utter.scenario: at void android.view.ViewGroup.dispatchAttachedToWindow(android.view.View$AttachInfo, int) (ViewGroup.java:3404) -[stdout] 02-15 10:20:37.568 6840 6840 I utter.scenario: at void android.view.ViewRootImpl.performTraversals() (ViewRootImpl.java:1761) -[stdout] 02-15 10:20:37.568 6840 6840 I utter.scenario: at void android.view.ViewRootImpl.doTraversal() (ViewRootImpl.java:1460) -[stdout] 02-15 10:20:37.568 6840 6840 I utter.scenario: at void android.view.ViewRootImpl$TraversalRunnable.run() (ViewRootImpl.java:7183) -[stdout] 02-15 10:20:37.568 6840 6840 I utter.scenario: at void android.view.Choreographer$CallbackRecord.run(long) (Choreographer.java:949) -[stdout] 02-15 10:20:37.568 6840 6840 I utter.scenario: at void android.view.Choreographer.doCallbacks(int, long) (Choreographer.java:761) -[stdout] 02-15 10:20:37.568 6840 6840 I utter.scenario: at void android.view.Choreographer.doFrame(long, int) (Choreographer.java:696) -[stdout] 02-15 10:20:37.568 6840 6840 I utter.scenario: at void android.view.Choreographer$FrameDisplayEventReceiver.run() (Choreographer.java:935) -[stdout] 02-15 10:20:37.568 6840 6840 I utter.scenario: at void android.os.Handler.handleCallback(android.os.Message) (Handler.java:873) -[stdout] 02-15 10:20:37.568 6840 6840 I utter.scenario: at void android.os.Handler.dispatchMessage(android.os.Message) (Handler.java:99) -[stdout] 02-15 10:20:37.568 6840 6840 I utter.scenario: at void android.os.Looper.loop() (Looper.java:193) -[stdout] 02-15 10:20:37.568 6840 6840 I utter.scenario: at void android.app.ActivityThread.main(java.lang.String[]) (ActivityThread.java:6669) -[stdout] 02-15 10:20:37.568 6840 6840 I utter.scenario: at java.lang.Object java.lang.reflect.Method.invoke(java.lang.Object, java.lang.Object[]) (Method.java:-2) -[stdout] 02-15 10:20:37.568 6840 6840 I utter.scenario: at void com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run() (RuntimeInit.java:493) -[stdout] 02-15 10:20:37.568 6840 6840 I utter.scenario: at void com.android.internal.os.ZygoteInit.main(java.lang.String[]) (ZygoteInit.java:858) -[stdout] 02-15 10:20:37.568 6840 6840 I utter.scenario: -[stdout] 02-15 10:20:37.568 6840 6840 I utter.scenario: Rejecting re-init on previously-failed class java.lang.Class: java.lang.NoClassDefFoundError: Failed resolution of: Landroidx/window/sidecar/SidecarInterface$SidecarCallback; -[stdout] 02-15 10:20:37.568 6840 6840 I utter.scenario: at androidx.window.layout.ExtensionInterfaceCompat androidx.window.layout.SidecarWindowBackend$Companion.initAndVerifyExtension(android.content.Context) (SidecarWindowBackend.kt:200) -[stdout] 02-15 10:20:37.568 6840 6840 I utter.scenario: at androidx.window.layout.SidecarWindowBackend androidx.window.layout.SidecarWindowBackend$Companion.getInstance(android.content.Context) (SidecarWindowBackend.kt:184) -[stdout] 02-15 10:20:37.568 6840 6840 I utter.scenario: at androidx.window.layout.WindowBackend androidx.window.layout.WindowInfoTracker$Companion.windowBackend$window_release(android.content.Context) (WindowInfoTracker.kt:86) -[stdout] 02-15 10:20:37.568 6840 6840 I utter.scenario: at androidx.window.layout.WindowInfoTracker androidx.window.layout.WindowInfoTracker$Companion.getOrCreate(android.content.Context) (WindowInfoTracker.kt:70) -[stdout] 02-15 10:20:37.568 6840 6840 I utter.scenario: at io.flutter.embedding.android.WindowInfoRepositoryCallbackAdapterWrapper io.flutter.embedding.android.FlutterView.createWindowInfoRepo() (FlutterView.java:491) -[stdout] 02-15 10:20:37.568 6840 6840 I utter.scenario: at void io.flutter.embedding.android.FlutterView.onAttachedToWindow() (FlutterView.java:511) -[stdout] 02-15 10:20:37.568 6840 6840 I utter.scenario: at void android.view.View.dispatchAttachedToWindow(android.view.View$AttachInfo, int) (View.java:18347) -[stdout] 02-15 10:20:37.568 6840 6840 I utter.scenario: at void android.view.ViewGroup.dispatchAttachedToWindow(android.view.View$AttachInfo, int) (ViewGroup.java:3397) -[stdout] 02-15 10:20:37.568 6840 6840 I utter.scenario: at void android.view.ViewGroup.dispatchAttachedToWindow(android.view.View$AttachInfo, int) (ViewGroup.java:3404) -[stdout] 02-15 10:20:37.568 6840 6840 I chatty : uid=10098(dev.flutter.scenarios) identical 1 line -[stdout] 02-15 10:20:37.568 6840 6840 I utter.scenario: at void android.view.ViewGroup.dispatchAttachedToWindow(android.view.View$AttachInfo, int) (ViewGroup.java:3404) -[stdout] 02-15 10:20:37.568 6840 6840 I utter.scenario: at void android.view.ViewRootImpl.performTraversals() (ViewRootImpl.java:1761) -[stdout] 02-15 10:20:37.568 6840 6840 I utter.scenario: at void android.view.ViewRootImpl.doTraversal() (ViewRootImpl.java:1460) -[stdout] 02-15 10:20:37.568 6840 6840 I utter.scenario: at void android.view.ViewRootImpl$TraversalRunnable.run() (ViewRootImpl.java:7183) -[stdout] 02-15 10:20:37.568 6840 6840 I utter.scenario: at void android.view.Choreographer$CallbackRecord.run(long) (Choreographer.java:949) -[stdout] 02-15 10:20:37.568 6840 6840 I utter.scenario: at void android.view.Choreographer.doCallbacks(int, long) (Choreographer.java:761) -[stdout] 02-15 10:20:37.568 6840 6840 I utter.scenario: at void android.view.Choreographer.doFrame(long, int) (Choreographer.java:696) -[stdout] 02-15 10:20:37.568 6840 6840 I utter.scenario: at void android.view.Choreographer$FrameDisplayEventReceiver.run() (Choreographer.java:935) -[stdout] 02-15 10:20:37.568 6840 6840 I utter.scenario: at void android.os.Handler.handleCallback(android.os.Message) (Handler.java:873) -[stdout] 02-15 10:20:37.568 6840 6840 I utter.scenario: at void android.os.Handler.dispatchMessage(android.os.Message) (Handler.java:99) -[stdout] 02-15 10:20:37.568 6840 6840 I utter.scenario: at void android.os.Looper.loop() (Looper.java:193) -[stdout] 02-15 10:20:37.568 6840 6840 I utter.scenario: at void android.app.ActivityThread.main(java.lang.String[]) (ActivityThread.java:6669) -[stdout] 02-15 10:20:37.568 6840 6840 I utter.scenario: at java.lang.Object java.lang.reflect.Method.invoke(java.lang.Object, java.lang.Object[]) (Method.java:-2) -[stdout] 02-15 10:20:37.568 6840 6840 I utter.scenario: at void com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run() (RuntimeInit.java:493) -[stdout] 02-15 10:20:37.568 6840 6840 I utter.scenario: at void com.android.internal.os.ZygoteInit.main(java.lang.String[]) (ZygoteInit.java:858) -[stdout] 02-15 10:20:37.568 6840 6840 I utter.scenario: Caused by: java.lang.ClassNotFoundException: Didn't find class "androidx.window.sidecar.SidecarInterface$SidecarCallback" on path: DexPathList[[zip file "/system/framework/android.test.runner.jar", zip file "/system/framework/android.test.mock.jar", zip file "/data/app/dev.flutter.scenarios.test-KKXe9YDNYEL7yOuj25XZ6g==/base.apk", zip file "/data/app/dev.flutter.scenarios-rlxf5VuTV43PTiaP6mOD-g==/base.apk"],nativeLibraryDirectories=[/data/app/dev.flutter.scenarios.test-KKXe9YDNYEL7yOuj25XZ6g==/lib/arm64, /data/app/dev.flutter.scenarios-rlxf5VuTV43PTiaP6mOD-g==/lib/arm64, /data/app/dev.flutter.scenarios.test-KKXe9YDNYEL7yOuj25XZ6g==/base.apk!/lib/arm64-v8a, /data/app/dev.flutter.scenarios-rlxf5VuTV43PTiaP6mOD-g==/base.apk!/lib/arm64-v8a, /system/lib64]] -[stdout] 02-15 10:20:37.568 6840 6840 I utter.scenario: at java.lang.Class dalvik.system.BaseDexClassLoader.findClass(java.lang.String) (BaseDexClassLoader.java:134) -[stdout] 02-15 10:20:37.568 6840 6840 I utter.scenario: at java.lang.Class java.lang.ClassLoader.loadClass(java.lang.String, boolean) (ClassLoader.java:379) -[stdout] 02-15 10:20:37.568 6840 6840 I utter.scenario: at java.lang.Class java.lang.ClassLoader.loadClass(java.lang.String) (ClassLoader.java:312) -[stdout] 02-15 10:20:37.568 6840 6840 I utter.scenario: at androidx.window.layout.ExtensionInterfaceCompat androidx.window.layout.SidecarWindowBackend$Companion.initAndVerifyExtension(android.content.Context) (SidecarWindowBackend.kt:200) -[stdout] 02-15 10:20:37.568 6840 6840 I utter.scenario: at androidx.window.layout.SidecarWindowBackend androidx.window.layout.SidecarWindowBackend$Companion.getInstance(android.content.Context) (SidecarWindowBackend.kt:184) -[stdout] 02-15 10:20:37.568 6840 6840 I utter.scenario: at androidx.window.layout.WindowBackend androidx.window.layout.WindowInfoTracker$Companion.windowBackend$window_release(android.content.Context) (WindowInfoTracker.kt:86) -[stdout] 02-15 10:20:37.568 6840 6840 I utter.scenario: at androidx.window.layout.WindowInfoTracker androidx.window.layout.WindowInfoTracker$Companion.getOrCreate(android.content.Context) (WindowInfoTracker.kt:70) -[stdout] 02-15 10:20:37.568 6840 6840 I utter.scenario: at io.flutter.embedding.android.WindowInfoRepositoryCallbackAdapterWrapper io.flutter.embedding.android.FlutterView.createWindowInfoRepo() (FlutterView.java:491) -[stdout] 02-15 10:20:37.568 6840 6840 I utter.scenario: at void io.flutter.embedding.android.FlutterView.onAttachedToWindow() (FlutterView.java:511) -[stdout] 02-15 10:20:37.568 6840 6840 I utter.scenario: at void android.view.View.dispatchAttachedToWindow(android.view.View$AttachInfo, int) (View.java:18347) -[stdout] 02-15 10:20:37.568 6840 6840 I utter.scenario: at void android.view.ViewGroup.dispatchAttachedToWindow(android.view.View$AttachInfo, int) (ViewGroup.java:3397) -[stdout] 02-15 10:20:37.568 6840 6840 I utter.scenario: at void android.view.ViewGroup.dispatchAttachedToWindow(android.view.View$AttachInfo, int) (ViewGroup.java:3404) -[stdout] 02-15 10:20:37.568 6840 6840 I chatty : uid=10098(dev.flutter.scenarios) identical 1 line -[stdout] 02-15 10:20:37.568 6840 6840 I utter.scenario: at void android.view.ViewGroup.dispatchAttachedToWindow(android.view.View$AttachInfo, int) (ViewGroup.java:3404) -[stdout] 02-15 10:20:37.568 6840 6840 I utter.scenario: at void android.view.ViewRootImpl.performTraversals() (ViewRootImpl.java:1761) -[stdout] 02-15 10:20:37.568 6840 6840 I utter.scenario: at void android.view.ViewRootImpl.doTraversal() (ViewRootImpl.java:1460) -[stdout] 02-15 10:20:37.568 6840 6840 I utter.scenario: at void android.view.ViewRootImpl$TraversalRunnable.run() (ViewRootImpl.java:7183) -[stdout] 02-15 10:20:37.568 6840 6840 I utter.scenario: at void android.view.Choreographer$CallbackRecord.run(long) (Choreographer.java:949) -[stdout] 02-15 10:20:37.568 6840 6840 I utter.scenario: at void android.view.Choreographer.doCallbacks(int, long) (Choreographer.java:761) -[stdout] 02-15 10:20:37.568 6840 6840 I utter.scenario: at void android.view.Choreographer.doFrame(long, int) (Choreographer.java:696) -[stdout] 02-15 10:20:37.568 6840 6840 I utter.scenario: at void android.view.Choreographer$FrameDisplayEventReceiver.run() (Choreographer.java:935) -[stdout] 02-15 10:20:37.568 6840 6840 I utter.scenario: at void android.os.Handler.handleCallback(android.os.Message) (Handler.java:873) -[stdout] 02-15 10:20:37.568 6840 6840 I utter.scenario: at void android.os.Handler.dispatchMessage(android.os.Message) (Handler.java:99) -[stdout] 02-15 10:20:37.568 6840 6840 I utter.scenario: at void android.os.Looper.loop() (Looper.java:193) -[stdout] 02-15 10:20:37.568 6840 6840 I utter.scenario: at void android.app.ActivityThread.main(java.lang.String[]) (ActivityThread.java:6669) -[stdout] 02-15 10:20:37.568 6840 6840 I utter.scenario: at java.lang.Object java.lang.reflect.Method.invoke(java.lang.Object, java.lang.Object[]) (Method.java:-2) -[stdout] 02-15 10:20:37.568 6840 6840 I utter.scenario: at void com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run() (RuntimeInit.java:493) -[stdout] 02-15 10:20:37.568 6840 6840 I utter.scenario: at void com.android.internal.os.ZygoteInit.main(java.lang.String[]) (ZygoteInit.java:858) -[stdout] 02-15 10:20:37.568 6840 6840 I utter.scenario: -[stdout] 02-15 10:20:37.583 6840 6886 I OpenGLRenderer: Initialized EGL, version 1.4 -[stdout] 02-15 10:20:37.583 6840 6886 D OpenGLRenderer: Swap behavior 1 -[stdout] 02-15 10:20:37.583 6840 6886 D HostConnection: HostConnection::get() New Host Connection established 0x758c8455c0, tid 6886 -[stdout] 02-15 10:20:37.584 6840 6886 D HostConnection: HostComposition ext ANDROID_EMU_CHECKSUM_HELPER_v1 ANDROID_EMU_sync_buffer_data GL_OES_EGL_image_external_essl3 GL_OES_vertex_array_object GL_KHR_texture_compression_astc_ldr ANDROID_EMU_host_side_tracing ANDROID_EMU_gles_max_version_3_0 -[stdout] 02-15 10:20:37.584 6840 6886 W OpenGLRenderer: Failed to choose config with EGL_SWAP_BEHAVIOR_PRESERVED, retrying without... -[stdout] 02-15 10:20:37.584 6840 6886 D OpenGLRenderer: Swap behavior 0 -[stdout] 02-15 10:20:37.584 6840 6886 D eglCodecCommon: setVertexArrayObject: set vao to 0 (0) 0 0 -[stdout] 02-15 10:20:37.584 6840 6886 D EGL_emulation: eglCreateContext: 0x758c8458e0: maj 3 min 0 rcv 3 -[stdout] 02-15 10:20:37.585 6840 6886 D EGL_emulation: eglMakeCurrent: 0x758c8458e0: ver 3 0 (tinfo 0x7576d7d2e0) -[stdout] 02-15 10:20:37.585 1572 1709 W ServiceManager: Permission failure: android.permission.ACCESS_SURFACE_FLINGER from uid=10098 pid=6840 -[stdout] 02-15 10:20:37.585 1572 1709 D PermissionCache: checking android.permission.ACCESS_SURFACE_FLINGER for uid=10098 => denied (83 us) -[stdout] 02-15 10:20:37.586 1572 1805 E SurfaceFlinger: ro.sf.lcd_density must be defined as a build property -[stdout] 02-15 10:20:37.590 1384 2162 D gralloc_ranchu: gralloc_alloc: Creating ashmem region of size 10371072 -[stdout] 02-15 10:20:37.591 6840 6886 D HostConnection: createUnique: call -[stdout] 02-15 10:20:37.591 6840 6886 D HostConnection: HostConnection::get() New Host Connection established 0x758c845b60, tid 6886 -[stdout] 02-15 10:20:37.592 6840 6886 D HostConnection: HostComposition ext ANDROID_EMU_CHECKSUM_HELPER_v1 ANDROID_EMU_sync_buffer_data GL_OES_EGL_image_external_essl3 GL_OES_vertex_array_object GL_KHR_texture_compression_astc_ldr ANDROID_EMU_host_side_tracing ANDROID_EMU_gles_max_version_3_0 -[stdout] 02-15 10:20:37.596 1384 2162 D gralloc_ranchu: gralloc_alloc: Creating ashmem region of size 9826304 -[stdout] 02-15 10:20:37.596 6840 6881 D HostConnection: HostConnection::get() New Host Connection established 0x758ae650a0, tid 6881 -[stdout] 02-15 10:20:37.597 6840 6881 D HostConnection: HostComposition ext ANDROID_EMU_CHECKSUM_HELPER_v1 ANDROID_EMU_sync_buffer_data GL_OES_EGL_image_external_essl3 GL_OES_vertex_array_object GL_KHR_texture_compression_astc_ldr ANDROID_EMU_host_side_tracing ANDROID_EMU_gles_max_version_3_0 -[stdout] 02-15 10:20:37.597 6840 6881 D EGL_emulation: eglMakeCurrent: 0x758aed82a0: ver 3 0 (tinfo 0x75932f3220) -[stdout] 02-15 10:20:37.599 6840 6881 D eglCodecCommon: setVertexArrayObject: set vao to 0 (0) 0 0 -[stdout] 02-15 10:20:37.599 6840 6881 D EGL_emulation: eglCreateContext: 0x758ae66220: maj 3 min 0 rcv 3 -[stdout] 02-15 10:20:37.599 6840 6881 D EGL_emulation: eglMakeCurrent: 0x758ae66220: ver 3 0 (tinfo 0x75932f3220) -[stdout] 02-15 10:20:37.599 6840 6881 D EGL_emulation: eglMakeCurrent: 0x758aed82a0: ver 3 0 (tinfo 0x75932f3220) -[stdout] 02-15 10:20:37.603 6840 6881 D EGL_emulation: eglMakeCurrent: 0x758aed82a0: ver 3 0 (tinfo 0x75932f3220) -[stdout] 02-15 10:20:37.603 1572 1572 D SurfaceFlinger: duplicate layer name: changing SurfaceView - dev.flutter.scenarios/dev.flutter.scenarios.ExternalTextureFlutterActivity to SurfaceView - dev.flutter.scenarios/dev.flutter.scenarios.ExternalTextureFlutterActivity#1 -[stdout] 02-15 10:20:37.604 1572 1572 D SurfaceFlinger: duplicate layer name: changing Background for -SurfaceView - dev.flutter.scenarios/dev.flutter.scenarios.ExternalTextureFlutterActivity to Background for -SurfaceView - dev.flutter.scenarios/dev.flutter.scenarios.ExternalTextureFlutterActivity#1 -[stdout] 02-15 10:20:37.616 1384 2162 D gralloc_ranchu: gralloc_alloc: Creating ashmem region of size 9826304 -[stdout] 02-15 10:20:37.622 6840 6893 D CCodec : allocate(c2.android.avc.decoder) -[stdout] 02-15 10:20:37.623 6840 6893 I CCodec : setting up 'default' as default (vendor) store -[stdout] 02-15 10:20:37.623 1588 2090 V C2Store : in init -[stdout] 02-15 10:20:37.623 1588 2090 V C2Store : loading dll -[stdout] 02-15 10:20:37.624 6840 6893 I CCodec : Created component [c2.android.avc.decoder] -[stdout] 02-15 10:20:37.624 6840 6893 D CCodecConfig: read media type: video/avc -[stdout] 02-15 10:20:37.624 6840 6893 D ReflectedParamUpdater: extent() != 1 for single value type: algo.buffers.max-count.values -[stdout] 02-15 10:20:37.624 6840 6893 D ReflectedParamUpdater: extent() != 1 for single value type: output.subscribed-indices.values -[stdout] 02-15 10:20:37.624 6840 6893 D ReflectedParamUpdater: extent() != 1 for single value type: input.buffers.allocator-ids.values -[stdout] 02-15 10:20:37.624 6840 6893 D ReflectedParamUpdater: extent() != 1 for single value type: output.buffers.allocator-ids.values -[stdout] 02-15 10:20:37.624 6840 6893 D ReflectedParamUpdater: extent() != 1 for single value type: algo.buffers.allocator-ids.values -[stdout] 02-15 10:20:37.624 6840 6893 D ReflectedParamUpdater: extent() != 1 for single value type: output.buffers.pool-ids.values -[stdout] 02-15 10:20:37.624 6840 6893 D ReflectedParamUpdater: extent() != 1 for single value type: algo.buffers.pool-ids.values -[stdout] 02-15 10:20:37.624 6840 6893 D ReflectedParamUpdater: ignored struct field coded.color-format.locations -[stdout] 02-15 10:20:37.624 6840 6893 D CCodecConfig: ignoring local param raw.size (0xd2001800) as it is already supported -[stdout] 02-15 10:20:37.624 6840 6893 D CCodecConfig: ignoring local param raw.color (0xd2001809) as it is already supported -[stdout] 02-15 10:20:37.624 6840 6893 D ReflectedParamUpdater: ignored struct field raw.hdr-static-info.mastering -[stdout] 02-15 10:20:37.625 6840 6893 I CCodecConfig: query failed after returning 11 values (BAD_INDEX) -[stdout] 02-15 10:20:37.625 6840 6893 D CCodecConfig: c2 config is Dict { -[stdout] 02-15 10:20:37.625 6840 6893 D CCodecConfig: c2::u32 coded.pl.level = 20496 -[stdout] 02-15 10:20:37.625 6840 6893 D CCodecConfig: c2::u32 coded.pl.profile = 20481 -[stdout] 02-15 10:20:37.625 6840 6893 D CCodecConfig: c2::u32 coded.vui.color.matrix = 0 -[stdout] 02-15 10:20:37.625 6840 6893 D CCodecConfig: c2::u32 coded.vui.color.primaries = 0 -[stdout] 02-15 10:20:37.625 6840 6893 D CCodecConfig: c2::u32 coded.vui.color.range = 2 -[stdout] 02-15 10:20:37.625 6840 6893 D CCodecConfig: c2::u32 coded.vui.color.transfer = 0 -[stdout] 02-15 10:20:37.625 6840 6893 D CCodecConfig: c2::u32 default.color.matrix = 0 -[stdout] 02-15 10:20:37.625 6840 6893 D CCodecConfig: c2::u32 default.color.primaries = 0 -[stdout] 02-15 10:20:37.625 6840 6893 D CCodecConfig: c2::u32 default.color.range = 0 -[stdout] 02-15 10:20:37.625 6840 6893 D CCodecConfig: c2::u32 default.color.transfer = 0 -[stdout] 02-15 10:20:37.625 6840 6893 D CCodecConfig: c2::u32 input.buffers.max-size.value = 57600 -[stdout] 02-15 10:20:37.625 6840 6893 D CCodecConfig: c2::u32 input.delay.actual.value = 0 -[stdout] 02-15 10:20:37.625 6840 6893 D CCodecConfig: string input.media-type.value = "video/avc" -[stdout] 02-15 10:20:37.625 6840 6893 D CCodecConfig: string output.media-type.value = "video/raw" -[stdout] 02-15 10:20:37.625 6840 6893 D CCodecConfig: c2::u32 raw.color.matrix = 0 -[stdout] 02-15 10:20:37.625 6840 6893 D CCodecConfig: c2::u32 raw.color.primaries = 0 -[stdout] 02-15 10:20:37.625 6840 6893 D CCodecConfig: c2::u32 raw.color.range = 2 -[stdout] 02-15 10:20:37.625 6840 6893 D CCodecConfig: c2::u32 raw.color.transfer = 0 -[stdout] 02-15 10:20:37.625 6840 6893 D CCodecConfig: c2::u32 raw.max-size.height = 240 -[stdout] 02-15 10:20:37.625 6840 6893 D CCodecConfig: c2::u32 raw.max-size.width = 320 -[stdout] 02-15 10:20:37.625 6840 6893 D CCodecConfig: c2::u32 raw.pixel-format.value = 35 -[stdout] 02-15 10:20:37.625 6840 6893 D CCodecConfig: c2::i32 raw.rotation.flip = 0 -[stdout] 02-15 10:20:37.625 6840 6893 D CCodecConfig: c2::i32 raw.rotation.value = 0 -[stdout] 02-15 10:20:37.625 6840 6893 D CCodecConfig: c2::u32 raw.sar.height = 1 -[stdout] 02-15 10:20:37.625 6840 6893 D CCodecConfig: c2::u32 raw.sar.width = 1 -[stdout] 02-15 10:20:37.625 6840 6893 D CCodecConfig: c2::u32 raw.size.height = 240 -[stdout] 02-15 10:20:37.625 6840 6893 D CCodecConfig: c2::u32 raw.size.width = 320 -[stdout] 02-15 10:20:37.625 6840 6893 D CCodecConfig: c2::u32 raw.surface-scaling.value = -[stdout] 02-15 10:20:37.625 6840 6893 W ColorUtils: expected specified color aspects (2:0:0:0) -[stdout] 02-15 10:20:37.626 6840 6886 D EGL_emulation: eglMakeCurrent: 0x758c8458e0: ver 3 0 (tinfo 0x7576d7d2e0) -[stdout] 02-15 10:20:37.626 6840 6889 D SurfaceUtils: connecting to surface 0x757d4c0010, reason connectToSurface -[stdout] 02-15 10:20:37.626 6840 6889 I MediaCodec: [c2.android.avc.decoder] setting surface generation to 7004161 -[stdout] 02-15 10:20:37.626 6840 6889 D SurfaceUtils: disconnecting from surface 0x757d4c0010, reason connectToSurface(reconnect) -[stdout] 02-15 10:20:37.626 6840 6889 D SurfaceUtils: connecting to surface 0x757d4c0010, reason connectToSurface(reconnect) -[stdout] 02-15 10:20:37.626 6840 6880 I flutter : Loading scenario display_texture -[stdout] 02-15 10:20:37.627 6840 6896 D CCodec : allocate(c2.android.avc.decoder) -[stdout] 02-15 10:20:37.627 1384 2162 E gralloc_ranchu: gralloc_alloc: Requested auto format selection, but no known format for this usage: 192 x 256, usage 0 -[stdout] 02-15 10:20:37.627 6840 6893 E GraphicBufferAllocator: Failed to allocate (192 x 256) layerCount 1 format 34 usage 0: 3 -[stdout] 02-15 10:20:37.627 6840 6893 E BufferQueueProducer: [ImageReader-192x256f22m2-6840-0] dequeueBuffer: createGraphicBuffer failed -[stdout] --------- beginning of crash -[stdout] 02-15 10:20:37.627 6840 6893 F libc : Fatal signal 11 (SIGSEGV), code 2 (SEGV_ACCERR), fault addr 0x756f15a214 in tid 6893 (CodecLooper), pid 6840 (utter.scenarios) -[stdout] 02-15 10:20:37.633 6840 6896 I CCodec : setting up 'default' as default (vendor) store -[stdout] 02-15 10:20:37.636 6840 6896 I CCodec : Created component [c2.android.avc.decoder] -[stdout] 02-15 10:20:37.637 6840 6896 D CCodecConfig: read media type: video/avc -[stdout] 02-15 10:20:37.637 6840 6886 D eglCodecCommon: setVertexArrayObject: set vao to 0 (0) 1 2 -[stdout] 02-15 10:20:37.638 6840 6896 D ReflectedParamUpdater: extent() != 1 for single value type: algo.buffers.max-count.values -[stdout] 02-15 10:20:37.638 6840 6896 D ReflectedParamUpdater: extent() != 1 for single value type: output.subscribed-indices.values -[stdout] 02-15 10:20:37.638 6840 6896 D ReflectedParamUpdater: extent() != 1 for single value type: input.buffers.allocator-ids.values -[stdout] 02-15 10:20:37.638 6840 6896 D ReflectedParamUpdater: extent() != 1 for single value type: output.buffers.allocator-ids.values -[stdout] 02-15 10:20:37.638 6840 6896 D ReflectedParamUpdater: extent() != 1 for single value type: algo.buffers.allocator-ids.values -[stdout] 02-15 10:20:37.638 6840 6896 D ReflectedParamUpdater: extent() != 1 for single value type: output.buffers.pool-ids.values -[stdout] 02-15 10:20:37.638 6840 6896 D ReflectedParamUpdater: extent() != 1 for single value type: algo.buffers.pool-ids.values -[stdout] 02-15 10:20:37.638 6840 6896 D ReflectedParamUpdater: ignored struct field coded.color-format.locations -[stdout] 02-15 10:20:37.638 6840 6896 D CCodecConfig: ignoring local param raw.size (0xd2001800) as it is already supported -[stdout] 02-15 10:20:37.638 6840 6896 D CCodecConfig: ignoring local param raw.color (0xd2001809) as it is already supported -[stdout] 02-15 10:20:37.638 6840 6896 D ReflectedParamUpdater: ignored struct field raw.hdr-static-info.mastering -[stdout] 02-15 10:20:37.638 6840 6896 I CCodecConfig: query failed after returning 11 values (BAD_INDEX) -[stdout] 02-15 10:20:37.638 6840 6896 D CCodecConfig: c2 config is Dict { -[stdout] 02-15 10:20:37.638 6840 6896 D CCodecConfig: c2::u32 coded.pl.level = 20496 -[stdout] 02-15 10:20:37.638 6840 6896 D CCodecConfig: c2::u32 coded.pl.profile = 20481 -[stdout] 02-15 10:20:37.638 6840 6896 D CCodecConfig: c2::u32 coded.vui.color.matrix = 0 -[stdout] 02-15 10:20:37.638 6840 6896 D CCodecConfig: c2::u32 coded.vui.color.primaries = 0 -[stdout] 02-15 10:20:37.638 6840 6896 D CCodecConfig: c2::u32 coded.vui.color.range = 2 -[stdout] 02-15 10:20:37.638 6840 6896 D CCodecConfig: c2::u32 coded.vui.color.transfer = 0 -[stdout] 02-15 10:20:37.638 6840 6896 D CCodecConfig: c2::u32 default.color.matrix = 0 -[stdout] 02-15 10:20:37.638 6840 6896 D CCodecConfig: c2::u32 default.color.primaries = 0 -[stdout] 02-15 10:20:37.638 6840 6896 D CCodecConfig: c2::u32 default.color.range = 0 -[stdout] 02-15 10:20:37.638 6840 6896 D CCodecConfig: c2::u32 default.color.transfer = 0 -[stdout] 02-15 10:20:37.638 6840 6896 D CCodecConfig: c2::u32 input.buffers.max-size.value = 57600 -[stdout] 02-15 10:20:37.638 6840 6896 D CCodecConfig: c2::u32 input.delay.actual.value = 0 -[stdout] 02-15 10:20:37.638 6840 6896 D CCodecConfig: string input.media-type.value = "video/avc" -[stdout] 02-15 10:20:37.638 6840 6896 D CCodecConfig: string output.media-type.value = "video/raw" -[stdout] 02-15 10:20:37.638 6840 6896 D CCodecConfig: c2::u32 raw.color.matrix = 0 -[stdout] 02-15 10:20:37.638 6840 6896 D CCodecConfig: c2::u32 raw.color.primaries = 0 -[stdout] 02-15 10:20:37.638 6840 6896 D CCodecConfig: c2::u32 raw.color.range = 2 -[stdout] 02-15 10:20:37.638 6840 6896 D CCodecConfig: c2::u32 raw.color.transfer = 0 -[stdout] 02-15 10:20:37.638 6840 6896 D CCodecConfig: c2::u32 raw.max-size.height = 240 -[stdout] 02-15 10:20:37.638 6840 6896 D CCodecConfig: c2::u32 raw.max-size.width = 320 -[stdout] 02-15 10:20:37.638 6840 6896 D CCodecConfig: c2::u32 raw.pixel-format.value = 35 -[stdout] 02-15 10:20:37.638 6840 6896 D CCodecConfig: c2::i32 raw.rotation.flip = 0 -[stdout] 02-15 10:20:37.638 6840 6896 D CCodecConfig: c2::i32 raw.rotation.value = 0 -[stdout] 02-15 10:20:37.638 6840 6896 D CCodecConfig: c2::u32 raw.sar.height = 1 -[stdout] 02-15 10:20:37.638 6840 6896 D CCodecConfig: c2::u32 raw.sar.width = 1 -[stdout] 02-15 10:20:37.638 6840 6896 D CCodecConfig: c2::u32 raw.size.height = 240 -[stdout] 02-15 10:20:37.638 6840 6896 D CCodecConfig: c2::u32 raw.size.width = 320 -[stdout] 02-15 10:20:37.638 6840 6896 D CCodecConfig: c2::u32 raw.surface-scaling.value = -[stdout] 02-15 10:20:37.638 6840 6896 W ColorUtils: expected specified color aspects (2:0:0:0) -[stdout] 02-15 10:20:37.642 6840 6892 D SurfaceUtils: connecting to surface 0x7576eb4010, reason connectToSurface -[stdout] 02-15 10:20:37.642 6840 6892 I MediaCodec: [c2.android.avc.decoder] setting surface generation to 7004162 -[stdout] 02-15 10:20:37.642 6840 6892 D SurfaceUtils: disconnecting from surface 0x7576eb4010, reason connectToSurface(reconnect) -[stdout] 02-15 10:20:37.642 6840 6892 D SurfaceUtils: connecting to surface 0x7576eb4010, reason connectToSurface(reconnect) -[stdout] 02-15 10:20:37.642 1384 2162 E gralloc_ranchu: gralloc_alloc: Requested auto format selection, but no known format for this usage: 192 x 256, usage 0 -[stdout] 02-15 10:20:37.642 6840 6896 E GraphicBufferAllocator: Failed to allocate (192 x 256) layerCount 1 format 34 usage 0: 3 -[stdout] 02-15 10:20:37.642 6840 6896 E BufferQueueProducer: [ImageReader-192x256f22m2-6840-1] dequeueBuffer: createGraphicBuffer failed -[stdout] 02-15 10:20:37.650 1384 2162 D gralloc_ranchu: gralloc_alloc: Creating ashmem region of size 10371072 -[stdout] 02-15 10:20:37.651 6901 6901 I crash_dump64: obtaining output fd from tombstoned, type: kDebuggerdTombstone -[stdout] 02-15 10:20:37.651 1593 1593 I /system/bin/tombstoned: received crash request for pid 6893 -[stdout] 02-15 10:20:37.651 6901 6901 I crash_dump64: performing dump of process 6840 (target tid = 6893) -[stdout] 02-15 10:20:37.653 6901 6901 F DEBUG : *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** -[stdout] 02-15 10:20:37.653 6901 6901 F DEBUG : Build fingerprint: 'Android/sdk_gphone_arm64/generic_arm64:9/PSR1.210301.009.B6/9767327:userdebug/dev-keys' -[stdout] 02-15 10:20:37.653 6901 6901 F DEBUG : Revision: '0' -[stdout] 02-15 10:20:37.653 6901 6901 F DEBUG : ABI: 'arm64' -[stdout] 02-15 10:20:37.653 6901 6901 F DEBUG : pid: 6840, tid: 6893, name: CodecLooper >>> dev.flutter.scenarios <<< -[stdout] 02-15 10:20:37.653 6901 6901 F DEBUG : signal 11 (SIGSEGV), code 2 (SEGV_ACCERR), fault addr 0x756f15a214 -[stdout] 02-15 10:20:37.653 6901 6901 F DEBUG : x0 000000757d9fee58 x1 000000756eb53f50 x2 000000757d400000 x3 ffffffff9a31b499 -[stdout] 02-15 10:20:37.653 6901 6901 F DEBUG : x4 001350fd7a000000 x5 0000000000000018 x6 0000007618ab4000 x7 00000000000518be -[stdout] 02-15 10:20:37.653 6901 6901 F DEBUG : x8 000000756f15a210 x9 000000756f15a214 x10 0000000000000076 x11 0000000038bac926 -[stdout] 02-15 10:20:37.653 6901 6901 F DEBUG : x12 0000000000000018 x13 0000000065ce55f5 x14 002512f7f8ee4080 x15 000056d3b3ab5c7d -[stdout] 02-15 10:20:37.653 6901 6901 F DEBUG : x16 00000076181a7c50 x17 000000761589ac10 x18 000000756eb53190 x19 00000075894c4180 -[stdout] 02-15 10:20:37.653 6901 6901 F DEBUG : x20 000000756eb54060 x21 000000757d4c0010 x22 000000761532fba8 x23 0000000000000000 -[stdout] 02-15 10:20:37.653 6901 6901 F DEBUG : x24 0000000000000000 x25 00000075933ddc19 x26 000000756eb54588 x27 0000000000000000 -[stdout] 02-15 10:20:37.653 6901 6901 F DEBUG : x28 000000756eb54588 x29 000000756eb53fb0 -[stdout] 02-15 10:20:37.653 6901 6901 F DEBUG : sp 000000756eb53f40 lr 000000756f108090 pc 000000761589ac20 -[stdout] 02-15 10:20:37.653 1735 1758 I ActivityManager: Displayed dev.flutter.scenarios/.ExternalTextureFlutterActivity: +174ms -[stdout] 02-15 10:20:37.654 2846 2846 I GoogleInputMethod: onFinishInput() : Dummy InputConnection bound -[stdout] 02-15 10:20:37.654 2846 2846 I GoogleInputMethod: onStartInput() : Dummy InputConnection bound -[stdout] 02-15 10:20:37.655 6901 6901 F DEBUG : -[stdout] 02-15 10:20:37.655 6901 6901 F DEBUG : backtrace: -[stdout] 02-15 10:20:37.655 6901 6901 F DEBUG : #00 pc 000000000000bc20 /system/lib64/libutils.so (android::RefBase::incStrong(void const*) const+16) -[stdout] 02-15 10:20:37.655 6901 6901 F DEBUG : #01 pc 000000000004a08c /system/lib64/libstagefright_ccodec.so (android::CCodecBufferChannel::setSurface(android::sp const&)+240) -[stdout] 02-15 10:20:37.655 6901 6901 F DEBUG : #02 pc 0000000000036c98 /system/lib64/libstagefright_ccodec.so (_ZNSt3__110__function6__funcIZN7android6CCodec9configureERKNS2_2spINS2_8AMessageEEEE3$_4NS_9allocatorIS9_EEFivEEclEv+660) -[stdout] 02-15 10:20:37.655 6901 6901 F DEBUG : #03 pc 000000000002e174 /system/lib64/libstagefright_ccodec.so (android::CCodec::configure(android::sp const&)+724) -[stdout] 02-15 10:20:37.655 6901 6901 F DEBUG : #04 pc 0000000000029e7c /system/lib64/libstagefright_ccodec.so (android::CCodec::onMessageReceived(android::sp const&)+776) -[stdout] 02-15 10:20:37.655 6901 6901 F DEBUG : #05 pc 0000000000019904 /system/lib64/libstagefright_foundation.so (android::AHandler::deliverMessage(android::sp const&)+92) -[stdout] 02-15 10:20:37.655 6901 6901 F DEBUG : #06 pc 0000000000020f6c /system/lib64/libstagefright_foundation.so (android::AMessage::deliver()+180) -[stdout] 02-15 10:20:37.655 6901 6901 F DEBUG : #07 pc 000000000001c48c /system/lib64/libstagefright_foundation.so (android::ALooper::loop()+556) -[stdout] 02-15 10:20:37.655 6901 6901 F DEBUG : #08 pc 000000000000f974 /system/lib64/libutils.so (android::Thread::_threadLoop(void*)+276) -[stdout] 02-15 10:20:37.655 6901 6901 F DEBUG : #09 pc 0000000000081080 /system/lib64/libc.so (__pthread_start(void*)+36) -[stdout] 02-15 10:20:37.655 6901 6901 F DEBUG : #10 pc 0000000000023510 /system/lib64/libc.so (__start_thread+68) -[stdout] 02-15 10:20:37.661 6840 6881 D eglCodecCommon: setVertexArrayObject: set vao to 0 (0) 1 0 -[stdout] 02-15 10:20:37.667 1384 2744 D gralloc_ranchu: gralloc_alloc: Creating ashmem region of size 10371072 -[stdout] 02-15 10:20:37.667 1384 2162 D gralloc_ranchu: gralloc_alloc: Creating ashmem region of size 9826304 -[stdout] 02-15 10:20:37.678 2863 4286 D RcsProvisioning: No backup token found -[stdout] 02-15 10:20:37.678 2863 4286 D RcsProvisioning: Clearing backup token -[stdout] 02-15 10:20:37.678 2863 4286 D RcsProvisioning: Exception while getting subscriber Id. Using default -[stdout] 02-15 10:20:37.686 2863 4286 I CarrierServices: [209] RcsStateProvider.onMigrationComplete: Deleted transfers file: false -[stdout] 02-15 10:20:37.687 2863 4286 W RcsProvisioning: Failed to read configuration: /data/user/0/com.google.android.apps.messaging/files/rcsconfig (No such file or directory) -[stdout] 02-15 10:20:37.687 2863 4286 W RcsProvisioning: java.io.FileNotFoundException: /data/user/0/com.google.android.apps.messaging/files/rcsconfig (No such file or directory) -[stdout] 02-15 10:20:37.687 2863 4286 W RcsProvisioning: at java.io.FileInputStream.open0(Native Method) -[stdout] 02-15 10:20:37.687 2863 4286 W RcsProvisioning: at java.io.FileInputStream.open(FileInputStream.java:231) -[stdout] 02-15 10:20:37.687 2863 4286 W RcsProvisioning: at java.io.FileInputStream.(FileInputStream.java:165) -[stdout] 02-15 10:20:37.687 2863 4286 W RcsProvisioning: at android.app.ContextImpl.openFileInput(ContextImpl.java:560) -[stdout] 02-15 10:20:37.687 2863 4286 W RcsProvisioning: at android.content.ContextWrapper.openFileInput(ContextWrapper.java:202) -[stdout] 02-15 10:20:37.687 2863 4286 W RcsProvisioning: at ion.a(SourceFile:2) -[stdout] 02-15 10:20:37.687 2863 4286 W RcsProvisioning: at idl.a(SourceFile:4) -[stdout] 02-15 10:20:37.687 2863 4286 W RcsProvisioning: at idm.a(SourceFile:7) -[stdout] 02-15 10:20:37.687 2863 4286 W RcsProvisioning: at iez.buildConferencesFileName(SourceFile:30) -[stdout] 02-15 10:20:37.687 2863 4286 W RcsProvisioning: at com.google.android.apps.messaging.rcsmigration.RcsStateProvider.onMigrationComplete(SourceFile:48) -[stdout] 02-15 10:20:37.687 2863 4286 W RcsProvisioning: at com.google.android.ims.rcsmigration.IRcsStateProvider$Stub.dispatchTransaction(SourceFile:14) -[stdout] 02-15 10:20:37.687 2863 4286 W RcsProvisioning: at com.google.android.aidl.BaseStub.onTransact(SourceFile:18) -[stdout] 02-15 10:20:37.687 2863 4286 W RcsProvisioning: at android.os.Binder.execTransact(Binder.java:731) -[stdout] 02-15 10:20:37.687 2863 4286 D RcsProvisioning: Retrieving backup token -[stdout] 02-15 10:20:37.687 2863 4286 D RcsProvisioning: Exception while getting subscriber Id. Using default -[stdout] 02-15 10:20:37.785 1572 1709 W SurfaceFlinger: Attempting to set client state on removed layer: Surface(name=AppWindowToken{7e3563e token=Token{2196f9 ActivityRecord{73fc9c0 u0 dev.flutter.scenarios/.ExternalTextureFlutterActivity t10}}})/@0x5c21b8f - animation-leash#0 -[stdout] 02-15 10:20:37.785 1572 1709 W SurfaceFlinger: Attempting to set client state on removed layer: Surface(name=AppWindowToken{310ffb3 token=Token{f40d922 ActivityRecord{df186ed u0 com.android.launcher3/.Launcher t5}}})/@0x278ca58 - animation-leash#0 -[stdout] 02-15 10:20:37.785 1572 1709 W SurfaceFlinger: Attempting to destroy on removed layer: Surface(name=AppWindowToken{7e3563e token=Token{2196f9 ActivityRecord{73fc9c0 u0 dev.flutter.scenarios/.ExternalTextureFlutterActivity t10}}})/@0x5c21b8f - animation-leash#0 -[stdout] 02-15 10:20:37.785 1572 1709 W SurfaceFlinger: Attempting to destroy on removed layer: Surface(name=AppWindowToken{310ffb3 token=Token{f40d922 ActivityRecord{df186ed u0 com.android.launcher3/.Launcher t5}}})/@0x278ca58 - animation-leash#0 -[stdout] 02-15 10:20:37.802 2647 2730 D EGL_emulation: eglMakeCurrent: 0x758c83b5e0: ver 3 0 (tinfo 0x758c80df40) -[stdout] 02-15 10:20:37.809 1593 1593 E /system/bin/tombstoned: Tombstone written to: /data/tombstones/tombstone_05 -[stdout] 02-15 10:20:37.813 1735 1750 W BroadcastQueue: Background execution not allowed: receiving Intent { act=android.intent.action.DROPBOX_ENTRY_ADDED flg=0x10 (has extras) } to com.google.android.gms/.stats.service.DropBoxEntryAddedReceiver -[stdout] 02-15 10:20:37.813 1735 1750 W BroadcastQueue: Background execution not allowed: receiving Intent { act=android.intent.action.DROPBOX_ENTRY_ADDED flg=0x10 (has extras) } to com.google.android.gms/.chimera.GmsIntentOperationService$PersistentTrustedReceiver -[stdout] 02-15 10:20:37.816 1933 2157 D EGL_emulation: eglMakeCurrent: 0x75795b6c40: ver 3 0 (tinfo 0x758aeecba0) -[stdout] 02-15 10:20:37.818 1933 2157 D EGL_emulation: eglMakeCurrent: 0x75795b6c40: ver 3 0 (tinfo 0x758aeecba0) -[stdout] 02-15 10:20:37.819 1572 1643 W SurfaceFlinger: Attempting to set client state on removed layer: Splash Screen dev.flutter.scenarios#0 -[stdout] 02-15 10:20:37.819 1572 1643 W SurfaceFlinger: Attempting to destroy on removed layer: Splash Screen dev.flutter.scenarios#0 -[stdout] 02-15 10:20:37.826 2863 4286 D RcsProvisioning: No backup token found -[stdout] 02-15 10:20:37.828 3621 3621 I CarrierServices: [2] aww.a: Unbinding RcsMigrationService -[stdout] 02-15 10:20:37.828 2863 5308 I CarrierServices: [379] RcsStateProvider.onMigrationComplete: Migration complete. -[stdout] 02-15 10:20:37.829 2863 5308 I CarrierServices: [379] inq.shouldUseCarrierServicesApkForV1Apis: Checking if using CarrierServices.apk is possible. Enabled: true, isAtLeastM: true, runningInsideBugle: true -[stdout] 02-15 10:20:37.829 2863 5308 I CarrierServices: [379] inq.e: Network Operator: 310260 -[stdout] 02-15 10:20:37.829 2863 5308 I CarrierServices: [379] inq.e: carrierWithOldEcApis: false -[stdout] 02-15 10:20:37.829 2863 5308 I CarrierServices: [379] inq.e: hasDialerThatSupportsNewEc: false -[stdout] 02-15 10:20:37.829 2863 5308 I CarrierServices: [379] RcsStateProvider.onMigrationComplete: Rcs Engine should be running in cs.apk. Stopping JibeService. -[stdout] 02-15 10:20:37.830 2863 5308 I CarrierServices: [379] RcsStateProvider.onMigrationComplete: JibeService stopped: true -[stdout] 02-15 10:20:37.830 2863 5308 I CarrierServices: [379] inq.e: Network Operator: 310260 -[stdout] 02-15 10:20:37.830 2863 5308 I CarrierServices: [379] inq.e: carrierWithOldEcApis: false -[stdout] 02-15 10:20:37.830 2863 5308 I CarrierServices: [379] inq.e: hasDialerThatSupportsNewEc: false -[stdout] 02-15 10:20:37.830 2863 5308 I CarrierServices: [379] jsn.connect: shouldUseCarrierServicesJibeService: true, CarrierServices rcs service found: true -[stdout] 02-15 10:20:37.830 2863 5308 I CarrierServices: [379] jsn.connect: Binding to JibeService in CarrierServices. -[stdout] 02-15 10:20:37.830 2863 2863 D RcsClientLib: Service com.google.android.rcs.client.chatsession.ChatSessionService connected. Will notify listeners: true -[stdout] 02-15 10:20:37.830 2863 2863 V BugleRcs: com.google.android.rcs.client.chatsession.ChatSessionService RCS service connected -[stdout] 02-15 10:20:37.830 2863 5308 I CarrierServices: [379] inq.e: Network Operator: 310260 -[stdout] 02-15 10:20:37.831 2863 5308 I CarrierServices: [379] inq.e: carrierWithOldEcApis: false -[stdout] 02-15 10:20:37.831 2863 5308 I CarrierServices: [379] inq.e: hasDialerThatSupportsNewEc: false -[stdout] 02-15 10:20:37.831 2863 5308 I CarrierServices: [379] jsn.connect: shouldUseCarrierServicesJibeService: true, CarrierServices rcs service found: true -[stdout] 02-15 10:20:37.831 2863 5308 I CarrierServices: [379] jsn.connect: Binding to JibeService in CarrierServices. -[stdout] 02-15 10:20:37.831 2863 2863 D RcsClientLib: Service com.google.android.rcs.client.events.EventService connected. Will notify listeners: true -[stdout] 02-15 10:20:37.831 2863 2863 V BugleRcs: com.google.android.rcs.client.events.EventService RCS service connected -[stdout] 02-15 10:20:37.831 2863 5308 I CarrierServices: [379] inq.e: Network Operator: 310260 -[stdout] 02-15 10:20:37.831 2863 5308 I CarrierServices: [379] inq.e: carrierWithOldEcApis: false -[stdout] 02-15 10:20:37.831 2863 5308 I CarrierServices: [379] inq.e: hasDialerThatSupportsNewEc: false -[stdout] 02-15 10:20:37.832 2863 5308 I CarrierServices: [379] jsn.connect: shouldUseCarrierServicesJibeService: true, CarrierServices rcs service found: true -[stdout] 02-15 10:20:37.832 2863 5308 I CarrierServices: [379] jsn.connect: Binding to JibeService in CarrierServices. -[stdout] 02-15 10:20:37.832 2863 2863 D RcsClientLib: Service com.google.android.rcs.client.contacts.ContactsService connected. Will notify listeners: true -[stdout] 02-15 10:20:37.832 2863 2863 V BugleRcs: com.google.android.rcs.client.contacts.ContactsService RCS service connected -[stdout] 02-15 10:20:37.832 2863 5308 I CarrierServices: [379] inq.e: Network Operator: 310260 -[stdout] 02-15 10:20:37.832 2863 5308 I CarrierServices: [379] inq.e: carrierWithOldEcApis: false -[stdout] 02-15 10:20:37.832 2863 5308 I CarrierServices: [379] inq.e: hasDialerThatSupportsNewEc: false -[stdout] 02-15 10:20:37.832 2863 5308 I CarrierServices: [379] jsn.connect: shouldUseCarrierServicesJibeService: true, CarrierServices rcs service found: true -[stdout] 02-15 10:20:37.832 2863 5308 I CarrierServices: [379] jsn.connect: Binding to JibeService in CarrierServices. -[stdout] 02-15 10:20:37.832 2863 2863 D RcsClientLib: Service com.google.android.rcs.client.filetransfer.FileTransferService connected. Will notify listeners: true -[stdout] 02-15 10:20:37.832 2863 2863 V BugleRcs: com.google.android.rcs.client.filetransfer.FileTransferService RCS service connected -[stdout] 02-15 10:20:37.832 2863 5308 I CarrierServices: [379] inq.e: Network Operator: 310260 -[stdout] 02-15 10:20:37.833 2863 5308 I CarrierServices: [379] inq.e: carrierWithOldEcApis: false -[stdout] 02-15 10:20:37.833 2863 5308 I CarrierServices: [379] inq.e: hasDialerThatSupportsNewEc: false -[stdout] 02-15 10:20:37.833 2863 5308 I CarrierServices: [379] jsn.connect: shouldUseCarrierServicesJibeService: true, CarrierServices rcs service found: true -[stdout] 02-15 10:20:37.833 2863 5308 I CarrierServices: [379] jsn.connect: Binding to JibeService in CarrierServices. -[stdout] 02-15 10:20:37.833 2863 2863 D RcsClientLib: Service com.google.android.rcs.client.locationsharing.LocationSharingService connected. Will notify listeners: true -[stdout] 02-15 10:20:37.833 2863 2863 V BugleRcs: com.google.android.rcs.client.locationsharing.LocationSharingService RCS service connected -[stdout] 02-15 10:20:37.834 2863 5308 I CarrierServices: [379] inq.e: Network Operator: 310260 -[stdout] 02-15 10:20:37.835 2863 5308 I CarrierServices: [379] inq.e: carrierWithOldEcApis: false -[stdout] 02-15 10:20:37.835 2863 5308 I CarrierServices: [379] inq.e: hasDialerThatSupportsNewEc: false -[stdout] 02-15 10:20:37.839 2863 5308 I CarrierServices: [379] jsn.connect: shouldUseCarrierServicesJibeService: true, CarrierServices rcs service found: true -[stdout] 02-15 10:20:37.839 2863 5308 I CarrierServices: [379] jsn.connect: Binding to JibeService in CarrierServices. -[stdout] 02-15 10:20:37.839 2863 2863 D RcsClientLib: Service com.google.android.rcs.client.ims.ImsConnectionTrackerService connected. Will notify listeners: true -[stdout] 02-15 10:20:37.839 2863 2863 V BugleRcs: com.google.android.rcs.client.ims.ImsConnectionTrackerService RCS service connected -[stdout] 02-15 10:20:37.840 2863 2863 V BugleRcs: kicking off RCS sending/receiving -[stdout] 02-15 10:20:37.840 2863 2863 V BugleAction: no RCS because we're not registered -[stdout] 02-15 10:20:37.840 2863 5308 I CarrierServices: [379] inq.e: Network Operator: 310260 -[stdout] 02-15 10:20:37.840 2863 5308 I CarrierServices: [379] inq.e: carrierWithOldEcApis: false -[stdout] 02-15 10:20:37.840 2863 5308 I CarrierServices: [379] inq.e: hasDialerThatSupportsNewEc: false -[stdout] 02-15 10:20:37.840 2863 5308 I CarrierServices: [379] jsn.connect: shouldUseCarrierServicesJibeService: true, CarrierServices rcs service found: true -[stdout] 02-15 10:20:37.840 2863 5308 I CarrierServices: [379] jsn.connect: Binding to JibeService in CarrierServices. -[stdout] 02-15 10:20:37.841 2863 2863 D RcsClientLib: Service com.google.android.rcs.client.profile.RcsProfileService connected. Will notify listeners: true -[stdout] 02-15 10:20:37.841 2863 2863 V BugleRcs: com.google.android.rcs.client.profile.RcsProfileService RCS service connected -[stdout] 02-15 10:20:37.841 2863 2863 V BugleRcs: kicking off RCS sending/receiving -[stdout] 02-15 10:20:37.841 2863 5308 I CarrierServices: [379] inq.e: Network Operator: 310260 -[stdout] 02-15 10:20:37.841 2863 2863 V BugleAction: no RCS because we're not registered -[stdout] 02-15 10:20:37.841 3621 3657 W CarrierServices: [190] bmc.a: No config URL. RCS will be disabled! -[stdout] 02-15 10:20:37.841 2863 2863 I BugleRcs: RcsAvailability ACS url: null -[stdout] 02-15 10:20:37.841 2863 5308 I CarrierServices: [379] inq.e: carrierWithOldEcApis: false -[stdout] 02-15 10:20:37.841 2863 5308 I CarrierServices: [379] inq.e: hasDialerThatSupportsNewEc: false -[stdout] 02-15 10:20:37.841 2863 5308 I CarrierServices: [379] jsn.connect: shouldUseCarrierServicesJibeService: true, CarrierServices rcs service found: true -[stdout] 02-15 10:20:37.841 2863 5308 I CarrierServices: [379] jsn.connect: Binding to JibeService in CarrierServices. -[stdout] 02-15 10:20:37.841 2863 2863 D RcsClientLib: Service com.google.android.rcs.client.businessinfo.BusinessInfoService connected. Will notify listeners: true -[stdout] 02-15 10:20:37.841 2863 2863 V BugleRcs: com.google.android.rcs.client.businessinfo.BusinessInfoService RCS service connected -[stdout] 02-15 10:20:37.841 2863 2863 V BugleRcs: kicking off RCS sending/receiving -[stdout] 02-15 10:20:37.842 2863 2863 V BugleAction: no RCS because we're not registered -[stdout] 02-15 10:20:37.842 3621 3657 W CarrierServices: [190] bmc.a: No config URL. RCS will be disabled! -[stdout] 02-15 10:20:37.842 2863 2863 I BugleRcs: RcsAvailability ACS url: null -[stdout] 02-15 10:20:37.842 2863 5308 W RcsProvisioning: Failed to read configuration: /data/user/0/com.google.android.apps.messaging/files/rcsconfig (No such file or directory) -[stdout] 02-15 10:20:37.842 2863 5308 W RcsProvisioning: java.io.FileNotFoundException: /data/user/0/com.google.android.apps.messaging/files/rcsconfig (No such file or directory) -[stdout] 02-15 10:20:37.842 2863 5308 W RcsProvisioning: at java.io.FileInputStream.open0(Native Method) -[stdout] 02-15 10:20:37.842 2863 5308 W RcsProvisioning: at java.io.FileInputStream.open(FileInputStream.java:231) -[stdout] 02-15 10:20:37.842 2863 5308 W RcsProvisioning: at java.io.FileInputStream.(FileInputStream.java:165) -[stdout] 02-15 10:20:37.842 2863 5308 W RcsProvisioning: at android.app.ContextImpl.openFileInput(ContextImpl.java:560) -[stdout] 02-15 10:20:37.842 2863 5308 W RcsProvisioning: at android.content.ContextWrapper.openFileInput(ContextWrapper.java:202) -[stdout] 02-15 10:20:37.842 2863 5308 W RcsProvisioning: at ion.a(SourceFile:2) -[stdout] 02-15 10:20:37.842 2863 5308 W RcsProvisioning: at idl.a(SourceFile:4) -[stdout] 02-15 10:20:37.842 2863 5308 W RcsProvisioning: at idm.a(SourceFile:7) -[stdout] 02-15 10:20:37.842 2863 5308 W RcsProvisioning: at com.google.android.apps.messaging.rcsmigration.RcsStateProvider.onMigrationComplete(SourceFile:27) -[stdout] 02-15 10:20:37.842 2863 5308 W RcsProvisioning: at com.google.android.ims.rcsmigration.IRcsStateProvider$Stub.dispatchTransaction(SourceFile:14) -[stdout] 02-15 10:20:37.842 2863 5308 W RcsProvisioning: at com.google.android.aidl.BaseStub.onTransact(SourceFile:18) -[stdout] 02-15 10:20:37.842 2863 5308 W RcsProvisioning: at android.os.Binder.execTransact(Binder.java:731) -[stdout] 02-15 10:20:37.842 2863 5308 D RcsProvisioning: Retrieving backup token -[stdout] 02-15 10:20:37.843 2863 5308 D RcsProvisioning: Exception while getting subscriber Id. Using default -[stdout] 02-15 10:20:37.857 1735 1810 W InputDispatcher: channel 'ad6b076 dev.flutter.scenarios/dev.flutter.scenarios.ExternalTextureFlutterActivity (server)' ~ Consumer closed input channel or an error occurred. events=0x9 -[stdout] 02-15 10:20:37.857 1735 1810 E InputDispatcher: channel 'ad6b076 dev.flutter.scenarios/dev.flutter.scenarios.ExternalTextureFlutterActivity (server)' ~ Channel is unrecoverably broken and will be disposed! -[stdout] 02-15 10:20:37.857 1588 2005 V C2Store : in ~ComponentModule -[stdout] 02-15 10:20:37.857 1588 2005 V C2Store : unloading dll -[stdout] 02-15 10:20:37.858 1735 3126 I ActivityManager: Process dev.flutter.scenarios (pid 6840) has died: fore TOP -[stdout] 02-15 10:20:37.858 1735 3126 W ActivityManager: Force removing ActivityRecord{73fc9c0 u0 dev.flutter.scenarios/.ExternalTextureFlutterActivity t10}: app died, no saved state -[stdout] 02-15 10:20:37.858 1735 1753 W libprocessgroup: kill(-6840, 9) failed: No such process -[stdout] 02-15 10:20:37.859 1735 2050 I WindowManager: WIN DEATH: Window{ad6b076 u0 dev.flutter.scenarios/dev.flutter.scenarios.ExternalTextureFlutterActivity} -[stdout] 02-15 10:20:37.859 1735 2050 W InputDispatcher: Attempted to unregister already unregistered input channel 'ad6b076 dev.flutter.scenarios/dev.flutter.scenarios.ExternalTextureFlutterActivity (server)' -[stdout] 02-15 10:20:37.859 1573 1573 I Zygote : Process 6840 exited due to signal (11) -[stdout] 02-15 10:20:37.859 1572 1709 W SurfaceFlinger: Attempting to destroy on removed layer: AppWindowToken{7e3563e token=Token{2196f9 ActivityRecord{73fc9c0 u0 dev.flutter.scenarios/.ExternalTextureFlutterActivity t10}}}#0 -[stdout] 02-15 10:20:37.860 1735 3126 W ActivityManager: Crash of app dev.flutter.scenarios running instrumentation ComponentInfo{dev.flutter.scenarios.test/dev.flutter.TestRunner} -[stdout] 02-15 10:20:37.860 1735 3126 I ActivityManager: Force stopping dev.flutter.scenarios appid=10098 user=0: finished inst -[stdout] 02-15 10:20:37.860 1735 6915 W Binder : Outgoing transactions from this process must be FLAG_ONEWAY -[stdout] 02-15 10:20:37.860 1735 6915 W Binder : java.lang.Throwable -[stdout] 02-15 10:20:37.860 1735 6915 W Binder : at android.os.BinderProxy.transact(Binder.java:1114) -[stdout] 02-15 10:20:37.860 1735 6915 W Binder : at android.app.IInstrumentationWatcher$Stub$Proxy.instrumentationFinished(IInstrumentationWatcher.java:164) -[stdout] 02-15 10:20:37.860 1735 6915 W Binder : at com.android.server.am.InstrumentationReporter$MyThread.run(InstrumentationReporter.java:86) -[stdout] 02-15 10:20:37.860 6827 6827 D AndroidRuntime: Shutting down VM -[stdout] 02-15 10:20:37.862 1735 1758 W ActivityManager: setHasOverlayUi called on unknown pid: 6840 -[stdout] 02-15 10:20:37.868 1572 1572 W SurfaceFlinger: couldn't log to binary event log: overflow. -[stdout] 02-15 10:20:37.888 1384 2162 D gralloc_ranchu: gralloc_alloc: Creating ashmem region of size 10371072 -[stdout] 02-15 10:20:37.889 1384 2162 I chatty : uid=1000(system) HwBinder:1384_2 identical 1 line -[stdout] 02-15 10:20:37.889 1384 2162 D gralloc_ranchu: gralloc_alloc: Creating ashmem region of size 10371072 -[stdout] 02-15 10:20:37.890 2846 2846 I GoogleInputMethod: onFinishInput() : Dummy InputConnection bound -[stdout] 02-15 10:20:37.890 2846 2846 I GoogleInputMethod: onStartInput() : Dummy InputConnection bound -[stdout] 02-15 10:20:37.896 1735 1753 W libprocessgroup: kill(-6840, 9) failed: No such process -[stdout] 02-15 10:20:37.896 1735 1753 I libprocessgroup: Successfully killed process cgroup uid 10098 pid 6840 in 37ms -[stdout] 02-15 10:20:37.903 2647 2730 D EGL_emulation: eglMakeCurrent: 0x758c83b5e0: ver 3 0 (tinfo 0x758c80df40) -[stdout] 02-15 10:20:37.908 1572 1572 D SurfaceFlinger: duplicate layer name: changing Surface(name=773ae4d StatusBar)/@0x80ae899 - animation-leash to Surface(name=773ae4d StatusBar)/@0x80ae899 - animation-leash#1 -[stdout] 02-15 10:20:37.921 1933 2157 D EGL_emulation: eglMakeCurrent: 0x75795b6c40: ver 3 0 (tinfo 0x758aeecba0) -[stdout] 02-15 10:20:37.929 1735 1750 I ActivityManager: Force stopping dev.flutter.scenarios appid=10098 user=-1: deletePackageX -[stdout] 02-15 10:20:37.936 1933 2157 D EGL_emulation: eglMakeCurrent: 0x75795b6c40: ver 3 0 (tinfo 0x758aeecba0) -[stdout] 02-15 10:20:37.943 2863 5308 D RcsProvisioning: No backup token found -[stdout] 02-15 10:20:37.943 2863 5308 D RcsProvisioning: Clearing backup token -[stdout] 02-15 10:20:37.943 2863 5308 D RcsProvisioning: Exception while getting subscriber Id. Using default -[stdout] 02-15 10:20:37.948 2863 5308 I CarrierServices: [379] RcsStateProvider.onMigrationComplete: Deleted transfers file: false -[stdout] 02-15 10:20:37.972 2863 5308 W RcsProvisioning: Failed to read configuration: /data/user/0/com.google.android.apps.messaging/files/rcsconfig (No such file or directory) -[stdout] 02-15 10:20:37.972 2863 5308 W RcsProvisioning: java.io.FileNotFoundException: /data/user/0/com.google.android.apps.messaging/files/rcsconfig (No such file or directory) -[stdout] 02-15 10:20:37.972 2863 5308 W RcsProvisioning: at java.io.FileInputStream.open0(Native Method) -[stdout] 02-15 10:20:37.972 2863 5308 W RcsProvisioning: at java.io.FileInputStream.open(FileInputStream.java:231) -[stdout] 02-15 10:20:37.972 2863 5308 W RcsProvisioning: at java.io.FileInputStream.(FileInputStream.java:165) -[stdout] 02-15 10:20:37.972 2863 5308 W RcsProvisioning: at android.app.ContextImpl.openFileInput(ContextImpl.java:560) -[stdout] 02-15 10:20:37.972 2863 5308 W RcsProvisioning: at android.content.ContextWrapper.openFileInput(ContextWrapper.java:202) -[stdout] 02-15 10:20:37.972 2863 5308 W RcsProvisioning: at ion.a(SourceFile:2) -[stdout] 02-15 10:20:37.972 2863 5308 W RcsProvisioning: at idl.a(SourceFile:4) -[stdout] 02-15 10:20:37.972 2863 5308 W RcsProvisioning: at idm.a(SourceFile:7) -[stdout] 02-15 10:20:37.972 2863 5308 W RcsProvisioning: at iez.buildConferencesFileName(SourceFile:30) -[stdout] 02-15 10:20:37.972 2863 5308 W RcsProvisioning: at com.google.android.apps.messaging.rcsmigration.RcsStateProvider.onMigrationComplete(SourceFile:48) -[stdout] 02-15 10:20:37.972 2863 5308 W RcsProvisioning: at com.google.android.ims.rcsmigration.IRcsStateProvider$Stub.dispatchTransaction(SourceFile:14) -[stdout] 02-15 10:20:37.972 2863 5308 W RcsProvisioning: at com.google.android.aidl.BaseStub.onTransact(SourceFile:18) -[stdout] 02-15 10:20:37.972 2863 5308 W RcsProvisioning: at android.os.Binder.execTransact(Binder.java:731) -[stdout] 02-15 10:20:37.972 2863 5308 D RcsProvisioning: Retrieving backup token -[stdout] 02-15 10:20:37.972 2863 5308 D RcsProvisioning: Exception while getting subscriber Id. Using default -[stdout] 02-15 10:20:37.973 1579 1579 I keystore: clear_uid 10098 -[stdout] 02-15 10:20:37.973 1735 1763 D PackageManager: Instant App installer not found with android.intent.action.INSTALL_INSTANT_APP_PACKAGE -[stdout] 02-15 10:20:37.973 1735 1763 D PackageManager: Clear ephemeral installer activity -[stdout] 02-15 10:20:37.987 1735 1763 I system_server: Explicit concurrent copying GC freed 45480(2MB) AllocSpace objects, 16(640KB) LOS objects, 40% free, 8MB/14MB, paused 17us total 14.150ms -[stdout] 02-15 10:20:38.012 1735 1763 I ActivityManager: Force stopping dev.flutter.scenarios appid=10098 user=0: pkg removed -[stdout] 02-15 10:20:38.015 1735 1750 W BroadcastQueue: Background execution not allowed: receiving Intent { act=android.intent.action.PACKAGE_REMOVED dat=package:dev.flutter.scenarios flg=0x4000010 (has extras) } to com.android.musicfx/.Compatibility$Receiver -[stdout] 02-15 10:20:38.015 1735 1750 W BroadcastQueue: Background execution not allowed: receiving Intent { act=android.intent.action.PACKAGE_REMOVED dat=package:dev.flutter.scenarios flg=0x4000010 (has extras) } to com.google.android.gms/.games.chimera.GamesSystemBroadcastReceiverProxy -[stdout] 02-15 10:20:38.015 1735 1750 W BroadcastQueue: Background execution not allowed: receiving Intent { act=android.intent.action.PACKAGE_REMOVED dat=package:dev.flutter.scenarios flg=0x4000010 (has extras) } to com.google.android.gms/.chimera.GmsIntentOperationService$PersistentTrustedReceiver -[stdout] 02-15 10:20:38.015 1735 1750 W BroadcastQueue: Background execution not allowed: receiving Intent { act=android.intent.action.PACKAGE_REMOVED dat=package:dev.flutter.scenarios flg=0x4000010 (has extras) } to com.google.android.googlequicksearchbox/com.google.android.apps.gsa.googlequicksearchbox.GelStubAppWatcher -[stdout] 02-15 10:20:38.016 1735 1874 E TaskPersister: File error accessing recents directory (directory doesn't exist?). -[stdout] 02-15 10:20:38.022 1964 1964 D CarrierSvcBindHelper: No carrier app for: 0 -[stdout] 02-15 10:20:38.024 1735 1735 W system_server: Unknown chunk type '200'. -[stdout] 02-15 10:20:38.025 1735 1735 D ZenLog : config: removeAutomaticZenRules,ZenModeConfig[user=0,allowAlarms=true,allowMedia=true,allowSystem=false,allowReminders=false,allowEvents=false,allowCalls=true,allowRepeatCallers=true,allowMessages=false,allowCallsFrom=stars,allowMessagesFrom=contacts,suppressedVisualEffects=511,areChannelsBypassingDnd=false,automaticRules={EVENTS_DEFAULT_RULE=ZenRule[enabled=false,snoozing=false,name=Event,zenMode=ZEN_MODE_IMPORTANT_INTERRUPTIONS,conditionId=condition://android/event?userId=-10000&calendar=&reply=1,condition=Condition[id=condition://android/event?userId=-10000&calendar=&reply=1,summary=...,line1=...,line2=...,icon=0,state=STATE_FALSE,flags=2],component=ComponentInfo{android/com.android.server.notification.EventConditionProvider},id=EVENTS_DEFAULT_RULE,creationTime=1679084832814,enabler=null], EVERY_NIGHT_DEFAULT_RULE=ZenRule[enabled=false,snoozing=false,name=Sleeping,zenMode=ZEN_MODE_IMPORTANT_INTERRUPTIONS,conditionId=condition://android/schedule?days=1.2.3.4.5.6.7&start=22.0&end=7.0&exitAtAlarm=true,condition=Condition[id=condition://android/schedule?days=1.2.3.4.5.6.7&start=22.0&end=7.0&exitAtAlarm=true,summary=...,line1=...,line2=...,icon=0,state=STATE_FALSE,flags=2],component=ComponentInfo{android/com.android.server.notification.ScheduleConditionProvider},id=EVERY_NIGHT_DEFAULT_RULE,creationTime=1679084832814,enabler=null]},manualRule=null],Diff[] -[stdout] 02-15 10:20:38.025 1735 1735 I ConditionProviders: Disallowing condition provider dev.flutter.scenarios -[stdout] 02-15 10:20:38.026 1735 1811 I InputReader: Reconfiguring input devices. changes=0x00000010 -[stdout] 02-15 10:20:38.026 4770 6816 I BlockstoreStorage: Clearing all the Blockstore Data for package dev.flutter.scenarios [CONTEXT service_id=258 ] -[stdout] 02-15 10:20:38.026 4770 6816 I BlockstoreStorage: Clearing all the Blockstore Data for 1 packages [CONTEXT service_id=258 ] -[stdout] 02-15 10:20:38.030 1735 1846 D WifiConfigManager: Remove all networks for app ApplicationInfo{b46fa72 dev.flutter.scenarios} -[stdout] 02-15 10:20:38.031 1735 1735 D ZenLog : set_zen_mode: off,removeAutomaticZenRules -[stdout] 02-15 10:20:38.033 4770 4876 E Icing : Couldn't handle android.intent.action.PACKAGE_REMOVED intent due to initialization failure. -[stdout] 02-15 10:20:38.035 4770 4876 W Icing : IndexManager failed to initialize. AppIndex.API is unavailable. -[stdout] 02-15 10:20:38.041 1735 2283 W ActivityManager: Unable to start service Intent { act=com.android.vending.developergroupidinfo.IDeveloperGroupIdInfoService.BIND cmp=com.android.vending/com.google.android.finsky.developergroupidinfo.DeveloperGroupIdInfoService } U=0: not found -[stdout] 02-15 10:20:38.044 1735 1941 I GnssLocationProvider: WakeLock acquired by sendMessage(REPORT_SV_STATUS, 0, com.android.server.location.GnssLocationProvider$SvStatusInfo@5ee1496) -[stdout] 02-15 10:20:38.045 4770 4770 D BoundBrokerSvc: onBind: Intent { act=com.google.android.gms.common.BIND_SHARED_PREFS pkg=com.google.android.gms } -[stdout] 02-15 10:20:38.045 4770 4770 D BoundBrokerSvc: Loading bound service for intent: Intent { act=com.google.android.gms.common.BIND_SHARED_PREFS pkg=com.google.android.gms } -[stdout] 02-15 10:20:38.046 4770 4876 I Icing : IndexChimeraService.getServiceInterface callingPackage=com.google.android.gms componentName=ContactsIndexer serviceId=33 -[stdout] 02-15 10:20:38.047 4770 4889 I Icing : IndexChimeraService.getServiceInterface callingPackage=com.google.android.gms componentName=AppsCorpus serviceId=36 -[stdout] 02-15 10:20:38.047 4770 4770 W GmscoreIpa: Apps indexing failed. [CONTEXT service_id=255 ] -[stdout] 02-15 10:20:38.047 4770 4770 W GmscoreIpa: ciev: API: AppIndexing.API is not available on this device. Connection failed with: ConnectionResult{statusCode=API_UNAVAILABLE, resolution=null, message=null} -[stdout] 02-15 10:20:38.047 4770 4770 W GmscoreIpa: at ciez.a(:com.google.android.gms@214515028@21.45.15 (100400-411636772):2) -[stdout] 02-15 10:20:38.047 4770 4770 W GmscoreIpa: at wlo.c(:com.google.android.gms@214515028@21.45.15 (100400-411636772):0) -[stdout] 02-15 10:20:38.047 4770 4770 W GmscoreIpa: at wof.p(:com.google.android.gms@214515028@21.45.15 (100400-411636772):4) -[stdout] 02-15 10:20:38.047 4770 4770 W GmscoreIpa: at wof.d(:com.google.android.gms@214515028@21.45.15 (100400-411636772):0) -[stdout] 02-15 10:20:38.047 4770 4770 W GmscoreIpa: at wof.g(:com.google.android.gms@214515028@21.45.15 (100400-411636772):19) -[stdout] 02-15 10:20:38.047 4770 4770 W GmscoreIpa: at wof.onConnectionFailed(:com.google.android.gms@214515028@21.45.15 (100400-411636772):0) -[stdout] 02-15 10:20:38.047 4770 4770 W GmscoreIpa: at xgi.gE(:com.google.android.gms@214515028@21.45.15 (100400-411636772):0) -[stdout] 02-15 10:20:38.047 4770 4770 W GmscoreIpa: at xfi.b(:com.google.android.gms@214515028@21.45.15 (100400-411636772):1) -[stdout] 02-15 10:20:38.047 4770 4770 W GmscoreIpa: at xez.a(:com.google.android.gms@214515028@21.45.15 (100400-411636772):7) -[stdout] 02-15 10:20:38.047 4770 4770 W GmscoreIpa: at xfc.handleMessage(:com.google.android.gms@214515028@21.45.15 (100400-411636772):23) -[stdout] 02-15 10:20:38.047 4770 4770 W GmscoreIpa: at android.os.Handler.dispatchMessage(Handler.java:106) -[stdout] 02-15 10:20:38.047 4770 4770 W GmscoreIpa: at alyk.jj(:com.google.android.gms@214515028@21.45.15 (100400-411636772):0) -[stdout] 02-15 10:20:38.047 4770 4770 W GmscoreIpa: at alyk.dispatchMessage(:com.google.android.gms@214515028@21.45.15 (100400-411636772):11) -[stdout] 02-15 10:20:38.047 4770 4770 W GmscoreIpa: at android.os.Looper.loop(Looper.java:193) -[stdout] 02-15 10:20:38.047 4770 4770 W GmscoreIpa: at android.os.HandlerThread.run(HandlerThread.java:65) -[stdout] 02-15 10:20:38.047 4770 4889 W Icing : IndexManager failed to initialize. SearchIndex.API is unavailable. -[stdout] 02-15 10:20:38.047 1735 1751 D AutofillUI: destroySaveUiUiThread(): already destroyed -[stdout] 02-15 10:20:38.047 1735 1749 D AutofillManagerServiceImpl: Set component for user 0 as AutofillServiceInfo[ServiceInfo{cb4dded com.google.android.gms.autofill.service.AutofillService}, settings:com.google.android.gms.autofill.ui.AutofillSettingsActivity, hasCompatPckgs:false] -[stdout] 02-15 10:20:38.047 1735 1750 I ActivityManager: Force stopping dev.flutter.scenarios.test appid=10099 user=-1: deletePackageX -[stdout] 02-15 10:20:38.047 4770 4770 D BoundBrokerSvc: onUnbind: Intent { act=com.google.android.gms.common.BIND_SHARED_PREFS pkg=com.google.android.gms } -[stdout] 02-15 10:20:38.048 4770 4876 W Icing : IndexManager failed to initialize. SearchIndex.API is unavailable. -[stdout] 02-15 10:20:38.048 4770 6820 W IcingInternalCorpora: Couldn't fetch status for corpus apps -[stdout] 02-15 10:20:38.048 4770 6804 W IcingInternalCorpora: Failed to get global search sources -[stdout] 02-15 10:20:38.048 1735 1749 I GnssLocationProvider: WakeLock released by handleMessage(REPORT_SV_STATUS, 0, com.android.server.location.GnssLocationProvider$SvStatusInfo@5ee1496) -[stdout] 02-15 10:20:38.051 4721 6812 I Fitness : FitCleanupIntentOperation received Intent android.intent.action.PACKAGE_REMOVED [CONTEXT service_id=17 ] -[stdout] 02-15 10:20:38.074 2863 5308 D RcsProvisioning: No backup token found -[stdout] 02-15 10:20:38.101 3621 3621 I CarrierServices: [2] aww.a: Unbinding RcsMigrationService -[stdout] 02-15 10:20:38.101 1579 1579 I keystore: clear_uid 10099 -[stdout] 02-15 10:20:38.103 1735 1763 D PackageManager: Instant App installer not found with android.intent.action.INSTALL_INSTANT_APP_PACKAGE -[stdout] 02-15 10:20:38.103 1735 1763 D PackageManager: Clear ephemeral installer activity -[stdout] 02-15 10:20:38.104 3621 3621 E CarrierServices: [2] btx.a: Invalid signature found for com.android.contacts: E39B7BFBE0A67D78292F6CC62E06CA27A2EBF255 -[stdout] 02-15 10:20:38.106 3621 3621 E CarrierServices: [2] btx.a: Invalid signature found for com.android.contacts: E39B7BFBE0A67D78292F6CC62E06CA27A2EBF255 -[stdout] 02-15 10:20:38.119 1735 1763 I system_server: Explicit concurrent copying GC freed 30159(1729KB) AllocSpace objects, 12(496KB) LOS objects, 40% free, 8MB/14MB, paused 18us total 15.908ms diff --git a/engine/src/flutter/testing/scenario_app/bin/utils/screenshot_transformer.dart b/engine/src/flutter/testing/scenario_app/bin/utils/screenshot_transformer.dart deleted file mode 100644 index d29f01cca2..0000000000 --- a/engine/src/flutter/testing/scenario_app/bin/utils/screenshot_transformer.dart +++ /dev/null @@ -1,72 +0,0 @@ -// 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 'dart:async'; -import 'dart:convert'; -import 'dart:typed_data'; - -/// A screenshot from the Android emulator. -class Screenshot { - Screenshot(this.filename, this.fileContent, this.pixelCount); - - /// The name of the screenshot. - final String filename; - - /// The binary content of the screenshot. - final Uint8List fileContent; - - /// The number of pixels in the screenshot. - final int pixelCount; -} - -/// Takes the input stream and transforms it into [Screenshot]s. -class ScreenshotBlobTransformer extends StreamTransformerBase { - const ScreenshotBlobTransformer(); - - @override - Stream bind(Stream stream) async* { - final BytesBuilder pending = BytesBuilder(); - - await for (final Uint8List blob in stream) { - pending.add(blob); - - if (pending.length < 12) { - continue; - } - - // See ScreenshotUtil#writeFile in ScreenshotUtil.java for producer side. - final Uint8List bytes = pending.toBytes(); - final ByteData byteData = bytes.buffer.asByteData(); - - int off = 0; - final int fnameLen = byteData.getInt32(off); - off += 4; - final int fcontentLen = byteData.getInt32(off); - off += 4; - final int pixelCount = byteData.getInt32(off); - off += 4; - - assert(fnameLen > 0); - assert(fcontentLen > 0); - assert(pixelCount > 0); - - if (pending.length < off + fnameLen) { - continue; - } - - final String filename = utf8.decode(bytes.buffer.asUint8List(off, fnameLen)); - off += fnameLen; - if (pending.length < off + fcontentLen) { - continue; - } - - final Uint8List fileContent = bytes.buffer.asUint8List(off, fcontentLen); - off += fcontentLen; - pending.clear(); - pending.add(bytes.buffer.asUint8List(off)); - - yield Screenshot('$filename.png', fileContent, pixelCount); - } - } -} diff --git a/engine/src/flutter/testing/scenario_app/ios/FlutterAppExtensionTestHost/FlutterAppExtensionTestHost/AppDelegate.h b/engine/src/flutter/testing/scenario_app/ios/FlutterAppExtensionTestHost/FlutterAppExtensionTestHost/AppDelegate.h deleted file mode 100644 index 6c4e04002c..0000000000 --- a/engine/src/flutter/testing/scenario_app/ios/FlutterAppExtensionTestHost/FlutterAppExtensionTestHost/AppDelegate.h +++ /dev/null @@ -1,14 +0,0 @@ -// 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_SCENARIO_APP_IOS_FLUTTERAPPEXTENSIONTESTHOST_FLUTTERAPPEXTENSIONTESTHOST_APPDELEGATE_H_ -#define FLUTTER_TESTING_SCENARIO_APP_IOS_FLUTTERAPPEXTENSIONTESTHOST_FLUTTERAPPEXTENSIONTESTHOST_APPDELEGATE_H_ - -#import - -@interface AppDelegate : UIResponder - -@end - -#endif // FLUTTER_TESTING_SCENARIO_APP_IOS_FLUTTERAPPEXTENSIONTESTHOST_FLUTTERAPPEXTENSIONTESTHOST_APPDELEGATE_H_ diff --git a/engine/src/flutter/testing/scenario_app/ios/FlutterAppExtensionTestHost/FlutterAppExtensionTestHost/SceneDelegate.h b/engine/src/flutter/testing/scenario_app/ios/FlutterAppExtensionTestHost/FlutterAppExtensionTestHost/SceneDelegate.h deleted file mode 100644 index 95dfc1cefe..0000000000 --- a/engine/src/flutter/testing/scenario_app/ios/FlutterAppExtensionTestHost/FlutterAppExtensionTestHost/SceneDelegate.h +++ /dev/null @@ -1,16 +0,0 @@ -// 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_SCENARIO_APP_IOS_FLUTTERAPPEXTENSIONTESTHOST_FLUTTERAPPEXTENSIONTESTHOST_SCENEDELEGATE_H_ -#define FLUTTER_TESTING_SCENARIO_APP_IOS_FLUTTERAPPEXTENSIONTESTHOST_FLUTTERAPPEXTENSIONTESTHOST_SCENEDELEGATE_H_ - -#import - -@interface SceneDelegate : UIResponder - -@property(strong, nonatomic) UIWindow* window; - -@end - -#endif // FLUTTER_TESTING_SCENARIO_APP_IOS_FLUTTERAPPEXTENSIONTESTHOST_FLUTTERAPPEXTENSIONTESTHOST_SCENEDELEGATE_H_ diff --git a/engine/src/flutter/testing/scenario_app/ios/FlutterAppExtensionTestHost/FlutterAppExtensionTestHost/ViewController.h b/engine/src/flutter/testing/scenario_app/ios/FlutterAppExtensionTestHost/FlutterAppExtensionTestHost/ViewController.h deleted file mode 100644 index 397bc20aa8..0000000000 --- a/engine/src/flutter/testing/scenario_app/ios/FlutterAppExtensionTestHost/FlutterAppExtensionTestHost/ViewController.h +++ /dev/null @@ -1,14 +0,0 @@ -// 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_SCENARIO_APP_IOS_FLUTTERAPPEXTENSIONTESTHOST_FLUTTERAPPEXTENSIONTESTHOST_VIEWCONTROLLER_H_ -#define FLUTTER_TESTING_SCENARIO_APP_IOS_FLUTTERAPPEXTENSIONTESTHOST_FLUTTERAPPEXTENSIONTESTHOST_VIEWCONTROLLER_H_ - -#import - -@interface ViewController : UIViewController - -@end - -#endif // FLUTTER_TESTING_SCENARIO_APP_IOS_FLUTTERAPPEXTENSIONTESTHOST_FLUTTERAPPEXTENSIONTESTHOST_VIEWCONTROLLER_H_ diff --git a/engine/src/flutter/testing/scenario_app/ios/Runner/GeneratedPluginRegistrant.h b/engine/src/flutter/testing/scenario_app/ios/Runner/GeneratedPluginRegistrant.h deleted file mode 100644 index 8db549ca77..0000000000 --- a/engine/src/flutter/testing/scenario_app/ios/Runner/GeneratedPluginRegistrant.h +++ /dev/null @@ -1,19 +0,0 @@ -// -// Generated file. Do not edit. -// - -// clang-format off - -#ifndef FLUTTER_TESTING_SCENARIO_APP_IOS_RUNNER_GENERATEDPLUGINREGISTRANT_H_ -#define FLUTTER_TESTING_SCENARIO_APP_IOS_RUNNER_GENERATEDPLUGINREGISTRANT_H_ - -#import - -NS_ASSUME_NONNULL_BEGIN - -@interface GeneratedPluginRegistrant : NSObject -+ (void)registerWithRegistry:(NSObject*)registry; -@end - -NS_ASSUME_NONNULL_END -#endif // FLUTTER_TESTING_SCENARIO_APP_IOS_RUNNER_GENERATEDPLUGINREGISTRANT_H_ diff --git a/engine/src/flutter/testing/scenario_app/ios/Runner/GeneratedPluginRegistrant.m b/engine/src/flutter/testing/scenario_app/ios/Runner/GeneratedPluginRegistrant.m deleted file mode 100644 index efe65ecccf..0000000000 --- a/engine/src/flutter/testing/scenario_app/ios/Runner/GeneratedPluginRegistrant.m +++ /dev/null @@ -1,14 +0,0 @@ -// -// Generated file. Do not edit. -// - -// clang-format off - -#import "GeneratedPluginRegistrant.h" - -@implementation GeneratedPluginRegistrant - -+ (void)registerWithRegistry:(NSObject*)registry { -} - -@end diff --git a/engine/src/flutter/testing/scenario_app/ios/Scenarios/ScenariosShare/ShareViewController.h b/engine/src/flutter/testing/scenario_app/ios/Scenarios/ScenariosShare/ShareViewController.h deleted file mode 100644 index 133213bd1c..0000000000 --- a/engine/src/flutter/testing/scenario_app/ios/Scenarios/ScenariosShare/ShareViewController.h +++ /dev/null @@ -1,15 +0,0 @@ -// 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_SCENARIO_APP_IOS_SCENARIOS_SCENARIOSSHARE_SHAREVIEWCONTROLLER_H_ -#define FLUTTER_TESTING_SCENARIO_APP_IOS_SCENARIOS_SCENARIOSSHARE_SHAREVIEWCONTROLLER_H_ - -#import -#import - -@interface ShareViewController : FlutterViewController - -@end - -#endif // FLUTTER_TESTING_SCENARIO_APP_IOS_SCENARIOS_SCENARIOSSHARE_SHAREVIEWCONTROLLER_H_ diff --git a/engine/src/flutter/testing/scenario_app/test/adb_log_filter_test.dart b/engine/src/flutter/testing/scenario_app/test/adb_log_filter_test.dart deleted file mode 100644 index 42f0e00ac9..0000000000 --- a/engine/src/flutter/testing/scenario_app/test/adb_log_filter_test.dart +++ /dev/null @@ -1,134 +0,0 @@ -import 'package:test/test.dart'; - -import '../bin/utils/adb_logcat_filtering.dart'; -import 'src/fake_adb_logcat.dart'; - -void main() { - /// Simulates the filtering of logcat output [lines]. - Iterable filter(Iterable lines, {int? filterProcessId}) { - if (lines.isEmpty) { - throw StateError('No log lines to filter. This is unexpected.'); - } - return lines.where((String line) { - final AdbLogLine? logLine = AdbLogLine.tryParse(line); - if (logLine == null) { - throw StateError('Invalid log line: $line'); - } - final bool isVerbose = logLine.isVerbose(filterProcessId: filterProcessId?.toString()); - return !isVerbose; - }); - } - - test('should always retain fatal logs', () { - final FakeAdbLogcat logcat = FakeAdbLogcat(); - final FakeAdbProcess process = logcat.process(); - process.fatal('Something', 'A bad thing happened'); - - final Iterable filtered = filter(logcat.drain()); - expect(filtered, hasLength(1)); - expect(filtered.first, contains('Something: A bad thing happened')); - }); - - test('should never retain debug logs', () { - final FakeAdbLogcat logcat = FakeAdbLogcat(); - final FakeAdbProcess process = logcat.process(); - final String tag = AdbLogLine.knownNoiseTags.first; - process.debug(tag, 'A debug message'); - - final Iterable filtered = filter(logcat.drain()); - expect(filtered, isEmpty); - }); - - test('should never retain logs from known "noise" tags', () { - final FakeAdbLogcat logcat = FakeAdbLogcat(); - final FakeAdbProcess process = logcat.process(); - final String tag = AdbLogLine.knownNoiseTags.first; - process.info(tag, 'Flutter flutter flutter'); - - final Iterable filtered = filter(logcat.drain()); - expect(filtered, isEmpty); - }); - - test('should always retain logs from known "useful" tags', () { - final FakeAdbLogcat logcat = FakeAdbLogcat(); - final FakeAdbProcess process = logcat.process(); - final String tag = AdbLogLine.knownUsefulTags.first; - process.info(tag, 'A useful message'); - - final Iterable filtered = filter(logcat.drain()); - expect(filtered, hasLength(1)); - expect(filtered.first, contains('$tag: A useful message')); - }); - - test('if a process ID is passed, retain the log', () { - final FakeAdbLogcat logcat = FakeAdbLogcat(); - final FakeAdbProcess process = logcat.process(); - process.info('SomeTag', 'A message'); - - final Iterable filtered = filter(logcat.drain(), filterProcessId: process.processId); - expect(filtered, hasLength(1)); - expect(filtered.first, contains('SomeTag: A message')); - }); - - test('even if a process ID passed, retain logs containing "flutter"', () { - final FakeAdbLogcat logcat = FakeAdbLogcat(); - final FakeAdbProcess process = logcat.process(); - process.info('SomeTag', 'A message with flutter'); - - final Iterable filtered = filter(logcat.drain(), filterProcessId: process.processId); - expect(filtered, hasLength(1)); - expect(filtered.first, contains('SomeTag: A message with flutter')); - }); - - test('should retain E-level flags from known "useful" error tags', () { - final FakeAdbLogcat logcat = FakeAdbLogcat(); - final FakeAdbProcess process = logcat.process(); - final String tag = AdbLogLine.knownUsefulErrorTags.first; - process.error(tag, 'An error message'); - process.info(tag, 'An info message'); - - final Iterable filtered = filter(logcat.drain()); - expect(filtered, hasLength(1)); - expect(filtered.first, contains('$tag: An error message')); - }); - - test('should filter out error logs from unimportant processes', () { - final FakeAdbLogcat logcat = FakeAdbLogcat(); - final FakeAdbProcess process = logcat.process(); - - // I hate this one. - const String tag = 'gs.intelligence'; - process.error(tag, 'No package ID ff found for resource ID 0xffffffff.'); - - final Iterable filtered = filter(logcat.drain()); - expect(filtered, isEmpty); - }); - - test('should filter the flutter-launched process, not just any process', () { - final FakeAdbLogcat logcat = FakeAdbLogcat(); - - final FakeAdbProcess device = logcat.process(); - final FakeAdbProcess unrelated = logcat.process(); - final FakeAdbProcess flutter = logcat.process(); - - device.info( - AdbLogLine.activityManagerTag, - 'Start proc ${unrelated.processId}:com.example.unrelated', - ); - - List rawLines = logcat.drain(); - expect(rawLines, hasLength(1)); - AdbLogLine parsedLogLine = AdbLogLine.tryParse(rawLines.single)!; - expect(parsedLogLine.tryParseProcess(), isNull); - - device.info( - AdbLogLine.activityManagerTag, - 'Start proc ${flutter.processId}:${AdbLogLine.flutterProcessName}', - ); - - rawLines = logcat.drain(); - expect(rawLines, hasLength(1)); - parsedLogLine = AdbLogLine.tryParse(rawLines.single)!; - expect(parsedLogLine.tryParseProcess(), '${flutter.processId}'); - }); -} diff --git a/engine/src/flutter/testing/scenario_app/test/src/fake_adb_logcat.dart b/engine/src/flutter/testing/scenario_app/test/src/fake_adb_logcat.dart deleted file mode 100644 index 40ba5bebb5..0000000000 --- a/engine/src/flutter/testing/scenario_app/test/src/fake_adb_logcat.dart +++ /dev/null @@ -1,139 +0,0 @@ -import '../../bin/utils/adb_logcat_filtering.dart'; - -/// Simulates the output of `adb logcat`, i.e. for testing. -/// -/// ## Example -/// -/// ```dart -/// final FakeAdbLogcat logcat = FakeAdbLogcat(); -/// final FakeAdbProcess process = logcat.withProcess(); -/// process.info('ActivityManager', 'Force stopping dev.flutter.scenarios appid=10226 user=0: start instr'); -/// // ... -/// final List logLines = logcat.drain(); -/// // ... -/// ``` -final class FakeAdbLogcat { - final List _lines = []; - final Map _processById = {}; - - /// The current date and time. - DateTime _now = DateTime.now(); - - /// Returns the date and time for the next log line. - /// - /// Time is progressed by 1 second each time this method is called. - DateTime _progressTime({Duration by = const Duration(seconds: 1)}) { - _now = _now.add(by); - return _now; - } - - /// `02-22 13:54:39.839` - static String _formatTime(DateTime time) { - return '${time.month.toString().padLeft(2, '0')}-' - '${time.day.toString().padLeft(2, '0')} ' - '${time.hour.toString().padLeft(2, '0')}:' - '${time.minute.toString().padLeft(2, '0')}:' - '${time.second.toString().padLeft(2, '0')}.' - '${time.millisecond.toString().padLeft(3, '0')}'; - } - - void _write({ - required int processId, - required int threadId, - required String severity, - required String tag, - required String message, - }) { - final DateTime time = _progressTime(); - final String line = '${_formatTime(time)} $processId $threadId $severity $tag: $message'; - assert(AdbLogLine.tryParse(line) != null, 'Invalid log line: $line'); - _lines.add(line); - } - - /// Drains the stored log lines and returns them. - List drain() { - final List result = List.from(_lines); - _lines.clear(); - return result; - } - - /// Creates a new process writing to this logcat. - /// - /// Optionally specify a [processId] to use for the process, otherwise a - /// simple default is used (sequential numbers starting from 1000). - FakeAdbProcess process({int? processId}) { - processId ??= 1000 + _processById.length; - return _processById.putIfAbsent(processId, () => _createProcess(processId: processId!)); - } - - FakeAdbProcess _createProcess({required int processId}) { - return FakeAdbProcess._(this, processId: processId); - } -} - -/// A stateful fixture that represents a fake process writing to `adb logcat`. -/// -/// See [FakeAdbLogcat.process] for how to create this fixture. -final class FakeAdbProcess { - const FakeAdbProcess._(this._logcat, {required this.processId}); - - final FakeAdbLogcat _logcat; - - /// The process ID of this process. - final int processId; - - /// Writes a debug log message. - void debug(String tag, String message, {int threadId = 1}) { - _logcat._write( - processId: processId, - threadId: threadId, - severity: 'D', - tag: tag, - message: message, - ); - } - - /// Writes an info log message. - void info(String tag, String message, {int threadId = 1}) { - _logcat._write( - processId: processId, - threadId: threadId, - severity: 'I', - tag: tag, - message: message, - ); - } - - /// Writes a warning log message. - void warning(String tag, String message, {int threadId = 1}) { - _logcat._write( - processId: processId, - threadId: threadId, - severity: 'W', - tag: tag, - message: message, - ); - } - - /// Writes an error log message. - void error(String tag, String message, {int threadId = 1}) { - _logcat._write( - processId: processId, - threadId: threadId, - severity: 'E', - tag: tag, - message: message, - ); - } - - /// Writes a fatal log message. - void fatal(String tag, String message, {int threadId = 1}) { - _logcat._write( - processId: processId, - threadId: threadId, - severity: 'F', - tag: tag, - message: message, - ); - } -} diff --git a/engine/src/flutter/testing/scenario_app/tool/deflake_android_tests.sh b/engine/src/flutter/testing/scenario_app/tool/deflake_android_tests.sh deleted file mode 100755 index 7940e00ff5..0000000000 --- a/engine/src/flutter/testing/scenario_app/tool/deflake_android_tests.sh +++ /dev/null @@ -1,73 +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. - -set -e - -# Needed because if it is set, cd may print the path it changed to. -unset CDPATH - -# On Mac OS, readlink -f doesn't work, so follow_links traverses the path one -# link at a time, and then cds into the link destination and find out where it -# ends up. -# -# The function is enclosed in a subshell to avoid changing the working directory -# of the caller. -function follow_links() ( - cd -P "$(dirname -- "$1")" - file="$PWD/$(basename -- "$1")" - while [[ -L "$file" ]]; do - cd -P "$(dirname -- "$file")" - file="$(readlink -- "$file")" - cd -P "$(dirname -- "$file")" - file="$PWD/$(basename -- "$file")" - done - echo "$file" -) - -SCRIPT_DIR=$(follow_links "$(dirname -- "${BASH_SOURCE[0]}")") -ENGINE_DIR="$(cd "$SCRIPT_DIR/../../.."; pwd -P)" - -# Find the Dart executable. -case "$(uname -s)" in - Linux) - OS="linux" - ;; - Darwin) - OS="macos" - ;; - *) - echo "The host platform is not supported by this tool" - exit 1 -esac - -case "$(uname -m)" in - arm64) - CPU="arm64" - ;; - x86_64) - CPU="x64" - ;; - *) - echo "The host platform is not supported by this tool" - exit 1 -esac - -PLATFORM="${OS}-${CPU}" -DART_SDK_DIR="${ENGINE_DIR}/prebuilts/${PLATFORM}/dart-sdk" -DART="${DART_SDK_DIR}/bin/dart" - -# Run the tool indefinitely until there is an error. -COUNT=0 -while true; do - COUNT=$((COUNT + 1)) - echo "Running test iteration $COUNT" - "$DART" "$SCRIPT_DIR/bin/run_android_tests.dart" "$@" - # Break if non-zero exit code. - if [ $? -ne 0 ]; then - echo "Error running tests. Exiting." - break - fi -done diff --git a/engine/src/flutter/testing/scenario_app/tool/logcat_reader.dart b/engine/src/flutter/testing/scenario_app/tool/logcat_reader.dart deleted file mode 100644 index f00f2b6f2e..0000000000 --- a/engine/src/flutter/testing/scenario_app/tool/logcat_reader.dart +++ /dev/null @@ -1,45 +0,0 @@ -// 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 'dart:io' as io; - -// It's bad to import a file from `bin` into `tool`. -// However this tool is not very important, so delete it if necessary. -import '../bin/utils/adb_logcat_filtering.dart'; - -/// A tiny tool to read saved `adb logcat` output and perform some analysis. -/// -/// This tool is not meant to be a full-fledged logcat reader. It's just a -/// simple tool that uses the [AdbLogLine] extension type to parse results of -/// `adb logcat` and explain what log tag names are most common. -void main(List args) { - if (args case [final String path]) { - final List parsed = - io.File(path) - .readAsLinesSync() - .map(AdbLogLine.tryParse) - .whereType() - // Filter out all debug logs. - .where((AdbLogLine line) => line.severity != 'D') - .toList(); - - final Map tagCounts = {}; - for (final AdbLogLine line in parsed) { - tagCounts[line.name] = (tagCounts[line.name] ?? 0) + 1; - } - - // Print in order of most common to least common. - final List> sorted = - tagCounts.entries.toList() - ..sort((MapEntry a, MapEntry b) => b.value.compareTo(a.value)); - for (final MapEntry entry in sorted) { - print("'${entry.key}', // ${entry.value}"); - } - - return; - } - - print('Usage: logcat_reader.dart '); - io.exitCode = 1; -} diff --git a/engine/src/flutter/tools/engine_tool/lib/src/gn.dart b/engine/src/flutter/tools/engine_tool/lib/src/gn.dart index b1a12799b5..e7f19a73bb 100644 --- a/engine/src/flutter/tools/engine_tool/lib/src/gn.dart +++ b/engine/src/flutter/tools/engine_tool/lib/src/gn.dart @@ -52,7 +52,7 @@ interface class Gn { ); if (process.exitCode != 0) { // If the error was in the format: - // "The input testing/scenario_app:scenario_app matches no targets, configs or files." + // "The input testing/foo:foo matches no targets, configs or files." // // Then report a nicer error, versus a fatal error. final stdout = process.stdout; diff --git a/engine/src/flutter/tools/engine_tool/test/commands/build_command_test.dart b/engine/src/flutter/tools/engine_tool/test/commands/build_command_test.dart index c0f20737dc..f9b57f2dd3 100644 --- a/engine/src/flutter/tools/engine_tool/test/commands/build_command_test.dart +++ b/engine/src/flutter/tools/engine_tool/test/commands/build_command_test.dart @@ -398,7 +398,7 @@ void main() { CannedProcess( (command) => command.contains('desc'), stdout: ''' -The input testing/scenario_app:sceario_app matches no targets, configs or files. +The input testing/foo:foo matches no targets, configs or files. ''', exitCode: 1, ), @@ -421,7 +421,7 @@ The input testing/scenario_app:sceario_app matches no targets, configs or files. '--config', 'ci/host_debug', // Intentionally omit the prefix '//flutter/' to trigger the warning. - '//testing/scenario_app', + '//testing/foo', ]); printOnFailure(testEnv.testLogs.map((r) => r.message).join('\n')); @@ -429,7 +429,7 @@ The input testing/scenario_app:sceario_app matches no targets, configs or files. expect( testEnv.testLogs.map((LogRecord r) => r.message).join(), - contains('No targets matched the pattern `testing/scenario_app'), + contains('No targets matched the pattern `testing/foo'), ); }); diff --git a/engine/src/flutter/tools/pub_get_offline.py b/engine/src/flutter/tools/pub_get_offline.py index c56d74f805..76d590b1bf 100644 --- a/engine/src/flutter/tools/pub_get_offline.py +++ b/engine/src/flutter/tools/pub_get_offline.py @@ -29,7 +29,7 @@ ALL_PACKAGES = [ os.path.join(ENGINE_DIR, 'shell', 'vmservice'), os.path.join(ENGINE_DIR, 'testing', 'benchmark'), os.path.join(ENGINE_DIR, 'testing', 'dart'), - os.path.join(ENGINE_DIR, 'testing', 'scenario_app'), + os.path.join(ENGINE_DIR, 'testing', 'ios_scenario_app'), os.path.join(ENGINE_DIR, 'testing', 'skia_gold_client'), os.path.join(ENGINE_DIR, 'testing', 'smoke_test_failure'), os.path.join(ENGINE_DIR, 'testing', 'symbols'),