package net.sourceforge.cobertura.instrument;
import java.io.DataOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.PrintWriter;
import java.io.StringWriter;
import java.util.List;
import org.apache.log4j.Logger;
import org.objectweb.asm.ClassReader;
import org.objectweb.asm.ClassWriter;
import org.objectweb.asm.util.CheckClassAdapter;
public class TestUnitInstrumenter {
public TestUnitInstrumenter(List<File> testUnitFiles) {
LOGGER.debug("================== Start Instrumenting Test Units ==================");
FileInputStream fis = null;
try {
for (File file : testUnitFiles) {
fis = new FileInputStream(file);
System.err.println(file.getAbsolutePath());
ClassReader cr = new ClassReader(fis);
ClassWriter cw = new CoberturaClassWriter(ClassWriter.COMPUTE_FRAMES);
TestUnitVisitor cv = new TestUnitVisitor(cw, fis);
// TODO: For scala we insert do a check and override a new TestUnitClassVisitor specific
// to scala.
cr.accept(cv, ClassReader.EXPAND_FRAMES);
StringWriter sw = new StringWriter();
PrintWriter pw = new PrintWriter(sw);
CheckClassAdapter.verify(new ClassReader(cw.toByteArray()), false,
pw);
System.err.println(sw.toString());
DataOutputStream dos=new DataOutputStream(new FileOutputStream(file));
dos.write(cw.toByteArray());
dos.flush();
dos.close();
LOGGER.debug("Instrumented: " + file.getName());
}
} catch (IOException e) {
e.printStackTrace();
} finally {
LOGGER.debug("================== Done Instrumenting Test Units ==================");
}
}
private static final Logger LOGGER = Logger.getLogger(TestUnitInstrumenter.class);
}