| Index: tests/standalone/io/raw_socket_typed_data_test.dart
|
| diff --git a/tests/standalone/io/raw_socket_typed_data_test.dart b/tests/standalone/io/raw_socket_typed_data_test.dart
|
| new file mode 100644
|
| index 0000000000000000000000000000000000000000..1e5d6d2d3219c3759166fc60b75298c4bd857c15
|
| --- /dev/null
|
| +++ b/tests/standalone/io/raw_socket_typed_data_test.dart
|
| @@ -0,0 +1,208 @@
|
| +// Copyright (c) 2013, the Dart project authors. Please see the AUTHORS file
|
| +// for details. All rights reserved. Use of this source code is governed by a
|
| +// BSD-style license that can be found in the LICENSE file.
|
| +//
|
| +// VMOptions=
|
| +// VMOptions=--short_socket_read
|
| +// VMOptions=--short_socket_write
|
| +// VMOptions=--short_socket_read --short_socket_write
|
| +
|
| +import "package:expect/expect.dart";
|
| +import "dart:async";
|
| +import "dart:io";
|
| +import "dart:isolate";
|
| +import "dart:typed_data";
|
| +
|
| +testOutOfRange() {
|
| + RawServerSocket.bind(InternetAddress.LOOPBACK_IP_V4, 0).then((server) {
|
| + server.listen((client) {
|
| + client.writeEventsEnabled = false;
|
| + client.listen((event) {
|
| + switch (event) {
|
| + case RawSocketEvent.READ:
|
| + Expect.fail("No data expected");
|
| + break;
|
| + case RawSocketEvent.WRITE:
|
| + break;
|
| + case RawSocketEvent.READ_CLOSED:
|
| + client.close();
|
| + server.close();
|
| + break;
|
| + default: throw "Unexpected event $event";
|
| + }
|
| + });
|
| + });
|
| +
|
| + RawSocket.connect("127.0.0.1", server.port).then((socket) {
|
| + socket.listen((event) {
|
| + switch (event) {
|
| + case RawSocketEvent.READ:
|
| + break;
|
| + case RawSocketEvent.WRITE:
|
| + Expect.isFalse(socket.writeEventsEnabled);
|
| + var data;
|
| + data = new Uint16List(1);
|
| + data[0] = 256;
|
| + Expect.throws(() => socket.write(data));
|
| + data = new Uint32List(1);
|
| + data[0] = 256;
|
| + Expect.throws(() => socket.write(data));
|
| + data = new Uint64List(1);
|
| + data[0] = 256;
|
| + Expect.throws(() => socket.write(data));
|
| + data = new Int16List(1);
|
| + data[0] = 256;
|
| + Expect.throws(() => socket.write(data));
|
| + data[0] = -1;
|
| + Expect.throws(() => socket.write(data));
|
| + data = new Int32List(1);
|
| + data[0] = 256;
|
| + Expect.throws(() => socket.write(data));
|
| + data[0] = -1;
|
| + Expect.throws(() => socket.write(data));
|
| + data = new Int64List(1);
|
| + data[0] = 256;
|
| + Expect.throws(() => socket.write(data));
|
| + data[0] = -1;
|
| + Expect.throws(() => socket.write(data));
|
| + Expect.throws(() => socket.write([-1]));
|
| + Expect.throws(() => socket.write([256]));
|
| + socket.close();
|
| + break;
|
| + case RawSocketEvent.READ_CLOSED:
|
| + break;
|
| + default: throw "Unexpected event $event";
|
| + }
|
| + },
|
| + onDone: () => port.close());
|
| + });
|
| + });
|
| +}
|
| +
|
| +void testSimpleReadWrite() {
|
| + // This test creates a server and a client connects. The client then
|
| + // writes and the server echos. When the server has finished its
|
| + // echo it half-closes. When the client gets the close event is
|
| + // closes fully.
|
| + ReceivePort port = new ReceivePort();
|
| +
|
| + // The test data to send is 5 times 256 bytes and 4 times 128
|
| + // bytes. This is all the legal byte values from the integer typed
|
| + // data.
|
| + const messageSize = 256 * 5 + 128 * 4;
|
| + var fillData128 = new List.generate(128, (index) => index);
|
| + var fillData256 = new List.generate(256, (index) => index);
|
| + List<List<int>> createTestData() {
|
| + return [
|
| + new Uint8List(256)..setAll(0, fillData256),
|
| + new Uint8ClampedList(256)..setAll(0, fillData256),
|
| + new Uint16List(256)..setAll(0, fillData256),
|
| + new Uint32List(256)..setAll(0, fillData256),
|
| + new Uint64List(256)..setAll(0, fillData256),
|
| + new Int8List(128)..setAll(0, fillData128),
|
| + new Int16List(128)..setAll(0, fillData128),
|
| + new Int32List(128)..setAll(0, fillData128),
|
| + new Int64List(128)..setAll(0, fillData128),
|
| + ];
|
| + }
|
| +
|
| + void verifyTestData(List<int> data) {
|
| + var testData = createTestData();
|
| + var expected = [];
|
| + testData.forEach((list) => expected.addAll(list));
|
| + Expect.listEquals(expected, data);
|
| + }
|
| +
|
| + RawServerSocket.bind(InternetAddress.LOOPBACK_IP_V4, 0).then((server) {
|
| + server.listen((client) {
|
| + int bytesRead = 0;
|
| + int bytesWritten = 0;
|
| + int index = 0;
|
| + List<List<int>> data = createTestData();
|
| + List<int> received = new List<int>(messageSize);
|
| +
|
| + client.writeEventsEnabled = false;
|
| + client.listen((event) {
|
| + switch (event) {
|
| + case RawSocketEvent.READ:
|
| + Expect.isTrue(bytesWritten == 0);
|
| + Expect.isTrue(client.available() > 0);
|
| + var buffer = client.read();
|
| + received.setRange(bytesRead, bytesRead + buffer.length, buffer);
|
| + bytesRead += buffer.length;
|
| + if (bytesRead == messageSize) {
|
| + verifyTestData(received);
|
| + client.writeEventsEnabled = true;
|
| + }
|
| + break;
|
| + case RawSocketEvent.WRITE:
|
| + Expect.isTrue(bytesRead == messageSize);
|
| + Expect.isFalse(client.writeEventsEnabled);
|
| + bytesWritten += client.write(
|
| + data[index], bytesWritten, data[index].length - bytesWritten);
|
| + if (bytesWritten < data[index].length) {
|
| + client.writeEventsEnabled = true;
|
| + } else {
|
| + index++;
|
| + bytesWritten = 0;
|
| + if (index < data.length) {
|
| + client.writeEventsEnabled = true;
|
| + } else {
|
| + client.shutdown(SocketDirection.SEND);
|
| + }
|
| + }
|
| + break;
|
| + case RawSocketEvent.READ_CLOSED:
|
| + server.close();
|
| + break;
|
| + default: throw "Unexpected event $event";
|
| + }
|
| + });
|
| + });
|
| +
|
| + RawSocket.connect("127.0.0.1", server.port).then((socket) {
|
| + int bytesRead = 0;
|
| + int bytesWritten = 0;
|
| + int index = 0;
|
| + List<List<int>> data = createTestData();
|
| + List<int> received = new List<int>(messageSize);
|
| +
|
| + socket.listen((event) {
|
| + switch (event) {
|
| + case RawSocketEvent.READ:
|
| + Expect.isTrue(socket.available() > 0);
|
| + var buffer = socket.read();
|
| + received.setRange(bytesRead, bytesRead + buffer.length, buffer);
|
| + bytesRead += buffer.length;
|
| + break;
|
| + case RawSocketEvent.WRITE:
|
| + Expect.isTrue(bytesRead == 0);
|
| + Expect.isFalse(socket.writeEventsEnabled);
|
| + bytesWritten += socket.write(
|
| + data[index], bytesWritten, data[index].length - bytesWritten);
|
| + if (bytesWritten < data[index].length) {
|
| + socket.writeEventsEnabled = true;
|
| + } else {
|
| + index++;
|
| + bytesWritten = 0;
|
| + if (index < data.length) {
|
| + socket.writeEventsEnabled = true;
|
| + }
|
| + }
|
| + break;
|
| + case RawSocketEvent.READ_CLOSED:
|
| + verifyTestData(received);
|
| + socket.close();
|
| + break;
|
| + default: throw "Unexpected event $event";
|
| + }
|
| + },
|
| + onDone: () => port.close());
|
| + });
|
| + });
|
| +}
|
| +
|
| +main() {
|
| + testOutOfRange();
|
| + testSimpleReadWrite();
|
| +}
|
|
|