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

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

Issue 13502004: Add the ability to secure an already established raw socket connection (Closed) Base URL: https://dart.googlecode.com/svn/branches/bleeding_edge/dart
Patch Set: Removed debug print Created 7 years, 8 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
« sdk/lib/io/secure_socket.dart ('K') | « sdk/lib/io/socket.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) 2013, 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 import "dart:async"; 10 import "dart:async";
(...skipping 115 matching lines...) Expand 10 before | Expand all | Expand 10 after
126 clientEnd.shutdown(SocketDirection.SEND); 126 clientEnd.shutdown(SocketDirection.SEND);
127 serverEnd.shutdown(SocketDirection.SEND); 127 serverEnd.shutdown(SocketDirection.SEND);
128 server.close(); 128 server.close();
129 port.close(); 129 port.close();
130 }); 130 });
131 }); 131 });
132 }); 132 });
133 }); 133 });
134 } 134 }
135 135
136 void testSimpleReadWrite() { 136 // This test creates a server and a client connects. The client then
137 // This test creates a server and a client connects. The client then 137 // writes and the server echos. When the server has finished its echo
138 // writes and the server echos. When the server has finished its 138 // it half-closes. When the client gets the close event is closes
139 // echo it half-closes. When the client gets the close event is 139 //
Mads Ager (google) 2013/04/03 15:26:55 Move 'fully.' up here and have the empty line afte
Søren Gjesse 2013/04/19 05:17:09 Done.
140 // closes fully. 140 // fully.
141 // The test can be run in different configurations based on
142 // the boolean arguments.
143 //
144 // listenSecure
145 // When this argument is true a secure server is used. When this is false
146 // a non-secure server is used and the connections are secured after beeing
147 // connected.
148 //
149 // connectSecure
150 // When this argument is true a secure client connection is used. When this
151 // is false a non-secure client connection is used and the connection is
152 // secured after being connected.
153 //
154 // handshakeBeforeSecure
155 // When this argument is true some initial clear text handshake is done
156 // between client and server before the connection is secured. This argument
157 // only makes sense when both listenSecure and connectSecure are false.
158 void testSimpleReadWrite(bool listenSecure,
159 bool connectSecure,
160 bool handshakeBeforeSecure) {
161 if (handshakeBeforeSecure == true &&
162 (listenSecure == true || connectSecure == true)) {
163 Expect.fails("Invalid arguments to testSimpleReadWrite");
164 }
165
141 ReceivePort port = new ReceivePort(); 166 ReceivePort port = new ReceivePort();
142 167
143 const messageSize = 1000; 168 const messageSize = 1000;
169 const handshakeMessageSize = 100;
144 170
145 List<int> createTestData() { 171 List<int> createTestData() {
146 List<int> data = new List<int>(messageSize); 172 List<int> data = new List<int>(messageSize);
147 for (int i = 0; i < messageSize; i++) { 173 for (int i = 0; i < messageSize; i++) {
148 data[i] = i & 0xff; 174 data[i] = i & 0xff;
149 } 175 }
150 return data; 176 return data;
151 } 177 }
152 178
179 List<int> createHandshakeTestData() {
180 List<int> data = new List<int>(handshakeMessageSize);
181 for (int i = 0; i < handshakeMessageSize; i++) {
182 data[i] = i & 0xff;
183 }
184 return data;
185 }
186
153 void verifyTestData(List<int> data) { 187 void verifyTestData(List<int> data) {
154 Expect.equals(messageSize, data.length); 188 Expect.equals(messageSize, data.length);
155 List<int> expected = createTestData(); 189 List<int> expected = createTestData();
156 for (int i = 0; i < messageSize; i++) { 190 for (int i = 0; i < messageSize; i++) {
157 Expect.equals(expected[i], data[i]); 191 Expect.equals(expected[i], data[i]);
158 } 192 }
159 } 193 }
160 194
161 RawSecureServerSocket.bind(SERVER_ADDRESS, 0, 5, CERTIFICATE).then((server) { 195 void verifyHandshakeTestData(List<int> data) {
196 Expect.equals(handshakeMessageSize, data.length);
197 List<int> expected = createHandshakeTestData();
198 for (int i = 0; i < handshakeMessageSize; i++) {
199 Expect.equals(expected[i], data[i]);
200 }
201 }
202
203 Future runServer(RawSocket client) {
204 var completer = new Completer();
205 int bytesRead = 0;
206 int bytesWritten = 0;
207 List<int> data = new List<int>(messageSize);
208 client.writeEventsEnabled = false;
209 var subscription;
210 subscription = client.listen((event) {
211 switch (event) {
212 case RawSocketEvent.READ:
213 Expect.isTrue(bytesWritten == 0);
214 Expect.isTrue(client.available() > 0);
215 var buffer = client.read();
216 if (buffer != null) {
217 data.setRange(bytesRead, buffer.length, buffer);
218 bytesRead += buffer.length;
219 for (var value in buffer) {
220 Expect.isTrue(value is int);
221 Expect.isTrue(value < 256 && value >= 0);
222 }
223 }
224 if (bytesRead == data.length) {
225 verifyTestData(data);
226 client.writeEventsEnabled = true;
227 }
228 break;
229 case RawSocketEvent.WRITE:
230 Expect.isFalse(client.writeEventsEnabled);
231 Expect.equals(bytesRead, data.length);
232 for (int i = bytesWritten; i < data.length; ++i) {
233 Expect.isTrue(data[i] is int);
234 Expect.isTrue(data[i] < 256 && data[i] >= 0);
235 }
236 bytesWritten += client.write(
237 data, bytesWritten, data.length - bytesWritten);
238 if (bytesWritten < data.length) {
239 client.writeEventsEnabled = true;
240 }
241 if (bytesWritten == data.length) {
242 client.shutdown(SocketDirection.SEND);
243 }
244 break;
245 case RawSocketEvent.READ_CLOSED:
246 completer.complete(null);
247 break;
248 default: throw "Unexpected event $event";
249 }
250 });
251 return completer.future;
252 }
253
254 Future<RawSocket> runClient(RawSocket socket) {
255 var completer = new Completer();
256 int bytesRead = 0;
257 int bytesWritten = 0;
258 List<int> dataSent = createTestData();
259 List<int> dataReceived = new List<int>(dataSent.length);
260 socket.listen((event) {
261 switch (event) {
262 case RawSocketEvent.READ:
263 Expect.isTrue(socket.available() > 0);
264 var buffer = socket.read();
265 if (buffer != null) {
266 dataReceived.setRange(bytesRead, buffer.length, buffer);
267 bytesRead += buffer.length;
268 }
269 break;
270 case RawSocketEvent.WRITE:
271 Expect.isTrue(bytesRead == 0);
272 Expect.isFalse(socket.writeEventsEnabled);
273 bytesWritten += socket.write(
274 dataSent, bytesWritten, dataSent.length - bytesWritten);
275 if (bytesWritten < dataSent.length) {
276 socket.writeEventsEnabled = true;
277 }
278 break;
279 case RawSocketEvent.READ_CLOSED:
280 verifyTestData(dataReceived);
281 completer.complete(socket);
282 break;
283 default: throw "Unexpected event $event";
284 }
285 });
286 return completer.future;
287 }
288
289 Future runServerHandshake(RawSocket client) {
290 var completer = new Completer();
291 int bytesRead = 0;
292 int bytesWritten = 0;
293 List<int> data = new List<int>(handshakeMessageSize);
294 client.writeEventsEnabled = false;
295 var subscription;
296 subscription = client.listen((event) {
297 switch (event) {
298 case RawSocketEvent.READ:
299 Expect.isTrue(bytesWritten == 0);
300 Expect.isTrue(client.available() > 0);
301 var buffer = client.read();
302 if (buffer != null) {
303 data.setRange(bytesRead, buffer.length, buffer);
304 bytesRead += buffer.length;
305 for (var value in buffer) {
306 Expect.isTrue(value is int);
307 Expect.isTrue(value < 256 && value >= 0);
308 }
309 }
310 if (bytesRead == data.length) {
311 verifyHandshakeTestData(data);
312 client.writeEventsEnabled = true;
313 }
314 break;
315 case RawSocketEvent.WRITE:
316 Expect.isFalse(client.writeEventsEnabled);
317 Expect.equals(bytesRead, data.length);
318 for (int i = bytesWritten; i < data.length; ++i) {
319 Expect.isTrue(data[i] is int);
320 Expect.isTrue(data[i] < 256 && data[i] >= 0);
321 }
322 bytesWritten += client.write(
323 data, bytesWritten, data.length - bytesWritten);
324 if (bytesWritten < data.length) {
325 client.writeEventsEnabled = true;
326 }
327 if (bytesWritten == data.length) {
328 subscription.cancel();
329 completer.complete(null);
330 }
331 break;
332 case RawSocketEvent.READ_CLOSED:
333 Expect.fail("Unexpected close");
334 break;
335 default: throw "Unexpected event $event";
336 }
337 });
338 return completer.future;
339 }
340
341 Future<RawSocket> runClientHandshake(RawSocket socket) {
342 var completer = new Completer();
343 int bytesRead = 0;
344 int bytesWritten = 0;
345 List<int> dataSent = createHandshakeTestData();
346 List<int> dataReceived = new List<int>(dataSent.length);
347 var subscription;
348 subscription = socket.listen((event) {
349 switch (event) {
350 case RawSocketEvent.READ:
351 Expect.isTrue(socket.available() > 0);
352 var buffer = socket.read();
353 if (buffer != null) {
354 dataReceived.setRange(bytesRead, buffer.length, buffer);
355 bytesRead += buffer.length;
356 if (bytesRead == dataSent.length) {
357 verifyHandshakeTestData(dataReceived);
358 subscription.cancel();
359 completer.complete(socket);
360 }
361 }
362 break;
363 case RawSocketEvent.WRITE:
364 Expect.isTrue(bytesRead == 0);
365 Expect.isFalse(socket.writeEventsEnabled);
366 bytesWritten += socket.write(
367 dataSent, bytesWritten, dataSent.length - bytesWritten);
368 if (bytesWritten < dataSent.length) {
369 socket.writeEventsEnabled = true;
370 }
371 break;
372 case RawSocketEvent.READ_CLOSED:
373 Expect.fail("Unexpected close");
374 break;
375 default: throw "Unexpected event $event";
376 }
377 });
378 return completer.future;
379 }
380
381 Future<RawSecureSocket> connectClient(int port) {
382 if (connectSecure) {
383 return RawSecureSocket.connect(HOST_NAME, port);
384 } else if (!handshakeBeforeSecure) {
385 return RawSocket.connect(HOST_NAME, port).then((socket) {
386 return RawSecureSocket.secure(socket);
387 });
388 } else {
389 return RawSocket.connect(HOST_NAME, port).then((socket) {
390 return runClientHandshake(socket).then((_) {
391 return RawSecureSocket.secure(socket);
392 });
393 });
394 }
395 }
396
397 serverReady(server) {
162 server.listen((client) { 398 server.listen((client) {
163 int bytesRead = 0; 399 if (listenSecure) {
164 int bytesWritten = 0; 400 runServer(client).then((_) => server.close());
165 List<int> data = new List<int>(messageSize); 401 } else if (!handshakeBeforeSecure) {
166 402 RawSecureSocket.secureServer(client, CERTIFICATE).then((client) {
167 client.writeEventsEnabled = false; 403 runServer(client).then((_) => server.close());
168 client.listen((event) { 404 });
169 switch (event) { 405 } else {
170 case RawSocketEvent.READ: 406 runServerHandshake(client).then((_) {
171 Expect.isTrue(bytesWritten == 0); 407 RawSecureSocket.secureServer(client, CERTIFICATE).then((client) {
172 Expect.isTrue(client.available() > 0); 408 runServer(client).then((_) => server.close());
173 var buffer = client.read(); 409 });
174 if (buffer != null) { 410 });
175 data.setRange(bytesRead, buffer.length, buffer); 411 }
176 bytesRead += buffer.length; 412 });
177 for (var value in buffer) { 413
178 Expect.isTrue(value is int); 414 connectClient(server.port).then(runClient).then((socket) {
179 Expect.isTrue(value < 256 && value >= 0); 415 socket.close();
180 } 416 port.close();
181 } 417 });
182 if (bytesRead == data.length) { 418 }
183 verifyTestData(data); 419
184 client.writeEventsEnabled = true; 420 if (listenSecure) {
185 } 421 RawSecureServerSocket.bind(
186 break; 422 SERVER_ADDRESS, 0, 5, CERTIFICATE).then(serverReady);
187 case RawSocketEvent.WRITE: 423 } else {
188 Expect.isFalse(client.writeEventsEnabled); 424 RawServerSocket.bind(SERVER_ADDRESS, 0, 5).then(serverReady);
189 Expect.equals(bytesRead, data.length); 425 }
190 for (int i = bytesWritten; i < data.length; ++i) {
191 Expect.isTrue(data[i] is int);
192 Expect.isTrue(data[i] < 256 && data[i] >= 0);
193 }
194 bytesWritten += client.write(
195 data, bytesWritten, data.length - bytesWritten);
196 if (bytesWritten < data.length) {
197 client.writeEventsEnabled = true;
198 }
199 if (bytesWritten == data.length) {
200 client.shutdown(SocketDirection.SEND);
201 }
202 break;
203 case RawSocketEvent.READ_CLOSED:
204 server.close();
205 break;
206 default: throw "Unexpected event $event";
207 }
208 });
209 });
210
211 RawSecureSocket.connect(HOST_NAME, server.port).then((socket) {
212 int bytesRead = 0;
213 int bytesWritten = 0;
214 List<int> dataSent = createTestData();
215 List<int> dataReceived = new List<int>(dataSent.length);
216 socket.listen((event) {
217 switch (event) {
218 case RawSocketEvent.READ:
219 Expect.isTrue(socket.available() > 0);
220 var buffer = socket.read();
221 if (buffer != null) {
222 dataReceived.setRange(bytesRead, buffer.length, buffer);
223 bytesRead += buffer.length;
224 }
225 break;
226 case RawSocketEvent.WRITE:
227 Expect.isTrue(bytesRead == 0);
228 Expect.isFalse(socket.writeEventsEnabled);
229 bytesWritten += socket.write(
230 dataSent, bytesWritten, dataSent.length - bytesWritten);
231 if (bytesWritten < dataSent.length) {
232 socket.writeEventsEnabled = true;
233 }
234 break;
235 case RawSocketEvent.READ_CLOSED:
236 verifyTestData(dataReceived);
237 socket.close();
238 port.close();
239 break;
240 default: throw "Unexpected event $event";
241 }
242 });
243 });
244 });
245 } 426 }
246 427
247 main() { 428 main() {
248 Path scriptDir = new Path(new Options().script).directoryPath; 429 Path scriptDir = new Path(new Options().script).directoryPath;
249 Path certificateDatabase = scriptDir.append('pkcert'); 430 Path certificateDatabase = scriptDir.append('pkcert');
250 SecureSocket.initialize(database: certificateDatabase.toNativePath(), 431 SecureSocket.initialize(database: certificateDatabase.toNativePath(),
251 password: 'dartdart', 432 password: 'dartdart',
252 useBuiltinRoots: false); 433 useBuiltinRoots: false);
253 testArguments(); 434 testArguments();
254 testSimpleBind(); 435 testSimpleBind();
255 testInvalidBind(); 436 testInvalidBind();
256 testSimpleConnect(CERTIFICATE); 437 testSimpleConnect(CERTIFICATE);
257 testSimpleConnect("CN=localhost"); 438 testSimpleConnect("CN=localhost");
258 testSimpleConnectFail("not_a_nickname"); 439 testSimpleConnectFail("not_a_nickname");
259 testSimpleConnectFail("CN=notARealDistinguishedName"); 440 testSimpleConnectFail("CN=notARealDistinguishedName");
260 testServerListenAfterConnect(); 441 testServerListenAfterConnect();
261 testSimpleReadWrite(); 442 testSimpleReadWrite(true, true, false);
443 testSimpleReadWrite(true, false, false);
444 testSimpleReadWrite(false, true, false);
445 testSimpleReadWrite(false, false, false);
446 testSimpleReadWrite(false, false, true);
262 } 447 }
OLDNEW
« sdk/lib/io/secure_socket.dart ('K') | « sdk/lib/io/socket.dart ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698