| OLD | NEW |
| 1 // Copyright (c) 2013, the Dart project authors. Please see the AUTHORS file | 1 // Copyright (c) 2013, the Dart project authors. Please see the AUTHORS file |
| 2 // for details. All rights reserved. Use of this source code is governed by a | 2 // for details. All rights reserved. Use of this source code is governed by a |
| 3 // BSD-style license that can be found in the LICENSE file. | 3 // BSD-style license that can be found in the LICENSE file. |
| 4 // | 4 // |
| 5 // VMOptions= | 5 // VMOptions= |
| 6 // VMOptions=--short_socket_read | 6 // VMOptions=--short_socket_read |
| 7 // VMOptions=--short_socket_write | 7 // VMOptions=--short_socket_write |
| 8 // VMOptions=--short_socket_read --short_socket_write | 8 // VMOptions=--short_socket_read --short_socket_write |
| 9 // | 9 // |
| 10 // Test socket close events. | 10 // Test socket close events. |
| 11 | 11 |
| 12 import 'dart:async'; | 12 import 'dart:async'; |
| 13 import 'dart:io'; | 13 import 'dart:io'; |
| 14 import 'dart:isolate'; | 14 import 'dart:isolate'; |
| 15 | 15 |
| 16 import "package:async_helper/async_helper.dart"; | 16 import "package:async_helper/async_helper.dart"; |
| 17 import "package:expect/expect.dart"; | 17 import "package:expect/expect.dart"; |
| 18 | 18 |
| 19 const SERVERSHUTDOWN = -1; | 19 const SERVERSHUTDOWN = -1; |
| 20 const ITERATIONS = 10; | 20 const ITERATIONS = 10; |
| 21 | 21 |
| 22 | 22 |
| 23 Future sendReceive(SendPort port, message) { |
| 24 ReceivePort receivePort = new ReceivePort(); |
| 25 port.send([message, receivePort.sendPort]); |
| 26 return receivePort.first; |
| 27 } |
| 28 |
| 23 class SocketClose { | 29 class SocketClose { |
| 24 | 30 |
| 25 SocketClose.start(this._mode, this._done) | 31 SocketClose.start(this._mode, this._done) |
| 26 : _receivePort = new ReceivePort(), | 32 : _sendPort = null, |
| 27 _sendPort = null, | |
| 28 _readBytes = 0, | 33 _readBytes = 0, |
| 29 _dataEvents = 0, | 34 _dataEvents = 0, |
| 30 _closeEvents = 0, | 35 _closeEvents = 0, |
| 31 _errorEvents = 0, | 36 _errorEvents = 0, |
| 32 _iterations = 0 { | 37 _iterations = 0 { |
| 33 _sendPort = spawnFunction(startSocketCloseServer); | |
| 34 initialize(); | 38 initialize(); |
| 35 } | 39 } |
| 36 | 40 |
| 37 void proceed() { | 41 void proceed() { |
| 38 if (_iterations < ITERATIONS) { | 42 if (_iterations < ITERATIONS) { |
| 39 Timer.run(sendData); | 43 Timer.run(sendData); |
| 40 } else { | 44 } else { |
| 41 shutdown(); | 45 shutdown(); |
| 42 } | 46 } |
| 43 } | 47 } |
| (...skipping 91 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 135 break; | 139 break; |
| 136 default: | 140 default: |
| 137 Expect.fail("Unknown test mode"); | 141 Expect.fail("Unknown test mode"); |
| 138 } | 142 } |
| 139 } | 143 } |
| 140 | 144 |
| 141 Socket.connect(SocketCloseServer.HOST, _port).then(connectHandler); | 145 Socket.connect(SocketCloseServer.HOST, _port).then(connectHandler); |
| 142 } | 146 } |
| 143 | 147 |
| 144 void initialize() { | 148 void initialize() { |
| 145 _receivePort.receive((var message, SendPort replyTo) { | 149 ReceivePort receivePort = new ReceivePort(); |
| 146 _port = message; | 150 var remote = Isolate.spawn(startSocketCloseServer, receivePort.sendPort); |
| 147 proceed(); | 151 |
| 152 receivePort.first.then((message) { |
| 153 this._sendPort = message; |
| 154 sendReceive(_sendPort, _mode).then((int port) { |
| 155 this._port = port; |
| 156 proceed(); |
| 157 }); |
| 148 }); | 158 }); |
| 149 _sendPort.send(_mode, _receivePort.toSendPort()); | |
| 150 } | 159 } |
| 151 | 160 |
| 152 void shutdown() { | 161 void shutdown() { |
| 153 _sendPort.send(SERVERSHUTDOWN, _receivePort.toSendPort()); | 162 sendReceive(_sendPort, SERVERSHUTDOWN).then((_) { _done(); }); |
| 154 _receivePort.receive((message, ignore) { | |
| 155 _done(); | |
| 156 _receivePort.close(); | |
| 157 }); | |
| 158 | 163 |
| 159 switch (_mode) { | 164 switch (_mode) { |
| 160 case 0: | 165 case 0: |
| 161 case 1: | 166 case 1: |
| 162 Expect.equals(0, _dataEvents); | 167 Expect.equals(0, _dataEvents); |
| 163 Expect.equals(ITERATIONS, _closeEvents); | 168 Expect.equals(ITERATIONS, _closeEvents); |
| 164 break; | 169 break; |
| 165 case 2: | 170 case 2: |
| 166 Expect.equals(0, _dataEvents); | 171 Expect.equals(0, _dataEvents); |
| 167 Expect.equals(ITERATIONS, _closeEvents); | 172 Expect.equals(ITERATIONS, _closeEvents); |
| 168 break; | 173 break; |
| 169 case 3: | 174 case 3: |
| 170 case 4: | 175 case 4: |
| 171 Expect.isTrue(_dataEvents <= ITERATIONS); | 176 Expect.isTrue(_dataEvents <= ITERATIONS); |
| 172 Expect.isTrue(_dataEvents >= 0); | 177 Expect.isTrue(_dataEvents >= 0); |
| 173 Expect.equals(ITERATIONS, _closeEvents); | 178 Expect.equals(ITERATIONS, _closeEvents); |
| 174 break; | 179 break; |
| 175 case 5: | 180 case 5: |
| 176 case 6: | 181 case 6: |
| 177 Expect.equals(ITERATIONS, _dataEvents); | 182 Expect.equals(ITERATIONS, _dataEvents); |
| 178 Expect.equals(ITERATIONS, _closeEvents); | 183 Expect.equals(ITERATIONS, _closeEvents); |
| 179 break; | 184 break; |
| 180 default: | 185 default: |
| 181 Expect.fail("Unknown test mode"); | 186 Expect.fail("Unknown test mode"); |
| 182 } | 187 } |
| 183 Expect.equals(0, _errorEvents); | 188 Expect.equals(0, _errorEvents); |
| 184 } | 189 } |
| 185 | 190 |
| 186 int _port; | 191 int _port; |
| 187 ReceivePort _receivePort; | |
| 188 SendPort _sendPort; | 192 SendPort _sendPort; |
| 189 List<int> _buffer; | 193 List<int> _buffer; |
| 190 int _readBytes; | 194 int _readBytes; |
| 191 int _dataEvents; | 195 int _dataEvents; |
| 192 int _closeEvents; | 196 int _closeEvents; |
| 193 int _errorEvents; | 197 int _errorEvents; |
| 194 int _iterations; | 198 int _iterations; |
| 195 int _mode; | 199 int _mode; |
| 196 Function _done; | 200 Function _done; |
| 197 } | 201 } |
| 198 | 202 |
| 199 | 203 |
| 200 class ConnectionData { | 204 class ConnectionData { |
| 201 ConnectionData(Socket this.connection) : readBytes = 0; | 205 ConnectionData(Socket this.connection) : readBytes = 0; |
| 202 Socket connection; | 206 Socket connection; |
| 203 int readBytes; | 207 int readBytes; |
| 204 } | 208 } |
| 205 | 209 |
| 206 | 210 |
| 207 void startSocketCloseServer() { | 211 void startSocketCloseServer(SendPort replyTo) { |
| 208 var server = new SocketCloseServer(); | 212 var server = new SocketCloseServer(); |
| 209 port.receive(server.dispatch); | 213 replyTo.send(server.dispatchSendPort); |
| 210 } | 214 } |
| 211 | 215 |
| 212 class SocketCloseServer { | 216 class SocketCloseServer { |
| 213 | 217 |
| 214 static const HOST = "127.0.0.1"; | 218 static const HOST = "127.0.0.1"; |
| 215 | 219 |
| 216 SocketCloseServer() : super() {} | 220 SocketCloseServer() : _dispatchPort = new ReceivePort() { |
| 221 _dispatchPort.listen(dispatch); |
| 222 } |
| 217 | 223 |
| 218 void connectionHandler(ConnectionData data) { | 224 void connectionHandler(ConnectionData data) { |
| 219 var connection = data.connection; | 225 var connection = data.connection; |
| 220 | 226 |
| 221 void readBytes(bytes, whenFiveBytes) { | 227 void readBytes(bytes, whenFiveBytes) { |
| 222 data.readBytes += bytes.length; | 228 data.readBytes += bytes.length; |
| 223 Expect.isTrue(data.readBytes <= 5); | 229 Expect.isTrue(data.readBytes <= 5); |
| 224 if (data.readBytes == 5) { | 230 if (data.readBytes == 5) { |
| 225 whenFiveBytes(); | 231 whenFiveBytes(); |
| 226 } | 232 } |
| (...skipping 91 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 318 case 5: | 324 case 5: |
| 319 case 6: | 325 case 6: |
| 320 Expect.equals(ITERATIONS, _dataEvents); | 326 Expect.equals(ITERATIONS, _dataEvents); |
| 321 Expect.equals(ITERATIONS, _closeEvents); | 327 Expect.equals(ITERATIONS, _closeEvents); |
| 322 break; | 328 break; |
| 323 default: | 329 default: |
| 324 Expect.fail("Unknown test mode"); | 330 Expect.fail("Unknown test mode"); |
| 325 } | 331 } |
| 326 Expect.equals(0, _errorEvents); | 332 Expect.equals(0, _errorEvents); |
| 327 _server.close(); | 333 _server.close(); |
| 328 port.close(); | 334 _dispatchPort.close(); |
| 329 _donePort.send(null); | 335 _donePort.send(null); |
| 330 } else { | 336 } else { |
| 331 new Timer(new Duration(milliseconds: 100), waitForResult); | 337 new Timer(new Duration(milliseconds: 100), waitForResult); |
| 332 } | 338 } |
| 333 } | 339 } |
| 334 | 340 |
| 335 void dispatch(message, SendPort replyTo) { | 341 SendPort get dispatchSendPort => _dispatchPort.sendPort; |
| 342 |
| 343 void dispatch(message) { |
| 344 var command = message[0]; |
| 345 SendPort replyTo = message[1]; |
| 336 _donePort = replyTo; | 346 _donePort = replyTo; |
| 337 if (message != SERVERSHUTDOWN) { | 347 if (command != SERVERSHUTDOWN) { |
| 338 _readBytes = 0; | 348 _readBytes = 0; |
| 339 _errorEvents = 0; | 349 _errorEvents = 0; |
| 340 _dataEvents = 0; | 350 _dataEvents = 0; |
| 341 _closeEvents = 0; | 351 _closeEvents = 0; |
| 342 _iterations = 0; | 352 _iterations = 0; |
| 343 _mode = message; | 353 _mode = command; |
| 344 ServerSocket.bind("127.0.0.1", 0).then((server) { | 354 ServerSocket.bind("127.0.0.1", 0).then((server) { |
| 345 _server = server; | 355 _server = server; |
| 346 _server.listen( | 356 _server.listen( |
| 347 (socket) { | 357 (socket) { |
| 348 var data = new ConnectionData(socket); | 358 var data = new ConnectionData(socket); |
| 349 connectionHandler(data); | 359 connectionHandler(data); |
| 350 }, | 360 }, |
| 351 onError: errorHandlerServer | 361 onError: errorHandlerServer |
| 352 ); | 362 ); |
| 353 replyTo.send(_server.port, null); | 363 replyTo.send(_server.port, null); |
| 354 }); | 364 }); |
| 355 } else { | 365 } else { |
| 356 Timer.run(waitForResult); | 366 Timer.run(waitForResult); |
| 357 } | 367 } |
| 358 } | 368 } |
| 359 | 369 |
| 360 ServerSocket _server; | 370 ServerSocket _server; |
| 371 final ReceivePort _dispatchPort; |
| 361 SendPort _donePort; | 372 SendPort _donePort; |
| 362 int _readBytes; | 373 int _readBytes; |
| 363 int _errorEvents; | 374 int _errorEvents; |
| 364 int _dataEvents; | 375 int _dataEvents; |
| 365 int _closeEvents; | 376 int _closeEvents; |
| 366 int _iterations; | 377 int _iterations; |
| 367 int _mode; | 378 int _mode; |
| 368 } | 379 } |
| 369 | 380 |
| 370 | 381 |
| 371 main() { | 382 main() { |
| 372 // Run the close test in these different "modes". | 383 // Run the close test in these different "modes". |
| 373 // 0: Client closes without sending at all. | 384 // 0: Client closes without sending at all. |
| 374 // 1: Client sends and destroys. | 385 // 1: Client sends and destroys. |
| 375 // 2: Client sends. Server destroys. | 386 // 2: Client sends. Server destroys. |
| 376 // 3: Client sends. Server responds and destroys. | 387 // 3: Client sends. Server responds and destroys. |
| 377 // 4: Client sends and half-closes. Server responds and destroys. | 388 // 4: Client sends and half-closes. Server responds and destroys. |
| 378 // 5: Client sends. Server responds and half closes. | 389 // 5: Client sends. Server responds and half closes. |
| 379 // 6: Client sends and half-closes. Server responds and half closes. | 390 // 6: Client sends and half-closes. Server responds and half closes. |
| 380 var tests = 7; | 391 var tests = 7; |
| 381 for (var i = 0; i < tests; i++) { | 392 for (var i = 0; i < tests; i++) { |
| 382 asyncStart(); | 393 asyncStart(); |
| 383 new SocketClose.start(i, asyncEnd); | 394 new SocketClose.start(i, asyncEnd); |
| 384 } | 395 } |
| 385 } | 396 } |
| OLD | NEW |