ManifestFactoryTest.java revision bbc72956b4eb3ede6ab92f933fab57f2dc562a14
1package org.robolectric;
2
3import static org.assertj.core.api.Assertions.assertThat;
4import static org.junit.Assert.assertEquals;
5import static org.robolectric.util.TestUtil.resourceFile;
6
7import java.util.ArrayList;
8import java.util.Collection;
9import java.util.List;
10import java.util.Properties;
11import org.junit.Test;
12import org.junit.runner.RunWith;
13import org.junit.runners.JUnit4;
14import org.robolectric.annotation.Config;
15import org.robolectric.internal.DefaultManifestFactory;
16import org.robolectric.internal.ManifestFactory;
17import org.robolectric.internal.ManifestIdentifier;
18import org.robolectric.manifest.AndroidManifest;
19import org.robolectric.res.Fs;
20import org.robolectric.res.ResourcePath;
21import org.robolectric.util.TestUtil;
22
23@RunWith(JUnit4.class)
24public class ManifestFactoryTest {
25  @Test
26  public void shouldLoadLibraryManifests() throws Exception {
27    Properties properties = new Properties();
28    properties.setProperty("manifest", resourceFile("TestAndroidManifest.xml").toString());
29    properties.setProperty("libraries", "lib1");
30    Config config = Config.Implementation.fromProperties(properties);
31    ManifestFactory manifestFactory = new RobolectricTestRunner(ManifestFactoryTest.class).getManifestFactory(config);
32    AndroidManifest manifest = manifestFactory.create(manifestFactory.identify(config));
33
34    List<AndroidManifest> libraryManifests = manifest.getLibraryManifests();
35    assertEquals(1, libraryManifests.size());
36    assertEquals("org.robolectric.lib1", libraryManifests.get(0).getPackageName());
37  }
38
39  @Test
40  public void shouldLoadAllResourcesForExistingLibraries() throws Exception {
41    Properties properties = new Properties();
42    properties.setProperty("manifest", resourceFile("TestAndroidManifest.xml").toString());
43    properties.setProperty("resourceDir", "res");
44    properties.setProperty("assetDir", "assets");
45    Config config = Config.Implementation.fromProperties(properties);
46    ManifestFactory manifestFactory = new RobolectricTestRunner(ManifestFactoryTest.class).getManifestFactory(config);
47    AndroidManifest appManifest = manifestFactory.create(manifestFactory.identify(config));
48
49    // This intentionally loads from the non standard resources/project.properties
50    List<String> resourcePaths = stringify(appManifest.getIncludedResourcePaths());
51    String baseDir = "./" + TestUtil.resourcesBaseDir().getPath();
52    assertThat(resourcePaths).contains(
53        baseDir + "/res",
54        baseDir + "/lib1/res",
55        baseDir + "/lib1/../lib3/res",
56        baseDir + "/lib1/../lib2/res");
57  }
58
59  @Test
60  public void whenBuildSystemApiPropertiesFileIsPresent_shouldUseDefaultManifestFactory() throws Exception {
61    final Properties properties = new Properties();
62    properties.setProperty("android_sdk_home", "");
63    properties.setProperty("android_merged_manifest", "/path/to/MergedManifest.xml");
64    properties.setProperty("android_merged_resources", "/path/to/merged-resources");
65    properties.setProperty("android_merged_assets", "/path/to/merged-assets");
66
67    RobolectricTestRunner testRunner = new RobolectricTestRunner(ManifestFactoryTest.class) {
68      Properties getBuildSystemApiProperties() {
69        return properties;
70      }
71    };
72
73    Config.Implementation config = Config.Builder.defaults().build();
74    ManifestFactory manifestFactory = testRunner.getManifestFactory(config);
75    assertThat(manifestFactory).isInstanceOf(DefaultManifestFactory.class);
76    ManifestIdentifier manifestIdentifier = manifestFactory.identify(config);
77    assertThat(manifestIdentifier.getManifestFile()).isEqualTo(Fs.fileFromPath("/path/to/MergedManifest.xml"));
78    assertThat(manifestIdentifier.getResDir()).isEqualTo(Fs.fileFromPath("/path/to/merged-resources"));
79    assertThat(manifestIdentifier.getAssetDir()).isEqualTo(Fs.fileFromPath("/path/to/merged-assets"));
80    assertThat(manifestIdentifier.getLibraryDirs()).isEmpty();
81    assertThat(manifestIdentifier.getPackageName()).isNull();
82
83    AndroidManifest androidManifest = manifestFactory.create(manifestIdentifier);
84    assertThat(androidManifest.getAndroidManifestFile()).isEqualTo(Fs.fileFromPath("/path/to/MergedManifest.xml"));
85    assertThat(androidManifest.getResDirectory()).isEqualTo(Fs.fileFromPath("/path/to/merged-resources"));
86    assertThat(androidManifest.getAssetsDirectory()).isEqualTo(Fs.fileFromPath("/path/to/merged-assets"));
87  }
88
89  @Test
90  public void whenConfigSpecified_overridesValuesFromFile() throws Exception {
91    final Properties properties = new Properties();
92    properties.setProperty("android_sdk_home", "");
93    properties.setProperty("android_merged_manifest", "/path/to/MergedManifest.xml");
94    properties.setProperty("android_merged_resources", "/path/to/merged-resources");
95    properties.setProperty("android_merged_assets", "/path/to/merged-assets");
96
97    RobolectricTestRunner testRunner = new RobolectricTestRunner(ManifestFactoryTest.class) {
98      Properties getBuildSystemApiProperties() {
99        return properties;
100      }
101    };
102
103    Config.Implementation config = Config.Builder.defaults()
104        .setManifest("TestAndroidManifest.xml")
105        .setPackageName("another.package")
106        .build();
107    ManifestFactory manifestFactory = testRunner.getManifestFactory(config);
108    assertThat(manifestFactory).isInstanceOf(DefaultManifestFactory.class);
109    ManifestIdentifier manifestIdentifier = manifestFactory.identify(config);
110    assertThat(manifestIdentifier.getManifestFile())
111            .isEqualTo(Fs.fromURL(getClass().getClassLoader().getResource("TestAndroidManifest.xml")));
112    assertThat(manifestIdentifier.getResDir()).isEqualTo(Fs.fileFromPath("/path/to/merged-resources"));
113    assertThat(manifestIdentifier.getAssetDir()).isEqualTo(Fs.fileFromPath("/path/to/merged-assets"));
114    assertThat(manifestIdentifier.getLibraryDirs()).isEmpty();
115    assertThat(manifestIdentifier.getPackageName()).isEqualTo("another.package");
116  }
117
118  private List<String> stringify(Collection<ResourcePath> resourcePaths) {
119    List<String> resourcePathBases = new ArrayList<>();
120    for (ResourcePath resourcePath : resourcePaths) {
121      resourcePathBases.add(resourcePath.getResourceBase().toString());
122    }
123    return resourcePathBases;
124  }
125}
126