ManifestFactoryTest.java revision 879371277af60d57148eefb24fd046a6a30e4683
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;
19import org.robolectric.util.TestUtil;
20
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    String baseDir = "./" + TestUtil.resourcesBaseDir().getPath();
55    assertEquals(asList(
56        joinPath(baseDir, "res"),
57        joinPath(baseDir, "lib1", "res"),
58        joinPath(baseDir, "lib1", "..", "lib3", "res"),
59        joinPath(baseDir, "lib1", "..", "lib2", "res")),
60        resourcePaths);
61  }
62
63  @Test
64  public void whenBuildSystemApiPropertiesFileIsPresent_shouldUseDefaultManifestFactory() throws Exception {
65    final Properties properties = new Properties();
66    properties.setProperty("android_sdk_home", "");
67    properties.setProperty("android_merged_manifest", "/path/to/MergedManifest.xml");
68    properties.setProperty("android_merged_resources", "/path/to/merged-resources");
69    properties.setProperty("android_merged_assets", "/path/to/merged-assets");
70
71    RobolectricTestRunner testRunner = new RobolectricTestRunner(ManifestFactoryTest.class) {
72      Properties getBuildSystemApiProperties() {
73        return properties;
74      }
75    };
76
77    Config.Implementation config = Config.Builder.defaults().build();
78    ManifestFactory manifestFactory = testRunner.getManifestFactory(config);
79    assertThat(manifestFactory).isInstanceOf(DefaultManifestFactory.class);
80    ManifestIdentifier manifestIdentifier = manifestFactory.identify(config);
81    assertThat(manifestIdentifier.getManifestFile()).isEqualTo(Fs.fileFromPath("/path/to/MergedManifest.xml"));
82    assertThat(manifestIdentifier.getResDir()).isEqualTo(Fs.fileFromPath("/path/to/merged-resources"));
83    assertThat(manifestIdentifier.getAssetDir()).isEqualTo(Fs.fileFromPath("/path/to/merged-assets"));
84    assertThat(manifestIdentifier.getLibraryDirs()).isEmpty();
85    assertThat(manifestIdentifier.getPackageName()).isNull();
86
87    AndroidManifest androidManifest = manifestFactory.create(manifestIdentifier);
88    assertThat(androidManifest.getAndroidManifestFile()).isEqualTo(Fs.fileFromPath("/path/to/MergedManifest.xml"));
89    assertThat(androidManifest.getResDirectory()).isEqualTo(Fs.fileFromPath("/path/to/merged-resources"));
90    assertThat(androidManifest.getAssetsDirectory()).isEqualTo(Fs.fileFromPath("/path/to/merged-assets"));
91  }
92
93  @Test
94  public void whenConfigSpecified_overridesValuesFromFile() throws Exception {
95    final Properties properties = new Properties();
96    properties.setProperty("android_sdk_home", "");
97    properties.setProperty("android_merged_manifest", "/path/to/MergedManifest.xml");
98    properties.setProperty("android_merged_resources", "/path/to/merged-resources");
99    properties.setProperty("android_merged_assets", "/path/to/merged-assets");
100
101    RobolectricTestRunner testRunner = new RobolectricTestRunner(ManifestFactoryTest.class) {
102      Properties getBuildSystemApiProperties() {
103        return properties;
104      }
105    };
106
107    Config.Implementation config = Config.Builder.defaults()
108        .setManifest("TestAndroidManifest.xml")
109        .setPackageName("another.package")
110        .build();
111    ManifestFactory manifestFactory = testRunner.getManifestFactory(config);
112    assertThat(manifestFactory).isInstanceOf(DefaultManifestFactory.class);
113    ManifestIdentifier manifestIdentifier = manifestFactory.identify(config);
114    assertThat(manifestIdentifier.getManifestFile())
115            .isEqualTo(Fs.fromURL(getClass().getClassLoader().getResource("TestAndroidManifest.xml")));
116    assertThat(manifestIdentifier.getResDir()).isEqualTo(Fs.fileFromPath("/path/to/merged-resources"));
117    assertThat(manifestIdentifier.getAssetDir()).isEqualTo(Fs.fileFromPath("/path/to/merged-assets"));
118    assertThat(manifestIdentifier.getLibraryDirs()).isEmpty();
119    assertThat(manifestIdentifier.getPackageName()).isEqualTo("another.package");
120  }
121
122  private List<String> stringify(Collection<ResourcePath> resourcePaths) {
123    List<String> resourcePathBases = new ArrayList<>();
124    for (ResourcePath resourcePath : resourcePaths) {
125      resourcePathBases.add(resourcePath.getResourceBase().toString());
126    }
127    return resourcePathBases;
128  }
129}
130