blob: eb96b2eadb26b0256ad9236dd5a14e5697088808 [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2009, 2018 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:
* Brock Janiczak - initial API and implementation
*
*******************************************************************************/
package org.jacoco.ant;
import java.io.File;
import java.io.IOException;
import org.apache.tools.ant.BuildException;
import org.apache.tools.ant.Task;
import org.jacoco.agent.AgentJar;
import org.jacoco.core.runtime.AgentOptions;
import org.jacoco.core.runtime.AgentOptions.OutputMode;
/**
* Base class for all coverage tasks that require agent options
*/
public class AbstractCoverageTask extends Task {
private final AgentOptions agentOptions;
private File destfile;
private boolean enabled;
/**
* Create default agent options
*/
protected AbstractCoverageTask() {
super();
agentOptions = new AgentOptions();
destfile = new File(AgentOptions.DEFAULT_DESTFILE);
enabled = true;
}
/**
* @return Whether or not the current task is enabled
*/
public boolean isEnabled() {
return enabled;
}
/**
* Sets whether or not the current task is enabled
*
* @param enabled
* Enablement state of the task
*/
public void setEnabled(final boolean enabled) {
this.enabled = enabled;
}
/**
* Sets the location to write coverage execution data to. Default is
* <code>jacoco.exec</code>.
*
* @param file
* Location to write coverage execution data to
*/
public void setDestfile(final File file) {
destfile = file;
}
/**
* Append execution coverage data if a coverage file is already present.
* Default is <code>true</code>
*
* @param append
* <code>true</code> to append execution data to an existing file
*/
public void setAppend(final boolean append) {
agentOptions.setAppend(append);
}
/**
* List of wildcard patterns classes to include for instrumentation. Default
* is <code>*</code>
*
* @param includes
* Wildcard pattern of included classes
*/
public void setIncludes(final String includes) {
agentOptions.setIncludes(includes);
}
/**
* List of wildcard patterns classes to exclude from instrumentation.
* Default is the empty string, no classes excluded
*
* @param excludes
* Wildcard pattern of excluded classes
*/
public void setExcludes(final String excludes) {
agentOptions.setExcludes(excludes);
}
/**
* List of wildcard patterns for classloaders that JaCoCo will not
* instrument classes from. Default is
* <code>sun.reflect.DelegatingClassLoader</code>
*
* @param exclClassLoader
* Wildcard pattern of class loaders to exclude
*/
public void setExclClassLoader(final String exclClassLoader) {
agentOptions.setExclClassloader(exclClassLoader);
}
/**
* Sets whether classes from the bootstrap classloader should be
* instrumented.
*
* @param include
* <code>true</code> if bootstrap classes should be instrumented
*/
public void setInclBootstrapClasses(final boolean include) {
agentOptions.setInclBootstrapClasses(include);
}
/**
* Sets whether classes without source location should be instrumented.
*
* @param include
* <code>true</code> if classes without source location should be
* instrumented
*/
public void setInclNoLocationClasses(final boolean include) {
agentOptions.setInclNoLocationClasses(include);
}
/**
* Sets the session identifier. Default is a auto-generated id
*
* @param id
* session identifier
*/
public void setSessionId(final String id) {
agentOptions.setSessionId(id);
}
/**
* Dump coverage data on VM termination. Default is <code>true</code>
*
* @param dumpOnExit
* <code>true</code> to write coverage data on VM termination
*/
public void setDumpOnExit(final boolean dumpOnExit) {
agentOptions.setDumpOnExit(dumpOnExit);
}
/**
* Sets the output method. Default is <code>file</code>
*
* @param output
* Output method
*/
public void setOutput(final String output) {
agentOptions.setOutput(output);
}
/**
* Sets the IP address or hostname to bind to when output method is tcp
* server or connect to when the output method is tcp client. Default is
* <code>localhost</code>
*
* @param address
* Address to bind or connect to
*/
public void setAddress(final String address) {
agentOptions.setAddress(address);
}
/**
* Sets the Port to bind to when the output method is tcp server or connect
* to when the output method is tcp client. Default is <code>6300</code>
*
* @param port
* port to bind to or connect to
*/
public void setPort(final int port) {
agentOptions.setPort(port);
}
/**
* Sets the directory where all class files seen by the agent should be
* dumped to.
*
* @param dir
* dump output location
*/
public void setClassdumpdir(final File dir) {
agentOptions.setClassDumpDir(dir.getAbsolutePath());
}
/**
* Sets whether the agent should expose functionality via JMX.
*
* @param jmx
* <code>true</code> if JMX should be enabled
*/
public void setJmx(final boolean jmx) {
agentOptions.setJmx(jmx);
}
/**
* Creates JVM argument to launch with the specified JaCoCo agent jar and
* the current options
*
* @return JVM Argument to pass to new VM
*/
protected String getLaunchingArgument() {
return prepareAgentOptions().getVMArgument(getAgentFile());
}
private AgentOptions prepareAgentOptions() {
if (OutputMode.file.equals(agentOptions.getOutput())) {
agentOptions.setDestfile(destfile.getAbsolutePath());
}
return agentOptions;
}
private File getAgentFile() {
try {
File agentFile = null;
final String agentFileLocation = getProject().getProperty(
"_jacoco.agentFile");
if (agentFileLocation != null) {
agentFile = new File(agentFileLocation);
} else {
agentFile = AgentJar.extractToTempLocation();
getProject().setProperty("_jacoco.agentFile",
agentFile.toString());
}
return agentFile;
} catch (final IOException e) {
throw new BuildException("Unable to extract agent jar", e,
getLocation());
}
}
}