| # 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 |