1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20 package org.apache.bcel;
21
22 import static org.junit.jupiter.api.Assertions.assertEquals;
23 import static org.junit.jupiter.api.Assertions.assertFalse;
24 import static org.junit.jupiter.api.Assertions.assertNotNull;
25
26 import java.util.stream.Stream;
27
28 import org.apache.bcel.classfile.Code;
29 import org.apache.bcel.classfile.JavaClass;
30 import org.apache.bcel.classfile.LineNumber;
31 import org.apache.bcel.classfile.LineNumberTable;
32 import org.apache.bcel.classfile.LocalVariable;
33 import org.apache.bcel.classfile.LocalVariableTable;
34 import org.apache.bcel.classfile.Method;
35 import org.apache.bcel.classfile.Utility;
36 import org.apache.bcel.generic.ClassGen;
37 import org.apache.bcel.generic.ConstantPoolGen;
38 import org.apache.bcel.generic.InstructionHandle;
39 import org.apache.bcel.generic.InstructionList;
40 import org.apache.bcel.generic.InvokeInstruction;
41 import org.apache.bcel.generic.MethodGen;
42 import org.apache.bcel.generic.Type;
43 import org.junit.jupiter.api.Test;
44 import org.junit.jupiter.params.ParameterizedTest;
45 import org.junit.jupiter.params.provider.ValueSource;
46
47 class PLSETest extends AbstractTest {
48
49
50
51 @Test
52 void testBCEL208() throws ClassNotFoundException {
53 final JavaClass clazz = getTestJavaClass(PACKAGE_BASE_NAME + ".data.PLSETestClass");
54 final ClassGen gen = new ClassGen(clazz);
55 final ConstantPoolGen pool = gen.getConstantPool();
56 final Method m = gen.getMethodAt(1);
57 final MethodGen mg = new MethodGen(m, gen.getClassName(), pool);
58 mg.setInstructionList(null);
59 mg.addLocalVariable("local2", Type.INT, null, null);
60
61 mg.getLocalVariableTable(pool);
62 }
63
64
65
66
67 @Test
68 void testBCEL262() throws ClassNotFoundException {
69 final JavaClass clazz = getTestJavaClass(PACKAGE_BASE_NAME + ".data.PLSETestEnum");
70 final ClassGen gen = new ClassGen(clazz);
71 final ConstantPoolGen pool = gen.getConstantPool();
72
73 final Method m = gen.getMethodAt(0);
74 final MethodGen mg = new MethodGen(m, gen.getClassName(), pool);
75 final InstructionList il = mg.getInstructionList();
76
77 final InstructionHandle ih = il.findHandle(3);
78 final InvokeInstruction ii = (InvokeInstruction) ih.getInstruction();
79
80
81 final String cn = ii.getClassName(pool);
82 assertEquals("[Lorg.apache.bcel.data.PLSETestEnum;", cn);
83 }
84
85
86
87
88 @Test
89 void testBCEL295() throws Exception {
90 final JavaClass clazz = getTestJavaClass(PACKAGE_BASE_NAME + ".data.PLSETestClass2");
91 final ClassGen cg = new ClassGen(clazz);
92 final ConstantPoolGen pool = cg.getConstantPool();
93 final Method m = cg.getMethodAt(1);
94 final LocalVariableTable lvt = m.getLocalVariableTable();
95 final LocalVariable lv = lvt.getLocalVariable(2, 4);
96
97 final MethodGen mg = new MethodGen(m, cg.getClassName(), pool);
98 final LocalVariableTable newLvt = mg.getLocalVariableTable(mg.getConstantPool());
99 final LocalVariable newLv = newLvt.getLocalVariable(2, 4);
100
101 assertEquals(lv.getLength(), newLv.getLength(), "live range length");
102 }
103
104
105
106
107 @Test
108 void testBCEL361() throws Exception {
109 final JavaClass clazz = getTestJavaClass(PACKAGE_BASE_NAME + ".data.LargeMethod");
110 final Method[] methods = clazz.getMethods();
111 final Method m = methods[0];
112
113 final Code code = m.getCode();
114 final LineNumberTable lnt = code.getLineNumberTable();
115 final LineNumber[] lineNumbers = lnt.getLineNumberTable();
116 final String data = lineNumbers[lineNumbers.length - 1].toString();
117
118
119 assertFalse(data.contains("-"), "code offsets must be positive");
120 Stream.of(lineNumbers).forEach(ln -> assertFalse(ln.getLineNumber() < 0));
121 Stream.of(lineNumbers).forEach(ln -> assertFalse(ln.getStartPC() < 0));
122 }
123
124
125
126
127 @Test
128 void testBCEL79() throws ClassNotFoundException {
129 final JavaClass clazz = getTestJavaClass(PACKAGE_BASE_NAME + ".data.PLSETestClass");
130 final ClassGen gen = new ClassGen(clazz);
131 final ConstantPoolGen pool = gen.getConstantPool();
132 final Method m = gen.getMethodAt(2);
133 final LocalVariableTable lvt = m.getLocalVariableTable();
134
135
136 final MethodGen mg = new MethodGen(m, gen.getClassName(), pool);
137 final LocalVariableTable newLvt = mg.getLocalVariableTable(mg.getConstantPool());
138
139 assertEquals(lvt.getTableLength(), newLvt.getTableLength(), "number of locals");
140 }
141
142
143
144
145 @ParameterizedTest
146 @ValueSource(booleans = { true, false })
147 void testCoverage(final boolean compress) throws ClassNotFoundException, java.io.IOException {
148
149 final JavaClass clazz = getTestJavaClass(PACKAGE_BASE_NAME + ".data.ConstantPoolX");
150 for (final Method m : clazz.getMethods()) {
151 final String signature = m.getSignature();
152 Utility.methodTypeToSignature(Utility.methodSignatureReturnType(signature), Utility.methodSignatureArgumentTypes(signature));
153 final Code code = m.getCode();
154 if (code != null) {
155
156 final String encoded = Utility.encode(code.getCode(), compress);
157 assertNotNull(encoded);
158
159 assertNotNull(Utility.decode(encoded, compress));
160 assertNotNull(code.toString());
161 }
162 }
163 }
164 }