EmmaPlugin.groovy 3.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114
  1. package emma;
  2. import org.gradle.api.*
  3. import org.gradle.api.tasks.testing.Test
  4. import org.gradle.api.tasks.TaskAction
  5. import org.gradle.api.tasks.Input
  6. import com.vladium.emma.instr.InstrProcessor
  7. import com.vladium.emma.report.ReportProcessor
  8. import org.gradle.api.tasks.InputFiles
  9. import com.vladium.util.XProperties;
  10. /**
  11. *
  12. * @author Luke Taylor
  13. */
  14. class EmmaPlugin implements Plugin<Project> {
  15. void apply(Project project) {
  16. Project rootProject = project.rootProject
  17. def emmaMetaDataFile = "${rootProject.buildDir}/emma/emma.em"
  18. def emmaCoverageFile = "${rootProject.buildDir}/emma/emma.ec"
  19. if (project.configurations.findByName('emma_rt') == null) {
  20. project.configurations.add('emma_rt')
  21. project.dependencies {
  22. emma_rt 'emma:emma:2.0.5312'
  23. }
  24. }
  25. project.task('emmaInstrument') {
  26. dependsOn project.classes
  27. doFirst {
  28. InstrProcessor processor = InstrProcessor.create ();
  29. String[] classesDirPath = [project.sourceSets.main.output.classesDir.absolutePath]
  30. processor.setInstrPath(classesDirPath, false);
  31. processor.setOutMode(InstrProcessor.OutMode.OUT_MODE_COPY);
  32. processor.setInstrOutDir("${project.buildDir}/emma/classes");
  33. processor.setMetaOutFile(emmaMetaDataFile);
  34. processor.setMetaOutMerge(true);
  35. //processor.setInclExclFilter (null);
  36. processor.run();
  37. }
  38. }
  39. // Modify test tasks in the project to generate coverage data
  40. project.afterEvaluate {
  41. if (project.hasProperty('coverage') && ['on','true'].contains(project.properties.coverage)) {
  42. project.tasks.withType(Test.class).each { task ->
  43. task.dependsOn project.emmaInstrument
  44. task.configure() {
  45. jvmArgs '-Dsec.log.level=DEBUG', "-Demma.coverage.out.file=$emmaCoverageFile"
  46. jvmArgs '-Demma.verbosity.level=quiet'
  47. }
  48. task.doFirst {
  49. classpath = project.files("${project.buildDir}/emma/classes") + project.configurations.emma_rt + classpath
  50. }
  51. }
  52. }
  53. }
  54. List<Task> reportTasks = rootProject.getTasksByName('coverageReport', false) as List;
  55. CoverageReport task;
  56. if (reportTasks.isEmpty()) {
  57. task = rootProject.tasks.add('coverageReport', CoverageReport.class);
  58. task.dataPath = [emmaMetaDataFile, emmaCoverageFile];
  59. } else {
  60. task = reportTasks[0];
  61. }
  62. task.modules.add(project);
  63. }
  64. }
  65. class CoverageReport extends DefaultTask {
  66. @Input
  67. List<Project> modules = [];
  68. @Input
  69. String[] dataPath;
  70. @TaskAction
  71. void generateReport() {
  72. def buildDir = project.rootProject.buildDir
  73. if (!buildDir.exists()) {
  74. throw new GradleException("No coverage data. Run gradle with -Pcoverage=on if using coverageReport");
  75. }
  76. ReportProcessor processor = ReportProcessor.create ();
  77. processor.setDataPath(dataPath)
  78. def srcPath = []
  79. modules.each {module->
  80. module.sourceSets.main.java.srcDirs.each {
  81. srcPath.add(it.absolutePath)
  82. }
  83. }
  84. processor.setSourcePath(srcPath as String[]);
  85. def types = ['txt', 'html']
  86. processor.setReportTypes(types as String[]);
  87. XProperties properties = new XProperties();
  88. properties.setProperty('report.html.out.file', "$buildDir/emma/coverage.html");
  89. properties.setProperty('report.txt.out.file', "$buildDir/emma/coverage.txt");
  90. processor.setPropertyOverrides(properties)
  91. processor.run()
  92. }
  93. }