| Index: tests/standalone/src/SocketCloseTest.dart
|
| diff --git a/tests/standalone/src/SocketCloseTest.dart b/tests/standalone/src/SocketCloseTest.dart
|
| index b7a747f967f76d462f45fe3098385ae21189f140..29c34b28ec0b9d0cc7ac87a99139e6d63f80d227 100644
|
| --- a/tests/standalone/src/SocketCloseTest.dart
|
| +++ b/tests/standalone/src/SocketCloseTest.dart
|
| @@ -4,46 +4,102 @@
|
| //
|
| // Test socket close events.
|
|
|
| -class SocketCloseTest {
|
|
|
| +final SERVERSHUTDOWN = -1;
|
| +final ITERATIONS = 10;
|
| +
|
| +
|
| +// Run the close test in these different "modes".
|
| +// 0: Client closes without sending at all.
|
| +// 1: Client sends and closes.
|
| +// 2: Client sends. Server closes.
|
| +// 3: Client sends. Server responds and closes.
|
| +// 4: Client sends and half-closes. Server responds and closes.
|
| +// 5: Client sends. Server responds and half closes.
|
| +// 6: Client sends and half-closes. Server responds and half closes.
|
| +class SocketCloseTest {
|
| static void testMain() {
|
| - SocketClose socketClose = new SocketClose.start();
|
| + new SocketClose.start(0);
|
| + new SocketClose.start(1);
|
| + new SocketClose.start(2);
|
| + new SocketClose.start(3);
|
| + new SocketClose.start(4);
|
| + new SocketClose.start(5);
|
| + new SocketClose.start(6);
|
| }
|
| }
|
|
|
| -class SocketClose {
|
|
|
| - static final SERVERINIT = 0;
|
| - static final SERVERSHUTDOWN = -1;
|
| - static final ITERATIONS = 100;
|
| +class SocketClose {
|
|
|
| - SocketClose.start()
|
| + SocketClose.start(mode)
|
| : _receivePort = new ReceivePort(),
|
| _sendPort = null,
|
| _dataEvents = 0,
|
| _closeEvents = 0,
|
| _errorEvents = 0,
|
| - _iterations = 0 {
|
| + _iterations = 0,
|
| + _mode = mode {
|
| new SocketCloseServer().spawn().then((SendPort port) {
|
| _sendPort = port;
|
| start();
|
| });
|
| }
|
|
|
| - void sendData() {
|
| + void proceed() {
|
| + if (_iterations < ITERATIONS) {
|
| + new Timer(sendData, 0, false);
|
| + } else {
|
| + shutdown();
|
| + }
|
| + }
|
| +
|
| + void sendData(Timer timer) {
|
|
|
| void dataHandler() {
|
| - _dataEvents++;
|
| + switch (_mode) {
|
| + case 0:
|
| + case 1:
|
| + case 2:
|
| + Expect.fail("No data expected");
|
| + break;
|
| + case 3:
|
| + case 4:
|
| + case 5:
|
| + case 6:
|
| + List<int> b = new List<int>(100);
|
| + _socket.readList(b, 0, 100);
|
| + _dataEvents++;
|
| + break;
|
| + default:
|
| + Expect.fail("Unknown test mode");
|
| + }
|
| }
|
|
|
| void closeHandler() {
|
| _closeEvents++;
|
| - _iterations++;
|
| - _socket.close();
|
| - if (_iterations < ITERATIONS) {
|
| - sendData();
|
| - } else {
|
| - shutdown();
|
| + switch (_mode) {
|
| + case 0:
|
| + case 1:
|
| + Expect.fail("No close expected");
|
| + break;
|
| + case 2:
|
| + case 3:
|
| + _socket.close();
|
| + proceed();
|
| + break;
|
| + case 4:
|
| + proceed();
|
| + break;
|
| + case 5:
|
| + _socket.close();
|
| + proceed();
|
| + break;
|
| + case 6:
|
| + proceed();
|
| + break;
|
| + default:
|
| + Expect.fail("Unknown test mode");
|
| }
|
| }
|
|
|
| @@ -57,8 +113,39 @@ class SocketClose {
|
| _socket.closeHandler = closeHandler;
|
| _socket.errorHandler = errorHandler;
|
|
|
| - if ((_iterations % 2) == 0) {
|
| - _socket.writeList("Hello".charCodes(), 0, 5);
|
| + _iterations++;
|
| + switch (_mode) {
|
| + case 0:
|
| + _socket.close();
|
| + proceed();
|
| + break;
|
| + case 1:
|
| + int bytesWritten = _socket.writeList("Hello".charCodes(), 0, 5);
|
| + Expect.equals(5, bytesWritten);
|
| + _socket.close();
|
| + proceed();
|
| + break;
|
| + case 2:
|
| + case 3:
|
| + int bytesWritten = _socket.writeList("Hello".charCodes(), 0, 5);
|
| + Expect.equals(5, bytesWritten);
|
| + break;
|
| + case 4:
|
| + int bytesWritten = _socket.writeList("Hello".charCodes(), 0, 5);
|
| + Expect.equals(5, bytesWritten);
|
| + _socket.close(true);
|
| + break;
|
| + case 5:
|
| + int bytesWritten = _socket.writeList("Hello".charCodes(), 0, 5);
|
| + Expect.equals(5, bytesWritten);
|
| + break;
|
| + case 6:
|
| + int bytesWritten = _socket.writeList("Hello".charCodes(), 0, 5);
|
| + Expect.equals(5, bytesWritten);
|
| + _socket.close(true);
|
| + break;
|
| + default:
|
| + Expect.fail("Unknown test mode");
|
| }
|
| }
|
|
|
| @@ -70,20 +157,35 @@ class SocketClose {
|
| void start() {
|
| _receivePort.receive((var message, SendPort replyTo) {
|
| _port = message;
|
| - sendData();
|
| + proceed();
|
| });
|
| - _sendPort.send(SERVERINIT, _receivePort.toSendPort());
|
| + _sendPort.send(_mode, _receivePort.toSendPort());
|
| }
|
|
|
| void shutdown() {
|
| _sendPort.send(SERVERSHUTDOWN, _receivePort.toSendPort());
|
| _receivePort.close();
|
|
|
| - /*
|
| - * Note that it is not guaranteed that _dataEvents == 0 due to spurious
|
| - * wakeups.
|
| - */
|
| - Expect.equals(ITERATIONS, _closeEvents);
|
| + switch (_mode) {
|
| + case 0:
|
| + case 1:
|
| + Expect.equals(0, _dataEvents);
|
| + Expect.equals(0, _closeEvents);
|
| + break;
|
| + case 2:
|
| + Expect.equals(0, _dataEvents);
|
| + Expect.equals(ITERATIONS, _closeEvents);
|
| + break;
|
| + case 3:
|
| + case 4:
|
| + case 5:
|
| + case 6:
|
| + Expect.equals(ITERATIONS, _dataEvents);
|
| + Expect.equals(ITERATIONS, _closeEvents);
|
| + break;
|
| + default:
|
| + Expect.fail("Unknown test mode");
|
| + }
|
| Expect.equals(0, _errorEvents);
|
| }
|
|
|
| @@ -96,6 +198,7 @@ class SocketClose {
|
| int _closeEvents;
|
| int _errorEvents;
|
| int _iterations;
|
| + int _mode;
|
| }
|
|
|
| class SocketCloseServer extends Isolate {
|
| @@ -109,9 +212,42 @@ class SocketCloseServer extends Isolate {
|
| void connectionHandler() {
|
| Socket _client;
|
|
|
| - void messageHandler() {
|
| + void dataHandler() {
|
| _dataEvents++;
|
| - _client.close();
|
| + switch (_mode) {
|
| + case 0:
|
| + Expect.fail("No data expected");
|
| + break;
|
| + case 1:
|
| + List<int> b = new List<int>(100);
|
| + _client.readList(b, 0, 100);
|
| + break;
|
| + case 2:
|
| + List<int> b = new List<int>(100);
|
| + _client.readList(b, 0, 100);
|
| + _client.close();
|
| + break;
|
| + case 3:
|
| + List<int> b = new List<int>(100);
|
| + _client.readList(b, 0, 100);
|
| + _client.writeList("Hello".charCodes(), 0, 5);
|
| + _client.close();
|
| + break;
|
| + case 4:
|
| + List<int> b = new List<int>(100);
|
| + _client.readList(b, 0, 100);
|
| + _client.writeList("Hello".charCodes(), 0, 5);
|
| + break;
|
| + case 5:
|
| + case 6:
|
| + List<int> b = new List<int>(100);
|
| + _client.readList(b, 0, 100);
|
| + _client.writeList("Hello".charCodes(), 0, 5);
|
| + _client.close(true);
|
| + break;
|
| + default:
|
| + Expect.fail("Unknown test mode");
|
| + }
|
| }
|
|
|
| void closeHandler() {
|
| @@ -120,41 +256,75 @@ class SocketCloseServer extends Isolate {
|
| }
|
|
|
| void errorHandler() {
|
| - _errorEvents++;
|
| - _client.close();
|
| + Expect.fail("Socket error");
|
| }
|
|
|
| _client = _server.accept();
|
| - if ((_iterations % 2) == 1) {
|
| - _client.close();
|
| - }
|
| - _client.dataHandler = messageHandler;
|
| + _iterations++;
|
| +
|
| + _client.dataHandler = dataHandler;
|
| _client.closeHandler = closeHandler;
|
| _client.errorHandler = errorHandler;
|
| - _iterations++;
|
| }
|
|
|
| void errorHandlerServer() {
|
| - _server.close();
|
| + Expect.fail("Server socket error");
|
| + }
|
| +
|
| + waitForResult(Timer timer) {
|
| + // Make sure all iterations have been run. For mode 0 and 1 the
|
| + // client just closes the socket and after the last iteration
|
| + // signals the server. The server might now be finished just
|
| + // because iterations have reached the limit as this number is
|
| + // incremented just after accept. In that case wait for the last
|
| + // close event.
|
| + if (_iterations == ITERATIONS &&
|
| + (_mode > 1 || _closeEvents == ITERATIONS)) {
|
| + switch (_mode) {
|
| + case 0:
|
| + Expect.equals(0, _dataEvents);
|
| + Expect.equals(ITERATIONS, _closeEvents);
|
| + break;
|
| + case 1:
|
| + Expect.equals(ITERATIONS, _dataEvents);
|
| + Expect.equals(ITERATIONS, _closeEvents);
|
| + break;
|
| + case 2:
|
| + case 3:
|
| + Expect.equals(ITERATIONS, _dataEvents);
|
| + Expect.equals(0, _closeEvents);
|
| + break;
|
| + case 4:
|
| + case 5:
|
| + case 6:
|
| + Expect.equals(ITERATIONS, _dataEvents);
|
| + Expect.equals(ITERATIONS, _closeEvents);
|
| + break;
|
| + default:
|
| + Expect.fail("Unknown test mode");
|
| + }
|
| + Expect.equals(0, _errorEvents);
|
| + _server.close();
|
| + this.port.close();
|
| + } else {
|
| + new Timer(waitForResult, 100, false);
|
| + }
|
| }
|
|
|
| this.port.receive((message, SendPort replyTo) {
|
| - if (message == SocketClose.SERVERINIT) {
|
| + if (message != SERVERSHUTDOWN) {
|
| _errorEvents = 0;
|
| _dataEvents = 0;
|
| _closeEvents = 0;
|
| _iterations = 0;
|
| + _mode = message;
|
| _server = new ServerSocket(HOST, 0, 10);
|
| Expect.equals(true, _server !== null);
|
| _server.connectionHandler = connectionHandler;
|
| _server.errorHandler = errorHandlerServer;
|
| replyTo.send(_server.port, null);
|
| - } else if (message == SocketClose.SERVERSHUTDOWN) {
|
| - Expect.equals(SocketClose.ITERATIONS/2, _dataEvents);
|
| - Expect.equals(0, _closeEvents);
|
| - Expect.equals(0, _errorEvents);
|
| - _server.close();
|
| - this.port.close();
|
| + } else {
|
| + new Timer(waitForResult, 0, false);
|
| }
|
| });
|
| }
|
| @@ -164,6 +334,7 @@ class SocketCloseServer extends Isolate {
|
| int _dataEvents;
|
| int _closeEvents;
|
| int _iterations;
|
| + int _mode;
|
| }
|
|
|
|
|
|
|