gecko-dev/hal/tests/browser_alarms.js
Sankha Narayan Guria a327e90d00 Bug 877888 - Alarm API type checks date to prevent millisecond loss. r=nsm
--HG--
extra : rebase_source : c319da81514194bd5adef260f78e9317b1a044a8
2013-07-02 23:59:58 +05:30

188 lines
3.7 KiB
JavaScript

XPCOMUtils.defineLazyModuleGetter(this, "AlarmService",
"resource://gre/modules/AlarmService.jsm");
/*
* Tests for Bug 867868 and related Alarm API bugs.
*
* NOTE: These tests pass the alarm time to AlarmService as a number and not as
* a date. See bug 810973 about Date truncating milliseconds. AlarmService does
* not officially allow a integer, but nor does it disallow it. Of course this
* test will break if AlarmService adds a type check, hence this note.
* FIXME: when bug 810973 is fixed.
*/
function add_alarm_future(cb) {
let alarmId = undefined;
AlarmService.add({
date: new Date(Date.now() + 143),
ignoreTimezone: true
},
function onAlarmFired(aAlarm) {
ok(alarmId === aAlarm.id, "Future alarm fired successfully.");
cb();
},
function onSuccess(aAlarmId) {
alarmId = aAlarmId;
},
function onError(error) {
ok(false, "Unexpected error adding future alarm " + error);
cb();
});
}
function add_alarm_present(cb) {
let self = this;
let alarmId = undefined;
AlarmService.add({
date: new Date(),
ignoreTimezone: true
},
function onAlarmFired(aAlarm) {
ok(alarmId === aAlarm.id, "Present alarm fired successfully.");
cb();
},
function onSuccess(aAlarmId) {
alarmId = aAlarmId;
}, function onError(error) {
ok(false, "Unexpected error adding alarm for current time " + error);
cb();
});
}
function add_alarm_past(cb) {
let self = this;
let alarmId = undefined;
AlarmService.add({
date: new Date(Date.now() - 5),
ignoreTimezone: true
},
function onAlarmFired(aAlarm) {
ok(alarmId === aAlarm.id, "Past alarm fired successfully.");
cb();
},
function onSuccess(aAlarmId) {
alarmId = aAlarmId;
},
function onError(error) {
ok(false, "Unexpected error adding alarm for time in the past " + error);
cb();
});
}
function trigger_all_alarms(cb) {
let n = 10;
let counter = 0;
let date = new Date(Date.now() + 57);
function onAlarmFired() {
counter++;
info("trigger_all_alarms count " + counter);
if (counter == n) {
ok(true, "All " + n + " alarms set to a particular time fired.");
cb();
}
}
for (let i = 0; i < n; i++) {
AlarmService.add(
{
date: date,
ignoreTimezone: true
},
onAlarmFired
);
}
}
function multiple_handlers(cb) {
let d = new Date(Date.now() + 100);
let called = 0;
function done() {
if (called == 2) {
ok(true, "Two alarms for the same time fired.");
cb();
}
}
function handler1() {
called++;
done();
}
function handler2() {
called++;
done();
}
AlarmService.add(
{
date: d,
ignoreTimezone: true
},
handler1
);
AlarmService.add(
{
date: d,
ignoreTimezone: true
},
handler2
);
}
function same_time_alarms(cb) {
var fired = 0;
var delay = new Date(Date.now() + 100);
function check() {
fired++;
if (fired == 4) {
ok(true, "All alarms set for the same time fired.");
cb();
}
}
function addImmediateAlarm() {
fired++;
AlarmService.add({
date: delay,
ignoreTimezone: true
}, check);
}
AlarmService.add({
date: delay,
ignoreTimezone: true
}, addImmediateAlarm);
AlarmService.add({
date: delay,
ignoreTimezone: true
}, addImmediateAlarm);
}
function test() {
var tests = [
add_alarm_future,
add_alarm_present,
add_alarm_past,
trigger_all_alarms,
multiple_handlers,
same_time_alarms
]
var testIndex = -1;
function nextTest() {
testIndex++;
if (testIndex >= tests.length)
return;
waitForExplicitFinish();
tests[testIndex](function() {
finish();
nextTest();
});
}
nextTest();
}