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

Side by Side Diff: tests/standalone/io/socket_close_test.dart

Issue 12316036: Merge IO v2 branch to bleeding edge (Closed) Base URL: https://dart.googlecode.com/svn/branches/bleeding_edge/dart
Patch Set: Created 7 years, 10 months 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 unified diff | Download patch | Annotate | Revision Log
OLDNEW
1 // Copyright (c) 2012, 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
(...skipping 22 matching lines...) Expand all
34 void proceed() { 34 void proceed() {
35 if (_iterations < ITERATIONS) { 35 if (_iterations < ITERATIONS) {
36 Timer.run(sendData); 36 Timer.run(sendData);
37 } else { 37 } else {
38 shutdown(); 38 shutdown();
39 } 39 }
40 } 40 }
41 41
42 void sendData() { 42 void sendData() {
43 43
44 void dataHandler() { 44 void dataHandler(bytes) {
45 switch (_mode) { 45 switch (_mode) {
46 case 0: 46 case 0:
47 case 1: 47 case 1:
48 case 2: 48 case 2:
49 Expect.fail("No data expected"); 49 Expect.fail("No data expected");
50 break; 50 break;
51 case 3: 51 case 3:
52 case 4: 52 case 4:
53 case 5: 53 case 5:
54 case 6: 54 case 6:
55 List<int> b = new List<int>.fixedLength(5); 55 _readBytes += bytes.length;
56 _readBytes += _socket.readList(b, 0, 5);
57 if ((_readBytes % 5) == 0) { 56 if ((_readBytes % 5) == 0) {
58 _dataEvents++; 57 _dataEvents++;
59 } 58 }
60 break; 59 break;
61 default: 60 default:
62 Expect.fail("Unknown test mode"); 61 Expect.fail("Unknown test mode");
63 } 62 }
64 } 63 }
65 64
66 void closeHandler() { 65 void closeHandler(socket) {
67 _closeEvents++; 66 _closeEvents++;
68 switch (_mode) { 67 switch (_mode) {
69 case 0: 68 case 0:
70 case 1: 69 case 1:
71 Expect.fail("No close expected"); 70 socket.close();
72 break; 71 break;
73 case 2: 72 case 2:
74 case 3: 73 case 3:
75 _socket.close(); 74 socket.close();
76 proceed(); 75 proceed();
77 break; 76 break;
78 case 4: 77 case 4:
79 proceed(); 78 proceed();
80 break; 79 break;
81 case 5: 80 case 5:
82 _socket.close(); 81 socket.close();
83 proceed(); 82 proceed();
84 break; 83 break;
85 case 6: 84 case 6:
86 proceed(); 85 proceed();
87 break; 86 break;
88 default: 87 default:
89 Expect.fail("Unknown test mode"); 88 Expect.fail("Unknown test mode");
90 } 89 }
91 } 90 }
92 91
93 void errorHandler(Exception e) { 92 void errorHandler(Exception e) {
94 _errorEvents++; 93 _errorEvents++;
95 _socket.close(); 94 socket.close();
96 } 95 }
97 96
98 void connectHandler() { 97 void connectHandler(socket) {
99 _socket.onData = dataHandler; 98 socket.listen(
100 _socket.onClosed = closeHandler; 99 dataHandler,
101 _socket.onError = errorHandler; 100 onDone: () => closeHandler(socket),
101 onError: (error) => errorHandler(socket));
102 102
103 void writeHello() { 103 void writeHello() {
104 int bytesWritten = 0; 104 socket.add("Hello".charCodes);
105 while (bytesWritten != 5) {
106 bytesWritten += _socket.writeList("Hello".charCodes,
107 bytesWritten,
108 5 - bytesWritten);
109 }
110 } 105 }
111 106
112 _iterations++; 107 _iterations++;
113 switch (_mode) { 108 switch (_mode) {
114 case 0: 109 case 0:
115 _socket.close(); 110 socket.destroy();
116 proceed(); 111 proceed();
117 break; 112 break;
118 case 1: 113 case 1:
119 writeHello(); 114 writeHello();
120 _socket.close(); 115 socket.destroy();
121 proceed(); 116 proceed();
122 break; 117 break;
123 case 2: 118 case 2:
124 case 3: 119 case 3:
125 writeHello(); 120 writeHello();
126 break; 121 break;
127 case 4: 122 case 4:
128 writeHello(); 123 writeHello();
129 _socket.close(true); 124 socket.close(); // Half close.
130 break; 125 break;
131 case 5: 126 case 5:
132 writeHello(); 127 writeHello();
133 break; 128 break;
134 case 6: 129 case 6:
135 writeHello(); 130 writeHello();
136 _socket.close(true); 131 socket.close(); // Half close.
137 break; 132 break;
138 default: 133 default:
139 Expect.fail("Unknown test mode"); 134 Expect.fail("Unknown test mode");
140 } 135 }
141 } 136 }
142 137
143 _socket = new Socket(SocketCloseServer.HOST, _port); 138 Socket.connect(SocketCloseServer.HOST, _port).then(connectHandler);
144 Expect.equals(true, _socket != null);
145 _socket.onConnect = connectHandler;
146 } 139 }
147 140
148 void initialize() { 141 void initialize() {
149 _receivePort.receive((var message, SendPort replyTo) { 142 _receivePort.receive((var message, SendPort replyTo) {
150 _port = message; 143 _port = message;
151 proceed(); 144 proceed();
152 }); 145 });
153 _sendPort.send(_mode, _receivePort.toSendPort()); 146 _sendPort.send(_mode, _receivePort.toSendPort());
154 } 147 }
155 148
156 void shutdown() { 149 void shutdown() {
157 _sendPort.send(SERVERSHUTDOWN, _receivePort.toSendPort()); 150 _sendPort.send(SERVERSHUTDOWN, _receivePort.toSendPort());
158 _receivePort.receive((message, ignore) { 151 _receivePort.receive((message, ignore) {
159 _donePort.send(null); 152 _donePort.send(null);
160 _receivePort.close(); 153 _receivePort.close();
161 }); 154 });
162 155
163 switch (_mode) { 156 switch (_mode) {
164 case 0: 157 case 0:
165 case 1: 158 case 1:
166 Expect.equals(0, _dataEvents); 159 Expect.equals(0, _dataEvents);
167 Expect.equals(0, _closeEvents); 160 Expect.equals(ITERATIONS, _closeEvents);
168 break; 161 break;
169 case 2: 162 case 2:
170 Expect.equals(0, _dataEvents); 163 Expect.equals(0, _dataEvents);
171 Expect.equals(ITERATIONS, _closeEvents); 164 Expect.equals(ITERATIONS, _closeEvents);
172 break; 165 break;
173 case 3: 166 case 3:
174 case 4: 167 case 4:
168 Expect.isTrue(_dataEvents <= ITERATIONS);
169 Expect.isTrue(_dataEvents >= 0);
170 Expect.equals(ITERATIONS, _closeEvents);
171 break;
175 case 5: 172 case 5:
176 case 6: 173 case 6:
177 Expect.equals(ITERATIONS, _dataEvents); 174 Expect.equals(ITERATIONS, _dataEvents);
178 Expect.equals(ITERATIONS, _closeEvents); 175 Expect.equals(ITERATIONS, _closeEvents);
179 break; 176 break;
180 default: 177 default:
181 Expect.fail("Unknown test mode"); 178 Expect.fail("Unknown test mode");
182 } 179 }
183 Expect.equals(0, _errorEvents); 180 Expect.equals(0, _errorEvents);
184 } 181 }
185 182
186 int _port; 183 int _port;
187 ReceivePort _receivePort; 184 ReceivePort _receivePort;
188 SendPort _sendPort; 185 SendPort _sendPort;
189 Socket _socket;
190 List<int> _buffer; 186 List<int> _buffer;
191 int _readBytes; 187 int _readBytes;
192 int _dataEvents; 188 int _dataEvents;
193 int _closeEvents; 189 int _closeEvents;
194 int _errorEvents; 190 int _errorEvents;
195 int _iterations; 191 int _iterations;
196 int _mode; 192 int _mode;
197 SendPort _donePort; 193 SendPort _donePort;
198 } 194 }
199 195
(...skipping 12 matching lines...) Expand all
212 208
213 class SocketCloseServer { 209 class SocketCloseServer {
214 210
215 static const HOST = "127.0.0.1"; 211 static const HOST = "127.0.0.1";
216 212
217 SocketCloseServer() : super() {} 213 SocketCloseServer() : super() {}
218 214
219 void connectionHandler(ConnectionData data) { 215 void connectionHandler(ConnectionData data) {
220 var connection = data.connection; 216 var connection = data.connection;
221 217
222 void readBytes(whenFiveBytes) { 218 void readBytes(bytes, whenFiveBytes) {
223 List<int> b = new List<int>.fixedLength(5); 219 data.readBytes += bytes.length;
224 data.readBytes += connection.readList(b, 0, 5); 220 Expect.isTrue(data.readBytes <= 5);
225 if (data.readBytes == 5) { 221 if (data.readBytes == 5) {
226 whenFiveBytes(); 222 whenFiveBytes();
227 } 223 }
228 } 224 }
229 225
230 void writeHello() { 226 void writeHello() {
231 int bytesWritten = 0; 227 connection.add("Hello".charCodes);
232 while (bytesWritten != 5) {
233 bytesWritten += connection.writeList("Hello".charCodes,
234 bytesWritten,
235 5 - bytesWritten);
236 }
237 } 228 }
238 229
239 void dataHandler() { 230 void dataHandler(bytes) {
240 switch (_mode) { 231 switch (_mode) {
241 case 0: 232 case 0:
242 Expect.fail("No data expected"); 233 Expect.fail("No data expected");
243 break; 234 break;
244 case 1: 235 case 1:
245 readBytes(() { _dataEvents++; }); 236 readBytes(bytes, () { _dataEvents++; });
246 break; 237 break;
247 case 2: 238 case 2:
248 readBytes(() { 239 readBytes(bytes, () {
249 _dataEvents++; 240 _dataEvents++;
250 connection.close(); 241 connection.destroy();
251 }); 242 });
252 break; 243 break;
253 case 3: 244 case 3:
254 readBytes(() { 245 readBytes(bytes, () {
255 _dataEvents++; 246 _dataEvents++;
256 writeHello(); 247 writeHello();
257 connection.close(); 248 connection.destroy();
258 }); 249 });
259 break; 250 break;
260 case 4: 251 case 4:
261 readBytes(() { 252 readBytes(bytes, () {
262 _dataEvents++; 253 _dataEvents++;
263 writeHello(); 254 writeHello();
264 }); 255 });
265 break; 256 break;
266 case 5: 257 case 5:
267 case 6: 258 case 6:
268 readBytes(() { 259 readBytes(bytes, () {
269 _dataEvents++; 260 _dataEvents++;
270 writeHello(); 261 writeHello();
271 connection.close(true); 262 connection.close(); // Half close.
272 }); 263 });
273 break; 264 break;
274 default: 265 default:
275 Expect.fail("Unknown test mode"); 266 Expect.fail("Unknown test mode");
276 } 267 }
277 } 268 }
278 269
279 void closeHandler() { 270 void closeHandler() {
280 _closeEvents++; 271 _closeEvents++;
281 connection.close(); 272 connection.close();
282 } 273 }
283 274
284 void errorHandler(Exception e) { 275 void errorHandler(e) {
285 Expect.fail("Socket error $e"); 276 Expect.fail("Socket error $e");
286 } 277 }
287 278
288 _iterations++; 279 _iterations++;
289 280
290 connection.onData = dataHandler; 281 connection.listen(
291 connection.onClosed = closeHandler; 282 dataHandler,
292 connection.onError = errorHandler; 283 onDone: closeHandler,
284 onError: errorHandler);
293 } 285 }
294 286
295 void errorHandlerServer(Exception e) { 287 void errorHandlerServer(e) {
296 Expect.fail("Server socket error"); 288 Expect.fail("Server socket error");
297 } 289 }
298 290
299 waitForResult() { 291 waitForResult() {
300 // Make sure all iterations have been run. In multiple of these 292 // Make sure all iterations have been run. In multiple of these
301 // scenarios it is possible to get the SERVERSHUTDOWN message 293 // scenarios it is possible to get the SERVERSHUTDOWN message
302 // before we have received the last close event on the 294 // before we have received the last close event on the
303 // server. In these cases we wait for the correct number of 295 // server. In these cases we wait for the correct number of
304 // close events. 296 // close events.
305 if (_iterations == ITERATIONS && 297 if (_iterations == ITERATIONS &&
306 (_closeEvents == ITERATIONS || (_mode == 2 || _mode == 3))) { 298 (_closeEvents == ITERATIONS || (_mode == 2 || _mode == 3))) {
307 switch (_mode) { 299 switch (_mode) {
308 case 0: 300 case 0:
309 Expect.equals(0, _dataEvents); 301 Expect.equals(0, _dataEvents);
310 Expect.equals(ITERATIONS, _closeEvents); 302 Expect.equals(ITERATIONS, _closeEvents);
311 break; 303 break;
312 case 1: 304 case 1:
313 Expect.equals(ITERATIONS, _dataEvents); 305 Expect.isTrue(_dataEvents <= ITERATIONS);
306 Expect.isTrue(_dataEvents >= 0);
314 Expect.equals(ITERATIONS, _closeEvents); 307 Expect.equals(ITERATIONS, _closeEvents);
315 break; 308 break;
316 case 2: 309 case 2:
317 case 3: 310 case 3:
318 Expect.equals(ITERATIONS, _dataEvents); 311 Expect.equals(ITERATIONS, _dataEvents);
319 Expect.equals(0, _closeEvents); 312 Expect.equals(ITERATIONS, _closeEvents);
320 break; 313 break;
321 case 4: 314 case 4:
322 case 5: 315 case 5:
323 case 6: 316 case 6:
324 Expect.equals(ITERATIONS, _dataEvents); 317 Expect.equals(ITERATIONS, _dataEvents);
325 Expect.equals(ITERATIONS, _closeEvents); 318 Expect.equals(ITERATIONS, _closeEvents);
326 break; 319 break;
327 default: 320 default:
328 Expect.fail("Unknown test mode"); 321 Expect.fail("Unknown test mode");
329 } 322 }
330 Expect.equals(0, _errorEvents); 323 Expect.equals(0, _errorEvents);
331 _server.close(); 324 _server.close();
332 port.close(); 325 port.close();
333 _donePort.send(null); 326 _donePort.send(null);
334 } else { 327 } else {
335 new Timer(new Duration(milliseconds: 100), waitForResult); 328 new Timer(new Duration(milliseconds: 100), waitForResult);
336 } 329 }
337 } 330 }
338 331
339 void dispatch(message, SendPort replyTo) { 332 void dispatch(message, SendPort replyTo) {
340 _donePort = replyTo; 333 _donePort = replyTo;
341 if (message != SERVERSHUTDOWN) { 334 if (message != SERVERSHUTDOWN) {
342 _readBytes = 0; 335 _readBytes = 0;
343 _errorEvents = 0; 336 _errorEvents = 0;
344 _dataEvents = 0; 337 _dataEvents = 0;
345 _closeEvents = 0; 338 _closeEvents = 0;
346 _iterations = 0; 339 _iterations = 0;
347 _mode = message; 340 _mode = message;
348 _server = new ServerSocket(HOST, 0, 10); 341 ServerSocket.bind().then((server) {
349 Expect.equals(true, _server != null); 342 _server = server;
350 _server.onConnection = (connection) { 343 _server.listen(
351 var data = new ConnectionData(connection); 344 (socket) {
352 connectionHandler(data); 345 var data = new ConnectionData(socket);
353 }; 346 connectionHandler(data);
354 _server.onError = errorHandlerServer; 347 },
355 replyTo.send(_server.port, null); 348 onError: errorHandlerServer
349 );
350 replyTo.send(_server.port, null);
351 });
356 } else { 352 } else {
357 Timer.run(waitForResult); 353 Timer.run(waitForResult);
358 } 354 }
359 } 355 }
360 356
361 ServerSocket _server; 357 ServerSocket _server;
362 SendPort _donePort; 358 SendPort _donePort;
363 int _readBytes; 359 int _readBytes;
364 int _errorEvents; 360 int _errorEvents;
365 int _dataEvents; 361 int _dataEvents;
366 int _closeEvents; 362 int _closeEvents;
367 int _iterations; 363 int _iterations;
368 int _mode; 364 int _mode;
369 } 365 }
370 366
371 367
372 main() { 368 main() {
373 // Run the close test in these different "modes". 369 // Run the close test in these different "modes".
374 // 0: Client closes without sending at all. 370 // 0: Client closes without sending at all.
375 // 1: Client sends and closes. 371 // 1: Client sends and destroys.
376 // 2: Client sends. Server closes. 372 // 2: Client sends. Server destroys.
377 // 3: Client sends. Server responds and closes. 373 // 3: Client sends. Server responds and destroys.
378 // 4: Client sends and half-closes. Server responds and closes. 374 // 4: Client sends and half-closes. Server responds and destroys.
379 // 5: Client sends. Server responds and half closes. 375 // 5: Client sends. Server responds and half closes.
380 // 6: Client sends and half-closes. Server responds and half closes. 376 // 6: Client sends and half-closes. Server responds and half closes.
381 var tests = 7; 377 var tests = 7;
382 var port = new ReceivePort(); 378 var port = new ReceivePort();
383 var completed = 0; 379 var completed = 0;
384 port.receive((message, ignore) { 380 port.receive((message, ignore) {
385 if (++completed == tests) port.close(); 381 if (++completed == tests) port.close();
386 }); 382 });
387 for (var i = 0; i < tests; i++) { 383 for (var i = 0; i < tests; i++) {
388 new SocketClose.start(i, port.toSendPort()); 384 new SocketClose.start(i, port.toSendPort());
389 } 385 }
390 } 386 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698