Chromium Code Reviews| OLD | NEW |
|---|---|
| 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 Loading... | |
| 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); |
| OLD | NEW |