package org.robolectric;
import static java.util.Arrays.asList;
import static org.assertj.core.api.Assertions.assertThat;
import static org.junit.Assert.assertEquals;
import static org.robolectric.util.TestUtil.joinPath;
import static org.robolectric.util.TestUtil.resourceFile;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.junit.runners.JUnit4;
import org.robolectric.annotation.Config;
import org.robolectric.internal.DefaultManifestFactory;
import org.robolectric.internal.ManifestFactory;
import org.robolectric.internal.ManifestIdentifier;
import org.robolectric.manifest.AndroidManifest;
import org.robolectric.res.Fs;
import org.robolectric.res.ResourcePath;
import java.util.ArrayList;
import java.util.Collection;
import java.util.List;
import java.util.Properties;
@RunWith(JUnit4.class)
public class ManifestFactoryTest {
@Test
public void shouldLoadLibraryManifests() throws Exception {
Properties properties = new Properties();
properties.setProperty("manifest", resourceFile("TestAndroidManifest.xml").toString());
properties.setProperty("libraries", "lib1");
Config config = Config.Implementation.fromProperties(properties);
ManifestFactory manifestFactory = new RobolectricTestRunner(ManifestFactoryTest.class).getManifestFactory(config);
AndroidManifest manifest = manifestFactory.create(manifestFactory.identify(config));
List<AndroidManifest> libraryManifests = manifest.getLibraryManifests();
assertEquals(1, libraryManifests.size());
assertEquals("org.robolectric.lib1", libraryManifests.get(0).getPackageName());
}
@Test
public void shouldLoadAllResourcesForExistingLibraries() throws Exception {
Properties properties = new Properties();
properties.setProperty("manifest", resourceFile("TestAndroidManifest.xml").toString());
properties.setProperty("resourceDir", "res");
properties.setProperty("assetDir", "assets");
Config config = Config.Implementation.fromProperties(properties);
ManifestFactory manifestFactory = new RobolectricTestRunner(ManifestFactoryTest.class).getManifestFactory(config);
AndroidManifest appManifest = manifestFactory.create(manifestFactory.identify(config));
// This intentionally loads from the non standard resources/project.properties
List<String> resourcePaths = stringify(appManifest.getIncludedResourcePaths());
assertEquals(asList(
joinPath(".", "src", "test", "resources", "res"),
joinPath(".", "src", "test", "resources", "lib1", "res"),
joinPath(".", "src", "test", "resources", "lib1", "..", "lib3", "res"),
joinPath(".", "src", "test", "resources", "lib1", "..", "lib2", "res")),
resourcePaths);
}
@Test
public void whenBuildSystemApiPropertiesFileIsPresent_shouldUseDefaultManifestFactory() throws Exception {
final Properties properties = new Properties();
properties.setProperty("android_sdk_home", "");
properties.setProperty("android_merged_manifest", "/path/to/MergedManifest.xml");
properties.setProperty("android_merged_resources", "/path/to/merged-resources");
properties.setProperty("android_merged_assets", "/path/to/merged-assets");
RobolectricTestRunner testRunner = new RobolectricTestRunner(ManifestFactoryTest.class) {
Properties getBuildSystemApiProperties() {
return properties;
}
};
Config.Implementation config = Config.Builder.defaults().build();
ManifestFactory manifestFactory = testRunner.getManifestFactory(config);
assertThat(manifestFactory).isInstanceOf(DefaultManifestFactory.class);
ManifestIdentifier manifestIdentifier = manifestFactory.identify(config);
assertThat(manifestIdentifier.getManifestFile()).isEqualTo(Fs.fileFromPath("/path/to/MergedManifest.xml"));
assertThat(manifestIdentifier.getResDir()).isEqualTo(Fs.fileFromPath("/path/to/merged-resources"));
assertThat(manifestIdentifier.getAssetDir()).isEqualTo(Fs.fileFromPath("/path/to/merged-assets"));
assertThat(manifestIdentifier.getLibraryDirs()).isEmpty();
assertThat(manifestIdentifier.getPackageName()).isNull();
AndroidManifest androidManifest = manifestFactory.create(manifestIdentifier);
assertThat(androidManifest.getAndroidManifestFile()).isEqualTo(Fs.fileFromPath("/path/to/MergedManifest.xml"));
assertThat(androidManifest.getResDirectory()).isEqualTo(Fs.fileFromPath("/path/to/merged-resources"));
assertThat(androidManifest.getAssetsDirectory()).isEqualTo(Fs.fileFromPath("/path/to/merged-assets"));
}
@Test
public void whenConfigSpecified_overridesValuesFromFile() throws Exception {
final Properties properties = new Properties();
properties.setProperty("android_sdk_home", "");
properties.setProperty("android_merged_manifest", "/path/to/MergedManifest.xml");
properties.setProperty("android_merged_resources", "/path/to/merged-resources");
properties.setProperty("android_merged_assets", "/path/to/merged-assets");
RobolectricTestRunner testRunner = new RobolectricTestRunner(ManifestFactoryTest.class) {
Properties getBuildSystemApiProperties() {
return properties;
}
};
Config.Implementation config = Config.Builder.defaults()
.setManifest("/TestAndroidManifest.xml")
.setPackageName("another.package")
.build();
ManifestFactory manifestFactory = testRunner.getManifestFactory(config);
assertThat(manifestFactory).isInstanceOf(DefaultManifestFactory.class);
ManifestIdentifier manifestIdentifier = manifestFactory.identify(config);
assertThat(manifestIdentifier.getManifestFile()).isEqualTo(Fs.fileFromPath(getClass().getResource("/TestAndroidManifest.xml").getPath()));
assertThat(manifestIdentifier.getResDir()).isEqualTo(Fs.fileFromPath("/path/to/merged-resources"));
assertThat(manifestIdentifier.getAssetDir()).isEqualTo(Fs.fileFromPath("/path/to/merged-assets"));
assertThat(manifestIdentifier.getLibraryDirs()).isEmpty();
assertThat(manifestIdentifier.getPackageName()).isEqualTo("another.package");
}
private List<String> stringify(Collection<ResourcePath> resourcePaths) {
List<String> resourcePathBases = new ArrayList<>();
for (ResourcePath resourcePath : resourcePaths) {
resourcePathBases.add(resourcePath.getResourceBase().toString());
}
return resourcePathBases;
}
}