aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--org.jacoco.core.test/src/org/jacoco/core/internal/analysis/ClassAnalyzerTest.java52
-rw-r--r--org.jacoco.core.test/src/org/jacoco/core/test/validation/java8/LambdaExpressionsTarget.java40
-rw-r--r--org.jacoco.core.test/src/org/jacoco/core/test/validation/java8/LambdaExpressionsTest.java42
-rw-r--r--org.jacoco.core.test/src/org/jacoco/core/test/validation/targets/Stubs.java13
-rw-r--r--org.jacoco.core/src/org/jacoco/core/internal/analysis/ClassAnalyzer.java9
-rw-r--r--org.jacoco.doc/docroot/doc/changes.html11
6 files changed, 163 insertions, 4 deletions
diff --git a/org.jacoco.core.test/src/org/jacoco/core/internal/analysis/ClassAnalyzerTest.java b/org.jacoco.core.test/src/org/jacoco/core/internal/analysis/ClassAnalyzerTest.java
index a1484ef9..45da7eec 100644
--- a/org.jacoco.core.test/src/org/jacoco/core/internal/analysis/ClassAnalyzerTest.java
+++ b/org.jacoco.core.test/src/org/jacoco/core/internal/analysis/ClassAnalyzerTest.java
@@ -11,6 +11,14 @@
*******************************************************************************/
package org.jacoco.core.internal.analysis;
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertNull;
+import static org.junit.Assert.assertTrue;
+
+import java.util.Collection;
+
+import org.jacoco.core.analysis.IMethodCoverage;
+import org.jacoco.core.internal.flow.MethodProbesVisitor;
import org.jacoco.core.internal.instr.InstrSupport;
import org.junit.Before;
import org.junit.Test;
@@ -44,4 +52,48 @@ public class ClassAnalyzerTest {
null, null);
}
+ @Test
+ public void testMethodFilter_Empty() {
+ final MethodProbesVisitor mv = analyzer.visitMethod(0, "foo", "()V",
+ null, null);
+ mv.visitEnd();
+ Collection<IMethodCoverage> methods = analyzer.getCoverage()
+ .getMethods();
+ assertEquals(0, methods.size());
+ }
+
+ @Test
+ public void testMethodFilter_NonSynthetic() {
+ final MethodProbesVisitor mv = analyzer.visitMethod(0, "foo", "()V",
+ null, null);
+ mv.visitCode();
+ mv.visitInsn(Opcodes.RETURN);
+ mv.visitEnd();
+ Collection<IMethodCoverage> methods = analyzer.getCoverage()
+ .getMethods();
+ assertEquals(1, methods.size());
+ }
+
+ @Test
+ public void testMethodFilter_Synthetic() {
+ final MethodProbesVisitor mv = analyzer.visitMethod(
+ Opcodes.ACC_SYNTHETIC, "foo", "()V", null, null);
+ assertNull(mv);
+ Collection<IMethodCoverage> methods = analyzer.getCoverage()
+ .getMethods();
+ assertTrue(methods.isEmpty());
+ }
+
+ @Test
+ public void testMethodFilter_Lambda() {
+ final MethodProbesVisitor mv = analyzer.visitMethod(
+ Opcodes.ACC_SYNTHETIC, "lambda$1", "()V", null, null);
+ mv.visitCode();
+ mv.visitInsn(Opcodes.RETURN);
+ mv.visitEnd();
+ Collection<IMethodCoverage> methods = analyzer.getCoverage()
+ .getMethods();
+ assertEquals(1, methods.size());
+ }
+
}
diff --git a/org.jacoco.core.test/src/org/jacoco/core/test/validation/java8/LambdaExpressionsTarget.java b/org.jacoco.core.test/src/org/jacoco/core/test/validation/java8/LambdaExpressionsTarget.java
new file mode 100644
index 00000000..4271db2e
--- /dev/null
+++ b/org.jacoco.core.test/src/org/jacoco/core/test/validation/java8/LambdaExpressionsTarget.java
@@ -0,0 +1,40 @@
+/*******************************************************************************
+ * Copyright (c) 2009, 2014 Mountainminds GmbH & Co. KG and Contributors
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * Marc R. Hoffmann - initial API and implementation
+ *
+ *******************************************************************************/
+package org.jacoco.core.test.validation.java8;
+
+import static org.jacoco.core.test.validation.targets.Stubs.exec;
+import static org.jacoco.core.test.validation.targets.Stubs.noexec;
+import static org.jacoco.core.test.validation.targets.Stubs.nop;
+
+/**
+ * This test target contains different lambda expressions.
+ */
+public class LambdaExpressionsTarget implements Runnable {
+
+ @Override
+ public void run() {
+
+ exec(() -> {
+ nop(); // $line-executedlambdabody$
+ });
+
+ noexec(() -> {
+ nop(); // $line-notexecutedlambdabody$
+ });
+
+ }
+
+ public static void main(String[] args) {
+ new LambdaExpressionsTarget().run();
+ }
+
+}
diff --git a/org.jacoco.core.test/src/org/jacoco/core/test/validation/java8/LambdaExpressionsTest.java b/org.jacoco.core.test/src/org/jacoco/core/test/validation/java8/LambdaExpressionsTest.java
new file mode 100644
index 00000000..d5520621
--- /dev/null
+++ b/org.jacoco.core.test/src/org/jacoco/core/test/validation/java8/LambdaExpressionsTest.java
@@ -0,0 +1,42 @@
+/*******************************************************************************
+ * Copyright (c) 2009, 2014 Mountainminds GmbH & Co. KG and Contributors
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * Marc R. Hoffmann - initial API and implementation
+ *
+ *******************************************************************************/
+package org.jacoco.core.test.validation.java8;
+
+import org.jacoco.core.analysis.ICounter;
+import org.jacoco.core.test.validation.ValidationTestBase;
+import org.junit.Test;
+
+/**
+ * Tests of basic Java control structures.
+ */
+public class LambdaExpressionsTest extends ValidationTestBase {
+
+ public LambdaExpressionsTest() {
+ super(LambdaExpressionsTarget.class);
+ }
+
+ @Override
+ protected void run(final Class<?> targetClass) throws Exception {
+ final Object instance = targetClass.newInstance();
+ ((Runnable) instance).run();
+ }
+
+ @Test
+ public void testCoverageResult() {
+
+ // Coverage of lambda bodies
+ assertLine("executedlambdabody", ICounter.FULLY_COVERED);
+ assertLine("notexecutedlambdabody", ICounter.NOT_COVERED);
+
+ }
+
+}
diff --git a/org.jacoco.core.test/src/org/jacoco/core/test/validation/targets/Stubs.java b/org.jacoco.core.test/src/org/jacoco/core/test/validation/targets/Stubs.java
index fdea7858..f5179c63 100644
--- a/org.jacoco.core.test/src/org/jacoco/core/test/validation/targets/Stubs.java
+++ b/org.jacoco.core.test/src/org/jacoco/core/test/validation/targets/Stubs.java
@@ -104,4 +104,17 @@ public class Stubs {
throw new StubException();
}
+ /**
+ * Directly executes the given runnable.
+ */
+ public static void exec(Runnable task) {
+ task.run();
+ }
+
+ /**
+ * Never executes the given runnable.
+ */
+ public static void noexec(Runnable task) {
+ }
+
}
diff --git a/org.jacoco.core/src/org/jacoco/core/internal/analysis/ClassAnalyzer.java b/org.jacoco.core/src/org/jacoco/core/internal/analysis/ClassAnalyzer.java
index 8508ab18..e43d21a6 100644
--- a/org.jacoco.core/src/org/jacoco/core/internal/analysis/ClassAnalyzer.java
+++ b/org.jacoco.core/src/org/jacoco/core/internal/analysis/ClassAnalyzer.java
@@ -81,8 +81,7 @@ public class ClassAnalyzer extends ClassProbesVisitor {
InstrSupport.assertNotInstrumented(name, coverage.getName());
- // TODO: Use filter hook
- if ((access & Opcodes.ACC_SYNTHETIC) != 0) {
+ if (isMethodFiltered(access, name)) {
return null;
}
@@ -100,6 +99,12 @@ public class ClassAnalyzer extends ClassProbesVisitor {
};
}
+ // TODO: Use filter hook in future
+ private boolean isMethodFiltered(final int access, final String name) {
+ return (access & Opcodes.ACC_SYNTHETIC) != 0
+ && !name.startsWith("lambda$");
+ }
+
@Override
public FieldVisitor visitField(final int access, final String name,
final String desc, final String signature, final Object value) {
diff --git a/org.jacoco.doc/docroot/doc/changes.html b/org.jacoco.doc/docroot/doc/changes.html
index 79e2521c..0c81770e 100644
--- a/org.jacoco.doc/docroot/doc/changes.html
+++ b/org.jacoco.doc/docroot/doc/changes.html
@@ -20,13 +20,20 @@
<h2>Snapshot Build @qualified.bundle.version@ (@build.date@)</h2>
+<h3>Fixed Bugs</h3>
+<ul>
+ <li>Do not ignore synthetic lambda methods to get code coverage for Java 8
+ lambda expressions
+ (GitHub <a href="https://github.com/jacoco/jacoco/issues/232">#232</a>).</li>
+</ul>
+
<h3>New Features</h3>
<ul>
<li>New configuration option for the JaCoCo agent
<code>inclbootstrapclasses</code> to also instrument classes from the
- bootstrap class loader.
+ bootstrap class loader
(GitHub <a href="https://github.com/jacoco/jacoco/issues/49">#49</a>).</li>
- <li>Agent uses unique file names to dump class files.
+ <li>Agent uses unique file names to dump class files
(GitHub <a href="https://github.com/jacoco/jacoco/issues/225">#225</a>).</li>
</ul>