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

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

Issue 12340072: dart:io | Enable tests of secure websocket connections. (Closed) Base URL: https://dart.googlecode.com/svn/branches/bleeding_edge/dart
Patch Set: Remove indentation FOR REVIEW ONLY. Intentation is restored in version to commit. Created 7 years, 9 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
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:io"; 10 import "dart:io";
11 import "dart:isolate"; 11 import "dart:isolate";
12 import "dart:scalarlist"; 12 import "dart:scalarlist";
13 import "dart:uri";
13 14
14 void testRequestResponseClientCloses( 15 const String CERT_NAME = 'localhost_cert';
15 int totalConnections, int closeStatus, String closeReason) { 16 const String SERVER_ADDRESS = '127.0.0.1';
16 HttpServer.bind().then((server) { 17 const String HOST_NAME = 'localhost';
17 18
19 /**
20 * A SecurityConfiguration lets us run the tests over HTTP or HTTPS.
21 */
22 class SecurityConfiguration {
23 final bool secure;
24
25 SecurityConfiguration({bool this.secure});
26
27 Future<HttpServer> createServer({int backlog: 0}) =>
28 secure ? HttpServer.bindSecure(SERVER_ADDRESS,
29 0,
30 backlog: backlog,
31 certificateName: CERT_NAME)
32 : HttpServer.bind(SERVER_ADDRESS,
33 0,
34 backlog);
35
36 Future<WebSocket> createClient(int port) =>
37 WebSocket.connect('${secure ? "wss" : "ws"}://$HOST_NAME:$port/');
38
39 void testRequestResponseClientCloses(int totalConnections,
40 int closeStatus,
41 String closeReason) {
42 createServer().then((server) {
18 server.transform(new WebSocketTransformer()).listen((webSocket) { 43 server.transform(new WebSocketTransformer()).listen((webSocket) {
19 webSocket.listen((event) { 44 webSocket.listen((event) {
20 if (event is MessageEvent) { 45 if (event is MessageEvent) {
21 webSocket.send(event.data); 46 webSocket.send(event.data);
22 } else if (event is CloseEvent) { 47 } else if (event is CloseEvent) {
23 Expect.equals(closeStatus == null 48 Expect.equals(closeStatus == null
24 ? WebSocketStatus.NO_STATUS_RECEIVED 49 ? WebSocketStatus.NO_STATUS_RECEIVED
25 : closeStatus, event.code); 50 : closeStatus, event.code);
26 Expect.equals(closeReason == null ? "" : closeReason, event.reason); 51 Expect.equals(closeReason == null ? "" : closeReason, event.reason);
27 } 52 }
28 }); 53 });
29 }); 54 });
30 55
31 int closeCount = 0; 56 int closeCount = 0;
32 String messageText = "Hello, world!"; 57 String messageText = "Hello, world!";
33 for (int i = 0; i < totalConnections; i++) { 58 for (int i = 0; i < totalConnections; i++) {
34 int messageCount = 0; 59 int messageCount = 0;
35 WebSocket.connect("ws://127.0.0.1:${server.port}/") 60 createClient(server.port).then((webSocket) {
36 .then((webSocket) { 61 webSocket.send(messageText);
37 webSocket.send(messageText); 62 webSocket.listen((event) {
38 webSocket.listen((event) { 63 if (event is MessageEvent) {
39 if (event is MessageEvent) { 64 messageCount++;
40 messageCount++; 65 if (messageCount < 1 ) {
41 if (messageCount < 1 ) { 66 Expect.equals(messageText, event.data);
42 Expect.equals(messageText, event.data); 67 webSocket.send(event.data);
43 webSocket.send(event.data); 68 } else {
44 } else { 69 webSocket.close(closeStatus, closeReason);
45 webSocket.close(closeStatus, closeReason);
46 }
47 } else if (event is CloseEvent) {
48 Expect.equals(closeStatus == null
49 ? WebSocketStatus.NO_STATUS_RECEIVED
50 : closeStatus, event.code);
51 Expect.equals("", event.reason);
52 closeCount++;
53 if (closeCount == totalConnections) {
54 server.close();
55 }
56 } 70 }
57 }); 71 } else if (event is CloseEvent) {
72 Expect.equals(closeStatus == null
73 ? WebSocketStatus.NO_STATUS_RECEIVED
74 : closeStatus, event.code);
75 Expect.equals("", event.reason);
76 closeCount++;
77 if (closeCount == totalConnections) {
78 server.close();
79 }
80 }
58 }); 81 });
82 });
59 } 83 }
60
61 }); 84 });
62 } 85 }
63 86
64 87 void testRequestResponseServerCloses(int totalConnections,
65 void testRequestResponseServerCloses( 88 int closeStatus,
66 int totalConnections, int closeStatus, String closeReason) { 89 String closeReason) {
67 HttpServer.bind().then((server) { 90 createServer().then((server) {
68
69 int closeCount = 0; 91 int closeCount = 0;
70 server.transform(new WebSocketTransformer()).listen((webSocket) { 92 server.transform(new WebSocketTransformer()).listen((webSocket) {
71 String messageText = "Hello, world!"; 93 String messageText = "Hello, world!";
72 int messageCount = 0; 94 int messageCount = 0;
73 webSocket.listen((event) { 95 webSocket.listen((event) {
74 if (event is MessageEvent) { 96 if (event is MessageEvent) {
75 messageCount++; 97 messageCount++;
76 if (messageCount < 10) { 98 if (messageCount < 10) {
77 Expect.equals(messageText, event.data); 99 Expect.equals(messageText, event.data);
78 webSocket.send(event.data); 100 webSocket.send(event.data);
79 } else { 101 } else {
80 webSocket.close(closeStatus, closeReason); 102 webSocket.close(closeStatus, closeReason);
81 } 103 }
82 } else if (event is CloseEvent) { 104 } else if (event is CloseEvent) {
83 Expect.equals(closeStatus == null 105 Expect.equals(closeStatus == null
84 ? WebSocketStatus.NO_STATUS_RECEIVED 106 ? WebSocketStatus.NO_STATUS_RECEIVED
85 : closeStatus, event.code); 107 : closeStatus, event.code);
86 Expect.equals("", event.reason); 108 Expect.equals("", event.reason);
87 closeCount++; 109 closeCount++;
88 if (closeCount == totalConnections) { 110 if (closeCount == totalConnections) {
89 server.close(); 111 server.close();
90 } 112 }
91 } 113 }
92 }); 114 });
93 webSocket.send(messageText); 115 webSocket.send(messageText);
94 }); 116 });
95 117
96 for (int i = 0; i < totalConnections; i++) { 118 for (int i = 0; i < totalConnections; i++) {
97 WebSocket.connect("ws://127.0.0.1:${server.port}/") 119 createClient(server.port).then((webSocket) {
98 .then((webSocket) {
99 webSocket.listen((event) { 120 webSocket.listen((event) {
100 if (event is MessageEvent) { 121 if (event is MessageEvent) {
101 webSocket.send(event.data); 122 webSocket.send(event.data);
102 } else if (event is CloseEvent) { 123 } else if (event is CloseEvent) {
103 Expect.equals(closeStatus == null 124 Expect.equals(closeStatus == null
104 ? WebSocketStatus.NO_STATUS_RECEIVED 125 ? WebSocketStatus.NO_STATUS_RECEIVED
105 : closeStatus, event.code); 126 : closeStatus, event.code);
106 Expect.equals( 127 Expect.equals(
107 closeReason == null ? "" : closeReason, event.reason); 128 closeReason == null ? "" : closeReason, event.reason);
108 } 129 }
109 }); 130 });
110 }); 131 });
111 } 132 }
112 133
113 }); 134 });
114 } 135 }
115 136
116 137
117 void testMessageLength(int messageLength) { 138 void testMessageLength(int messageLength) {
118 HttpServer.bind().then((server) { 139 createServer().then((server) {
119
120 Uint8List originalMessage = new Uint8List(messageLength); 140 Uint8List originalMessage = new Uint8List(messageLength);
121 server.transform(new WebSocketTransformer()).listen((webSocket) { 141 server.transform(new WebSocketTransformer()).listen((webSocket) {
122 webSocket.listen((event) { 142 webSocket.listen((event) {
123 if (event is MessageEvent) { 143 if (event is MessageEvent) {
124 Expect.listEquals(originalMessage, event.data); 144 Expect.listEquals(originalMessage, event.data);
125 webSocket.send(event.data); 145 webSocket.send(event.data);
126 } else if (event is CloseEvent) { 146 } else if (event is CloseEvent) {
127 } 147 }
128 }); 148 });
129 }); 149 });
130 150
131 WebSocket.connect("ws://127.0.0.1:${server.port}/") 151 createClient(server.port).then((webSocket) {
132 .then((webSocket) {
133 webSocket.listen((event) { 152 webSocket.listen((event) {
134 if (event is MessageEvent) { 153 if (event is MessageEvent) {
135 Expect.listEquals(originalMessage, event.data); 154 Expect.listEquals(originalMessage, event.data);
136 webSocket.close(); 155 webSocket.close();
137 } else if (event is CloseEvent) { 156 } else if (event is CloseEvent) {
138 server.close(); 157 server.close();
139 } 158 }
140 }); 159 });
141 webSocket.send(originalMessage); 160 webSocket.send(originalMessage);
142 }); 161 });
143
144 }); 162 });
145 } 163 }
146 164
147 165
148 void testNoUpgrade() { 166 void testNoUpgrade() {
149 HttpServer.bind().then((server) { 167 createServer().then((server) {
150
151 // Create a server which always responds with NOT_FOUND. 168 // Create a server which always responds with NOT_FOUND.
152 server.listen((request) { 169 server.listen((request) {
153 request.response.statusCode = HttpStatus.NOT_FOUND; 170 request.response.statusCode = HttpStatus.NOT_FOUND;
154 request.response.close(); 171 request.response.close();
155 }); 172 });
156 173
157 WebSocket.connect("ws://127.0.0.1:${server.port}/").catchError((error) { 174 createClient(server.port).catchError((error) {
158 server.close(); 175 server.close();
159 }); 176 });
160
161 }); 177 });
162 } 178 }
163 179
164 180
165 void testUsePOST() { 181 void testUsePOST() {
166 HttpServer.bind().then((server) { 182 createServer().then((server) {
167
168 var errorPort = new ReceivePort(); 183 var errorPort = new ReceivePort();
169 server.transform(new WebSocketTransformer()).listen((webSocket) { 184 server.transform(new WebSocketTransformer()).listen((webSocket) {
170 Expect.fail("No connection expected"); 185 Expect.fail("No connection expected");
171 }, onError: (e) { 186 }, onError: (e) {
172 errorPort.close(); 187 errorPort.close();
173 }); 188 });
174 189
175 HttpClient client = new HttpClient(); 190 HttpClient client = new HttpClient();
176 client.post("127.0.0.1", server.port, "/") 191 client.postUrl(Uri.parse(
192 "${secure ? 'https:' : 'http:'}//$HOST_NAME:${server.port}/"))
177 .then((request) => request.close()) 193 .then((request) => request.close())
178 .then((response) { 194 .then((response) {
179 Expect.equals(HttpStatus.BAD_REQUEST, response.statusCode); 195 Expect.equals(HttpStatus.BAD_REQUEST, response.statusCode);
180 client.close(); 196 client.close();
181 server.close(); 197 server.close();
182 }); 198 });
183
184 }); 199 });
185 } 200 }
186 201
187 202 void testW3CInterface(int totalConnections,
Søren Gjesse 2013/02/26 15:28:51 Ditto.
188 class WebSocketInfo { 203 int closeStatus,
189 int messageCount = 0; 204 String closeReason) {
190 } 205 createServer().then((server) {
191
192
193 void testW3CInterface(
194 int totalConnections, int closeStatus, String closeReason) {
195 HttpServer.bind().then((server) {
196
197 int closeCount = 0; 206 int closeCount = 0;
198 server.transform(new WebSocketTransformer()).listen((webSocket) { 207 server.transform(new WebSocketTransformer()).listen((webSocket) {
199 String messageText = "Hello, world!"; 208 String messageText = "Hello, world!";
200 int messageCount = 0; 209 int messageCount = 0;
201 webSocket.listen((event) { 210 webSocket.listen((event) {
202 if (event is MessageEvent) { 211 if (event is MessageEvent) {
203 messageCount++; 212 messageCount++;
204 if (messageCount < 10) { 213 if (messageCount < 10) {
205 Expect.equals(messageText, event.data); 214 Expect.equals(messageText, event.data);
206 webSocket.send(event.data); 215 webSocket.send(event.data);
(...skipping 10 matching lines...) Expand all
217 } 226 }
218 }); 227 });
219 webSocket.send(messageText); 228 webSocket.send(messageText);
220 }); 229 });
221 230
222 void webSocketConnection() { 231 void webSocketConnection() {
223 bool onopenCalled = false; 232 bool onopenCalled = false;
224 int onmessageCalled = 0; 233 int onmessageCalled = 0;
225 bool oncloseCalled = false; 234 bool oncloseCalled = false;
226 235
227 WebSocket.connect("ws://127.0.0.1:${server.port}").then((webSocket) { 236 createClient(server.port).then((webSocket) {
228 Expect.isFalse(onopenCalled); 237 Expect.isFalse(onopenCalled);
229 Expect.equals(0, onmessageCalled); 238 Expect.equals(0, onmessageCalled);
230 Expect.isFalse(oncloseCalled); 239 Expect.isFalse(oncloseCalled);
231 onopenCalled = true; 240 onopenCalled = true;
232 Expect.equals(WebSocket.OPEN, webSocket.readyState); 241 Expect.equals(WebSocket.OPEN, webSocket.readyState);
233 webSocket.listen((event) { 242 webSocket.listen((event) {
234 if (event is MessageEvent) { 243 if (event is MessageEvent) {
235 onmessageCalled++; 244 onmessageCalled++;
236 Expect.isTrue(onopenCalled); 245 Expect.isTrue(onopenCalled);
237 Expect.isFalse(oncloseCalled); 246 Expect.isFalse(oncloseCalled);
238 Expect.equals(WebSocket.OPEN, webSocket.readyState); 247 Expect.equals(WebSocket.OPEN, webSocket.readyState);
239 webSocket.send(event.data); 248 webSocket.send(event.data);
240 } else if (event is CloseEvent) { 249 } else if (event is CloseEvent) {
241 Expect.isTrue(onopenCalled); 250 Expect.isTrue(onopenCalled);
242 Expect.equals(10, onmessageCalled); 251 Expect.equals(10, onmessageCalled);
243 Expect.isFalse(oncloseCalled); 252 Expect.isFalse(oncloseCalled);
244 oncloseCalled = true; 253 oncloseCalled = true;
245 Expect.isTrue(event.wasClean); 254 Expect.isTrue(event.wasClean);
246 Expect.equals(3002, event.code); 255 Expect.equals(3002, event.code);
247 Expect.equals("Got tired", event.reason); 256 Expect.equals("Got tired", event.reason);
248 Expect.equals(WebSocket.CLOSED, webSocket.readyState); 257 Expect.equals(WebSocket.CLOSED, webSocket.readyState);
249 } 258 }
250 }); 259 });
251 }); 260 });
252 } 261 }
253 262
254 for (int i = 0; i < totalConnections; i++) { 263 for (int i = 0; i < totalConnections; i++) {
255 webSocketConnection(); 264 webSocketConnection();
256 } 265 }
266 });
267 }
257 268
258 }); 269 void runTests() {
270 testRequestResponseClientCloses(2, null, null);
271 testRequestResponseClientCloses(2, 3001, null);
272 testRequestResponseClientCloses(2, 3002, "Got tired");
273 testRequestResponseServerCloses(2, null, null);
274 testRequestResponseServerCloses(2, 3001, null);
275 testRequestResponseServerCloses(2, 3002, "Got tired");
276 testMessageLength(125);
277 testMessageLength(126);
278 testMessageLength(127);
279 testMessageLength(65535);
280 testMessageLength(65536);
281 testNoUpgrade();
282 testUsePOST();
283 testW3CInterface(2, 3002, "Got tired");
284 }
285 }
286
287
288 void initializeSSL() {
289 var testPkcertDatabase =
290 new Path(new Options().script).directoryPath.append("pkcert/");
291 SecureSocket.initialize(database: testPkcertDatabase.toNativePath(),
292 password: "dartdart");
259 } 293 }
260 294
261 295
262 main() { 296 main() {
263 testRequestResponseClientCloses(2, null, null); 297 new SecurityConfiguration(secure: false).runTests();
264 testRequestResponseClientCloses(2, 3001, null); 298 initializeSSL();
265 testRequestResponseClientCloses(2, 3002, "Got tired"); 299 new SecurityConfiguration(secure: true).runTests();
266 testRequestResponseServerCloses(2, null, null);
267 testRequestResponseServerCloses(2, 3001, null);
268 testRequestResponseServerCloses(2, 3002, "Got tired");
269 testMessageLength(125);
270 testMessageLength(126);
271 testMessageLength(127);
272 testMessageLength(65535);
273 testMessageLength(65536);
274 testNoUpgrade();
275 testUsePOST();
276
277 testW3CInterface(2, 3002, "Got tired");
278 } 300 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698