blob: 969f1d40c951242e15a1363c567167c7ef747d9c [file] [log] [blame]
# 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.8.0'
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}",
'org.ow2.asm:asm:jar:6.0',
'org.ow2.asm:asm-commons:jar:6.0',
'org.ow2.asm:asm-tree:jar:6.0',
'org.ow2.asm:asm-analysis:jar:6.0',
'org.ow2.asm:asm-util:jar:6.0',
]
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 = []
%w(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(',')}"
existing = project.test.options[:java_args] || []
project.test.options[:java_args] = (existing.is_a?(Array)? existing : [existing]) + [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.classpath :path => Buildr.artifacts(Buildr::JaCoCo.ant_spec).each(&:invoke).map(&:to_s).join(File::PATH_SEPARATOR)
end
ant.report do
ant.executiondata do
ant.file :file => project.jacoco.destfile
end
ant.structure(:name => project.name) do
if project.compile.target
ant.classfiles do
ant.fileset :dir => project.compile.target
end
end
ant.sourcefiles(:encoding => 'UTF-8') do
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.classpath :path => Buildr.artifacts(Buildr::JaCoCo.ant_spec).each(&:invoke).map(&:to_s).join(File::PATH_SEPARATOR)
end
ant.report do
ant.executiondata do
Buildr.projects.select{|p|p.jacoco.enabled?}.each do |project|
ant.fileset :file=>project.jacoco.destfile if File.exist?(project.jacoco.destfile)
end
end
ant.structure(:name => 'Jacoco Report') do
ant.classfiles do
Buildr.projects.select{|p|p.jacoco.enabled?}.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
Buildr.projects.select{|p|p.jacoco.enabled?}.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