
org.robolectric.internal.InstrumentingClassLoaderFactory Maven / Gradle / Ivy
Go to download
Show more of this group Show more artifacts with this name
Show all versions of robolectric Show documentation
Show all versions of robolectric Show documentation
An alternative Android testing framework.
package org.robolectric.internal;
import org.robolectric.internal.bytecode.InstrumentationConfiguration;
import org.robolectric.internal.bytecode.InstrumentingClassLoader;
import org.robolectric.internal.dependency.DependencyJar;
import org.robolectric.internal.dependency.DependencyResolver;
import org.robolectric.util.Pair;
import java.net.URL;
import java.util.LinkedHashMap;
import java.util.Map;
public class InstrumentingClassLoaderFactory {
/** The factor for cache size. See {@link #CACHE_SIZE} for details. */
private static final int CACHE_SIZE_FACTOR = 3;
/** We need to set the cache size of class loaders more than the number of supported APIs as different tests may have different configurations. */
private static final int CACHE_SIZE = SdkConfig.getSupportedApis().size() * CACHE_SIZE_FACTOR;
// Simple LRU Cache. SdkEnvironments are unique across InstrumentingClassloaderConfig and SdkConfig
private static final LinkedHashMap, SdkEnvironment> sdkToEnvironment = new LinkedHashMap, SdkEnvironment>() {
@Override
protected boolean removeEldestEntry(Map.Entry, SdkEnvironment> eldest) {
return size() > CACHE_SIZE;
}
};
private final InstrumentationConfiguration instrumentationConfig;
private final DependencyResolver dependencyResolver;
public InstrumentingClassLoaderFactory(InstrumentationConfiguration instrumentationConfig, DependencyResolver dependencyResolver) {
this.instrumentationConfig = instrumentationConfig;
this.dependencyResolver = dependencyResolver;
}
public synchronized SdkEnvironment getSdkEnvironment(SdkConfig sdkConfig) {
Pair key = Pair.create(instrumentationConfig, sdkConfig);
SdkEnvironment sdkEnvironment = sdkToEnvironment.get(key);
if (sdkEnvironment == null) {
URL[] urls = dependencyResolver.getLocalArtifactUrls(
sdkConfig.getAndroidSdkDependency(),
sdkConfig.getCoreShadowsDependency());
ClassLoader robolectricClassLoader = new InstrumentingClassLoader(instrumentationConfig, urls);
sdkEnvironment = new SdkEnvironment(sdkConfig, robolectricClassLoader);
sdkToEnvironment.put(key, sdkEnvironment);
}
return sdkEnvironment;
}
}
© 2015 - 2025 Weber Informatics LLC | Privacy Policy