# Licensed to the Apache Software Foundation (ASF) under one or more | |
# contributor license agreements. See the NOTICE file distributed with this | |
# work for additional information regarding copyright ownership. The ASF | |
# licenses this file to you 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. | |
module Buildr | |
# Initial support for JaCoCo coverage reports. | |
# WARNING: Experimental and may change radically. | |
module JaCoCo | |
class << self | |
VERSION = '0.5.10.201208310627' | |
def version | |
@version || Buildr.settings.build['jacoco'] || VERSION | |
end | |
def version=(value) | |
@version = value | |
end | |
def agent_spec | |
["org.jacoco:org.jacoco.agent:jar:runtime:#{version}"] | |
end | |
def ant_spec | |
[ | |
"org.jacoco:org.jacoco.report:jar:#{version}", | |
"org.jacoco:org.jacoco.core:jar:#{version}", | |
"org.jacoco:org.jacoco.ant:jar:#{version}", | |
'asm:asm:jar:3.3.1', | |
'asm:asm-commons:jar:3.3.1', | |
'asm:asm-tree:jar:3.3.1' | |
] | |
end | |
end | |
class Config | |
attr_writer :enabled | |
def enabled? | |
@enabled.nil? ? true : @enabled | |
end | |
attr_writer :destfile | |
def destfile | |
@destfile || "#{self.report_dir}/jacoco.cov" | |
end | |
attr_writer :output | |
def output | |
@output || 'file' | |
end | |
attr_accessor :sessionid | |
attr_accessor :address | |
attr_accessor :port | |
attr_accessor :classdumpdir | |
attr_accessor :dumponexit | |
attr_accessor :append | |
attr_accessor :exclclassloader | |
def includes | |
@includes ||= [] | |
end | |
def excludes | |
@excludes ||= [] | |
end | |
attr_writer :report_dir | |
def report_dir | |
@report_dir || project._(:reports, :jacoco) | |
end | |
attr_writer :generate_xml | |
def generate_xml? | |
@generate_xml.nil? ? false : @generate_xml | |
end | |
attr_writer :xml_output_file | |
def xml_output_file | |
@xml_output_file || "#{self.report_dir}/jacoco.xml" | |
end | |
attr_writer :generate_html | |
def generate_html? | |
@generate_html.nil? ? false : @generate_html | |
end | |
attr_writer :html_output_directory | |
def html_output_directory | |
@html_output_directory || "#{self.report_dir}/jacoco" | |
end | |
protected | |
def initialize(project) | |
@project = project | |
end | |
attr_reader :project | |
end | |
module ProjectExtension | |
include Extension | |
def jacoco | |
@jacoco ||= Buildr::JaCoCo::Config.new(project) | |
end | |
after_define do |project| | |
unless project.test.compile.target.nil? || !project.jacoco.enabled? | |
project.test.setup do | |
agent_jar = Buildr.artifacts(Buildr::JaCoCo.agent_spec).each(&:invoke).map(&:to_s).join('') | |
options = [] | |
["destfile", | |
"append", | |
"exclclassloader", | |
"sessionid", | |
"dumponexit", | |
"output", | |
"address", | |
"port", | |
"classdumpdir"].each do |option| | |
value = project.jacoco.send(option.to_sym) | |
options << "#{option}=#{value}" unless value.nil? | |
end | |
options << "includes=#{project.jacoco.includes.join(':')}" unless project.jacoco.includes.empty? | |
options << "excludes=#{project.jacoco.excludes.join(':')}" unless project.jacoco.excludes.empty? | |
agent_config = "-javaagent:#{agent_jar}=#{options.join(',')}" | |
project.test.options[:java_args] = (project.test.options[:java_args] || []) + [agent_config] | |
end | |
namespace 'jacoco' do | |
if project.jacoco.generate_xml? | |
desc "Generate JaCoCo reports." | |
task 'reports' do | |
Buildr.ant "jacoco" do |ant| | |
ant.taskdef(:resource => "org/jacoco/ant/antlib.xml") do |ant| | |
ant.classpath :path => Buildr.artifacts(Buildr::JaCoCo.ant_spec).each(&:invoke).map(&:to_s).join(File::PATH_SEPARATOR) | |
end | |
ant.report do |ant| | |
ant.executiondata do |ant| | |
ant.file :file => project.jacoco.destfile | |
end | |
ant.structure(:name => project.name) do |ant| | |
if project.compile.target | |
ant.classfiles do |ant| | |
ant.fileset :dir => project.compile.target | |
end | |
end | |
ant.sourcefiles(:encoding => "UTF-8") do |ant| | |
project.compile.sources.each do |path| | |
ant.fileset :dir => path.to_s | |
end | |
end | |
end | |
ant.xml :destfile => project.jacoco.xml_output_file if project.jacoco.generate_xml? | |
ant.html :destdir => project.jacoco.html_output_directory if project.jacoco.generate_html? | |
end | |
end | |
end | |
end | |
end | |
end | |
end | |
namespace 'jacoco' do | |
desc "Generate JaCoCo reports." | |
task 'report' do | |
Buildr.ant "jacoco" do |ant| | |
ant.taskdef(:resource => "org/jacoco/ant/antlib.xml") do |ant| | |
ant.classpath :path => Buildr.artifacts(Buildr::JaCoCo.ant_spec).each(&:invoke).map(&:to_s).join(File::PATH_SEPARATOR) | |
end | |
ant.report do |ant| | |
ant.executiondata do |ant| | |
Buildr.projects.each do |project| | |
ant.fileset :file=>project.jacoco.destfile if File.exist?(project.jacoco.destfile) | |
end | |
end | |
ant.structure(:name => "Jacoco Report") do |ant| | |
ant.classfiles do |ant| | |
Buildr.projects.map(&:compile).map(&:target).flatten.map(&:to_s).each do |src| | |
ant.fileset :dir=>src.to_s if File.exist?(src) | |
end | |
end | |
ant.sourcefiles(:encoding => "UTF-8") do |ant| | |
Buildr.projects.map(&:compile).map(&:sources).flatten.map(&:to_s).each do |src| | |
ant.fileset :dir=>src.to_s if File.exist?(src) | |
end | |
end | |
end | |
ant.html :destdir => "reports/jacoco" | |
ant.xml :destfile => "reports/jacoco/jacoco.xml" | |
ant.csv :destfile => "reports/jacoco/jacoco.csv" | |
end | |
end | |
end | |
end | |
end | |
end | |
end | |
class Buildr::Project | |
include Buildr::JaCoCo::ProjectExtension | |
end |