blob: e2c806a3b80e945c7ff8b5947d31afedd3aaf50a [file] [log] [blame]
// Copyright 2014 The Chromium Authors. 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:async';
import 'dart:isolate';
import 'dart:mojo_bindings' as bindings;
import 'dart:mojo_core' as core;
import 'dart:typed_data';
import 'package:mojo/dart/testing/expect.dart';
class EchoString {
String a = null;
EchoString();
static const int encodedSize = bindings.kStructHeaderSize + 8;
static EchoString decode(bindings.MojoDecoder decoder) {
var val = new EchoString();
var numBytes = decoder.readUint32();
var numFields = decoder.readUint32();
val.a = decoder.decodeStruct(bindings.MojoString);
return val;
}
static void encode(bindings.MojoEncoder encoder, EchoString val) {
encoder.writeUint32(encodedSize);
encoder.writeUint32(1);
encoder.encodeStruct(bindings.MojoString, val.a);
}
}
class EchoStringResponse extends EchoString {
static const int encodedSize = EchoString.encodedSize;
static var decode = EchoString.decode;
static var encode = EchoString.encode;
}
const int kEchoString_name = 0;
const int kEchoStringResponse_name = 1;
class EchoInterface extends bindings.Interface {
EchoInterface(core.MojoMessagePipeEndpoint endpoint) : super(endpoint);
bindings.Message handleMessage(bindings.MessageReader reader,
Function messageHandler) {
switch (reader.name) {
case kEchoString_name:
var es = reader.decodeStruct(EchoString);
var response = messageHandler(es);
return buildResponseWithID(EchoStringResponse,
kEchoStringResponse_name,
bindings.kMessageIsResponse,
response);
break;
default:
throw new Exception("Unexpected case");
break;
}
return null;
}
}
class EchoClient extends bindings.Client {
EchoClient(core.MojoMessagePipeEndpoint endpoint) : super(endpoint);
Future<EchoStringResponse> echoString(String a) {
// compose message.
var es = new EchoString();
es.a = a;
return enqueueMessageWithRequestID(EchoString,
kEchoString_name,
bindings.kMessageExpectsResponse,
es);
}
void handleResponse(bindings.MessageReader reader) {
switch (reader.name) {
case kEchoStringResponse_name:
var esr = reader.decodeStruct(EchoStringResponse);
Completer c = completerQueue.removeAt(0);
c.complete(esr);
break;
default:
throw new Exception("Unexpected case");
break;
}
}
}
void providerIsolate(core.MojoMessagePipeEndpoint endpoint) {
var provider = new EchoInterface(endpoint);
provider.listen((msg) {
if (msg is EchoString) {
var response = new EchoStringResponse();
response.a = msg.a;
return response;
}
});
}
Future<bool> runTest() async {
var testCompleter = new Completer();
var pipe = new core.MojoMessagePipe();
var client = new EchoClient(pipe.endpoints[0]);
await Isolate.spawn(providerIsolate, pipe.endpoints[1]);
int n = 100;
int count = 0;
client.open();
for (int i = 0; i < n; i++) {
client.echoString("hello").then((response) {
Expect.equals("hello", response.a);
count++;
if (i == (n - 1)) {
client.close();
testCompleter.complete(count);
}
});
}
return testCompleter.future;
}
Future runAwaitTest() async {
var pipe = new core.MojoMessagePipe();
var client = new EchoClient(pipe.endpoints[0]);
await Isolate.spawn(providerIsolate, pipe.endpoints[1]);
int n = 100;
client.open();
for (int i = 0; i < n; i++) {
var response = await client.echoString("Hello");
Expect.equals("Hello", response.a);
}
client.close();
}
main() async {
Expect.equals(100, await runTest());
await runAwaitTest();
}