package org.robolectric.shadows; import android.app.Activity; import android.app.AlarmManager; import android.app.PendingIntent; import android.content.Context; import android.content.Intent; import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; import org.robolectric.Robolectric; import org.robolectric.RuntimeEnvironment; import org.robolectric.Shadows; import org.robolectric.TestRunners; import org.robolectric.annotation.Config; import java.util.Date; import static android.os.Build.VERSION_CODES.KITKAT; import static android.os.Build.VERSION_CODES.M; import static org.assertj.core.api.Assertions.assertThat; @RunWith(TestRunners.MultiApiSelfTest.class) public class ShadowAlarmManagerTest { private Activity activity; private final AlarmManager alarmManager = (AlarmManager) RuntimeEnvironment.application.getSystemService(Context.ALARM_SERVICE); private final ShadowAlarmManager shadowAlarmManager = Shadows.shadowOf(alarmManager); @Before public void setUp() { activity = Robolectric.setupActivity(Activity.class); } @Test public void set_shouldRegisterAlarm() throws Exception { assertThat(shadowAlarmManager.getNextScheduledAlarm()).isNull(); alarmManager.set(AlarmManager.ELAPSED_REALTIME, 0, PendingIntent.getActivity(activity, 0, new Intent(activity, activity.getClass()), 0)); assertThat(shadowAlarmManager.getNextScheduledAlarm()).isNotNull(); } @Test @Config(minSdk = M) public void setAndAllowWhileIdle_shouldRegisterAlarm() throws Exception { assertThat(shadowAlarmManager.getNextScheduledAlarm()).isNull(); alarmManager.setAndAllowWhileIdle(AlarmManager.ELAPSED_REALTIME, 0, PendingIntent.getActivity(activity, 0, new Intent(activity, activity.getClass()), 0)); assertThat(shadowAlarmManager.getNextScheduledAlarm()).isNotNull(); } @Test @Config(minSdk = M) public void setExactAndAllowWhileIdle_shouldRegisterAlarm() throws Exception { assertThat(shadowAlarmManager.getNextScheduledAlarm()).isNull(); alarmManager.setExactAndAllowWhileIdle(AlarmManager.ELAPSED_REALTIME, 0, PendingIntent.getActivity(activity, 0, new Intent(activity, activity.getClass()), 0)); assertThat(shadowAlarmManager.getNextScheduledAlarm()).isNotNull(); } @Test @Config(minSdk = KITKAT) public void setExact_shouldRegisterAlarm_forApi19() throws Exception { assertThat(shadowAlarmManager.getNextScheduledAlarm()).isNull(); alarmManager.setExact(AlarmManager.ELAPSED_REALTIME, 0, PendingIntent.getActivity(activity, 0, new Intent(activity, activity.getClass()), 0)); assertThat(shadowAlarmManager.getNextScheduledAlarm()).isNotNull(); } @Test @Config(minSdk = KITKAT) public void setWindow_shouldRegisterAlarm_forApi19() throws Exception { assertThat(shadowAlarmManager.getNextScheduledAlarm()).isNull(); alarmManager.setWindow(AlarmManager.ELAPSED_REALTIME, 0, 1, PendingIntent.getActivity(activity, 0, new Intent(activity, activity.getClass()), 0)); assertThat(shadowAlarmManager.getNextScheduledAlarm()).isNotNull(); } @Test public void setRepeating_shouldRegisterAlarm() throws Exception { assertThat(shadowAlarmManager.getNextScheduledAlarm()).isNull(); alarmManager.setRepeating(AlarmManager.ELAPSED_REALTIME, 0, AlarmManager.INTERVAL_HOUR, PendingIntent.getActivity(activity, 0, new Intent(activity, activity.getClass()), 0)); assertThat(shadowAlarmManager.getNextScheduledAlarm()).isNotNull(); } @Test public void set_shouldReplaceAlarmsWithSameIntentReceiver() { alarmManager.set(AlarmManager.ELAPSED_REALTIME, 500, PendingIntent.getActivity(activity, 0, new Intent(activity, activity.getClass()), 0)); alarmManager.set(AlarmManager.ELAPSED_REALTIME, 1000, PendingIntent.getActivity(activity, 0, new Intent(activity, activity.getClass()), 0)); assertThat(shadowAlarmManager.getScheduledAlarms()).hasSize(1); } @Test public void set_shouldReplaceDuplicates() { 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)); assertThat(shadowAlarmManager.getScheduledAlarms()).hasSize(1); } @Test public void setRepeating_shouldReplaceDuplicates() { 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)); assertThat(shadowAlarmManager.getScheduledAlarms()).hasSize(1); } @Test public void shouldSupportGetNextScheduledAlarm() throws Exception { assertThat(shadowAlarmManager.getNextScheduledAlarm()).isNull(); 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()).isNull(); assertScheduledAlarm(now, pendingIntent, scheduledAlarm); } @Test public void getNextScheduledAlarm_shouldReturnRepeatingAlarms() throws Exception { assertThat(shadowAlarmManager.getNextScheduledAlarm()).isNull(); 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()).isNull(); assertRepeatingScheduledAlarm(now, AlarmManager.INTERVAL_HOUR, pendingIntent, scheduledAlarm); } @Test public void peekNextScheduledAlarm_shouldReturnNextAlarm() throws Exception { assertThat(shadowAlarmManager.getNextScheduledAlarm()).isNull(); 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()).isNotNull(); assertScheduledAlarm(now, pendingIntent, scheduledAlarm); } @Test public void cancel_removesMatchingPendingIntents() { Intent newIntent = new Intent(RuntimeEnvironment.application.getApplicationContext(), String.class); PendingIntent pendingIntent = PendingIntent.getBroadcast(RuntimeEnvironment.application.getApplicationContext(), 0, newIntent, PendingIntent.FLAG_UPDATE_CURRENT); alarmManager.set(AlarmManager.RTC, 1337, pendingIntent); Intent newIntent2 = new Intent(RuntimeEnvironment.application.getApplicationContext(), Integer.class); PendingIntent pendingIntent2 = PendingIntent.getBroadcast(RuntimeEnvironment.application.getApplicationContext(), 0, newIntent2, PendingIntent.FLAG_UPDATE_CURRENT); alarmManager.set(AlarmManager.RTC, 1337, pendingIntent2); assertThat(shadowAlarmManager.getScheduledAlarms()).hasSize(2); Intent newIntent3 = new Intent(RuntimeEnvironment.application.getApplicationContext(), String.class); PendingIntent newPendingIntent = PendingIntent.getBroadcast(RuntimeEnvironment.application.getApplicationContext(), 0, newIntent3, PendingIntent.FLAG_UPDATE_CURRENT); alarmManager.cancel(newPendingIntent); assertThat(shadowAlarmManager.getScheduledAlarms()).hasSize(1); } @Test public void cancel_removesMatchingPendingIntentsWithActions() { Intent newIntent = new Intent("someAction"); PendingIntent pendingIntent = PendingIntent.getBroadcast(RuntimeEnvironment.application.getApplicationContext(), 0, newIntent, 0); alarmManager.set(AlarmManager.RTC, 1337, pendingIntent); assertThat(shadowAlarmManager.getScheduledAlarms()).hasSize(1); alarmManager.cancel(PendingIntent.getBroadcast(RuntimeEnvironment.application, 0, new Intent("anotherAction"), 0)); assertThat(shadowAlarmManager.getScheduledAlarms()).hasSize(1); alarmManager.cancel(PendingIntent.getBroadcast(RuntimeEnvironment.application, 0, new Intent("someAction"), 0)); assertThat(shadowAlarmManager.getScheduledAlarms()).hasSize(0); } 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).isNotNull(); assertThat(scheduledAlarm.operation).isNotNull(); assertThat(scheduledAlarm.operation).isSameAs(pendingIntent); assertThat(scheduledAlarm.type).isEqualTo(AlarmManager.ELAPSED_REALTIME); assertThat(scheduledAlarm.triggerAtTime).isEqualTo(now); assertThat(scheduledAlarm.interval).isEqualTo(interval); } }