blob: 89db646a54a57cebb982ee13918ab63c7ed1335b [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.
@Timeout(Duration(minutes: 2))
import 'dart:async';
import 'package:test/test.dart';
import 'package:test_common/logging.dart';
import 'package:test_common/test_sdk_configuration.dart';
import 'package:vm_service/vm_service.dart';
import 'package:vm_service_interface/vm_service_interface.dart';
import 'fixtures/context.dart';
import 'fixtures/project.dart';
import 'fixtures/utilities.dart';
void main() {
// Enable verbose logging for debugging.
final debug = false;
final provider = TestSdkConfigurationProvider(verbose: debug);
tearDownAll(provider.dispose);
final context = TestContext(TestProject.testWithSoundNullSafety, provider);
group('while debugger is attached', () {
late VmServiceInterface service;
setUp(() async {
setCurrentLogWriter(debug: debug);
await context.setUp(
testSettings: TestSettings(
autoRun: false,
verboseCompiler: debug,
),
);
service = context.service;
});
tearDown(() async {
await context.tearDown();
});
test('can resume while paused at the start', () async {
final vm = await service.getVM();
final isolate = await service.getIsolate(vm.isolates!.first.id!);
expect(isolate.pauseEvent!.kind, EventKind.kPauseStart);
final stream = service.onEvent('Debug');
final resumeCompleter = Completer();
// The underlying stream is a broadcast stream so we need to add a
// listener before calling resume so that we don't miss events.
unawaited(
stream.firstWhere((event) => event.kind == EventKind.kResume).then((_) {
resumeCompleter.complete();
}),
);
await service.resume(isolate.id!);
await resumeCompleter.future;
expect(isolate.pauseEvent!.kind, EventKind.kResume);
});
test('correctly sets the isolate pauseEvent', () async {
final vm = await service.getVM();
final isolate = await service.getIsolate(vm.isolates!.first.id!);
expect(isolate.pauseEvent!.kind, EventKind.kPauseStart);
final stream = service.onEvent('Debug');
context.appConnection.runMain();
await stream.firstWhere((event) => event.kind == EventKind.kResume);
expect(isolate.pauseEvent!.kind, EventKind.kResume);
});
});
group('while debugger is not attached', () {
setUp(() async {
setCurrentLogWriter(debug: debug);
await context.setUp(
testSettings: TestSettings(
autoRun: false,
waitToDebug: true,
),
);
});
tearDown(() async {
await context.tearDown();
});
test('correctly sets the isolate pauseEvent if already running', () async {
context.appConnection.runMain();
await context.startDebugging();
final service = context.vmService;
final vm = await service.getVM();
final isolate = await service.getIsolate(vm.isolates!.first.id!);
expect(isolate.pauseEvent!.kind, EventKind.kResume);
});
});
}