/*
* Copyright 2012 James Moger
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.moxie.mxtest;
import java.io.File;
import java.io.IOException;
import org.apache.tools.ant.Project;
import org.apache.tools.ant.types.Path;
import org.apache.tools.ant.types.Reference;
import org.apache.tools.ant.types.resources.Union;
import org.jacoco.agent.AgentJar;
import org.jacoco.ant.ReportTask;
import org.jacoco.ant.ReportTask.GroupElement;
import org.jacoco.ant.ReportTask.SourceFilesElement;
import org.jacoco.core.runtime.AgentOptions;
import org.moxie.MoxieException;
import org.moxie.Toolkit.Key;
import org.moxie.ant.MxTest;
import org.moxie.maxml.MaxmlMap;
/**
* Utility class for JaCoCo code-coverage.
*/
public class Jacoco {
public static String newJvmarg(MxTest mxtest) {
AgentOptions options = new AgentOptions();
options.setDestfile(mxtest.getJaCoCoData().getAbsolutePath());
// TODO reflective attributes here
String vmarg = options.getVMArgument(getAgentFile(mxtest.getProject()));
return vmarg;
}
private static File getAgentFile(Project project) {
try {
File agentFile = null;
final String agentFileLocation = project.getProperty("_jacoco.agentFile");
if (agentFileLocation != null) {
agentFile = new File(agentFileLocation);
} else {
agentFile = AgentJar.extractToTempLocation();
project.setProperty("_jacoco.agentFile", agentFile.toString());
}
return agentFile;
} catch (final IOException e) {
throw new MoxieException("Unable to extract agent jar", e);
}
}
public static void report(MxTest mxtest) {
ReportTask task = new ReportTask();
task.setTaskName("report");
task.setProject(mxtest.getProject());
task.init();
// execution data
Union executiondata = task.createExecutiondata();
Path jacocodata = new Path(mxtest.getProject());
jacocodata.setPath(mxtest.getJaCoCoData().getAbsolutePath());
executiondata.add(jacocodata);
GroupElement structure = task.createStructure();
structure.setName(mxtest.getProjectTitle());
// classfiles
Union classfiles = structure.createClassfiles();
Path outputpath = new Path(mxtest.getProject());
outputpath.setPath(mxtest.getClassesDir().getAbsolutePath());
classfiles.add(outputpath);
MaxmlMap attributes = mxtest.getBuild().getConfig().getTaskAttributes(mxtest.getTaskName());
if (attributes == null) {
attributes = new MaxmlMap();
}
// source files
SourceFilesElement sourcefiles = structure.createSourcefiles();
sourcefiles.setEncoding(attributes.getString("encoding", null));
Path sourcepath = new Path(mxtest.getProject());
sourcepath.setRefid(new Reference(mxtest.getProject(), Key.compileSourcePath.referenceId()));
sourcefiles.add(sourcepath);
// report output folder
task.createHtml().setDestdir(mxtest.getCoverageReports());
task.execute();
}
}