blob: 1ddee0255d1a2b389e91419b027f0e36ad0f9adc [file] [log] [blame]
// Copyright (c) 2019, the Dart project authors. Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.
import 'dart:async';
import 'package:test/test.dart';
import 'package:vm_service/vm_service.dart';
import 'common/service_test_common.dart';
import 'common/test_helper.dart';
int counter = 0;
void periodicTask(_) {
counter++;
counter++; // Line 16. We set our breakpoint here.
counter++;
if (counter % 300 == 0) {
print('counter = $counter');
}
}
void startTimer() {
Timer.periodic(const Duration(milliseconds: 10), periodicTask);
}
int getLineNumberFromTokenPos(Script s, int token) =>
s.tokenPosTable![token].first;
var tests = <IsolateTest>[
// Pause
(VmService? service, IsolateRef? isolateRef) async {
final isolateId = isolateRef!.id!;
Completer completer = Completer();
var stream = service!.onDebugEvent;
late var subscription;
subscription = stream.listen((Event event) {
if (event.kind == EventKind.kPauseInterrupted) {
subscription.cancel();
completer.complete();
}
});
await service.streamListen(EventStreams.kDebug);
await service.pause(isolateId);
await completer.future;
await service.streamCancel(EventStreams.kDebug);
},
// Resume
(VmService service, IsolateRef isolate) async {
final isolateId = isolate.id!;
Completer completer = Completer();
var stream = service.onDebugEvent;
late var subscription;
subscription = stream.listen((Event event) {
if (event.kind == EventKind.kResume) {
subscription.cancel();
completer.complete();
}
});
await service.streamListen(EventStreams.kDebug);
await service.resume(isolateId);
await completer.future;
await service.streamCancel(EventStreams.kDebug);
},
// Add breakpoint
(VmService service, IsolateRef isolateRef) async {
final isolateId = isolateRef.id!;
Isolate isolate = await service.getIsolate(isolateId);
final Library rootLib =
(await service.getObject(isolateId, isolate.rootLib!.id!)) as Library;
// Set up a listener to wait for breakpoint events.
Completer completer = Completer();
var stream = service.onDebugEvent;
late var subscription;
subscription = stream.listen((Event event) {
if (event.kind == EventKind.kPauseBreakpoint) {
print('Breakpoint reached');
subscription.cancel();
completer.complete();
}
});
await service.streamListen(EventStreams.kDebug);
final Script script = (await service.getObject(
isolateId, rootLib.scripts!.first.id!)) as Script;
// Add the breakpoint.
final Breakpoint bpt =
await service.addBreakpoint(isolateId, script.id!, 16);
final SourceLocation location = bpt.location;
expect(location.script!.id, script.id);
expect(script.getLineNumberFromTokenPos(location.tokenPos!), 16);
isolate = await service.getIsolate(isolateId);
expect(isolate.breakpoints!.length, 1);
await completer.future; // Wait for breakpoint events.
await service.streamCancel(EventStreams.kDebug);
},
// We are at the breakpoint on line 16.
(VmService service, IsolateRef isolateRef) async {
final isolateId = isolateRef.id!;
final stack = await service.getStack(isolateId);
expect(stack.frames!.length, greaterThanOrEqualTo(1));
Script script = (await service.getObject(
isolateId, stack.frames![0].location!.script!.id!)) as Script;
expect(script.uri, endsWith('debugging_test.dart'));
expect(
script.getLineNumberFromTokenPos(stack.frames![0].location!.tokenPos!),
16);
},
// Stepping
(VmService service, IsolateRef isolate) async {
// Set up a listener to wait for breakpoint events.
final completer = Completer();
var stream = service.onDebugEvent;
late var subscription;
subscription = stream.listen((Event event) {
if (event.kind == EventKind.kPauseBreakpoint) {
print('Breakpoint reached');
subscription.cancel();
completer.complete();
}
});
print('performing step over');
await stepOver(service, isolate);
print('step over done');
await completer.future; // Wait for breakpoint events.
print('breakpoint completed');
},
// We are now at line 17.
(VmService service, IsolateRef isolateRef) async {
final isolateId = isolateRef.id!;
final stack = await service.getStack(isolateId);
expect(stack.frames!.length, greaterThanOrEqualTo(1));
final Script script = (await service.getObject(
isolateId, stack.frames![0].location!.script!.id!)) as Script;
expect(script.uri, endsWith('debugging_test.dart'));
expect(
script.getLineNumberFromTokenPos(stack.frames![0].location!.tokenPos!),
17);
},
// Remove breakpoint
(VmService service, IsolateRef isolateRef) async {
final isolateId = isolateRef.id!;
// Set up a listener to wait for breakpoint events.
final completer = Completer();
var stream = service.onDebugEvent;
late var subscription;
subscription = stream.listen((Event event) async {
if (event.kind == EventKind.kBreakpointRemoved) {
print('Breakpoint removed');
final isolate = await service.getIsolate(isolateId);
expect(isolate.breakpoints!.length, 0);
subscription.cancel();
completer.complete();
}
});
final Isolate isolate = await service.getIsolate(isolateId);
expect(isolate.breakpoints!.length, 1);
final bpt = isolate.breakpoints!.first;
await service.streamListen(EventStreams.kDebug);
await service.removeBreakpoint(isolateId, bpt.id!);
await completer.future;
await service.streamCancel(EventStreams.kDebug);
},
// Resume
(VmService service, IsolateRef isolate) async {
final completer = Completer();
var stream = service.onDebugEvent;
late var subscription;
subscription = stream.listen((Event event) {
if (event.kind == EventKind.kResume) {
subscription.cancel();
completer.complete();
}
});
await resumeIsolate(service, isolate);
await completer.future;
},
// Add breakpoint at function entry
(VmService service, IsolateRef isolateRef) async {
final isolateId = isolateRef.id!;
Isolate isolate = await service.getIsolate(isolateId);
// Set up a listener to wait for breakpoint events.
final completer = Completer();
var stream = service.onDebugEvent;
late var subscription;
subscription = stream.listen((Event event) {
if (event.kind == EventKind.kPauseBreakpoint) {
print('Breakpoint reached');
subscription.cancel();
completer.complete();
}
});
await service.streamListen(EventStreams.kDebug);
final Library rootLib =
(await service.getObject(isolateId, isolate.rootLib!.id!)) as Library;
// Find a specific function.
final FuncRef function =
rootLib.functions!.firstWhere((f) => f.name == 'periodicTask');
expect(function, isNotNull);
// Add the breakpoint at function entry
final bpt = await service.addBreakpointAtEntry(isolateId, function.id!);
final Script script =
(await service.getObject(isolateId, bpt.location.script.id)) as Script;
expect(script.uri, endsWith('debugging_test.dart'));
expect(script.getLineNumberFromTokenPos(bpt.location.tokenPos), 14);
// Refresh isolate state.
isolate = await service.getIsolate(isolateId);
expect(isolate.breakpoints!.length, 1);
await completer.future; // Wait for breakpoint events.
},
// We are now at line 14.
(VmService service, IsolateRef isolateRef) async {
final isolateId = isolateRef.id!;
final stack = await service.getStack(isolateId);
expect(stack.frames!.length, greaterThanOrEqualTo(1));
final Script script = (await service.getObject(
isolateId, stack.frames![0].location!.script!.id!)) as Script;
expect(script.uri, endsWith('debugging_test.dart'));
expect(
script.getLineNumberFromTokenPos(stack.frames![0].location!.tokenPos!),
14);
},
];
main([args = const <String>[]]) => runIsolateTests(
args,
tests,
'debugging_test.dart',
testeeBefore: startTimer,
);