Home | History | Annotate | Download | only in internal
      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