diff options
Diffstat (limited to 'toolkit/components/asyncshutdown/tests/xpcshell/test_AsyncShutdown_leave_uncaught.js')
-rw-r--r-- | toolkit/components/asyncshutdown/tests/xpcshell/test_AsyncShutdown_leave_uncaught.js | 96 |
1 files changed, 96 insertions, 0 deletions
diff --git a/toolkit/components/asyncshutdown/tests/xpcshell/test_AsyncShutdown_leave_uncaught.js b/toolkit/components/asyncshutdown/tests/xpcshell/test_AsyncShutdown_leave_uncaught.js new file mode 100644 index 000000000..33da1f53f --- /dev/null +++ b/toolkit/components/asyncshutdown/tests/xpcshell/test_AsyncShutdown_leave_uncaught.js @@ -0,0 +1,96 @@ +/* Any copyright is dedicated to the Public Domain. + * http://creativecommons.org/publicdomain/zero/1.0/ */ +"use strict"; + +// +// This file contains tests that need to leave uncaught asynchronous +// errors. If your test catches all its asynchronous errors, please +// put it in another file. +// + +Promise.Debugging.clearUncaughtErrorObservers(); + +function run_test() { + run_next_test(); +} + +add_task(function* test_phase_simple_async() { + do_print("Testing various combinations of a phase with a single condition"); + for (let kind of ["phase", "barrier", "xpcom-barrier", "xpcom-barrier-unwrapped"]) { + for (let arg of [undefined, null, "foo", 100, new Error("BOOM")]) { + for (let resolution of [arg, Promise.reject(arg)]) { + for (let success of [false, true]) { + for (let state of [[null], + [], + [() => "some state"], + [function() { + throw new Error("State BOOM"); }], + [function() { + return { + toJSON: function() { + throw new Error("State.toJSON BOOM"); + } + }; + }]]) { + // Asynchronous phase + do_print("Asynchronous test with " + arg + ", " + resolution + ", " + kind); + let lock = makeLock(kind); + let outParam = { isFinished: false }; + lock.addBlocker( + "Async test", + function() { + if (success) { + return longRunningAsyncTask(resolution, outParam); + } + throw resolution; + }, + ...state + ); + do_check_false(outParam.isFinished); + yield lock.wait(); + do_check_eq(outParam.isFinished, success); + } + } + + // Synchronous phase - just test that we don't throw/freeze + do_print("Synchronous test with " + arg + ", " + resolution + ", " + kind); + let lock = makeLock(kind); + lock.addBlocker( + "Sync test", + resolution + ); + yield lock.wait(); + } + } + } +}); + +add_task(function* test_phase_many() { + do_print("Testing various combinations of a phase with many conditions"); + for (let kind of ["phase", "barrier", "xpcom-barrier", "xpcom-barrier-unwrapped"]) { + let lock = makeLock(kind); + let outParams = []; + for (let arg of [undefined, null, "foo", 100, new Error("BOOM")]) { + for (let resolve of [true, false]) { + do_print("Testing with " + kind + ", " + arg + ", " + resolve); + let resolution = resolve ? arg : Promise.reject(arg); + let outParam = { isFinished: false }; + lock.addBlocker( + "Test " + Math.random(), + () => longRunningAsyncTask(resolution, outParam) + ); + } + } + do_check_true(outParams.every((x) => !x.isFinished)); + yield lock.wait(); + do_check_true(outParams.every((x) => x.isFinished)); + } +}); + + + + +add_task(function*() { + Services.prefs.clearUserPref("toolkit.asyncshutdown.testing"); +}); + |