Index: chrome/renderer/resources/extension_apitest.js |
diff --git a/chrome/renderer/resources/extension_apitest.js b/chrome/renderer/resources/extension_apitest.js |
index 13150fbb4bfda9a0edd508305017a0fff52da6e9..1b195be7c7dd989a4284d3d99071603922434e8c 100644 |
--- a/chrome/renderer/resources/extension_apitest.js |
+++ b/chrome/renderer/resources/extension_apitest.js |
@@ -8,7 +8,8 @@ var chrome = chrome || {}; |
chrome.test.tests = chrome.test.tests || []; |
var completed = false; |
- var currentTest; |
+ var currentTest = null; |
+ var lastTest = null; |
function complete() { |
completed = true; |
@@ -48,7 +49,28 @@ var chrome = chrome || {}; |
complete(); |
} |
+ var pendingCallbacks = 0; |
+ var totalCallbacks = 0; |
+ |
+ function callbackAdded() { |
+ pendingCallbacks++; |
+ chrome.test.assertEq(totalCallbacks, 0); |
+ }; |
+ |
+ function callbackCompleted() { |
+ if (!totalCallbacks) |
+ totalCallbacks = pendingCallbacks; |
+ pendingCallbacks--; |
+ if (pendingCallbacks == 0) { |
+ chrome.test.log(" " + totalCallbacks + " callbacks ran"); |
+ totalCallbacks = 0; |
+ chrome.test.succeed(); |
+ } |
+ }; |
+ |
chrome.test.runNextTest = function() { |
+ chrome.test.assertEq(pendingCallbacks, 0); |
+ lastTest = currentTest; |
currentTest = chrome.test.tests.shift(); |
if (!currentTest) { |
allTestsSucceeded(); |
@@ -104,36 +126,68 @@ var chrome = chrome || {}; |
chrome.extension.lastError.message); |
} |
}; |
+ |
+ function safeFunctionApply(func, arguments) { |
+ try { |
+ if (func) { |
+ func.apply(null, arguments); |
+ } |
+ } catch (e) { |
+ var stack = null; |
+ if (typeof(e.stack) != "undefined") { |
+ stack = e.stack.toString(); |
+ } |
+ var msg = "Exception during execution of callback in " + |
+ currentTest.name; |
+ if (stack) { |
+ msg += "\n" + stack; |
+ } else { |
+ msg += "\n(no stack available)"; |
+ } |
+ chrome.test.fail(msg); |
+ } |
+ }; |
// Wrapper for generating test functions, that takes care of calling |
// assertNoLastError() and (optionally) succeed() for you. |
- chrome.test.testCallback = function(succeedWhenDone, func) { |
+ chrome.test.callback = function(func, expectedError) { |
+ chrome.test.assertEq(typeof(func), 'function'); |
+ callbackAdded(); |
return function() { |
- chrome.test.assertNoLastError(); |
- try { |
- if (func) { |
- func.apply(null, arguments); |
- } |
- } catch (e) { |
- var stack = null; |
- if (typeof(e.stack) != "undefined") { |
- stack = e.stack.toString(); |
- } |
- var msg = "Exception during execution of testCallback in " + |
- currentTest.name; |
- if (stack) { |
- msg += "\n" + stack; |
- } else { |
- msg += "\n(no stack available)"; |
- } |
- chrome.test.fail(msg); |
- } |
- if (succeedWhenDone) { |
- chrome.test.succeed(); |
+ if (expectedError == null) { |
+ chrome.test.assertNoLastError(); |
+ } else { |
+ chrome.test.assertEq(typeof(expectedError), 'string'); |
+ chrome.test.assertEq(expectedError, chrome.extension.lastError.message); |
} |
+ safeFunctionApply(func, arguments); |
+ callbackCompleted(); |
+ }; |
+ }; |
+ |
+ chrome.test.listenOnce = function(event, func) { |
+ callbackAdded(); |
+ var listener = function() { |
+ event.removeListener(listener); |
+ safeFunctionApply(func, arguments); |
+ callbackCompleted(); |
}; |
+ event.addListener(listener); |
+ }; |
+ |
+ chrome.test.callbackPass = function(func) { |
+ return chrome.test.callback(func); |
+ }; |
+ |
+ chrome.test.callbackFail = function(func, expectedError) { |
+ return chrome.test.callback(func, expectedError); |
}; |
+ // TODO(erikkay) This is deprecated and should be removed. |
+ chrome.test.testCallback = function(succeedWhenDone, func) { |
+ return chrome.test.callback(func); |
+ }; |
+ |
chrome.test.runTests = function(tests) { |
chrome.test.tests = tests; |
chrome.test.runNextTest(); |