package com.ikokoon.serenity.instrumentation.dependency; import static org.junit.Assert.assertNotNull; import static org.junit.Assert.assertTrue; import java.io.Serializable; import java.lang.reflect.Field; import java.util.List; import org.apache.log4j.Logger; import org.junit.Before; import org.junit.Test; import org.objectweb.asm.Opcodes; import com.ikokoon.serenity.ATest; import com.ikokoon.serenity.Configuration; import com.ikokoon.serenity.model.Afferent; import com.ikokoon.serenity.model.Class; import com.ikokoon.serenity.model.Efferent; import com.ikokoon.serenity.model.Method; import com.ikokoon.serenity.model.Package; import com.ikokoon.target.TargetAccess; import com.ikokoon.target.consumer.Annotation; import com.ikokoon.target.consumer.TargetConsumer; import com.ikokoon.toolkit.Toolkit; public class DependencyTest extends ATest { // private IDataBase dataBase; @Before public void clear() { // dataBase = IDataBase.DataBaseManager.getDataBase(DataBaseRam.class, IConstants.DATABASE_FILE_RAM, mockInternalDataBase); // DataBaseToolkit.clear(dataBase); // Collector.initialize(dataBase); } @Test public void visitInner() throws Exception { // logger.info("***************************************************"); // visitClass(DependencyClassAdapter.class, Discovery.class.getName()); // logger.info("***************************************************"); // visitClass(DependencyClassAdapter.class, Discovery.InnerClass.class.getName()); // logger.info("***************************************************"); // visitClass(DependencyClassAdapter.class, Discovery.InnerClass.InnerInnerClass.class.getName()); } @Test public void visit() throws Exception { // DataBaseToolkit.clear(dataBase); Configuration.getConfiguration().includedPackages.add(className); Configuration.getConfiguration().includedPackages.add(packageName); Configuration.getConfiguration().includedPackages.add(Logger.class.getPackage().getName()); visitClass(DependencyClassAdapter.class, className); Package<?, ?> pakkage = (Package<?, ?>) dataBase.find(Package.class, Toolkit.hash(packageName)); assertNotNull(pakkage); Class<?, ?> klass = (Class<?, ?>) dataBase.find(Class.class, Toolkit.hash(className)); assertNotNull(klass); List<Afferent> afferent = klass.getAfferent(); List<Efferent> efferent = klass.getEfferent(); assertTrue(containsAfferentPackage(afferent, Logger.class.getPackage().getName())); assertTrue(containsAfferentPackage(afferent, Serializable.class.getPackage().getName())); assertTrue(containsAfferentPackage(afferent, Annotation.class.getPackage().getName())); visitClass(DependencyClassAdapter.class, TargetConsumer.class.getName()); assertTrue(containsEfferentPackage(efferent, TargetConsumer.class.getPackage().getName())); dataBase.remove(Package.class, Toolkit.hash(packageName)); // Test that Annotation has a reference to AnnotationAnnotation and visa versa // Test for field annotations and method annotations // Test for cyclic references? } @Test public void access() { String className = TargetAccess.class.getName(); visitClass(DependencyClassAdapter.class, className); Class<?, ?> klass = (Class<?, ?>) dataBase.find(Class.class, Toolkit.hash(className)); assertNotNull(klass); List<Class<?, ?>> innerClasses = klass.getInnerClasses(); for (Class<?, ?> innerClass : innerClasses) { logger.warn("Inner class : " + innerClass.getName() + ", " + innerClass.getAccess()); } List<Method<?, ?>> methods = klass.getChildren(); for (Method<?, ?> method : methods) { logger.warn("Method : " + method.getName() + ", " + method.getAccess()); } // printOpCodes(); } protected void printOpCodes() { // <j:set var="publicAccess" value="1" /> Field[] fields = Opcodes.class.getDeclaredFields(); Opcodes opcodes = new Opcodes() { }; for (Field field : fields) { StringBuilder builder = new StringBuilder("<j:set var=\""); builder.append(field.getName()); builder.append("\" value=\""); try { field.setAccessible(true); builder.append(field.get(opcodes)); } catch (Exception e) { logger.error("", e); } builder.append("\" />"); System.out.println(builder); } } private boolean containsAfferentPackage(List<Afferent> afferent, String name) { for (Afferent aff : afferent) { logger.debug("Afferent : " + aff); if (aff.getName().indexOf(name) > -1) { return true; } } return false; } private boolean containsEfferentPackage(List<Efferent> efferent, String name) { for (Efferent eff : efferent) { if (eff.getName().indexOf(name) > -1) { return true; } } return false; } }