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
52 @Test
53 void testBCEL208() throws ClassNotFoundException {
54 final JavaClass clazz = getTestJavaClass(PACKAGE_BASE_NAME + ".data.PLSETestClass");
55 final ClassGen gen = new ClassGen(clazz);
56 final ConstantPoolGen pool = gen.getConstantPool();
57 final Method m = gen.getMethodAt(1);
58 final MethodGen mg = new MethodGen(m, gen.getClassName(), pool);
59 mg.setInstructionList(null);
60 mg.addLocalVariable("local2", Type.INT, null, null);
61
62 mg.getLocalVariableTable(pool);
63 }
64
65
66
67
68 @Test
69 void testBCEL262() throws ClassNotFoundException {
70 final JavaClass clazz = getTestJavaClass(PACKAGE_BASE_NAME + ".data.PLSETestEnum");
71 final ClassGen gen = new ClassGen(clazz);
72 final ConstantPoolGen pool = gen.getConstantPool();
73
74 final Method m = gen.getMethodAt(0);
75 final MethodGen mg = new MethodGen(m, gen.getClassName(), pool);
76 final InstructionList il = mg.getInstructionList();
77
78 final InstructionHandle ih = il.findHandle(3);
79 final InvokeInstruction ii = (InvokeInstruction) ih.getInstruction();
80
81
82 final String cn = ii.getClassName(pool);
83 assertEquals("[Lorg.apache.bcel.data.PLSETestEnum;", cn);
84 }
85
86
87
88
89 @Test
90 void testBCEL295() throws Exception {
91 final JavaClass clazz = getTestJavaClass(PACKAGE_BASE_NAME + ".data.PLSETestClass2");
92 final ClassGen cg = new ClassGen(clazz);
93 final ConstantPoolGen pool = cg.getConstantPool();
94 final Method m = cg.getMethodAt(1);
95 final LocalVariableTable lvt = m.getLocalVariableTable();
96 final LocalVariable lv = lvt.getLocalVariable(2, 4);
97
98 final MethodGen mg = new MethodGen(m, cg.getClassName(), pool);
99 final LocalVariableTable newLvt = mg.getLocalVariableTable(mg.getConstantPool());
100 final LocalVariable newLv = newLvt.getLocalVariable(2, 4);
101
102 assertEquals(lv.getLength(), newLv.getLength(), "live range length");
103 }
104
105
106
107
108 @Test
109 void testBCEL361() throws Exception {
110 final JavaClass clazz = getTestJavaClass(PACKAGE_BASE_NAME + ".data.LargeMethod");
111 final Method[] methods = clazz.getMethods();
112 final Method m = methods[0];
113
114 final Code code = m.getCode();
115 final LineNumberTable lnt = code.getLineNumberTable();
116 final LineNumber[] lineNumbers = lnt.getLineNumberTable();
117 final String data = lineNumbers[lineNumbers.length - 1].toString();
118
119
120 assertFalse(data.contains("-"), "code offsets must be positive");
121 Stream.of(lineNumbers).forEach(ln -> assertFalse(ln.getLineNumber() < 0));
122 Stream.of(lineNumbers).forEach(ln -> assertFalse(ln.getStartPC() < 0));
123 }
124
125
126
127
128 @Test
129 void testBCEL79() throws ClassNotFoundException {
130 final JavaClass clazz = getTestJavaClass(PACKAGE_BASE_NAME + ".data.PLSETestClass");
131 final ClassGen gen = new ClassGen(clazz);
132 final ConstantPoolGen pool = gen.getConstantPool();
133 final Method m = gen.getMethodAt(2);
134 final LocalVariableTable lvt = m.getLocalVariableTable();
135
136
137 final MethodGen mg = new MethodGen(m, gen.getClassName(), pool);
138 final LocalVariableTable newLvt = mg.getLocalVariableTable(mg.getConstantPool());
139
140 assertEquals(lvt.getTableLength(), newLvt.getTableLength(), "number of locals");
141 }
142
143
144
145
146 @ParameterizedTest
147 @ValueSource(booleans = { true, false })
148 void testCoverage(final boolean compress) throws ClassNotFoundException, java.io.IOException {
149
150 final JavaClass clazz = getTestJavaClass(PACKAGE_BASE_NAME + ".data.ConstantPoolX");
151 for (final Method m : clazz.getMethods()) {
152 final String signature = m.getSignature();
153 Utility.methodTypeToSignature(Utility.methodSignatureReturnType(signature), Utility.methodSignatureArgumentTypes(signature));
154 final Code code = m.getCode();
155 if (code != null) {
156
157 final String encoded = Utility.encode(code.getCode(), compress);
158 assertNotNull(encoded);
159
160 assertNotNull(Utility.decode(encoded, compress));
161 assertNotNull(code.toString());
162 }
163 }
164 }
165 }