package com.xtremelabs.robolectric.shadows; import android.app.Activity; import android.app.Application; import android.content.BroadcastReceiver; import android.content.ComponentName; import android.content.Context; import android.content.ContextWrapper; import android.content.Intent; import android.content.IntentFilter; import android.os.IBinder; import android.os.IInterface; import android.os.Parcel; import android.os.RemoteException; import com.xtremelabs.robolectric.ApplicationResolver; import com.xtremelabs.robolectric.R; import com.xtremelabs.robolectric.Robolectric; import com.xtremelabs.robolectric.WithTestDefaultsRunner; import com.xtremelabs.robolectric.res.ResourceLoader; import com.xtremelabs.robolectric.res.StringResourceLoader; import com.xtremelabs.robolectric.util.TestBroadcastReceiver; import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; import java.io.FileDescriptor; import java.util.List; import static com.xtremelabs.robolectric.Robolectric.shadowOf; import static com.xtremelabs.robolectric.util.TestUtil.newConfig; import static junit.framework.Assert.assertEquals; import static junit.framework.Assert.assertTrue; import static org.hamcrest.CoreMatchers.sameInstance; import static org.hamcrest.core.IsInstanceOf.instanceOf; import static org.junit.Assert.assertFalse; import static org.junit.Assert.assertNull; import static org.junit.Assert.assertThat; import static org.mockito.Mockito.mock; import static org.mockito.Mockito.when; @RunWith(WithTestDefaultsRunner.class) public class ApplicationTest { @Before public void setUp() throws Exception { Robolectric.application = new Application(); } @Test public void shouldBeAContext() throws Exception { assertThat(new Activity().getApplication(), sameInstance(Robolectric.application)); assertThat(new Activity().getApplication().getApplicationContext(), sameInstance((Context) Robolectric.application)); } @Test public void shouldBeBindableToAResourceLoader() throws Exception { ResourceLoader resourceLoader1 = new ResourceLoader(mock(StringResourceLoader.class)) { }; when(resourceLoader1.getStringValue(R.id.title)).thenReturn("title from resourceLoader1"); Application app1 = ShadowApplication.bind(new Application(), resourceLoader1); ResourceLoader resourceLoader2 = new ResourceLoader(mock(StringResourceLoader.class)) { }; when(resourceLoader2.getStringValue(R.id.title)).thenReturn("title from resourceLoader2"); Application app2 = ShadowApplication.bind(new Application(), resourceLoader2); assertEquals("title from resourceLoader1", new ContextWrapper(app1).getResources().getString(R.id.title)); assertEquals("title from resourceLoader2", new ContextWrapper(app2).getResources().getString(R.id.title)); } @Test public void shouldProvideServices() throws Exception { checkSystemService(Context.LAYOUT_INFLATER_SERVICE, android.view.LayoutInflater.class); checkSystemService(Context.ACTIVITY_SERVICE, android.app.ActivityManager.class); checkSystemService(Context.POWER_SERVICE, android.os.PowerManager.class); checkSystemService(Context.ALARM_SERVICE, android.app.AlarmManager.class); checkSystemService(Context.NOTIFICATION_SERVICE, android.app.NotificationManager.class); checkSystemService(Context.KEYGUARD_SERVICE, android.app.KeyguardManager.class); checkSystemService(Context.LOCATION_SERVICE, android.location.LocationManager.class); checkSystemService(Context.SEARCH_SERVICE, android.app.SearchManager.class); checkSystemService(Context.SENSOR_SERVICE, android.hardware.TestSensorManager.class); checkSystemService(Context.STORAGE_SERVICE, android.os.storage.StorageManager.class); checkSystemService(Context.VIBRATOR_SERVICE, android.os.TestVibrator.class); // checkSystemService(Context.CONNECTIVITY_SERVICE, android.net.ConnectivityManager.class); // checkSystemService(Context.WIFI_SERVICE, android.net.wifi.WifiManager.class); // checkSystemService(Context.AUDIO_SERVICE, android.media.AudioManager.class); // checkSystemService(Context.TELEPHONY_SERVICE, android.telephony.TelephonyManager.class); // checkSystemService(Context.INPUT_METHOD_SERVICE, android.view.inputmethod.InputMethodManager.class); // checkSystemService(Context.UI_MODE_SERVICE, android.app.UiModeManager.class); // checkSystemService(Context.DOWNLOAD_SERVICE, android.app.DownloadManager.class); } private void checkSystemService(String name, Class expectedClass) { Object systemService = Robolectric.application.getSystemService(name); assertThat(systemService, instanceOf(expectedClass)); assertThat(systemService, sameInstance(Robolectric.application.getSystemService(name))); } @Test public void packageManager_shouldKnowPackageName() throws Exception { Application application = new ApplicationResolver(newConfig("TestAndroidManifestWithPackageName.xml")).resolveApplication(); assertEquals("com.wacka.wa", application.getPackageManager().getPackageInfo("com.wacka.wa", 0).packageName); } @Test public void packageManager_shouldKnowApplicationName() throws Exception { Application application = new ApplicationResolver(newConfig("TestAndroidManifestWithAppName.xml")).resolveApplication(); assertEquals("com.xtremelabs.robolectric.TestApplication", application.getPackageManager().getApplicationInfo("com.xtremelabs.robolectric", 0).name); } @Test public void bindServiceShouldCallOnServiceConnectedWhenNotPaused() { Robolectric.pauseMainLooper(); ComponentName expectedComponentName = new ComponentName("", ""); NullBinder expectedBinder = new NullBinder(); Robolectric.shadowOf(Robolectric.application).setComponentNameAndServiceForBindService(expectedComponentName, expectedBinder); TestService service = new TestService(); assertTrue(Robolectric.application.bindService(new Intent(""), service, Context.BIND_AUTO_CREATE)); assertNull(service.name); assertNull(service.service); Robolectric.unPauseMainLooper(); assertEquals(expectedComponentName, service.name); assertEquals(expectedBinder, service.service); } @Test public void unbindServiceShouldCallOnServiceDisconnectedWhenNotPaused() { TestService service = new TestService(); ComponentName expectedComponentName = new ComponentName("", ""); NullBinder expectedBinder = new NullBinder(); Robolectric.shadowOf(Robolectric.application).setComponentNameAndServiceForBindService(expectedComponentName, expectedBinder); Robolectric.application.bindService(new Intent(""), service, Context.BIND_AUTO_CREATE); Robolectric.pauseMainLooper(); Robolectric.application.unbindService(service); assertNull(service.nameUnbound); Robolectric.unPauseMainLooper(); assertEquals(expectedComponentName, service.nameUnbound); } @Test public void unbindServiceAddsEntryToUnboundServicesCollection() { TestService service = new TestService(); ComponentName expectedComponentName = new ComponentName("", ""); NullBinder expectedBinder = new NullBinder(); final ShadowApplication shadowApplication = Robolectric.shadowOf(Robolectric.application); shadowApplication.setComponentNameAndServiceForBindService(expectedComponentName, expectedBinder); Robolectric.application.bindService(new Intent(""), service, Context.BIND_AUTO_CREATE); Robolectric.application.unbindService(service); assertEquals(1, shadowApplication.getUnboundServiceConnections().size()); assertEquals(service, shadowApplication.getUnboundServiceConnections().get(0)); } @Test public void declaringServiceUnbindableMakesBindServiceReturnFalse() { Robolectric.pauseMainLooper(); TestService service = new TestService(); ComponentName expectedComponentName = new ComponentName("", ""); NullBinder expectedBinder = new NullBinder(); final ShadowApplication shadowApplication = Robolectric.shadowOf(Robolectric.application); shadowApplication.setComponentNameAndServiceForBindService(expectedComponentName, expectedBinder); shadowApplication.declareActionUnbindable("refuseToBind"); assertFalse(Robolectric.application.bindService(new Intent("refuseToBind"), service, Context.BIND_AUTO_CREATE)); Robolectric.unPauseMainLooper(); assertNull(service.name); assertNull(service.service); assertNull(shadowApplication.peekNextStartedService()); } @Test public void shouldHaveStoppedServiceIntentAndIndicateServiceWasntRunning() { ShadowApplication shadowApplication = Robolectric.shadowOf(Robolectric.application); Activity activity = new Activity(); Intent intent = getSomeActionIntent("some.action"); boolean wasRunning = activity.stopService(intent); assertFalse(wasRunning); assertEquals(intent, shadowApplication.getNextStoppedService()); } private Intent getSomeActionIntent(String action) { Intent intent = new Intent(); intent.setAction(action); return intent; } @Test public void shouldHaveStoppedServiceIntentAndIndicateServiceWasRunning() { ShadowApplication shadowApplication = shadowOf(Robolectric.application); Activity activity = new Activity(); Intent intent = getSomeActionIntent("some.action"); activity.startService(intent); boolean wasRunning = activity.stopService(intent); assertTrue(wasRunning); assertEquals(intent, shadowApplication.getNextStoppedService()); } @Test public void shouldClearStartedServiceIntents() { ShadowApplication shadowApplication = shadowOf(Robolectric.application); shadowApplication.startService(getSomeActionIntent("some.action")); shadowApplication.startService(getSomeActionIntent("another.action")); shadowApplication.clearStartedServices(); assertNull(shadowApplication.getNextStartedService()); } @Test(expected = IllegalStateException.class) public void shouldThrowIfContainsRegisteredReceiverOfAction() { Activity activity = new Activity(); activity.registerReceiver(new TestBroadcastReceiver(), new IntentFilter("Foo")); shadowOf(Robolectric.application).assertNoBroadcastListenersOfActionRegistered(activity, "Foo"); } @Test public void shouldNotThrowIfDoesNotContainsRegisteredReceiverOfAction() { Activity activity = new Activity(); activity.registerReceiver(new TestBroadcastReceiver(), new IntentFilter("Foo")); shadowOf(Robolectric.application).assertNoBroadcastListenersOfActionRegistered(activity, "Bar"); } @Test public void canAnswerIfReceiverIsRegisteredForIntent() throws Exception { BroadcastReceiver expectedReceiver = new TestBroadcastReceiver(); ShadowApplication shadowApplication = shadowOf(Robolectric.application); assertFalse(shadowApplication.hasReceiverForIntent(new Intent("Foo"))); Robolectric.application.registerReceiver(expectedReceiver, new IntentFilter("Foo")); assertTrue(shadowApplication.hasReceiverForIntent(new Intent("Foo"))); } @Test public void canFindAllReceiversForAnIntent() throws Exception { BroadcastReceiver expectedReceiver = new TestBroadcastReceiver(); ShadowApplication shadowApplication = shadowOf(Robolectric.application); assertFalse(shadowApplication.hasReceiverForIntent(new Intent("Foo"))); Robolectric.application.registerReceiver(expectedReceiver, new IntentFilter("Foo")); Robolectric.application.registerReceiver(expectedReceiver, new IntentFilter("Foo")); assertTrue(shadowApplication.getReceiversForIntent(new Intent("Foo")).size() == 2); } @Test public void broadcasts_shouldBeLogged() { Intent broadcastIntent = new Intent("foo"); Robolectric.application.sendBroadcast(broadcastIntent); List broadcastIntents = shadowOf(Robolectric.application).getBroadcastIntents(); assertTrue(broadcastIntents.size() == 1); assertEquals(broadcastIntent, broadcastIntents.get(0)); } private static class NullBinder implements IBinder { @Override public String getInterfaceDescriptor() throws RemoteException { return null; } @Override public boolean pingBinder() { return false; } @Override public boolean isBinderAlive() { return false; } @Override public IInterface queryLocalInterface(String descriptor) { return null; } @Override public void dump(FileDescriptor fd, String[] args) throws RemoteException { } @Override public boolean transact(int code, Parcel data, Parcel reply, int flags) throws RemoteException { return false; } @Override public void linkToDeath(DeathRecipient recipient, int flags) throws RemoteException { } @Override public boolean unlinkToDeath(DeathRecipient recipient, int flags) { return false; } @Override public void dumpAsync(FileDescriptor fd, String[] args) throws RemoteException { } } }