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