/*
* Copyright (c) 2006 Rogério Liesenfeld
* This file is subject to the terms of the MIT license (see LICENSE.txt).
*/
package mockit.internal.startup;
import java.lang.instrument.*;
import java.util.*;
import javax.annotation.*;
import mockit.*;
import mockit.coverage.*;
import mockit.integration.junit4.internal.*;
import mockit.internal.reflection.*;
import mockit.internal.util.*;
final class JMockitInitialization
{
@Nonnull private final StartupConfiguration config;
JMockitInitialization() { config = new StartupConfiguration(); }
void initialize(@Nonnull Instrumentation inst)
{
preventEventualClassLoadingConflicts();
applyInternalStartupMocksAsNeeded();
if (CodeCoverage.active()) {
inst.addTransformer(new CodeCoverage());
}
applyUserSpecifiedStartupMocksIfAny();
}
private static void preventEventualClassLoadingConflicts()
{
// Ensure the proper loading of data files by the JRE, whose names depend on calls to the System class,
// which may get @Mocked.
TimeZone.getDefault();
Currency.getInstance(Locale.getDefault());
DefaultValues.computeForReturnType("()J");
Utilities.calledFromSpecialThread();
}
private void applyInternalStartupMocksAsNeeded()
{
if (MockFrameworkMethod.hasDependenciesInClasspath()) {
new RunNotifierDecorator();
new MockFrameworkMethod();
}
}
private void applyUserSpecifiedStartupMocksIfAny()
{
for (String mockClassName : config.mockClasses) {
applyStartupMock(mockClassName);
}
}
private static void applyStartupMock(@Nonnull String mockClassName)
{
String argument = null;
int p = mockClassName.indexOf('=');
if (p > 0) {
argument = mockClassName.substring(p + 1);
mockClassName = mockClassName.substring(0, p);
}
try {
Class<?> mockClass = ClassLoad.loadClassAtStartup(mockClassName);
if (MockUp.class.isAssignableFrom(mockClass)) {
if (argument == null) {
ConstructorReflection.newInstanceUsingDefaultConstructor(mockClass);
}
else {
ConstructorReflection.newInstance(mockClass, argument);
}
}
}
catch (UnsupportedOperationException ignored) {}
catch (Throwable unexpectedFailure) {
StackTrace.filterStackTrace(unexpectedFailure);
unexpectedFailure.printStackTrace();
}
}
}