Home | History | Annotate | Download | only in shadows
      1 package com.xtremelabs.robolectric.shadows;
      2 
      3 import android.app.Activity;
      4 import android.appwidget.AppWidgetProvider;
      5 import android.content.BroadcastReceiver;
      6 import android.content.Context;
      7 import android.content.ContextWrapper;
      8 import android.content.Intent;
      9 import android.content.IntentFilter;
     10 import com.xtremelabs.robolectric.Robolectric;
     11 import com.xtremelabs.robolectric.WithTestDefaultsRunner;
     12 import com.xtremelabs.robolectric.util.Transcript;
     13 import org.junit.Before;
     14 import org.junit.Test;
     15 import org.junit.runner.RunWith;
     16 
     17 import java.util.List;
     18 
     19 import static android.content.pm.PackageManager.PERMISSION_DENIED;
     20 import static android.content.pm.PackageManager.PERMISSION_GRANTED;
     21 import static com.xtremelabs.robolectric.Robolectric.shadowOf;
     22 import static junit.framework.Assert.assertEquals;
     23 import static org.hamcrest.CoreMatchers.notNullValue;
     24 import static org.hamcrest.CoreMatchers.nullValue;
     25 import static org.hamcrest.CoreMatchers.sameInstance;
     26 import static org.hamcrest.core.IsEqual.equalTo;
     27 import static org.junit.Assert.assertThat;
     28 import static org.junit.Assert.assertTrue;
     29 
     30 @RunWith(WithTestDefaultsRunner.class)
     31 public class ContextWrapperTest {
     32     public Transcript transcript;
     33     private ContextWrapper contextWrapper;
     34 
     35     @Before public void setUp() throws Exception {
     36         transcript = new Transcript();
     37         contextWrapper = new ContextWrapper(new Activity());
     38     }
     39 
     40     @Test
     41     public void registerReceiver_shouldRegisterForAllIntentFilterActions() throws Exception {
     42         BroadcastReceiver receiver = broadcastReceiver("Larry");
     43         contextWrapper.registerReceiver(receiver, intentFilter("foo", "baz"));
     44 
     45         contextWrapper.sendBroadcast(new Intent("foo"));
     46         transcript.assertEventsSoFar("Larry notified of foo");
     47 
     48         contextWrapper.sendBroadcast(new Intent("womp"));
     49         transcript.assertNoEventsSoFar();
     50 
     51         contextWrapper.sendBroadcast(new Intent("baz"));
     52         transcript.assertEventsSoFar("Larry notified of baz");
     53     }
     54 
     55     @Test
     56     public void sendBroadcast_shouldSendIntentToEveryInterestedReceiver() throws Exception {
     57         BroadcastReceiver larryReceiver = broadcastReceiver("Larry");
     58         contextWrapper.registerReceiver(larryReceiver, intentFilter("foo", "baz"));
     59 
     60         BroadcastReceiver bobReceiver = broadcastReceiver("Bob");
     61         contextWrapper.registerReceiver(bobReceiver, intentFilter("foo"));
     62 
     63         contextWrapper.sendBroadcast(new Intent("foo"));
     64         transcript.assertEventsSoFar("Larry notified of foo", "Bob notified of foo");
     65 
     66         contextWrapper.sendBroadcast(new Intent("womp"));
     67         transcript.assertNoEventsSoFar();
     68 
     69         contextWrapper.sendBroadcast(new Intent("baz"));
     70         transcript.assertEventsSoFar("Larry notified of baz");
     71     }
     72 
     73     @Test
     74     public void unregisterReceiver_shouldUnregisterReceiver() throws Exception {
     75         BroadcastReceiver receiver = broadcastReceiver("Larry");
     76 
     77         contextWrapper.registerReceiver(receiver, intentFilter("foo", "baz"));
     78         contextWrapper.unregisterReceiver(receiver);
     79 
     80         contextWrapper.sendBroadcast(new Intent("foo"));
     81         transcript.assertNoEventsSoFar();
     82     }
     83 
     84     @Test(expected = IllegalArgumentException.class)
     85     public void unregisterReceiver_shouldThrowExceptionWhenReceiverIsNotRegistered() throws Exception {
     86         contextWrapper.unregisterReceiver(new AppWidgetProvider());
     87     }
     88 
     89     @Test
     90     public void broadcastReceivers_shouldBeSharedAcrossContextsPerApplicationContext() throws Exception {
     91         BroadcastReceiver receiver = broadcastReceiver("Larry");
     92 
     93         new ContextWrapper(Robolectric.application).registerReceiver(receiver, intentFilter("foo", "baz"));
     94         new ContextWrapper(Robolectric.application).sendBroadcast(new Intent("foo"));
     95         Robolectric.application.sendBroadcast(new Intent("baz"));
     96         transcript.assertEventsSoFar("Larry notified of foo", "Larry notified of baz");
     97 
     98         new ContextWrapper(Robolectric.application).unregisterReceiver(receiver);
     99     }
    100 
    101 	@Test
    102 	public void broadcasts_shouldBeLogged() {
    103 		Intent broadcastIntent = new Intent("foo");
    104 		contextWrapper.sendBroadcast(broadcastIntent);
    105 
    106 		List<Intent> broadcastIntents = shadowOf(contextWrapper).getBroadcastIntents();
    107 		assertTrue(broadcastIntents.size() == 1);
    108 		assertEquals(broadcastIntent, broadcastIntents.get(0));
    109 	}
    110 
    111 
    112     @Test
    113     public void shouldReturnSameApplicationEveryTime() throws Exception {
    114         Activity activity = new Activity();
    115         assertThat(activity.getApplication(), sameInstance(activity.getApplication()));
    116 
    117         assertThat(activity.getApplication(), sameInstance(new Activity().getApplication()));
    118     }
    119 
    120     @Test
    121     public void shouldReturnSameApplicationContextEveryTime() throws Exception {
    122         Activity activity = new Activity();
    123         assertThat(activity.getApplicationContext(), sameInstance(activity.getApplicationContext()));
    124 
    125         assertThat(activity.getApplicationContext(), sameInstance(new Activity().getApplicationContext()));
    126     }
    127 
    128     @Test
    129     public void shouldReturnSameContentResolverEveryTime() throws Exception {
    130         Activity activity = new Activity();
    131         assertThat(activity.getContentResolver(), sameInstance(activity.getContentResolver()));
    132 
    133         assertThat(activity.getContentResolver(), sameInstance(new Activity().getContentResolver()));
    134     }
    135 
    136     @Test
    137     public void shouldReturnSameLocationManagerEveryTime() throws Exception {
    138         assertSameInstanceEveryTime(Context.LOCATION_SERVICE);
    139     }
    140 
    141     @Test
    142     public void shouldReturnSameWifiManagerEveryTime() throws Exception {
    143         assertSameInstanceEveryTime(Context.WIFI_SERVICE);
    144     }
    145 
    146     @Test
    147     public void shouldReturnSameAlarmServiceEveryTime() throws Exception {
    148         assertSameInstanceEveryTime(Context.ALARM_SERVICE);
    149     }
    150 
    151     @Test
    152     public void checkPermissionsShouldReturnPermissionGrantedToAddedPermissions() throws Exception {
    153         shadowOf(contextWrapper).grantPermissions("foo", "bar");
    154         assertThat(contextWrapper.checkPermission("foo", 0, 0), equalTo(PERMISSION_GRANTED));
    155         assertThat(contextWrapper.checkPermission("bar", 0, 0), equalTo(PERMISSION_GRANTED));
    156         assertThat(contextWrapper.checkPermission("baz", 0, 0), equalTo(PERMISSION_DENIED));
    157     }
    158 
    159     @Test
    160     public void shouldReturnAContext() {
    161     	assertThat(contextWrapper.getBaseContext(), notNullValue());
    162     	ShadowContextWrapper shContextWrapper = Robolectric.shadowOf(contextWrapper);
    163     	shContextWrapper.attachBaseContext(null);
    164     	assertThat(contextWrapper.getBaseContext(), nullValue());
    165 
    166     	Activity baseContext = new Activity();
    167     	shContextWrapper.attachBaseContext(baseContext);
    168     	assertThat(contextWrapper.getBaseContext(), sameInstance((Context) baseContext));
    169     }
    170 
    171     private void assertSameInstanceEveryTime(String serviceName) {
    172         Activity activity = new Activity();
    173         assertThat(activity.getSystemService(serviceName), sameInstance(activity.getSystemService(serviceName)));
    174 
    175         assertThat(activity.getSystemService(serviceName), sameInstance(new Activity().getSystemService(serviceName)));
    176     }
    177 
    178     @Test
    179     public void bindServiceDelegatesToShadowApplication() {
    180         contextWrapper.bindService(new Intent("foo"), new TestService(), Context.BIND_AUTO_CREATE);
    181         assertEquals("foo", shadowOf(Robolectric.application).getNextStartedService().getAction());
    182     }
    183 
    184     private BroadcastReceiver broadcastReceiver(final String name) {
    185         return new BroadcastReceiver() {
    186             @Override public void onReceive(Context context, Intent intent) {
    187                 transcript.add(name + " notified of " + intent.getAction());
    188             }
    189         };
    190     }
    191 
    192     private IntentFilter intentFilter(String... actions) {
    193         IntentFilter larryIntentFilter = new IntentFilter();
    194         for (String action : actions) {
    195             larryIntentFilter.addAction(action);
    196         }
    197         return larryIntentFilter;
    198     }
    199 }
    200