Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(179)

Unified Diff: test/isolate_test.dart

Issue 1670283002: add sendRequest to VMIsolateRef Base URL: git@github.com:yjbanov/vm_service_client.git@master
Patch Set: dartdocs Created 4 years, 10 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« lib/src/isolate.dart ('K') | « lib/src/stream_manager.dart ('k') | no next file » | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: test/isolate_test.dart
diff --git a/test/isolate_test.dart b/test/isolate_test.dart
index b08bdd9158db4d4326739dbc8fc1e97da022cfe2..5f1d062b2c55e2f02897e5171b04a3a41af7145b 100644
--- a/test/isolate_test.dart
+++ b/test/isolate_test.dart
@@ -165,6 +165,97 @@ void main() {
expect(other.onExit, completes);
});
});
+
+ test("onServiceExtensionAdded fires when an extension is added", () async {
+ client = await runAndConnect(main: """
+ registerExtension('ext.test', (_, __) {});
+ """, flags: ["--pause-isolates-on-start"]);
+
+ var isolate = await (await client.getVM()).isolates.first.loadRunnable();
+ await isolate.waitUntilPaused();
+ await isolate.resume();
+
+ String ext = await isolate.onServiceExtensionAdded.first;
+ expect(ext, 'ext.test');
+ });
+ });
+
+ group("onExtensionEvent", () {
+ test("emits extension events", () async {
nweiz 2016/02/17 21:35:41 Nit: this test and the selectExtensionEvents test
yjbanov 2016/02/17 23:51:43 Done.
+ client = await runAndConnect(main: """
+ postEvent('foo', {'bar': 'baz'});
+ """, flags: ["--pause-isolates-on-start"]);
+
+ var isolate = await (await client.getVM()).isolates.first.load();
+ await isolate.waitUntilPaused();
+ await isolate.resume();
nweiz 2016/02/17 21:35:41 There's no point to waiting until the isolate is p
yjbanov 2016/02/17 23:51:43 Done.
+
+ var event = await isolate.onExtensionEvent.first;
nweiz 2016/02/17 21:35:41 I'd like to assert that this is the only event emi
yjbanov 2016/02/17 23:51:43 Done, but used a different method. onlyEvent does
nweiz 2016/02/18 00:24:06 How does your approach apply to the streams in the
yjbanov 2016/02/18 01:00:22 Switched to onlyEvent. See below.
+ expect(event.kind, 'foo');
+ expect(event.data, {'bar': 'baz'});
+ });
+ });
+
+ group("selectExtensionEvents", () {
+ test("chooses by extension kind", () async {
+ client = await runAndConnect(main: """
+ postEvent('foo', {'prefixed': false});
+ postEvent('bar.baz', {'prefixed': true});
+ postEvent('not.captured', {});
+ """, flags: ["--pause-isolates-on-start"]);
+
+ var isolate = await (await client.getVM()).isolates.first.load();
+ await isolate.resume();
nweiz 2016/02/17 21:35:41 You definitely want a waitUntilPaused here, and yo
yjbanov 2016/02/17 23:51:44 Probably not necessary when pausing on start, but
+
+ var unprefixedEvent = isolate.selectExtensionEvents('foo').first;
+ var prefixedEvent =
+ isolate.selectExtensionEvents('bar.', prefix: true).first;
+ expect((await unprefixedEvent).kind, 'foo');
+ expect((await prefixedEvent).kind, 'bar.baz');
+ });
+ });
+
+ group("waitForExtension", () {
+ test("notifies when the extension is already registered", () async {
+ client = await runAndConnect(main: """
+ registerExtension('ext.test', (_, __) {});
+ """);
+
+ var isolate = await (await client.getVM()).isolates.first.load();
nweiz 2016/02/17 21:35:41 If we don't wait for some signal that [registerExt
yjbanov 2016/02/17 23:51:43 Seems like an very unlikely scenario, but done.
nweiz 2016/02/18 00:24:06 One thing I've learned from writing a lot of async
+ isolate.waitForExtension('ext.test').then(expectAsync((value) {
nweiz 2016/02/17 21:35:41 You can just write expect(isolate.waitForExtension
yjbanov 2016/02/17 23:51:44 Acknowledged. In this case I'm also checking on th
+ expect(value, isNull,
+ reason: 'we are not expecting a value, just Future completion');
+ }));
+ });
+
+ test("notifies when the extension is registered later", () async {
+ client = await runAndConnect(main: """
+ registerExtension('ext.one', (_, __) {
+ registerExtension('ext.two', (_, __) {});
+ });
+ """);
+
+ var isolate = await (await client.getVM()).isolates.first.load();
+ isolate.waitForExtension('ext.two').then(expectAsync((value) {
+ expect(value, isNull,
nweiz 2016/02/17 21:35:41 I don't particularly care about asserting that und
yjbanov 2016/02/17 23:51:43 I do, primarily because we're piping futures and s
nweiz 2016/02/18 00:24:06 I am against it. Any void future could theoretical
yjbanov 2016/02/18 01:00:22 Not if you test that it doesn't.
+ reason: 'we are not expecting a value, just Future completion');
+ }));
+
+ await isolate.waitForExtension('ext.one');
+ isolate.invokeExtension('ext.one');
+ });
+ });
+
+ group("load", () {
+ test("loads extensionRPCs", () async {
+ client = await runAndConnect(main: """
+ registerExtension('ext.foo', (_, __) {});
+ registerExtension('ext.bar', (_, __) {});
+ """);
+
+ var isolate = await (await client.getVM()).isolates.first.load();
+ expect(isolate.extensionRPCs, unorderedEquals(['ext.foo', 'ext.bar']));
+ });
});
group("loadRunnable", () {
@@ -375,6 +466,44 @@ void main() {
expect(breakpoint.number, equals(1));
});
});
+
+ group("invokeExtension", () {
+ test("enforces ext. prefix", () async {
+ var client = await runAndConnect();
+ var isolate = await (await client.getVM()).isolates.first.loadRunnable();
+ expect(() => isolate.invokeExtension('noprefix'), throwsArgumentError);
+ });
+
+ test("forwards to scope", () async {
+ var client = await runAndConnect(main: r"""
+ registerExtension('ext.ping', (_, __) async {
+ return new ServiceExtensionResponse.result('{"type": "pong"}');
+ });
+ """);
+
+ var isolate = await (await client.getVM()).isolates.first.loadRunnable();
+ var response = await isolate.invokeExtension('ext.ping');
+ expect(response, {'type': 'pong'});
+ });
+
+ test("passes parameters", () async {
+ var client = await runAndConnect(main: r"""
+ registerExtension('ext.params', (_, params) async {
+ return new ServiceExtensionResponse.result('''{
+ "foo": "${params['foo']}"
+ }''');
+ });
+ """);
+
+ var isolate = await (await client.getVM()).isolates.first.loadRunnable();
+ var response = await isolate.invokeExtension('ext.params', {
+ 'foo': 'bar',
+ });
+ expect(response, {
+ 'foo': 'bar',
+ });
+ });
nweiz 2016/02/17 21:35:41 I forgot to suggest this earlier, but it would pro
yjbanov 2016/02/17 23:51:43 Good point. Done.
+ });
}
/// Starts a client with two unpaused empty isolates.
« lib/src/isolate.dart ('K') | « lib/src/stream_manager.dart ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698