blob: 65a8cc91adc7df2a1eb030388dd1d9b9593f2eee [file] [log] [blame]
package org.robolectric.android.internal;
import static com.google.common.truth.Truth.assertThat;
import static org.robolectric.Shadows.shadowOf;
import static org.robolectric.android.internal.AndroidEnvironment.registerBroadcastReceivers;
import android.app.Application;
import androidx.test.core.app.ApplicationProvider;
import androidx.test.ext.junit.runners.AndroidJUnit4;
import com.google.common.base.Charsets;
import com.google.common.io.Files;
import java.io.File;
import java.io.IOException;
import java.util.List;
import org.junit.Rule;
import org.junit.Test;
import org.junit.rules.TemporaryFolder;
import org.junit.runner.RunWith;
import org.robolectric.FakeApp;
import org.robolectric.RuntimeEnvironment;
import org.robolectric.TestFakeApp;
import org.robolectric.annotation.Config;
import org.robolectric.manifest.AndroidManifest;
import org.robolectric.shadows.ShadowApplication;
import org.robolectric.shadows.testing.TestApplication;
@RunWith(AndroidJUnit4.class)
public class AndroidEnvironmentCreateApplicationTest {
@Rule public TemporaryFolder temporaryFolder = new TemporaryFolder();
@Test(expected = RuntimeException.class)
public void shouldThrowWhenManifestContainsBadApplicationClassName() throws Exception {
AndroidEnvironment.createApplication(
newConfigWith("<application android:name=\"org.robolectric.BogusTestApplication\"/>)"),
null);
}
@Test
public void shouldReturnDefaultAndroidApplicationWhenManifestDeclaresNoAppName()
throws Exception {
Application application = AndroidEnvironment.createApplication(newConfigWith(""), null);
assertThat(application.getClass()).isEqualTo(Application.class);
}
@Test
public void shouldReturnSpecifiedApplicationWhenManifestDeclaresAppName() throws Exception {
Application application =
AndroidEnvironment.createApplication(
newConfigWith(
"<application android:name=\"org.robolectric.shadows.testing.TestApplication\"/>"),
null);
assertThat(application.getClass()).isEqualTo(TestApplication.class);
}
@Test
public void shouldAssignThePackageNameFromTheManifest() throws Exception {
Application application = ApplicationProvider.getApplicationContext();
assertThat(application.getPackageName()).isEqualTo("org.robolectric");
assertThat(application.getClass()).isEqualTo(TestApplication.class);
}
@Test
public void shouldRegisterReceiversFromTheManifest() throws Exception {
// gross:
shadowOf((Application) ApplicationProvider.getApplicationContext())
.getRegisteredReceivers()
.clear();
AndroidManifest appManifest =
newConfigWith(
"<application>"
+ " <receiver android:name=\"org.robolectric.fakes.ConfigTestReceiver\">"
+ " <intent-filter>\n"
+ " <action android:name=\"org.robolectric.ACTION_SUPERSET_PACKAGE\"/>\n"
+ " </intent-filter>"
+ " </receiver>"
+ "</application>");
Application application = AndroidEnvironment.createApplication(appManifest, null);
shadowOf(application).callAttach(RuntimeEnvironment.systemContext);
registerBroadcastReceivers(application, appManifest);
List<ShadowApplication.Wrapper> receivers = shadowOf(application).getRegisteredReceivers();
assertThat(receivers).hasSize(1);
assertThat(receivers.get(0).intentFilter.matchAction("org.robolectric.ACTION_SUPERSET_PACKAGE"))
.isTrue();
}
@Test
public void shouldDoTestApplicationNameTransform() throws Exception {
assertThat(AndroidEnvironment.getTestApplicationName(".Applicationz"))
.isEqualTo(".TestApplicationz");
assertThat(AndroidEnvironment.getTestApplicationName("Applicationz"))
.isEqualTo("TestApplicationz");
assertThat(AndroidEnvironment.getTestApplicationName("com.foo.Applicationz"))
.isEqualTo("com.foo.TestApplicationz");
}
@Test
public void shouldLoadConfigApplicationIfSpecified() throws Exception {
Application application =
AndroidEnvironment.createApplication(
newConfigWith("<application android:name=\"" + "ClassNameToIgnore" + "\"/>"),
new Config.Builder().setApplication(TestFakeApp.class).build());
assertThat(application.getClass()).isEqualTo(TestFakeApp.class);
}
@Test
public void shouldLoadConfigInnerClassApplication() throws Exception {
Application application =
AndroidEnvironment.createApplication(
newConfigWith("<application android:name=\"" + "ClassNameToIgnore" + "\"/>"),
new Config.Builder().setApplication(TestFakeAppInner.class).build());
assertThat(application.getClass()).isEqualTo(TestFakeAppInner.class);
}
@Test
public void shouldLoadTestApplicationIfClassIsPresent() throws Exception {
Application application =
AndroidEnvironment.createApplication(
newConfigWith("<application android:name=\"" + FakeApp.class.getName() + "\"/>"), null);
assertThat(application.getClass()).isEqualTo(TestFakeApp.class);
}
@Test
public void whenNoAppManifestPresent_shouldCreateGenericApplication() throws Exception {
Application application = AndroidEnvironment.createApplication(null, null);
assertThat(application.getClass()).isEqualTo(Application.class);
}
/////////////////////////////
public AndroidManifest newConfigWith(String contents) throws IOException {
return newConfigWith("org.robolectric", contents);
}
private AndroidManifest newConfigWith(String packageName, String contents) throws IOException {
String fileContents =
"<?xml version=\"1.0\" encoding=\"utf-8\"?>\n"
+ "<manifest xmlns:android=\"http://schemas.android.com/apk/res/android\"\n"
+ " package=\""
+ packageName
+ "\">\n"
+ " "
+ contents
+ "\n"
+ "</manifest>\n";
File f = temporaryFolder.newFile("whatever.xml");
Files.asCharSink(f, Charsets.UTF_8).write(fileContents);
return new AndroidManifest(f.toPath(), null, null);
}
public static class TestFakeAppInner extends Application {}
}