1 package org.robolectric.internal; 2 3 import static java.util.Collections.emptyList; 4 5 import java.io.File; 6 import java.net.MalformedURLException; 7 import java.net.URL; 8 import java.util.List; 9 import java.util.Properties; 10 import org.robolectric.annotation.Config; 11 import org.robolectric.res.Fs; 12 import org.robolectric.res.FsFile; 13 import org.robolectric.util.Logger; 14 15 public class DefaultManifestFactory implements ManifestFactory { 16 private Properties properties; 17 DefaultManifestFactory(Properties properties)18 public DefaultManifestFactory(Properties properties) { 19 this.properties = properties; 20 } 21 22 @Override identify(Config config)23 public ManifestIdentifier identify(Config config) { 24 String baseDir = System.getProperty("robolectric-tests.base-dir"); 25 26 FsFile manifestFile = getFsFileFromProperty(baseDir, "android_merged_manifest"); 27 FsFile resourcesDir = getFsFileFromProperty(baseDir, "android_merged_resources"); 28 FsFile assetsDir = getFsFileFromProperty(baseDir, "android_merged_assets"); 29 FsFile apkFile = getFsFileFromProperty(baseDir, "android_resource_apk"); 30 String packageName = properties.getProperty("android_custom_package"); 31 32 String manifestConfig = config.manifest(); 33 if (Config.NONE.equals(manifestConfig)) { 34 Logger.info("@Config(manifest = Config.NONE) specified while using Build System API, ignoring"); 35 } else if (!Config.DEFAULT_MANIFEST_NAME.equals(manifestConfig)) { 36 manifestFile = resolveFile(manifestConfig); 37 } 38 39 if (!Config.DEFAULT_RES_FOLDER.equals(config.resourceDir())) { 40 resourcesDir = resolveFile(config.resourceDir()); 41 } 42 43 if (!Config.DEFAULT_ASSET_FOLDER.equals(config.assetDir())) { 44 assetsDir = resolveFile(config.assetDir()); 45 } 46 47 if (!Config.DEFAULT_PACKAGE_NAME.equals(config.packageName())) { 48 packageName = config.packageName(); 49 } 50 51 List<ManifestIdentifier> libraryDirs = emptyList(); 52 if (config.libraries().length > 0) { 53 Logger.info("@Config(libraries) specified while using Build System API, ignoring"); 54 } 55 56 return new ManifestIdentifier(packageName, manifestFile, resourcesDir, assetsDir, libraryDirs, 57 apkFile); 58 } 59 resolveFile(String manifestConfig)60 private FsFile resolveFile(String manifestConfig) { 61 URL manifestUrl = getClass().getClassLoader().getResource(manifestConfig); 62 if (manifestUrl == null) { 63 throw new IllegalArgumentException("couldn't find '" + manifestConfig + "'"); 64 } else { 65 return Fs.fromURL(manifestUrl); 66 } 67 } 68 getFsFileFromProperty(String baseDir, String name)69 private FsFile getFsFileFromProperty(String baseDir, String name) { 70 String path = properties.getProperty(name); 71 if (path == null || path.isEmpty()) { 72 return null; 73 } 74 75 if (baseDir != null) { 76 path = new File(baseDir, path).getPath(); 77 } 78 79 if (path.startsWith("jar")) { 80 try { 81 URL url = new URL(path); 82 return Fs.fromURL(url); 83 } catch (MalformedURLException e) { 84 throw new RuntimeException(e); 85 } 86 } else { 87 return Fs.fileFromPath(path); 88 } 89 } 90 } 91