From 5a2a092765a786048b98064d1c242797c100fdd1 Mon Sep 17 00:00:00 2001 From: Matan Lurey Date: Tue, 20 Feb 2024 13:33:47 -0800 Subject: [PATCH 01/10] Rename and disallow files named . --- ci/analyze.sh | 28 +++++++--- ci/format.sh | 21 ++++++- ci/test/format_no_generated_java_test.sh | 55 +++++++++++++++++++ .../android/FlutterActivityTest.java | 10 ++-- .../android/FlutterFragmentActivityTest.java | 16 +++--- .../FlutterEngineGroupComponentTest.java | 14 ++--- .../embedding/engine/FlutterEngineTest.java | 32 +++++------ ...ava => FakeGeneratedPluginRegistrant.java} | 2 +- 8 files changed, 132 insertions(+), 46 deletions(-) create mode 100755 ci/test/format_no_generated_java_test.sh rename shell/platform/android/test/io/flutter/plugins/{GeneratedPluginRegistrant.java => FakeGeneratedPluginRegistrant.java} (97%) diff --git a/ci/analyze.sh b/ci/analyze.sh index 6b57a819a0119..6fe63e0d9f988 100755 --- a/ci/analyze.sh +++ b/ci/analyze.sh @@ -28,7 +28,10 @@ function follow_links() ( ) SCRIPT_DIR=$(follow_links "$(dirname -- "${BASH_SOURCE[0]}")") -SRC_DIR="$(cd "$SCRIPT_DIR/../.."; pwd -P)" +SRC_DIR="$( + cd "$SCRIPT_DIR/../.." + pwd -P +)" FLUTTER_DIR="$SRC_DIR/flutter" DART_BIN="$SRC_DIR/out/host_debug_unopt/dart-sdk/bin" DART="$DART_BIN/dart" @@ -58,15 +61,26 @@ echo "" # Check that dart libraries conform. echo "Checking the integrity of the Web SDK" -(cd "$FLUTTER_DIR/web_sdk"; "$DART" pub get) -(cd "$FLUTTER_DIR/web_sdk/web_test_utils"; "$DART" pub get) -(cd "$FLUTTER_DIR/web_sdk/web_engine_tester"; "$DART" pub get) +( + cd "$FLUTTER_DIR/web_sdk" + "$DART" pub get +) +( + cd "$FLUTTER_DIR/web_sdk/web_test_utils" + "$DART" pub get +) +( + cd "$FLUTTER_DIR/web_sdk/web_engine_tester" + "$DART" pub get +) "$DART" analyze --fatal-infos --fatal-warnings "$FLUTTER_DIR/web_sdk" WEB_SDK_TEST_FILES="$FLUTTER_DIR/web_sdk/test/*" -for testFile in $WEB_SDK_TEST_FILES -do +for testFile in $WEB_SDK_TEST_FILES; do echo "Running $testFile" - (cd "$FLUTTER_DIR"; FLUTTER_DIR="$FLUTTER_DIR" "$DART" --enable-asserts $testFile) + ( + cd "$FLUTTER_DIR" + FLUTTER_DIR="$FLUTTER_DIR" "$DART" --enable-asserts $testFile + ) done diff --git a/ci/format.sh b/ci/format.sh index 0425eb380eb7c..262a0a814b198 100755 --- a/ci/format.sh +++ b/ci/format.sh @@ -18,7 +18,7 @@ unset CDPATH function follow_links() ( cd -P "$(dirname -- "$1")" file="$PWD/$(basename -- "$1")" - while [[ -h "$file" ]]; do + while [[ -L "$file" ]]; do cd -P "$(dirname -- "$file")" file="$(readlink -- "$file")" cd -P "$(dirname -- "$file")" @@ -28,10 +28,27 @@ function follow_links() ( ) SCRIPT_DIR=$(follow_links "$(dirname -- "${BASH_SOURCE[0]}")") -SRC_DIR="$(cd "$SCRIPT_DIR/../.."; pwd -P)" +SRC_DIR="$( + cd "$SCRIPT_DIR/../.." + pwd -P +)" DART_SDK_DIR="${SRC_DIR}/third_party/dart/tools/sdks/dart-sdk" DART="${DART_SDK_DIR}/bin/dart" +# Check if a file named **/GeneratedPluginRegistrant.java exists in the project. +# If it does, fail the build and print a message to the user pointing them to +# the file and instructing them to remove it. +# +# See: https://github.com/flutter/flutter/issues/143782. +GENERATED_PLUGIN_REGISTRANT_PATH=$(find "$SRC_DIR/flutter" -name "GeneratedPluginRegistrant.java") +if [[ -n "$GENERATED_PLUGIN_REGISTRANT_PATH" ]]; then + echo "GeneratedPluginRegistrant.java found in the project." + echo "This file is generated by Flutter tooling and should not be checked in." + echo "Please remove it from the project and try again." + echo "Path: $GENERATED_PLUGIN_REGISTRANT_PATH" + exit 1 +fi + cd "$SCRIPT_DIR" "$DART" \ --disable-dart-dev \ diff --git a/ci/test/format_no_generated_java_test.sh b/ci/test/format_no_generated_java_test.sh new file mode 100755 index 0000000000000..919abfa97ae9e --- /dev/null +++ b/ci/test/format_no_generated_java_test.sh @@ -0,0 +1,55 @@ +#!/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]}")") +SRC_DIR="$( + cd "$SCRIPT_DIR/../../.." + pwd -P +)" +FLUTTER_DIR="$SRC_DIR/flutter" + +# Creates a file named `GeneratedPluginRegistrant.java` in the project. +# This file is generated by Flutter tooling and should not be checked in. +touch "$FLUTTER_DIR/GeneratedPluginRegistrant.java" + +# Create a trap that, on exit, removes the file. +function cleanup() { + rm -f "$FLUTTER_DIR/GeneratedPluginRegistrant.java" +} +trap cleanup EXIT + +# Runs ../format.sh and verifies that it fails with the expected error message. +# If it fails, the script prints an error message and exits with a non-zero status. +"$FLUTTER_DIR/ci/format.sh" || { + echo "PASS: analyze.sh failed as expected" + exit 0 +} + +echo "FAIL: format.sh did not fail as expected" +exit 1 diff --git a/shell/platform/android/test/io/flutter/embedding/android/FlutterActivityTest.java b/shell/platform/android/test/io/flutter/embedding/android/FlutterActivityTest.java index 30dd648beac6e..ec4603ed1473d 100644 --- a/shell/platform/android/test/io/flutter/embedding/android/FlutterActivityTest.java +++ b/shell/platform/android/test/io/flutter/embedding/android/FlutterActivityTest.java @@ -38,7 +38,7 @@ import io.flutter.embedding.engine.plugins.activity.ActivityAware; import io.flutter.embedding.engine.plugins.activity.ActivityPluginBinding; import io.flutter.embedding.engine.plugins.activity.ActivityPluginBinding.OnSaveInstanceStateListener; -import io.flutter.plugins.GeneratedPluginRegistrant; +import io.flutter.plugins.FakeGeneratedPluginRegistrant; import java.util.ArrayList; import java.util.Arrays; import java.util.List; @@ -59,7 +59,7 @@ public class FlutterActivityTest { @Before public void setUp() { FlutterInjector.reset(); - GeneratedPluginRegistrant.clearRegisteredEngines(); + FakeGeneratedPluginRegistrant.clearRegisteredEngines(); FlutterJNI mockFlutterJNI = mock(FlutterJNI.class); when(mockFlutterJNI.isAttached()).thenReturn(true); FlutterJNI.Factory mockFlutterJNIFactory = mock(FlutterJNI.Factory.class); @@ -70,7 +70,7 @@ public void setUp() { @After public void tearDown() { - GeneratedPluginRegistrant.clearRegisteredEngines(); + FakeGeneratedPluginRegistrant.clearRegisteredEngines(); FlutterInjector.reset(); } @@ -310,7 +310,7 @@ public void itRegistersPluginsAtConfigurationTime() { // configureFlutterEngine which registers the plugins. activity.onCreate(null); - List registeredEngines = GeneratedPluginRegistrant.getRegisteredEngines(); + List registeredEngines = FakeGeneratedPluginRegistrant.getRegisteredEngines(); assertEquals(1, registeredEngines.size()); assertEquals(activity.getFlutterEngine(), registeredEngines.get(0)); } @@ -423,7 +423,7 @@ public void itDoesNotRegisterPluginsTwiceWhenUsingACachedEngine() { FlutterActivityWithProvidedEngine flutterActivity = activityController.get(); flutterActivity.configureFlutterEngine(flutterActivity.getFlutterEngine()); - List registeredEngines = GeneratedPluginRegistrant.getRegisteredEngines(); + List registeredEngines = FakeGeneratedPluginRegistrant.getRegisteredEngines(); // This might cause the plugins to be registered twice, once by the FlutterEngine constructor, // and once by the default FlutterActivity.configureFlutterEngine implementation. // Test that it doesn't happen. diff --git a/shell/platform/android/test/io/flutter/embedding/android/FlutterFragmentActivityTest.java b/shell/platform/android/test/io/flutter/embedding/android/FlutterFragmentActivityTest.java index 17960263e996a..f648d805c070d 100644 --- a/shell/platform/android/test/io/flutter/embedding/android/FlutterFragmentActivityTest.java +++ b/shell/platform/android/test/io/flutter/embedding/android/FlutterFragmentActivityTest.java @@ -26,7 +26,7 @@ import io.flutter.embedding.engine.FlutterEngine; import io.flutter.embedding.engine.FlutterJNI; import io.flutter.embedding.engine.loader.FlutterLoader; -import io.flutter.plugins.GeneratedPluginRegistrant; +import io.flutter.plugins.FakeGeneratedPluginRegistrant; import java.util.List; import org.junit.After; import org.junit.Before; @@ -43,7 +43,7 @@ public class FlutterFragmentActivityTest { @Before public void setUp() { FlutterInjector.reset(); - GeneratedPluginRegistrant.clearRegisteredEngines(); + FakeGeneratedPluginRegistrant.clearRegisteredEngines(); FlutterJNI mockFlutterJNI = mock(FlutterJNI.class); when(mockFlutterJNI.isAttached()).thenReturn(true); FlutterJNI.Factory mockFlutterJNIFactory = mock(FlutterJNI.Factory.class); @@ -54,7 +54,7 @@ public void setUp() { @After public void tearDown() { - GeneratedPluginRegistrant.clearRegisteredEngines(); + FakeGeneratedPluginRegistrant.clearRegisteredEngines(); FlutterInjector.reset(); } @@ -117,7 +117,7 @@ public void itRegistersPluginsAtConfigurationTime() { scenario.onActivity( activity -> { List registeredEngines = - GeneratedPluginRegistrant.getRegisteredEngines(); + FakeGeneratedPluginRegistrant.getRegisteredEngines(); assertEquals(1, registeredEngines.size()); assertEquals(activity.getFlutterEngine(), registeredEngines.get(0)); }); @@ -131,13 +131,13 @@ public void itDoesNotRegisterPluginsTwiceWhenUsingACachedEngine() { scenario.onActivity( activity -> { List registeredEngines = - GeneratedPluginRegistrant.getRegisteredEngines(); + FakeGeneratedPluginRegistrant.getRegisteredEngines(); assertEquals(1, registeredEngines.size()); assertEquals(activity.getFlutterEngine(), registeredEngines.get(0)); }); } - List registeredEngines = GeneratedPluginRegistrant.getRegisteredEngines(); + List registeredEngines = FakeGeneratedPluginRegistrant.getRegisteredEngines(); // This might cause the plugins to be registered twice, once by the FlutterEngine constructor, // and once by the default FlutterFragmentActivity.configureFlutterEngine implementation. // Test that it doesn't happen. @@ -149,7 +149,7 @@ public void itReturnsValueFromMetaDataWhenCallsShouldHandleDeepLinkingCase1() throws PackageManager.NameNotFoundException { FlutterFragmentActivity activity = Robolectric.buildActivity(FlutterFragmentActivityWithProvidedEngine.class).get(); - assertTrue(GeneratedPluginRegistrant.getRegisteredEngines().isEmpty()); + assertTrue(FakeGeneratedPluginRegistrant.getRegisteredEngines().isEmpty()); Bundle bundle = new Bundle(); bundle.putBoolean(HANDLE_DEEPLINKING_META_DATA_KEY, true); FlutterFragmentActivity spyFlutterActivity = spy(activity); @@ -175,7 +175,7 @@ public void itReturnsValueFromMetaDataWhenCallsShouldHandleDeepLinkingCase3() throws PackageManager.NameNotFoundException { FlutterFragmentActivity activity = Robolectric.buildActivity(FlutterFragmentActivityWithProvidedEngine.class).get(); - assertTrue(GeneratedPluginRegistrant.getRegisteredEngines().isEmpty()); + assertTrue(FakeGeneratedPluginRegistrant.getRegisteredEngines().isEmpty()); // Creates an empty bundle. Bundle bundle = new Bundle(); FlutterFragmentActivity spyFlutterActivity = spy(activity); diff --git a/shell/platform/android/test/io/flutter/embedding/engine/FlutterEngineGroupComponentTest.java b/shell/platform/android/test/io/flutter/embedding/engine/FlutterEngineGroupComponentTest.java index 4e91e7788ca64..91dfdd3fd1845 100644 --- a/shell/platform/android/test/io/flutter/embedding/engine/FlutterEngineGroupComponentTest.java +++ b/shell/platform/android/test/io/flutter/embedding/engine/FlutterEngineGroupComponentTest.java @@ -27,7 +27,7 @@ import io.flutter.embedding.engine.loader.FlutterLoader; import io.flutter.embedding.engine.systemchannels.NavigationChannel; import io.flutter.plugin.platform.PlatformViewsController; -import io.flutter.plugins.GeneratedPluginRegistrant; +import io.flutter.plugins.FakeGeneratedPluginRegistrant; import java.util.ArrayList; import java.util.List; import org.junit.After; @@ -58,7 +58,7 @@ public void setUp() { jniAttached = false; when(mockFlutterJNI.isAttached()).thenAnswer(invocation -> jniAttached); doAnswer(invocation -> jniAttached = true).when(mockFlutterJNI).attachToNative(); - GeneratedPluginRegistrant.clearRegisteredEngines(); + FakeGeneratedPluginRegistrant.clearRegisteredEngines(); when(mockFlutterLoader.findAppBundlePath()).thenReturn("some/path/to/flutter_assets"); @@ -103,7 +103,7 @@ FlutterEngine createEngine( @After public void tearDown() { - GeneratedPluginRegistrant.clearRegisteredEngines(); + FakeGeneratedPluginRegistrant.clearRegisteredEngines(); engineGroupUnderTest = null; firstEngineUnderTest = null; } @@ -281,7 +281,7 @@ public void createEngineSupportMoreParams() { when(FlutterInjector.instance().flutterLoader().automaticallyRegisterPlugins()) .thenReturn(true); assertTrue(FlutterInjector.instance().flutterLoader().automaticallyRegisterPlugins()); - assertEquals(0, GeneratedPluginRegistrant.getRegisteredEngines().size()); + assertEquals(0, FakeGeneratedPluginRegistrant.getRegisteredEngines().size()); FlutterEngine firstEngine = engineGroup.createAndRunEngine( @@ -291,7 +291,7 @@ public void createEngineSupportMoreParams() { .setWaitForRestorationData(waitForRestorationData) .setAutomaticallyRegisterPlugins(automaticallyRegisterPlugins)); - assertEquals(1, GeneratedPluginRegistrant.getRegisteredEngines().size()); + assertEquals(1, FakeGeneratedPluginRegistrant.getRegisteredEngines().size()); assertEquals(controller, firstEngine.getPlatformViewsController()); assertEquals( waitForRestorationData, firstEngine.getRestorationChannel().waitForRestorationData); @@ -331,7 +331,7 @@ public void spawnEngineSupportMoreParams() { when(FlutterInjector.instance().flutterLoader().automaticallyRegisterPlugins()) .thenReturn(true); assertTrue(FlutterInjector.instance().flutterLoader().automaticallyRegisterPlugins()); - assertEquals(0, GeneratedPluginRegistrant.getRegisteredEngines().size()); + assertEquals(0, FakeGeneratedPluginRegistrant.getRegisteredEngines().size()); FlutterEngine secondEngine = engineGroupUnderTest.createAndRunEngine( @@ -344,6 +344,6 @@ public void spawnEngineSupportMoreParams() { assertEquals( waitForRestorationData, secondEngine.getRestorationChannel().waitForRestorationData); assertEquals(controller, secondEngine.getPlatformViewsController()); - assertEquals(0, GeneratedPluginRegistrant.getRegisteredEngines().size()); + assertEquals(0, FakeGeneratedPluginRegistrant.getRegisteredEngines().size()); } } diff --git a/shell/platform/android/test/io/flutter/embedding/engine/FlutterEngineTest.java b/shell/platform/android/test/io/flutter/embedding/engine/FlutterEngineTest.java index c1b049b89ecd5..3dc9241b0fee7 100644 --- a/shell/platform/android/test/io/flutter/embedding/engine/FlutterEngineTest.java +++ b/shell/platform/android/test/io/flutter/embedding/engine/FlutterEngineTest.java @@ -32,7 +32,7 @@ import io.flutter.embedding.engine.plugins.FlutterPlugin; import io.flutter.embedding.engine.plugins.PluginRegistry; import io.flutter.plugin.platform.PlatformViewsController; -import io.flutter.plugins.GeneratedPluginRegistrant; +import io.flutter.plugins.FakeGeneratedPluginRegistrant; import java.util.List; import org.junit.After; import org.junit.Before; @@ -78,25 +78,25 @@ public Object answer(InvocationOnMock invocation) throws Throwable { }) .when(flutterJNI) .attachToNative(); - GeneratedPluginRegistrant.clearRegisteredEngines(); + FakeGeneratedPluginRegistrant.clearRegisteredEngines(); } @After public void tearDown() { - GeneratedPluginRegistrant.clearRegisteredEngines(); + FakeGeneratedPluginRegistrant.clearRegisteredEngines(); // Make sure to not forget to remove the mock exception in the generated plugin registration // mock, or everything subsequent will break. - GeneratedPluginRegistrant.pluginRegistrationException = null; + FakeGeneratedPluginRegistrant.pluginRegistrationException = null; } @Test public void itAutomaticallyRegistersPluginsByDefault() { - assertTrue(GeneratedPluginRegistrant.getRegisteredEngines().isEmpty()); + assertTrue(FakeGeneratedPluginRegistrant.getRegisteredEngines().isEmpty()); FlutterLoader mockFlutterLoader = mock(FlutterLoader.class); when(mockFlutterLoader.automaticallyRegisterPlugins()).thenReturn(true); FlutterEngine flutterEngine = new FlutterEngine(ctx, mockFlutterLoader, flutterJNI); - List registeredEngines = GeneratedPluginRegistrant.getRegisteredEngines(); + List registeredEngines = FakeGeneratedPluginRegistrant.getRegisteredEngines(); assertEquals(1, registeredEngines.size()); assertEquals(flutterEngine, registeredEngines.get(0)); } @@ -121,7 +121,7 @@ public void itSendLocalesOnEngineInit() { FlutterJNI mockFlutterJNI = mock(FlutterJNI.class); when(mockFlutterJNI.isAttached()).thenReturn(true); - assertTrue(GeneratedPluginRegistrant.getRegisteredEngines().isEmpty()); + assertTrue(FakeGeneratedPluginRegistrant.getRegisteredEngines().isEmpty()); FlutterLoader mockFlutterLoader = mock(FlutterLoader.class); when(mockFlutterLoader.automaticallyRegisterPlugins()).thenReturn(true); FlutterEngine flutterEngine = new FlutterEngine(ctx, mockFlutterLoader, mockFlutterJNI); @@ -134,14 +134,14 @@ public void itSendLocalesOnEngineInit() { // https://github.com/flutter/flutter/issues/78625. @Test public void itCatchesAndDisplaysRegistrationExceptions() { - assertTrue(GeneratedPluginRegistrant.getRegisteredEngines().isEmpty()); - GeneratedPluginRegistrant.pluginRegistrationException = + assertTrue(FakeGeneratedPluginRegistrant.getRegisteredEngines().isEmpty()); + FakeGeneratedPluginRegistrant.pluginRegistrationException = new RuntimeException("I'm a bug in the plugin"); FlutterLoader mockFlutterLoader = mock(FlutterLoader.class); when(mockFlutterLoader.automaticallyRegisterPlugins()).thenReturn(true); FlutterEngine flutterEngine = new FlutterEngine(ctx, mockFlutterLoader, flutterJNI); - List registeredEngines = GeneratedPluginRegistrant.getRegisteredEngines(); + List registeredEngines = FakeGeneratedPluginRegistrant.getRegisteredEngines(); // When it crashes, it doesn't end up registering anything. assertEquals(0, registeredEngines.size()); @@ -153,26 +153,26 @@ public void itCatchesAndDisplaysRegistrationExceptions() { .msg .contains("Tried to automatically register plugins")); assertEquals( - GeneratedPluginRegistrant.pluginRegistrationException, + FakeGeneratedPluginRegistrant.pluginRegistrationException, ShadowLog.getLogsForTag("GeneratedPluginsRegister").get(1).throwable.getCause()); - GeneratedPluginRegistrant.pluginRegistrationException = null; + FakeGeneratedPluginRegistrant.pluginRegistrationException = null; } @Test public void itDoesNotAutomaticallyRegistersPluginsWhenFlutterLoaderDisablesIt() { - assertTrue(GeneratedPluginRegistrant.getRegisteredEngines().isEmpty()); + assertTrue(FakeGeneratedPluginRegistrant.getRegisteredEngines().isEmpty()); FlutterLoader mockFlutterLoader = mock(FlutterLoader.class); when(mockFlutterLoader.automaticallyRegisterPlugins()).thenReturn(false); new FlutterEngine(ctx, mockFlutterLoader, flutterJNI); - List registeredEngines = GeneratedPluginRegistrant.getRegisteredEngines(); + List registeredEngines = FakeGeneratedPluginRegistrant.getRegisteredEngines(); assertTrue(registeredEngines.isEmpty()); } @Test public void itDoesNotAutomaticallyRegistersPluginsWhenFlutterEngineDisablesIt() { - assertTrue(GeneratedPluginRegistrant.getRegisteredEngines().isEmpty()); + assertTrue(FakeGeneratedPluginRegistrant.getRegisteredEngines().isEmpty()); FlutterLoader mockFlutterLoader = mock(FlutterLoader.class); when(mockFlutterLoader.automaticallyRegisterPlugins()).thenReturn(true); new FlutterEngine( @@ -182,7 +182,7 @@ public void itDoesNotAutomaticallyRegistersPluginsWhenFlutterEngineDisablesIt() /*dartVmArgs=*/ new String[] {}, /*automaticallyRegisterPlugins=*/ false); - List registeredEngines = GeneratedPluginRegistrant.getRegisteredEngines(); + List registeredEngines = FakeGeneratedPluginRegistrant.getRegisteredEngines(); assertTrue(registeredEngines.isEmpty()); } diff --git a/shell/platform/android/test/io/flutter/plugins/GeneratedPluginRegistrant.java b/shell/platform/android/test/io/flutter/plugins/FakeGeneratedPluginRegistrant.java similarity index 97% rename from shell/platform/android/test/io/flutter/plugins/GeneratedPluginRegistrant.java rename to shell/platform/android/test/io/flutter/plugins/FakeGeneratedPluginRegistrant.java index 387de14de371f..32200846a07ef 100644 --- a/shell/platform/android/test/io/flutter/plugins/GeneratedPluginRegistrant.java +++ b/shell/platform/android/test/io/flutter/plugins/FakeGeneratedPluginRegistrant.java @@ -13,7 +13,7 @@ *

Used to test engine logic which interacts with the generated class. */ @VisibleForTesting -public class GeneratedPluginRegistrant { +public class FakeGeneratedPluginRegistrant { private static final List registeredEngines = new ArrayList<>(); public static @Nullable RuntimeException pluginRegistrationException; From d8b4a0fb35230f9a4f4d729a385060e890681bd6 Mon Sep 17 00:00:00 2001 From: Matan Lurey Date: Tue, 20 Feb 2024 13:36:09 -0800 Subject: [PATCH 02/10] Revert. --- ci/analyze.sh | 28 +++++++--------------------- 1 file changed, 7 insertions(+), 21 deletions(-) diff --git a/ci/analyze.sh b/ci/analyze.sh index 6fe63e0d9f988..6b57a819a0119 100755 --- a/ci/analyze.sh +++ b/ci/analyze.sh @@ -28,10 +28,7 @@ function follow_links() ( ) SCRIPT_DIR=$(follow_links "$(dirname -- "${BASH_SOURCE[0]}")") -SRC_DIR="$( - cd "$SCRIPT_DIR/../.." - pwd -P -)" +SRC_DIR="$(cd "$SCRIPT_DIR/../.."; pwd -P)" FLUTTER_DIR="$SRC_DIR/flutter" DART_BIN="$SRC_DIR/out/host_debug_unopt/dart-sdk/bin" DART="$DART_BIN/dart" @@ -61,26 +58,15 @@ echo "" # Check that dart libraries conform. echo "Checking the integrity of the Web SDK" -( - cd "$FLUTTER_DIR/web_sdk" - "$DART" pub get -) -( - cd "$FLUTTER_DIR/web_sdk/web_test_utils" - "$DART" pub get -) -( - cd "$FLUTTER_DIR/web_sdk/web_engine_tester" - "$DART" pub get -) +(cd "$FLUTTER_DIR/web_sdk"; "$DART" pub get) +(cd "$FLUTTER_DIR/web_sdk/web_test_utils"; "$DART" pub get) +(cd "$FLUTTER_DIR/web_sdk/web_engine_tester"; "$DART" pub get) "$DART" analyze --fatal-infos --fatal-warnings "$FLUTTER_DIR/web_sdk" WEB_SDK_TEST_FILES="$FLUTTER_DIR/web_sdk/test/*" -for testFile in $WEB_SDK_TEST_FILES; do +for testFile in $WEB_SDK_TEST_FILES +do echo "Running $testFile" - ( - cd "$FLUTTER_DIR" - FLUTTER_DIR="$FLUTTER_DIR" "$DART" --enable-asserts $testFile - ) + (cd "$FLUTTER_DIR"; FLUTTER_DIR="$FLUTTER_DIR" "$DART" --enable-asserts $testFile) done From 7504d17766943925ae08ec0c2632a645a55b8b95 Mon Sep 17 00:00:00 2001 From: Matan Lurey Date: Tue, 20 Feb 2024 13:36:32 -0800 Subject: [PATCH 03/10] Revert. --- ci/format.sh | 7 ++----- 1 file changed, 2 insertions(+), 5 deletions(-) diff --git a/ci/format.sh b/ci/format.sh index 262a0a814b198..997808c578c26 100755 --- a/ci/format.sh +++ b/ci/format.sh @@ -18,7 +18,7 @@ unset CDPATH function follow_links() ( cd -P "$(dirname -- "$1")" file="$PWD/$(basename -- "$1")" - while [[ -L "$file" ]]; do + while [[ -h "$file" ]]; do cd -P "$(dirname -- "$file")" file="$(readlink -- "$file")" cd -P "$(dirname -- "$file")" @@ -28,10 +28,7 @@ function follow_links() ( ) SCRIPT_DIR=$(follow_links "$(dirname -- "${BASH_SOURCE[0]}")") -SRC_DIR="$( - cd "$SCRIPT_DIR/../.." - pwd -P -)" +SRC_DIR="$(cd "$SCRIPT_DIR/../.."; pwd -P)" DART_SDK_DIR="${SRC_DIR}/third_party/dart/tools/sdks/dart-sdk" DART="${DART_SDK_DIR}/bin/dart" From cdf98d217d21434c1a3b8b52ea1cc2d14850dbc0 Mon Sep 17 00:00:00 2001 From: Matan Lurey Date: Tue, 20 Feb 2024 13:39:20 -0800 Subject: [PATCH 04/10] Add test on CI. --- ci/builders/linux_unopt.json | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/ci/builders/linux_unopt.json b/ci/builders/linux_unopt.json index 8b9208bbdb057..540aff6dafe34 100644 --- a/ci/builders/linux_unopt.json +++ b/ci/builders/linux_unopt.json @@ -40,6 +40,10 @@ "name": "test:format_and_dart_test", "script": "flutter/ci/format.sh" }, + { + "nane": "test:GeneratedPluginRegistant.java omitted", + "script": "flutter/ci/test/format_no_generated_java.sh" + }, { "language": "python3", "name": "test: Host_Tests_for_host_debug_unopt", From 2f7e2de241a96a7cf18481908b8e1970de883d51 Mon Sep 17 00:00:00 2001 From: Matan Lurey Date: Tue, 20 Feb 2024 13:39:43 -0800 Subject: [PATCH 05/10] ++ --- ci/test/format_no_generated_java_test.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ci/test/format_no_generated_java_test.sh b/ci/test/format_no_generated_java_test.sh index 919abfa97ae9e..db658a8b63a27 100755 --- a/ci/test/format_no_generated_java_test.sh +++ b/ci/test/format_no_generated_java_test.sh @@ -18,7 +18,7 @@ unset CDPATH function follow_links() ( cd -P "$(dirname -- "$1")" file="$PWD/$(basename -- "$1")" - while [[ -L "$file" ]]; do + while [[ -h "$file" ]]; do cd -P "$(dirname -- "$file")" file="$(readlink -- "$file")" cd -P "$(dirname -- "$file")" From 4c34c37584ed50e69bda64ff37d30dc25f192f91 Mon Sep 17 00:00:00 2001 From: Matan Lurey Date: Tue, 20 Feb 2024 13:45:54 -0800 Subject: [PATCH 06/10] ++ --- ci/format.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ci/format.sh b/ci/format.sh index 997808c578c26..0a72bf7d0f0da 100755 --- a/ci/format.sh +++ b/ci/format.sh @@ -40,7 +40,7 @@ DART="${DART_SDK_DIR}/bin/dart" GENERATED_PLUGIN_REGISTRANT_PATH=$(find "$SRC_DIR/flutter" -name "GeneratedPluginRegistrant.java") if [[ -n "$GENERATED_PLUGIN_REGISTRANT_PATH" ]]; then echo "GeneratedPluginRegistrant.java found in the project." - echo "This file is generated by Flutter tooling and should not be checked in." + echo "This file is generated by Flutter tooling and should not exist in the engine repository." echo "Please remove it from the project and try again." echo "Path: $GENERATED_PLUGIN_REGISTRANT_PATH" exit 1 From 293a55e6dd244456ee9cd7693f9a6ca265c483e9 Mon Sep 17 00:00:00 2001 From: Matan Lurey Date: Tue, 20 Feb 2024 14:03:24 -0800 Subject: [PATCH 07/10] ++ --- .../flutter/embedding/android/FlutterFragmentActivityTest.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/shell/platform/android/test/io/flutter/embedding/android/FlutterFragmentActivityTest.java b/shell/platform/android/test/io/flutter/embedding/android/FlutterFragmentActivityTest.java index f648d805c070d..eaf411e74e5b9 100644 --- a/shell/platform/android/test/io/flutter/embedding/android/FlutterFragmentActivityTest.java +++ b/shell/platform/android/test/io/flutter/embedding/android/FlutterFragmentActivityTest.java @@ -162,7 +162,7 @@ public void itReturnsValueFromMetaDataWhenCallsShouldHandleDeepLinkingCase2() throws PackageManager.NameNotFoundException { FlutterFragmentActivity activity = Robolectric.buildActivity(FlutterFragmentActivityWithProvidedEngine.class).get(); - assertTrue(GeneratedPluginRegistrant.getRegisteredEngines().isEmpty()); + assertTrue(FakeGeneratedPluginRegistrant.getRegisteredEngines().isEmpty()); Bundle bundle = new Bundle(); bundle.putBoolean(HANDLE_DEEPLINKING_META_DATA_KEY, false); FlutterFragmentActivity spyFlutterActivity = spy(activity); From 4b8e403583f6f0cb14ae915d6764620ef00b4a2a Mon Sep 17 00:00:00 2001 From: Matan Lurey Date: Tue, 20 Feb 2024 15:27:21 -0800 Subject: [PATCH 08/10] ++ --- ci/builders/linux_unopt.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ci/builders/linux_unopt.json b/ci/builders/linux_unopt.json index 540aff6dafe34..5b85fca508a17 100644 --- a/ci/builders/linux_unopt.json +++ b/ci/builders/linux_unopt.json @@ -42,7 +42,7 @@ }, { "nane": "test:GeneratedPluginRegistant.java omitted", - "script": "flutter/ci/test/format_no_generated_java.sh" + "script": "flutter/ci/test/format_no_generated_java_test.sh" }, { "language": "python3", From e9d6c2a38f087b86642b9d22e9651b798b557fcf Mon Sep 17 00:00:00 2001 From: Matan Lurey Date: Tue, 20 Feb 2024 16:29:20 -0800 Subject: [PATCH 09/10] ++ --- ci/format.sh | 25 ++++++--- ci/test/format_no_generated_java_test.sh | 7 ++- .../android/FlutterActivityTest.java | 10 ++-- .../android/FlutterFragmentActivityTest.java | 18 +++--- .../FlutterEngineGroupComponentTest.java | 14 ++--- .../embedding/engine/FlutterEngineTest.java | 32 +++++------ .../plugins/GeneratedPluginRegistrant.java | 55 +++++++++++++++++++ 7 files changed, 114 insertions(+), 47 deletions(-) create mode 100644 shell/platform/android/test/io/flutter/plugins/GeneratedPluginRegistrant.java diff --git a/ci/format.sh b/ci/format.sh index 0a72bf7d0f0da..bcde4aedcff0d 100755 --- a/ci/format.sh +++ b/ci/format.sh @@ -37,14 +37,23 @@ DART="${DART_SDK_DIR}/bin/dart" # the file and instructing them to remove it. # # See: https://github.com/flutter/flutter/issues/143782. -GENERATED_PLUGIN_REGISTRANT_PATH=$(find "$SRC_DIR/flutter" -name "GeneratedPluginRegistrant.java") -if [[ -n "$GENERATED_PLUGIN_REGISTRANT_PATH" ]]; then - echo "GeneratedPluginRegistrant.java found in the project." - echo "This file is generated by Flutter tooling and should not exist in the engine repository." - echo "Please remove it from the project and try again." - echo "Path: $GENERATED_PLUGIN_REGISTRANT_PATH" - exit 1 -fi + +# The expected path to the file. Any *other* path is unexpected. +EXPECTED_PATHS=("./shell/platform/android/test/io/flutter/plugins/GeneratedPluginRegistrant.java") + +# Find all files named GeneratedPluginRegistrant.java in the project. +GENERATED_PLUGIN_REGISTRANT_PATHS=$(find "$SRC_DIR/flutter" -name "GeneratedPluginRegistrant.java") + +# Check for GeneratedPluginRegistrant.java in unexpected locations +for expected_path in "${EXPECTED_PATHS[@]}"; do + found_files=$(find . -name "GeneratedPluginRegistrant.java" -not -path "$expected_path") + + for file in $found_files; do + echo "Error: Unexpected GeneratedPluginRegistrant.java found: $file" + echo "Please remove the unexpected file and see: https://github.com/flutter/flutter/issues/143782" + exit 1 + done +done cd "$SCRIPT_DIR" "$DART" \ diff --git a/ci/test/format_no_generated_java_test.sh b/ci/test/format_no_generated_java_test.sh index db658a8b63a27..4d9c7ce4f4a6d 100755 --- a/ci/test/format_no_generated_java_test.sh +++ b/ci/test/format_no_generated_java_test.sh @@ -34,8 +34,11 @@ SRC_DIR="$( )" FLUTTER_DIR="$SRC_DIR/flutter" -# Creates a file named `GeneratedPluginRegistrant.java` in the project. -# This file is generated by Flutter tooling and should not be checked in. +# Creates a file named `GeneratedPluginRegistrant.java` in the project outside +# of it's expected location in shell/platform/android/test/... (where the exact +# name and location is required to get loaded). +# +# This file is typically generated by Flutter tooling and should not exist. touch "$FLUTTER_DIR/GeneratedPluginRegistrant.java" # Create a trap that, on exit, removes the file. diff --git a/shell/platform/android/test/io/flutter/embedding/android/FlutterActivityTest.java b/shell/platform/android/test/io/flutter/embedding/android/FlutterActivityTest.java index ec4603ed1473d..30dd648beac6e 100644 --- a/shell/platform/android/test/io/flutter/embedding/android/FlutterActivityTest.java +++ b/shell/platform/android/test/io/flutter/embedding/android/FlutterActivityTest.java @@ -38,7 +38,7 @@ import io.flutter.embedding.engine.plugins.activity.ActivityAware; import io.flutter.embedding.engine.plugins.activity.ActivityPluginBinding; import io.flutter.embedding.engine.plugins.activity.ActivityPluginBinding.OnSaveInstanceStateListener; -import io.flutter.plugins.FakeGeneratedPluginRegistrant; +import io.flutter.plugins.GeneratedPluginRegistrant; import java.util.ArrayList; import java.util.Arrays; import java.util.List; @@ -59,7 +59,7 @@ public class FlutterActivityTest { @Before public void setUp() { FlutterInjector.reset(); - FakeGeneratedPluginRegistrant.clearRegisteredEngines(); + GeneratedPluginRegistrant.clearRegisteredEngines(); FlutterJNI mockFlutterJNI = mock(FlutterJNI.class); when(mockFlutterJNI.isAttached()).thenReturn(true); FlutterJNI.Factory mockFlutterJNIFactory = mock(FlutterJNI.Factory.class); @@ -70,7 +70,7 @@ public void setUp() { @After public void tearDown() { - FakeGeneratedPluginRegistrant.clearRegisteredEngines(); + GeneratedPluginRegistrant.clearRegisteredEngines(); FlutterInjector.reset(); } @@ -310,7 +310,7 @@ public void itRegistersPluginsAtConfigurationTime() { // configureFlutterEngine which registers the plugins. activity.onCreate(null); - List registeredEngines = FakeGeneratedPluginRegistrant.getRegisteredEngines(); + List registeredEngines = GeneratedPluginRegistrant.getRegisteredEngines(); assertEquals(1, registeredEngines.size()); assertEquals(activity.getFlutterEngine(), registeredEngines.get(0)); } @@ -423,7 +423,7 @@ public void itDoesNotRegisterPluginsTwiceWhenUsingACachedEngine() { FlutterActivityWithProvidedEngine flutterActivity = activityController.get(); flutterActivity.configureFlutterEngine(flutterActivity.getFlutterEngine()); - List registeredEngines = FakeGeneratedPluginRegistrant.getRegisteredEngines(); + List registeredEngines = GeneratedPluginRegistrant.getRegisteredEngines(); // This might cause the plugins to be registered twice, once by the FlutterEngine constructor, // and once by the default FlutterActivity.configureFlutterEngine implementation. // Test that it doesn't happen. diff --git a/shell/platform/android/test/io/flutter/embedding/android/FlutterFragmentActivityTest.java b/shell/platform/android/test/io/flutter/embedding/android/FlutterFragmentActivityTest.java index eaf411e74e5b9..17960263e996a 100644 --- a/shell/platform/android/test/io/flutter/embedding/android/FlutterFragmentActivityTest.java +++ b/shell/platform/android/test/io/flutter/embedding/android/FlutterFragmentActivityTest.java @@ -26,7 +26,7 @@ import io.flutter.embedding.engine.FlutterEngine; import io.flutter.embedding.engine.FlutterJNI; import io.flutter.embedding.engine.loader.FlutterLoader; -import io.flutter.plugins.FakeGeneratedPluginRegistrant; +import io.flutter.plugins.GeneratedPluginRegistrant; import java.util.List; import org.junit.After; import org.junit.Before; @@ -43,7 +43,7 @@ public class FlutterFragmentActivityTest { @Before public void setUp() { FlutterInjector.reset(); - FakeGeneratedPluginRegistrant.clearRegisteredEngines(); + GeneratedPluginRegistrant.clearRegisteredEngines(); FlutterJNI mockFlutterJNI = mock(FlutterJNI.class); when(mockFlutterJNI.isAttached()).thenReturn(true); FlutterJNI.Factory mockFlutterJNIFactory = mock(FlutterJNI.Factory.class); @@ -54,7 +54,7 @@ public void setUp() { @After public void tearDown() { - FakeGeneratedPluginRegistrant.clearRegisteredEngines(); + GeneratedPluginRegistrant.clearRegisteredEngines(); FlutterInjector.reset(); } @@ -117,7 +117,7 @@ public void itRegistersPluginsAtConfigurationTime() { scenario.onActivity( activity -> { List registeredEngines = - FakeGeneratedPluginRegistrant.getRegisteredEngines(); + GeneratedPluginRegistrant.getRegisteredEngines(); assertEquals(1, registeredEngines.size()); assertEquals(activity.getFlutterEngine(), registeredEngines.get(0)); }); @@ -131,13 +131,13 @@ public void itDoesNotRegisterPluginsTwiceWhenUsingACachedEngine() { scenario.onActivity( activity -> { List registeredEngines = - FakeGeneratedPluginRegistrant.getRegisteredEngines(); + GeneratedPluginRegistrant.getRegisteredEngines(); assertEquals(1, registeredEngines.size()); assertEquals(activity.getFlutterEngine(), registeredEngines.get(0)); }); } - List registeredEngines = FakeGeneratedPluginRegistrant.getRegisteredEngines(); + List registeredEngines = GeneratedPluginRegistrant.getRegisteredEngines(); // This might cause the plugins to be registered twice, once by the FlutterEngine constructor, // and once by the default FlutterFragmentActivity.configureFlutterEngine implementation. // Test that it doesn't happen. @@ -149,7 +149,7 @@ public void itReturnsValueFromMetaDataWhenCallsShouldHandleDeepLinkingCase1() throws PackageManager.NameNotFoundException { FlutterFragmentActivity activity = Robolectric.buildActivity(FlutterFragmentActivityWithProvidedEngine.class).get(); - assertTrue(FakeGeneratedPluginRegistrant.getRegisteredEngines().isEmpty()); + assertTrue(GeneratedPluginRegistrant.getRegisteredEngines().isEmpty()); Bundle bundle = new Bundle(); bundle.putBoolean(HANDLE_DEEPLINKING_META_DATA_KEY, true); FlutterFragmentActivity spyFlutterActivity = spy(activity); @@ -162,7 +162,7 @@ public void itReturnsValueFromMetaDataWhenCallsShouldHandleDeepLinkingCase2() throws PackageManager.NameNotFoundException { FlutterFragmentActivity activity = Robolectric.buildActivity(FlutterFragmentActivityWithProvidedEngine.class).get(); - assertTrue(FakeGeneratedPluginRegistrant.getRegisteredEngines().isEmpty()); + assertTrue(GeneratedPluginRegistrant.getRegisteredEngines().isEmpty()); Bundle bundle = new Bundle(); bundle.putBoolean(HANDLE_DEEPLINKING_META_DATA_KEY, false); FlutterFragmentActivity spyFlutterActivity = spy(activity); @@ -175,7 +175,7 @@ public void itReturnsValueFromMetaDataWhenCallsShouldHandleDeepLinkingCase3() throws PackageManager.NameNotFoundException { FlutterFragmentActivity activity = Robolectric.buildActivity(FlutterFragmentActivityWithProvidedEngine.class).get(); - assertTrue(FakeGeneratedPluginRegistrant.getRegisteredEngines().isEmpty()); + assertTrue(GeneratedPluginRegistrant.getRegisteredEngines().isEmpty()); // Creates an empty bundle. Bundle bundle = new Bundle(); FlutterFragmentActivity spyFlutterActivity = spy(activity); diff --git a/shell/platform/android/test/io/flutter/embedding/engine/FlutterEngineGroupComponentTest.java b/shell/platform/android/test/io/flutter/embedding/engine/FlutterEngineGroupComponentTest.java index 91dfdd3fd1845..4e91e7788ca64 100644 --- a/shell/platform/android/test/io/flutter/embedding/engine/FlutterEngineGroupComponentTest.java +++ b/shell/platform/android/test/io/flutter/embedding/engine/FlutterEngineGroupComponentTest.java @@ -27,7 +27,7 @@ import io.flutter.embedding.engine.loader.FlutterLoader; import io.flutter.embedding.engine.systemchannels.NavigationChannel; import io.flutter.plugin.platform.PlatformViewsController; -import io.flutter.plugins.FakeGeneratedPluginRegistrant; +import io.flutter.plugins.GeneratedPluginRegistrant; import java.util.ArrayList; import java.util.List; import org.junit.After; @@ -58,7 +58,7 @@ public void setUp() { jniAttached = false; when(mockFlutterJNI.isAttached()).thenAnswer(invocation -> jniAttached); doAnswer(invocation -> jniAttached = true).when(mockFlutterJNI).attachToNative(); - FakeGeneratedPluginRegistrant.clearRegisteredEngines(); + GeneratedPluginRegistrant.clearRegisteredEngines(); when(mockFlutterLoader.findAppBundlePath()).thenReturn("some/path/to/flutter_assets"); @@ -103,7 +103,7 @@ FlutterEngine createEngine( @After public void tearDown() { - FakeGeneratedPluginRegistrant.clearRegisteredEngines(); + GeneratedPluginRegistrant.clearRegisteredEngines(); engineGroupUnderTest = null; firstEngineUnderTest = null; } @@ -281,7 +281,7 @@ public void createEngineSupportMoreParams() { when(FlutterInjector.instance().flutterLoader().automaticallyRegisterPlugins()) .thenReturn(true); assertTrue(FlutterInjector.instance().flutterLoader().automaticallyRegisterPlugins()); - assertEquals(0, FakeGeneratedPluginRegistrant.getRegisteredEngines().size()); + assertEquals(0, GeneratedPluginRegistrant.getRegisteredEngines().size()); FlutterEngine firstEngine = engineGroup.createAndRunEngine( @@ -291,7 +291,7 @@ public void createEngineSupportMoreParams() { .setWaitForRestorationData(waitForRestorationData) .setAutomaticallyRegisterPlugins(automaticallyRegisterPlugins)); - assertEquals(1, FakeGeneratedPluginRegistrant.getRegisteredEngines().size()); + assertEquals(1, GeneratedPluginRegistrant.getRegisteredEngines().size()); assertEquals(controller, firstEngine.getPlatformViewsController()); assertEquals( waitForRestorationData, firstEngine.getRestorationChannel().waitForRestorationData); @@ -331,7 +331,7 @@ public void spawnEngineSupportMoreParams() { when(FlutterInjector.instance().flutterLoader().automaticallyRegisterPlugins()) .thenReturn(true); assertTrue(FlutterInjector.instance().flutterLoader().automaticallyRegisterPlugins()); - assertEquals(0, FakeGeneratedPluginRegistrant.getRegisteredEngines().size()); + assertEquals(0, GeneratedPluginRegistrant.getRegisteredEngines().size()); FlutterEngine secondEngine = engineGroupUnderTest.createAndRunEngine( @@ -344,6 +344,6 @@ public void spawnEngineSupportMoreParams() { assertEquals( waitForRestorationData, secondEngine.getRestorationChannel().waitForRestorationData); assertEquals(controller, secondEngine.getPlatformViewsController()); - assertEquals(0, FakeGeneratedPluginRegistrant.getRegisteredEngines().size()); + assertEquals(0, GeneratedPluginRegistrant.getRegisteredEngines().size()); } } diff --git a/shell/platform/android/test/io/flutter/embedding/engine/FlutterEngineTest.java b/shell/platform/android/test/io/flutter/embedding/engine/FlutterEngineTest.java index 3dc9241b0fee7..c1b049b89ecd5 100644 --- a/shell/platform/android/test/io/flutter/embedding/engine/FlutterEngineTest.java +++ b/shell/platform/android/test/io/flutter/embedding/engine/FlutterEngineTest.java @@ -32,7 +32,7 @@ import io.flutter.embedding.engine.plugins.FlutterPlugin; import io.flutter.embedding.engine.plugins.PluginRegistry; import io.flutter.plugin.platform.PlatformViewsController; -import io.flutter.plugins.FakeGeneratedPluginRegistrant; +import io.flutter.plugins.GeneratedPluginRegistrant; import java.util.List; import org.junit.After; import org.junit.Before; @@ -78,25 +78,25 @@ public Object answer(InvocationOnMock invocation) throws Throwable { }) .when(flutterJNI) .attachToNative(); - FakeGeneratedPluginRegistrant.clearRegisteredEngines(); + GeneratedPluginRegistrant.clearRegisteredEngines(); } @After public void tearDown() { - FakeGeneratedPluginRegistrant.clearRegisteredEngines(); + GeneratedPluginRegistrant.clearRegisteredEngines(); // Make sure to not forget to remove the mock exception in the generated plugin registration // mock, or everything subsequent will break. - FakeGeneratedPluginRegistrant.pluginRegistrationException = null; + GeneratedPluginRegistrant.pluginRegistrationException = null; } @Test public void itAutomaticallyRegistersPluginsByDefault() { - assertTrue(FakeGeneratedPluginRegistrant.getRegisteredEngines().isEmpty()); + assertTrue(GeneratedPluginRegistrant.getRegisteredEngines().isEmpty()); FlutterLoader mockFlutterLoader = mock(FlutterLoader.class); when(mockFlutterLoader.automaticallyRegisterPlugins()).thenReturn(true); FlutterEngine flutterEngine = new FlutterEngine(ctx, mockFlutterLoader, flutterJNI); - List registeredEngines = FakeGeneratedPluginRegistrant.getRegisteredEngines(); + List registeredEngines = GeneratedPluginRegistrant.getRegisteredEngines(); assertEquals(1, registeredEngines.size()); assertEquals(flutterEngine, registeredEngines.get(0)); } @@ -121,7 +121,7 @@ public void itSendLocalesOnEngineInit() { FlutterJNI mockFlutterJNI = mock(FlutterJNI.class); when(mockFlutterJNI.isAttached()).thenReturn(true); - assertTrue(FakeGeneratedPluginRegistrant.getRegisteredEngines().isEmpty()); + assertTrue(GeneratedPluginRegistrant.getRegisteredEngines().isEmpty()); FlutterLoader mockFlutterLoader = mock(FlutterLoader.class); when(mockFlutterLoader.automaticallyRegisterPlugins()).thenReturn(true); FlutterEngine flutterEngine = new FlutterEngine(ctx, mockFlutterLoader, mockFlutterJNI); @@ -134,14 +134,14 @@ public void itSendLocalesOnEngineInit() { // https://github.com/flutter/flutter/issues/78625. @Test public void itCatchesAndDisplaysRegistrationExceptions() { - assertTrue(FakeGeneratedPluginRegistrant.getRegisteredEngines().isEmpty()); - FakeGeneratedPluginRegistrant.pluginRegistrationException = + assertTrue(GeneratedPluginRegistrant.getRegisteredEngines().isEmpty()); + GeneratedPluginRegistrant.pluginRegistrationException = new RuntimeException("I'm a bug in the plugin"); FlutterLoader mockFlutterLoader = mock(FlutterLoader.class); when(mockFlutterLoader.automaticallyRegisterPlugins()).thenReturn(true); FlutterEngine flutterEngine = new FlutterEngine(ctx, mockFlutterLoader, flutterJNI); - List registeredEngines = FakeGeneratedPluginRegistrant.getRegisteredEngines(); + List registeredEngines = GeneratedPluginRegistrant.getRegisteredEngines(); // When it crashes, it doesn't end up registering anything. assertEquals(0, registeredEngines.size()); @@ -153,26 +153,26 @@ public void itCatchesAndDisplaysRegistrationExceptions() { .msg .contains("Tried to automatically register plugins")); assertEquals( - FakeGeneratedPluginRegistrant.pluginRegistrationException, + GeneratedPluginRegistrant.pluginRegistrationException, ShadowLog.getLogsForTag("GeneratedPluginsRegister").get(1).throwable.getCause()); - FakeGeneratedPluginRegistrant.pluginRegistrationException = null; + GeneratedPluginRegistrant.pluginRegistrationException = null; } @Test public void itDoesNotAutomaticallyRegistersPluginsWhenFlutterLoaderDisablesIt() { - assertTrue(FakeGeneratedPluginRegistrant.getRegisteredEngines().isEmpty()); + assertTrue(GeneratedPluginRegistrant.getRegisteredEngines().isEmpty()); FlutterLoader mockFlutterLoader = mock(FlutterLoader.class); when(mockFlutterLoader.automaticallyRegisterPlugins()).thenReturn(false); new FlutterEngine(ctx, mockFlutterLoader, flutterJNI); - List registeredEngines = FakeGeneratedPluginRegistrant.getRegisteredEngines(); + List registeredEngines = GeneratedPluginRegistrant.getRegisteredEngines(); assertTrue(registeredEngines.isEmpty()); } @Test public void itDoesNotAutomaticallyRegistersPluginsWhenFlutterEngineDisablesIt() { - assertTrue(FakeGeneratedPluginRegistrant.getRegisteredEngines().isEmpty()); + assertTrue(GeneratedPluginRegistrant.getRegisteredEngines().isEmpty()); FlutterLoader mockFlutterLoader = mock(FlutterLoader.class); when(mockFlutterLoader.automaticallyRegisterPlugins()).thenReturn(true); new FlutterEngine( @@ -182,7 +182,7 @@ public void itDoesNotAutomaticallyRegistersPluginsWhenFlutterEngineDisablesIt() /*dartVmArgs=*/ new String[] {}, /*automaticallyRegisterPlugins=*/ false); - List registeredEngines = FakeGeneratedPluginRegistrant.getRegisteredEngines(); + List registeredEngines = GeneratedPluginRegistrant.getRegisteredEngines(); assertTrue(registeredEngines.isEmpty()); } diff --git a/shell/platform/android/test/io/flutter/plugins/GeneratedPluginRegistrant.java b/shell/platform/android/test/io/flutter/plugins/GeneratedPluginRegistrant.java new file mode 100644 index 0000000000000..387de14de371f --- /dev/null +++ b/shell/platform/android/test/io/flutter/plugins/GeneratedPluginRegistrant.java @@ -0,0 +1,55 @@ +package io.flutter.plugins; + +import androidx.annotation.NonNull; +import androidx.annotation.Nullable; +import androidx.annotation.VisibleForTesting; +import io.flutter.embedding.engine.FlutterEngine; +import java.util.ArrayList; +import java.util.List; + +/** + * A fake of the {@code GeneratedPluginRegistrant} normally built by the tool into Flutter apps. + * + *

Used to test engine logic which interacts with the generated class. + */ +@VisibleForTesting +public class GeneratedPluginRegistrant { + private static final List registeredEngines = new ArrayList<>(); + public static @Nullable RuntimeException pluginRegistrationException; + + /** + * The one and only method currently generated by the tool. + * + *

Normally it registers all plugins in an app with the given {@code engine}. This fake tracks + * all registered engines instead. + */ + public static void registerWith(@NonNull FlutterEngine engine) { + if (pluginRegistrationException != null) { + throw pluginRegistrationException; + } + registeredEngines.add(engine); + } + + /** + * Clears the mutable static state regrettably stored in this class. + * + *

{@link #registerWith} is a static call with no visible side effects. In order to verify when + * it's been called we also unfortunately need to store the state statically. This should be + * called before and after each test run accessing this class to make sure the state is clear both + * before and after the run. + */ + public static void clearRegisteredEngines() { + registeredEngines.clear(); + } + + /** + * Returns a list of all the engines registered so far. + * + *

CAUTION: This list is static and must be manually wiped in between test runs. See {@link + * #clearRegisteredEngines()}. + */ + @NonNull + public static List getRegisteredEngines() { + return new ArrayList<>(registeredEngines); + } +} From 98203e6da8a6266975fa8ed76734d80a6e36b7a9 Mon Sep 17 00:00:00 2001 From: Matan Lurey Date: Tue, 20 Feb 2024 16:31:03 -0800 Subject: [PATCH 10/10] ++ --- .../FakeGeneratedPluginRegistrant.java | 55 ------------------- 1 file changed, 55 deletions(-) delete mode 100644 shell/platform/android/test/io/flutter/plugins/FakeGeneratedPluginRegistrant.java diff --git a/shell/platform/android/test/io/flutter/plugins/FakeGeneratedPluginRegistrant.java b/shell/platform/android/test/io/flutter/plugins/FakeGeneratedPluginRegistrant.java deleted file mode 100644 index 32200846a07ef..0000000000000 --- a/shell/platform/android/test/io/flutter/plugins/FakeGeneratedPluginRegistrant.java +++ /dev/null @@ -1,55 +0,0 @@ -package io.flutter.plugins; - -import androidx.annotation.NonNull; -import androidx.annotation.Nullable; -import androidx.annotation.VisibleForTesting; -import io.flutter.embedding.engine.FlutterEngine; -import java.util.ArrayList; -import java.util.List; - -/** - * A fake of the {@code GeneratedPluginRegistrant} normally built by the tool into Flutter apps. - * - *

Used to test engine logic which interacts with the generated class. - */ -@VisibleForTesting -public class FakeGeneratedPluginRegistrant { - private static final List registeredEngines = new ArrayList<>(); - public static @Nullable RuntimeException pluginRegistrationException; - - /** - * The one and only method currently generated by the tool. - * - *

Normally it registers all plugins in an app with the given {@code engine}. This fake tracks - * all registered engines instead. - */ - public static void registerWith(@NonNull FlutterEngine engine) { - if (pluginRegistrationException != null) { - throw pluginRegistrationException; - } - registeredEngines.add(engine); - } - - /** - * Clears the mutable static state regrettably stored in this class. - * - *

{@link #registerWith} is a static call with no visible side effects. In order to verify when - * it's been called we also unfortunately need to store the state statically. This should be - * called before and after each test run accessing this class to make sure the state is clear both - * before and after the run. - */ - public static void clearRegisteredEngines() { - registeredEngines.clear(); - } - - /** - * Returns a list of all the engines registered so far. - * - *

CAUTION: This list is static and must be manually wiped in between test runs. See {@link - * #clearRegisteredEngines()}. - */ - @NonNull - public static List getRegisteredEngines() { - return new ArrayList<>(registeredEngines); - } -}