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/raw_socket_test.dart

Issue 12328037: Add missing files from previous commit (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
(Empty)
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
3 // BSD-style license that can be found in the LICENSE file.
4 //
5 // VMOptions=
6 // VMOptions=--short_socket_read
7 // VMOptions=--short_socket_write
8 // VMOptions=--short_socket_read --short_socket_write
9
10 import "dart:async";
11 import "dart:io";
12 import "dart:isolate";
13
14 void testArguments() {
15 Expect.throws(() => RawServerSocket.bind("127.0.0.1", 65536));
16 Expect.throws(() => RawServerSocket.bind("127.0.0.1", -1));
17 Expect.throws(() => RawServerSocket.bind("127.0.0.1", 0, -1));
18 }
19
20 void testSimpleBind() {
21 ReceivePort port = new ReceivePort();
22 RawServerSocket.bind().then((s) {
23 Expect.isTrue(s.port > 0);
24 port.close();
25 });
26 }
27
28 void testInvalidBind() {
29 int count = 0;
30 ReceivePort port = new ReceivePort();
31 port.receive((_, __) { count++; if (count == 3) port.close(); });
32
33 // Bind to a unknown DNS name.
34 RawServerSocket.bind("ko.faar.__hest__")
35 .then((_) { Expect.fail("Failure expected"); } )
36 .catchError((e) {
37 Expect.isTrue(e.error is SocketIOException);
38 port.toSendPort().send(1);
39 });
40
41 // Bind to an unavaliable IP-address.
42 RawServerSocket.bind("8.8.8.8")
43 .then((_) { Expect.fail("Failure expected"); } )
44 .catchError((e) {
45 Expect.isTrue(e.error is SocketIOException);
46 port.toSendPort().send(1);
47 });
48
49 // Bind to a port already in use.
50 // Either an error or a successful bind is allowed.
51 // Windows platforms allow multiple binding to the same socket, with
52 // unpredictable results.
53 RawServerSocket.bind("127.0.0.1")
54 .then((s) {
55 RawServerSocket.bind("127.0.0.1", s.port)
56 .then((t) {
57 Expect.equals('windows', Platform.operatingSystem);
58 Expect.equals(s.port, t.port);
59 port.toSendPort().send(1);
60 })
61 .catchError((e) {
62 Expect.notEquals('windows', Platform.operatingSystem);
63 Expect.isTrue(e.error is SocketIOException);
64 port.toSendPort().send(1);
65 });
66 });
67 }
68
69 void testSimpleConnect() {
70 ReceivePort port = new ReceivePort();
71 RawServerSocket.bind().then((server) {
72 server.listen((_) { });
73 RawSocket.connect("127.0.0.1", server.port).then((_) {
74 server.close();
75 port.close();
76 });
77 });
78 }
79
80 void testCloseOneEnd(String toClose) {
81 ReceivePort port = new ReceivePort();
82 Completer serverDone = new Completer();
83 Completer serverEndDone = new Completer();
84 Completer clientEndDone = new Completer();
85 Future.wait([serverDone.future, serverEndDone.future, clientEndDone.future])
86 .then((_) {
87 port.close();
88 });
89 RawServerSocket.bind().then((server) {
90 server.listen((serverConnection) {
91 serverConnection.listen((event) {
92 if (toClose == "server" || event == RawSocketEvent.READ_CLOSED) {
93 serverConnection.shutdown(SocketDirection.SEND);
94 }
95 },
96 onDone: () {
97 serverEndDone.complete(null);
98 });
99 },
100 onDone:() {
101 serverDone.complete(null);
102 });
103 RawSocket.connect("127.0.0.1", server.port).then((clientConnection) {
104 clientConnection.listen((event){
105 if (toClose == "client" || event == RawSocketEvent.READ_CLOSED) {
106 clientConnection.shutdown(SocketDirection.SEND);
107 }
108 },
109 onDone: () {
110 clientEndDone.complete(null);
111 server.close();
112 });
113 });
114 });
115 }
116
117 void testServerListenAfterConnect() {
118 ReceivePort port = new ReceivePort();
119 RawServerSocket.bind().then((server) {
120 Expect.isTrue(server.port > 0);
121 RawSocket.connect("127.0.0.1", server.port).then((_) {
122 server.listen((_) {
123 server.close();
124 port.close();
125 });
126 });
127 });
128 }
129
130 void testSimpleReadWrite() {
131 // This test creates a server and a client connects. The client then
132 // writes and the server echos. When the server has finished its
133 // echo it half-closes. When the client gets the close event is
134 // closes fully.
135 ReceivePort port = new ReceivePort();
136
137 const messageSize = 1000;
138
139 List<int> createTestData() {
140 List<int> data = new List.fixedLength(messageSize);
141 for (int i = 0; i < messageSize; i++) {
142 data[i] = i & 0xff;
143 }
144 return data;
145 }
146
147 void verifyTestData(List<int> data) {
148 Expect.equals(messageSize, data.length);
149 List<int> expected = createTestData();
150 for (int i = 0; i < messageSize; i++) {
151 Expect.equals(expected[i], data[i]);
152 }
153 }
154
155 RawServerSocket.bind().then((server) {
156 server.listen((client) {
157 int bytesRead = 0;
158 int bytesWritten = 0;
159 List<int> data = new List.fixedLength(messageSize);
160
161 client.writeEventsEnabled = false;
162 client.listen((event) {
163 switch (event) {
164 case RawSocketEvent.READ:
165 Expect.isTrue(bytesWritten == 0);
166 Expect.isTrue(client.available() > 0);
167 var buffer = client.read();
168 data.setRange(bytesRead, buffer.length, buffer);
169 bytesRead += buffer.length;
170 if (bytesRead == data.length) {
171 verifyTestData(data);
172 client.writeEventsEnabled = true;
173 }
174 break;
175 case RawSocketEvent.WRITE:
176 Expect.isFalse(client.writeEventsEnabled);
177 bytesWritten += client.write(
178 data, bytesWritten, data.length - bytesWritten);
179 if (bytesWritten < data.length) {
180 client.writeEventsEnabled = true;
181 }
182 if (bytesWritten == data.length) {
183 client.shutdown(SocketDirection.SEND);
184 }
185 break;
186 case RawSocketEvent.READ_CLOSED:
187 server.close();
188 break;
189 default: throw "Unexpected event $event";
190 }
191 });
192 });
193
194 RawSocket.connect("127.0.0.1", server.port).then((socket) {
195 int bytesRead = 0;
196 int bytesWritten = 0;
197 List<int> data = createTestData();
198
199 socket.listen((event) {
200 switch (event) {
201 case RawSocketEvent.READ:
202 Expect.isTrue(socket.available() > 0);
203 var buffer = socket.read();
204 data.setRange(bytesRead, buffer.length, buffer);
205 bytesRead += buffer.length;
206 break;
207 case RawSocketEvent.WRITE:
208 Expect.isTrue(bytesRead == 0);
209 Expect.isFalse(socket.writeEventsEnabled);
210 bytesWritten += socket.write(
211 data, bytesWritten, data.length - bytesWritten);
212 if (bytesWritten < data.length) {
213 socket.writeEventsEnabled = true;
214 } else {
215 data = new List.fixedLength(messageSize);
216 }
217 break;
218 case RawSocketEvent.READ_CLOSED:
219 verifyTestData(data);
220 socket.close();
221 break;
222 default: throw "Unexpected event $event";
223 }
224 },
225 onDone: () => port.close());
226 });
227 });
228 }
229
230 testPauseServerSocket() {
231 const int socketCount = 10;
232 var acceptCount = 0;
233 var resumed = false;
234
235 ReceivePort port = new ReceivePort();
236
237 RawServerSocket.bind().then((server) {
238 Expect.isTrue(server.port > 0);
239 var subscription = server.listen((_) {
240 Expect.isTrue(resumed);
241 if (++acceptCount == socketCount) {
242 server.close();
243 port.close();
244 }
245 });
246
247 // Pause the server socket subscription and resume it after having
248 // connected a number client sockets. Then connect more client
249 // sockets.
250 subscription.pause();
251 var connectCount = 0;
252 for (int i = 0; i <= socketCount / 2; i++) {
253 RawSocket.connect("127.0.0.1", server.port).then((_) {
254 if (++connectCount == socketCount / 2) {
255 subscription.resume();
256 resumed = true;
257 for (int i = connectCount; i < socketCount; i++) {
258 RawSocket.connect("127.0.0.1", server.port).then((_) {});
259 }
260 }
261 });
262 }
263 });
264 }
265
266 testCancelResubscribeServerSocket() {
267 const int socketCount = 10;
268 var acceptCount = 0;
269 var doneCount = 0;
270 var closeCount = 0;
271 var errorCount = 0;
272
273 ReceivePort port = new ReceivePort();
274
275 RawServerSocket.bind().then((server) {
276 Expect.isTrue(server.port > 0);
277
278 void checkDone() {
279 if (doneCount == socketCount &&
280 closeCount + errorCount == socketCount) {
281 port.close();
282 }
283 }
284
285 // Subscribe the server socket. Then cancel subscription and
286 // subscribe again.
287 var subscription;
288 subscription = server.listen((client) {
289 if (++acceptCount == socketCount / 2) {
290 subscription.cancel();
291 new Timer(0, (_) {
292 subscription = server.listen((_) {
293 // Close on cancel, so no more events.
294 Expect.fail("Event after closed through cancel");
295 });
296 });
297 }
298 // Close the client socket.
299 client.close();
300 });
301
302 // Connect a number of sockets.
303 for (int i = 0; i < socketCount; i++) {
304 RawSocket.connect("127.0.0.1", server.port).then((socket) {
305 socket.writeEventsEnabled = false;
306 var subscription;
307 subscription = socket.listen((event) {
308 Expect.equals(RawSocketEvent.READ_CLOSED, event);
309 socket.close();
310 closeCount++;
311 checkDone();
312 },
313 onDone: () { doneCount++; checkDone(); },
314 onError: (e) { errorCount++; checkDone(); });
315 });
316 }
317 });
318 }
319
320 testPauseSocket() {
321 const messageSize = 1000;
322 const loopCount = 10;
323 Completer connected = new Completer();
324 int pauseResumeCount = 0;
325 int bytesWritten = 0;
326 int bytesRead = 0;
327 var writeSubscription;
328 var readSubscription;
329
330 ReceivePort port = new ReceivePort();
331
332 RawServerSocket.bind().then((server) {
333 Expect.isTrue(server.port > 0);
334 server.listen((client) {
335 List<int> data = new List.fixedLength(messageSize, fill: 0);
336 writeSubscription = client.listen((event) {
337 switch (event) {
338 case RawSocketEvent.READ:
339 throw "Unexpected read event";
340 case RawSocketEvent.WRITE:
341 if (pauseResumeCount == loopCount) return;
342 Expect.isFalse(client.writeEventsEnabled);
343 Expect.equals(0, bytesRead); // Checks that reader is paused.
344 bytesWritten += client.write(
345 data, bytesWritten, data.length - bytesWritten);
346 // Ensure all data is written. When done disable the write
347 // event and resume the receiver.
348 if (bytesWritten == data.length) {
349 writeSubscription.pause();
350 bytesWritten = 0;
351 connected.future.then((_) { readSubscription.resume(); });
352 }
353 client.writeEventsEnabled = true;
354 break;
355 case RawSocketEvent.READ_CLOSED:
356 client.close();
357 server.close();
358 break;
359 default: throw "Unexpected event $event";
360 }
361 });
362 });
363
364 RawSocket.connect("127.0.0.1", server.port).then((socket) {
365 socket.writeEventsEnabled = false;
366 readSubscription = socket.listen((event) {
367 switch (event) {
368 case RawSocketEvent.READ:
369 Expect.equals(0, bytesWritten); // Checks that writer is paused.
370 Expect.isTrue(socket.available() > 0);
371 var buffer = socket.read();
372 bytesRead += buffer.length;
373 // Ensure all data is read. When done pause and resume the sender
374 if (bytesRead == messageSize) {
375 if (++pauseResumeCount == loopCount) {
376 socket.close();
377 port.close();
378 } else {
379 readSubscription.pause();
380 }
381 // Always resume writer as it needs the read closed
382 // event when done.
383 bytesRead = 0;
384 writeSubscription.resume();
385 }
386 break;
387 case RawSocketEvent.WRITE:
388 throw "Unexpected write event";
389 case RawSocketEvent.READ_CLOSED:
390 throw "Unexpected close event";
391 default: throw "Unexpected event $event";
392 }
393 });
394 readSubscription.pause();
395 connected.complete(true);
396 });
397 });
398 }
399
400 main() {
401 testArguments();
402 testSimpleBind();
403 testCloseOneEnd("client");
404 testCloseOneEnd("server");
405 testInvalidBind();
406 testSimpleConnect();
407 testServerListenAfterConnect();
408 testSimpleReadWrite();
409 testPauseServerSocket();
410 testCancelResubscribeServerSocket();
411 testPauseSocket();
412 }
OLDNEW
« no previous file with comments | « tests/standalone/io/raw_secure_socket_test.dart ('k') | tests/standalone/io/raw_socket_write_destroy_test.dart » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698