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