• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 package com.xtremelabs.robolectric.shadows;
2 
3 import android.app.Activity;
4 import android.app.Application;
5 import android.content.BroadcastReceiver;
6 import android.content.ComponentName;
7 import android.content.Context;
8 import android.content.ContextWrapper;
9 import android.content.Intent;
10 import android.content.IntentFilter;
11 import android.os.IBinder;
12 import android.os.IInterface;
13 import android.os.Parcel;
14 import android.os.RemoteException;
15 import com.xtremelabs.robolectric.ApplicationResolver;
16 import com.xtremelabs.robolectric.R;
17 import com.xtremelabs.robolectric.Robolectric;
18 import com.xtremelabs.robolectric.WithTestDefaultsRunner;
19 import com.xtremelabs.robolectric.res.ResourceLoader;
20 import com.xtremelabs.robolectric.res.StringResourceLoader;
21 import com.xtremelabs.robolectric.util.TestBroadcastReceiver;
22 import org.junit.Before;
23 import org.junit.Test;
24 import org.junit.runner.RunWith;
25 
26 import java.io.FileDescriptor;
27 import java.util.List;
28 
29 import static com.xtremelabs.robolectric.Robolectric.shadowOf;
30 import static com.xtremelabs.robolectric.util.TestUtil.newConfig;
31 import static junit.framework.Assert.assertEquals;
32 import static junit.framework.Assert.assertTrue;
33 import static org.hamcrest.CoreMatchers.sameInstance;
34 import static org.hamcrest.core.IsInstanceOf.instanceOf;
35 import static org.junit.Assert.assertFalse;
36 import static org.junit.Assert.assertNull;
37 import static org.junit.Assert.assertThat;
38 import static org.mockito.Mockito.mock;
39 import static org.mockito.Mockito.when;
40 
41 @RunWith(WithTestDefaultsRunner.class)
42 public class ApplicationTest {
43     @Before
setUp()44     public void setUp() throws Exception {
45         Robolectric.application = new Application();
46     }
47 
48     @Test
shouldBeAContext()49     public void shouldBeAContext() throws Exception {
50         assertThat(new Activity().getApplication(), sameInstance(Robolectric.application));
51         assertThat(new Activity().getApplication().getApplicationContext(), sameInstance((Context) Robolectric.application));
52     }
53 
54     @Test
shouldBeBindableToAResourceLoader()55     public void shouldBeBindableToAResourceLoader() throws Exception {
56         ResourceLoader resourceLoader1 = new ResourceLoader(mock(StringResourceLoader.class)) {
57         };
58         when(resourceLoader1.getStringValue(R.id.title)).thenReturn("title from resourceLoader1");
59         Application app1 = ShadowApplication.bind(new Application(), resourceLoader1);
60 
61         ResourceLoader resourceLoader2 = new ResourceLoader(mock(StringResourceLoader.class)) {
62         };
63         when(resourceLoader2.getStringValue(R.id.title)).thenReturn("title from resourceLoader2");
64         Application app2 = ShadowApplication.bind(new Application(), resourceLoader2);
65 
66         assertEquals("title from resourceLoader1", new ContextWrapper(app1).getResources().getString(R.id.title));
67         assertEquals("title from resourceLoader2", new ContextWrapper(app2).getResources().getString(R.id.title));
68     }
69 
70     @Test
shouldProvideServices()71     public void shouldProvideServices() throws Exception {
72         checkSystemService(Context.LAYOUT_INFLATER_SERVICE, android.view.LayoutInflater.class);
73         checkSystemService(Context.ACTIVITY_SERVICE, android.app.ActivityManager.class);
74         checkSystemService(Context.POWER_SERVICE, android.os.PowerManager.class);
75         checkSystemService(Context.ALARM_SERVICE, android.app.AlarmManager.class);
76         checkSystemService(Context.NOTIFICATION_SERVICE, android.app.NotificationManager.class);
77         checkSystemService(Context.KEYGUARD_SERVICE, android.app.KeyguardManager.class);
78         checkSystemService(Context.LOCATION_SERVICE, android.location.LocationManager.class);
79         checkSystemService(Context.SEARCH_SERVICE, android.app.SearchManager.class);
80         checkSystemService(Context.SENSOR_SERVICE, android.hardware.TestSensorManager.class);
81         checkSystemService(Context.STORAGE_SERVICE, android.os.storage.StorageManager.class);
82         checkSystemService(Context.VIBRATOR_SERVICE, android.os.TestVibrator.class);
83 //        checkSystemService(Context.CONNECTIVITY_SERVICE, android.net.ConnectivityManager.class);
84 //        checkSystemService(Context.WIFI_SERVICE, android.net.wifi.WifiManager.class);
85 //        checkSystemService(Context.AUDIO_SERVICE, android.media.AudioManager.class);
86 //        checkSystemService(Context.TELEPHONY_SERVICE, android.telephony.TelephonyManager.class);
87 //        checkSystemService(Context.INPUT_METHOD_SERVICE, android.view.inputmethod.InputMethodManager.class);
88 //        checkSystemService(Context.UI_MODE_SERVICE, android.app.UiModeManager.class);
89 //        checkSystemService(Context.DOWNLOAD_SERVICE, android.app.DownloadManager.class);
90     }
91 
checkSystemService(String name, Class expectedClass)92     private void checkSystemService(String name, Class expectedClass) {
93         Object systemService = Robolectric.application.getSystemService(name);
94         assertThat(systemService, instanceOf(expectedClass));
95         assertThat(systemService, sameInstance(Robolectric.application.getSystemService(name)));
96     }
97 
98     @Test
packageManager_shouldKnowPackageName()99     public void packageManager_shouldKnowPackageName() throws Exception {
100         Application application = new ApplicationResolver(newConfig("TestAndroidManifestWithPackageName.xml")).resolveApplication();
101         assertEquals("com.wacka.wa", application.getPackageManager().getPackageInfo("com.wacka.wa", 0).packageName);
102     }
103 
104     @Test
packageManager_shouldKnowApplicationName()105     public void packageManager_shouldKnowApplicationName() throws Exception {
106         Application application = new ApplicationResolver(newConfig("TestAndroidManifestWithAppName.xml")).resolveApplication();
107         assertEquals("com.xtremelabs.robolectric.TestApplication",
108                 application.getPackageManager().getApplicationInfo("com.xtremelabs.robolectric", 0).name);
109     }
110 
111     @Test
bindServiceShouldCallOnServiceConnectedWhenNotPaused()112     public void bindServiceShouldCallOnServiceConnectedWhenNotPaused() {
113         Robolectric.pauseMainLooper();
114         ComponentName expectedComponentName = new ComponentName("", "");
115         NullBinder expectedBinder = new NullBinder();
116         Robolectric.shadowOf(Robolectric.application).setComponentNameAndServiceForBindService(expectedComponentName, expectedBinder);
117 
118         TestService service = new TestService();
119         assertTrue(Robolectric.application.bindService(new Intent(""), service, Context.BIND_AUTO_CREATE));
120 
121         assertNull(service.name);
122         assertNull(service.service);
123 
124         Robolectric.unPauseMainLooper();
125 
126         assertEquals(expectedComponentName, service.name);
127         assertEquals(expectedBinder, service.service);
128     }
129 
130     @Test
unbindServiceShouldCallOnServiceDisconnectedWhenNotPaused()131     public void unbindServiceShouldCallOnServiceDisconnectedWhenNotPaused() {
132         TestService service = new TestService();
133         ComponentName expectedComponentName = new ComponentName("", "");
134         NullBinder expectedBinder = new NullBinder();
135         Robolectric.shadowOf(Robolectric.application).setComponentNameAndServiceForBindService(expectedComponentName, expectedBinder);
136         Robolectric.application.bindService(new Intent(""), service, Context.BIND_AUTO_CREATE);
137         Robolectric.pauseMainLooper();
138 
139         Robolectric.application.unbindService(service);
140         assertNull(service.nameUnbound);
141         Robolectric.unPauseMainLooper();
142         assertEquals(expectedComponentName, service.nameUnbound);
143     }
144 
145     @Test
unbindServiceAddsEntryToUnboundServicesCollection()146     public void unbindServiceAddsEntryToUnboundServicesCollection() {
147         TestService service = new TestService();
148         ComponentName expectedComponentName = new ComponentName("", "");
149         NullBinder expectedBinder = new NullBinder();
150         final ShadowApplication shadowApplication = Robolectric.shadowOf(Robolectric.application);
151         shadowApplication.setComponentNameAndServiceForBindService(expectedComponentName, expectedBinder);
152         Robolectric.application.bindService(new Intent(""), service, Context.BIND_AUTO_CREATE);
153         Robolectric.application.unbindService(service);
154         assertEquals(1, shadowApplication.getUnboundServiceConnections().size());
155         assertEquals(service, shadowApplication.getUnboundServiceConnections().get(0));
156     }
157 
158     @Test
declaringServiceUnbindableMakesBindServiceReturnFalse()159     public void declaringServiceUnbindableMakesBindServiceReturnFalse() {
160         Robolectric.pauseMainLooper();
161         TestService service = new TestService();
162         ComponentName expectedComponentName = new ComponentName("", "");
163         NullBinder expectedBinder = new NullBinder();
164         final ShadowApplication shadowApplication = Robolectric.shadowOf(Robolectric.application);
165         shadowApplication.setComponentNameAndServiceForBindService(expectedComponentName, expectedBinder);
166         shadowApplication.declareActionUnbindable("refuseToBind");
167         assertFalse(Robolectric.application.bindService(new Intent("refuseToBind"), service, Context.BIND_AUTO_CREATE));
168         Robolectric.unPauseMainLooper();
169         assertNull(service.name);
170         assertNull(service.service);
171         assertNull(shadowApplication.peekNextStartedService());
172     }
173 
174     @Test
shouldHaveStoppedServiceIntentAndIndicateServiceWasntRunning()175     public void shouldHaveStoppedServiceIntentAndIndicateServiceWasntRunning() {
176         ShadowApplication shadowApplication = Robolectric.shadowOf(Robolectric.application);
177 
178         Activity activity = new Activity();
179 
180         Intent intent = getSomeActionIntent("some.action");
181 
182         boolean wasRunning = activity.stopService(intent);
183 
184         assertFalse(wasRunning);
185         assertEquals(intent, shadowApplication.getNextStoppedService());
186     }
187 
getSomeActionIntent(String action)188     private Intent getSomeActionIntent(String action) {
189         Intent intent = new Intent();
190         intent.setAction(action);
191         return intent;
192     }
193 
194     @Test
shouldHaveStoppedServiceIntentAndIndicateServiceWasRunning()195     public void shouldHaveStoppedServiceIntentAndIndicateServiceWasRunning() {
196         ShadowApplication shadowApplication = shadowOf(Robolectric.application);
197 
198         Activity activity = new Activity();
199 
200         Intent intent = getSomeActionIntent("some.action");
201 
202         activity.startService(intent);
203 
204         boolean wasRunning = activity.stopService(intent);
205 
206         assertTrue(wasRunning);
207         assertEquals(intent, shadowApplication.getNextStoppedService());
208     }
209 
210     @Test
shouldClearStartedServiceIntents()211     public void shouldClearStartedServiceIntents() {
212         ShadowApplication shadowApplication = shadowOf(Robolectric.application);
213         shadowApplication.startService(getSomeActionIntent("some.action"));
214         shadowApplication.startService(getSomeActionIntent("another.action"));
215 
216         shadowApplication.clearStartedServices();
217 
218         assertNull(shadowApplication.getNextStartedService());
219     }
220 
221     @Test(expected = IllegalStateException.class)
shouldThrowIfContainsRegisteredReceiverOfAction()222     public void shouldThrowIfContainsRegisteredReceiverOfAction() {
223         Activity activity = new Activity();
224         activity.registerReceiver(new TestBroadcastReceiver(), new IntentFilter("Foo"));
225 
226         shadowOf(Robolectric.application).assertNoBroadcastListenersOfActionRegistered(activity, "Foo");
227     }
228 
229     @Test
shouldNotThrowIfDoesNotContainsRegisteredReceiverOfAction()230     public void shouldNotThrowIfDoesNotContainsRegisteredReceiverOfAction() {
231         Activity activity = new Activity();
232         activity.registerReceiver(new TestBroadcastReceiver(), new IntentFilter("Foo"));
233 
234         shadowOf(Robolectric.application).assertNoBroadcastListenersOfActionRegistered(activity, "Bar");
235     }
236 
237     @Test
canAnswerIfReceiverIsRegisteredForIntent()238     public void canAnswerIfReceiverIsRegisteredForIntent() throws Exception {
239         BroadcastReceiver expectedReceiver = new TestBroadcastReceiver();
240         ShadowApplication shadowApplication = shadowOf(Robolectric.application);
241         assertFalse(shadowApplication.hasReceiverForIntent(new Intent("Foo")));
242         Robolectric.application.registerReceiver(expectedReceiver, new IntentFilter("Foo"));
243 
244         assertTrue(shadowApplication.hasReceiverForIntent(new Intent("Foo")));
245     }
246 
247     @Test
canFindAllReceiversForAnIntent()248     public void canFindAllReceiversForAnIntent() throws Exception {
249         BroadcastReceiver expectedReceiver = new TestBroadcastReceiver();
250         ShadowApplication shadowApplication = shadowOf(Robolectric.application);
251         assertFalse(shadowApplication.hasReceiverForIntent(new Intent("Foo")));
252         Robolectric.application.registerReceiver(expectedReceiver, new IntentFilter("Foo"));
253         Robolectric.application.registerReceiver(expectedReceiver, new IntentFilter("Foo"));
254 
255         assertTrue(shadowApplication.getReceiversForIntent(new Intent("Foo")).size() == 2);
256     }
257 
258     @Test
broadcasts_shouldBeLogged()259     public void broadcasts_shouldBeLogged() {
260         Intent broadcastIntent = new Intent("foo");
261         Robolectric.application.sendBroadcast(broadcastIntent);
262 
263         List<Intent> broadcastIntents = shadowOf(Robolectric.application).getBroadcastIntents();
264         assertTrue(broadcastIntents.size() == 1);
265         assertEquals(broadcastIntent, broadcastIntents.get(0));
266     }
267 
268     private static class NullBinder implements IBinder {
269         @Override
getInterfaceDescriptor()270         public String getInterfaceDescriptor() throws RemoteException {
271             return null;
272         }
273 
274         @Override
pingBinder()275         public boolean pingBinder() {
276             return false;
277         }
278 
279         @Override
isBinderAlive()280         public boolean isBinderAlive() {
281             return false;
282         }
283 
284         @Override
queryLocalInterface(String descriptor)285         public IInterface queryLocalInterface(String descriptor) {
286             return null;
287         }
288 
289         @Override
dump(FileDescriptor fd, String[] args)290         public void dump(FileDescriptor fd, String[] args) throws RemoteException {
291         }
292 
293         @Override
transact(int code, Parcel data, Parcel reply, int flags)294         public boolean transact(int code, Parcel data, Parcel reply, int flags) throws RemoteException {
295             return false;
296         }
297 
298         @Override
linkToDeath(DeathRecipient recipient, int flags)299         public void linkToDeath(DeathRecipient recipient, int flags) throws RemoteException {
300         }
301 
302         @Override
unlinkToDeath(DeathRecipient recipient, int flags)303         public boolean unlinkToDeath(DeathRecipient recipient, int flags) {
304             return false;
305         }
306 
307         @Override
dumpAsync(FileDescriptor fd, String[] args)308         public void dumpAsync(FileDescriptor fd, String[] args) throws RemoteException {
309         }
310     }
311 }
312