blob: c65a381c6160f401951d66061c07e30ea253b9f8 [file] [log] [blame]
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<Intent> 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 {
}
}
}