diff -r 000000000000 -r 6474c204b198 hal/tests/browser_alarms.js --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/hal/tests/browser_alarms.js Wed Dec 31 06:09:35 2014 +0100 @@ -0,0 +1,187 @@ +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(); +}