| Index: mojo/public/dart/system/tests/core_test.dart
|
| diff --git a/mojo/public/dart/system/tests/core_test.dart b/mojo/public/dart/system/tests/core_test.dart
|
| new file mode 100644
|
| index 0000000000000000000000000000000000000000..10ac65ac065b001544941104afbfb772924cd629
|
| --- /dev/null
|
| +++ b/mojo/public/dart/system/tests/core_test.dart
|
| @@ -0,0 +1,316 @@
|
| +// 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: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;
|
| +
|
| +// import '../../tests/expect.dart';
|
| +// import '../lib/core.dart';
|
| +// import '../lib/embedder.dart' as embedder;
|
| +
|
| +invalidHandleTest() {
|
| + RawMojoHandle invalid_handle = new RawMojoHandle(RawMojoHandle.INVALID);
|
| +
|
| + // Close.
|
| + int res = invalid_handle.close();
|
| + Expect.isTrue(MojoResult.isInvalidArgument(res));
|
| +
|
| + // Wait.
|
| + res = invalid_handle.wait(MojoHandleSignals.READWRITE, 1000000);
|
| + Expect.isTrue(MojoResult.isInvalidArgument(res));
|
| +
|
| + res = RawMojoHandle.waitMany([invalid_handle.h],
|
| + [MojoHandleSignals.READWRITE],
|
| + RawMojoHandle.DEADLINE_INDEFINITE);
|
| + Expect.isTrue(MojoResult.isInvalidArgument(res));
|
| +
|
| + // Message pipe.
|
| + MojoMessagePipe pipe = new MojoMessagePipe();
|
| + Expect.isNotNull(pipe);
|
| + ByteData bd = new ByteData(10);
|
| + pipe.endpoints[0].handle.close();
|
| + pipe.endpoints[1].handle.close();
|
| + res = pipe.endpoints[0].write(bd);
|
| + Expect.isTrue(MojoResult.isInvalidArgument(pipe.endpoints[0].status));
|
| +
|
| + List read_result = pipe.endpoints[0].read(bd);
|
| + Expect.isTrue(MojoResult.isInvalidArgument(pipe.endpoints[0].status));
|
| +
|
| + // Data pipe.
|
| + MojoDataPipe data_pipe = new MojoDataPipe();
|
| + Expect.isNotNull(data_pipe);
|
| + data_pipe.producer.handle.close();
|
| + data_pipe.consumer.handle.close();
|
| +
|
| + res = data_pipe.producer.write(bd);
|
| + Expect.isTrue(MojoResult.isInvalidArgument(data_pipe.producer.status));
|
| +
|
| + ByteData write_data = data_pipe.producer.beginWrite(10);
|
| + Expect.isNull(write_data);
|
| + Expect.isTrue(MojoResult.isInvalidArgument(data_pipe.producer.status));
|
| + data_pipe.producer.endWrite(10);
|
| + Expect.isTrue(MojoResult.isInvalidArgument(data_pipe.producer.status));
|
| +
|
| + int read = data_pipe.consumer.read(bd);
|
| + Expect.isTrue(MojoResult.isInvalidArgument(data_pipe.consumer.status));
|
| +
|
| + ByteData read_data = data_pipe.consumer.beginRead(10);
|
| + Expect.isNull(read_data);
|
| + Expect.isTrue(MojoResult.isInvalidArgument(data_pipe.consumer.status));
|
| + data_pipe.consumer.endRead(10);
|
| + Expect.isTrue(MojoResult.isInvalidArgument(data_pipe.consumer.status));
|
| +
|
| + // Shared buffer.
|
| + MojoSharedBuffer shared_buffer = new MojoSharedBuffer.create(10);
|
| + Expect.isNotNull(shared_buffer);
|
| + shared_buffer.close();
|
| + MojoSharedBuffer dup = new MojoSharedBuffer.duplicate(shared_buffer);
|
| + Expect.isNull(dup);
|
| +
|
| + shared_buffer = new MojoSharedBuffer.create(10);
|
| + Expect.isNotNull(shared_buffer);
|
| + shared_buffer.close();
|
| + res = shared_buffer.map(0, 10);
|
| + Expect.isTrue(MojoResult.isInvalidArgument(res));
|
| +}
|
| +
|
| +
|
| +basicMessagePipeTest() {
|
| + MojoMessagePipe pipe = new MojoMessagePipe();
|
| + Expect.isNotNull(pipe);
|
| + Expect.isTrue(MojoResult.isOk(pipe.status));
|
| + Expect.isNotNull(pipe.endpoints);
|
| +
|
| + MojoMessagePipeEndpoint end0 = pipe.endpoints[0];
|
| + MojoMessagePipeEndpoint end1 = pipe.endpoints[1];
|
| + Expect.isTrue(RawMojoHandle.isValid(end0.handle));
|
| + Expect.isTrue(RawMojoHandle.isValid(end1.handle));
|
| +
|
| + // Not readable, yet.
|
| + int res = end0.handle.wait(MojoHandleSignals.READABLE, 0);
|
| + Expect.isTrue(MojoResult.isDeadlineExceeded(res));
|
| +
|
| + // Should be writable.
|
| + res = end0.handle.wait(MojoHandleSignals.WRITABLE, 0);
|
| + Expect.isTrue(MojoResult.isOk(res));
|
| +
|
| + // Try to read.
|
| + ByteData data = new ByteData(10);
|
| + end0.read(data);
|
| + Expect.isTrue(MojoResult.isShouldWait(end0.status));
|
| +
|
| + // Write end1.
|
| + String hello = "hello";
|
| + ByteData hello_data =
|
| + new ByteData.view((new Uint8List.fromList(hello.codeUnits)).buffer);
|
| + res = end1.write(hello_data);
|
| + Expect.isTrue(MojoResult.isOk(res));
|
| +
|
| + // end0 should now be readable.
|
| + res = RawMojoHandle.waitMany([end0.handle.h],
|
| + [MojoHandleSignals.READABLE],
|
| + RawMojoHandle.DEADLINE_INDEFINITE);
|
| + Expect.isTrue(MojoResult.isOk(res));
|
| +
|
| + // Read from end0.
|
| + List read_result = end0.read(data);
|
| + Expect.isNotNull(read_result);
|
| + Expect.equals(read_result.length, 3);
|
| + Expect.isTrue(MojoResult.isOk(read_result[0]));
|
| + Expect.equals(read_result[1], hello_data.lengthInBytes);
|
| + Expect.equals(read_result[2], 0);
|
| +
|
| + String hello_result = new String.fromCharCodes(
|
| + data.buffer.asUint8List().sublist(0, read_result[1]).toList());
|
| + Expect.equals(hello_result, "hello");
|
| +
|
| + // end0 should no longer be readable.
|
| + res = end0.handle.wait(MojoHandleSignals.READABLE, 10);
|
| + Expect.isTrue(MojoResult.isDeadlineExceeded(res));
|
| +
|
| + // Close end0's handle.
|
| + res = end0.handle.close();
|
| + Expect.isTrue(MojoResult.isOk(res));
|
| +
|
| + // end1 should no longer be readable or writable.
|
| + res = end1.handle.wait(MojoHandleSignals.READWRITE, 1000);
|
| + Expect.isTrue(MojoResult.isFailedPrecondition(res));
|
| +
|
| + res = end1.handle.close();
|
| + Expect.isTrue(MojoResult.isOk(res));
|
| +}
|
| +
|
| +
|
| +basicDataPipeTest() {
|
| + MojoDataPipe pipe = new MojoDataPipe();
|
| + Expect.isNotNull(pipe);
|
| + Expect.isTrue(MojoResult.isOk(pipe.status));
|
| + Expect.notEquals(pipe.consumer.handle, RawMojoHandle.INVALID);
|
| + Expect.notEquals(pipe.producer.handle, RawMojoHandle.INVALID);
|
| +
|
| + MojoDataPipeProducer producer = pipe.producer;
|
| + MojoDataPipeConsumer consumer = pipe.consumer;
|
| + Expect.notEquals(producer.handle.h, RawMojoHandle.INVALID);
|
| + Expect.notEquals(consumer.handle.h, RawMojoHandle.INVALID);
|
| +
|
| + // Consumer should not be readable.
|
| + int res = consumer.handle.wait(MojoHandleSignals.READABLE, 0);
|
| + Expect.isTrue(MojoResult.isDeadlineExceeded(res));
|
| +
|
| + // Producer should be writable.
|
| + res = producer.handle.wait(MojoHandleSignals.WRITABLE, 0);
|
| + Expect.isTrue(MojoResult.isOk(res));
|
| +
|
| + // Try to read from consumer.
|
| + ByteData buffer = new ByteData(20);
|
| + consumer.read(buffer, buffer.lengthInBytes, MojoDataPipeConsumer.FLAG_NONE);
|
| + Expect.isTrue(MojoResult.isShouldWait(consumer.status));
|
| +
|
| + // Try to begin a two-phase read from consumer.
|
| + ByteData b = consumer.beginRead(20, MojoDataPipeConsumer.FLAG_NONE);
|
| + Expect.isNull(b);
|
| + Expect.isTrue(MojoResult.isShouldWait(consumer.status));
|
| +
|
| + // Write to producer.
|
| + String hello = "hello ";
|
| + ByteData hello_data =
|
| + new ByteData.view((new Uint8List.fromList(hello.codeUnits)).buffer);
|
| + int written = producer.write(
|
| + hello_data, hello_data.lengthInBytes, MojoDataPipeProducer.FLAG_NONE);
|
| + Expect.isTrue(MojoResult.isOk(producer.status));
|
| + Expect.equals(written, hello_data.lengthInBytes);
|
| +
|
| + // Now that we have written, the consumer should be readable.
|
| + res = RawMojoHandle.waitMany([consumer.handle.h],
|
| + [MojoHandleSignals.READABLE],
|
| + RawMojoHandle.DEADLINE_INDEFINITE);
|
| + Expect.isTrue(MojoResult.isOk(res));
|
| +
|
| + // Do a two-phase write to the producer.
|
| + ByteData two_phase_write = producer.beginWrite(
|
| + 20, MojoDataPipeProducer.FLAG_NONE);
|
| + Expect.isTrue(MojoResult.isOk(producer.status));
|
| + Expect.isNotNull(two_phase_write);
|
| + Expect.isTrue(two_phase_write.lengthInBytes >= 20);
|
| +
|
| + String world = "world";
|
| + two_phase_write.buffer.asUint8List().setAll(0, world.codeUnits);
|
| + producer.endWrite(Uint8List.BYTES_PER_ELEMENT * world.codeUnits.length);
|
| + Expect.isTrue(MojoResult.isOk(producer.status));
|
| +
|
| + // Read one character from consumer.
|
| + int read = consumer.read(buffer, 1, MojoDataPipeConsumer.FLAG_NONE);
|
| + Expect.isTrue(MojoResult.isOk(consumer.status));
|
| + Expect.equals(read, 1);
|
| +
|
| + // Close the producer.
|
| + res = producer.handle.close();
|
| + Expect.isTrue(MojoResult.isOk(res));
|
| +
|
| + // Consumer should still be readable.
|
| + res = consumer.handle.wait(MojoHandleSignals.READABLE, 0);
|
| + Expect.isTrue(MojoResult.isOk(res));
|
| +
|
| + // Get the number of remaining bytes.
|
| + int remaining = consumer.read(
|
| + null, 0, MojoDataPipeConsumer.FLAG_QUERY);
|
| + Expect.isTrue(MojoResult.isOk(consumer.status));
|
| + Expect.equals(remaining, "hello world".length - 1);
|
| +
|
| + // Do a two-phase read.
|
| + ByteData two_phase_read = consumer.beginRead(
|
| + remaining, MojoDataPipeConsumer.FLAG_NONE);
|
| + Expect.isTrue(MojoResult.isOk(consumer.status));
|
| + Expect.isNotNull(two_phase_read);
|
| + Expect.isTrue(two_phase_read.lengthInBytes <= remaining);
|
| +
|
| + Uint8List uint8_list = buffer.buffer.asUint8List();
|
| + uint8_list.setAll(1, two_phase_read.buffer.asUint8List());
|
| + uint8_list = uint8_list.sublist(0, 1 + two_phase_read.lengthInBytes);
|
| +
|
| + consumer.endRead(two_phase_read.lengthInBytes);
|
| + Expect.isTrue(MojoResult.isOk(consumer.status));
|
| +
|
| + String hello_world = new String.fromCharCodes(
|
| + uint8_list.toList());
|
| + Expect.equals("hello world", hello_world);
|
| +
|
| + res = consumer.handle.close();
|
| + Expect.isTrue(MojoResult.isOk(res));
|
| +}
|
| +
|
| +
|
| +basicSharedBufferTest() {
|
| + MojoSharedBuffer mojo_buffer = new MojoSharedBuffer.create(
|
| + 100, MojoSharedBuffer.CREATE_FLAG_NONE);
|
| + Expect.isNotNull(mojo_buffer);
|
| + Expect.isNotNull(mojo_buffer.status);
|
| + Expect.isTrue(MojoResult.isResult(mojo_buffer.status));
|
| + Expect.isTrue(MojoResult.isOk(mojo_buffer.status));
|
| + Expect.isNotNull(mojo_buffer.handle);
|
| + Expect.isTrue(mojo_buffer.handle is RawMojoHandle);
|
| + Expect.notEquals(mojo_buffer.handle.h, RawMojoHandle.INVALID);
|
| +
|
| + mojo_buffer.map(0, 100, MojoSharedBuffer.MAP_FLAG_NONE);
|
| + Expect.isNotNull(mojo_buffer.status);
|
| + Expect.isTrue(MojoResult.isResult(mojo_buffer.status));
|
| + Expect.isTrue(MojoResult.isOk(mojo_buffer.status));
|
| + Expect.isNotNull(mojo_buffer.mapping);
|
| + Expect.isTrue(mojo_buffer.mapping is ByteData);
|
| +
|
| + mojo_buffer.mapping.setInt8(50, 42);
|
| +
|
| + MojoSharedBuffer duplicate = new MojoSharedBuffer.duplicate(
|
| + mojo_buffer, MojoSharedBuffer.DUPLICATE_FLAG_NONE);
|
| + Expect.isNotNull(duplicate);
|
| + Expect.isNotNull(duplicate.status);
|
| + Expect.isTrue(MojoResult.isResult(duplicate.status));
|
| + Expect.isTrue(MojoResult.isOk(duplicate.status));
|
| + Expect.isTrue(duplicate.handle is RawMojoHandle);
|
| + Expect.notEquals(duplicate.handle.h, RawMojoHandle.INVALID);
|
| + Expect.isNotNull(duplicate.mapping);
|
| + Expect.isTrue(duplicate.mapping is ByteData);
|
| +
|
| + mojo_buffer.close();
|
| + mojo_buffer = null;
|
| +
|
| + duplicate.mapping.setInt8(51, 43);
|
| +
|
| + duplicate.unmap();
|
| + Expect.isNotNull(duplicate.status);
|
| + Expect.isTrue(MojoResult.isResult(duplicate.status));
|
| + Expect.isTrue(MojoResult.isOk(duplicate.status));
|
| + Expect.isNull(duplicate.mapping);
|
| +
|
| + duplicate.map(50, 50, MojoSharedBuffer.MAP_FLAG_NONE);
|
| + Expect.isNotNull(duplicate.status);
|
| + Expect.isTrue(MojoResult.isResult(duplicate.status));
|
| + Expect.isTrue(MojoResult.isOk(duplicate.status));
|
| + Expect.isNotNull(duplicate.mapping);
|
| + Expect.isTrue(duplicate.mapping is ByteData);
|
| +
|
| + Expect.equals(duplicate.mapping.getInt8(0), 42);
|
| + Expect.equals(duplicate.mapping.getInt8(1), 43);
|
| +
|
| + duplicate.unmap();
|
| + Expect.isNotNull(duplicate.status);
|
| + Expect.isTrue(MojoResult.isResult(duplicate.status));
|
| + Expect.isTrue(MojoResult.isOk(duplicate.status));
|
| + Expect.isNull(duplicate.mapping);
|
| +
|
| + duplicate.close();
|
| + duplicate = null;
|
| +}
|
| +
|
| +main() {
|
| + embedder.mojoEmbedderInit().then((status) {
|
| + invalidHandleTest();
|
| + basicMessagePipeTest();
|
| + basicDataPipeTest();
|
| + basicSharedBufferTest();
|
| + });
|
| +}
|
|
|