1package org.robolectric.internal; 2 3import java.util.ServiceLoader; 4import org.robolectric.RobolectricTestRunner; 5import org.robolectric.TestLifecycle; 6import org.robolectric.android.fakes.RoboCharsets; 7import org.robolectric.android.fakes.RoboCleaner; 8import org.robolectric.android.fakes.RoboExtendedResponseCache; 9import org.robolectric.android.fakes.RoboResponseSource; 10import org.robolectric.annotation.Config; 11import org.robolectric.annotation.Implements; 12import org.robolectric.internal.bytecode.InstrumentationConfiguration; 13import org.robolectric.internal.bytecode.Interceptors; 14import org.robolectric.internal.bytecode.MethodRef; 15import org.robolectric.manifest.AndroidManifest; 16import org.robolectric.res.ResourcePath; 17import org.robolectric.res.ResourceTable; 18import org.robolectric.res.builder.XmlBlock; 19 20public class AndroidConfigurer { 21 public static void withConfig(InstrumentationConfiguration.Builder builder, Config config) { 22 for (Class<?> clazz : config.shadows()) { 23 Implements annotation = clazz.getAnnotation(Implements.class); 24 if (annotation == null) { 25 throw new IllegalArgumentException(clazz + " is not annotated with @Implements"); 26 } 27 28 String className = annotation.className(); 29 if (className.isEmpty()) { 30 className = annotation.value().getName(); 31 } 32 33 if (!className.isEmpty()) { 34 builder.addInstrumentedClass(className); 35 } 36 } 37 for (String packageName : config.instrumentedPackages()) { 38 builder.addInstrumentedPackage(packageName); 39 } 40 } 41 42 public static void configure(InstrumentationConfiguration.Builder builder, Interceptors interceptors) { 43 for (MethodRef methodRef : interceptors.getAllMethodRefs()) { 44 builder.addInterceptedMethod(methodRef); 45 } 46 47 builder 48 .doNotAcquireClass(TestLifecycle.class) 49 .doNotAcquireClass(AndroidManifest.class) 50 .doNotAcquireClass(RobolectricTestRunner.class) 51 .doNotAcquireClass(RobolectricTestRunner.HelperTestRunner.class) 52 .doNotAcquireClass(ResourcePath.class) 53 .doNotAcquireClass(ResourceTable.class) 54 .doNotAcquireClass(XmlBlock.class); 55 56 builder 57 .doNotAcquirePackage("javax.") 58 .doNotAcquirePackage("org.junit") 59 .doNotAcquirePackage("org.hamcrest") 60 .doNotAcquirePackage("org.robolectric.annotation.") 61 .doNotAcquirePackage("org.robolectric.internal.") 62 .doNotAcquirePackage("org.robolectric.manifest.") 63 .doNotAcquirePackage("org.robolectric.res.") 64 .doNotAcquirePackage("org.robolectric.util.") 65 .doNotAcquirePackage("org.robolectric.RobolectricTestRunner$") 66 .doNotAcquirePackage("sun.") 67 .doNotAcquirePackage("com.sun.") 68 .doNotAcquirePackage("org.w3c.") 69 .doNotAcquirePackage("org.xml.") 70 .doNotAcquirePackage("org.specs2") // allows for android projects with mixed scala\java tests to be 71 .doNotAcquirePackage("scala.") // run with Maven Surefire (see the RoboSpecs project on github) 72 .doNotAcquirePackage("kotlin.") 73 .doNotAcquirePackage("com.almworks.sqlite4java"); // Fix #958: SQLite native library must be loaded once. 74 75 builder 76 .addClassNameTranslation( 77 "java.net.ExtendedResponseCache", RoboExtendedResponseCache.class.getName()) 78 .addClassNameTranslation("java.net.ResponseSource", RoboResponseSource.class.getName()) 79 .addClassNameTranslation("java.nio.charset.Charsets", RoboCharsets.class.getName()) 80 .addClassNameTranslation("java.lang.UnsafeByteSequence", Object.class.getName()) 81 .addClassNameTranslation("java.util.jar.StrictJarFile", Object.class.getName()) 82 .addClassNameTranslation("sun.misc.Cleaner", RoboCleaner.class.getName()); 83 84 // Instrumenting these classes causes a weird failure. 85 builder.doNotInstrumentClass("android.R") 86 .doNotInstrumentClass("android.R$styleable"); 87 88 builder.addInstrumentedPackage("dalvik.") 89 .addInstrumentedPackage("libcore.") 90 .addInstrumentedPackage("android.") 91 .addInstrumentedPackage("com.android.internal.") 92 .addInstrumentedPackage("org.apache.http.") 93 .addInstrumentedPackage("org.ccil.cowan.tagsoup") 94 .addInstrumentedPackage("org.kxml2."); 95 96 builder.doNotInstrumentPackage("android.support.test"); 97 98 for (ShadowProvider provider : ServiceLoader.load(ShadowProvider.class)) { 99 for (String packagePrefix : provider.getProvidedPackageNames()) { 100 builder.addInstrumentedPackage(packagePrefix); 101 } 102 } 103 } 104} 105