| OLD | NEW |
| 1 // extension_apitest.js | 1 // extension_apitest.js |
| 2 // mini-framework for ExtensionApiTest browser tests | 2 // mini-framework for ExtensionApiTest browser tests |
| 3 | 3 |
| 4 var chrome = chrome || {}; | 4 var chrome = chrome || {}; |
| 5 (function() { | 5 (function() { |
| 6 chrome.test = chrome.test || {}; | 6 chrome.test = chrome.test || {}; |
| 7 | 7 |
| 8 chrome.test.tests = chrome.test.tests || []; | 8 chrome.test.tests = chrome.test.tests || []; |
| 9 | 9 |
| 10 var completed = false; | 10 var completed = false; |
| (...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 43 | 43 |
| 44 function allTestsSucceeded() { | 44 function allTestsSucceeded() { |
| 45 console.log("All tests succeeded"); | 45 console.log("All tests succeeded"); |
| 46 if (completed) throw "completed"; | 46 if (completed) throw "completed"; |
| 47 | 47 |
| 48 chrome.test.notifyPass(); | 48 chrome.test.notifyPass(); |
| 49 complete(); | 49 complete(); |
| 50 } | 50 } |
| 51 | 51 |
| 52 var pendingCallbacks = 0; | 52 var pendingCallbacks = 0; |
| 53 var totalCallbacks = 0; | 53 |
| 54 | |
| 55 function callbackAdded() { | 54 function callbackAdded() { |
| 56 pendingCallbacks++; | 55 pendingCallbacks++; |
| 57 chrome.test.assertEq(totalCallbacks, 0); | |
| 58 }; | 56 }; |
| 59 | 57 |
| 60 function callbackCompleted() { | 58 function callbackCompleted() { |
| 61 if (!totalCallbacks) | |
| 62 totalCallbacks = pendingCallbacks; | |
| 63 pendingCallbacks--; | 59 pendingCallbacks--; |
| 64 if (pendingCallbacks == 0) { | 60 if (pendingCallbacks == 0) { |
| 65 //chrome.test.log(" " + totalCallbacks + " callbacks ran"); | |
| 66 totalCallbacks = 0; | |
| 67 chrome.test.succeed(); | 61 chrome.test.succeed(); |
| 68 } | 62 } |
| 69 }; | 63 }; |
| 70 | 64 |
| 71 chrome.test.runNextTest = function() { | 65 chrome.test.runNextTest = function() { |
| 72 chrome.test.assertEq(pendingCallbacks, 0); | 66 chrome.test.assertEq(pendingCallbacks, 0); |
| 73 lastTest = currentTest; | 67 lastTest = currentTest; |
| 74 currentTest = chrome.test.tests.shift(); | 68 currentTest = chrome.test.tests.shift(); |
| 75 if (!currentTest) { | 69 if (!currentTest) { |
| 76 allTestsSucceeded(); | 70 allTestsSucceeded(); |
| (...skipping 42 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 119 "\nExpected Type:" + typeof(expected)); | 113 "\nExpected Type:" + typeof(expected)); |
| 120 } | 114 } |
| 121 }; | 115 }; |
| 122 | 116 |
| 123 chrome.test.assertNoLastError = function() { | 117 chrome.test.assertNoLastError = function() { |
| 124 if (chrome.extension.lastError != undefined) { | 118 if (chrome.extension.lastError != undefined) { |
| 125 chrome.test.fail("lastError.message == " + | 119 chrome.test.fail("lastError.message == " + |
| 126 chrome.extension.lastError.message); | 120 chrome.extension.lastError.message); |
| 127 } | 121 } |
| 128 }; | 122 }; |
| 129 | 123 |
| 130 function safeFunctionApply(func, arguments) { | 124 function safeFunctionApply(func, arguments) { |
| 131 try { | 125 try { |
| 132 if (func) { | 126 if (func) { |
| 133 func.apply(null, arguments); | 127 func.apply(null, arguments); |
| 134 } | 128 } |
| 135 } catch (e) { | 129 } catch (e) { |
| 136 var stack = null; | 130 var stack = null; |
| 137 if (typeof(e.stack) != "undefined") { | 131 if (typeof(e.stack) != "undefined") { |
| 138 stack = e.stack.toString(); | 132 stack = e.stack.toString(); |
| 139 } | 133 } |
| 140 var msg = "Exception during execution of callback in " + | 134 var msg = "Exception during execution of callback in " + |
| 141 currentTest.name; | 135 currentTest.name; |
| 142 if (stack) { | 136 if (stack) { |
| 143 msg += "\n" + stack; | 137 msg += "\n" + stack; |
| 144 } else { | 138 } else { |
| 145 msg += "\n(no stack available)"; | 139 msg += "\n(no stack available)"; |
| 146 } | 140 } |
| 147 chrome.test.fail(msg); | 141 chrome.test.fail(msg); |
| 148 } | 142 } |
| 149 }; | 143 }; |
| 150 | 144 |
| 151 // Wrapper for generating test functions, that takes care of calling | 145 // Wrapper for generating test functions, that takes care of calling |
| 152 // assertNoLastError() and (optionally) succeed() for you. | 146 // assertNoLastError() and (optionally) succeed() for you. |
| 153 chrome.test.callback = function(func, expectedError) { | 147 chrome.test.callback = function(func, expectedError) { |
| 154 if (func) { | 148 if (func) { |
| 155 chrome.test.assertEq(typeof(func), 'function'); | 149 chrome.test.assertEq(typeof(func), 'function'); |
| 156 } | 150 } |
| 157 | |
| 158 callbackAdded(); | 151 callbackAdded(); |
| 159 | 152 |
| 160 return function() { | 153 return function() { |
| 161 if (expectedError == null) { | 154 if (expectedError == null) { |
| 162 chrome.test.assertNoLastError(); | 155 chrome.test.assertNoLastError(); |
| 163 } else { | 156 } else { |
| 164 chrome.test.assertEq(typeof(expectedError), 'string'); | 157 chrome.test.assertEq(typeof(expectedError), 'string'); |
| 165 chrome.test.assertEq(expectedError, chrome.extension.lastError.message); | 158 chrome.test.assertEq(expectedError, chrome.extension.lastError.message); |
| 166 } | 159 } |
| 167 | 160 |
| 168 if (func) { | 161 if (func) { |
| 169 safeFunctionApply(func, arguments); | 162 safeFunctionApply(func, arguments); |
| 170 } | 163 } |
| 171 | 164 |
| 172 callbackCompleted(); | 165 callbackCompleted(); |
| 173 }; | 166 }; |
| 174 }; | 167 }; |
| 175 | 168 |
| 176 chrome.test.listenOnce = function(event, func) { | 169 chrome.test.listenOnce = function(event, func) { |
| 177 callbackAdded(); | 170 callbackAdded(); |
| 178 var listener = function() { | 171 var listener = function() { |
| 179 event.removeListener(listener); | 172 event.removeListener(listener); |
| 180 safeFunctionApply(func, arguments); | 173 safeFunctionApply(func, arguments); |
| 181 callbackCompleted(); | 174 callbackCompleted(); |
| 182 }; | 175 }; |
| 183 event.addListener(listener); | 176 event.addListener(listener); |
| 184 }; | 177 }; |
| 185 | 178 |
| 179 chrome.test.listenForever = function(event, func) { |
| 180 callbackAdded(); |
| 181 |
| 182 var listener = function() { |
| 183 safeFunctionApply(func, arguments); |
| 184 }; |
| 185 |
| 186 var done = {}; |
| 187 done.doneListening = function() { |
| 188 event.removeListener(listener); |
| 189 callbackCompleted(); |
| 190 }; |
| 191 |
| 192 event.addListener(listener); |
| 193 return done; |
| 194 }; |
| 195 |
| 186 chrome.test.callbackPass = function(func) { | 196 chrome.test.callbackPass = function(func) { |
| 187 return chrome.test.callback(func); | 197 return chrome.test.callback(func); |
| 188 }; | 198 }; |
| 189 | 199 |
| 190 chrome.test.callbackFail = function(expectedError) { | 200 chrome.test.callbackFail = function(expectedError) { |
| 191 return chrome.test.callback(null, expectedError); | 201 return chrome.test.callback(null, expectedError); |
| 192 }; | 202 }; |
| 193 | 203 |
| 194 // TODO(erikkay) This is deprecated and should be removed. | |
| 195 chrome.test.testCallback = function(succeedWhenDone, func) { | |
| 196 return chrome.test.callback(func); | |
| 197 }; | |
| 198 | |
| 199 chrome.test.runTests = function(tests) { | 204 chrome.test.runTests = function(tests) { |
| 200 chrome.test.tests = tests; | 205 chrome.test.tests = tests; |
| 201 chrome.test.runNextTest(); | 206 chrome.test.runNextTest(); |
| 202 }; | 207 }; |
| 203 | |
| 204 })(); | 208 })(); |
| OLD | NEW |