[gardening] Update flutter patch so flutter compile_test passes.

Change-Id: Ibf6a31308deac5e4ef388930308774b994feb46d
Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/97285
Reviewed-by: Alexander Aprelev <aam@google.com>
diff --git a/tools/patches/flutter-engine/7418238239f885ba92093c44a1768f8ec93b121f.flutter.patch b/tools/patches/flutter-engine/7418238239f885ba92093c44a1768f8ec93b121f.flutter.patch
index 958f83a..c69b4f8 100644
--- a/tools/patches/flutter-engine/7418238239f885ba92093c44a1768f8ec93b121f.flutter.patch
+++ b/tools/patches/flutter-engine/7418238239f885ba92093c44a1768f8ec93b121f.flutter.patch
@@ -1,5 +1,5 @@
 diff --git a/packages/flutter_tools/lib/src/compile.dart b/packages/flutter_tools/lib/src/compile.dart
-index 12c0770ab..7787bd4ca 100644
+index 12c0770ab..b7945fd64 100644
 --- a/packages/flutter_tools/lib/src/compile.dart
 +++ b/packages/flutter_tools/lib/src/compile.dart
 @@ -57,12 +57,15 @@ class TargetModel {
@@ -19,7 +19,7 @@
  /// Handles stdin/stdout communication with the frontend server.
  class StdoutHandler {
    StdoutHandler({this.consumer = printError}) {
-@@ -72,30 +75,54 @@ class StdoutHandler {
+@@ -72,40 +75,71 @@ class StdoutHandler {
    bool compilerMessageReceived = false;
    final CompilerMessageConsumer consumer;
    String boundaryKey;
@@ -28,32 +28,29 @@
 +  final List<Uri> sources = <Uri>[];
  
    bool _suppressCompilerMessages;
++  bool _expectSources;
  
    void handler(String message) {
 +    printTrace('-> $message');
      const String kResultPrefix = 'result ';
      if (boundaryKey == null && message.startsWith(kResultPrefix)) {
        boundaryKey = message.substring(kResultPrefix.length);
-     } else if (message.startsWith(boundaryKey)) {
--      if (message.length <= boundaryKey.length) {
--        compilerOutput.complete(null);
--        return;
-+      if (state == StdoutState.CollectDiagnostic) {
-+        state = StdoutState.CollectDependencies;
-+      } else {
-+        if (message.length <= boundaryKey.length) {
-+          compilerOutput.complete(null);
+-    } else if (message.startsWith(boundaryKey)) {
++      return;
++    }
++    if (message.startsWith(boundaryKey)) {
++      if (_expectSources) {
++        if (state == StdoutState.CollectDiagnostic) {
++          state = StdoutState.CollectDependencies;
 +          return;
 +        }
-+        final int spaceDelimiter = message.lastIndexOf(' ');
-+        compilerOutput.complete(
-+            CompilerOutput(
-+                message.substring(boundaryKey.length + 1, spaceDelimiter),
-+                int.parse(message.substring(spaceDelimiter + 1).trim()),
-+                sources));
++      }
+       if (message.length <= boundaryKey.length) {
+         compilerOutput.complete(null);
+         return;
        }
--      final int spaceDelimiter = message.lastIndexOf(' ');
--      compilerOutput.complete(
+       final int spaceDelimiter = message.lastIndexOf(' ');
+       compilerOutput.complete(
 -        CompilerOutput(
 -          message.substring(boundaryKey.length + 1, spaceDelimiter),
 -          int.parse(message.substring(spaceDelimiter + 1).trim())));
@@ -61,41 +58,50 @@
 -      if (compilerMessageReceived == false) {
 -        consumer('\nCompiler message:');
 -        compilerMessageReceived = true;
++          CompilerOutput(
++              message.substring(boundaryKey.length + 1, spaceDelimiter),
++              int.parse(message.substring(spaceDelimiter + 1).trim()),
++              sources));
++      return;
++    }
++    if (state == StdoutState.CollectDiagnostic) {
++      if (!_suppressCompilerMessages) {
++        if (compilerMessageReceived == false) {
++          consumer('\nCompiler message:');
++          compilerMessageReceived = true;
++        }
++        consumer(message);
++      }
 +    } else {
-+      if (state == StdoutState.CollectDiagnostic) {
-+        if (!_suppressCompilerMessages) {
-+          if (compilerMessageReceived == false) {
-+            consumer('\nCompiler message:');
-+            compilerMessageReceived = true;
-+          }
-+          consumer(message);
-+        }
-+      } else {
-+        assert(state == StdoutState.CollectDependencies);
-+        switch (message[0]) {
-+          case '+':
-+            sources.add(Uri.parse(message.substring(1)));
-+            break;
-+          case '-':
-+            sources.remove(Uri.parse(message.substring(1)));
-+            break;
-+          default:
-+            printTrace('Unexpected prefix for $message uri - ignoring');
-+        }
++      assert(state == StdoutState.CollectDependencies);
++      switch (message[0]) {
++        case '+':
++          sources.add(Uri.parse(message.substring(1)));
++          break;
++        case '-':
++          sources.remove(Uri.parse(message.substring(1)));
++          break;
++        default:
++          printTrace('Unexpected prefix for $message uri - ignoring');
        }
 -      consumer(message);
      }
    }
  
-@@ -106,6 +133,7 @@ class StdoutHandler {
+   // This is needed to get ready to process next compilation result output,
+   // with its own boundary key and new completer.
+-  void reset({ bool suppressCompilerMessages = false }) {
++  void reset({ bool suppressCompilerMessages = false, bool expectSources = true }) {
+     boundaryKey = null;
      compilerMessageReceived = false;
      compilerOutput = Completer<CompilerOutput>();
      _suppressCompilerMessages = suppressCompilerMessages;
++    _expectSources = expectSources;
 +    state = StdoutState.CollectDiagnostic;
    }
  }
  
-@@ -200,7 +228,7 @@ class KernelCompiler {
+@@ -200,7 +234,7 @@ class KernelCompiler {
  
        if (await fingerprinter.doesFingerprintMatch()) {
          printTrace('Skipping kernel compilation. Fingerprint match.');
@@ -104,7 +110,7 @@
        }
      }
  
-@@ -453,10 +481,13 @@ class ResidentCompiler {
+@@ -453,10 +487,13 @@ class ResidentCompiler {
          ? _mapFilename(request.mainPath, packageUriMapper) + ' '
          : '';
      _server.stdin.writeln('recompile $mainUri$inputKey');
@@ -118,7 +124,7 @@
  
      return _stdoutHandler.compilerOutput.future;
    }
-@@ -545,6 +576,7 @@ class ResidentCompiler {
+@@ -545,6 +582,7 @@ class ResidentCompiler {
        .listen((String message) { printError(message); });
  
      _server.stdin.writeln('compile $scriptUri');
@@ -126,7 +132,16 @@
  
      return _stdoutHandler.compilerOutput.future;
    }
-@@ -597,6 +629,7 @@ class ResidentCompiler {
+@@ -570,7 +608,7 @@ class ResidentCompiler {
+   }
+ 
+   Future<CompilerOutput> _compileExpression(_CompileExpressionRequest request) async {
+-    _stdoutHandler.reset(suppressCompilerMessages: true);
++    _stdoutHandler.reset(suppressCompilerMessages: true, expectSources: false);
+ 
+     // 'compile-expression' should be invoked after compiler has been started,
+     // program was compiled.
+@@ -597,6 +635,7 @@ class ResidentCompiler {
    void accept() {
      if (_compileRequestNeedsConfirmation) {
        _server.stdin.writeln('accept');
@@ -134,7 +149,7 @@
      }
      _compileRequestNeedsConfirmation = false;
    }
-@@ -620,6 +653,7 @@ class ResidentCompiler {
+@@ -620,6 +659,7 @@ class ResidentCompiler {
      }
      _stdoutHandler.reset();
      _server.stdin.writeln('reject');
@@ -142,7 +157,7 @@
      _compileRequestNeedsConfirmation = false;
      return _stdoutHandler.compilerOutput.future;
    }
-@@ -629,6 +663,7 @@ class ResidentCompiler {
+@@ -629,6 +669,7 @@ class ResidentCompiler {
    /// kernel file.
    void reset() {
      _server?.stdin?.writeln('reset');
@@ -163,6 +178,138 @@
      // Don't send full kernel file that would overwrite what VM already
      // started loading from.
      if (!bundleFirstUpload) {
+diff --git a/packages/flutter_tools/test/compile_test.dart b/packages/flutter_tools/test/compile_test.dart
+index b149a2a84..0d920bdbe 100644
+--- a/packages/flutter_tools/test/compile_test.dart
++++ b/packages/flutter_tools/test/compile_test.dart
+@@ -78,14 +78,17 @@ example:org-dartlang-app:/
+     });
+   });
+ 
+-  test(StdoutHandler, () async {
++  testUsingContext('StdOutHandler test', () async {
+     final StdoutHandler stdoutHandler = StdoutHandler();
+     stdoutHandler.handler('result 12345');
+     expect(stdoutHandler.boundaryKey, '12345');
++    stdoutHandler.handler('12345');
+     stdoutHandler.handler('12345 message 0');
+     final CompilerOutput output = await stdoutHandler.compilerOutput.future;
+     expect(output.errorCount, 0);
+     expect(output.outputFilename, 'message');
++  }, overrides: <Type, Generator>{
++    Logger: () => BufferLogger(),
+   });
+ 
+   group('batch compile', () {
+@@ -115,7 +118,7 @@ example:org-dartlang-app:/
+       when(mockFrontendServer.stdout)
+           .thenAnswer((Invocation invocation) => Stream<List<int>>.fromFuture(
+             Future<List<int>>.value(utf8.encode(
+-              'result abc\nline1\nline2\nabc /path/to/main.dart.dill 0'
++              'result abc\nline1\nline2\nabc\nabc /path/to/main.dart.dill 0'
+             ))
+           ));
+       final CompilerOutput output = await kernelCompiler.compile(sdkRoot: '/path/to/sdkroot',
+@@ -138,7 +141,7 @@ example:org-dartlang-app:/
+       when(mockFrontendServer.stdout)
+           .thenAnswer((Invocation invocation) => Stream<List<int>>.fromFuture(
+             Future<List<int>>.value(utf8.encode(
+-              'result abc\nline1\nline2\nabc'
++              'result abc\nline1\nline2\nabc\nabc'
+             ))
+           ));
+       final CompilerOutput output = await kernelCompiler.compile(sdkRoot: '/path/to/sdkroot',
+@@ -163,7 +166,7 @@ example:org-dartlang-app:/
+       when(mockFrontendServer.stdout)
+           .thenAnswer((Invocation invocation) => Stream<List<int>>.fromFuture(
+           Future<List<int>>.value(utf8.encode(
+-              'result abc\nline1\nline2\nabc'
++              'result abc\nline1\nline2\nabc\nabc'
+           ))
+       ));
+       final CompilerOutput output = await kernelCompiler.compile(
+@@ -220,7 +223,7 @@ example:org-dartlang-app:/
+       when(mockFrontendServer.stdout)
+           .thenAnswer((Invocation invocation) => Stream<List<int>>.fromFuture(
+             Future<List<int>>.value(utf8.encode(
+-              'result abc\nline1\nline2\nabc /path/to/main.dart.dill 0'
++              'result abc\nline1\nline2\nabc\nabc /path/to/main.dart.dill 0'
+             ))
+           ));
+ 
+@@ -264,7 +267,7 @@ example:org-dartlang-app:/
+       final StreamController<List<int>> streamController = StreamController<List<int>>();
+       when(mockFrontendServer.stdout)
+           .thenAnswer((Invocation invocation) => streamController.stream);
+-      streamController.add(utf8.encode('result abc\nline0\nline1\nabc /path/to/main.dart.dill 0\n'));
++      streamController.add(utf8.encode('result abc\nline0\nline1\nabc\nabc /path/to/main.dart.dill 0\n'));
+       await generator.recompile(
+         '/path/to/main.dart',
+         null, /* invalidatedFiles */
+@@ -278,14 +281,14 @@ example:org-dartlang-app:/
+       await _reject(streamController, generator, mockFrontendServerStdIn, '', '');
+ 
+       await _recompile(streamController, generator, mockFrontendServerStdIn,
+-        'result abc\nline1\nline2\nabc /path/to/main.dart.dill 0\n');
++        'result abc\nline1\nline2\nabc\nabc /path/to/main.dart.dill 0\n');
+ 
+       await _accept(streamController, generator, mockFrontendServerStdIn, '^accept\\n\$');
+ 
+       await _recompile(streamController, generator, mockFrontendServerStdIn,
+-          'result abc\nline1\nline2\nabc /path/to/main.dart.dill 0\n');
++          'result abc\nline1\nline2\nabc\nabc /path/to/main.dart.dill 0\n');
+ 
+-      await _reject(streamController, generator, mockFrontendServerStdIn, 'result abc\nabc\n',
++      await _reject(streamController, generator, mockFrontendServerStdIn, 'result abc\nabc\nabc\nabc',
+           '^reject\\n\$');
+ 
+       verifyNoMoreInteractions(mockFrontendServerStdIn);
+@@ -309,15 +312,15 @@ example:org-dartlang-app:/
+       when(mockFrontendServer.stdout)
+           .thenAnswer((Invocation invocation) => streamController.stream);
+       streamController.add(utf8.encode(
+-        'result abc\nline0\nline1\nabc /path/to/main.dart.dill 0\n'
++        'result abc\nline0\nline1\nabc\nabc /path/to/main.dart.dill 0\n'
+       ));
+       await generator.recompile('/path/to/main.dart', null /* invalidatedFiles */, outputPath: '/build/');
+       expect(mockFrontendServerStdIn.getAndClear(), 'compile /path/to/main.dart\n');
+ 
+       await _recompile(streamController, generator, mockFrontendServerStdIn,
+-        'result abc\nline1\nline2\nabc /path/to/main.dart.dill 0\n');
++        'result abc\nline1\nline2\nabc\nabc /path/to/main.dart.dill 0\n');
+       await _recompile(streamController, generator, mockFrontendServerStdIn,
+-        'result abc\nline2\nline3\nabc /path/to/main.dart.dill 0\n');
++        'result abc\nline2\nline3\nabc\nabc /path/to/main.dart.dill 0\n');
+ 
+       verifyNoMoreInteractions(mockFrontendServerStdIn);
+       expect(mockFrontendServerStdIn.getAndClear(), isEmpty);
+@@ -389,7 +392,7 @@ example:org-dartlang-app:/
+           compileExpressionResponseCompleter.future]));
+ 
+       compileResponseCompleter.complete(Future<List<int>>.value(utf8.encode(
+-        'result abc\nline1\nline2\nabc /path/to/main.dart.dill 0\n'
++        'result abc\nline1\nline2\nabc\nabc /path/to/main.dart.dill 0\n'
+       )));
+ 
+       await generator.recompile(
+@@ -406,7 +409,7 @@ example:org-dartlang-app:/
+ 
+         compileExpressionResponseCompleter.complete(
+             Future<List<int>>.value(utf8.encode(
+-                'result def\nline1\nline2\ndef /path/to/main.dart.dill.incremental 0\n'
++                'result def\nline1\nline2\ndef\ndef /path/to/main.dart.dill.incremental 0\n'
+             )));
+         generator.compileExpression(
+             '2+2', null, null, null, null, false).then(
+@@ -488,7 +491,7 @@ example:org-dartlang-app:/
+       );
+ 
+       compileResponseCompleter.complete(Future<List<int>>.value(utf8.encode(
+-          'result abc\nline1\nline2\nabc /path/to/main.dart.dill 0\n'
++          'result abc\nline1\nline2\nabc\nabc /path/to/main.dart.dill 0\n'
+       )));
+ 
+       expect(await lastExpressionCompleted.future, isTrue);
 diff --git a/packages/flutter_tools/test/src/mocks.dart b/packages/flutter_tools/test/src/mocks.dart
 index 42c9d8f7f..c47b4ff7c 100644
 --- a/packages/flutter_tools/test/src/mocks.dart