aboutsummaryrefslogtreecommitdiff
path: root/org.jacoco.core.test/src
diff options
context:
space:
mode:
authorEvgeny Mandrikov <Godin@users.noreply.github.com>2017-09-29 06:06:11 +0200
committerMarc R. Hoffmann <hoffmann@mountainminds.com>2017-09-29 06:06:11 +0200
commit1962cf59bc403a27f68c55b39bb833b00fa386a0 (patch)
tree2bca7259d0e9cfe50630f430b8a56a9bf3adbbc8 /org.jacoco.core.test/src
parentaca2da1d7479d6b536e027e8fa7db74428d781e6 (diff)
downloadjacoco-1962cf59bc403a27f68c55b39bb833b00fa386a0.tar.gz
Yak shaving: add ability to merge coverage of several instructions (#601)
This is required for implementation of filter of duplicate blocks that compilers generate for `finally`.
Diffstat (limited to 'org.jacoco.core.test/src')
-rw-r--r--org.jacoco.core.test/src/org/jacoco/core/internal/analysis/MethodAnalyzerTest.java83
-rw-r--r--org.jacoco.core.test/src/org/jacoco/core/internal/analysis/filter/EnumFilterTest.java5
-rw-r--r--org.jacoco.core.test/src/org/jacoco/core/internal/analysis/filter/LombokGeneratedFilterTest.java5
-rw-r--r--org.jacoco.core.test/src/org/jacoco/core/internal/analysis/filter/PrivateEmptyNoArgConstructorFilterTest.java9
-rw-r--r--org.jacoco.core.test/src/org/jacoco/core/internal/analysis/filter/StringSwitchJavacFilterTest.java11
-rw-r--r--org.jacoco.core.test/src/org/jacoco/core/internal/analysis/filter/SynchronizedFilterTest.java5
-rw-r--r--org.jacoco.core.test/src/org/jacoco/core/internal/analysis/filter/SyntheticFilterTest.java5
-rw-r--r--org.jacoco.core.test/src/org/jacoco/core/internal/analysis/filter/TryWithResourcesEcjFilterTest.java5
-rw-r--r--org.jacoco.core.test/src/org/jacoco/core/internal/analysis/filter/TryWithResourcesJavacFilterTest.java5
-rw-r--r--org.jacoco.core.test/src/org/jacoco/core/internal/flow/InstructionTest.java12
10 files changed, 138 insertions, 7 deletions
diff --git a/org.jacoco.core.test/src/org/jacoco/core/internal/analysis/MethodAnalyzerTest.java b/org.jacoco.core.test/src/org/jacoco/core/internal/analysis/MethodAnalyzerTest.java
index c746131e..90f4c05b 100644
--- a/org.jacoco.core.test/src/org/jacoco/core/internal/analysis/MethodAnalyzerTest.java
+++ b/org.jacoco.core.test/src/org/jacoco/core/internal/analysis/MethodAnalyzerTest.java
@@ -17,6 +17,9 @@ import java.util.ArrayList;
import org.jacoco.core.analysis.ILine;
import org.jacoco.core.analysis.IMethodCoverage;
+import org.jacoco.core.internal.analysis.filter.Filters;
+import org.jacoco.core.internal.analysis.filter.IFilter;
+import org.jacoco.core.internal.analysis.filter.IFilterOutput;
import org.jacoco.core.internal.flow.IProbeIdGenerator;
import org.jacoco.core.internal.flow.LabelFlowAnalyzer;
import org.jacoco.core.internal.flow.MethodProbesAdapter;
@@ -24,6 +27,7 @@ import org.junit.Before;
import org.junit.Test;
import org.objectweb.asm.Label;
import org.objectweb.asm.Opcodes;
+import org.objectweb.asm.tree.AbstractInsnNode;
import org.objectweb.asm.tree.MethodNode;
import org.objectweb.asm.tree.TryCatchBlockNode;
import org.objectweb.asm.util.CheckMethodAdapter;
@@ -638,15 +642,90 @@ public class MethodAnalyzerTest implements IProbeIdGenerator {
assertLine(1004, 0, 1, 0, 0);
}
+ // === Scenario: try/finally ===
+
+ private void createTryFinally() {
+ final Label l0 = new Label();
+ final Label l1 = new Label();
+ final Label l2 = new Label();
+ final Label l3 = new Label();
+
+ method.visitTryCatchBlock(l0, l2, l2, null);
+
+ method.visitLabel(l0);
+ method.visitLineNumber(1001, l0);
+
+ method.visitJumpInsn(Opcodes.IFEQ, l1);
+ // probe[0]
+ method.visitInsn(Opcodes.RETURN);
+ method.visitLabel(l1);
+ // probe[1]
+ method.visitInsn(Opcodes.RETURN);
+
+ method.visitLabel(l2);
+ method.visitJumpInsn(Opcodes.IFEQ, l3);
+ // probe[2]
+ method.visitInsn(Opcodes.RETURN);
+ method.visitLabel(l3);
+ // probe[3]
+ method.visitInsn(Opcodes.RETURN);
+ }
+
+ @Test
+ public void testTryFinallyWithoutFilter() {
+ createTryFinally();
+ probes[0] = true;
+ probes[3] = true;
+ runMethodAnalzer();
+ assertEquals(4, nextProbeId);
+
+ assertLine(1001, 2, 4, 2, 2);
+ }
+
+ private static final IFilter TRY_FINALLY_FILTER = new IFilter() {
+ public void filter(final String className, final String superClassName,
+ final MethodNode methodNode, final IFilterOutput output) {
+ final AbstractInsnNode i1 = methodNode.instructions.get(2);
+ final AbstractInsnNode i2 = methodNode.instructions.get(7);
+ assertEquals(Opcodes.IFEQ, i1.getOpcode());
+ assertEquals(Opcodes.IFEQ, i2.getOpcode());
+ output.merge(i1, i2);
+ // Merging of already merged instructions won't change result:
+ output.merge(i1, i2);
+ }
+ };
+
+ @Test
+ public void testTryFinallyMergeSameBranch() {
+ createTryFinally();
+ probes[0] = true;
+ probes[2] = true;
+ runMethodAnalzer(TRY_FINALLY_FILTER);
+ assertLine(1001, 2, 3, 1, 1);
+ }
+
+ @Test
+ public void testTryFinallyMergeDifferentBranches() {
+ createTryFinally();
+ probes[0] = true;
+ probes[3] = true;
+ runMethodAnalzer(TRY_FINALLY_FILTER);
+ assertLine(1001, 2, 3, 0, 2);
+ }
+
private void runMethodAnalzer() {
+ runMethodAnalzer(Filters.NONE);
+ }
+
+ private void runMethodAnalzer(IFilter filter) {
LabelFlowAnalyzer.markLabels(method);
final MethodAnalyzer analyzer = new MethodAnalyzer("Foo",
- "java/lang/Object", "doit", "()V", null, probes);
+ "java/lang/Object", "doit", "()V", null, probes, filter);
final MethodProbesAdapter probesAdapter = new MethodProbesAdapter(
analyzer, this);
// note that CheckMethodAdapter verifies that this test does not violate
// contracts of ASM API
- method.accept(new CheckMethodAdapter(probesAdapter));
+ analyzer.accept(method, new CheckMethodAdapter(probesAdapter));
result = analyzer.getCoverage();
}
diff --git a/org.jacoco.core.test/src/org/jacoco/core/internal/analysis/filter/EnumFilterTest.java b/org.jacoco.core.test/src/org/jacoco/core/internal/analysis/filter/EnumFilterTest.java
index 149990f5..a46a0d64 100644
--- a/org.jacoco.core.test/src/org/jacoco/core/internal/analysis/filter/EnumFilterTest.java
+++ b/org.jacoco.core.test/src/org/jacoco/core/internal/analysis/filter/EnumFilterTest.java
@@ -13,6 +13,7 @@ package org.jacoco.core.internal.analysis.filter;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertNull;
+import static org.junit.Assert.fail;
import org.jacoco.core.internal.instr.InstrSupport;
import org.junit.Test;
@@ -94,4 +95,8 @@ public class EnumFilterTest implements IFilterOutput {
this.toInclusive = toInclusive;
}
+ public void merge(final AbstractInsnNode i1, final AbstractInsnNode i2) {
+ fail();
+ }
+
}
diff --git a/org.jacoco.core.test/src/org/jacoco/core/internal/analysis/filter/LombokGeneratedFilterTest.java b/org.jacoco.core.test/src/org/jacoco/core/internal/analysis/filter/LombokGeneratedFilterTest.java
index 8fae5cc3..e68b3a3c 100644
--- a/org.jacoco.core.test/src/org/jacoco/core/internal/analysis/filter/LombokGeneratedFilterTest.java
+++ b/org.jacoco.core.test/src/org/jacoco/core/internal/analysis/filter/LombokGeneratedFilterTest.java
@@ -13,6 +13,7 @@ package org.jacoco.core.internal.analysis.filter;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertNull;
+import static org.junit.Assert.fail;
import org.jacoco.core.internal.instr.InstrSupport;
import org.junit.Test;
@@ -78,4 +79,8 @@ public class LombokGeneratedFilterTest implements IFilterOutput {
this.toInclusive = toInclusive;
}
+ public void merge(final AbstractInsnNode i1, final AbstractInsnNode i2) {
+ fail();
+ }
+
}
diff --git a/org.jacoco.core.test/src/org/jacoco/core/internal/analysis/filter/PrivateEmptyNoArgConstructorFilterTest.java b/org.jacoco.core.test/src/org/jacoco/core/internal/analysis/filter/PrivateEmptyNoArgConstructorFilterTest.java
index 90262081..36c57ecb 100644
--- a/org.jacoco.core.test/src/org/jacoco/core/internal/analysis/filter/PrivateEmptyNoArgConstructorFilterTest.java
+++ b/org.jacoco.core.test/src/org/jacoco/core/internal/analysis/filter/PrivateEmptyNoArgConstructorFilterTest.java
@@ -11,14 +11,15 @@
*******************************************************************************/
package org.jacoco.core.internal.analysis.filter;
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.fail;
+
import org.jacoco.core.internal.instr.InstrSupport;
import org.junit.Test;
import org.objectweb.asm.Opcodes;
import org.objectweb.asm.tree.AbstractInsnNode;
import org.objectweb.asm.tree.MethodNode;
-import static org.junit.Assert.assertEquals;
-
public class PrivateEmptyNoArgConstructorFilterTest implements IFilterOutput {
private final IFilter filter = new PrivateEmptyNoArgConstructorFilter();
@@ -48,4 +49,8 @@ public class PrivateEmptyNoArgConstructorFilterTest implements IFilterOutput {
this.toInclusive = toInclusive;
}
+ public void merge(final AbstractInsnNode i1, final AbstractInsnNode i2) {
+ fail();
+ }
+
}
diff --git a/org.jacoco.core.test/src/org/jacoco/core/internal/analysis/filter/StringSwitchJavacFilterTest.java b/org.jacoco.core.test/src/org/jacoco/core/internal/analysis/filter/StringSwitchJavacFilterTest.java
index 5a7cdefb..96683961 100644
--- a/org.jacoco.core.test/src/org/jacoco/core/internal/analysis/filter/StringSwitchJavacFilterTest.java
+++ b/org.jacoco.core.test/src/org/jacoco/core/internal/analysis/filter/StringSwitchJavacFilterTest.java
@@ -11,6 +11,10 @@
*******************************************************************************/
package org.jacoco.core.internal.analysis.filter;
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertNull;
+import static org.junit.Assert.fail;
+
import org.jacoco.core.internal.instr.InstrSupport;
import org.junit.Test;
import org.objectweb.asm.Label;
@@ -18,9 +22,6 @@ import org.objectweb.asm.Opcodes;
import org.objectweb.asm.tree.AbstractInsnNode;
import org.objectweb.asm.tree.MethodNode;
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertNull;
-
public class StringSwitchJavacFilterTest implements IFilterOutput {
private final IFilter filter = new StringSwitchJavacFilter();
@@ -152,4 +153,8 @@ public class StringSwitchJavacFilterTest implements IFilterOutput {
this.toInclusive = toInclusive;
}
+ public void merge(final AbstractInsnNode i1, final AbstractInsnNode i2) {
+ fail();
+ }
+
}
diff --git a/org.jacoco.core.test/src/org/jacoco/core/internal/analysis/filter/SynchronizedFilterTest.java b/org.jacoco.core.test/src/org/jacoco/core/internal/analysis/filter/SynchronizedFilterTest.java
index b0f5d1b0..a67eaa5f 100644
--- a/org.jacoco.core.test/src/org/jacoco/core/internal/analysis/filter/SynchronizedFilterTest.java
+++ b/org.jacoco.core.test/src/org/jacoco/core/internal/analysis/filter/SynchronizedFilterTest.java
@@ -13,6 +13,7 @@ package org.jacoco.core.internal.analysis.filter;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertNull;
+import static org.junit.Assert.fail;
import org.jacoco.core.internal.instr.InstrSupport;
import org.junit.Test;
@@ -163,4 +164,8 @@ public class SynchronizedFilterTest implements IFilterOutput {
this.toInclusive = toInclusive;
}
+ public void merge(final AbstractInsnNode i1, final AbstractInsnNode i2) {
+ fail();
+ }
+
}
diff --git a/org.jacoco.core.test/src/org/jacoco/core/internal/analysis/filter/SyntheticFilterTest.java b/org.jacoco.core.test/src/org/jacoco/core/internal/analysis/filter/SyntheticFilterTest.java
index 319caef5..b8a6e9dd 100644
--- a/org.jacoco.core.test/src/org/jacoco/core/internal/analysis/filter/SyntheticFilterTest.java
+++ b/org.jacoco.core.test/src/org/jacoco/core/internal/analysis/filter/SyntheticFilterTest.java
@@ -13,6 +13,7 @@ package org.jacoco.core.internal.analysis.filter;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertNull;
+import static org.junit.Assert.fail;
import org.jacoco.core.internal.instr.InstrSupport;
import org.junit.Test;
@@ -70,4 +71,8 @@ public class SyntheticFilterTest implements IFilterOutput {
this.toInclusive = toInclusive;
}
+ public void merge(final AbstractInsnNode i1, final AbstractInsnNode i2) {
+ fail();
+ }
+
}
diff --git a/org.jacoco.core.test/src/org/jacoco/core/internal/analysis/filter/TryWithResourcesEcjFilterTest.java b/org.jacoco.core.test/src/org/jacoco/core/internal/analysis/filter/TryWithResourcesEcjFilterTest.java
index d3720505..57e9145b 100644
--- a/org.jacoco.core.test/src/org/jacoco/core/internal/analysis/filter/TryWithResourcesEcjFilterTest.java
+++ b/org.jacoco.core.test/src/org/jacoco/core/internal/analysis/filter/TryWithResourcesEcjFilterTest.java
@@ -12,6 +12,7 @@
package org.jacoco.core.internal.analysis.filter;
import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.fail;
import java.util.ArrayList;
import java.util.List;
@@ -621,4 +622,8 @@ public class TryWithResourcesEcjFilterTest implements IFilterOutput {
this.to.add(to);
}
+ public void merge(final AbstractInsnNode i1, final AbstractInsnNode i2) {
+ fail();
+ }
+
}
diff --git a/org.jacoco.core.test/src/org/jacoco/core/internal/analysis/filter/TryWithResourcesJavacFilterTest.java b/org.jacoco.core.test/src/org/jacoco/core/internal/analysis/filter/TryWithResourcesJavacFilterTest.java
index 26b4cfe1..a19cfe2c 100644
--- a/org.jacoco.core.test/src/org/jacoco/core/internal/analysis/filter/TryWithResourcesJavacFilterTest.java
+++ b/org.jacoco.core.test/src/org/jacoco/core/internal/analysis/filter/TryWithResourcesJavacFilterTest.java
@@ -12,6 +12,7 @@
package org.jacoco.core.internal.analysis.filter;
import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.fail;
import java.util.ArrayList;
import java.util.List;
@@ -811,4 +812,8 @@ public class TryWithResourcesJavacFilterTest implements IFilterOutput {
this.to.add(to);
}
+ public void merge(final AbstractInsnNode i1, final AbstractInsnNode i2) {
+ fail();
+ }
+
}
diff --git a/org.jacoco.core.test/src/org/jacoco/core/internal/flow/InstructionTest.java b/org.jacoco.core.test/src/org/jacoco/core/internal/flow/InstructionTest.java
index a6fb15e8..a6a7ee6d 100644
--- a/org.jacoco.core.test/src/org/jacoco/core/internal/flow/InstructionTest.java
+++ b/org.jacoco.core.test/src/org/jacoco/core/internal/flow/InstructionTest.java
@@ -93,6 +93,18 @@ public class InstructionTest {
}
@Test
+ public void merge_should_add_covered_branches_from_another_instruction() {
+ final Instruction i1 = new Instruction(new InsnNode(Opcodes.NOP), 123);
+ i1.setCovered(0);
+ final Instruction i2 = new Instruction(new InsnNode(Opcodes.NOP), 123);
+ i2.setCovered(1);
+ i1.merge(i2);
+ assertEquals("{0, 1}", i1.toString());
+ assertEquals(2, i1.getCoveredBranches());
+ assertEquals("{1}", i2.toString());
+ }
+
+ @Test
public void testSetCoveredOnLongSequence() {
final Instruction first = new Instruction(new InsnNode(Opcodes.NOP), 0);
Instruction next = first;