Unverified Commit 2bada609 authored by Jonah Williams's avatar Jonah Williams Committed by GitHub

[flutter_tools] add timeline ANR integration test (#79991)

parent ac770423
...@@ -55,6 +55,50 @@ class BasicProject extends Project { ...@@ -55,6 +55,50 @@ class BasicProject extends Project {
int get topLevelFunctionBreakpointLine => lineContaining(main, '// TOP LEVEL BREAKPOINT'); int get topLevelFunctionBreakpointLine => lineContaining(main, '// TOP LEVEL BREAKPOINT');
} }
class BasicProjectWithTimelineTraces extends Project {
@override
final String pubspec = '''
name: test
environment:
sdk: ">=2.12.0-0 <3.0.0"
dependencies:
flutter:
sdk: flutter
''';
@override
final String main = r'''
import 'dart:async';
import 'dart:developer';
import 'package:flutter/material.dart';
Future<void> main() async {
while (true) {
runApp(new MyApp());
await Future.delayed(const Duration(milliseconds: 50));
Timeline.instantSync('main');
}
}
class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
topLevelFunction();
return new MaterialApp( // BUILD BREAKPOINT
title: 'Flutter Demo',
home: new Container(),
);
}
}
topLevelFunction() {
print("topLevelFunction"); // TOP LEVEL BREAKPOINT
}
''';
}
class BasicProjectWithFlutterGen extends Project { class BasicProjectWithFlutterGen extends Project {
@override @override
final String generatedFile = ''' final String generatedFile = '''
......
...@@ -843,7 +843,11 @@ class SourcePosition { ...@@ -843,7 +843,11 @@ class SourcePosition {
Future<Isolate> waitForExtension(VmService vmService, String extension) async { Future<Isolate> waitForExtension(VmService vmService, String extension) async {
final Completer<void> completer = Completer<void>(); final Completer<void> completer = Completer<void>();
await vmService.streamListen(EventStreams.kExtension); try {
await vmService.streamListen(EventStreams.kExtension);
} on RPCError {
// Do nothing, already subscribed.
}
vmService.onExtensionEvent.listen((Event event) { vmService.onExtensionEvent.listen((Event event) {
if (event.json['extensionKind'] == 'Flutter.FrameworkInitialization') { if (event.json['extensionKind'] == 'Flutter.FrameworkInitialization') {
completer.complete(); completer.complete();
......
// Copyright 2014 The Flutter Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
// @dart = 2.8
import 'dart:async';
import 'package:file/file.dart';
import 'package:vm_service/vm_service.dart';
import 'package:vm_service/vm_service_io.dart';
import '../src/common.dart';
import 'test_data/basic_project.dart';
import 'test_driver.dart';
import 'test_utils.dart';
void main() {
Directory tempDir;
FlutterRunTestDriver flutter;
VmService vmService;
setUp(() async {
tempDir = createResolvedTempDirectorySync('vmservice_integration_test.');
final BasicProjectWithTimelineTraces project = BasicProjectWithTimelineTraces();
await project.setUpIn(tempDir);
flutter = FlutterRunTestDriver(tempDir);
await flutter.run(withDebugger: true);
final int port = flutter.vmServicePort;
vmService = await vmServiceConnectUri('ws://localhost:$port/ws');
});
tearDown(() async {
await flutter?.stop();
tryToDelete(tempDir);
});
// Regression test for https://github.com/flutter/flutter/issues/79498
testWithoutContext('Can connect to the timeline without getting ANR from the application', () async {
final Timer timer = Timer(const Duration(minutes: 5), () {
print(
'Warning: test isolate is still active after 5 minutes. This is likely an '
'app-not-responding error and not a flake. See https://github.com/flutter/flutter/issues/79498 '
'for the bug this test is attempting to exercise.'
);
});
// Subscribe to all available streams.
await Future.wait(<Future<void>>[
vmService.streamListen(EventStreams.kVM),
vmService.streamListen(EventStreams.kIsolate),
vmService.streamListen(EventStreams.kDebug),
vmService.streamListen(EventStreams.kGC),
vmService.streamListen(EventStreams.kExtension),
vmService.streamListen(EventStreams.kTimeline),
vmService.streamListen(EventStreams.kLogging),
vmService.streamListen(EventStreams.kService),
vmService.streamListen(EventStreams.kHeapSnapshot),
vmService.streamListen(EventStreams.kStdout),
vmService.streamListen(EventStreams.kStderr),
]);
// Verify that the app can be interacted with by querying the brightness
// for 30 seconds. Once this time has elapsed, wait for any pending requests and
// exit. If the app stops responding, the requests made will hang.
bool interactionCompleted = false;
Timer(const Duration(seconds: 30), () {
interactionCompleted = true;
});
final Isolate isolate = await waitForExtension(vmService, 'ext.flutter.brightnessOverride');
while (!interactionCompleted) {
final Response response = await vmService.callServiceExtension(
'ext.flutter.brightnessOverride',
isolateId: isolate.id,
);
expect(response.json['value'], 'Brightness.light');
}
timer.cancel();
});
}
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment