package org.robolectric.internal; import org.robolectric.RobolectricTestRunner; import org.robolectric.TestLifecycle; import org.robolectric.annotation.Config; import org.robolectric.annotation.Implements; import org.robolectric.internal.bytecode.InstrumentationConfiguration; import org.robolectric.internal.bytecode.Interceptors; import org.robolectric.internal.bytecode.MethodRef; import org.robolectric.android.fakes.RoboCharsets; import org.robolectric.android.fakes.RoboExtendedResponseCache; import org.robolectric.android.fakes.RoboResponseSource; import org.robolectric.manifest.AndroidManifest; import org.robolectric.res.ResourcePath; import org.robolectric.res.ResourceTable; import org.robolectric.res.builder.XmlBlock; import java.util.ServiceLoader; public class AndroidConfigurer { public static void withConfig(InstrumentationConfiguration.Builder builder, Config config) { for (Class<?> clazz : config.shadows()) { Implements annotation = clazz.getAnnotation(Implements.class); if (annotation == null) { throw new IllegalArgumentException(clazz + " is not annotated with @Implements"); } String className = annotation.className(); if (className.isEmpty()) { className = annotation.value().getName(); } if (!className.isEmpty()) { builder.addInstrumentedClass(className); } } for (String packageName : config.instrumentedPackages()) { builder.addInstrumentedPackage(packageName); } } public static void configure(InstrumentationConfiguration.Builder builder, Interceptors interceptors) { for (MethodRef methodRef : interceptors.getAllMethodRefs()) { builder.addInterceptedMethod(methodRef); } builder .doNotAcquireClass(TestLifecycle.class) .doNotAcquireClass(AndroidManifest.class) .doNotAcquireClass(RobolectricTestRunner.class) .doNotAcquireClass(RobolectricTestRunner.HelperTestRunner.class) .doNotAcquireClass(ResourcePath.class) .doNotAcquireClass(ResourceTable.class) .doNotAcquireClass(XmlBlock.class); builder .doNotAcquirePackage("javax.") .doNotAcquirePackage("org.junit") .doNotAcquirePackage("org.hamcrest") .doNotAcquirePackage("org.robolectric.annotation.") .doNotAcquirePackage("org.robolectric.internal.") .doNotAcquirePackage("org.robolectric.manifest.") .doNotAcquirePackage("org.robolectric.res.") .doNotAcquirePackage("org.robolectric.util.") .doNotAcquirePackage("org.robolectric.RobolectricTestRunner$") .doNotAcquirePackage("sun.") .doNotAcquirePackage("com.sun.") .doNotAcquirePackage("org.w3c.") .doNotAcquirePackage("org.xml.") .doNotAcquirePackage("org.specs2") // allows for android projects with mixed scala\java tests to be .doNotAcquirePackage("scala.") // run with Maven Surefire (see the RoboSpecs project on github) .doNotAcquirePackage("kotlin.") .doNotAcquirePackage("com.almworks.sqlite4java"); // Fix #958: SQLite native library must be loaded once. builder.addClassNameTranslation("java.net.ExtendedResponseCache", RoboExtendedResponseCache.class.getName()) .addClassNameTranslation("java.net.ResponseSource", RoboResponseSource.class.getName()) .addClassNameTranslation("java.nio.charset.Charsets", RoboCharsets.class.getName()) .addClassNameTranslation("java.lang.UnsafeByteSequence", Object.class.getName()); // Instrumenting these classes causes a weird failure. builder.doNotInstrumentClass("android.R") .doNotInstrumentClass("android.R$styleable"); builder.addInstrumentedPackage("dalvik.") .addInstrumentedPackage("libcore.") .addInstrumentedPackage("android.") .addInstrumentedPackage("com.android.internal.") .addInstrumentedPackage("org.apache.http.") .addInstrumentedPackage("org.ccil.cowan.tagsoup") .addInstrumentedPackage("org.kxml2."); for (ShadowProvider provider : ServiceLoader.load(ShadowProvider.class)) { for (String packagePrefix : provider.getProvidedPackageNames()) { builder.addInstrumentedPackage(packagePrefix); } } } }