Chromium Code Reviews| Index: tests/standalone/src/SocketCloseTest.dart |
| diff --git a/tests/standalone/src/SocketCloseTest.dart b/tests/standalone/src/SocketCloseTest.dart |
| index b7a747f967f76d462f45fe3098385ae21189f140..ecd7abc67f3f49c105aa8b5eee0d6863c055af3a 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 is these different "modes". |
|
Mads Ager (google)
2011/11/04 10:19:49
is -> in
Søren Gjesse
2011/11/04 12:15:11
Done.
|
| +// 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; |
| } |