blob: d44aab95a69f6f60e62dcd2533a775388b302362 [file] [log] [blame]
package org.robolectric.internal;
import org.junit.After;
import org.junit.Before;
import org.junit.Rule;
import org.junit.Test;
import org.junit.rules.ExpectedException;
import org.robolectric.annotation.Config;
import org.robolectric.gradleapp.BuildConfig;
import org.robolectric.manifest.AndroidManifest;
import org.robolectric.res.FileFsFile;
import org.robolectric.res.FsFile;
import java.io.File;
import java.io.IOException;
import static org.assertj.core.api.Assertions.assertThat;
import static org.robolectric.util.TestUtil.joinPath;
import static org.robolectric.util.TestUtil.newFile;
public class GradleManifestFactoryTest {
@Rule
public ExpectedException exception = ExpectedException.none();
private GradleManifestFactory factory;
private Config.Builder configBuilder;
@Before
public void setup() {
FileFsFile.from("build", "intermediates", "res").getFile().mkdirs();
FileFsFile.from("build", "intermediates", "assets").getFile().mkdirs();
FileFsFile.from("build", "intermediates", "manifests", "full").getFile().mkdirs();
FileFsFile.from("custom_build", "intermediates", "res").getFile().mkdirs();
FileFsFile.from("custom_build", "intermediates", "assets").getFile().mkdirs();
FileFsFile.from("custom_build", "intermediates", "manifests").getFile().mkdirs();
configBuilder = Config.Builder.defaults();
factory = new GradleManifestFactory();
}
@After
public void teardown() throws IOException {
delete(FileFsFile.from("build", "intermediates", "res").getFile());
delete(FileFsFile.from("build", "intermediates", "assets").getFile());
delete(FileFsFile.from("build", "intermediates", "manifests", "full").getFile());
delete(FileFsFile.from("build", "intermediates", "manifests", "aapt").getFile());
delete(FileFsFile.from("build", "intermediates", "res", "merged").getFile());
delete(FileFsFile.from("custom_build", "intermediates", "res").getFile());
delete(FileFsFile.from("custom_build", "intermediates", "assets").getFile());
delete(FileFsFile.from("custom_build", "intermediates", "manifests").getFile());
}
@Test
public void getAppManifest_withOverriddenConfigAssetDir_shouldCreateManifest() throws Exception {
final AndroidManifest manifest = createManifest(
configBuilder.setConstants(BuildConfig.class)
.setAssetDir("../../src/test/resources/assets")
.build());
assertThat(manifest.getPackageName()).isEqualTo("org.robolectric.gradleapp");
assertThat(manifest.getResDirectory()).isEqualTo(file("build/intermediates/res/flavor1/type1"));
assertThat(manifest.getAssetsDirectory()).isEqualTo(file("build/intermediates/../../src/test/resources/assets"));
assertThat(manifest.getAndroidManifestFile()).isEqualTo(file("build/intermediates/manifests/full/flavor1/type1/AndroidManifest.xml"));
}
@Test
public void getAppManifest_withOverriddenConfigManifest_shouldCreateManifest() throws Exception {
final AndroidManifest manifest = createManifest(
configBuilder.setConstants(BuildConfig.class)
.setManifest("TestAndroidManifest.xml")
.build());
assertThat(manifest.getAndroidManifestFile().getPath()).isEqualTo(
getClass().getClassLoader().getResource("TestAndroidManifest.xml").getPath());
assertThat(manifest.getPackageName()).isEqualTo("org.robolectric.gradleapp");
assertThat(manifest.getResDirectory()).isEqualTo(file("build/intermediates/res/flavor1/type1"));
assertThat(manifest.getAssetsDirectory()).isEqualTo(file("build/intermediates/assets/flavor1/type1"));
}
@Test
public void getAppManifest_forApplications_shouldCreateManifest() throws Exception {
final AndroidManifest manifest = createManifest(
configBuilder.setConstants(BuildConfig.class).build());
assertThat(manifest.getPackageName()).isEqualTo("org.robolectric.gradleapp");
assertThat(manifest.getResDirectory()).isEqualTo(file("build/intermediates/res/flavor1/type1"));
assertThat(manifest.getAssetsDirectory()).isEqualTo(file("build/intermediates/assets/flavor1/type1"));
assertThat(manifest.getAndroidManifestFile()).isEqualTo(file("build/intermediates/manifests/full/flavor1/type1/AndroidManifest.xml"));
}
@Test
public void getAppManifest_forLibraries_shouldCreateManifest() throws Exception {
delete(FileFsFile.from("build", "intermediates", "res").getFile());
delete(FileFsFile.from("build", "intermediates", "assets").getFile());
delete(FileFsFile.from("build", "intermediates", "manifests", "full").getFile());
final AndroidManifest manifest = createManifest(
configBuilder.setConstants(BuildConfig.class).build());
assertThat(manifest.getPackageName()).isEqualTo("org.robolectric.gradleapp");
assertThat(manifest.getResDirectory()).isEqualTo(file("build/intermediates/bundles/flavor1/type1/res"));
assertThat(manifest.getAssetsDirectory()).isEqualTo(file("build/intermediates/bundles/flavor1/type1/assets"));
assertThat(manifest.getAndroidManifestFile()).isEqualTo(file("build/intermediates/bundles/flavor1/type1/AndroidManifest.xml"));
}
@Test
public void getAppManifest_forAaptLibraries_shouldCreateManifest() throws Exception {
delete(FileFsFile.from("build", "intermediates", "res").getFile());
delete(FileFsFile.from("build", "intermediates", "assets").getFile());
delete(FileFsFile.from("build", "intermediates", "manifests", "full").getFile());
FileFsFile.from("build", "intermediates", "manifests", "aapt").getFile().mkdirs();
final AndroidManifest manifest = createManifest(
configBuilder.setConstants(BuildConfig.class).build());
assertThat(manifest.getPackageName()).isEqualTo("org.robolectric.gradleapp");
assertThat(manifest.getResDirectory()).isEqualTo(file("build/intermediates/bundles/flavor1/type1/res"));
assertThat(manifest.getAssetsDirectory()).isEqualTo(file("build/intermediates/bundles/flavor1/type1/assets"));
assertThat(manifest.getAndroidManifestFile()).isEqualTo(file("build/intermediates/manifests/aapt/flavor1/type1/AndroidManifest.xml"));
}
@Test
public void getAppManifest_shouldCreateManifestWithMethodOverrides() throws Exception {
final AndroidManifest manifest = createManifest(
configBuilder.setConstants(BuildConfigOverride.class).build());
assertThat(manifest.getResDirectory()).isEqualTo(file("build/intermediates/res/flavor2/type2"));
assertThat(manifest.getAssetsDirectory()).isEqualTo(file("build/intermediates/assets/flavor2/type2"));
assertThat(manifest.getAndroidManifestFile()).isEqualTo(file("build/intermediates/manifests/full/flavor2/type2/AndroidManifest.xml"));
}
@Test
public void getAppManifest_withBuildDirOverride_shouldCreateManifest() throws Exception {
final AndroidManifest manifest = createManifest(
configBuilder.setConstants(BuildConfig.class).setBuildDir("custom_build").build());
assertThat(manifest.getPackageName()).isEqualTo("org.robolectric.gradleapp");
assertThat(manifest.getResDirectory()).isEqualTo(file("custom_build/intermediates/res/flavor1/type1"));
assertThat(manifest.getAssetsDirectory()).isEqualTo(file("custom_build/intermediates/assets/flavor1/type1"));
assertThat(manifest.getAndroidManifestFile()).isEqualTo(file("custom_build/intermediates/bundles/flavor1/type1/AndroidManifest.xml"));
}
@Test
public void getAppManifest_withPackageNameOverride_shouldCreateManifest() throws Exception {
final AndroidManifest manifest = createManifest(
configBuilder.setConstants(BuildConfig.class).setPackageName("fake.package.name").build());
assertThat(manifest.getPackageName()).isEqualTo("fake.package.name");
assertThat(manifest.getResDirectory()).isEqualTo(file("build/intermediates/res/flavor1/type1"));
assertThat(manifest.getAssetsDirectory()).isEqualTo(file("build/intermediates/assets/flavor1/type1"));
assertThat(manifest.getAndroidManifestFile()).isEqualTo(file("build/intermediates/manifests/full/flavor1/type1/AndroidManifest.xml"));
}
@Test
public void getAppManifest_withAbiSplitOverride_shouldCreateManifest() throws Exception {
final AndroidManifest manifest = createManifest(
configBuilder.setConstants(BuildConfig.class).setAbiSplit("armeabi").build());
assertThat(manifest.getPackageName()).isEqualTo("org.robolectric.gradleapp");
assertThat(manifest.getResDirectory()).isEqualTo(file("build/intermediates/res/flavor1/type1"));
assertThat(manifest.getAssetsDirectory()).isEqualTo(file("build/intermediates/assets/flavor1/type1"));
assertThat(manifest.getAndroidManifestFile()).isEqualTo(file("build/intermediates/manifests/full/flavor1/armeabi/type1/AndroidManifest.xml"));
}
@Test
public void getAppManifest_withMergedResources_shouldHaveMergedResPath() throws Exception {
FileFsFile.from("build", "intermediates", "res", "merged").getFile().mkdirs();
final AndroidManifest manifest = createManifest(
configBuilder.setConstants(BuildConfig.class).setPackageName("fake.package.name").build());
assertThat(manifest.getPackageName()).isEqualTo("fake.package.name");
assertThat(manifest.getResDirectory()).isEqualTo(file("build/intermediates/res/merged/flavor1/type1"));
assertThat(manifest.getAssetsDirectory()).isEqualTo(file("build/intermediates/assets/flavor1/type1"));
assertThat(manifest.getAndroidManifestFile()).isEqualTo(file("build/intermediates/manifests/full/flavor1/type1/AndroidManifest.xml"));
}
@Test
public void rClassShouldBeInTheSamePackageAsBuildConfig() throws Exception {
File manifestFile = new File(
joinPath("build", "intermediates", "manifests", "full",
org.robolectric.gradleapp.BuildConfig.FLAVOR,
org.robolectric.gradleapp.BuildConfig.BUILD_TYPE),
"AndroidManifest.xml");
manifestFile.getParentFile().mkdirs();
newFile(manifestFile, "<manifest package=\"something\"/>");
AndroidManifest manifest = createManifest(
configBuilder.setConstants(BuildConfig.class).build());
assertThat(manifest.getRClass().getPackage().getName()).isEqualTo("org.robolectric.gradleapp");
}
@Test public void identify() throws Exception {
ManifestIdentifier manifestIdentifier = factory.identify(
configBuilder.setConstants(BuildConfig.class).build());
assertThat(manifestIdentifier.getManifestFile().toString())
.isEqualTo("build/intermediates/manifests/full/flavor1/type1/AndroidManifest.xml");
assertThat(manifestIdentifier.getResDir().toString())
.isEqualTo("build/intermediates/res/flavor1/type1");
}
////////////////////////////////
private AndroidManifest createManifest(Config config) {
return factory.create(factory.identify(config));
}
private static FsFile file(String path) {
return FileFsFile.from(path);
}
private void delete(File file) {
final File[] files = file.listFiles();
if (files != null) {
for (File each : files) {
delete(each);
}
}
file.delete();
}
public static class BuildConfigOverride {
public static final String APPLICATION_ID = "org.sandwich.bar";
public static final String BUILD_TYPE = "type2";
public static final String FLAVOR = "flavor2";
}
}