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. |