package com.xtremelabs.robolectric.shadows; import android.app.Activity; import android.app.AlarmManager; import android.app.PendingIntent; import android.content.Context; import android.content.Intent; import com.xtremelabs.robolectric.Robolectric; import com.xtremelabs.robolectric.WithTestDefaultsRunner; import org.junit.After; import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; import java.util.Date; import static junit.framework.Assert.assertEquals; import static org.hamcrest.CoreMatchers.*; import static org.junit.Assert.assertThat; @RunWith(WithTestDefaultsRunner.class) public class AlarmManagerTest { private MyActivity activity; private AlarmManager alarmManager; private ShadowAlarmManager shadowAlarmManager; @Before public void setUp() throws Exception { activity = new MyActivity(); alarmManager = (AlarmManager) activity.getSystemService(Context.ALARM_SERVICE); shadowAlarmManager = Robolectric.shadowOf(alarmManager); } @After public void tearDown() throws Exception { } @Test public void shouldSupportSet() throws Exception { assertThat(shadowAlarmManager.getNextScheduledAlarm(), nullValue()); alarmManager.set(AlarmManager.ELAPSED_REALTIME, 0, PendingIntent.getActivity(activity, 0, new Intent(activity, activity.getClass()), 0)); ShadowAlarmManager.ScheduledAlarm scheduledAlarm = shadowAlarmManager.getNextScheduledAlarm(); assertThat(scheduledAlarm, notNullValue()); } @Test public void shouldSupportSetRepeating() throws Exception { assertThat(shadowAlarmManager.getNextScheduledAlarm(), nullValue()); alarmManager.setRepeating(AlarmManager.ELAPSED_REALTIME, 0, AlarmManager.INTERVAL_HOUR, PendingIntent.getActivity(activity, 0, new Intent(activity, activity.getClass()), 0)); ShadowAlarmManager.ScheduledAlarm scheduledAlarm = shadowAlarmManager.getNextScheduledAlarm(); assertThat(scheduledAlarm, notNullValue()); } @Test public void setShouldReplaceDuplicates() { alarmManager.set(AlarmManager.ELAPSED_REALTIME, 0, PendingIntent.getActivity(activity, 0, new Intent(activity, activity.getClass()), 0)); alarmManager.set(AlarmManager.ELAPSED_REALTIME, 0, PendingIntent.getActivity(activity, 0, new Intent(activity, activity.getClass()), 0)); assertEquals(1, shadowAlarmManager.getScheduledAlarms().size()); } @Test public void setRepeatingShouldReplaceDuplicates() { alarmManager.setRepeating(AlarmManager.ELAPSED_REALTIME, 0, AlarmManager.INTERVAL_HOUR, PendingIntent.getActivity(activity, 0, new Intent(activity, activity.getClass()), 0)); alarmManager.setRepeating(AlarmManager.ELAPSED_REALTIME, 0, AlarmManager.INTERVAL_HOUR, PendingIntent.getActivity(activity, 0, new Intent(activity, activity.getClass()), 0)); assertEquals(1, shadowAlarmManager.getScheduledAlarms().size()); } @Test public void shouldSupportGetNextScheduledAlarm() throws Exception { assertThat(shadowAlarmManager.getNextScheduledAlarm(), nullValue()); long now = new Date().getTime(); PendingIntent pendingIntent = PendingIntent.getActivity(activity, 0, new Intent(activity, activity.getClass()), 0); alarmManager.set(AlarmManager.ELAPSED_REALTIME, now, pendingIntent); ShadowAlarmManager.ScheduledAlarm scheduledAlarm = shadowAlarmManager.getNextScheduledAlarm(); assertThat(shadowAlarmManager.getNextScheduledAlarm(), nullValue()); assertScheduledAlarm(now, pendingIntent, scheduledAlarm); } @Test public void shouldSupportGetNextScheduledAlarmForRepeatingAlarms() throws Exception { assertThat(shadowAlarmManager.getNextScheduledAlarm(), nullValue()); long now = new Date().getTime(); PendingIntent pendingIntent = PendingIntent.getActivity(activity, 0, new Intent(activity, activity.getClass()), 0); alarmManager.setRepeating(AlarmManager.ELAPSED_REALTIME, now, AlarmManager.INTERVAL_HOUR, pendingIntent); ShadowAlarmManager.ScheduledAlarm scheduledAlarm = shadowAlarmManager.getNextScheduledAlarm(); assertThat(shadowAlarmManager.getNextScheduledAlarm(), nullValue()); assertRepeatingScheduledAlarm(now, AlarmManager.INTERVAL_HOUR, pendingIntent, scheduledAlarm); } @Test public void shouldSupportPeekScheduledAlarm() throws Exception { assertThat(shadowAlarmManager.getNextScheduledAlarm(), nullValue()); long now = new Date().getTime(); PendingIntent pendingIntent = PendingIntent.getActivity(activity, 0, new Intent(activity, activity.getClass()), 0); alarmManager.set(AlarmManager.ELAPSED_REALTIME, now, pendingIntent); ShadowAlarmManager.ScheduledAlarm scheduledAlarm = shadowAlarmManager.peekNextScheduledAlarm(); assertThat(shadowAlarmManager.peekNextScheduledAlarm(), notNullValue()); assertScheduledAlarm(now, pendingIntent, scheduledAlarm); } @Test public void cancel_removesMatchingPendingIntents() { Intent newIntent = new Intent(Robolectric.application.getApplicationContext(), String.class); PendingIntent pendingIntent = PendingIntent.getBroadcast(Robolectric.application.getApplicationContext(), 0, newIntent, PendingIntent.FLAG_UPDATE_CURRENT); alarmManager.set(AlarmManager.RTC, 1337, pendingIntent); Intent newIntent2 = new Intent(Robolectric.application.getApplicationContext(), Integer.class); PendingIntent pendingIntent2 = PendingIntent.getBroadcast(Robolectric.application.getApplicationContext(), 0, newIntent2, PendingIntent.FLAG_UPDATE_CURRENT); alarmManager.set(AlarmManager.RTC, 1337, pendingIntent2); assertEquals(2, shadowAlarmManager.getScheduledAlarms().size()); Intent newIntent3 = new Intent(Robolectric.application.getApplicationContext(), String.class); PendingIntent newPendingIntent = PendingIntent.getBroadcast(Robolectric.application.getApplicationContext(), 0, newIntent3, PendingIntent.FLAG_UPDATE_CURRENT); alarmManager.cancel(newPendingIntent); assertEquals(1, shadowAlarmManager.getScheduledAlarms().size()); } @Test public void cancel_removesMatchingPendingIntentsWithActions() { Intent newIntent = new Intent("someAction"); PendingIntent pendingIntent = PendingIntent.getBroadcast(Robolectric.application.getApplicationContext(), 0, newIntent, 0); alarmManager.set(AlarmManager.RTC, 1337, pendingIntent); assertEquals(1, shadowAlarmManager.getScheduledAlarms().size()); alarmManager.cancel(PendingIntent.getBroadcast(Robolectric.application, 0, new Intent("anotherAction"), 0)); assertEquals(1, shadowAlarmManager.getScheduledAlarms().size()); alarmManager.cancel(PendingIntent.getBroadcast(Robolectric.application, 0, new Intent("someAction"), 0)); assertEquals(0, shadowAlarmManager.getScheduledAlarms().size()); } private void assertScheduledAlarm(long now, PendingIntent pendingIntent, ShadowAlarmManager.ScheduledAlarm scheduledAlarm) { assertRepeatingScheduledAlarm(now, 0L, pendingIntent, scheduledAlarm); } private void assertRepeatingScheduledAlarm(long now, long interval, PendingIntent pendingIntent, ShadowAlarmManager.ScheduledAlarm scheduledAlarm) { assertThat(scheduledAlarm, notNullValue()); assertThat(scheduledAlarm.operation, notNullValue()); assertThat(scheduledAlarm.operation, sameInstance(pendingIntent)); assertThat(scheduledAlarm.type, equalTo(AlarmManager.ELAPSED_REALTIME)); assertThat(scheduledAlarm.triggerAtTime, equalTo(now)); assertThat(scheduledAlarm.interval, equalTo(interval)); } private static class MyActivity extends Activity { @Override protected void onDestroy() { super.onDestroy(); } } }