1 package org.robolectric.util; 2 3 import java.io.File; 4 import java.net.URI; 5 import java.net.URL; 6 import org.junit.runners.model.InitializationError; 7 import org.robolectric.RobolectricTestRunner; 8 import org.robolectric.annotation.Config; 9 import org.robolectric.manifest.AndroidManifest; 10 import org.robolectric.res.Fs; 11 import org.robolectric.res.FsFile; 12 13 public class TestRunnerWithManifest extends RobolectricTestRunner { 14 public TestRunnerWithManifest(Class<?> testClass) throws InitializationError { 15 super(testClass); 16 } 17 18 private static FsFile resourceFile(String... pathParts) { 19 return Fs.newFile(resourcesBaseDirFile()).join(pathParts); 20 } 21 22 private static File resourcesBaseDirFile() { 23 // Try to locate the manifest file as a classpath resource. 24 final String resourceName = "/src/test/resources/AndroidManifest.xml"; 25 final URL resourceUrl = TestRunnerWithManifest.class.getResource(resourceName); 26 if (resourceUrl != null && "file".equals(resourceUrl.getProtocol())) { 27 // Construct a path to the manifest file relative to the current working directory. 28 final URI workingDirectory = URI.create(System.getProperty("user.dir")); 29 final URI absolutePath = URI.create(resourceUrl.getPath()); 30 final URI relativePath = workingDirectory.relativize(absolutePath); 31 return new File(relativePath.toString()).getParentFile(); 32 } 33 34 // Return a path relative to the current working directory. 35 return Util.file("src", "test", "resources"); 36 } 37 38 @Override 39 protected AndroidManifest getAppManifest(Config config) { 40 return new AndroidManifest(resourceFile("AndroidManifest.xml"), resourceFile("res"), resourceFile("assets")); 41 } 42 } 43