blob: 5c75efec2504df39ebac8cac193766c0282d44c5 [file] [log] [blame]
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();
}
}
}