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