@@ -429,49 +429,105 @@ void main() {
429
429
() async {
430
430
final ResidentRunner residentWebRunner =
431
431
setUpResidentRunner (flutterDevice, logger: testLogger);
432
- final Map <String , String > extensionData = < String , String > {
433
- 'test' : 'data' ,
434
- 'renderedErrorText' : 'error text' ,
435
- };
436
- final Map <String , String > emptyExtensionData = < String , String > {
437
- 'test' : 'data' ,
438
- 'renderedErrorText' : '' ,
439
- };
440
- final Map <String , String > nonStructuredErrorData = < String , String > {
441
- 'other' : 'other stuff' ,
442
- };
443
- fakeVmServiceHost = FakeVmServiceHost (requests: < VmServiceExpectation > [
432
+ final List <VmServiceExpectation > requests = < VmServiceExpectation > [
444
433
...kAttachExpectations,
434
+ // This is the first error message of a session.
445
435
FakeVmServiceStreamResponse (
446
436
streamId: 'Extension' ,
447
437
event: vm_service.Event (
448
438
timestamp: 0 ,
449
439
extensionKind: 'Flutter.Error' ,
450
- extensionData: vm_service.ExtensionData .parse (extensionData),
440
+ extensionData: vm_service.ExtensionData .parse (< String , Object ? > {
441
+ 'errorsSinceReload' : 0 ,
442
+ 'renderedErrorText' : 'first' ,
443
+ }),
451
444
kind: vm_service.EventStreams .kExtension,
452
445
),
453
446
),
454
- // Empty error text should not break anything .
447
+ // This is the second error message of a session .
455
448
FakeVmServiceStreamResponse (
456
449
streamId: 'Extension' ,
457
450
event: vm_service.Event (
458
451
timestamp: 0 ,
459
452
extensionKind: 'Flutter.Error' ,
460
- extensionData: vm_service.ExtensionData .parse (emptyExtensionData),
453
+ extensionData: vm_service.ExtensionData .parse (< String , Object ? > {
454
+ 'errorsSinceReload' : 1 ,
455
+ 'renderedErrorText' : 'second' ,
456
+ }),
461
457
kind: vm_service.EventStreams .kExtension,
462
458
),
463
459
),
464
- // This is not Flutter.Error kind data, so it should not be logged.
460
+ // This is not Flutter.Error kind data, so it should not be logged, even though it has a renderedErrorText field .
465
461
FakeVmServiceStreamResponse (
466
462
streamId: 'Extension' ,
467
463
event: vm_service.Event (
468
464
timestamp: 0 ,
469
465
extensionKind: 'Other' ,
470
- extensionData: vm_service.ExtensionData .parse (nonStructuredErrorData),
466
+ extensionData: vm_service.ExtensionData .parse (< String , Object ? > {
467
+ 'errorsSinceReload' : 2 ,
468
+ 'renderedErrorText' : 'not an error' ,
469
+ }),
471
470
kind: vm_service.EventStreams .kExtension,
472
471
),
473
472
),
474
- ]);
473
+ // This is the third error message of a session.
474
+ FakeVmServiceStreamResponse (
475
+ streamId: 'Extension' ,
476
+ event: vm_service.Event (
477
+ timestamp: 0 ,
478
+ extensionKind: 'Flutter.Error' ,
479
+ extensionData: vm_service.ExtensionData .parse (< String , Object ? > {
480
+ 'errorsSinceReload' : 2 ,
481
+ 'renderedErrorText' : 'third' ,
482
+ }),
483
+ kind: vm_service.EventStreams .kExtension,
484
+ ),
485
+ ),
486
+ // This is bogus error data.
487
+ FakeVmServiceStreamResponse (
488
+ streamId: 'Extension' ,
489
+ event: vm_service.Event (
490
+ timestamp: 0 ,
491
+ extensionKind: 'Flutter.Error' ,
492
+ extensionData: vm_service.ExtensionData .parse (< String , Object ? > {
493
+ 'other' : 'bad stuff' ,
494
+ }),
495
+ kind: vm_service.EventStreams .kExtension,
496
+ ),
497
+ ),
498
+ // Empty error text should not break anything.
499
+ FakeVmServiceStreamResponse (
500
+ streamId: 'Extension' ,
501
+ event: vm_service.Event (
502
+ timestamp: 0 ,
503
+ extensionKind: 'Flutter.Error' ,
504
+ extensionData: vm_service.ExtensionData .parse (< String , Object ? > {
505
+ 'test' : 'data' ,
506
+ 'renderedErrorText' : '' ,
507
+ }),
508
+ kind: vm_service.EventStreams .kExtension,
509
+ ),
510
+ ),
511
+ // Messages without errorsSinceReload should act as if errorsSinceReload: 0
512
+ FakeVmServiceStreamResponse (
513
+ streamId: 'Extension' ,
514
+ event: vm_service.Event (
515
+ timestamp: 0 ,
516
+ extensionKind: 'Flutter.Error' ,
517
+ extensionData: vm_service.ExtensionData .parse (< String , Object ? > {
518
+ 'test' : 'data' ,
519
+ 'renderedErrorText' : 'error text' ,
520
+ }),
521
+ kind: vm_service.EventStreams .kExtension,
522
+ ),
523
+ ),
524
+ // When adding things here, make sure the last one is supposed to output something
525
+ // to the statusLog, otherwise you won't be able to distinguish the absence of output
526
+ // due to it passing the test from absence due to it not running the test.
527
+ ];
528
+ // We use requests below, so make a copy of it here (FakeVmServiceHost will
529
+ // clear its copy internally, which would affect our pumping below).
530
+ fakeVmServiceHost = FakeVmServiceHost (requests: requests.toList ());
475
531
476
532
setupMocks ();
477
533
final Completer <DebugConnectionInfo > connectionInfoCompleter =
@@ -480,10 +536,34 @@ void main() {
480
536
connectionInfoCompleter: connectionInfoCompleter,
481
537
));
482
538
await connectionInfoCompleter.future;
483
- await null ;
539
+ assert (requests.length > 5 , 'requests was modified' );
540
+ for (final Object _ in requests) {
541
+ // pump the task queue once for each message
542
+ await null ;
543
+ }
484
544
485
- expect (testLogger.statusText, contains ('\n error text' ));
486
- expect (testLogger.statusText, isNot (contains ('other stuff' )));
545
+ expect (testLogger.statusText,
546
+ 'Launching lib/main.dart on FakeDevice in debug mode...\n '
547
+ 'Waiting for connection from debug service on FakeDevice...\n '
548
+ 'Debug service listening on ws://127.0.0.1/abcd/\n '
549
+ '\n '
550
+ '💪 Running with sound null safety 💪\n '
551
+ '\n '
552
+ 'first\n '
553
+ '\n '
554
+ 'second\n '
555
+ 'third\n '
556
+ '\n '
557
+ '\n ' // the empty message
558
+ '\n '
559
+ '\n '
560
+ 'error text\n '
561
+ '\n '
562
+ );
563
+
564
+ expect (testLogger.errorText,
565
+ 'Received an invalid Flutter.Error message from app: {other: bad stuff}\n '
566
+ );
487
567
}, overrides: < Type , Generator > {
488
568
FileSystem : () => fileSystem,
489
569
ProcessManager : () => processManager,
0 commit comments