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

&2m`R?6Q2L-0hV0~+~i7? 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 DJ*a{? diff --git a/engine/src/flutter/testing/scenario_app/android/app/src/main/java/dev/flutter/scenarios/ExternalTextureFlutterActivity.java b/engine/src/flutter/testing/scenario_app/android/app/src/main/java/dev/flutter/scenarios/ExternalTextureFlutterActivity.java deleted file mode 100644 index 753f2e2690..0000000000 --- a/engine/src/flutter/testing/scenario_app/android/app/src/main/java/dev/flutter/scenarios/ExternalTextureFlutterActivity.java +++ /dev/null @@ -1,449 +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.content.res.AssetFileDescriptor; -import android.graphics.Canvas; -import android.graphics.ImageFormat; -import android.graphics.LinearGradient; -import android.graphics.Paint; -import android.graphics.Shader.TileMode; -import android.hardware.HardwareBuffer; -import android.media.Image; -import android.media.ImageReader; -import android.media.ImageWriter; -import android.media.MediaCodec; -import android.media.MediaExtractor; -import android.media.MediaFormat; -import android.os.Build.VERSION; -import android.os.Bundle; -import android.os.Handler; -import android.os.HandlerThread; -import android.util.Log; -import android.view.Gravity; -import android.view.Surface; -import android.view.SurfaceHolder; -import android.view.SurfaceView; -import android.view.ViewGroup; -import android.widget.FrameLayout; -import android.widget.FrameLayout.LayoutParams; -import androidx.annotation.NonNull; -import androidx.annotation.Nullable; -import androidx.annotation.RequiresApi; -import androidx.core.util.Supplier; -import io.flutter.view.TextureRegistry; -import java.io.IOException; -import java.nio.ByteBuffer; -import java.util.Map; -import java.util.Objects; -import java.util.concurrent.CountDownLatch; - -public class ExternalTextureFlutterActivity extends TestActivity { - static final String TAG = "Scenarios"; - private static final int SURFACE_WIDTH = 192; - private static final int SURFACE_HEIGHT = 256; - - private SurfaceRenderer flutterRenderer; - - // Latch used to ensure both SurfaceRenderers produce a frame before taking a screenshot. - private final CountDownLatch firstFrameLatch = new CountDownLatch(1); - - private long textureId = 0; - private TextureRegistry.SurfaceProducer surfaceProducer; - - @Override - protected void onCreate(@Nullable Bundle savedInstanceState) { - super.onCreate(savedInstanceState); - - String surfaceRenderer = getIntent().getStringExtra("surface_renderer"); - assert surfaceRenderer != null; - flutterRenderer = selectSurfaceRenderer(surfaceRenderer); - - // Create and place a SurfaceView above the Flutter content. - SurfaceView surfaceView = new SurfaceView(getContext()); - surfaceView.setZOrderMediaOverlay(true); - surfaceView.setMinimumWidth(SURFACE_WIDTH); - surfaceView.setMinimumHeight(SURFACE_HEIGHT); - - FrameLayout frameLayout = new FrameLayout(getContext()); - frameLayout.addView( - surfaceView, - new LayoutParams( - ViewGroup.LayoutParams.WRAP_CONTENT, - ViewGroup.LayoutParams.WRAP_CONTENT, - Gravity.BOTTOM | Gravity.CENTER_HORIZONTAL)); - - addContentView( - frameLayout, - new ViewGroup.LayoutParams( - ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT)); - - SurfaceHolder surfaceHolder = surfaceView.getHolder(); - surfaceHolder.setFixedSize(SURFACE_WIDTH, SURFACE_HEIGHT); - } - - @Override - public void waitUntilFlutterRendered() { - super.waitUntilFlutterRendered(); - - try { - firstFrameLatch.await(); - } catch (InterruptedException e) { - throw new RuntimeException(e); - } - } - - private SurfaceRenderer selectSurfaceRenderer(String surfaceRenderer) { - switch (surfaceRenderer) { - case "image": - if (VERSION.SDK_INT >= 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'),