package com.ikokoon.serenity;
import static org.mockito.Mockito.mock;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.util.ArrayList;
import org.apache.log4j.Logger;
import org.junit.AfterClass;
import org.junit.BeforeClass;
import org.objectweb.asm.ClassWriter;
import org.objectweb.asm.Type;
import com.ikokoon.serenity.instrumentation.VisitorFactory;
import com.ikokoon.serenity.model.Afferent;
import com.ikokoon.serenity.model.Class;
import com.ikokoon.serenity.model.Efferent;
import com.ikokoon.serenity.model.Line;
import com.ikokoon.serenity.model.Method;
import com.ikokoon.serenity.model.Package;
import com.ikokoon.serenity.persistence.DataBaseRam;
import com.ikokoon.serenity.persistence.IDataBase;
import com.ikokoon.target.Target;
import com.ikokoon.toolkit.LoggingConfigurator;
import com.ikokoon.toolkit.Toolkit;
/**
* Base class for the tests.
*
* @author Michael Couck
* @since 30.07.09
* @version 01.00
*/
public abstract class ATest implements IConstants {
protected static Logger logger;
protected static IDataBase mockInternalDataBase = mock(IDataBase.class);
protected static IDataBase dataBase;
protected Type stringType = Type.getType(String.class);
protected Type integerType = Type.getType(Integer.class);
protected Type[] types = new Type[] { stringType, stringType, stringType, integerType, integerType };
protected String packageName = Target.class.getPackage().getName();
protected String className = Target.class.getName();
protected String methodName = "complexMethod";
protected String methodDescription = Type.getMethodDescriptor(Type.VOID_TYPE, types);
protected double lineNumber = 70;
protected double complexity = 10d;
protected int access = 1537;
protected String efferentName = "efferentName";
protected String afferentName = "afferentName";
@BeforeClass
public static void beforeClass() {
LoggingConfigurator.configure();
logger = Logger.getLogger(ATest.class);
System.setProperty(IConstants.INCLUDED_ADAPTERS_PROPERTY, "profiling;coverage;complexity;dependency");
Configuration.getConfiguration().includedPackages.add(IConstants.class.getPackage().getName());
Configuration.getConfiguration().includedPackages.add(Target.class.getPackage().getName());
Configuration.getConfiguration().includedPackages.add(Configuration.class.getPackage().getName());
dataBase = IDataBase.DataBaseManager.getDataBase(DataBaseRam.class, IConstants.DATABASE_FILE_RAM, mockInternalDataBase);
Collector.initialize(dataBase);
}
@AfterClass
public static void afterClass() {
dataBase.close();
}
protected void visitClass(java.lang.Class<?> visitorClass, String className) {
byte[] classBytes = getClassBytes(className);
byte[] sourceBytes = getSourceBytes(className);
visitClass(visitorClass, className, classBytes, sourceBytes);
}
@SuppressWarnings("unchecked")
protected ClassWriter visitClass(java.lang.Class<?> visitorClass, String className, byte[] classBytes, byte[] sourceBytes) {
ByteArrayOutputStream source = new ByteArrayOutputStream();
try {
source.write(sourceBytes);
} catch (IOException e) {
logger.error("", e);
}
ClassWriter writer = (ClassWriter) VisitorFactory.getClassVisitor(new java.lang.Class[] { visitorClass }, className, classBytes, source);
return writer;
}
protected byte[] getClassBytes(String className) {
String classPath = Toolkit.dotToSlash(className) + ".class";
InputStream inputStream = ClassLoader.getSystemClassLoader().getResourceAsStream(classPath);
byte[] classBytes = Toolkit.getContents(inputStream).toByteArray();
return classBytes;
}
protected byte[] getSourceBytes(String className) {
String classPath = Toolkit.dotToSlash(className) + ".java";
InputStream inputStream = ClassLoader.getSystemClassLoader().getResourceAsStream(classPath);
byte[] sourceBytes = Toolkit.getContents(inputStream).toByteArray();
return sourceBytes;
}
@SuppressWarnings("unchecked")
protected Package<?, ?> getPackage() {
Package pakkage = new Package();
pakkage.setAbstractness(1d);
pakkage.setAfference(1d);
pakkage.setChildren(new ArrayList<Class>());
pakkage.setComplexity(1d);
pakkage.setCoverage(1d);
pakkage.setDistance(1d);
pakkage.setEfference(1d);
pakkage.setImplementations(1d);
pakkage.setInterfaces(1d);
pakkage.setName(packageName);
pakkage.setStability(1d);
getClass(pakkage);
return pakkage;
}
@SuppressWarnings("unchecked")
protected Class<?, ?> getClass(Package<?, ?> pakkage) {
Class klass = new Class();
klass.setParent(pakkage);
pakkage.getChildren().add(klass);
klass.setAfference(1d);
klass.setComplexity(1d);
klass.setCoverage(1d);
klass.setEfference(1d);
Efferent efferent = new Efferent();
efferent.setName(efferentName);
klass.getEfferent().add(efferent);
Afferent afferent = new Afferent();
afferent.setName(afferentName);
klass.getAfferent().add(afferent);
klass.setInterfaze(false);
klass.setName(className);
klass.setStability(1d);
getMethod(klass);
return klass;
}
@SuppressWarnings("unchecked")
protected Method<?, ?> getMethod(Class<?, ?> klass) {
Method method = new Method();
method.setParent(klass);
method.setClassName(klass.getName());
klass.getChildren().add(method);
method.setComplexity(1d);
method.setCoverage(1d);
method.setDescription(methodDescription);
method.setName(methodName);
getLine(method);
return method;
}
@SuppressWarnings("unchecked")
protected Line<?, ?> getLine(Method<?, ?> method) {
Line line = new Line();
line.setCounter(1d);
line.setNumber(lineNumber);
line.setParent(method);
line.setMethodName(method.getName());
line.setClassName(method.getClassName());
method.getChildren().add(line);
return line;
}
}