Skip to content

Do not wait again for a closed mock event stream in tear down - #196110

Merged
auto-submit[bot] merged 3 commits into
flutter:masterfrom
YeungKC:fix-190807-end-of-stream
Nov 11, 2026
Merged

auto-submit[bot] merged 3 commits into
flutter:masterfrom
YeungKC:fix-190807-end-of-stream

Conversation

@YeungKC

@YeungKC YeungKC commented Nov 6, 2026

Copy link
Copy Markdown
Member

Fixes #190807

This continues #190808 by @SamJakob, which was approved and then closed by the bot while it waited for a reply. It has the same fix, with the review comments on #190808 applied.

TestDefaultBinaryMessenger.setMockStreamHandler adds controller.close as a tear down. If the handler already closed the stream, for example with MockStreamHandlerEventSink.endOfStream in a testWidgets body, tear down calls close() again and waits for the returned future. Tear down then does not finish, and the test times out.

The fix closes the controller in tear down only if it is not closed.

About the question on #190808: yes, the future completes. The zone is the cause. I checked this with a temporary probe in the tear down (not part of this PR):

  • The done future of the controller completes during the testWidgets body, in the fake async zone.
  • In tear down, isClosed is true, and close() returns the same done future.
  • A then callback that tear down adds to this future does not run, also after 2 seconds of real time.

A completed _Future schedules its listeners as microtasks in its own zone (_addListener in future_impl.dart). That zone is the fake async zone, and nothing flushes its microtasks after the body ends. So tear down waits forever. The comment on the guard says this.

On the other review comments on #190808:

  • The guard has a comment that says why it is necessary.
  • The test uses a 5 second timeout (not 1 second), so that a hang fails fast and a slow bot does not make the test flaky.

Tests:

  • New regression test in test_default_binary_messenger_test.dart. Without the fix it fails with TimeoutException after 0:00:05. With the fix it passes.
  • packages/flutter_test tests and packages/flutter/test/services tests pass.

Pre-launch Checklist

  • I read the Contributor Guide and followed the process outlined there for submitting PRs.
  • I read the AI contribution guidelines and understand my responsibilities, or I am not using AI tools.
  • I read the Tree Hygiene wiki page, which explains my responsibilities.
  • I read and followed the Flutter Style Guide, including Features we expect every widget to implement.
  • I signed the CLA.
  • I listed at least one issue that this PR fixes in the description above.
  • I updated/added relevant in-code documentation (doc comments with ///). No public API changed.
  • If this PR introduces a new feature or capability, I created and linked a website documentation issue or PR in flutter/website (or verified none is needed). This PR does not add a feature.
  • I added new tests to check the change I am making, or this PR is test-exempt.
  • I followed the breaking change policy and added Data Driven Fixes where supported.
  • All existing and new tests are passing. The flutter_test and flutter/test/services tests pass locally. The other tests run only in CI.

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

If a mock stream handler closes the stream, for example with
MockStreamHandlerEventSink.endOfStream in a testWidgets body, the done
future of the controller completes in the fake async zone. The tear
down called close() again and waited for that future, which never
returned. Close the controller in tear down only if it is not closed.

Co-authored-by: SamJakob <[email protected]>
@flutter-dashboard flutter-dashboard Bot added the CICD Run CI/CD label Nov 6, 2026
@github-actions github-actions Bot added a: tests "flutter test", flutter_test, or one of our tests framework flutter/packages/flutter repository. See also f: labels. labels Nov 6, 2026

@gemini-code-assist gemini-code-assist Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Code Review

This pull request modifies TestDefaultBinaryMessenger to prevent a hang during tear down when a mock stream handler has already closed the stream. It updates the tear down logic to only close the stream controller if it is not already closed. Additionally, a regression test has been added to verify that endOfStream in a mock stream handler does not cause the tear down to hang. I have no feedback to provide.

victorsanni
victorsanni previously approved these changes Nov 7, 2026

@victorsanni victorsanni left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

LGTM with 2 nits.

@victorsanni victorsanni left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

LGTM, thanks for the fix.

@victorsanni victorsanni added the autosubmit Merge PR when tree becomes green via auto submit App label Nov 11, 2026
@auto-submit
auto-submit Bot added this pull request to the merge queue Nov 11, 2026
Merged via the queue into flutter:master with commit d9b77d2 Nov 11, 2026
20 of 21 checks passed
@flutter-dashboard flutter-dashboard Bot removed the autosubmit Merge PR when tree becomes green via auto submit App label Nov 11, 2026
auto-submit Bot pushed a commit to flutter/packages that referenced this pull request Nov 11, 2026
flutter/flutter@fffd8c2...b98afb5

2026-11-11 [email protected] Roll Dart SDK from 172cf8f121c0 to 8f15c4ca2d41 (1 revision) (flutter/flutter#196367)
2026-11-11 [email protected] Roll Skia from 657283e78115 to cc4c54f752ba (5 revisions) (flutter/flutter#196365)
2026-11-11 [email protected] Roll Skia from 2605c4a9761c to 657283e78115 (1 revision) (flutter/flutter#196358)
2026-11-11 [email protected] Roll Dart SDK from 890c6d15334c to 172cf8f121c0 (1 revision) (flutter/flutter#196352)
2026-11-11 [email protected] [flutter_tools] Migrate general.shard project, runner, and web tests off globals (flutter/flutter#196128)
2026-11-11 [email protected] [flutter_tools] Migrate test helpers and integration tests off globals (flutter/flutter#196124)
2026-11-11 [email protected] [web] Report skwasm WebGL context creation failure instead of hanging (flutter/flutter#193293)
2026-11-11 [email protected] [flutter_tools] Migrate commands.shard tests off globals (flutter/flutter#196139)
2026-11-11 [email protected] [devicelab] Fix memory benchmark tap synchronization and swipe flakes (flutter/flutter#194457)
2026-11-11 [email protected] Roll Skia from 06062e36d938 to 2605c4a9761c (2 revisions) (flutter/flutter#196350)
2026-11-11 [email protected] Do not wait again for a closed mock event stream in tear down (flutter/flutter#196110)
2026-11-11 [email protected] [gen_l10n] Add `use-explicit-plural-values` option (flutter/flutter#194816)
2026-11-11 [email protected] Roll Skia from 7bd33f8a3b70 to 06062e36d938 (2 revisions) (flutter/flutter#196340)
2026-11-11 [email protected] Skip redundant work in plugin_test_* (flutter/flutter#196258)
2026-11-10 [email protected] Drop test_timeout_secs from shards that no longer need it (flutter/flutter#196277)
2026-11-10 [email protected] Roll Dart SDK from 15c1699d3eeb to 890c6d15334c (1 revision) (flutter/flutter#196321)
2026-11-10 [email protected] iOS: Extract FlutterPlatformViewsController platform-thread state to Obj-C (flutter/flutter#196142)
2026-11-10 [email protected] Remove `Mac web_tool_tests` and take new subshard builders out of bringup (flutter/flutter#196276)
2026-11-10 [email protected] Roll Skia from 9c3d43d8a04b to 7bd33f8a3b70 (12 revisions) (flutter/flutter#196317)
2026-11-10 [email protected] Take customer_testing_devtools out of bringup (flutter/flutter#196239)
2026-11-10 [email protected] Roll ICU from a0ea93436c52 to b09986242cfb (1 revision) (flutter/flutter#196316)
2026-11-10 [email protected] [flutter_tools] Avoid unlinking native_assets.json and handle EXDEV (flutter/flutter#196134)
2026-11-10 [email protected] Remove old `Windows tool_integration_tests` builders and take the new shards out of bringup (flutter/flutter#196275)
2026-11-10 [email protected] [SwiftPM] Disable tests for when settings fail to compile (flutter/flutter#196310)
2026-11-10 [email protected] Roll Fuchsia Test Scripts from PXc5D7S_q6sIYpfFJ... to oEU515sDqSTvD8Spx... (flutter/flutter#196289)
2026-11-10 [email protected] Fix ime insets animation jump (flutter/flutter#191453)
2026-11-10 [email protected] Link to original PR in automatic cherry-pick PRs (flutter/flutter#196130)
2026-11-10 [email protected] Roll Packages from 565c657 to 08faf64 (9 revisions) (flutter/flutter#196296)
2026-11-10 [email protected] Roll Skia from b11315d0a096 to 9c3d43d8a04b (45 revisions) (flutter/flutter#196295)
2026-11-10 [email protected] Replace type-specific window widgets with a single Window widget (flutter/flutter#196002)
2026-11-10 [email protected] Roll Dart SDK from a2baae273bb2 to 15c1699d3eeb (2 revisions) (flutter/flutter#196294)

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

To file a bug in Packages: 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

a: tests "flutter test", flutter_test, or one of our tests CICD Run CI/CD framework flutter/packages/flutter repository. See also f: labels.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Calling endOfStream on a MockStreamHandlerEventSink causes widget tests to hang

2 participants