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 import 'dart:typed_data'; |
| 6 |
| 7 import 'package:mojo/public/dart/utils/lib/expect.dart'; |
| 8 import 'package:mojo/public/dart/system/lib/core.dart'; |
| 9 import 'package:mojo/public/dart/system/lib/embedder.dart' as embedder; |
| 10 |
| 11 // import '../../tests/expect.dart'; |
| 12 // import '../lib/core.dart'; |
| 13 // import '../lib/embedder.dart' as embedder; |
| 14 |
| 15 invalidHandleTest() { |
| 16 RawMojoHandle invalid_handle = new RawMojoHandle(RawMojoHandle.INVALID); |
| 17 |
| 18 // Close. |
| 19 int res = invalid_handle.close(); |
| 20 Expect.isTrue(MojoResult.isInvalidArgument(res)); |
| 21 |
| 22 // Wait. |
| 23 res = invalid_handle.wait(MojoHandleSignals.READWRITE, 1000000); |
| 24 Expect.isTrue(MojoResult.isInvalidArgument(res)); |
| 25 |
| 26 res = RawMojoHandle.waitMany([invalid_handle.h], |
| 27 [MojoHandleSignals.READWRITE], |
| 28 RawMojoHandle.DEADLINE_INDEFINITE); |
| 29 Expect.isTrue(MojoResult.isInvalidArgument(res)); |
| 30 |
| 31 // Message pipe. |
| 32 MojoMessagePipe pipe = new MojoMessagePipe(); |
| 33 Expect.isNotNull(pipe); |
| 34 ByteData bd = new ByteData(10); |
| 35 pipe.endpoints[0].handle.close(); |
| 36 pipe.endpoints[1].handle.close(); |
| 37 res = pipe.endpoints[0].write(bd); |
| 38 Expect.isTrue(MojoResult.isInvalidArgument(pipe.endpoints[0].status)); |
| 39 |
| 40 List read_result = pipe.endpoints[0].read(bd); |
| 41 Expect.isTrue(MojoResult.isInvalidArgument(pipe.endpoints[0].status)); |
| 42 |
| 43 // Data pipe. |
| 44 MojoDataPipe data_pipe = new MojoDataPipe(); |
| 45 Expect.isNotNull(data_pipe); |
| 46 data_pipe.producer.handle.close(); |
| 47 data_pipe.consumer.handle.close(); |
| 48 |
| 49 res = data_pipe.producer.write(bd); |
| 50 Expect.isTrue(MojoResult.isInvalidArgument(data_pipe.producer.status)); |
| 51 |
| 52 ByteData write_data = data_pipe.producer.beginWrite(10); |
| 53 Expect.isNull(write_data); |
| 54 Expect.isTrue(MojoResult.isInvalidArgument(data_pipe.producer.status)); |
| 55 data_pipe.producer.endWrite(10); |
| 56 Expect.isTrue(MojoResult.isInvalidArgument(data_pipe.producer.status)); |
| 57 |
| 58 int read = data_pipe.consumer.read(bd); |
| 59 Expect.isTrue(MojoResult.isInvalidArgument(data_pipe.consumer.status)); |
| 60 |
| 61 ByteData read_data = data_pipe.consumer.beginRead(10); |
| 62 Expect.isNull(read_data); |
| 63 Expect.isTrue(MojoResult.isInvalidArgument(data_pipe.consumer.status)); |
| 64 data_pipe.consumer.endRead(10); |
| 65 Expect.isTrue(MojoResult.isInvalidArgument(data_pipe.consumer.status)); |
| 66 |
| 67 // Shared buffer. |
| 68 MojoSharedBuffer shared_buffer = new MojoSharedBuffer.create(10); |
| 69 Expect.isNotNull(shared_buffer); |
| 70 shared_buffer.close(); |
| 71 MojoSharedBuffer dup = new MojoSharedBuffer.duplicate(shared_buffer); |
| 72 Expect.isNull(dup); |
| 73 |
| 74 shared_buffer = new MojoSharedBuffer.create(10); |
| 75 Expect.isNotNull(shared_buffer); |
| 76 shared_buffer.close(); |
| 77 res = shared_buffer.map(0, 10); |
| 78 Expect.isTrue(MojoResult.isInvalidArgument(res)); |
| 79 } |
| 80 |
| 81 |
| 82 basicMessagePipeTest() { |
| 83 MojoMessagePipe pipe = new MojoMessagePipe(); |
| 84 Expect.isNotNull(pipe); |
| 85 Expect.isTrue(MojoResult.isOk(pipe.status)); |
| 86 Expect.isNotNull(pipe.endpoints); |
| 87 |
| 88 MojoMessagePipeEndpoint end0 = pipe.endpoints[0]; |
| 89 MojoMessagePipeEndpoint end1 = pipe.endpoints[1]; |
| 90 Expect.isTrue(RawMojoHandle.isValid(end0.handle)); |
| 91 Expect.isTrue(RawMojoHandle.isValid(end1.handle)); |
| 92 |
| 93 // Not readable, yet. |
| 94 int res = end0.handle.wait(MojoHandleSignals.READABLE, 0); |
| 95 Expect.isTrue(MojoResult.isDeadlineExceeded(res)); |
| 96 |
| 97 // Should be writable. |
| 98 res = end0.handle.wait(MojoHandleSignals.WRITABLE, 0); |
| 99 Expect.isTrue(MojoResult.isOk(res)); |
| 100 |
| 101 // Try to read. |
| 102 ByteData data = new ByteData(10); |
| 103 end0.read(data); |
| 104 Expect.isTrue(MojoResult.isShouldWait(end0.status)); |
| 105 |
| 106 // Write end1. |
| 107 String hello = "hello"; |
| 108 ByteData hello_data = |
| 109 new ByteData.view((new Uint8List.fromList(hello.codeUnits)).buffer); |
| 110 res = end1.write(hello_data); |
| 111 Expect.isTrue(MojoResult.isOk(res)); |
| 112 |
| 113 // end0 should now be readable. |
| 114 res = RawMojoHandle.waitMany([end0.handle.h], |
| 115 [MojoHandleSignals.READABLE], |
| 116 RawMojoHandle.DEADLINE_INDEFINITE); |
| 117 Expect.isTrue(MojoResult.isOk(res)); |
| 118 |
| 119 // Read from end0. |
| 120 List read_result = end0.read(data); |
| 121 Expect.isNotNull(read_result); |
| 122 Expect.equals(read_result.length, 3); |
| 123 Expect.isTrue(MojoResult.isOk(read_result[0])); |
| 124 Expect.equals(read_result[1], hello_data.lengthInBytes); |
| 125 Expect.equals(read_result[2], 0); |
| 126 |
| 127 String hello_result = new String.fromCharCodes( |
| 128 data.buffer.asUint8List().sublist(0, read_result[1]).toList()); |
| 129 Expect.equals(hello_result, "hello"); |
| 130 |
| 131 // end0 should no longer be readable. |
| 132 res = end0.handle.wait(MojoHandleSignals.READABLE, 10); |
| 133 Expect.isTrue(MojoResult.isDeadlineExceeded(res)); |
| 134 |
| 135 // Close end0's handle. |
| 136 res = end0.handle.close(); |
| 137 Expect.isTrue(MojoResult.isOk(res)); |
| 138 |
| 139 // end1 should no longer be readable or writable. |
| 140 res = end1.handle.wait(MojoHandleSignals.READWRITE, 1000); |
| 141 Expect.isTrue(MojoResult.isFailedPrecondition(res)); |
| 142 |
| 143 res = end1.handle.close(); |
| 144 Expect.isTrue(MojoResult.isOk(res)); |
| 145 } |
| 146 |
| 147 |
| 148 basicDataPipeTest() { |
| 149 MojoDataPipe pipe = new MojoDataPipe(); |
| 150 Expect.isNotNull(pipe); |
| 151 Expect.isTrue(MojoResult.isOk(pipe.status)); |
| 152 Expect.notEquals(pipe.consumer.handle, RawMojoHandle.INVALID); |
| 153 Expect.notEquals(pipe.producer.handle, RawMojoHandle.INVALID); |
| 154 |
| 155 MojoDataPipeProducer producer = pipe.producer; |
| 156 MojoDataPipeConsumer consumer = pipe.consumer; |
| 157 Expect.notEquals(producer.handle.h, RawMojoHandle.INVALID); |
| 158 Expect.notEquals(consumer.handle.h, RawMojoHandle.INVALID); |
| 159 |
| 160 // Consumer should not be readable. |
| 161 int res = consumer.handle.wait(MojoHandleSignals.READABLE, 0); |
| 162 Expect.isTrue(MojoResult.isDeadlineExceeded(res)); |
| 163 |
| 164 // Producer should be writable. |
| 165 res = producer.handle.wait(MojoHandleSignals.WRITABLE, 0); |
| 166 Expect.isTrue(MojoResult.isOk(res)); |
| 167 |
| 168 // Try to read from consumer. |
| 169 ByteData buffer = new ByteData(20); |
| 170 consumer.read(buffer, buffer.lengthInBytes, MojoDataPipeConsumer.FLAG_NONE); |
| 171 Expect.isTrue(MojoResult.isShouldWait(consumer.status)); |
| 172 |
| 173 // Try to begin a two-phase read from consumer. |
| 174 ByteData b = consumer.beginRead(20, MojoDataPipeConsumer.FLAG_NONE); |
| 175 Expect.isNull(b); |
| 176 Expect.isTrue(MojoResult.isShouldWait(consumer.status)); |
| 177 |
| 178 // Write to producer. |
| 179 String hello = "hello "; |
| 180 ByteData hello_data = |
| 181 new ByteData.view((new Uint8List.fromList(hello.codeUnits)).buffer); |
| 182 int written = producer.write( |
| 183 hello_data, hello_data.lengthInBytes, MojoDataPipeProducer.FLAG_NONE); |
| 184 Expect.isTrue(MojoResult.isOk(producer.status)); |
| 185 Expect.equals(written, hello_data.lengthInBytes); |
| 186 |
| 187 // Now that we have written, the consumer should be readable. |
| 188 res = RawMojoHandle.waitMany([consumer.handle.h], |
| 189 [MojoHandleSignals.READABLE], |
| 190 RawMojoHandle.DEADLINE_INDEFINITE); |
| 191 Expect.isTrue(MojoResult.isOk(res)); |
| 192 |
| 193 // Do a two-phase write to the producer. |
| 194 ByteData two_phase_write = producer.beginWrite( |
| 195 20, MojoDataPipeProducer.FLAG_NONE); |
| 196 Expect.isTrue(MojoResult.isOk(producer.status)); |
| 197 Expect.isNotNull(two_phase_write); |
| 198 Expect.isTrue(two_phase_write.lengthInBytes >= 20); |
| 199 |
| 200 String world = "world"; |
| 201 two_phase_write.buffer.asUint8List().setAll(0, world.codeUnits); |
| 202 producer.endWrite(Uint8List.BYTES_PER_ELEMENT * world.codeUnits.length); |
| 203 Expect.isTrue(MojoResult.isOk(producer.status)); |
| 204 |
| 205 // Read one character from consumer. |
| 206 int read = consumer.read(buffer, 1, MojoDataPipeConsumer.FLAG_NONE); |
| 207 Expect.isTrue(MojoResult.isOk(consumer.status)); |
| 208 Expect.equals(read, 1); |
| 209 |
| 210 // Close the producer. |
| 211 res = producer.handle.close(); |
| 212 Expect.isTrue(MojoResult.isOk(res)); |
| 213 |
| 214 // Consumer should still be readable. |
| 215 res = consumer.handle.wait(MojoHandleSignals.READABLE, 0); |
| 216 Expect.isTrue(MojoResult.isOk(res)); |
| 217 |
| 218 // Get the number of remaining bytes. |
| 219 int remaining = consumer.read( |
| 220 null, 0, MojoDataPipeConsumer.FLAG_QUERY); |
| 221 Expect.isTrue(MojoResult.isOk(consumer.status)); |
| 222 Expect.equals(remaining, "hello world".length - 1); |
| 223 |
| 224 // Do a two-phase read. |
| 225 ByteData two_phase_read = consumer.beginRead( |
| 226 remaining, MojoDataPipeConsumer.FLAG_NONE); |
| 227 Expect.isTrue(MojoResult.isOk(consumer.status)); |
| 228 Expect.isNotNull(two_phase_read); |
| 229 Expect.isTrue(two_phase_read.lengthInBytes <= remaining); |
| 230 |
| 231 Uint8List uint8_list = buffer.buffer.asUint8List(); |
| 232 uint8_list.setAll(1, two_phase_read.buffer.asUint8List()); |
| 233 uint8_list = uint8_list.sublist(0, 1 + two_phase_read.lengthInBytes); |
| 234 |
| 235 consumer.endRead(two_phase_read.lengthInBytes); |
| 236 Expect.isTrue(MojoResult.isOk(consumer.status)); |
| 237 |
| 238 String hello_world = new String.fromCharCodes( |
| 239 uint8_list.toList()); |
| 240 Expect.equals("hello world", hello_world); |
| 241 |
| 242 res = consumer.handle.close(); |
| 243 Expect.isTrue(MojoResult.isOk(res)); |
| 244 } |
| 245 |
| 246 |
| 247 basicSharedBufferTest() { |
| 248 MojoSharedBuffer mojo_buffer = new MojoSharedBuffer.create( |
| 249 100, MojoSharedBuffer.CREATE_FLAG_NONE); |
| 250 Expect.isNotNull(mojo_buffer); |
| 251 Expect.isNotNull(mojo_buffer.status); |
| 252 Expect.isTrue(MojoResult.isResult(mojo_buffer.status)); |
| 253 Expect.isTrue(MojoResult.isOk(mojo_buffer.status)); |
| 254 Expect.isNotNull(mojo_buffer.handle); |
| 255 Expect.isTrue(mojo_buffer.handle is RawMojoHandle); |
| 256 Expect.notEquals(mojo_buffer.handle.h, RawMojoHandle.INVALID); |
| 257 |
| 258 mojo_buffer.map(0, 100, MojoSharedBuffer.MAP_FLAG_NONE); |
| 259 Expect.isNotNull(mojo_buffer.status); |
| 260 Expect.isTrue(MojoResult.isResult(mojo_buffer.status)); |
| 261 Expect.isTrue(MojoResult.isOk(mojo_buffer.status)); |
| 262 Expect.isNotNull(mojo_buffer.mapping); |
| 263 Expect.isTrue(mojo_buffer.mapping is ByteData); |
| 264 |
| 265 mojo_buffer.mapping.setInt8(50, 42); |
| 266 |
| 267 MojoSharedBuffer duplicate = new MojoSharedBuffer.duplicate( |
| 268 mojo_buffer, MojoSharedBuffer.DUPLICATE_FLAG_NONE); |
| 269 Expect.isNotNull(duplicate); |
| 270 Expect.isNotNull(duplicate.status); |
| 271 Expect.isTrue(MojoResult.isResult(duplicate.status)); |
| 272 Expect.isTrue(MojoResult.isOk(duplicate.status)); |
| 273 Expect.isTrue(duplicate.handle is RawMojoHandle); |
| 274 Expect.notEquals(duplicate.handle.h, RawMojoHandle.INVALID); |
| 275 Expect.isNotNull(duplicate.mapping); |
| 276 Expect.isTrue(duplicate.mapping is ByteData); |
| 277 |
| 278 mojo_buffer.close(); |
| 279 mojo_buffer = null; |
| 280 |
| 281 duplicate.mapping.setInt8(51, 43); |
| 282 |
| 283 duplicate.unmap(); |
| 284 Expect.isNotNull(duplicate.status); |
| 285 Expect.isTrue(MojoResult.isResult(duplicate.status)); |
| 286 Expect.isTrue(MojoResult.isOk(duplicate.status)); |
| 287 Expect.isNull(duplicate.mapping); |
| 288 |
| 289 duplicate.map(50, 50, MojoSharedBuffer.MAP_FLAG_NONE); |
| 290 Expect.isNotNull(duplicate.status); |
| 291 Expect.isTrue(MojoResult.isResult(duplicate.status)); |
| 292 Expect.isTrue(MojoResult.isOk(duplicate.status)); |
| 293 Expect.isNotNull(duplicate.mapping); |
| 294 Expect.isTrue(duplicate.mapping is ByteData); |
| 295 |
| 296 Expect.equals(duplicate.mapping.getInt8(0), 42); |
| 297 Expect.equals(duplicate.mapping.getInt8(1), 43); |
| 298 |
| 299 duplicate.unmap(); |
| 300 Expect.isNotNull(duplicate.status); |
| 301 Expect.isTrue(MojoResult.isResult(duplicate.status)); |
| 302 Expect.isTrue(MojoResult.isOk(duplicate.status)); |
| 303 Expect.isNull(duplicate.mapping); |
| 304 |
| 305 duplicate.close(); |
| 306 duplicate = null; |
| 307 } |
| 308 |
| 309 main() { |
| 310 embedder.mojoEmbedderInit().then((status) { |
| 311 invalidHandleTest(); |
| 312 basicMessagePipeTest(); |
| 313 basicDataPipeTest(); |
| 314 basicSharedBufferTest(); |
| 315 }); |
| 316 } |
OLD | NEW |