-
Notifications
You must be signed in to change notification settings - Fork 3.3k
[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
[pigeon] Create a message call free InstanceManager when running unit tests #9395
Conversation
@@ -167,7 +167,7 @@ void main() { | |||
instanceManager.addDartCreatedInstance(object); | |||
|
|||
object = null; | |||
await forceGC(); | |||
await forceGC(fullGcCycles: 2); |
There was a problem hiding this comment.
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.
@@ -87,6 +87,9 @@ class $dartInstanceManagerClassName { | |||
late final void Function(int) onWeakReferenceRemoved; | |||
|
|||
static $dartInstanceManagerClassName _initInstance() { | |||
if (Platform.environment['FLUTTER_TEST'] == 'true') { |
There was a problem hiding this comment.
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?
There was a problem hiding this comment.
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.
There was a problem hiding this comment.
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
.
There was a problem hiding this comment.
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.
There was a problem hiding this comment.
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!;
}
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
To support hot restart,
PigeonInstanceManager.instance
makes a call to clear the nativeInstanceManager
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 asyncPlatformException
at the top of every test file or pass a testInstanceManager
to everyProxyApi
class: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
[shared_preferences]
pubspec.yaml
with an appropriate new version according to the pub versioning philosophy, or I have commented below to indicate which version change exemption this PR falls under1.CHANGELOG.md
to add a description of the change, following repository CHANGELOG style, or I have commented below to indicate which CHANGELOG exemption this PR falls under1.///
).If you need help, consider asking for advice on the #hackers-new channel on Discord.
Footnotes
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