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