blob: 03d4731f382add97509ed035d1123e1357fb3334 [file] [log] [blame]
// Copyright (c) 2015, 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.
// VMOptions=--error_on_bad_type --error_on_bad_override
import 'package:observatory/service_io.dart';
import 'package:unittest/unittest.dart';
import 'test_helper.dart';
import 'dart:async';
doThrow() {
throw "TheException"; // Line 13.
return "end of doThrow";
}
doCaught() {
try {
doThrow();
} catch (e) {}
return "end of doCaught";
}
doUncaught() {
doThrow();
return "end of doUncaught";
}
var tests = [
(Isolate isolate) async {
var lib = await isolate.rootLibrary.reload();
var onPaused = null;
var onResume = null;
var stream = await isolate.vm.getEventStream(VM.kDebugStream);
var subscription;
subscription = stream.listen((ServiceEvent event) {
print("Event $event");
if (event.kind == ServiceEvent.kPauseException) {
if (onPaused == null) throw "Unexpected pause event $event";
var t = onPaused;
onPaused = null;
t.complete(event);
}
if (event.kind == ServiceEvent.kResume) {
if (onResume == null) throw "Unexpected resume event $event";
var t = onResume;
onResume = null;
t.complete(event);
}
});
test(String pauseMode,
String expression,
bool shouldPause,
bool shouldBeCaught) async {
print("Evaluating $expression with pause on $pauseMode exception");
expect((await isolate.setExceptionPauseMode(pauseMode)) is DartError,
isFalse);
var t;
if (shouldPause) {
t = new Completer();
onPaused = t;
}
var fres = lib.evaluate(expression);
if (shouldPause) {
await t.future;
var stack = await isolate.getStack();
expect(stack['frames'][0].function.name, equals('doThrow'));
// Ugh, no .line. expect(stack['frames'][0].location.line, equals(17));
t = new Completer();
onResume = t;
isolate.resume();
await t.future;
}
var res = await fres;
print(res);
if (shouldBeCaught) {
expect(res.isInstance, isTrue);
expect(res.isString, isTrue);
expect(res.valueAsString, equals("end of doCaught"));
} else {
expect(res.isError, isTrue);
await res.load(); // Weird?
expect(res.exception.isInstance, isTrue);
expect(res.exception.isString, isTrue);
expect(res.exception.valueAsString, equals("TheException"));
}
}
await test("All", "doCaught()", true, true);
await test("All", "doUncaught()", true, false);
await test("Unhandled", "doCaught()", false, true);
await test("Unhandled", "doUncaught()", true, false);
await test("None", "doCaught()", false, true);
await test("None", "doUncaught()", false, false);
subscription.cancel();
},
];
main(args) => runIsolateTests(args, tests);