Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(302)

Unified Diff: tests/standalone/src/SocketCloseTest.dart

Issue 8437090: Change the handling of closing sockets (Closed) Base URL: https://dart.googlecode.com/svn/branches/bleeding_edge/dart
Patch Set: Addressed review comments by ager@ Created 9 years, 1 month ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
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;
}
« no previous file with comments | « tests/standalone/src/ProcessStdoutTest.dart ('k') | tests/stub-generator/src/MintMakerFullyIsolatedTest-generatedTest.dart » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698