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

Side by Side Diff: tests/standalone/src/SocketStreamCloseTest.dart

Issue 9361034: Fix potential flakiness of SocketStreamCloseTest. (Closed) Base URL: https://dart.googlecode.com/svn/branches/bleeding_edge/dart
Patch Set: Address comments Created 8 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
« no previous file with comments | « tests/standalone/src/SocketCloseTest.dart ('k') | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright (c) 2012, the Dart project authors. Please see the AUTHORS file 1 // Copyright (c) 2012, 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=
6 // VMOptions=--short_socket_read
7 // VMOptions=--short_socket_write
8 // VMOptions=--short_socket_read --short_socket_write
9 //
5 // Test socket close events. 10 // Test socket close events.
6 11
7 #import("dart:io"); 12 #import("dart:io");
8 13
9 final SERVERSHUTDOWN = -1; 14 final SERVERSHUTDOWN = -1;
10 final ITERATIONS = 10; 15 final ITERATIONS = 10;
11 16
12 17
13 class SocketClose { 18 class SocketClose {
14 19
15 SocketClose.start(mode) 20 SocketClose.start(mode)
16 : _receivePort = new ReceivePort(), 21 : _receivePort = new ReceivePort(),
17 _sendPort = null, 22 _sendPort = null,
23 _readBytes = 0,
18 _dataEvents = 0, 24 _dataEvents = 0,
19 _closeEvents = 0, 25 _closeEvents = 0,
20 _errorEvents = 0, 26 _errorEvents = 0,
21 _iterations = 0, 27 _iterations = 0,
22 _mode = mode { 28 _mode = mode {
23 new SocketCloseServer().spawn().then((SendPort port) { 29 new SocketCloseServer().spawn().then((SendPort port) {
24 _sendPort = port; 30 _sendPort = port;
25 start(); 31 start();
26 }); 32 });
27 } 33 }
(...skipping 12 matching lines...) Expand all
40 switch (_mode) { 46 switch (_mode) {
41 case 0: 47 case 0:
42 case 1: 48 case 1:
43 case 2: 49 case 2:
44 Expect.fail("No data expected"); 50 Expect.fail("No data expected");
45 break; 51 break;
46 case 3: 52 case 3:
47 case 4: 53 case 4:
48 case 5: 54 case 5:
49 case 6: 55 case 6:
50 List<int> b = new List<int>(100); 56 case 7:
51 _socket.readList(b, 0, 100); 57 case 8:
52 _dataEvents++; 58 var read = _socket.inputStream.read();
59 _readBytes += read.length;
60 if ((_readBytes % 5) == 0) {
61 _dataEvents++;
62 }
53 break; 63 break;
54 default: 64 default:
55 Expect.fail("Unknown test mode"); 65 Expect.fail("Unknown test mode");
56 } 66 }
57 } 67 }
58 68
59 void closeHandler() { 69 void closeHandler() {
60 _closeEvents++; 70 _closeEvents++;
61 switch (_mode) { 71 switch (_mode) {
62 case 0: 72 case 0:
63 case 1: 73 case 1:
64 break; 74 break;
65 case 2: 75 case 2:
66 case 3: 76 case 3:
77 case 4:
67 _socket.outputStream.close(); 78 _socket.outputStream.close();
68 proceed(); 79 proceed();
69 break; 80 break;
70 case 4: 81 case 5:
71 proceed(); 82 proceed();
72 break; 83 break;
73 case 5: 84 case 6:
74 _socket.outputStream.close(); 85 _socket.outputStream.close();
75 proceed(); 86 proceed();
76 break; 87 break;
77 case 6: 88 case 7:
89 case 8:
78 proceed(); 90 proceed();
79 break; 91 break;
80 default: 92 default:
81 Expect.fail("Unknown test mode"); 93 Expect.fail("Unknown test mode");
82 } 94 }
83 } 95 }
84 96
85 void errorHandler() { 97 void errorHandler() {
86 _errorEvents++; 98 _errorEvents++;
87 _socket.close(); 99 _socket.close();
88 } 100 }
89 101
90 void connectHandler() { 102 void connectHandler() {
91 _socket.inputStream.dataHandler = dataHandler; 103 _socket.inputStream.dataHandler = dataHandler;
92 _socket.inputStream.closeHandler = closeHandler; 104 _socket.inputStream.closeHandler = closeHandler;
93 _socket.errorHandler = errorHandler; 105 _socket.errorHandler = errorHandler;
94 106
95 _iterations++; 107 _iterations++;
96 switch (_mode) { 108 switch (_mode) {
97 case 0: 109 case 0:
98 _socket.inputStream.close(); 110 _socket.inputStream.close();
99 proceed(); 111 proceed();
100 break; 112 break;
101 case 1: 113 case 1:
102 _socket.outputStream.write("Hello".charCodes()); 114 _socket.outputStream.write("Hello".charCodes());
103 _socket.inputStream.close(); 115 _socket.outputStream.noPendingWriteHandler = () {
104 proceed(); 116 _socket.inputStream.close();
117 proceed();
118 };
105 break; 119 break;
106 case 2: 120 case 2:
107 case 3: 121 case 3:
108 _socket.outputStream.write("Hello".charCodes());
109 break;
110 case 4: 122 case 4:
111 _socket.outputStream.write("Hello".charCodes()); 123 _socket.outputStream.write("Hello".charCodes());
112 _socket.outputStream.close();
113 break; 124 break;
114 case 5: 125 case 5:
115 _socket.outputStream.write("Hello".charCodes()); 126 _socket.outputStream.write("Hello".charCodes());
127 _socket.outputStream.noPendingWriteHandler = () {
128 _socket.outputStream.close();
129 };
116 break; 130 break;
117 case 6: 131 case 6:
118 _socket.outputStream.write("Hello".charCodes()); 132 _socket.outputStream.write("Hello".charCodes());
119 _socket.outputStream.close(); 133 break;
134 case 7:
135 case 8:
136 _socket.outputStream.write("Hello".charCodes());
137 _socket.outputStream.noPendingWriteHandler = () {
138 _socket.outputStream.close();
139 };
120 break; 140 break;
121 default: 141 default:
122 Expect.fail("Unknown test mode"); 142 Expect.fail("Unknown test mode");
123 } 143 }
124 } 144 }
125 145
126 _socket = new Socket(SocketCloseServer.HOST, _port); 146 _socket = new Socket(SocketCloseServer.HOST, _port);
127 Expect.equals(true, _socket !== null); 147 Expect.equals(true, _socket !== null);
128 _socket.connectHandler = connectHandler; 148 _socket.connectHandler = connectHandler;
129 } 149 }
130 150
131 void start() { 151 void start() {
132 _receivePort.receive((var message, SendPort replyTo) { 152 _receivePort.receive((var message, SendPort replyTo) {
133 _port = message; 153 _port = message;
134 proceed(); 154 proceed();
135 }); 155 });
136 _sendPort.send(_mode, _receivePort.toSendPort()); 156 _sendPort.send(_mode, _receivePort.toSendPort());
137 } 157 }
138 158
139 void shutdown() { 159 void shutdown() {
140 _sendPort.send(SERVERSHUTDOWN, _receivePort.toSendPort()); 160 _sendPort.send(SERVERSHUTDOWN, _receivePort.toSendPort());
141 _receivePort.close(); 161 _receivePort.close();
142 162
143 switch (_mode) { 163 switch (_mode) {
144 case 0: 164 case 0:
145 case 1: 165 case 1:
146 Expect.equals(0, _dataEvents); 166 Expect.equals(0, _dataEvents);
147 Expect.equals(10, _closeEvents); 167 Expect.equals(ITERATIONS, _closeEvents);
148 break; 168 break;
149 case 2: 169 case 2:
150 Expect.equals(0, _dataEvents); 170 Expect.equals(0, _dataEvents);
151 Expect.equals(ITERATIONS, _closeEvents); 171 Expect.equals(ITERATIONS, _closeEvents);
152 break; 172 break;
153 case 3: 173 case 3:
154 case 4:
155 case 5:
156 case 6:
157 Expect.equals(ITERATIONS, _dataEvents); 174 Expect.equals(ITERATIONS, _dataEvents);
158 Expect.equals(ITERATIONS, _closeEvents); 175 Expect.equals(ITERATIONS, _closeEvents);
159 break; 176 break;
177 case 4:
178 Expect.equals(ITERATIONS, _closeEvents);
179 break;
180 case 5:
181 case 6:
182 case 7:
183 case 8:
184 Expect.equals(ITERATIONS, _dataEvents);
185 Expect.equals(ITERATIONS, _closeEvents);
186 break;
160 default: 187 default:
161 Expect.fail("Unknown test mode"); 188 Expect.fail("Unknown test mode");
162 } 189 }
163 Expect.equals(0, _errorEvents); 190 Expect.equals(0, _errorEvents);
164 } 191 }
165 192
166 int _port; 193 int _port;
167 ReceivePort _receivePort; 194 ReceivePort _receivePort;
168 SendPort _sendPort; 195 SendPort _sendPort;
169 Socket _socket; 196 Socket _socket;
170 List<int> _buffer; 197 List<int> _buffer;
198 int _readBytes;
171 int _dataEvents; 199 int _dataEvents;
172 int _closeEvents; 200 int _closeEvents;
173 int _errorEvents; 201 int _errorEvents;
174 int _iterations; 202 int _iterations;
175 int _mode; 203 int _mode;
176 } 204 }
177 205
178 class SocketCloseServer extends Isolate { 206 class SocketCloseServer extends Isolate {
179 207
180 static final HOST = "127.0.0.1"; 208 static final HOST = "127.0.0.1";
181 209
182 SocketCloseServer() : super() {} 210 SocketCloseServer() : super() {}
183 211
184 void main() { 212 void main() {
185 213
186 void connectionHandler(Socket connection) { 214 void connectionHandler(Socket connection) {
187 215
216 void readBytes(whenFiveBytes) {
217 var read = connection.inputStream.read();
218 _readBytes += read.length;
219 if ((_readBytes % 5) == 0) {
220 whenFiveBytes();
221 }
222 }
223
188 void dataHandler() { 224 void dataHandler() {
189 _dataEvents++;
190 switch (_mode) { 225 switch (_mode) {
191 case 0: 226 case 0:
192 Expect.fail("No data expected"); 227 Expect.fail("No data expected");
193 break; 228 break;
194 case 1: 229 case 1:
195 connection.inputStream.read(); 230 readBytes(() => _dataEvents++);
196 break; 231 break;
197 case 2: 232 case 2:
198 connection.inputStream.read(); 233 readBytes(() {
199 connection.inputStream.close(); 234 _dataEvents++;
235 connection.inputStream.close();
236 });
200 break; 237 break;
201 case 3: 238 case 3:
202 connection.inputStream.read(); 239 readBytes(() {
203 connection.outputStream.write("Hello".charCodes()); 240 _dataEvents++;
204 connection.inputStream.close(); 241 connection.outputStream.write("Hello".charCodes());
205 //connection.outputStream.close(); 242 connection.outputStream.noPendingWriteHandler = () {
243 connection.inputStream.close();
244 };
245 });
206 break; 246 break;
207 case 4: 247 case 4:
208 connection.inputStream.read(); 248 readBytes(() {
209 connection.outputStream.write("Hello".charCodes()); 249 _dataEvents++;
250 connection.outputStream.write("Hello".charCodes());
251 connection.inputStream.close();
252 });
210 break; 253 break;
211 case 5: 254 case 5:
255 readBytes(() {
256 _dataEvents++;
257 connection.outputStream.write("Hello".charCodes());
258 });
259 break;
212 case 6: 260 case 6:
213 connection.inputStream.read(); 261 case 7:
214 connection.outputStream.write("Hello".charCodes()); 262 readBytes(() {
215 connection.outputStream.close(); 263 _dataEvents++;
264 connection.outputStream.write("Hello".charCodes());
265 connection.outputStream.noPendingWriteHandler = () {
266 connection.outputStream.close();
267 };
268 });
269 break;
270 case 8:
271 readBytes(() {
272 _dataEvents++;
273 connection.outputStream.write("Hello".charCodes());
274 connection.outputStream.close();
275 });
216 break; 276 break;
217 default: 277 default:
218 Expect.fail("Unknown test mode"); 278 Expect.fail("Unknown test mode");
219 } 279 }
220 } 280 }
221 281
222 void closeHandler() { 282 void closeHandler() {
223 _closeEvents++; 283 _closeEvents++;
224 connection.close(); 284 connection.outputStream.close();
225 } 285 }
226 286
227 void errorHandler() { 287 void errorHandler() {
228 Expect.fail("Socket error"); 288 Expect.fail("Socket error");
229 } 289 }
230 290
231 _iterations++; 291 _iterations++;
232 292
233 connection.inputStream.dataHandler = dataHandler; 293 connection.inputStream.dataHandler = dataHandler;
234 connection.inputStream.closeHandler = closeHandler; 294 connection.inputStream.closeHandler = closeHandler;
(...skipping 15 matching lines...) Expand all
250 case 0: 310 case 0:
251 Expect.equals(0, _dataEvents); 311 Expect.equals(0, _dataEvents);
252 Expect.equals(ITERATIONS, _closeEvents); 312 Expect.equals(ITERATIONS, _closeEvents);
253 break; 313 break;
254 case 1: 314 case 1:
255 Expect.equals(ITERATIONS, _dataEvents); 315 Expect.equals(ITERATIONS, _dataEvents);
256 Expect.equals(ITERATIONS, _closeEvents); 316 Expect.equals(ITERATIONS, _closeEvents);
257 break; 317 break;
258 case 2: 318 case 2:
259 case 3: 319 case 3:
320 case 4:
260 Expect.equals(ITERATIONS, _dataEvents); 321 Expect.equals(ITERATIONS, _dataEvents);
261 Expect.equals(ITERATIONS, _closeEvents); 322 Expect.equals(ITERATIONS, _closeEvents);
262 break; 323 break;
263 case 4:
264 case 5: 324 case 5:
265 case 6: 325 case 6:
326 case 7:
327 case 8:
266 Expect.equals(ITERATIONS, _dataEvents); 328 Expect.equals(ITERATIONS, _dataEvents);
267 Expect.equals(ITERATIONS, _closeEvents); 329 Expect.equals(ITERATIONS, _closeEvents);
268 break; 330 break;
269 default: 331 default:
270 Expect.fail("Unknown test mode"); 332 Expect.fail("Unknown test mode");
271 } 333 }
272 Expect.equals(0, _errorEvents); 334 Expect.equals(0, _errorEvents);
273 _server.close(); 335 _server.close();
274 this.port.close(); 336 this.port.close();
275 } else { 337 } else {
276 new Timer(waitForResult, 100); 338 new Timer(waitForResult, 100);
277 } 339 }
278 } 340 }
279 341
280 this.port.receive((message, SendPort replyTo) { 342 this.port.receive((message, SendPort replyTo) {
281 if (message != SERVERSHUTDOWN) { 343 if (message != SERVERSHUTDOWN) {
344 _readBytes = 0;
282 _errorEvents = 0; 345 _errorEvents = 0;
283 _dataEvents = 0; 346 _dataEvents = 0;
284 _closeEvents = 0; 347 _closeEvents = 0;
285 _iterations = 0; 348 _iterations = 0;
286 _mode = message; 349 _mode = message;
287 _server = new ServerSocket(HOST, 0, 10); 350 _server = new ServerSocket(HOST, 0, 10);
288 Expect.equals(true, _server !== null); 351 Expect.equals(true, _server !== null);
289 _server.connectionHandler = connectionHandler; 352 _server.connectionHandler = connectionHandler;
290 _server.errorHandler = errorHandlerServer; 353 _server.errorHandler = errorHandlerServer;
291 replyTo.send(_server.port, null); 354 replyTo.send(_server.port, null);
292 } else { 355 } else {
293 new Timer(waitForResult, 0); 356 new Timer(waitForResult, 0);
294 } 357 }
295 }); 358 });
296 } 359 }
297 360
298 ServerSocket _server; 361 ServerSocket _server;
362 int _readBytes;
299 int _errorEvents; 363 int _errorEvents;
300 int _dataEvents; 364 int _dataEvents;
301 int _closeEvents; 365 int _closeEvents;
302 int _iterations; 366 int _iterations;
303 int _mode; 367 int _mode;
304 } 368 }
305 369
306 370
307 main() { 371 main() {
308 // Run the close test in these different "modes". 372 // Run the close test in these different "modes".
309 // 0: Client closes without sending at all. 373 // 0: Client closes without sending at all.
310 // 1: Client sends and closes. 374 // 1: Client sends and closes.
311 // 2: Client sends. Server closes. 375 // 2: Client sends. Server closes.
312 // 3: Client sends. Server responds and closes. 376 // 3: Client sends. Server responds and closes.
313 // 4: Client sends and half-closes. Server responds and closes. 377 // 4: Client sends. Server responds and closes without waiting for everything
314 // 5: Client sends. Server responds and half closes. 378 // being sent.
315 // 6: Client sends and half-closes. Server responds and half closes. 379 // 5: Client sends and half-closes. Server responds and closes.
380 // 6: Client sends. Server responds and half closes.
381 // 7: Client sends and half-closes. Server responds and half closes.
382 // 8: Client sends and half-closes. Server responds and half closes without
383 // explicitly waiting for everything being sent.
316 new SocketClose.start(0); 384 new SocketClose.start(0);
317 new SocketClose.start(1); 385 new SocketClose.start(1);
318 new SocketClose.start(2); 386 new SocketClose.start(2);
319 new SocketClose.start(3); 387 new SocketClose.start(3);
320 new SocketClose.start(4); 388 new SocketClose.start(4);
321 new SocketClose.start(5); 389 new SocketClose.start(5);
322 new SocketClose.start(6); 390 new SocketClose.start(6);
391 new SocketClose.start(7);
392 new SocketClose.start(8);
323 } 393 }
OLDNEW
« no previous file with comments | « tests/standalone/src/SocketCloseTest.dart ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698