| Index: mojo/public/dart/tests/echo_test.dart
|
| diff --git a/mojo/public/dart/tests/echo_test.dart b/mojo/public/dart/tests/echo_test.dart
|
| new file mode 100644
|
| index 0000000000000000000000000000000000000000..cca43c527d91ea741bcc951fb270e0a6dc8a0ee0
|
| --- /dev/null
|
| +++ b/mojo/public/dart/tests/echo_test.dart
|
| @@ -0,0 +1,145 @@
|
| +// 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.
|
| +
|
| +// This test mimics the implementation of an interface without relying on
|
| +// the code generation step.
|
| +
|
| +import 'dart:async';
|
| +import 'dart:isolate';
|
| +import 'dart:typed_data';
|
| +
|
| +import 'package:mojo/public/dart/utils/lib/expect.dart';
|
| +import 'package:mojo/public/dart/bindings/lib/bindings.dart' as bindings;
|
| +import 'package:mojo/public/dart/system/lib/core.dart' as core;
|
| +import 'package:mojo/public/dart/system/lib/embedder.dart' as embedder;
|
| +
|
| +// import '../bindings/lib/bindings.dart' as bindings;
|
| +// import '../system/lib/core.dart' as core;
|
| +// import '../system/lib/embedder.dart' as embedder;
|
| +
|
| +const int VALUE = 0;
|
| +
|
| +class EchoString implements bindings.MojoType<EchoString> {
|
| + String a = null;
|
| +
|
| + EchoString();
|
| +
|
| + static const int encodedSize = bindings.kStructHeaderSize + 8;
|
| + static EchoString decode(bindings.MojoDecoder decoder) {
|
| + var val = new EchoString();
|
| + var num_bytes = decoder.readUint32();
|
| + var num_fields = 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;
|
| +
|
| +abstract class EchoInterface extends bindings.Interface {
|
| + EchoInterface(core.MojoMessagePipeEndpoint endpoint) : super(endpoint);
|
| +
|
| + Future<EchoStringResponse> echoString(EchoString msg);
|
| +
|
| + Future<bindings.Message> handleMessage(bindings.MessageReader reader) {
|
| + var response_message = new Completer();
|
| + switch (reader.name) {
|
| + case kEchoString_name:
|
| + var es = reader.decodeStruct(EchoString);
|
| + echoString(es).then((response) {
|
| + buildResponse(response_message,
|
| + EchoStringResponse,
|
| + kEchoStringResponse_name,
|
| + response);
|
| + });
|
| + break;
|
| + default:
|
| + throw new Exception("Unexpected case");
|
| + break;
|
| + }
|
| + return response_message.future;
|
| + }
|
| +}
|
| +
|
| +
|
| +abstract class EchoCalls {
|
| + List get send_queue;
|
| + core.MojoHandle get handle;
|
| +
|
| + Future<List> enqueueMessage(Type t, int name, Object msg);
|
| +
|
| + Future<List> echoString(String a) {
|
| + // compose message.
|
| + var es = new EchoString();
|
| + es.a = a;
|
| + return enqueueMessage(EchoString, kEchoString_name, es);
|
| + }
|
| +}
|
| +
|
| +
|
| +class EchoClient extends bindings.Client with EchoCalls {
|
| + EchoClient(core.MojoMessagePipeEndpoint endpoint) : super(endpoint);
|
| +
|
| + void handleResponse(bindings.MessageReader reader) {
|
| + switch (reader.name) {
|
| + case kEchoStringResponse_name:
|
| + var esr = reader.decodeStruct(EchoStringResponse);
|
| + Completer c = completer_queue.removeAt(0);
|
| + c.complete(esr);
|
| + break;
|
| + default:
|
| + throw new Exception("Unexpected case");
|
| + break;
|
| + }
|
| + }
|
| +}
|
| +
|
| +
|
| +class EchoInterfaceImpl extends EchoInterface {
|
| + EchoInterfaceImpl(core.MojoMessagePipeEndpoint endpoint) : super(endpoint);
|
| +
|
| + Future<EchoStringResponse> echoString(EchoString msg) {
|
| + var response = new EchoStringResponse();
|
| + response.a = msg.a;
|
| + return new Future.value(response);
|
| + }
|
| +}
|
| +
|
| +
|
| +void providerIsolate(core.MojoMessagePipeEndpoint endpoint) {
|
| + var provider = new EchoInterfaceImpl(endpoint);
|
| +}
|
| +
|
| +
|
| +main() {
|
| + embedder.mojoEmbedderInit().then((status) {
|
| + var pipe = new core.MojoMessagePipe();
|
| + var client = new EchoClient(pipe.endpoints[0]);
|
| + Isolate.spawn(providerIsolate, pipe.endpoints[1]).then((_) {
|
| + int n = 100;
|
| + for (int i = 0; i < n; i++) {
|
| + client.echoString("hello").then((response) {
|
| + Expect.equals("hello", response.a);
|
| + if (i == (n - 1)) {
|
| + client.close();
|
| + }
|
| + });
|
| + }
|
| + });
|
| + });
|
| +}
|
|
|