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

Side by Side Diff: chrome/test/data/extensions/api_test/sockets_tcp/api/background.js

Issue 76403004: An implementation of chrome.socket.secure(). (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Addressed, @rsleevi's comments, added a new TLS test, further separated TLS and TCP tests, and reba… Created 6 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
OLDNEW
1 // Copyright 2013 The Chromium Authors. All rights reserved. 1 // Copyright 2013 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 // net/tools/testserver/testserver.py is picky about the format of what it 5 // net/tools/testserver/testserver.py is picky about the format of what it
6 // calls its "echo" messages. One might go so far as to mutter to oneself that 6 // calls its "echo" messages. One might go so far as to mutter to oneself that
7 // it isn't an echo server at all. 7 // it isn't an echo server at all.
8 // 8 //
9 // The response is based on the request but obfuscated using a random key. 9 // The response is based on the request but obfuscated using a random key.
10 const request = "0100000005320000005hello"; 10 const request = "0100000005320000005hello";
11 var expectedResponsePattern = /0100000005320000005.{11}/; 11 var expectedResponsePattern = /0100000005320000005.{11}/;
12 const http_get = "GET test.html HTTP/1.0\r\n\r\n";
13 var expectedHTTPPattern = /HTTP.1.0 200 OK/;
12 14
13 var address; 15 var tcp_address;
16 var https_address;
14 var bytesSent = 0; 17 var bytesSent = 0;
15 var dataAsString; 18 var dataAsString;
16 var dataRead = []; 19 var dataRead = [];
17 var port = -1; 20 var tcp_port = -1;
21 var https_port = -1;
18 var protocol = "none"; 22 var protocol = "none";
19 var socketId = 0; 23 var tcp_socketId = 0;
24 var https_socketId = 0;
20 var echoDataSent = false; 25 var echoDataSent = false;
21 var succeeded = false; 26 var succeeded = false;
22 var waitCount = 0; 27 var waitCount = 0;
23 28
29 // Keys are socketIds. Values are inner dictionaries with two keys: onReceive,
30 // onReceiveError. Both are functions.
31 var receive_dispatcher = {}
32
24 // Many thanks to Dennis for his StackOverflow answer: http://goo.gl/UDanx 33 // Many thanks to Dennis for his StackOverflow answer: http://goo.gl/UDanx
25 // Since amended to handle BlobBuilder deprecation. 34 // Since amended to handle BlobBuilder deprecation.
26 function string2ArrayBuffer(string, callback) { 35 function string2ArrayBuffer(string, callback) {
27 var blob = new Blob([string]); 36 var blob = new Blob([string]);
28 var f = new FileReader(); 37 var f = new FileReader();
29 f.onload = function(e) { 38 f.onload = function(e) {
30 callback(e.target.result); 39 callback(e.target.result);
31 }; 40 };
32 f.readAsArrayBuffer(blob); 41 f.readAsArrayBuffer(blob);
33 } 42 }
34 43
35 function arrayBuffer2String(buf, callback) { 44 function arrayBuffer2String(buf, callback) {
36 var blob = new Blob([new Uint8Array(buf)]); 45 var blob = new Blob([new Uint8Array(buf)]);
37 var f = new FileReader(); 46 var f = new FileReader();
38 f.onload = function(e) { 47 f.onload = function(e) {
39 callback(e.target.result); 48 callback(e.target.result);
40 }; 49 };
41 f.readAsText(blob); 50 f.readAsText(blob);
42 } 51 }
43 52
53 function dispatchSocketReceive(receiveInfo) {
54 if (receive_dispatcher[receiveInfo.socketId] !== undefined) {
55 receive_dispatcher[receiveInfo.socketId].onReceive(receiveInfo);
56 } else {
57 console.log("dispatchSocketReceive: No handler for socket " +
58 receiveInfo.socketId);
59 }
60 }
61
62 function dispatchSocketReceiveError(receiveErrorInfo) {
63 if (receive_dispatcher[receiveErrorInfo.socketId] !== undefined) {
64 receive_dispatcher[receiveErrorInfo.socketId].onReceiveError(
65 receiveErrorInfo);
66 } else {
67 console.log("dispatchSocketReceiveError: No handler for socket " +
68 receiveErrorInfo.socketId);
69 }
70 }
71
44 var testSocketCreation = function() { 72 var testSocketCreation = function() {
45 function onCreate(socketInfo) { 73 function onCreate(socketInfo) {
46 function onGetInfo(info) { 74 function onGetInfo(info) {
47 chrome.test.assertFalse(info.connected); 75 chrome.test.assertFalse(info.connected);
48 76
49 if (info.peerAddress || info.peerPort) { 77 if (info.peerAddress || info.peerPort) {
50 chrome.test.fail('Unconnected socket should not have peer'); 78 chrome.test.fail('Unconnected socket should not have peer');
51 } 79 }
52 if (info.localAddress || info.localPort) { 80 if (info.localAddress || info.localPort) {
53 chrome.test.fail('Unconnected socket should not have local binding'); 81 chrome.test.fail('Unconnected socket should not have local binding');
(...skipping 10 matching lines...) Expand all
64 chrome.test.assertTrue(socketInfo.socketId > 0); 92 chrome.test.assertTrue(socketInfo.socketId > 0);
65 93
66 // Obtaining socket information before a connect() call should be safe, but 94 // Obtaining socket information before a connect() call should be safe, but
67 // return empty values. 95 // return empty values.
68 chrome.sockets.tcp.getInfo(socketInfo.socketId, onGetInfo); 96 chrome.sockets.tcp.getInfo(socketInfo.socketId, onGetInfo);
69 } 97 }
70 98
71 chrome.sockets.tcp.create({}, onCreate); 99 chrome.sockets.tcp.create({}, onCreate);
72 }; 100 };
73 101
74
75 var testSending = function() { 102 var testSending = function() {
76 dataRead = ""; 103 dataRead = "";
77 succeeded = false; 104 succeeded = false;
78 echoDataSent = false; 105 echoDataSent = false;
79 waitCount = 0; 106 waitCount = 0;
80 107
81 setTimeout(waitForBlockingOperation, 1000); 108 setTimeout(waitForBlockingOperation, 1000);
82 109
83 createSocket(); 110 createSocket();
84 111
85 function createSocket() { 112 function createSocket() {
86 chrome.sockets.tcp.create({ 113 chrome.sockets.tcp.create({
87 "name": "test", 114 "name": "test",
88 "persistent": true, 115 "persistent": true,
89 "bufferSize": 104 116 "bufferSize": 104
90 }, onCreateComplete); 117 }, onCreateComplete);
91 } 118 }
92 119
93 function onCreateComplete(socketInfo) { 120 function onCreateComplete(socketInfo) {
94 console.log("onCreateComplete"); 121 console.log("onCreateComplete");
95 socketId = socketInfo.socketId; 122 tcp_socketId = socketInfo.socketId;
96 chrome.test.assertTrue(socketId > 0, "failed to create socket"); 123 chrome.test.assertTrue(tcp_socketId > 0, "failed to create socket");
97 124
98 console.log("add event listeners"); 125 console.log("add event listeners");
99 chrome.sockets.tcp.onReceive.addListener(onSocketReceive); 126 receive_dispatcher[tcp_socketId] = {
100 chrome.sockets.tcp.onReceiveError.addListener(onSocketReceiveError); 127 onReceive: onSocketReceive,
128 onReceiveError: onSocketReceiveError
129 };
101 130
102 chrome.sockets.tcp.getInfo(socketId, onGetInfoAfterCreateComplete); 131 chrome.sockets.tcp.getInfo(tcp_socketId, onGetInfoAfterCreateComplete);
103 } 132 }
104 133
105 function onGetInfoAfterCreateComplete(result) { 134 function onGetInfoAfterCreateComplete(result) {
106 console.log("onGetInfoAfterCreateComplete"); 135 console.log("onGetInfoAfterCreateComplete");
107 chrome.test.assertTrue(!result.localAddress, 136 chrome.test.assertTrue(!result.localAddress,
108 "Socket should not have local address"); 137 "Socket should not have local address");
109 chrome.test.assertTrue(!result.localPort, 138 chrome.test.assertTrue(!result.localPort,
110 "Socket should not have local port"); 139 "Socket should not have local port");
111 chrome.test.assertTrue(!result.peerAddress, 140 chrome.test.assertTrue(!result.peerAddress,
112 "Socket should not have peer address"); 141 "Socket should not have peer address");
113 chrome.test.assertTrue(!result.peerPort, 142 chrome.test.assertTrue(!result.peerPort,
114 "Socket should not have peer port"); 143 "Socket should not have peer port");
115 chrome.test.assertFalse(result.connected, "Socket should not be connected"); 144 chrome.test.assertFalse(result.connected, "Socket should not be connected");
116 145
117 chrome.test.assertEq("test", result.name, "Socket name did not persist"); 146 chrome.test.assertEq("test", result.name, "Socket name did not persist");
118 chrome.test.assertTrue(result.persistent, 147 chrome.test.assertTrue(result.persistent,
119 "Socket should be persistent"); 148 "Socket should be persistent");
120 chrome.test.assertEq(104, result.bufferSize, "Buffer size did not persist"); 149 chrome.test.assertEq(104, result.bufferSize, "Buffer size did not persist");
121 chrome.test.assertFalse(result.paused, "Socket should not be paused"); 150 chrome.test.assertFalse(result.paused, "Socket should not be paused");
122 151
123 chrome.sockets.tcp.update(socketId, { 152 chrome.sockets.tcp.update(tcp_socketId, {
124 "name": "test2", 153 "name": "test2",
125 "persistent": false, 154 "persistent": false,
126 bufferSize: 2048 155 bufferSize: 2048
127 }, onUpdateComplete); 156 }, onUpdateComplete);
128 } 157 }
129 158
130 function onUpdateComplete() { 159 function onUpdateComplete() {
131 console.log("onUpdateComplete"); 160 console.log("onUpdateComplete");
132 chrome.sockets.tcp.getInfo(socketId, onGetInfoAfterUpdateComplete); 161 chrome.sockets.tcp.getInfo(tcp_socketId, onGetInfoAfterUpdateComplete);
133 } 162 }
134 163
135 function onGetInfoAfterUpdateComplete(result) { 164 function onGetInfoAfterUpdateComplete(result) {
136 console.log("onGetInfoAfterUpdateComplete"); 165 console.log("onGetInfoAfterUpdateComplete");
137 chrome.test.assertTrue(!result.localAddress, 166 chrome.test.assertTrue(!result.localAddress,
138 "Socket should not have local address"); 167 "Socket should not have local address");
139 chrome.test.assertTrue(!result.localPort, 168 chrome.test.assertTrue(!result.localPort,
140 "Socket should not have local port"); 169 "Socket should not have local port");
141 chrome.test.assertTrue(!result.peerAddress, 170 chrome.test.assertTrue(!result.peerAddress,
142 "Socket should not have peer address"); 171 "Socket should not have peer address");
143 chrome.test.assertTrue(!result.peerPort, 172 chrome.test.assertTrue(!result.peerPort,
144 "Socket should not have peer port"); 173 "Socket should not have peer port");
145 chrome.test.assertFalse(result.connected, "Socket should not be connected"); 174 chrome.test.assertFalse(result.connected, "Socket should not be connected");
146 175
147 chrome.test.assertEq("test2", result.name, "Socket name did not persist"); 176 chrome.test.assertEq("test2", result.name, "Socket name did not persist");
148 chrome.test.assertFalse(result.persistent, 177 chrome.test.assertFalse(result.persistent,
149 "Socket should not be persistent"); 178 "Socket should not be persistent");
150 chrome.test.assertEq(2048, result.bufferSize, 179 chrome.test.assertEq(2048, result.bufferSize,
151 "Buffer size did not persist"); 180 "Buffer size did not persist");
152 chrome.test.assertFalse(result.paused, "Socket should not be paused"); 181 chrome.test.assertFalse(result.paused, "Socket should not be paused");
153 182
154 chrome.sockets.tcp.connect(socketId, address, port, onConnectComplete); 183 chrome.sockets.tcp.connect(tcp_socketId, tcp_address, tcp_port,
184 onConnectComplete);
155 } 185 }
156 186
157 function onConnectComplete(result) { 187 function onConnectComplete(result) {
158 console.log("onConnectComplete"); 188 console.log("onConnectComplete");
159 chrome.test.assertEq(0, result, 189 chrome.test.assertEq(0, result,
160 "Connect failed with error " + result); 190 "Connect failed with error " + result);
161 191
162 chrome.sockets.tcp.getInfo(socketId, onGetInfoAfterConnectComplete); 192 chrome.sockets.tcp.getInfo(tcp_socketId, onGetInfoAfterConnectComplete);
163 } 193 }
164 194
165 function onGetInfoAfterConnectComplete(result) { 195 function onGetInfoAfterConnectComplete(result) {
166 console.log("onGetInfoAfterConnectComplete"); 196 console.log("onGetInfoAfterConnectComplete");
167 chrome.test.assertTrue(!!result.localAddress, 197 chrome.test.assertTrue(!!result.localAddress,
168 "Bound socket should always have local address"); 198 "Bound socket should always have local address");
169 chrome.test.assertTrue(!!result.localPort, 199 chrome.test.assertTrue(!!result.localPort,
170 "Bound socket should always have local port"); 200 "Bound socket should always have local port");
171 201
172 // NOTE: We're always called with 'localhost', but getInfo will only return 202 // NOTE: We're always called with 'localhost', but getInfo will only return
173 // IPs, not names. 203 // IPs, not names.
174 chrome.test.assertEq(result.peerAddress, "127.0.0.1", 204 chrome.test.assertEq(result.peerAddress, "127.0.0.1",
175 "Peer addresss should be the listen server"); 205 "Peer addresss should be the listen server");
176 chrome.test.assertEq(result.peerPort, port, 206 chrome.test.assertEq(result.peerPort, tcp_port,
177 "Peer port should be the listen server"); 207 "Peer port should be the listen server");
178 chrome.test.assertTrue(result.connected, "Socket should be connected"); 208 chrome.test.assertTrue(result.connected, "Socket should be connected");
179 209
180 chrome.sockets.tcp.setPaused(socketId, true, onSetPausedComplete); 210 chrome.sockets.tcp.setPaused(tcp_socketId, true, onSetPausedComplete);
181 } 211 }
182 212
183 function onSetPausedComplete() { 213 function onSetPausedComplete() {
184 console.log("onSetPausedComplete"); 214 console.log("onSetPausedComplete");
185 chrome.sockets.tcp.getInfo(socketId, onGetInfoAfterSetPausedComplete); 215 chrome.sockets.tcp.getInfo(tcp_socketId, onGetInfoAfterSetPausedComplete);
186 } 216 }
187 217
188 function onGetInfoAfterSetPausedComplete(result) { 218 function onGetInfoAfterSetPausedComplete(result) {
189 console.log("onGetInfoAfterSetPausedComplete"); 219 console.log("onGetInfoAfterSetPausedComplete");
190 chrome.test.assertTrue(result.paused, "Socket should be paused"); 220 chrome.test.assertTrue(result.paused, "Socket should be paused");
191 chrome.sockets.tcp.setPaused(socketId, false, onUnpauseComplete); 221 chrome.sockets.tcp.setPaused(tcp_socketId, false, onUnpauseComplete);
192 } 222 }
193 223
194 function onUnpauseComplete() { 224 function onUnpauseComplete() {
195 console.log("onUnpauseComplete"); 225 console.log("onUnpauseComplete");
196 chrome.sockets.tcp.getInfo(socketId, onGetInfoAfterUnpauseComplete); 226 chrome.sockets.tcp.getInfo(tcp_socketId, onGetInfoAfterUnpauseComplete);
197 } 227 }
198 228
199 function onGetInfoAfterUnpauseComplete(result) { 229 function onGetInfoAfterUnpauseComplete(result) {
200 console.log("onGetInfoAfterUnpauseComplete"); 230 console.log("onGetInfoAfterUnpauseComplete");
201 chrome.test.assertFalse(result.paused, "Socket should not be paused"); 231 chrome.test.assertFalse(result.paused, "Socket should not be paused");
202 chrome.sockets.tcp.setNoDelay(socketId, true, onSetNoDelayComplete); 232 chrome.sockets.tcp.setNoDelay(tcp_socketId, true, onSetNoDelayComplete);
203 } 233 }
204 234
205 function onSetNoDelayComplete(result) { 235 function onSetNoDelayComplete(result) {
206 console.log("onSetNoDelayComplete"); 236 console.log("onSetNoDelayComplete");
207 if (result != 0) { 237 if (result != 0) {
208 chrome.test.fail("setNoDelay failed for TCP: " + 238 chrome.test.fail("setNoDelay failed for TCP: " +
209 "result=" + result + ", " + 239 "result=" + result + ", " +
210 "lastError=" + chrome.runtime.lastError.message); 240 "lastError=" + chrome.runtime.lastError.message);
211 } 241 }
212 chrome.sockets.tcp.setKeepAlive( 242 chrome.sockets.tcp.setKeepAlive(
213 socketId, true, 1000, onSetKeepAliveComplete); 243 tcp_socketId, true, 1000, onSetKeepAliveComplete);
214 } 244 }
215 245
216 function onSetKeepAliveComplete(result) { 246 function onSetKeepAliveComplete(result) {
217 console.log("onSetKeepAliveComplete"); 247 console.log("onSetKeepAliveComplete");
218 if (result != 0) { 248 if (result != 0) {
219 chrome.test.fail("setKeepAlive failed for TCP: " + 249 chrome.test.fail("setKeepAlive failed for TCP: " +
220 "result=" + result + ", " + 250 "result=" + result + ", " +
221 "lastError=" + chrome.runtime.lastError.message); 251 "lastError=" + chrome.runtime.lastError.message);
222 } 252 }
223 253
224 string2ArrayBuffer(request, function(arrayBuffer) { 254 string2ArrayBuffer(request, function(arrayBuffer) {
225 echoDataSent = true; 255 echoDataSent = true;
226 chrome.sockets.tcp.send(socketId, arrayBuffer, onSendComplete); 256 chrome.sockets.tcp.send(tcp_socketId, arrayBuffer, onSendComplete);
227 }); 257 });
228 } 258 }
229 259
230 function onSendComplete(sendInfo) { 260 function onSendComplete(sendInfo) {
231 console.log("onSendComplete: " + sendInfo.bytesSent + " bytes."); 261 console.log("onSendComplete: " + sendInfo.bytesSent + " bytes.");
232 chrome.test.assertEq(0, sendInfo.resultCode, "Send failed."); 262 chrome.test.assertEq(0, sendInfo.resultCode, "Send failed.");
233 chrome.test.assertTrue(sendInfo.bytesSent > 0, 263 chrome.test.assertTrue(sendInfo.bytesSent > 0,
234 "Send didn't write bytes."); 264 "Send didn't write bytes.");
235 bytesSent += sendInfo.bytesSent; 265 bytesSent += sendInfo.bytesSent;
236 } 266 }
237 267
238 function onSocketReceive(receiveInfo) { 268 function onSocketReceive(receiveInfo) {
239 console.log("onSocketReceive"); 269 console.log("onSocketReceive");
240 chrome.test.assertEq(socketId, receiveInfo.socketId); 270 chrome.test.assertEq(tcp_socketId, receiveInfo.socketId);
241 arrayBuffer2String(receiveInfo.data, function(s) { 271 arrayBuffer2String(receiveInfo.data, function(s) {
242 dataAsString = s; // save this for error reporting 272 dataAsString = s; // save this for error reporting
243 var match = !!s.match(expectedResponsePattern); 273 var match = !!s.match(expectedResponsePattern);
244 chrome.test.assertTrue(match, "Received data does not match."); 274 chrome.test.assertTrue(match, "Received data does not match.");
245 console.log("echo data received, closing socket"); 275 console.log("echo data received, closing socket");
246 chrome.sockets.tcp.close(socketId, onCloseComplete); 276 chrome.sockets.tcp.close(tcp_socketId, onCloseComplete);
247 }); 277 });
248 } 278 }
249 279
250 function onSocketReceiveError(receiveErrorInfo) { 280 function onSocketReceiveError(receiveErrorInfo) {
251 // Note: Once we have sent the "echo" message, the echo server sends back 281 // Note: Once we have sent the "echo" message, the echo server sends back
252 // the "echo" response and closes the connection right away. This means 282 // the "echo" response and closes the connection right away. This means
253 // we get a "connection closed" error very quickly after sending our 283 // we get a "connection closed" error very quickly after sending our
254 // message. This is why we ignore errors from that point on. 284 // message. This is why we ignore errors from that point on.
255 if (echoDataSent) 285 if (echoDataSent)
256 return; 286 return;
257 287
258 console.log("onSocketReceiveError"); 288 console.log("onSocketReceiveError");
259 chrome.test.fail("Receive error on socket " + receiveErrorInfo.socketId + 289 chrome.test.fail("Receive error on socket " + receiveErrorInfo.socketId +
260 ": result code=" + receiveErrorInfo.resultCode); 290 ": result code=" + receiveErrorInfo.resultCode);
261 } 291 }
262 292
263 function onCloseComplete() { 293 function onCloseComplete() {
264 console.log("onCloseComplete"); 294 console.log("onCloseComplete");
265 succeeded = true; 295 succeeded = true;
266 chrome.test.succeed(); 296 chrome.test.succeed();
267 } 297 }
268 298
269 }; // testSending() 299 }; // testSending()
270 300
301 var testSecure = function () {
302 var request_sent = false;
303 succeeded = false;
304 dataAsString = "";
305 setTimeout(waitForBlockingOperation, 1000);
306
307 // Run the test a few times. First with misuse_testing=MISUSE_NONE,
308 // to test that the API works correctly when used properly. Then
309 // with different values of misuse_mode, test that the API does
310 // not malfunction when used improperly. Upon success, each misuse
311 // must close the socket and call onCloseComplete().
312 var MISUSE_NONE = 0;
313 var MISUSE_SECURE_PENDING_READ = 1;
314 var MISUSE_LAST = MISUSE_SECURE_PENDING_READ;
315 var misuse_mode = MISUSE_NONE;
316
317 chrome.sockets.tcp.create({}, onCreateComplete);
318
319 function onCreateComplete(socketInfo) {
320 https_socketId = socketInfo.socketId;
321 receive_dispatcher[https_socketId] = {
322 onReceive: onSocketReceive,
323 onReceiveError: onSocketReceiveError
324 };
325
326 chrome.test.assertTrue(https_socketId > 0, "failed to create socket");
327 if (misuse_mode == MISUSE_SECURE_PENDING_READ) {
328 // Don't pause the socket. This will let the sockets runtime
329 // keep a pending read on it.
330 console.log("HTTPS onCreateComplete: in MISUSE_SECURE_PENDING_READ " +
331 "mode, skipping setPaused(false).");
332 onPausedComplete();
333 } else {
334 chrome.sockets.tcp.setPaused(https_socketId, true, onPausedComplete);
335 }
336 }
337
338 function onPausedComplete() {
339 console.log("HTTPS onPausedComplete. Connecting to " +https_address + ":" +
340 https_port);
341 chrome.sockets.tcp.connect(https_socketId, https_address, https_port,
342 onConnectComplete);
343 }
344
345 function onConnectComplete(result) {
346 console.log("HTTPS onConnectComplete");
347 chrome.test.assertEq(0, result,
348 "Connect failed with error " + result);
349 chrome.sockets.tcp.secure(https_socketId, null, onSecureComplete);
350 }
351
352 function onSecureComplete(result) {
353 console.log("HTTPS onSecureComplete(" + result + ")");
354 if (misuse_mode == MISUSE_SECURE_PENDING_READ) {
355 // net::ERR_INVALID_ARGUMENT is -4.
Ryan Sleevi 2014/03/26 19:57:40 Wait, are we surfing the net:: errors as part of t
lally 2014/03/28 16:22:51 Ah, I didn't think that this was a declaration of
356 chrome.test.assertEq(-4, result,
357 "Secure should have failed when a read " +
358 "was pending (" + result + ")");
359 chrome.sockets.tcp.close(https_socketId, onCloseComplete);
360 } else {
361 chrome.test.assertEq(0, result,
362 "Secure failed with error " + result);
363 chrome.sockets.tcp.setPaused(https_socketId, false, onUnpauseComplete);
364 }
365 }
366
367 function onUnpauseComplete() {
368 console.log("HTTPS onUnpauseComplete");
369 string2ArrayBuffer(http_get, function(arrayBuffer) {
370 request_sent = true;
371 chrome.sockets.tcp.send(https_socketId, arrayBuffer, onSendComplete);
372 });
373 }
374
375 function onSendComplete(sendInfo) {
376 console.log("HTTPS onSendComplete: " + sendInfo.bytesSent + " bytes.");
377 chrome.test.assertEq(0, sendInfo.resultCode, "Send failed.");
378 chrome.test.assertTrue(sendInfo.bytesSent > 0,
379 "Send didn't write bytes.");
380 bytesSent += sendInfo.bytesSent;
381 }
382
383 function onSocketReceive(receiveInfo) {
384 console.log("HTTPS onSocketReceive");
385 chrome.test.assertEq(https_socketId, receiveInfo.socketId);
386 arrayBuffer2String(receiveInfo.data, function(s) {
387 // we will get more data than we care about. We only care about the
388 // first segment of data (the HTTP 200 code). Ignore the rest, which
389 // won't match the pattern.
390 if (succeeded == false) {
391 dataAsString = s; // for waitForBlockingOperation().
392 console.log("HTTPS receive: got " + s);
393 var match = !!s.match(expectedHTTPPattern);
394 chrome.test.assertTrue(match, "Received data does not match.");
395 console.log("HTTPS response received, closing socket.");
396 chrome.sockets.tcp.close(https_socketId, onCloseComplete);
397 }
398 succeeded = true;
399 });
400 }
401
402 function onSocketReceiveError(receiveErrorInfo) {
403 console.log("HTTPS onSocketReceiveError");
404 if (request_sent) {
405 return;
406 }
407 chrome.test.fail("Receive error on socket " + receiveErrorInfo.socketId +
408 ": result code=" + receiveErrorInfo.resultCode);
409 }
410
411 function onCloseComplete() {
412 console.log("HTTPS Test Succeeded");
413 if (misuse_mode == MISUSE_LAST) {
414 // The test has run in all misuse modes.
415 chrome.test.succeed();
416 } else {
417 // Run the test again in the next misuse mode.
418 misuse_mode += 1;
419 chrome.sockets.tcp.create({}, onCreateComplete);
420 }
421 }
422 }; // testSecure()
423
271 function waitForBlockingOperation() { 424 function waitForBlockingOperation() {
272 if (++waitCount < 10) { 425 if (++waitCount < 10) {
273 setTimeout(waitForBlockingOperation, 1000); 426 setTimeout(waitForBlockingOperation, 1000);
274 } else { 427 } else {
275 // We weren't able to succeed in the given time. 428 // We weren't able to succeed in the given time.
276 chrome.test.fail("Operations didn't complete after " + waitCount + " " + 429 chrome.test.fail("Operations didn't complete after " + waitCount + " " +
277 "seconds. Response so far was <" + dataAsString + ">."); 430 "seconds. Response so far was <" + dataAsString + ">.");
278 } 431 }
279 } 432 }
280 433
281 var onMessageReply = function(message) { 434 var onMessageReply = function(message) {
282 var parts = message.split(":"); 435 var components = message.split(',');
283 var test_type = parts[0]; 436 var tests = [];
284 address = parts[1]; 437 for (var i = 0; i < components.length; ++i) {
285 port = parseInt(parts[2]); 438 var parts = components[i].split(":");
286 console.log("Running tests, protocol " + test_type + ", echo server " + 439 var test_type = parts[0];
287 address + ":" + port); 440 if (test_type == 'tcp') {
288 if (test_type == 'tcp') { 441 tcp_address = parts[1];
289 protocol = test_type; 442 tcp_port = parseInt(parts[2]);
290 chrome.test.runTests([testSocketCreation, testSending]); 443 console.log("Running tests for TCP, echo server " +
291 } else { 444 tcp_address + ":" + tcp_port);
292 chrome.test.fail("Invalid test type: " + test_type); 445 tests = tests.concat([testSocketCreation, testSending]);
446 } else if (test_type == 'https') {
447 https_address = parts[1];
448 https_port = parseInt(parts[2]);
449 console.log("Running tests for HTTPS, server " +
450 https_address + ":" + https_port);
451 tests = tests.concat([testSecure]);
452 } else {
453 chrome.test.fail("Invalid test type: " + test_type);
454 }
293 } 455 }
456 // Setup the suite-wide event listeners.
457 chrome.sockets.tcp.onReceive.addListener(dispatchSocketReceive);
458 chrome.sockets.tcp.onReceiveError.addListener(dispatchSocketReceiveError);
459
460 chrome.test.runTests(tests);
294 }; 461 };
295 462
296 // Find out which protocol we're supposed to test, and which echo server we 463 // Find out which protocol we're supposed to test, and which echo server we
297 // should be using, then kick off the tests. 464 // should be using, then kick off the tests.
298 chrome.test.sendMessage("info_please", onMessageReply); 465 chrome.test.sendMessage("info_please", onMessageReply);
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698