OLD | NEW |
(Empty) | |
| 1 // Copyright 2014 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. |
| 4 |
| 5 // This test mimics the implementation of an interface without relying on |
| 6 // the code generation step. |
| 7 |
| 8 import 'dart:async'; |
| 9 import 'dart:isolate'; |
| 10 import 'dart:typed_data'; |
| 11 |
| 12 import 'package:mojo/public/dart/utils/lib/expect.dart'; |
| 13 import 'package:mojo/public/dart/bindings/lib/bindings.dart' as bindings; |
| 14 import 'package:mojo/public/dart/system/lib/core.dart' as core; |
| 15 import 'package:mojo/public/dart/system/lib/embedder.dart' as embedder; |
| 16 |
| 17 // import '../bindings/lib/bindings.dart' as bindings; |
| 18 // import '../system/lib/core.dart' as core; |
| 19 // import '../system/lib/embedder.dart' as embedder; |
| 20 |
| 21 const int VALUE = 0; |
| 22 |
| 23 class EchoString implements bindings.MojoType<EchoString> { |
| 24 String a = null; |
| 25 |
| 26 EchoString(); |
| 27 |
| 28 static const int encodedSize = bindings.kStructHeaderSize + 8; |
| 29 static EchoString decode(bindings.MojoDecoder decoder) { |
| 30 var val = new EchoString(); |
| 31 var num_bytes = decoder.readUint32(); |
| 32 var num_fields = decoder.readUint32(); |
| 33 val.a = decoder.decodeStruct(bindings.MojoString); |
| 34 return val; |
| 35 } |
| 36 static void encode(bindings.MojoEncoder encoder, EchoString val) { |
| 37 encoder.writeUint32(encodedSize); |
| 38 encoder.writeUint32(1); |
| 39 encoder.encodeStruct(bindings.MojoString, val.a); |
| 40 } |
| 41 } |
| 42 |
| 43 |
| 44 class EchoStringResponse extends EchoString { |
| 45 static const int encodedSize = EchoString.encodedSize; |
| 46 static var decode = EchoString.decode; |
| 47 static var encode = EchoString.encode; |
| 48 } |
| 49 |
| 50 |
| 51 const int kEchoString_name = 0; |
| 52 const int kEchoStringResponse_name = 1; |
| 53 |
| 54 abstract class EchoInterface extends bindings.Interface { |
| 55 EchoInterface(core.MojoMessagePipeEndpoint endpoint) : super(endpoint); |
| 56 |
| 57 Future<EchoStringResponse> echoString(EchoString msg); |
| 58 |
| 59 Future<bindings.Message> handleMessage(bindings.MessageReader reader) { |
| 60 var response_message = new Completer(); |
| 61 switch (reader.name) { |
| 62 case kEchoString_name: |
| 63 var es = reader.decodeStruct(EchoString); |
| 64 echoString(es).then((response) { |
| 65 buildResponse(response_message, |
| 66 EchoStringResponse, |
| 67 kEchoStringResponse_name, |
| 68 response); |
| 69 }); |
| 70 break; |
| 71 default: |
| 72 throw new Exception("Unexpected case"); |
| 73 break; |
| 74 } |
| 75 return response_message.future; |
| 76 } |
| 77 } |
| 78 |
| 79 |
| 80 abstract class EchoCalls { |
| 81 List get send_queue; |
| 82 core.MojoHandle get handle; |
| 83 |
| 84 Future<List> enqueueMessage(Type t, int name, Object msg); |
| 85 |
| 86 Future<List> echoString(String a) { |
| 87 // compose message. |
| 88 var es = new EchoString(); |
| 89 es.a = a; |
| 90 return enqueueMessage(EchoString, kEchoString_name, es); |
| 91 } |
| 92 } |
| 93 |
| 94 |
| 95 class EchoClient extends bindings.Client with EchoCalls { |
| 96 EchoClient(core.MojoMessagePipeEndpoint endpoint) : super(endpoint); |
| 97 |
| 98 void handleResponse(bindings.MessageReader reader) { |
| 99 switch (reader.name) { |
| 100 case kEchoStringResponse_name: |
| 101 var esr = reader.decodeStruct(EchoStringResponse); |
| 102 Completer c = completer_queue.removeAt(0); |
| 103 c.complete(esr); |
| 104 break; |
| 105 default: |
| 106 throw new Exception("Unexpected case"); |
| 107 break; |
| 108 } |
| 109 } |
| 110 } |
| 111 |
| 112 |
| 113 class EchoInterfaceImpl extends EchoInterface { |
| 114 EchoInterfaceImpl(core.MojoMessagePipeEndpoint endpoint) : super(endpoint); |
| 115 |
| 116 Future<EchoStringResponse> echoString(EchoString msg) { |
| 117 var response = new EchoStringResponse(); |
| 118 response.a = msg.a; |
| 119 return new Future.value(response); |
| 120 } |
| 121 } |
| 122 |
| 123 |
| 124 void providerIsolate(core.MojoMessagePipeEndpoint endpoint) { |
| 125 var provider = new EchoInterfaceImpl(endpoint); |
| 126 } |
| 127 |
| 128 |
| 129 main() { |
| 130 embedder.mojoEmbedderInit().then((status) { |
| 131 var pipe = new core.MojoMessagePipe(); |
| 132 var client = new EchoClient(pipe.endpoints[0]); |
| 133 Isolate.spawn(providerIsolate, pipe.endpoints[1]).then((_) { |
| 134 int n = 100; |
| 135 for (int i = 0; i < n; i++) { |
| 136 client.echoString("hello").then((response) { |
| 137 Expect.equals("hello", response.a); |
| 138 if (i == (n - 1)) { |
| 139 client.close(); |
| 140 } |
| 141 }); |
| 142 } |
| 143 }); |
| 144 }); |
| 145 } |
OLD | NEW |