package hudson.plugins.cobertura;
import junit.framework.TestCase;
import hudson.plugins.cobertura.targets.CoverageResult;
import hudson.plugins.cobertura.targets.CoverageMetric;
import java.io.InputStream;
import java.util.Collections;
import java.util.LinkedHashMap;
import java.util.Map;
import java.util.Set;
import java.util.HashSet;
import static junit.framework.Assert.assertEquals;
import static junit.framework.Assert.assertNotNull;
import org.jvnet.hudson.test.Bug;
import org.netbeans.insane.scanner.CountingVisitor;
import org.netbeans.insane.scanner.ScannerUtils;
/**
* Unit tests for {@link CoberturaCoverageParser}.
*
* @author Stephen Connolly
* @version 1.0
* @author davidmc24
*/
public class CoberturaCoverageParserTest extends TestCase {
public CoberturaCoverageParserTest(String name) {
super(name);
}
public void testFailureMode1() throws Exception {
try {
CoberturaCoverageParser.parse((InputStream)null, null);
} catch (NullPointerException e) {
assertTrue("Expected exception thrown", true);
}
}
public void print(CoverageResult r, int d) {
System.out.print(" ".substring(0, d*2));
System.out.print(r.getElement() + "[" + r.getName() + "]");
for (CoverageMetric m : r.getMetrics()) {
System.out.print(" " + m + "=" + r.getCoverage(m));
}
System.out.println();
for (String child: r.getChildren()) {
print(r.getChild(child), d + 1);
}
}
public void testParse() throws Exception {
Set<String> paths = new HashSet<String>();
CoverageResult result = CoberturaCoverageParser.parse(getClass().getResourceAsStream("coverage.xml"), null, paths);
result.setOwner(null);
print(result, 0);
assertNotNull(result);
assertEquals(CoverageResult.class, result.getClass());
assertEquals(Messages.CoberturaCoverageParser_name(), result.getName());
// assertEquals(10, result.getMethods());
assertEquals(2, result.getChildren().size());
CoverageResult subResult = result.getChild("<default>");
assertEquals("<default>", subResult.getName());
assertEquals(1, subResult.getChildren().size());
assertEquals(Ratio.create(0, 3), subResult.getCoverage(CoverageMetric.METHOD));
assertEquals(Ratio.create(0, 11), subResult.getCoverage(CoverageMetric.LINE));
subResult = result.getChild("search");
assertEquals("search", subResult.getName());
assertEquals(3, subResult.getChildren().size());
assertEquals(Ratio.create(0, 19), subResult.getCoverage(CoverageMetric.LINE));
assertEquals(Ratio.create(0, 12), subResult.getCoverage(CoverageMetric.CONDITIONAL));
assertEquals(Ratio.create(0, 4), subResult.getCoverage(CoverageMetric.METHOD));
assertEquals(1, paths.size());
}
public void testParse2() throws Exception {
CoverageResult result = CoberturaCoverageParser.parse(getClass().getResourceAsStream("coverage-with-data.xml"), null);
result.setOwner(null);
print(result, 0);
assertNotNull(result);
assertEquals(CoverageResult.class, result.getClass());
assertEquals(Messages.CoberturaCoverageParser_name(), result.getName());
// assertEquals(10, result.getMethods());
assertEquals(2, result.getChildren().size());
CoverageResult subResult = result.getChild("<default>");
assertEquals("<default>", subResult.getName());
assertEquals(1, subResult.getChildren().size());
assertEquals(Ratio.create(3, 3), subResult.getCoverage(CoverageMetric.METHOD));
assertEquals(Ratio.create(11, 11), subResult.getCoverage(CoverageMetric.LINE));
subResult = result.getChild("search");
assertEquals("search", subResult.getName());
assertEquals(3, subResult.getChildren().size());
assertEquals(Ratio.create(16, 19), subResult.getCoverage(CoverageMetric.LINE));
assertEquals(Ratio.create(9, 12), subResult.getCoverage(CoverageMetric.CONDITIONAL));
assertEquals(Ratio.create(4, 4), subResult.getCoverage(CoverageMetric.METHOD));
}
@Bug(16252)
public void testParse_NotRelativeSourcePath() throws Exception {
Set<String> paths = new HashSet<String>();
CoverageResult result = CoberturaCoverageParser.parse(getClass().getResourceAsStream("coverage_16252.xml"), null, paths);
result.setOwner(null);
print(result, 0);
assertNotNull(result);
assertEquals(CoverageResult.class, result.getClass());
assertEquals(Messages.CoberturaCoverageParser_name(), result.getName());
assertEquals(4, result.getChildren().size());
CoverageResult subResult = result.getChild("Common");
assertEquals("Common", subResult.getName());
CoverageResult sub2Result = subResult.getChild("CommonLibrary/ProfilerTest.cpp");
assertNotNull(sub2Result);
assertEquals("CommonLibrary/ProfilerTest.cpp", sub2Result.getRelativeSourcePath());
}
public void testParseMultiPackage() throws Exception {
// ProjectCoverage result = CoberturaCoverageParser.parse(getClass().getResourceAsStream("coverage-two-packages.xml"));
// result = CoberturaCoverageParser.trimPaths(result, "C:\\local\\maven\\helpers\\hudson\\cobertura\\");
// assertNotNull(result);
// assertEquals(ProjectCoverage.class, result.getClass());
// assertEquals("Maven Cloverreport", result.getName());
//// assertEquals(40, result.getMethods());
// assertEquals(2, result.getPackageCoverages().size());
//// assertEquals(14, result.findClassCoverage("hudson.plugins.cobertura.results.AbstractCloverMetrics").getCoveredmethods());
}
/**
* Tests the memory usage of
* {@link CoberturaCoverageParser#parse(InputStream, CoverageResult, Set)}.
*
* @since 28-Apr-2009
*/
public void testParseMemoryUsage() throws Exception {
Map<String,Integer> files = new LinkedHashMap<String,Integer>();
files.put("coverage.xml", 16152);
files.put("coverage-with-data.xml", 16232);
files.put("coverage-with-lots-of-data.xml", 298960);
for (Map.Entry<String,Integer> e : files.entrySet()) {
final String fileName = e.getKey();
InputStream in = getClass().getResourceAsStream(fileName);
CoverageResult result = CoberturaCoverageParser.parse(in, null, null);
result.setOwner(null);
assertMaxMemoryUsage(fileName + " results", result, e.getValue());
}
}
/**
* Tests the memory usage of a specified object.
* The memory usage is then compared with the specified
* maximum desired memory usage. If the average memory usage is greater
* than the specified number, it will be reported as a failed assertion.
*
* @param description a plain-text description, to be used
* in diagnostic messages
* @param o the object to measure
* @param maxMemoryUsage the maximum desired memory usage for the Callable,
* in bytes
*/
private static void assertMaxMemoryUsage(String description, Object o, int maxMemoryUsage) throws Exception {
CountingVisitor v = new CountingVisitor();
ScannerUtils.scan(null, v, Collections.singleton(o), false);
long memoryUsage = v.getTotalSize();
String message = description + " consume " + memoryUsage + " bytes of memory on average, " + (memoryUsage - maxMemoryUsage) + " bytes more than the specified limit of " + maxMemoryUsage + " bytes";
assertTrue(message, memoryUsage <= maxMemoryUsage);
System.out.println(description + " consume " + memoryUsage + "/" + maxMemoryUsage + " bytes of memory");
}
}