diff --git a/packages/pigeon/CHANGELOG.md b/packages/pigeon/CHANGELOG.md index e3375af58e6..570cc706229 100644 --- a/packages/pigeon/CHANGELOG.md +++ b/packages/pigeon/CHANGELOG.md @@ -1,3 +1,8 @@ +## 25.5.0 + +* [dart] Changes the default InstanceManager and its initialization to no longer make a message call + when used in a Flutter unit test. + ## 25.4.0 * [gobject] Adds type id constants in header files so that they can be used by the user. diff --git a/packages/pigeon/lib/src/dart/dart_generator.dart b/packages/pigeon/lib/src/dart/dart_generator.dart index 4ce527e292a..2dcb9b2efad 100644 --- a/packages/pigeon/lib/src/dart/dart_generator.dart +++ b/packages/pigeon/lib/src/dart/dart_generator.dart @@ -146,6 +146,9 @@ class DartGenerator extends StructuredGenerator { required String dartPackageName, }) { indent.writeln("import 'dart:async';"); + if (root.containsProxyApi) { + indent.writeln("import 'dart:io' show Platform;"); + } indent.writeln( "import 'dart:typed_data' show Float64List, Int32List, Int64List, Uint8List;", ); diff --git a/packages/pigeon/lib/src/dart/templates.dart b/packages/pigeon/lib/src/dart/templates.dart index 78b8e20ef26..73fbf92035b 100644 --- a/packages/pigeon/lib/src/dart/templates.dart +++ b/packages/pigeon/lib/src/dart/templates.dart @@ -87,6 +87,9 @@ class $dartInstanceManagerClassName { late final void Function(int) onWeakReferenceRemoved; static $dartInstanceManagerClassName _initInstance() { + if (Platform.environment['FLUTTER_TEST'] == 'true') { + return $dartInstanceManagerClassName(onWeakReferenceRemoved: (_) {}); + } WidgetsFlutterBinding.ensureInitialized(); final $dartInstanceManagerApiClassName api = $dartInstanceManagerApiClassName(); // Clears the native `$dartInstanceManagerClassName` on the initial use of the Dart one. diff --git a/packages/pigeon/lib/src/generator_tools.dart b/packages/pigeon/lib/src/generator_tools.dart index 19b38e36d2e..8528dd70df8 100644 --- a/packages/pigeon/lib/src/generator_tools.dart +++ b/packages/pigeon/lib/src/generator_tools.dart @@ -15,7 +15,7 @@ import 'generator.dart'; /// The current version of pigeon. /// /// This must match the version in pubspec.yaml. -const String pigeonVersion = '25.4.0'; +const String pigeonVersion = '25.5.0'; /// Read all the content from [stdin] to a String. String readStdin() { diff --git a/packages/pigeon/platform_tests/shared_test_plugin_code/lib/src/generated/proxy_api_tests.gen.dart b/packages/pigeon/platform_tests/shared_test_plugin_code/lib/src/generated/proxy_api_tests.gen.dart index 559b4d12ee2..4f6b8593aed 100644 --- a/packages/pigeon/platform_tests/shared_test_plugin_code/lib/src/generated/proxy_api_tests.gen.dart +++ b/packages/pigeon/platform_tests/shared_test_plugin_code/lib/src/generated/proxy_api_tests.gen.dart @@ -7,6 +7,7 @@ // ignore_for_file: public_member_api_docs, non_constant_identifier_names, avoid_as, unused_import, unnecessary_parenthesis, prefer_null_aware_operators, omit_local_variable_types, unused_shown_name, unnecessary_import, no_leading_underscores_for_local_identifiers import 'dart:async'; +import 'dart:io' show Platform; import 'dart:typed_data' show Float64List, Int32List, Int64List, Uint8List; import 'package:flutter/foundation.dart' @@ -126,6 +127,9 @@ class PigeonInstanceManager { late final void Function(int) onWeakReferenceRemoved; static PigeonInstanceManager _initInstance() { + if (Platform.environment['FLUTTER_TEST'] == 'true') { + return PigeonInstanceManager(onWeakReferenceRemoved: (_) {}); + } WidgetsFlutterBinding.ensureInitialized(); final _PigeonInternalInstanceManagerApi api = _PigeonInternalInstanceManagerApi(); diff --git a/packages/pigeon/platform_tests/shared_test_plugin_code/test/instance_manager_test.dart b/packages/pigeon/platform_tests/shared_test_plugin_code/test/instance_manager_test.dart index 66f9d955202..2582ed27a02 100644 --- a/packages/pigeon/platform_tests/shared_test_plugin_code/test/instance_manager_test.dart +++ b/packages/pigeon/platform_tests/shared_test_plugin_code/test/instance_manager_test.dart @@ -167,7 +167,7 @@ void main() { instanceManager.addDartCreatedInstance(object); object = null; - await forceGC(); + await forceGC(fullGcCycles: 2); expect(weakReferencedRemovedCalled, isTrue); }); @@ -188,10 +188,49 @@ void main() { instanceManager.addHostCreatedInstance(object, 0); object = null; - await forceGC(); + await forceGC(fullGcCycles: 2); expect(weakReferencedRemovedCalled, isFalse); }); + + testWidgets( + 'instantiating default InstanceManager does not make a message call', + (WidgetTester tester) async { + bool messageCallMade = false; + TestDefaultBinaryMessengerBinding + .instance.defaultBinaryMessenger.allMessagesHandler = (_, __, ___) { + messageCallMade = true; + return null; + }; + + // Initialize default InstanceManager + // ignore: unnecessary_statements + PigeonInstanceManager.instance; + + expect(messageCallMade, isFalse); + }, + ); + + testWidgets( + 'default InstanceManager does not make message call when weak reference is removed', + (WidgetTester tester) async { + bool messageCallMade = false; + TestDefaultBinaryMessengerBinding + .instance.defaultBinaryMessenger.allMessagesHandler = (_, __, ___) { + messageCallMade = true; + return null; + }; + + final PigeonInstanceManager instanceManager = + PigeonInstanceManager.instance; + + final int identifier = + instanceManager.addDartCreatedInstance(CopyableObject()); + instanceManager.onWeakReferenceRemoved(identifier); + + expect(messageCallMade, isFalse); + }, + ); }); } diff --git a/packages/pigeon/pubspec.yaml b/packages/pigeon/pubspec.yaml index bcc34f39bec..fc25e430e75 100644 --- a/packages/pigeon/pubspec.yaml +++ b/packages/pigeon/pubspec.yaml @@ -2,7 +2,7 @@ name: pigeon description: Code generator tool to make communication between Flutter and the host platform type-safe and easier. repository: https://github.com/flutter/packages/tree/main/packages/pigeon issue_tracker: https://github.com/flutter/flutter/issues?q=is%3Aissue+is%3Aopen+label%3A%22p%3A+pigeon%22 -version: 25.4.0 # This must match the version in lib/src/generator_tools.dart +version: 25.5.0 # This must match the version in lib/src/generator_tools.dart environment: sdk: ^3.6.0