|  | // 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_core' as core; | 
|  | import 'dart:typed_data'; | 
|  |  | 
|  | ByteData byteDataOfString(String s) { | 
|  | return new ByteData.view((new Uint8List.fromList(s.codeUnits)).buffer); | 
|  | } | 
|  |  | 
|  | String stringOfByteData(ByteData bytes) { | 
|  | return new String.fromCharCodes(bytes.buffer.asUint8List().toList()); | 
|  | } | 
|  |  | 
|  | void expectStringFromEndpoint( | 
|  | String expected, core.MojoMessagePipeEndpoint endpoint) { | 
|  | // Query how many bytes are available. | 
|  | var result = endpoint.query(); | 
|  | assert(result != null); | 
|  | int size = result.bytesRead; | 
|  | assert(size > 0); | 
|  |  | 
|  | // Read the data. | 
|  | ByteData bytes = new ByteData(size); | 
|  | result = endpoint.read(bytes); | 
|  | assert(result != null); | 
|  | assert(size == result.bytesRead); | 
|  |  | 
|  | // Convert to a string and check. | 
|  | String msg = stringOfByteData(bytes); | 
|  | assert(expected == msg); | 
|  | } | 
|  |  | 
|  | void pipeTestIsolate(core.MojoMessagePipeEndpoint endpoint) { | 
|  | var eventStream = new core.MojoEventStream(endpoint.handle); | 
|  | eventStream.listen((List<int> event) { | 
|  | var mojoSignals = new core.MojoHandleSignals(event[1]); | 
|  | if (mojoSignals.isReadWrite) { | 
|  | throw 'We should only be reading or writing, not both.'; | 
|  | } else if (mojoSignals.isReadable) { | 
|  | expectStringFromEndpoint("Ping", endpoint); | 
|  | eventStream.enableWriteEvents(); | 
|  | } else if (mojoSignals.isWritable) { | 
|  | endpoint.write(byteDataOfString("Pong")); | 
|  | eventStream.enableReadEvents(); | 
|  | } else if (mojoSignals.isPeerClosed) { | 
|  | eventStream.close(); | 
|  | } else { | 
|  | throw 'Unexpected event.'; | 
|  | } | 
|  | }); | 
|  | } | 
|  |  | 
|  | main() { | 
|  | var pipe = new core.MojoMessagePipe(); | 
|  | var endpoint = pipe.endpoints[0]; | 
|  | var eventStream = new core.MojoEventStream(endpoint.handle); | 
|  | Isolate.spawn(pipeTestIsolate, pipe.endpoints[1]).then((_) { | 
|  | eventStream.listen((List<int> event) { | 
|  | var mojoSignals = new core.MojoHandleSignals(event[1]); | 
|  | if (mojoSignals.isReadWrite) { | 
|  | throw 'We should only be reading or writing, not both.'; | 
|  | } else if (mojoSignals.isReadable) { | 
|  | expectStringFromEndpoint("Pong", endpoint); | 
|  | eventStream.close(); | 
|  | } else if (mojoSignals.isWritable) { | 
|  | endpoint.write(byteDataOfString("Ping")); | 
|  | eventStream.enableReadEvents(); | 
|  | } else if (mojoSignals.isPeerClosed) { | 
|  | throw 'This end should close first.'; | 
|  | } else { | 
|  | throw 'Unexpected event.'; | 
|  | } | 
|  | }); | 
|  | eventStream.enableWriteEvents(); | 
|  | }); | 
|  | } |