| OLD | NEW |
| 1 function postResult(result, actual, expected) | 1 importScripts("/js-test-resources/js-test.js", "../../resources/close-common.js"
, "../../resources/mac-dropped-wakeup-workaround.js"); |
| 2 { | |
| 3 var message = result ? "PASS" : "FAIL"; | |
| 4 message += ": worker: " + actual + " is "; | |
| 5 if (!result) | |
| 6 message += "not "; | |
| 7 message += expected; | |
| 8 postMessage(message); | |
| 9 } | |
| 10 | 2 |
| 11 function testPassed(message) | 3 testClose(); |
| 12 { | |
| 13 postMessage("PASS: " + message); | |
| 14 } | |
| 15 | |
| 16 function testFailed(message) | |
| 17 { | |
| 18 postMessage("FAIL: " + message); | |
| 19 } | |
| 20 | |
| 21 function debug(message) | |
| 22 { | |
| 23 postMessage(message); | |
| 24 } | |
| 25 | |
| 26 function shouldBe(actual, expected) | |
| 27 { | |
| 28 var _result = eval(actual + " == " + expected); | |
| 29 postResult(_result, actual, expected); | |
| 30 } | |
| 31 | |
| 32 function shouldBeTrue(actual) | |
| 33 { | |
| 34 shouldBe(actual, "true"); | |
| 35 } | |
| 36 | |
| 37 function shouldBeFalse(actual) | |
| 38 { | |
| 39 shouldBe(actual, "false"); | |
| 40 } | |
| 41 | |
| 42 var exceptionName; | |
| 43 var exceptionProto; | |
| 44 var closeEvent; | |
| 45 var code; | |
| 46 var reason; | |
| 47 var result; | |
| 48 var invalidAccessErr = "InvalidAccessError"; | |
| 49 var syntaxErr = "SyntaxError"; | |
| 50 var normalClosure = 1000; | |
| 51 var abnormalClosure = 1006; | |
| 52 var url = "ws://127.0.0.1:8880/close"; | |
| 53 var ws; | |
| 54 var testId; | |
| 55 | |
| 56 var codeTestCodes = [ | |
| 57 999, 1001, 2999, 5000, 65536 + 1000, 0x100000000 + 1000, 2999.9, NaN, "0", "
100", 1/0, -1/0, 0/0, | |
| 58 1000.0 | |
| 59 ]; | |
| 60 | |
| 61 var reasonTestReasons = [ | |
| 62 "123456789012345678901234567890123456789012345678901234567890123456789012345
6789012345678901234567890123456789012345678901234", // 124 Byte | |
| 63 "123456789012345678901234567890123456789012345678901234567890123456789012345
67890123456789012345678901234567890123456789012\u00a9", // length is 123, but 12
4 Byte in UTF-8 | |
| 64 "123456789012345678901234567890123456789012345678901234567890123456789012345
678901234567890123456789012345678901234567890123", // 123 Byte | |
| 65 ]; | |
| 66 | |
| 67 var reasonTestResults = [ | |
| 68 false, | |
| 69 false, | |
| 70 true, | |
| 71 ]; | |
| 72 | |
| 73 function handleOpen() | |
| 74 { | |
| 75 testFailed("handleOpen() was called."); | |
| 76 }; | |
| 77 | |
| 78 function handleError() | |
| 79 { | |
| 80 testFailed("handleError() was called."); | |
| 81 }; | |
| 82 | |
| 83 function handleClose() | |
| 84 { | |
| 85 testFailed("handleClose() was called."); | |
| 86 }; | |
| 87 | |
| 88 function handleMessage() | |
| 89 { | |
| 90 testFailed("handleMessage() was called."); | |
| 91 }; | |
| 92 | |
| 93 function setDefaultHandlers(ws) | |
| 94 { | |
| 95 ws.onopen = handleOpen; | |
| 96 ws.onerror = handleError; | |
| 97 ws.onclose = handleClose; | |
| 98 ws.onmessage = handleMessage; | |
| 99 } | |
| 100 | |
| 101 function runCodeTest() | |
| 102 { | |
| 103 ws = new WebSocket(url); | |
| 104 setDefaultHandlers(ws); | |
| 105 for (var id = 0; id < codeTestCodes.length; id++) { | |
| 106 if (codeTestCodes[id] != normalClosure) { | |
| 107 debug("Invalid code test: " + id); | |
| 108 ws.onclose = handleClose; | |
| 109 } else { | |
| 110 ws.onclose = function (e) | |
| 111 { | |
| 112 debug("runCodeTest: onclose()."); | |
| 113 closeEvent = e; | |
| 114 shouldBe("closeEvent.code", "abnormalClosure"); | |
| 115 if (closeEvent.code == abnormalClosure) | |
| 116 runInvalidStringTest(); | |
| 117 }; | |
| 118 ws.onerror = function () | |
| 119 { | |
| 120 testPassed("onerror() was called."); | |
| 121 }; | |
| 122 } | |
| 123 try { | |
| 124 ws.close(codeTestCodes[id]); | |
| 125 } catch (e) { | |
| 126 debug("Code " + codeTestCodes[id] + " must cause " + invalidAccessEr
r + '.'); | |
| 127 exceptionName = e.name; | |
| 128 exceptionProto = Object.getPrototypeOf(e); | |
| 129 shouldBe("exceptionName", "invalidAccessErr"); | |
| 130 } | |
| 131 } | |
| 132 } | |
| 133 | |
| 134 function runInvalidStringTest() | |
| 135 { | |
| 136 // FIXME: unpaired surrogates throw SyntaxError | |
| 137 debug("Skip invalid string test."); | |
| 138 runReasonTest(); | |
| 139 } | |
| 140 | |
| 141 function runReasonTest() | |
| 142 { | |
| 143 ws = new WebSocket(url); | |
| 144 setDefaultHandlers(ws); | |
| 145 for (var id = 0; id < reasonTestReasons.length; id++) { | |
| 146 debug("Reason test: " + id); | |
| 147 if (!reasonTestResults[id]) { | |
| 148 debug(" with invalid reason: " + reasonTestReasons[id]); | |
| 149 ws.onclose = handleClose; | |
| 150 } else { | |
| 151 ws.onclose = function (e) | |
| 152 { | |
| 153 debug("runReasonTest: onclose()."); | |
| 154 closeEvent = e; | |
| 155 shouldBe("closeEvent.code", "abnormalClosure"); | |
| 156 if (closeEvent.code == abnormalClosure) | |
| 157 runCodeAndReasonTest(); | |
| 158 }; | |
| 159 ws.onerror = function () | |
| 160 { | |
| 161 testPassed("onerror() was called."); | |
| 162 }; | |
| 163 } | |
| 164 try { | |
| 165 ws.close(normalClosure, reasonTestReasons[id]); | |
| 166 } catch (e) { | |
| 167 debug("Reason " + reasonTestReasons[id] + " must cause " + syntaxErr
+ '.'); | |
| 168 result = reasonTestResults[id]; | |
| 169 exceptionName = e.name; | |
| 170 exceptionProto = Object.getPrototypeOf(e); | |
| 171 shouldBeFalse("result"); | |
| 172 shouldBe("exceptionName", "syntaxErr"); | |
| 173 } | |
| 174 } | |
| 175 } | |
| 176 | |
| 177 function runCodeAndReasonTest() | |
| 178 { | |
| 179 var codes = [ | |
| 180 1000, | |
| 181 3000, | |
| 182 4000, | |
| 183 4999 | |
| 184 ]; | |
| 185 var reasons = [ | |
| 186 "OK, Bye!", | |
| 187 "3000", | |
| 188 "code is 4000", | |
| 189 "\u00a9 Google" | |
| 190 ]; | |
| 191 (function test (id) { | |
| 192 debug("Code and reason test: " + id); | |
| 193 ws = new WebSocket(url); | |
| 194 setDefaultHandlers(ws); | |
| 195 ws.onopen = function () | |
| 196 { | |
| 197 ws.close(codes[id], reasons[id]); | |
| 198 }; | |
| 199 ws.onclose = function (e) | |
| 200 { | |
| 201 closeEvent = e; | |
| 202 code = codes[id]; | |
| 203 reason = reasons[id]; | |
| 204 debug("Code and reason must be"); | |
| 205 debug(" code : " + code); | |
| 206 debug(" reason: " + reason); | |
| 207 shouldBeTrue("closeEvent.wasClean"); | |
| 208 shouldBe("closeEvent.code", "code"); | |
| 209 shouldBe("closeEvent.reason", "reason"); | |
| 210 if (++id != codes.length) | |
| 211 test(id); | |
| 212 else | |
| 213 postMessage("DONE"); | |
| 214 }; | |
| 215 })(0); | |
| 216 } | |
| 217 | |
| 218 runCodeTest(); | |
| OLD | NEW |