blob: 67c4634de46f5017728d0936cf549c3d11a3f44d [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2009, 2016 Mountainminds GmbH & Co. KG and Contributors
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
*
* Contributors:
* Marc R. Hoffmann - initial API and implementation
*
*******************************************************************************/
package org.jacoco.core.test.validation;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.fail;
import java.io.IOException;
import org.jacoco.core.analysis.Analyzer;
import org.jacoco.core.analysis.CoverageBuilder;
import org.jacoco.core.analysis.ICounter;
import org.jacoco.core.analysis.ILine;
import org.jacoco.core.analysis.ISourceFileCoverage;
import org.jacoco.core.data.ExecutionData;
import org.jacoco.core.data.ExecutionDataStore;
import org.jacoco.core.internal.analysis.CounterImpl;
import org.jacoco.core.test.InstrumentingLoader;
import org.jacoco.core.test.TargetLoader;
import org.junit.Before;
/**
* Base class for validation tests. It executes the given class under code
* coverage and provides the coverage results for validation.
*/
public abstract class ValidationTestBase {
private static final String[] STATUS_NAME = new String[4];
{
STATUS_NAME[ICounter.EMPTY] = "NO_CODE";
STATUS_NAME[ICounter.NOT_COVERED] = "NOT_COVERED";
STATUS_NAME[ICounter.FULLY_COVERED] = "FULLY_COVERED";
STATUS_NAME[ICounter.PARTLY_COVERED] = "PARTLY_COVERED";
}
protected final String srcFolder;
protected final Class<?> target;
protected ISourceFileCoverage sourceCoverage;
protected Source source;
protected ValidationTestBase(final String srcFolder, final Class<?> target) {
this.srcFolder = srcFolder;
this.target = target;
}
protected ValidationTestBase(final Class<?> target) {
this("src", target);
}
@Before
public void setup() throws Exception {
final ExecutionDataStore store = execute();
analyze(store);
source = Source.getSourceFor(srcFolder, target);
}
private ExecutionDataStore execute() throws Exception {
InstrumentingLoader loader = new InstrumentingLoader(target);
run(loader.loadClass(target.getName()));
return loader.collect();
}
protected void run(final Class<?> targetClass) throws Exception {
targetClass.getMethod("main", String[].class).invoke(null,
(Object) new String[0]);
}
private void analyze(final ExecutionDataStore store) throws IOException {
final CoverageBuilder builder = new CoverageBuilder();
final Analyzer analyzer = new Analyzer(store, builder);
for (ExecutionData data : store.getContents()) {
analyze(analyzer, data);
}
String srcName = target.getName().replace('.', '/') + ".java";
for (ISourceFileCoverage file : builder.getSourceFiles()) {
if (srcName.equals(file.getPackageName() + "/" + file.getName())) {
sourceCoverage = file;
return;
}
}
fail("No source node found for " + srcName);
}
private void analyze(final Analyzer analyzer, final ExecutionData data)
throws IOException {
final byte[] bytes = TargetLoader.getClassDataAsBytes(
target.getClassLoader(), data.getName());
analyzer.analyzeClass(bytes, data.getName());
}
protected void assertLine(final String tag, final int status) {
final int nr = source.getLineNumber(tag);
final ILine line = sourceCoverage.getLine(nr);
final String msg = String.format("Status in line %s: %s",
Integer.valueOf(nr), source.getLine(nr));
final int insnStatus = line.getInstructionCounter().getStatus();
assertEquals(msg, STATUS_NAME[status], STATUS_NAME[insnStatus]);
}
protected void assertLine(final String tag, final int missedBranches,
final int coveredBranches) {
final int nr = source.getLineNumber(tag);
final ILine line = sourceCoverage.getLine(nr);
final String msg = String.format("Branches in line %s: %s",
Integer.valueOf(nr), source.getLine(nr));
assertEquals(msg + " branches",
CounterImpl.getInstance(missedBranches, coveredBranches),
line.getBranchCounter());
}
protected void assertLine(final String tag, final int status,
final int missedBranches, final int coveredBranches) {
assertLine(tag, status);
assertLine(tag, missedBranches, coveredBranches);
}
}