1 package org.robolectric.internal; 2 3 import static org.assertj.core.api.Assertions.assertThat; 4 5 import com.google.common.base.Charsets; 6 import com.google.common.io.Files; 7 import java.io.File; 8 import java.io.IOException; 9 import org.junit.After; 10 import org.junit.Before; 11 import org.junit.Rule; 12 import org.junit.Test; 13 import org.junit.rules.ExpectedException; 14 import org.junit.runner.RunWith; 15 import org.junit.runners.JUnit4; 16 import org.robolectric.RobolectricTestRunner; 17 import org.robolectric.annotation.Config; 18 import org.robolectric.gradleapp.BuildConfig; 19 import org.robolectric.manifest.AndroidManifest; 20 import org.robolectric.res.FileFsFile; 21 import org.robolectric.res.FsFile; 22 23 @RunWith(JUnit4.class) 24 public class GradleManifestFactoryTest { 25 @Rule 26 public ExpectedException exception = ExpectedException.none(); 27 private GradleManifestFactory factory; 28 private Config.Builder configBuilder; 29 30 @Before 31 public void setup() { 32 FileFsFile.from("build", "intermediates", "res").getFile().mkdirs(); 33 FileFsFile.from("build", "intermediates", "assets").getFile().mkdirs(); 34 FileFsFile.from("build", "intermediates", "manifests", "full").getFile().mkdirs(); 35 36 FileFsFile.from("custom_build", "intermediates", "res").getFile().mkdirs(); 37 FileFsFile.from("custom_build", "intermediates", "assets").getFile().mkdirs(); 38 FileFsFile.from("custom_build", "intermediates", "manifests").getFile().mkdirs(); 39 40 configBuilder = Config.Builder.defaults(); 41 factory = new GradleManifestFactory(); 42 } 43 44 @After 45 public void teardown() throws IOException { 46 delete(FileFsFile.from("build", "intermediates", "res").getFile()); 47 delete(FileFsFile.from("build", "intermediates", "assets").getFile()); 48 delete(FileFsFile.from("build", "intermediates", "manifests", "full").getFile()); 49 delete(FileFsFile.from("build", "intermediates", "manifests", "aapt").getFile()); 50 delete(FileFsFile.from("build", "intermediates", "res", "merged").getFile()); 51 52 delete(FileFsFile.from("custom_build", "intermediates", "res").getFile()); 53 delete(FileFsFile.from("custom_build", "intermediates", "assets").getFile()); 54 delete(FileFsFile.from("custom_build", "intermediates", "manifests").getFile()); 55 } 56 57 @Test 58 public void getAppManifest_withOverriddenConfigAssetDir_shouldCreateManifest() throws Exception { 59 final AndroidManifest manifest = createManifest( 60 configBuilder.setConstants(BuildConfig.class) 61 .setAssetDir("../../src/test/resources/assets") 62 .setManifest("GradleManifest.xml") 63 .build()); 64 65 assertThat(manifest.getPackageName()).isEqualTo("org.robolectric.gradleapp"); 66 assertThat(manifest.getResDirectory()).isEqualTo(file("build/intermediates/res/flavor1/type1")); 67 assertThat(manifest.getAssetsDirectory()).isEqualTo(file("build/intermediates/../../src/test/resources/assets")); 68 assertThat(manifest.getAndroidManifestFile()).isEqualTo(file("build/intermediates/manifests/full/flavor1/type1/GradleManifest.xml")); 69 } 70 71 @Test 72 public void getAppManifest_withOverriddenConfigManifest_shouldCreateManifest() throws Exception { 73 final AndroidManifest manifest = createManifest( 74 configBuilder.setConstants(BuildConfig.class) 75 .setManifest("TestAndroidManifest.xml") 76 .build()); 77 78 assertThat(manifest.getAndroidManifestFile().getPath()).isEqualTo( 79 getClass().getClassLoader().getResource("TestAndroidManifest.xml").getPath()); 80 assertThat(manifest.getPackageName()).isEqualTo("org.robolectric.gradleapp"); 81 assertThat(manifest.getResDirectory()).isEqualTo(file("build/intermediates/res/flavor1/type1")); 82 assertThat(manifest.getAssetsDirectory()).isEqualTo(file("build/intermediates/assets/flavor1/type1")); 83 } 84 85 @Test 86 public void getAppManifest_forApplications_shouldCreateManifest() throws Exception { 87 final AndroidManifest manifest = createManifest( 88 configBuilder.setConstants(BuildConfig.class) 89 .setManifest("GradleManifest.xml").build()); 90 91 assertThat(manifest.getPackageName()).isEqualTo("org.robolectric.gradleapp"); 92 assertThat(manifest.getResDirectory()).isEqualTo(file("build/intermediates/res/flavor1/type1")); 93 assertThat(manifest.getAssetsDirectory()).isEqualTo(file("build/intermediates/assets/flavor1/type1")); 94 assertThat(manifest.getAndroidManifestFile()).isEqualTo(file("build/intermediates/manifests/full/flavor1/type1/GradleManifest.xml")); 95 } 96 97 @Test 98 public void getAppManifest_forLibraries_shouldCreateManifest() throws Exception { 99 delete(FileFsFile.from("build", "intermediates", "res").getFile()); 100 delete(FileFsFile.from("build", "intermediates", "assets").getFile()); 101 delete(FileFsFile.from("build", "intermediates", "manifests", "full").getFile()); 102 103 final AndroidManifest manifest = createManifest( 104 configBuilder.setConstants(BuildConfig.class) 105 .setManifest("GradleManifest.xml").build()); 106 107 assertThat(manifest.getPackageName()).isEqualTo("org.robolectric.gradleapp"); 108 assertThat(manifest.getResDirectory()).isEqualTo(file("build/intermediates/bundles/flavor1/type1/res")); 109 assertThat(manifest.getAssetsDirectory()).isEqualTo(file("build/intermediates/bundles/flavor1/type1/assets")); 110 assertThat(manifest.getAndroidManifestFile()).isEqualTo(file("build/intermediates/bundles/flavor1/type1/GradleManifest.xml")); 111 } 112 113 @Test 114 public void getAppManifest_forAaptLibraries_shouldCreateManifest() throws Exception { 115 delete(FileFsFile.from("build", "intermediates", "res").getFile()); 116 delete(FileFsFile.from("build", "intermediates", "assets").getFile()); 117 delete(FileFsFile.from("build", "intermediates", "manifests", "full").getFile()); 118 FileFsFile.from("build", "intermediates", "manifests", "aapt").getFile().mkdirs(); 119 120 final AndroidManifest manifest = createManifest( 121 configBuilder.setConstants(BuildConfig.class) 122 .setManifest("GradleManifest.xml").build()); 123 124 assertThat(manifest.getPackageName()).isEqualTo("org.robolectric.gradleapp"); 125 assertThat(manifest.getResDirectory()).isEqualTo(file("build/intermediates/bundles/flavor1/type1/res")); 126 assertThat(manifest.getAssetsDirectory()).isEqualTo(file("build/intermediates/bundles/flavor1/type1/assets")); 127 assertThat(manifest.getAndroidManifestFile()).isEqualTo(file("build/intermediates/manifests/aapt/flavor1/type1/GradleManifest.xml")); 128 } 129 130 @Test 131 public void getAppManifest_shouldCreateManifestWithMethodOverrides() throws Exception { 132 final AndroidManifest manifest = createManifest( 133 configBuilder.setConstants(BuildConfigOverride.class) 134 .setManifest("GradleManifest.xml").build()); 135 136 assertThat(manifest.getResDirectory()).isEqualTo(file("build/intermediates/res/flavor2/type2")); 137 assertThat(manifest.getAssetsDirectory()).isEqualTo(file("build/intermediates/assets/flavor2/type2")); 138 assertThat(manifest.getAndroidManifestFile()).isEqualTo(file("build/intermediates/manifests/full/flavor2/type2/GradleManifest.xml")); 139 } 140 141 @Test 142 public void getAppManifest_withBuildDirOverride_shouldCreateManifest() throws Exception { 143 final AndroidManifest manifest = createManifest( 144 configBuilder.setConstants(BuildConfig.class) 145 .setBuildDir("custom_build") 146 .setManifest("GradleManifest.xml").build()); 147 148 assertThat(manifest.getPackageName()).isEqualTo("org.robolectric.gradleapp"); 149 assertThat(manifest.getResDirectory()).isEqualTo(file("custom_build/intermediates/res/flavor1/type1")); 150 assertThat(manifest.getAssetsDirectory()).isEqualTo(file("custom_build/intermediates/assets/flavor1/type1")); 151 assertThat(manifest.getAndroidManifestFile()).isEqualTo(file("custom_build/intermediates/bundles/flavor1/type1/GradleManifest.xml")); 152 } 153 154 @Test 155 public void getAppManifest_withPackageNameOverride_shouldCreateManifest() throws Exception { 156 final AndroidManifest manifest = createManifest( 157 configBuilder.setConstants(BuildConfig.class) 158 .setPackageName("fake.package.name") 159 .setManifest("GradleManifest.xml").build()); 160 161 assertThat(manifest.getPackageName()).isEqualTo("fake.package.name"); 162 assertThat(manifest.getResDirectory()).isEqualTo(file("build/intermediates/res/flavor1/type1")); 163 assertThat(manifest.getAssetsDirectory()).isEqualTo(file("build/intermediates/assets/flavor1/type1")); 164 assertThat(manifest.getAndroidManifestFile()).isEqualTo(file("build/intermediates/manifests/full/flavor1/type1/GradleManifest.xml")); 165 } 166 167 @Test 168 public void getAppManifest_withAbiSplitOverride_shouldCreateManifest() throws Exception { 169 final AndroidManifest manifest = createManifest( 170 configBuilder.setConstants(BuildConfig.class) 171 .setAbiSplit("armeabi") 172 .setManifest("GradleManifest.xml").build()); 173 174 assertThat(manifest.getPackageName()).isEqualTo("org.robolectric.gradleapp"); 175 assertThat(manifest.getResDirectory()).isEqualTo(file("build/intermediates/res/flavor1/type1")); 176 assertThat(manifest.getAssetsDirectory()).isEqualTo(file("build/intermediates/assets/flavor1/type1")); 177 assertThat(manifest.getAndroidManifestFile()).isEqualTo(file("build/intermediates/manifests/full/flavor1/armeabi/type1/GradleManifest.xml")); 178 } 179 180 @Test 181 public void getAppManifest_withMergedResources_shouldHaveMergedResPath() throws Exception { 182 FileFsFile.from("build", "intermediates", "res", "merged").getFile().mkdirs(); 183 184 final AndroidManifest manifest = createManifest( 185 configBuilder.setConstants(BuildConfig.class) 186 .setPackageName("fake.package.name") 187 .setManifest("GradleManifest.xml").build()); 188 189 assertThat(manifest.getPackageName()).isEqualTo("fake.package.name"); 190 assertThat(manifest.getResDirectory()).isEqualTo(file("build/intermediates/res/merged/flavor1/type1")); 191 assertThat(manifest.getAssetsDirectory()).isEqualTo(file("build/intermediates/assets/flavor1/type1")); 192 assertThat(manifest.getAndroidManifestFile()).isEqualTo(file("build/intermediates/manifests/full/flavor1/type1/GradleManifest.xml")); 193 } 194 195 @Test 196 public void rClassShouldBeInTheSamePackageAsBuildConfig() throws Exception { 197 File manifestFile = new File( 198 "build/intermediates/manifests/full" + 199 org.robolectric.gradleapp.BuildConfig.FLAVOR + 200 org.robolectric.gradleapp.BuildConfig.BUILD_TYPE, 201 "AndroidManifest.xml"); 202 manifestFile.getParentFile().mkdirs(); 203 204 Files.write("<manifest package=\"something\"/>", manifestFile, Charsets.UTF_8); 205 206 AndroidManifest manifest = createManifest( 207 configBuilder.setConstants(BuildConfig.class).build()); 208 assertThat(manifest.getRClass().getPackage().getName()).isEqualTo("org.robolectric.gradleapp"); 209 } 210 211 @Test public void identify() throws Exception { 212 ManifestIdentifier manifestIdentifier = factory.identify( 213 configBuilder.setConstants(BuildConfig.class) 214 .setManifest("GradleManifest.xml").build()); 215 216 assertThat(manifestIdentifier.getManifestFile().toString()) 217 .isEqualTo("build/intermediates/manifests/full/flavor1/type1/GradleManifest.xml"); 218 assertThat(manifestIdentifier.getResDir().toString()) 219 .isEqualTo("build/intermediates/res/flavor1/type1"); 220 } 221 222 //////////////////////////////// 223 224 private AndroidManifest createManifest(Config config) { 225 return RobolectricTestRunner.createAndroidManifest(factory.identify(config)); 226 } 227 228 private static FsFile file(String path) { 229 return FileFsFile.from(path); 230 } 231 232 private void delete(File file) { 233 final File[] files = file.listFiles(); 234 if (files != null) { 235 for (File each : files) { 236 delete(each); 237 } 238 } 239 file.delete(); 240 } 241 242 public static class BuildConfigOverride { 243 public static final String APPLICATION_ID = "org.sandwich.bar"; 244 public static final String BUILD_TYPE = "type2"; 245 public static final String FLAVOR = "flavor2"; 246 } 247 } 248