summaryrefslogtreecommitdiffstats
path: root/browser/components/urlbar/tests/unit/test_UrlbarUtils_skippableTimer.js
diff options
context:
space:
mode:
Diffstat (limited to 'browser/components/urlbar/tests/unit/test_UrlbarUtils_skippableTimer.js')
-rw-r--r--browser/components/urlbar/tests/unit/test_UrlbarUtils_skippableTimer.js89
1 files changed, 89 insertions, 0 deletions
diff --git a/browser/components/urlbar/tests/unit/test_UrlbarUtils_skippableTimer.js b/browser/components/urlbar/tests/unit/test_UrlbarUtils_skippableTimer.js
new file mode 100644
index 0000000000..7400d507af
--- /dev/null
+++ b/browser/components/urlbar/tests/unit/test_UrlbarUtils_skippableTimer.js
@@ -0,0 +1,89 @@
+/* Any copyright is dedicated to the Public Domain.
+ http://creativecommons.org/publicdomain/zero/1.0/ */
+
+/**
+ * Tests UrlbarUtils.SkippableTimer
+ */
+
+"use strict";
+
+let { SkippableTimer } = ChromeUtils.importESModule(
+ "resource:///modules/UrlbarUtils.sys.mjs"
+);
+const { setTimeout } = ChromeUtils.importESModule(
+ "resource://gre/modules/Timer.sys.mjs"
+);
+
+add_task(async function test_basic() {
+ let invoked = 0;
+ let deferred = Promise.withResolvers();
+ let timer = new SkippableTimer({
+ name: "test 1",
+ callback: () => {
+ invoked++;
+ deferred.resolve();
+ },
+ time: 50,
+ });
+ Assert.equal(timer.name, "test 1", "Timer should have the correct name");
+ Assert.ok(!timer.done, "Should not be done");
+ Assert.equal(invoked, 0, "Should not have invoked the callback yet");
+ await deferred.promise;
+ Assert.ok(timer.done, "Should be done");
+ Assert.equal(invoked, 1, "Should have invoked the callback");
+});
+
+add_task(async function test_fire() {
+ let longTimeMs = 1000;
+ let invoked = 0;
+ let deferred = Promise.withResolvers();
+ let timer = new SkippableTimer({
+ name: "test 1",
+ callback: () => {
+ invoked++;
+ deferred.resolve();
+ },
+ time: longTimeMs,
+ });
+ let start = Cu.now();
+ Assert.equal(timer.name, "test 1", "Timer should have the correct name");
+ Assert.ok(!timer.done, "Should not be done");
+ Assert.equal(invoked, 0, "Should not have invoked the callback yet");
+ // Call fire() many times to also verify the callback is invoked just once.
+ timer.fire();
+ timer.fire();
+ timer.fire();
+ Assert.ok(timer.done, "Should be done");
+ await deferred.promise;
+ Assert.greater(longTimeMs, Cu.now() - start, "Should have resolved earlier");
+ Assert.equal(invoked, 1, "Should have invoked the callback");
+});
+
+add_task(async function test_cancel() {
+ let timeMs = 50;
+ let invoked = 0;
+ let deferred = Promise.withResolvers();
+ let timer = new SkippableTimer({
+ name: "test 1",
+ callback: () => {
+ invoked++;
+ deferred.resolve();
+ },
+ time: timeMs,
+ });
+ let start = Cu.now();
+ Assert.equal(timer.name, "test 1", "Timer should have the correct name");
+ Assert.ok(!timer.done, "Should not be done");
+ Assert.equal(invoked, 0, "Should not have invoked the callback yet");
+ // Calling cancel many times shouldn't rise any error.
+ timer.cancel();
+ timer.cancel();
+ Assert.ok(timer.done, "Should be done");
+ await Promise.race([
+ deferred.promise,
+ // eslint-disable-next-line mozilla/no-arbitrary-setTimeout
+ new Promise(r => setTimeout(r, timeMs * 4)),
+ ]);
+ Assert.greater(Cu.now() - start, timeMs, "Should not have resolved earlier");
+ Assert.equal(invoked, 0, "Should not have invoked the callback");
+});