Skip to content

[pigeon] Create a message call free InstanceManager when running unit tests #9395

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 13 commits into from
Jun 18, 2025

Conversation

bparrishMines
Copy link
Contributor

@bparrishMines bparrishMines commented Jun 6, 2025

To support hot restart, PigeonInstanceManager.instance makes a call to clear the native InstanceManager when it is instantiated.

This was the source of unit test race condition flakes like flutter/flutter#164132.

The current workaround is to try/catch the async PlatformException at the top of every test file or pass a test InstanceManager to every ProxyApi class:

final MyNativeClass object = MyNativeClass(
  pigeon_instanceManager: PigeonInstanceManager(
    onWeakReferenceRemoved: (_) {}
  ),
);

This PR changes it to detect a test ran as Flutter unit test and sets the default InstanceManager with one that doesn't make any message calls.

Pre-Review Checklist

If you need help, consider asking for advice on the #hackers-new channel on Discord.

Footnotes

  1. Regular contributors who have demonstrated familiarity with the repository guidelines only need to comment if the PR is not auto-exempted by repo tooling. 2 3

@bparrishMines bparrishMines changed the title set test default instance manager [pigeon] Create a default InstanceManager when running unit tests Jun 6, 2025
@bparrishMines bparrishMines changed the title [pigeon] Create a default InstanceManager when running unit tests [pigeon] Create a message call free default InstanceManager when running unit tests Jun 6, 2025
@@ -167,7 +167,7 @@ void main() {
instanceManager.addDartCreatedInstance(object);

object = null;
await forceGC();
await forceGC(fullGcCycles: 2);
Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This test was failing on windows, so I added another cycle.

@bparrishMines bparrishMines changed the title [pigeon] Create a message call free default InstanceManager when running unit tests [pigeon] Create a message call free InstanceManager when running unit tests Jun 7, 2025
@bparrishMines bparrishMines marked this pull request as ready for review June 10, 2025 01:34
@@ -87,6 +87,9 @@ class $dartInstanceManagerClassName {
late final void Function(int) onWeakReferenceRemoved;

static $dartInstanceManagerClassName _initInstance() {
if (Platform.environment['FLUTTER_TEST'] == 'true') {
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Hm, is FLUTTER_TEST only set in unit tests? Or will this break flutter test integration test behavior?

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I forgot that integration tests also use flutter test. But I just tried it and it looks like this doesn't affect integration tests. It seems the environment variable is only for unit tests.

Copy link
Contributor Author

@bparrishMines bparrishMines Jun 12, 2025

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This is probably the case because integration tests still need to use the real BinaryMessenger. When FLUTTER_TEST is set, it uses a test BinaryMessenger from TestWidgetsFlutterBinding.

Edit:
Actually I found a bit of info on it: https://api.flutter.dev/flutter/flutter_test/LiveTestWidgetsFlutterBinding-class.html. It looks like integration tests from flutter test is treated the same way as running tests with flutter run.

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Sounds good; LGTM then.

I wish we didn't have to embed special test logic in the production code, but it seems like the best option we have at the moment.

Copy link
Contributor Author

@bparrishMines bparrishMines Jun 12, 2025

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Hmm would it be better to copy https://github.com/flutter/flutter/blob/master/packages/flutter/lib/src/foundation/_platform_io.dart#L30 then. And wrap the Platform.environment check in an assert so that it gets ignored in release mode.

static PigeonInstanceManager _initInstance() {
    PigeonInstanceManager? instanceManager;
    assert(() {
      if (Platform.environment.containsKey('FLUTTER_TEST')) {
        instanceManager = PigeonInstanceManager(onWeakReferenceRemoved: (_) {});
      }
      return true;
    }());
    if (instanceManager == null) {
      // ...
    }
    return instanceManager!;
  }

@bparrishMines bparrishMines added the autosubmit Merge PR when tree becomes green via auto submit App label Jun 18, 2025
@auto-submit auto-submit bot merged commit 39c588a into flutter:main Jun 18, 2025
78 checks passed
@bparrishMines bparrishMines deleted the test_instancemanager branch June 18, 2025 23:20
engine-flutter-autoroll added a commit to engine-flutter-autoroll/flutter that referenced this pull request Jun 19, 2025
engine-flutter-autoroll added a commit to engine-flutter-autoroll/flutter that referenced this pull request Jun 19, 2025
github-merge-queue bot pushed a commit to flutter/flutter that referenced this pull request Jun 19, 2025
flutter/packages@715a0a5...0ec4053

2025-06-19 [email protected] Roll Flutter from
8303a96 to 85a9b4f (93 revisions) (flutter/packages#9457)
2025-06-19 [email protected] [go_router]
Update sype safe routing topic to use mixin from go_router_builder 3.0.0
(flutter/packages#9422)
2025-06-19 [email protected] [go_router] fix:
PopScope.onPopInvokedWithResult not called in branch routes
(flutter/packages#9245)
2025-06-18 [email protected] [pigeon]
Create a message call free InstanceManager when running unit tests
(flutter/packages#9395)
2025-06-18 [email protected] [go_router] Use
library prefix for meta (flutter/packages#9434)
2025-06-18 [email protected] [go_router] fix
Popping state and re-rendering scaffold at the same time doesn't update
the URL on web [new] (flutter/packages#8352)
2025-06-18 [email protected] [camera_avfoundation] Fix
incorrect types in image stream events (flutter/packages#9418)
2025-06-18 [email protected] [go_router_builder] Temporarily
restrict `build` (flutter/packages#9453)

If this roll has caused a breakage, revert this CL and stop the roller
using the controls here:
https://autoroll.skia.org/r/flutter-packages-flutter-autoroll
Please CC [email protected] on the revert to ensure that a
human
is aware of the problem.

To file a bug in Flutter:
https://github.com/flutter/flutter/issues/new/choose

To report a problem with the AutoRoller itself, please file a bug:
https://issues.skia.org/issues/new?component=1389291&template=1850622

Documentation for the AutoRoller is here:
https://skia.googlesource.com/buildbot/+doc/main/autoroll/README.md
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
autosubmit Merge PR when tree becomes green via auto submit App p: pigeon
Projects
None yet
Development

Successfully merging this pull request may close these issues.

3 participants