OLD | NEW |
1 // Copyright (c) 2016, the Dart project authors. Please see the AUTHORS file | 1 // Copyright (c) 2016, 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 import "dart:async"; | 5 import "dart:async"; |
6 import "dart:io"; | 6 import "dart:io"; |
7 | 7 |
8 testAddressParse() async { | 8 testAddressParse() async { |
9 print(new InternetAddress("1.0.2.3").rawAddress); | 9 print(new InternetAddress("1.0.2.3").rawAddress); |
10 print(new InternetAddress("1.0.2.3").type); | 10 print(new InternetAddress("1.0.2.3").type); |
(...skipping 27 matching lines...) Expand all Loading... |
38 socket.remoteAddress.type != InternetAddressType.IP_V4) { | 38 socket.remoteAddress.type != InternetAddressType.IP_V4) { |
39 throw "Bad remote address ${socket.remoteAddress}"; | 39 throw "Bad remote address ${socket.remoteAddress}"; |
40 } | 40 } |
41 if (socket.remotePort is! int) { | 41 if (socket.remotePort is! int) { |
42 throw "Bad remote port ${socket.remotePort}"; | 42 throw "Bad remote port ${socket.remotePort}"; |
43 } | 43 } |
44 await server.close(); | 44 await server.close(); |
45 await socket.close(); | 45 await socket.close(); |
46 } | 46 } |
47 | 47 |
48 testSimpleReadWrite({bool dropReads}) async { | 48 testSimpleReadWriteClose() async { |
| 49 // This test creates a server and a client connects. The client then |
| 50 // writes and the server echos. When the client finishes fully reading the |
| 51 // echo, it closes the socket. When the server receives the close event, it |
| 52 // closes its end of the socket too. |
| 53 |
| 54 const messageSize = 1000; |
| 55 int serverReadCount = 0; |
| 56 int clientReadCount = 0; |
| 57 |
| 58 List<int> createTestData() { |
| 59 return new List<int>.generate(messageSize, (index) => index & 0xff); |
| 60 } |
| 61 |
| 62 void verifyTestData(List<int> data) { |
| 63 assert(messageSize == data.length); |
| 64 List<int> expected = createTestData(); |
| 65 for (int i = 0; i < messageSize; i++) { |
| 66 assert(expected[i] == data[i]); |
| 67 } |
| 68 } |
| 69 |
| 70 var server = await RawServerSocket.bind(InternetAddress.LOOPBACK_IP_V4, 0); |
| 71 server.listen((client) { |
| 72 int bytesRead = 0; |
| 73 int bytesWritten = 0; |
| 74 bool closedEventReceived = false; |
| 75 List<int> data = new List<int>(messageSize); |
| 76 bool doneReading = false; |
| 77 |
| 78 client.writeEventsEnabled = false; |
| 79 client.listen((event) { |
| 80 switch (event) { |
| 81 case RawSocketEvent.READ: |
| 82 if (doneReading) { |
| 83 break; |
| 84 } |
| 85 print("client READ event bytesRead = $bytesRead"); |
| 86 assert(bytesWritten == 0); |
| 87 assert(client.available() > 0); |
| 88 var buffer = client.read(200); |
| 89 print("client READ event: read ${buffer.length} more bytes"); |
| 90 data.setRange(bytesRead, bytesRead + buffer.length, buffer); |
| 91 bytesRead += buffer.length; |
| 92 if (bytesRead == data.length) { |
| 93 verifyTestData(data); |
| 94 print("client READ event. Done reading, enabling writes"); |
| 95 client.writeEventsEnabled = true; |
| 96 doneReading = true; |
| 97 } |
| 98 break; |
| 99 case RawSocketEvent.WRITE: |
| 100 assert(!client.writeEventsEnabled); |
| 101 bytesWritten += client.write( |
| 102 data, bytesWritten, data.length - bytesWritten); |
| 103 print("client WRITE event: $bytesWritten written"); |
| 104 if (bytesWritten < data.length) { |
| 105 client.writeEventsEnabled = true; |
| 106 } |
| 107 if (bytesWritten == data.length) { |
| 108 print("client WRITE event: done writing."); |
| 109 } |
| 110 break; |
| 111 case RawSocketEvent.READ_CLOSED: |
| 112 print("client READ_CLOSED event"); |
| 113 client.close(); |
| 114 server.close(); |
| 115 break; |
| 116 case RawSocketEvent.CLOSED: |
| 117 assert(!closedEventReceived); |
| 118 print("client CLOSED event"); |
| 119 closedEventReceived = true; |
| 120 break; |
| 121 default: throw "Unexpected event $event"; |
| 122 } |
| 123 }, |
| 124 onError: (e) { print("client ERROR $e"); }, |
| 125 onDone: () {assert(closedEventReceived);}); |
| 126 }); |
| 127 |
| 128 { |
| 129 var completer = new Completer(); |
| 130 var socket = await RawSocket.connect("127.0.0.1", server.port); |
| 131 int bytesRead = 0; |
| 132 int bytesWritten = 0; |
| 133 bool closedEventReceived = false; |
| 134 List<int> data = createTestData(); |
| 135 |
| 136 socket.listen((event) { |
| 137 switch (event) { |
| 138 case RawSocketEvent.READ: |
| 139 assert(socket.available() > 0); |
| 140 print("server READ event: ${bytesRead} read"); |
| 141 var buffer = socket.read(); |
| 142 print("server READ event: read ${buffer.length} more bytes"); |
| 143 data.setRange(bytesRead, bytesRead + buffer.length, buffer); |
| 144 bytesRead += buffer.length; |
| 145 if (bytesRead == messageSize) { |
| 146 print("server READ event: done reading"); |
| 147 socket.close(); |
| 148 } |
| 149 break; |
| 150 case RawSocketEvent.WRITE: |
| 151 assert(bytesRead == 0); |
| 152 assert(!socket.writeEventsEnabled); |
| 153 bytesWritten += socket.write( |
| 154 data, bytesWritten, data.length - bytesWritten); |
| 155 print("server WRITE event: ${bytesWritten} written"); |
| 156 if (bytesWritten < data.length) { |
| 157 socket.writeEventsEnabled = true; |
| 158 } else { |
| 159 print("server WRITE event: done writing"); |
| 160 data = new List<int>(messageSize); |
| 161 } |
| 162 break; |
| 163 case RawSocketEvent.READ_CLOSED: |
| 164 print("server READ_CLOSED event"); |
| 165 verifyTestData(data); |
| 166 socket.close(); |
| 167 break; |
| 168 case RawSocketEvent.CLOSED: |
| 169 assert(!closedEventReceived); |
| 170 print("server CLOSED event"); |
| 171 closedEventReceived = true; |
| 172 break; |
| 173 default: throw "Unexpected event $event"; |
| 174 } |
| 175 }, |
| 176 onError: (e) { print("server ERROR $e"); }, |
| 177 onDone: () { |
| 178 assert(closedEventReceived); |
| 179 completer.complete(null); |
| 180 }); |
| 181 |
| 182 return completer.future; |
| 183 } |
| 184 } |
| 185 |
| 186 testSimpleReadWriteShutdown({bool dropReads}) async { |
49 // This test creates a server and a client connects. The client then | 187 // This test creates a server and a client connects. The client then |
50 // writes and the server echos. When the server has finished its | 188 // writes and the server echos. When the server has finished its |
51 // echo it half-closes. When the client gets the close event is | 189 // echo it half-closes. When the client gets the close event is |
52 // closes fully. | 190 // closes fully. |
53 | 191 |
54 const messageSize = 1000; | 192 const messageSize = 1000; |
55 int serverReadCount = 0; | 193 int serverReadCount = 0; |
56 int clientReadCount = 0; | 194 int clientReadCount = 0; |
57 | 195 |
58 List<int> createTestData() { | 196 List<int> createTestData() { |
(...skipping 133 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
192 return completer.future; | 330 return completer.future; |
193 } | 331 } |
194 } | 332 } |
195 | 333 |
196 Future testGoogleUrl(SecurityContext context, String outcome) async { | 334 Future testGoogleUrl(SecurityContext context, String outcome) async { |
197 var client = new HttpClient(context: context); | 335 var client = new HttpClient(context: context); |
198 // We need to use an external server that is backed by a | 336 // We need to use an external server that is backed by a |
199 // built-in root certificate authority. | 337 // built-in root certificate authority. |
200 try { | 338 try { |
201 // First, check if the lookup works. | 339 // First, check if the lookup works. |
202 await InternetAddress.lookup('www.google.com'); | 340 var address = await InternetAddress.lookup('www.google.com'); |
203 var request = await client.getUrl(Uri.parse('http://www.google.com')); | 341 print(address); |
| 342 var request = await client.getUrl(Uri.parse('http://www.google.com/')); |
204 request.followRedirects = false; | 343 request.followRedirects = false; |
205 var response = await request.close(); | 344 var response = await request.close(); |
206 assert('pass' == outcome); | 345 assert('pass' == outcome); |
207 try { await response.drain(); } catch (e) { | 346 try { await response.drain(); } catch (e) { |
208 print('drain failed: $e'); | 347 print('drain failed: $e'); |
209 } | 348 } |
210 } catch (e) { | 349 } catch (e) { |
211 // Lookup failed or connection failed. Don't report a failure. | 350 // Lookup failed or connection failed. Don't report a failure. |
212 print("SocketException: $e"); | 351 print("SocketException: $e"); |
213 } finally { | 352 } finally { |
214 client.close(); | 353 client.close(); |
215 } | 354 } |
216 } | 355 } |
217 | 356 |
218 main() async { | 357 main() async { |
219 print("Hello, Fuchsia!"); | 358 print("Hello, Fuchsia!"); |
220 | 359 |
221 print("testAddressParse"); | 360 print("testAddressParse"); |
222 await testAddressParse(); | 361 await testAddressParse(); |
223 print("testAddressParse done"); | 362 print("testAddressParse done"); |
224 | 363 |
225 print("testSimpleBind"); | 364 print("testSimpleBind"); |
226 await testSimpleBind(); | 365 await testSimpleBind(); |
227 print("testSimpleBind done"); | 366 print("testSimpleBind done"); |
228 | 367 |
229 print("testSimpleConnect"); | 368 print("testSimpleConnect"); |
230 await testSimpleConnect(); | 369 await testSimpleConnect(); |
231 print("testSimpleConnect done"); | 370 print("testSimpleConnect done"); |
232 | 371 |
| 372 print("testSimpleReadWriteClose"); |
| 373 await testSimpleReadWriteClose(); |
| 374 print("testSimpleReadWriteClose done"); |
| 375 |
233 // TODO(US-81): Enable. | 376 // TODO(US-81): Enable. |
234 // print("testSimpleReadWrite"); | 377 // print("testSimpleReadWriteShutdown"); |
235 // await testSimpleReadWrite(dropReads: false); | 378 // await testSimpleReadWriteShutdown(dropReads: false); |
236 // print("testSimpleReadWrite done"); | 379 // print("testSimpleReadWriteShutdown done"); |
237 | 380 |
238 print("testGoogleUrl"); | 381 print("testGoogleUrl"); |
239 await testGoogleUrl(null, 'pass'); | 382 await testGoogleUrl(null, 'pass'); |
240 print("testGoogleUrl done"); | 383 print("testGoogleUrl done"); |
241 | 384 |
242 print("Goodbyte, Fuchsia!"); | 385 print("Goodbyte, Fuchsia!"); |
243 } | 386 } |
OLD | NEW |