gecko-dev/toolkit/components/extensions/test/xpcshell/test_ext_alarms.js
2019-08-26 18:15:25 +00:00

219 lines
6.4 KiB
JavaScript

/* -*- Mode: indent-tabs-mode: nil; js-indent-level: 2 -*- */
/* vim: set sts=2 sw=2 et tw=80: */
/* eslint-disable mozilla/no-arbitrary-setTimeout */
"use strict";
add_task(async function test_alarm_without_permissions() {
function backgroundScript() {
browser.test.assertTrue(
!browser.alarms,
"alarm API is not available when the alarm permission is not required"
);
browser.test.notifyPass("alarms_permission");
}
let extension = ExtensionTestUtils.loadExtension({
background: `(${backgroundScript})()`,
manifest: {
permissions: [],
},
});
await extension.startup();
await extension.awaitFinish("alarms_permission");
await extension.unload();
});
add_task(async function test_alarm_clear_non_matching_name() {
async function backgroundScript() {
let ALARM_NAME = "test_ext_alarms";
browser.alarms.create(ALARM_NAME, { when: Date.now() + 2000000 });
let wasCleared = await browser.alarms.clear(ALARM_NAME + "1");
browser.test.assertFalse(wasCleared, "alarm was not cleared");
let alarms = await browser.alarms.getAll();
browser.test.assertEq(1, alarms.length, "alarm was not removed");
browser.test.notifyPass("alarm-clear");
}
let extension = ExtensionTestUtils.loadExtension({
background: `(${backgroundScript})()`,
manifest: {
permissions: ["alarms"],
},
});
await extension.startup();
await extension.awaitFinish("alarm-clear");
await extension.unload();
});
add_task(async function test_alarm_get_and_clear_single_argument() {
async function backgroundScript() {
browser.alarms.create({ when: Date.now() + 2000000 });
let alarm = await browser.alarms.get();
browser.test.assertEq("", alarm.name, "expected alarm returned");
let wasCleared = await browser.alarms.clear();
browser.test.assertTrue(wasCleared, "alarm was cleared");
let alarms = await browser.alarms.getAll();
browser.test.assertEq(0, alarms.length, "alarm was removed");
browser.test.notifyPass("alarm-single-arg");
}
let extension = ExtensionTestUtils.loadExtension({
background: `(${backgroundScript})()`,
manifest: {
permissions: ["alarms"],
},
});
await extension.startup();
await extension.awaitFinish("alarm-single-arg");
await extension.unload();
});
add_task(async function test_get_get_all_clear_all_alarms() {
async function backgroundScript() {
const ALARM_NAME = "test_alarm";
let suffixes = [0, 1, 2];
for (let suffix of suffixes) {
browser.alarms.create(ALARM_NAME + suffix, {
when: Date.now() + (suffix + 1) * 10000,
});
}
let alarms = await browser.alarms.getAll();
browser.test.assertEq(
suffixes.length,
alarms.length,
"expected number of alarms were found"
);
alarms.forEach((alarm, index) => {
browser.test.assertEq(
ALARM_NAME + index,
alarm.name,
"alarm has the expected name"
);
});
for (let suffix of suffixes) {
let alarm = await browser.alarms.get(ALARM_NAME + suffix);
browser.test.assertEq(
ALARM_NAME + suffix,
alarm.name,
"alarm has the expected name"
);
browser.test.sendMessage(`get-${suffix}`);
}
let wasCleared = await browser.alarms.clear(ALARM_NAME + suffixes[0]);
browser.test.assertTrue(wasCleared, "alarm was cleared");
alarms = await browser.alarms.getAll();
browser.test.assertEq(2, alarms.length, "alarm was removed");
let alarm = await browser.alarms.get(ALARM_NAME + suffixes[0]);
browser.test.assertEq(undefined, alarm, "non-existent alarm is undefined");
browser.test.sendMessage(`get-invalid`);
wasCleared = await browser.alarms.clearAll();
browser.test.assertTrue(wasCleared, "alarms were cleared");
alarms = await browser.alarms.getAll();
browser.test.assertEq(0, alarms.length, "no alarms exist");
browser.test.sendMessage("clearAll");
browser.test.sendMessage("clear");
browser.test.sendMessage("getAll");
}
let extension = ExtensionTestUtils.loadExtension({
background: `(${backgroundScript})()`,
manifest: {
permissions: ["alarms"],
},
});
await Promise.all([
extension.startup(),
extension.awaitMessage("getAll"),
extension.awaitMessage("get-0"),
extension.awaitMessage("get-1"),
extension.awaitMessage("get-2"),
extension.awaitMessage("clear"),
extension.awaitMessage("get-invalid"),
extension.awaitMessage("clearAll"),
]);
await extension.unload();
});
async function test_alarm_fires_with_options(alarmCreateOptions) {
info(
`Test alarms.create fires with options: ${JSON.stringify(
alarmCreateOptions
)}`
);
function backgroundScript(createOptions) {
let ALARM_NAME = "test_ext_alarms";
let timer;
browser.alarms.onAlarm.addListener(alarm => {
browser.test.assertEq(
ALARM_NAME,
alarm.name,
"alarm has the expected name"
);
clearTimeout(timer);
browser.test.notifyPass("alarms-create-with-options");
});
browser.alarms.create(ALARM_NAME, createOptions);
timer = setTimeout(async () => {
browser.test.fail("alarm fired within expected time");
let wasCleared = await browser.alarms.clear(ALARM_NAME);
browser.test.assertTrue(wasCleared, "alarm was cleared");
browser.test.notifyFail("alarms-create-with-options");
}, 10000);
}
let extension = ExtensionTestUtils.loadExtension({
// Pass the alarms.create options to the background page.
background: `(${backgroundScript})(${JSON.stringify(alarmCreateOptions)})`,
manifest: {
permissions: ["alarms"],
},
});
await extension.startup();
await extension.awaitFinish("alarms-create-with-options");
// Defer unloading the extension so the asynchronous event listener
// reply finishes.
await new Promise(resolve => setTimeout(resolve, 0));
await extension.unload();
}
add_task(async function test_alarm_fires() {
Services.prefs.setBoolPref(
"privacy.resistFingerprinting.reduceTimerPrecision.jitter",
false
);
await test_alarm_fires_with_options({ delayInMinutes: 0.01 });
await test_alarm_fires_with_options({ when: Date.now() + 1000 });
await test_alarm_fires_with_options({ delayInMinutes: -10 });
await test_alarm_fires_with_options({ when: Date.now() - 1000 });
Services.prefs.clearUserPref(
"privacy.resistFingerprinting.reduceTimerPrecision.jitter"
);
});