test_UrlbarUtils_skippableTimer.js (2817B)
1 /* Any copyright is dedicated to the Public Domain. 2 http://creativecommons.org/publicdomain/zero/1.0/ */ 3 4 /** 5 * Tests UrlbarUtils.SkippableTimer 6 */ 7 8 "use strict"; 9 10 let { SkippableTimer } = ChromeUtils.importESModule( 11 "moz-src:///browser/components/urlbar/UrlbarUtils.sys.mjs" 12 ); 13 const { setTimeout } = ChromeUtils.importESModule( 14 "resource://gre/modules/Timer.sys.mjs" 15 ); 16 17 add_task(async function test_basic() { 18 let invoked = 0; 19 let deferred = Promise.withResolvers(); 20 let timer = new SkippableTimer({ 21 name: "test 1", 22 callback: () => { 23 invoked++; 24 deferred.resolve(); 25 }, 26 time: 50, 27 }); 28 Assert.equal(timer.name, "test 1", "Timer should have the correct name"); 29 Assert.ok(!timer.done, "Should not be done"); 30 Assert.equal(invoked, 0, "Should not have invoked the callback yet"); 31 await deferred.promise; 32 Assert.ok(timer.done, "Should be done"); 33 Assert.equal(invoked, 1, "Should have invoked the callback"); 34 }); 35 36 add_task(async function test_fire() { 37 let longTimeMs = 1000; 38 let invoked = 0; 39 let deferred = Promise.withResolvers(); 40 let timer = new SkippableTimer({ 41 name: "test 1", 42 callback: () => { 43 invoked++; 44 deferred.resolve(); 45 }, 46 time: longTimeMs, 47 }); 48 let start = ChromeUtils.now(); 49 Assert.equal(timer.name, "test 1", "Timer should have the correct name"); 50 Assert.ok(!timer.done, "Should not be done"); 51 Assert.equal(invoked, 0, "Should not have invoked the callback yet"); 52 // Call fire() many times to also verify the callback is invoked just once. 53 timer.fire(); 54 timer.fire(); 55 timer.fire(); 56 Assert.ok(timer.done, "Should be done"); 57 await deferred.promise; 58 Assert.greater( 59 longTimeMs, 60 ChromeUtils.now() - start, 61 "Should have resolved earlier" 62 ); 63 Assert.equal(invoked, 1, "Should have invoked the callback"); 64 }); 65 66 add_task(async function test_cancel() { 67 let timeMs = 50; 68 let invoked = 0; 69 let deferred = Promise.withResolvers(); 70 let timer = new SkippableTimer({ 71 name: "test 1", 72 callback: () => { 73 invoked++; 74 deferred.resolve(); 75 }, 76 time: timeMs, 77 }); 78 let start = ChromeUtils.now(); 79 Assert.equal(timer.name, "test 1", "Timer should have the correct name"); 80 Assert.ok(!timer.done, "Should not be done"); 81 Assert.equal(invoked, 0, "Should not have invoked the callback yet"); 82 // Calling cancel many times shouldn't rise any error. 83 timer.cancel(); 84 timer.cancel(); 85 Assert.ok(timer.done, "Should be done"); 86 await Promise.race([ 87 deferred.promise, 88 // eslint-disable-next-line mozilla/no-arbitrary-setTimeout 89 new Promise(r => setTimeout(r, timeMs * 4)), 90 ]); 91 Assert.greater( 92 ChromeUtils.now() - start, 93 timeMs, 94 "Should not have resolved earlier" 95 ); 96 Assert.equal(invoked, 0, "Should not have invoked the callback"); 97 });