fix: `very_good test` intermittently crashes (exit 255) because test events split across stdout chunks are dropped
I maintainer di solito rispondono entro 1 giorno
Nessuno ha ancora preso questa issue.
Valutazione
- Difficoltà
- 3/5
- Tempo stimato
- 1-2 giorni
- Idoneità per principianti
- 57/100
Direzione di ricerca
Read lib/src/very_good_test_runner.dart, especially mapToTestEvents and _splitLines, then inspect the related tests for event stream parsing. Reproduce parsing with a JSON event split across stdout chunks and verify that it is emitted as one event, including when a multibyte character crosses a chunk boundary. The issue also points to test_cli_runner.dart null assertions as a possible follow-up.
Scritto dal modello di indicizzazione a partire dal testo della issue.
Descrizione
Description
very_good test intermittently crashes with exit code 255 after the tests have run. No test failed, and no coverage file is written:
Unhandled exception:
Null check operator used on a null value
#0 _testCommand.<anonymous closure> (package:very_good_cli/src/cli/test_cli_runner.dart:580:45)
#1 _RootZone.runUnaryGuarded (dart:async/zone.dart:963:10)
#2 _BufferingStreamSubscription._sendData (dart:async/stream_impl.dart:381:11)
This looks like the same symptom as #1627. That issue was closed because it could no longer be reproduced. I think the cause explains why it is intermittent.
Root cause
very_good_test_runner 0.4.0 (the latest; very_good_cli 1.5.0 depends on ^0.4.0) turns the flutter test --machine stdout into events like this (lib/src/very_good_test_runner.dart, mapToTestEvents):
return map(utf8.decode)
.expand<String>(_splitLines)
.map<Map<String, Object?>>(_tryDecode)
.where((value) => value.isNotEmpty)
.map(TestEvent.fromJson);
_splitLines splits each raw stdout chunk on \n. Lines are not buffered across chunk boundaries. A JSON event that straddles two chunks becomes two fragments. _tryDecode fails on both and returns {}, and the where drops them silently. When the lost event is a testStart, the later testDone for that ID reaches tests[event.testID]! in test_cli_runner.dart and throws.
Where a chunk boundary falls depends on pipe timing. That explains why the crash is rare, why it does not follow any particular test, and why it "goes away" on a rerun. Suites that emit many long print events (for example many Skip: messages) make it more likely.
Suggested fix
Decode and split lines across chunks, for example:
return transform(utf8.decoder)
.transform(const LineSplitter())
.map((line) => line.trim())
.map<Map<String, Object?>>(_tryDecode)
.where((value) => value.isNotEmpty)
.map(TestEvent.fromJson);
utf8.decoder as a transformer also handles a multi-byte character that is split across chunks. utf8.decode per chunk would throw on one. Separately, the ! lookups in test_cli_runner.dart (tests[event.testID]!, suites[test.suiteID]!) could degrade gracefully instead of crashing the whole run, as #1627 already suggested.
Environment
| Item | Value |
|---|---|
very_good_cli |
1.5.0 |
very_good_test_runner |
0.4.0 |
| Flutter | 3.47.7 (stable) on macOS, Apple Silicon |
| Command | very_good test --coverage --min-coverage 100 --test-randomize-ordering-seed random |
| Suite size | ~11,000 tests |
| Frequency | 2 of ~10 full runs in one day; reruns of the same tree pass |
- Lingua principale
- Dart
- Stelle
- 2.4k
- Fork
- 245
- Merge medio
- 2g 16h
- PR unite (30g)
- 21
Preparare l'ambiente
- Nessun Dockerfile né file Docker Compose
- Ha un modello di pull request
- Leggi la guida per i contributori
Come iniziare
- Leggi tutta la issue e poi la guida ai contributi del progetto.
- Commenta sulla issue per dire che te ne occupi tu — evita che due persone facciano lo stesso lavoro.
- Fai un fork del repository e lavora su un branch.
- Apri una pull request che faccia riferimento al numero della issue.
Altre issue di VeryGoodOpenSource/very_good_cli
-
Difficoltà 2/5 1-3 ore Idoneità per principianti 82/100
VeryGoodOpenSource/very_good_cli#1783 ·
I maintainer di solito rispondono entro 1 giorno
-
feature
Difficoltà 5/5 Più di una settimana Idoneità per principianti 35/100
VeryGoodOpenSource/very_good_cli#1782 ·
I maintainer di solito rispondono entro 1 giorno
-
bug
Difficoltà 4/5 1-2 giorni Idoneità per principianti 55/100
VeryGoodOpenSource/very_good_cli#1781 · 1 reazione ·
I maintainer di solito rispondono entro 1 giorno
-
bug
Difficoltà 4/5 3-5 giorni Idoneità per principianti 42/100
VeryGoodOpenSource/very_good_cli#1780 ·
I maintainer di solito rispondono entro 1 giorno
-
bug
Difficoltà 3/5 1-2 giorni Idoneità per principianti 67/100
VeryGoodOpenSource/very_good_cli#1779 ·
I maintainer di solito rispondono entro 1 giorno
Tutte le issue di VeryGoodOpenSource/very_good_cli
Issue simili
-
Difficoltà 2/5 1-3 ore Idoneità per principianti 78/100
Tencent/tdesign-flutter#1229 · 1 commento ·
I maintainer di solito rispondono entro 1 giorno
-
Difficoltà 1/5 Meno di un'ora Idoneità per principianti 88/100
berkmancenter/frankly#732 ·
I maintainer di solito rispondono entro 1 giorno
-
Difficoltà 2/5 1-3 ore Idoneità per principianti 82/100
rodydavis/signals.dart#510 ·
-
enhancement good first issue
Difficoltà 2/5 1-3 ore Idoneità per principianti 62/100
pentakoron1/brazier#33 ·
I maintainer di solito rispondono entro 1 giorno
-
bug good first issue help wanted
Difficoltà 2/5 1-3 ore Idoneità per principianti 86/100
LonelyGriffin/noetec#51 ·