Chromium Code Reviews| 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. |