package com.ikokoon.serenity.instrumentation.coverage; import java.io.ByteArrayOutputStream; import java.io.File; import org.junit.Test; import org.objectweb.asm.ClassWriter; import com.ikokoon.serenity.ATest; import com.ikokoon.serenity.IConstants; import com.ikokoon.serenity.instrumentation.VisitorFactory; import com.ikokoon.target.Simple; import com.ikokoon.toolkit.Toolkit; /** * This is the test for the alternative coverage instructions instrumentation. * * @author Michael Couck * @since 19.01.10 * @version 01.00 */ public class CoverageClassAdapterExtTest extends ATest { @Test @SuppressWarnings("unchecked") public void instrument() throws Exception { String className = Simple.class.getName(); byte[] classBytes = getClassBytes(className); byte[] sourceBytes = getSourceBytes(className); writeClass(className, classBytes); // Add the coverage instructions ByteArrayOutputStream source = new ByteArrayOutputStream(); source.write(sourceBytes); ClassWriter writer = (ClassWriter) VisitorFactory.getClassVisitor(new Class[] { CoverageClassAdapterExt.class }, className, classBytes, source); classBytes = writer.toByteArray(); writeClass(className, classBytes); // Verify the byte code is valid // CheckClassAdapter.verify(new ClassReader(classBytes), false, new PrintWriter(System.out)); } private void writeClass(String className, byte[] classBytes) { // Write the class so we can check it with JD decompiler visually String packageName = Toolkit.classNameToPackageName(className); String directoryPath = Toolkit.dotToSlash(packageName); String fileName = className.substring(className.indexOf(Toolkit.classNameToPackageName(className)) + packageName.length() + 1) + ".class"; logger.warn("Directory path : " + directoryPath + ", file name : " + fileName); File directory = new File(IConstants.SERENITY_DIRECTORY + File.separator + directoryPath); if (!directory.exists()) { directory.mkdirs(); } logger.warn("Absolute directory : " + directory.getAbsolutePath()); File file = new File(directory, fileName); Toolkit.setContents(file, classBytes); } }