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(); |
+ } |
+ }); |
+ } |
+ }); |
+ }); |
+} |