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 main() { | 5 import "dart:async"; |
6 import "dart:io"; | |
7 | |
8 testSimpleBind() async { | |
9 var s = await RawServerSocket.bind(InternetAddress.LOOPBACK_IP_V4, 0); | |
10 print("port = ${s.port}"); | |
11 await s.close(); | |
12 } | |
13 | |
14 testSimpleConnect() async { | |
15 var server = await RawServerSocket.bind(InternetAddress.LOOPBACK_IP_V4, 0); | |
16 print("server port = ${server.port}"); | |
17 server.listen((socket) { | |
18 print("listen socket port = ${socket.port}"); | |
19 socket.close(); | |
20 }); | |
21 var socket = await RawSocket.connect("127.0.0.1", server.port); | |
22 print("socket port = ${socket.port}"); | |
23 await server.close(); | |
24 await socket.close(); | |
25 } | |
26 | |
27 testSimpleReadWrite({bool dropReads}) async { | |
28 // This test creates a server and a client connects. The client then | |
29 // writes and the server echos. When the server has finished its | |
30 // echo it half-closes. When the client gets the close event is | |
31 // closes fully. | |
32 | |
33 const messageSize = 1000; | |
34 int serverReadCount = 0; | |
35 int clientReadCount = 0; | |
36 | |
37 List<int> createTestData() { | |
38 return new List<int>.generate(messageSize, (index) => index & 0xff); | |
39 } | |
40 | |
41 void verifyTestData(List<int> data) { | |
42 assert(messageSize == data.length); | |
43 List<int> expected = createTestData(); | |
44 for (int i = 0; i < messageSize; i++) { | |
45 assert(expected[i] == data[i]); | |
46 } | |
47 } | |
48 | |
49 var server = await RawServerSocket.bind(InternetAddress.LOOPBACK_IP_V4, 0); | |
50 server.listen((client) { | |
51 int bytesRead = 0; | |
52 int bytesWritten = 0; | |
53 bool closedEventReceived = false; | |
54 List<int> data = new List<int>(messageSize); | |
55 bool doneReading = false; | |
56 | |
57 client.writeEventsEnabled = false; | |
58 client.listen((event) { | |
59 switch (event) { | |
60 case RawSocketEvent.READ: | |
61 if (doneReading) { | |
62 break; | |
63 } | |
64 if (dropReads) { | |
65 if (serverReadCount != 10) { | |
66 serverReadCount++; | |
67 break; | |
68 } else { | |
69 serverReadCount = 0; | |
70 } | |
71 } | |
72 print("client READ event bytesRead = $bytesRead"); | |
73 assert(bytesWritten == 0); | |
74 assert(client.available() > 0); | |
75 var buffer = client.read(200); | |
76 print("client READ event: read ${buffer.length} more bytes"); | |
77 data.setRange(bytesRead, bytesRead + buffer.length, buffer); | |
78 bytesRead += buffer.length; | |
79 if (bytesRead == data.length) { | |
80 verifyTestData(data); | |
81 print("client READ event. Done reading, enabling writes"); | |
82 client.writeEventsEnabled = true; | |
83 doneReading = true; | |
84 } | |
85 break; | |
86 case RawSocketEvent.WRITE: | |
87 assert(!client.writeEventsEnabled); | |
88 bytesWritten += client.write( | |
89 data, bytesWritten, data.length - bytesWritten); | |
90 print("client WRITE event: $bytesWritten written"); | |
91 if (bytesWritten < data.length) { | |
92 client.writeEventsEnabled = true; | |
93 } | |
94 if (bytesWritten == data.length) { | |
95 print("client WRITE event: done writing."); | |
96 client.shutdown(SocketDirection.SEND); | |
97 } | |
98 break; | |
99 case RawSocketEvent.READ_CLOSED: | |
100 print("client READ_CLOSED event"); | |
101 server.close(); | |
102 break; | |
103 case RawSocketEvent.CLOSED: | |
104 assert(!closedEventReceived); | |
105 print("client CLOSED event"); | |
106 closedEventReceived = true; | |
107 break; | |
108 default: throw "Unexpected event $event"; | |
109 } | |
110 }, | |
111 onDone: () {assert(closedEventReceived);}); | |
112 }); | |
113 | |
114 { | |
115 var completer = new Completer(); | |
116 var socket = await RawSocket.connect("127.0.0.1", server.port); | |
117 int bytesRead = 0; | |
118 int bytesWritten = 0; | |
119 bool closedEventReceived = false; | |
120 List<int> data = createTestData(); | |
121 | |
122 socket.listen((event) { | |
123 switch (event) { | |
124 case RawSocketEvent.READ: | |
125 assert(socket.available() > 0); | |
126 if (dropReads) { | |
127 if (clientReadCount != 10) { | |
128 clientReadCount++; | |
129 break; | |
130 } else { | |
131 clientReadCount = 0; | |
132 } | |
133 } | |
134 print("server READ event: ${bytesRead} read"); | |
135 var buffer = socket.read(); | |
136 print("server READ event: read ${buffer.length} more bytes"); | |
137 data.setRange(bytesRead, bytesRead + buffer.length, buffer); | |
138 bytesRead += buffer.length; | |
139 break; | |
140 case RawSocketEvent.WRITE: | |
141 assert(bytesRead == 0); | |
142 assert(!socket.writeEventsEnabled); | |
143 bytesWritten += socket.write( | |
144 data, bytesWritten, data.length - bytesWritten); | |
145 print("server WRITE event: ${bytesWritten} written"); | |
146 if (bytesWritten < data.length) { | |
147 socket.writeEventsEnabled = true; | |
148 } else { | |
149 print("server WRITE event: done writing"); | |
150 data = new List<int>(messageSize); | |
151 } | |
152 break; | |
153 case RawSocketEvent.READ_CLOSED: | |
154 print("server READ_CLOSED event"); | |
155 verifyTestData(data); | |
156 socket.close(); | |
157 break; | |
158 case RawSocketEvent.CLOSED: | |
159 assert(!closedEventReceived); | |
160 print("server CLOSED event"); | |
161 closedEventReceived = true; | |
162 break; | |
163 default: throw "Unexpected event $event"; | |
164 } | |
165 }, | |
166 onDone: () { | |
167 assert(closedEventReceived); | |
168 completer.complete(null); | |
169 }); | |
170 | |
171 return completer.future; | |
172 } | |
173 } | |
174 | |
175 Future testGoogleUrl(SecurityContext context, String outcome) async { | |
176 var client = new HttpClient(context: context); | |
177 // We need to use an external server that is backed by a | |
178 // built-in root certificate authority. | |
179 try { | |
180 // First, check if the lookup works. | |
181 await InternetAddress.lookup('www.google.com'); | |
182 var request = await client.getUrl(Uri.parse('http://www.google.com')); | |
183 request.followRedirects = false; | |
184 var response = await request.close(); | |
185 assert('pass' == outcome); | |
186 try { await response.drain(); } catch (e) { | |
187 print('drain failed: $e'); | |
188 } | |
189 } catch (e) { | |
190 // Lookup failed or connection failed. Don't report a failure. | |
191 print("SocketException: $e"); | |
192 } finally { | |
193 client.close(); | |
194 } | |
195 } | |
196 | |
197 main() async { | |
6 print("Hello, Fuchsia!"); | 198 print("Hello, Fuchsia!"); |
7 } | 199 |
200 print("testSimpleBind"); | |
201 await testSimpleBind(); | |
202 print("testSimpleBind done"); | |
203 | |
204 print("testSimpleConnect"); | |
205 await testSimpleConnect(); | |
206 print("testSimpleConnect done"); | |
207 | |
208 // print("testSimpleReadWrite"); | |
zra
2016/11/18 23:42:17
Uncommenting this test should trigger a call to th
| |
209 // await testSimpleReadWrite(dropReads: false); | |
210 // print("testSimpleReadWrite done"); | |
211 | |
212 // print("testGoogleUrl"); | |
213 // await testGoogleUrl(null, 'pass'); | |
214 // print("testGoogleUrl done"); | |
215 | |
216 print("Goodbyte, Fuchsia!"); | |
217 } | |
OLD | NEW |