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; |
} |