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