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