1b4c08d70a2f549cf344c81bb20c824d3cc31c298Vijay Nayarpackage org.robolectric;
2b4c08d70a2f549cf344c81bb20c824d3cc31c298Vijay Nayar
3032b5eb55d959cacde433137c9d666df1f25afbbJonathan Gerrishimport static org.assertj.core.api.Assertions.assertThat;
4b4c08d70a2f549cf344c81bb20c824d3cc31c298Vijay Nayarimport static org.junit.Assert.assertEquals;
5b4c08d70a2f549cf344c81bb20c824d3cc31c298Vijay Nayarimport static org.robolectric.util.TestUtil.resourceFile;
6b4c08d70a2f549cf344c81bb20c824d3cc31c298Vijay Nayar
7851f2a9519be23c73a9e2929128179b405e2e7a6Christian Williamsimport java.util.ArrayList;
8851f2a9519be23c73a9e2929128179b405e2e7a6Christian Williamsimport java.util.Collection;
9851f2a9519be23c73a9e2929128179b405e2e7a6Christian Williamsimport java.util.List;
10851f2a9519be23c73a9e2929128179b405e2e7a6Christian Williamsimport java.util.Properties;
11b4c08d70a2f549cf344c81bb20c824d3cc31c298Vijay Nayarimport org.junit.Test;
12b4c08d70a2f549cf344c81bb20c824d3cc31c298Vijay Nayarimport org.junit.runner.RunWith;
13b4c08d70a2f549cf344c81bb20c824d3cc31c298Vijay Nayarimport org.junit.runners.JUnit4;
14084d588b645d53c1110ff24b82433b5a331cc6d3James Lemieuximport org.junit.runners.model.InitializationError;
15b4c08d70a2f549cf344c81bb20c824d3cc31c298Vijay Nayarimport org.robolectric.annotation.Config;
16032b5eb55d959cacde433137c9d666df1f25afbbJonathan Gerrishimport org.robolectric.internal.DefaultManifestFactory;
1755b52578fdaca7097ea4b28b3daebac84094dab4Christian Williamsimport org.robolectric.internal.ManifestFactory;
18032b5eb55d959cacde433137c9d666df1f25afbbJonathan Gerrishimport org.robolectric.internal.ManifestIdentifier;
19b4c08d70a2f549cf344c81bb20c824d3cc31c298Vijay Nayarimport org.robolectric.manifest.AndroidManifest;
20032b5eb55d959cacde433137c9d666df1f25afbbJonathan Gerrishimport org.robolectric.res.Fs;
21b4c08d70a2f549cf344c81bb20c824d3cc31c298Vijay Nayarimport org.robolectric.res.ResourcePath;
22879371277af60d57148eefb24fd046a6a30e4683christianwimport org.robolectric.util.TestUtil;
23b4c08d70a2f549cf344c81bb20c824d3cc31c298Vijay Nayar
24b4c08d70a2f549cf344c81bb20c824d3cc31c298Vijay Nayar@RunWith(JUnit4.class)
25b4c08d70a2f549cf344c81bb20c824d3cc31c298Vijay Nayarpublic class ManifestFactoryTest {
26b4c08d70a2f549cf344c81bb20c824d3cc31c298Vijay Nayar  @Test
27b4c08d70a2f549cf344c81bb20c824d3cc31c298Vijay Nayar  public void shouldLoadLibraryManifests() throws Exception {
28b4c08d70a2f549cf344c81bb20c824d3cc31c298Vijay Nayar    Properties properties = new Properties();
29b4c08d70a2f549cf344c81bb20c824d3cc31c298Vijay Nayar    properties.setProperty("manifest", resourceFile("TestAndroidManifest.xml").toString());
30b4c08d70a2f549cf344c81bb20c824d3cc31c298Vijay Nayar    properties.setProperty("libraries", "lib1");
31b4c08d70a2f549cf344c81bb20c824d3cc31c298Vijay Nayar    Config config = Config.Implementation.fromProperties(properties);
32084d588b645d53c1110ff24b82433b5a331cc6d3James Lemieux    RobolectricTestRunner testRunner = simulateTestRunnerWithoutBuildSystemAPI();
33084d588b645d53c1110ff24b82433b5a331cc6d3James Lemieux    ManifestFactory manifestFactory = testRunner.getManifestFactory(config);
34084d588b645d53c1110ff24b82433b5a331cc6d3James Lemieux    AndroidManifest manifest = RobolectricTestRunner
35084d588b645d53c1110ff24b82433b5a331cc6d3James Lemieux        .createAndroidManifest(manifestFactory.identify(config));
36b4c08d70a2f549cf344c81bb20c824d3cc31c298Vijay Nayar
37b4c08d70a2f549cf344c81bb20c824d3cc31c298Vijay Nayar    List<AndroidManifest> libraryManifests = manifest.getLibraryManifests();
38b4c08d70a2f549cf344c81bb20c824d3cc31c298Vijay Nayar    assertEquals(1, libraryManifests.size());
39b4c08d70a2f549cf344c81bb20c824d3cc31c298Vijay Nayar    assertEquals("org.robolectric.lib1", libraryManifests.get(0).getPackageName());
40b4c08d70a2f549cf344c81bb20c824d3cc31c298Vijay Nayar  }
41b4c08d70a2f549cf344c81bb20c824d3cc31c298Vijay Nayar
42084d588b645d53c1110ff24b82433b5a331cc6d3James Lemieux  private static RobolectricTestRunner simulateTestRunnerWithoutBuildSystemAPI()
43084d588b645d53c1110ff24b82433b5a331cc6d3James Lemieux      throws InitializationError {
44084d588b645d53c1110ff24b82433b5a331cc6d3James Lemieux    return new RobolectricTestRunner(ManifestFactoryTest.class) {
45084d588b645d53c1110ff24b82433b5a331cc6d3James Lemieux      @Override
46084d588b645d53c1110ff24b82433b5a331cc6d3James Lemieux      Properties getBuildSystemApiProperties() {
47084d588b645d53c1110ff24b82433b5a331cc6d3James Lemieux        // Even if the build system executing this test provides properties, pretend that it doesn't
48084d588b645d53c1110ff24b82433b5a331cc6d3James Lemieux        // so we can test the old mechanism.
49084d588b645d53c1110ff24b82433b5a331cc6d3James Lemieux        return null;
50084d588b645d53c1110ff24b82433b5a331cc6d3James Lemieux      }
51084d588b645d53c1110ff24b82433b5a331cc6d3James Lemieux    };
52084d588b645d53c1110ff24b82433b5a331cc6d3James Lemieux  }
53084d588b645d53c1110ff24b82433b5a331cc6d3James Lemieux
54b4c08d70a2f549cf344c81bb20c824d3cc31c298Vijay Nayar  @Test
55eb01f4f02fcd34067b8ff5e53bfeb9575b874e1fChristian Williams  public void shouldLoadAllResourcesForExistingLibraries() throws Exception {
56b4c08d70a2f549cf344c81bb20c824d3cc31c298Vijay Nayar    Properties properties = new Properties();
57b4c08d70a2f549cf344c81bb20c824d3cc31c298Vijay Nayar    properties.setProperty("manifest", resourceFile("TestAndroidManifest.xml").toString());
58b4c08d70a2f549cf344c81bb20c824d3cc31c298Vijay Nayar    properties.setProperty("resourceDir", "res");
59b4c08d70a2f549cf344c81bb20c824d3cc31c298Vijay Nayar    properties.setProperty("assetDir", "assets");
60b4c08d70a2f549cf344c81bb20c824d3cc31c298Vijay Nayar    Config config = Config.Implementation.fromProperties(properties);
61084d588b645d53c1110ff24b82433b5a331cc6d3James Lemieux    RobolectricTestRunner testRunner = simulateTestRunnerWithoutBuildSystemAPI();
62084d588b645d53c1110ff24b82433b5a331cc6d3James Lemieux    ManifestFactory manifestFactory = testRunner.getManifestFactory(config);
63084d588b645d53c1110ff24b82433b5a331cc6d3James Lemieux    AndroidManifest appManifest = RobolectricTestRunner
64084d588b645d53c1110ff24b82433b5a331cc6d3James Lemieux        .createAndroidManifest(manifestFactory.identify(config));
65b4c08d70a2f549cf344c81bb20c824d3cc31c298Vijay Nayar
66b4c08d70a2f549cf344c81bb20c824d3cc31c298Vijay Nayar    // This intentionally loads from the non standard resources/project.properties
67b4c08d70a2f549cf344c81bb20c824d3cc31c298Vijay Nayar    List<String> resourcePaths = stringify(appManifest.getIncludedResourcePaths());
68879371277af60d57148eefb24fd046a6a30e4683christianw    String baseDir = "./" + TestUtil.resourcesBaseDir().getPath();
69bbc72956b4eb3ede6ab92f933fab57f2dc562a14Jonathan Gerrish    assertThat(resourcePaths).contains(
70bbc72956b4eb3ede6ab92f933fab57f2dc562a14Jonathan Gerrish        baseDir + "/res",
71bbc72956b4eb3ede6ab92f933fab57f2dc562a14Jonathan Gerrish        baseDir + "/lib1/res",
72bbc72956b4eb3ede6ab92f933fab57f2dc562a14Jonathan Gerrish        baseDir + "/lib1/../lib3/res",
73bbc72956b4eb3ede6ab92f933fab57f2dc562a14Jonathan Gerrish        baseDir + "/lib1/../lib2/res");
74b4c08d70a2f549cf344c81bb20c824d3cc31c298Vijay Nayar  }
75b4c08d70a2f549cf344c81bb20c824d3cc31c298Vijay Nayar
76032b5eb55d959cacde433137c9d666df1f25afbbJonathan Gerrish  @Test
77032b5eb55d959cacde433137c9d666df1f25afbbJonathan Gerrish  public void whenBuildSystemApiPropertiesFileIsPresent_shouldUseDefaultManifestFactory() throws Exception {
78032b5eb55d959cacde433137c9d666df1f25afbbJonathan Gerrish    final Properties properties = new Properties();
79032b5eb55d959cacde433137c9d666df1f25afbbJonathan Gerrish    properties.setProperty("android_sdk_home", "");
80032b5eb55d959cacde433137c9d666df1f25afbbJonathan Gerrish    properties.setProperty("android_merged_manifest", "/path/to/MergedManifest.xml");
81032b5eb55d959cacde433137c9d666df1f25afbbJonathan Gerrish    properties.setProperty("android_merged_resources", "/path/to/merged-resources");
82032b5eb55d959cacde433137c9d666df1f25afbbJonathan Gerrish    properties.setProperty("android_merged_assets", "/path/to/merged-assets");
83032b5eb55d959cacde433137c9d666df1f25afbbJonathan Gerrish
84032b5eb55d959cacde433137c9d666df1f25afbbJonathan Gerrish    RobolectricTestRunner testRunner = new RobolectricTestRunner(ManifestFactoryTest.class) {
8507e61e04ff795fb67174de36821945e7501c2ff6Christian Williams      @Override Properties getBuildSystemApiProperties() {
86032b5eb55d959cacde433137c9d666df1f25afbbJonathan Gerrish        return properties;
87032b5eb55d959cacde433137c9d666df1f25afbbJonathan Gerrish      }
88032b5eb55d959cacde433137c9d666df1f25afbbJonathan Gerrish    };
89032b5eb55d959cacde433137c9d666df1f25afbbJonathan Gerrish
90032b5eb55d959cacde433137c9d666df1f25afbbJonathan Gerrish    Config.Implementation config = Config.Builder.defaults().build();
91032b5eb55d959cacde433137c9d666df1f25afbbJonathan Gerrish    ManifestFactory manifestFactory = testRunner.getManifestFactory(config);
92032b5eb55d959cacde433137c9d666df1f25afbbJonathan Gerrish    assertThat(manifestFactory).isInstanceOf(DefaultManifestFactory.class);
93032b5eb55d959cacde433137c9d666df1f25afbbJonathan Gerrish    ManifestIdentifier manifestIdentifier = manifestFactory.identify(config);
94032b5eb55d959cacde433137c9d666df1f25afbbJonathan Gerrish    assertThat(manifestIdentifier.getManifestFile()).isEqualTo(Fs.fileFromPath("/path/to/MergedManifest.xml"));
95032b5eb55d959cacde433137c9d666df1f25afbbJonathan Gerrish    assertThat(manifestIdentifier.getResDir()).isEqualTo(Fs.fileFromPath("/path/to/merged-resources"));
96032b5eb55d959cacde433137c9d666df1f25afbbJonathan Gerrish    assertThat(manifestIdentifier.getAssetDir()).isEqualTo(Fs.fileFromPath("/path/to/merged-assets"));
97d2c68ab0722bbb96daf0cd8c52a8425e230517aeChristian Williams    assertThat(manifestIdentifier.getLibraries()).isEmpty();
98032b5eb55d959cacde433137c9d666df1f25afbbJonathan Gerrish    assertThat(manifestIdentifier.getPackageName()).isNull();
99032b5eb55d959cacde433137c9d666df1f25afbbJonathan Gerrish
100084d588b645d53c1110ff24b82433b5a331cc6d3James Lemieux    AndroidManifest androidManifest = RobolectricTestRunner
101084d588b645d53c1110ff24b82433b5a331cc6d3James Lemieux        .createAndroidManifest(manifestIdentifier);
102032b5eb55d959cacde433137c9d666df1f25afbbJonathan Gerrish    assertThat(androidManifest.getAndroidManifestFile()).isEqualTo(Fs.fileFromPath("/path/to/MergedManifest.xml"));
103032b5eb55d959cacde433137c9d666df1f25afbbJonathan Gerrish    assertThat(androidManifest.getResDirectory()).isEqualTo(Fs.fileFromPath("/path/to/merged-resources"));
104032b5eb55d959cacde433137c9d666df1f25afbbJonathan Gerrish    assertThat(androidManifest.getAssetsDirectory()).isEqualTo(Fs.fileFromPath("/path/to/merged-assets"));
105032b5eb55d959cacde433137c9d666df1f25afbbJonathan Gerrish  }
106032b5eb55d959cacde433137c9d666df1f25afbbJonathan Gerrish
107eb76d845fe1a2f43fd5ffc8a9e128755c256fbbdChristian Williams  @Test
108eb76d845fe1a2f43fd5ffc8a9e128755c256fbbdChristian Williams  public void whenConfigSpecified_overridesValuesFromFile() throws Exception {
109eb76d845fe1a2f43fd5ffc8a9e128755c256fbbdChristian Williams    final Properties properties = new Properties();
110eb76d845fe1a2f43fd5ffc8a9e128755c256fbbdChristian Williams    properties.setProperty("android_sdk_home", "");
111eb76d845fe1a2f43fd5ffc8a9e128755c256fbbdChristian Williams    properties.setProperty("android_merged_manifest", "/path/to/MergedManifest.xml");
112eb76d845fe1a2f43fd5ffc8a9e128755c256fbbdChristian Williams    properties.setProperty("android_merged_resources", "/path/to/merged-resources");
113eb76d845fe1a2f43fd5ffc8a9e128755c256fbbdChristian Williams    properties.setProperty("android_merged_assets", "/path/to/merged-assets");
114eb76d845fe1a2f43fd5ffc8a9e128755c256fbbdChristian Williams
115eb76d845fe1a2f43fd5ffc8a9e128755c256fbbdChristian Williams    RobolectricTestRunner testRunner = new RobolectricTestRunner(ManifestFactoryTest.class) {
11607e61e04ff795fb67174de36821945e7501c2ff6Christian Williams      @Override Properties getBuildSystemApiProperties() {
117eb76d845fe1a2f43fd5ffc8a9e128755c256fbbdChristian Williams        return properties;
118eb76d845fe1a2f43fd5ffc8a9e128755c256fbbdChristian Williams      }
119eb76d845fe1a2f43fd5ffc8a9e128755c256fbbdChristian Williams    };
120eb76d845fe1a2f43fd5ffc8a9e128755c256fbbdChristian Williams
121eb76d845fe1a2f43fd5ffc8a9e128755c256fbbdChristian Williams    Config.Implementation config = Config.Builder.defaults()
122879371277af60d57148eefb24fd046a6a30e4683christianw        .setManifest("TestAndroidManifest.xml")
123eb76d845fe1a2f43fd5ffc8a9e128755c256fbbdChristian Williams        .setPackageName("another.package")
124eb76d845fe1a2f43fd5ffc8a9e128755c256fbbdChristian Williams        .build();
125eb76d845fe1a2f43fd5ffc8a9e128755c256fbbdChristian Williams    ManifestFactory manifestFactory = testRunner.getManifestFactory(config);
126eb76d845fe1a2f43fd5ffc8a9e128755c256fbbdChristian Williams    assertThat(manifestFactory).isInstanceOf(DefaultManifestFactory.class);
127eb76d845fe1a2f43fd5ffc8a9e128755c256fbbdChristian Williams    ManifestIdentifier manifestIdentifier = manifestFactory.identify(config);
128879371277af60d57148eefb24fd046a6a30e4683christianw    assertThat(manifestIdentifier.getManifestFile())
129879371277af60d57148eefb24fd046a6a30e4683christianw            .isEqualTo(Fs.fromURL(getClass().getClassLoader().getResource("TestAndroidManifest.xml")));
130eb76d845fe1a2f43fd5ffc8a9e128755c256fbbdChristian Williams    assertThat(manifestIdentifier.getResDir()).isEqualTo(Fs.fileFromPath("/path/to/merged-resources"));
131eb76d845fe1a2f43fd5ffc8a9e128755c256fbbdChristian Williams    assertThat(manifestIdentifier.getAssetDir()).isEqualTo(Fs.fileFromPath("/path/to/merged-assets"));
132d2c68ab0722bbb96daf0cd8c52a8425e230517aeChristian Williams    assertThat(manifestIdentifier.getLibraries()).isEmpty();
133eb76d845fe1a2f43fd5ffc8a9e128755c256fbbdChristian Williams    assertThat(manifestIdentifier.getPackageName()).isEqualTo("another.package");
134eb76d845fe1a2f43fd5ffc8a9e128755c256fbbdChristian Williams  }
135eb76d845fe1a2f43fd5ffc8a9e128755c256fbbdChristian Williams
136b4c08d70a2f549cf344c81bb20c824d3cc31c298Vijay Nayar  private List<String> stringify(Collection<ResourcePath> resourcePaths) {
137b4c08d70a2f549cf344c81bb20c824d3cc31c298Vijay Nayar    List<String> resourcePathBases = new ArrayList<>();
138b4c08d70a2f549cf344c81bb20c824d3cc31c298Vijay Nayar    for (ResourcePath resourcePath : resourcePaths) {
139001f662857195310dc0e2114a8364049fb684b9aChristian Williams      resourcePathBases.add(resourcePath.getResourceBase().toString());
140b4c08d70a2f549cf344c81bb20c824d3cc31c298Vijay Nayar    }
141b4c08d70a2f549cf344c81bb20c824d3cc31c298Vijay Nayar    return resourcePathBases;
142b4c08d70a2f549cf344c81bb20c824d3cc31c298Vijay Nayar  }
143b4c08d70a2f549cf344c81bb20c824d3cc31c298Vijay Nayar}
144