|
2 | 2 | // Use of this source code is governed by a BSD-style license that can be
|
3 | 3 | // found in the LICENSE file.
|
4 | 4 |
|
| 5 | +import 'dart:async'; |
| 6 | + |
| 7 | +import 'package:fake_async/fake_async.dart'; |
5 | 8 | import 'package:file/memory.dart';
|
6 | 9 | import 'package:file_testing/file_testing.dart';
|
7 | 10 | import 'package:flutter_tools/src/base/file_system.dart';
|
@@ -181,6 +184,58 @@ void main() {
|
181 | 184 | ), throwsToolExit(message: 'Engine start event is missing in the timeline'));
|
182 | 185 | });
|
183 | 186 |
|
| 187 | + testWithoutContext('prints when first frame is taking a long time', () async { |
| 188 | + final BufferLogger logger = BufferLogger.test(); |
| 189 | + final FileSystem fileSystem = MemoryFileSystem.test(); |
| 190 | + final Completer<void> completer = Completer<void>(); |
| 191 | + await FakeAsync().run((FakeAsync time) { |
| 192 | + final Map<String, String> extensionData = <String, String>{ |
| 193 | + 'test': 'data', |
| 194 | + 'renderedErrorText': 'error text', |
| 195 | + }; |
| 196 | + final FakeVmServiceHost fakeVmServiceHost = FakeVmServiceHost(requests: <VmServiceExpectation>[ |
| 197 | + const FakeVmServiceRequest( |
| 198 | + method: 'streamListen', |
| 199 | + args: <String, Object>{ |
| 200 | + 'streamId': vm_service.EventKind.kExtension, |
| 201 | + } |
| 202 | + ), |
| 203 | + const FakeVmServiceRequest( |
| 204 | + method: kListViewsMethod, |
| 205 | + jsonResponse: <String, Object>{ |
| 206 | + 'views': <Object>[ |
| 207 | + <String, Object?>{ |
| 208 | + 'id': '1', |
| 209 | + // No isolate, no views. |
| 210 | + 'isolate': null, |
| 211 | + } |
| 212 | + ], |
| 213 | + }, |
| 214 | + ), |
| 215 | + FakeVmServiceStreamResponse( |
| 216 | + streamId: 'Extension', |
| 217 | + event: vm_service.Event( |
| 218 | + timestamp: 0, |
| 219 | + extensionKind: 'Flutter.Error', |
| 220 | + extensionData: vm_service.ExtensionData.parse(extensionData), |
| 221 | + kind: vm_service.EventStreams.kExtension, |
| 222 | + ), |
| 223 | + ), |
| 224 | + ]); |
| 225 | + unawaited(downloadStartupTrace(fakeVmServiceHost.vmService, |
| 226 | + output: fileSystem.currentDirectory, |
| 227 | + logger: logger, |
| 228 | + )); |
| 229 | + time.elapse(const Duration(seconds: 11)); |
| 230 | + time.flushMicrotasks(); |
| 231 | + completer.complete(); |
| 232 | + return completer.future; |
| 233 | + }); |
| 234 | + expect(logger.statusText, contains('First frame is taking longer than expected')); |
| 235 | + expect(logger.traceText, contains('id: 1 isolate: null')); |
| 236 | + expect(logger.traceText, contains('Flutter.Error: [ExtensionData {test: data, renderedErrorText: error text}]')); |
| 237 | + }); |
| 238 | + |
184 | 239 | testWithoutContext('throws tool exit if first frame events are missing', () async {
|
185 | 240 | final BufferLogger logger = BufferLogger.test();
|
186 | 241 | final FileSystem fileSystem = MemoryFileSystem.test();
|
|
0 commit comments