From b422ec7663fc8befabbb5f65375f2d975d999755 Mon Sep 17 00:00:00 2001 From: Tyler Benson Date: Mon, 10 Jul 2017 14:24:11 -0700 Subject: [PATCH] Apply minimum code coverage assertions Improved the test coverage slightly in the process. --- dd-java-agent-ittests/build.gradle | 3 ++ dd-java-agent/build.gradle | 10 +++++ dd-trace-annotations/build.gradle | 2 + dd-trace/build.gradle | 9 ++++ .../trace/resolver/DDTracerResolver.java | 13 +----- .../trace/resolver/TracerResolverTest.java | 37 +++++++++++++++- gradle/jacoco.gradle | 43 +++++++++++++++++++ 7 files changed, 105 insertions(+), 12 deletions(-) create mode 100644 gradle/jacoco.gradle diff --git a/dd-java-agent-ittests/build.gradle b/dd-java-agent-ittests/build.gradle index b568509da3..97c63df1c1 100644 --- a/dd-java-agent-ittests/build.gradle +++ b/dd-java-agent-ittests/build.gradle @@ -1,3 +1,6 @@ +// Not adding jacoco here as it inexplicably breaks our tests. +// apply from: "${rootDir}/gradle/jacoco.gradle" + description = 'dd-java-agent-ittests' dependencies { testCompile project(':dd-java-agent') diff --git a/dd-java-agent/build.gradle b/dd-java-agent/build.gradle index a661cfd5d8..d43d6fb0cd 100644 --- a/dd-java-agent/build.gradle +++ b/dd-java-agent/build.gradle @@ -4,6 +4,16 @@ plugins { description = 'dd-java-agent' +apply from: "${rootDir}/gradle/jacoco.gradle" +jacocoTestReport.dependsOn project(':dd-java-agent-ittests').test +whitelistedInstructionClasses += whitelistedBranchClasses += [ + "com.datadoghq.trace.agent.integration.*", + 'com.datadoghq.trace.agent.AnnotationsTracingAgent', + 'com.datadoghq.trace.agent.AgentTracerConfig', + 'com.datadoghq.trace.agent.TraceAnnotationsManager', + 'com.datadoghq.trace.agent.InstrumentationChecker' +] + dependencies { compile project(':dd-trace') compile project(':dd-trace-annotations') diff --git a/dd-trace-annotations/build.gradle b/dd-trace-annotations/build.gradle index f2988510b2..a548953b44 100644 --- a/dd-trace-annotations/build.gradle +++ b/dd-trace-annotations/build.gradle @@ -1,3 +1,5 @@ +apply from: "${rootDir}/gradle/jacoco.gradle" + description = 'dd-trace-annotations' dependencies { testCompile group: 'junit', name: 'junit', version: '3.8.1' diff --git a/dd-trace/build.gradle b/dd-trace/build.gradle index 60e9aac883..07d999d617 100644 --- a/dd-trace/build.gradle +++ b/dd-trace/build.gradle @@ -4,6 +4,15 @@ plugins { } description = 'dd-trace' + +apply from: "${rootDir}/gradle/jacoco.gradle" +minimumBranchCoverage = 0.3 +minimumInstructionCoverage = 0.5 +whitelistedInstructionClasses += whitelistedBranchClasses += [ + "com.datadoghq.trace.integration.*", + 'com.datadoghq.trace.DDTags' +] + dependencies { compile group: 'io.opentracing', name: 'opentracing-api', version: '0.30.0' compile group: 'io.opentracing', name: 'opentracing-noop', version: '0.30.0' diff --git a/dd-trace/src/main/java/com/datadoghq/trace/resolver/DDTracerResolver.java b/dd-trace/src/main/java/com/datadoghq/trace/resolver/DDTracerResolver.java index 5900c076cd..25b92113ff 100644 --- a/dd-trace/src/main/java/com/datadoghq/trace/resolver/DDTracerResolver.java +++ b/dd-trace/src/main/java/com/datadoghq/trace/resolver/DDTracerResolver.java @@ -41,19 +41,10 @@ public class DDTracerResolver extends TracerResolver { @SuppressWarnings("static-access") public static Tracer registerTracer() { - - ServiceLoader RESOLVERS = ServiceLoader.load(TracerResolver.class); - - Tracer tracer = null; - for (TracerResolver value : RESOLVERS) { - tracer = value.resolveTracer(); - if (tracer != null) { - break; - } - } + Tracer tracer = TracerResolver.resolveTracer(); if (tracer == null) { - tracer = NoopTracerFactory.create(); + return NoopTracerFactory.create(); } GlobalTracer.register(tracer); diff --git a/dd-trace/src/test/java/com/datadoghq/trace/resolver/TracerResolverTest.java b/dd-trace/src/test/java/com/datadoghq/trace/resolver/TracerResolverTest.java index 84023cfdf0..d166b9c10b 100644 --- a/dd-trace/src/test/java/com/datadoghq/trace/resolver/TracerResolverTest.java +++ b/dd-trace/src/test/java/com/datadoghq/trace/resolver/TracerResolverTest.java @@ -2,9 +2,14 @@ package com.datadoghq.trace.resolver; import static org.assertj.core.api.Assertions.assertThat; +import java.lang.reflect.Field; import java.util.List; +import io.opentracing.NoopTracerFactory; +import io.opentracing.Tracer; +import io.opentracing.contrib.tracerresolver.TracerResolver; import io.opentracing.tag.Tags; +import io.opentracing.util.GlobalTracer; import org.junit.Test; import com.datadoghq.trace.DDTracer; @@ -15,7 +20,7 @@ import com.datadoghq.trace.integration.URLAsResourceName; public class TracerResolverTest { @Test - public void test() { + public void testResolve() { DDTracerResolver tracerResolver = new DDTracerResolver(); DDTracer tracer = (DDTracer) tracerResolver.resolve(); @@ -39,4 +44,34 @@ public class TracerResolverTest { } + @Test + public void testResolveTracer() throws Exception { + Field tracerField = GlobalTracer.class.getDeclaredField("tracer"); + tracerField.setAccessible(true); + tracerField.set(null, NoopTracerFactory.create()); + + assertThat(GlobalTracer.isRegistered()).isFalse(); + + Tracer tracer = TracerResolver.resolveTracer(); + + assertThat(GlobalTracer.isRegistered()).isFalse(); + assertThat(tracer).isInstanceOf(DDTracer.class); + } + + @Test + public void testRegisterTracer() throws Exception { + Field tracerField = GlobalTracer.class.getDeclaredField("tracer"); + tracerField.setAccessible(true); + tracerField.set(null, NoopTracerFactory.create()); + + assertThat(GlobalTracer.isRegistered()).isFalse(); + + DDTracerResolver.registerTracer(); + + assertThat(GlobalTracer.isRegistered()).isTrue(); + assertThat(tracerField.get(null)).isInstanceOf(DDTracer.class); + + tracerField.set(null, NoopTracerFactory.create()); + } + } diff --git a/gradle/jacoco.gradle b/gradle/jacoco.gradle new file mode 100644 index 0000000000..5587550670 --- /dev/null +++ b/gradle/jacoco.gradle @@ -0,0 +1,43 @@ +apply plugin: "jacoco" + +jacocoTestReport { + dependsOn test + reports { + xml.enabled true + csv.enabled false + html.destination file("${buildDir}/reports/jacoco/") + } +} + +project.ext.whitelistedBranchClasses = [] +project.ext.whitelistedInstructionClasses = [] + +project.ext.minimumBranchCoverage = 0.6 +project.ext.minimumInstructionCoverage = 0.6 + +afterEvaluate { + jacocoTestCoverageVerification { + violationRules { + rule { + element = 'CLASS' + excludes = project.whitelistedBranchClasses + limit { + counter = 'BRANCH' + minimum = project.minimumBranchCoverage + } + } + + rule { + element = 'CLASS' + excludes = project.whitelistedInstructionClasses + limit { + counter = 'INSTRUCTION' + minimum = project.minimumInstructionCoverage + } + } + } + } + + jacocoTestCoverageVerification.dependsOn jacocoTestReport + check.dependsOn jacocoTestCoverageVerification +}