Index: mojo/public/dart/system/tests/event_handler_test.dart |
diff --git a/mojo/public/dart/system/tests/event_handler_test.dart b/mojo/public/dart/system/tests/event_handler_test.dart |
new file mode 100644 |
index 0000000000000000000000000000000000000000..77d073944f39e86036596f62f76082b4c78ddf83 |
--- /dev/null |
+++ b/mojo/public/dart/system/tests/event_handler_test.dart |
@@ -0,0 +1,103 @@ |
+// 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:typed_data'; |
+ |
+import 'package:mojo/public/dart/utils/lib/expect.dart'; |
+import 'package:mojo/public/dart/system/lib/core.dart'; |
+import 'package:mojo/public/dart/system/lib/embedder.dart' as embedder; |
+ |
+ |
+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 rawMessagePingPongIsolate(MojoMessagePipeEndpoint endpoint) { |
+ int pings = 0; |
+ MojoHandle handle = new MojoHandle(endpoint.handle); |
+ handle.listen((int mojo_handle_signal) { |
+ if (MojoHandleSignals.isReadWrite(mojo_handle_signal)) { |
+ throw new Exception("Unexpected signal"); |
+ } else if (MojoHandleSignals.isReadable(mojo_handle_signal)) { |
+ // Query how many bytes are available. |
+ List result = endpoint.query(); |
+ int size = result[1]; |
+ |
+ // Read the data. |
+ ByteData bytes = new ByteData(size); |
+ endpoint.read(bytes); |
+ |
+ // Convert to string and output. |
+ String msg = stringOfByteData(bytes); |
+ Expect.equals("Ping", msg); |
+ pings = 10; |
+ handle.toggleWriteEvents(); |
+ } else if (MojoHandleSignals.isWritable(mojo_handle_signal)) { |
+ endpoint.write(byteDataOfString("Pong")); |
+ handle.toggleWriteEvents(); |
+ } |
+ }, onDone: () { |
+ handle.close(); |
+ Expect.equals(10, pings); |
+ }); |
+} |
+ |
+ |
+void rawMessagePingPongTest() { |
+ var pipe = new MojoMessagePipe(); |
+ |
+ Isolate.spawn(rawMessagePingPongIsolate, pipe.endpoints[0]).then((isolate) { |
+ MojoMessagePipeEndpoint endpoint = pipe.endpoints[1]; |
+ MojoHandle handle = new MojoHandle(endpoint.handle); |
+ handle.toggleWriteEvents(); |
+ int count = 10; |
+ int pongs = 0; |
+ handle.timeout(const Duration(seconds: 1), |
+ onTimeout: (es) { |
+ es.close(); |
+ }).listen((int mojo_handle_signal) { |
+ if (MojoHandleSignals.isReadWrite(mojo_handle_signal)) { |
+ throw new Exception("Unexpected signal"); |
+ } else if (MojoHandleSignals.isReadable(mojo_handle_signal)) { |
+ // Query how many bytes are available. |
+ List result = endpoint.query(); |
+ int size = result[1]; |
+ |
+ // Read the data. |
+ ByteData bytes = new ByteData(size); |
+ endpoint.read(bytes); |
+ |
+ // Convert to string and output. |
+ String msg = stringOfByteData(bytes); |
+ Expect.equals("Pong", msg); |
+ pongs++; |
+ handle.toggleWriteEvents(); |
+ count--; |
+ } else if (MojoHandleSignals.isWritable(mojo_handle_signal)) { |
+ if (count > 0) { |
+ endpoint.write(byteDataOfString("Ping")); |
+ } |
+ handle.toggleWriteEvents(); |
+ } |
+ }, onDone: () { |
+ handle.close(); |
+ Expect.equals(10, pongs); |
+ }); |
+ }); |
+} |
+ |
+ |
+main() { |
+ embedder.mojoEmbedderInit().then((status) { |
+ rawMessagePingPongTest(); |
+ }); |
+} |