MethodAnalyzerTest should not violate contracts of ASM API (#480)
In particular visitLineNumber methods must be called after the labels
passed as arguments have been visited. This is important because
otherwise test does not simulate behavior of reading from bytecode.
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 bdc5e6b..6bcbd63 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
@@ -26,6 +26,7 @@
import org.objectweb.asm.Opcodes;
import org.objectweb.asm.tree.MethodNode;
import org.objectweb.asm.tree.TryCatchBlockNode;
+import org.objectweb.asm.util.CheckMethodAdapter;
/**
* Unit tests for {@link MethodAnalyzer}.
@@ -55,9 +56,13 @@
// === Scenario: linear Sequence without branches ===
private void createLinearSequence() {
- method.visitLineNumber(1001, new Label());
+ final Label l0 = new Label();
+ method.visitLabel(l0);
+ method.visitLineNumber(1001, l0);
method.visitInsn(Opcodes.NOP);
- method.visitLineNumber(1002, new Label());
+ final Label l1 = new Label();
+ method.visitLabel(l1);
+ method.visitLineNumber(1002, l1);
method.visitInsn(Opcodes.RETURN);
}
@@ -95,11 +100,15 @@
// === Scenario: simple if branch ===
private void createIfBranch() {
- method.visitLineNumber(1001, new Label());
+ final Label l0 = new Label();
+ method.visitLabel(l0);
+ method.visitLineNumber(1001, l0);
method.visitVarInsn(Opcodes.ILOAD, 1);
Label l1 = new Label();
method.visitJumpInsn(Opcodes.IFEQ, l1);
- method.visitLineNumber(1002, new Label());
+ final Label l2 = new Label();
+ method.visitLabel(l2);
+ method.visitLineNumber(1002, l2);
method.visitLdcInsn("a");
method.visitInsn(Opcodes.ARETURN);
method.visitLabel(l1);
@@ -156,11 +165,15 @@
// === Scenario: branch which merges back ===
private void createIfBranchMerge() {
- method.visitLineNumber(1001, new Label());
+ final Label l0 = new Label();
+ method.visitLabel(l0);
+ method.visitLineNumber(1001, l0);
method.visitVarInsn(Opcodes.ILOAD, 1);
Label l1 = new Label();
method.visitJumpInsn(Opcodes.IFEQ, l1);
- method.visitLineNumber(1002, new Label());
+ final Label l2 = new Label();
+ method.visitLabel(l2);
+ method.visitLineNumber(1002, l2);
method.visitInsn(Opcodes.NOP);
method.visitLabel(l1);
method.visitLineNumber(1003, l1);
@@ -216,7 +229,9 @@
// === Scenario: branch which jump backwards ===
private void createJumpBackwards() {
- method.visitLineNumber(1001, new Label());
+ final Label l0 = new Label();
+ method.visitLabel(l0);
+ method.visitLineNumber(1001, l0);
final Label l1 = new Label();
method.visitJumpInsn(Opcodes.GOTO, l1);
final Label l2 = new Label();
@@ -302,7 +317,9 @@
// === Scenario: table switch ===
private void createTableSwitch() {
- method.visitLineNumber(1001, new Label());
+ final Label l0 = new Label();
+ method.visitLabel(l0);
+ method.visitLineNumber(1001, l0);
method.visitVarInsn(Opcodes.ILOAD, 1);
Label l1 = new Label();
Label l2 = new Label();
@@ -312,14 +329,18 @@
method.visitLineNumber(1002, l1);
method.visitIntInsn(Opcodes.BIPUSH, 11);
method.visitVarInsn(Opcodes.ISTORE, 2);
- method.visitLineNumber(1003, new Label());
+ final Label l4 = new Label();
+ method.visitLabel(l4);
+ method.visitLineNumber(1003, l4);
Label l5 = new Label();
method.visitJumpInsn(Opcodes.GOTO, l5);
method.visitLabel(l2);
method.visitLineNumber(1004, l2);
method.visitIntInsn(Opcodes.BIPUSH, 22);
method.visitVarInsn(Opcodes.ISTORE, 2);
- method.visitLineNumber(1005, new Label());
+ final Label l6 = new Label();
+ method.visitLabel(l6);
+ method.visitLineNumber(1005, l6);
method.visitJumpInsn(Opcodes.GOTO, l5);
method.visitLabel(l3);
method.visitLineNumber(1006, l3);
@@ -402,10 +423,14 @@
// === Scenario: table switch with merge ===
private void createTableSwitchMerge() {
- method.visitLineNumber(1001, new Label());
+ final Label l0 = new Label();
+ method.visitLabel(l0);
+ method.visitLineNumber(1001, l0);
method.visitInsn(Opcodes.ICONST_0);
method.visitVarInsn(Opcodes.ISTORE, 2);
- method.visitLineNumber(1002, new Label());
+ final Label l1 = new Label();
+ method.visitLabel(l1);
+ method.visitLineNumber(1002, l1);
method.visitVarInsn(Opcodes.ILOAD, 1);
Label l2 = new Label();
Label l3 = new Label();
@@ -559,7 +584,9 @@
probes);
final MethodProbesAdapter probesAdapter = new MethodProbesAdapter(
analyzer, this);
- method.accept(probesAdapter);
+ // note that CheckMethodAdapter verifies that this test does not violate
+ // contracts of ASM API
+ method.accept(new CheckMethodAdapter(probesAdapter));
result = analyzer.getCoverage();
}