// Copyright (c) 2018, 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:developer'; import 'package:observatory/service_io.dart'; import 'package:test/test.dart'; import 'service_test_common.dart'; import 'test_helper.dart'; libraryFunction() => "foobar1"; class Klass { @pragma('vm:entry-point') static classFunction(x) => "foobar2" + x; @pragma('vm:entry-point') instanceFunction(x, y) => "foobar3" + x + y; } var instance; @pragma('vm:entry-point') var apple; @pragma('vm:entry-point') var banana; void testFunction() { instance = new Klass(); apple = "apple"; banana = "banana"; debugger(); } @pragma('vm:entry-point') void foo() { print('foobar'); } @pragma('vm:entry-point') void invokeFunction(Function func) { func(); } var tests = [ hasStoppedAtBreakpoint, (Isolate isolate) async { Library lib = isolate.rootLibrary; await lib.load(); final fooFunc = lib.functions.singleWhere((func) => func.name == "foo"); Class cls = lib.classes.singleWhere((cls) => cls.name == "Klass"); Field field = lib.variables.singleWhere((field) => field.name == "instance"); await field.load(); Instance instance = field.staticValue as Instance; field = lib.variables.singleWhere((field) => field.name == "apple"); await field.load(); Instance apple = field.staticValue as Instance; field = lib.variables.singleWhere((field) => field.name == "banana"); await field.load(); Instance banana = field.staticValue as Instance; dynamic result = await isolate.invokeRpc("invoke", {"targetId": lib.id, "selector": "libraryFunction", "argumentIds": []}); print(result); expect(result.valueAsString, equals('foobar1')); result = await isolate.invokeRpc("invoke", { "targetId": cls.id, "selector": "classFunction", "argumentIds": [apple.id] }); print(result); expect(result.valueAsString, equals('foobar2apple')); result = await isolate.invokeRpc("invoke", { "targetId": instance.id, "selector": "instanceFunction", "argumentIds": [apple.id, banana.id] }); print(result); expect(result.valueAsString, equals('foobar3applebanana')); // Wrong arity. await expectError( () => isolate.invokeRpc("invoke", { "targetId": instance.id, "selector": "instanceFunction", "argumentIds": [apple.id] }), ServerRpcException.kExpressionCompilationError); // Non-instance argument. await expectError( () => isolate.invokeRpc("invoke", { "targetId": lib.id, "selector": "invokeFunction", "argumentIds": [fooFunc.id] }), ServerRpcException.kInvalidParams); // No such target. await expectError( () => isolate.invokeRpc("invoke", { "targetId": instance.id, "selector": "functionDoesNotExist", "argumentIds": [apple.id] }), ServerRpcException.kExpressionCompilationError); }, resumeIsolate, ]; expectError(func, code) async { bool gotException = false; dynamic result; try { result = await func(); expect(result.type, equals('Error')); // dart1 semantics } on ServerRpcException catch (e) { expect(e.code, code); gotException = true; } if (result?.type != 'Error') { expect(gotException, true); // dart2 semantics } } main(args) => runIsolateTests(args, tests, testeeConcurrent: testFunction);