Skip to content

Commit e2010e5

Browse files
committed
feat(test):add tests for hard fork
1 parent 25df660 commit e2010e5

1 file changed

Lines changed: 294 additions & 0 deletions

File tree

Lines changed: 294 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,294 @@
1+
package org.tron.core;
2+
3+
import com.google.protobuf.ByteString;
4+
import java.io.File;
5+
import java.util.ArrayList;
6+
import java.util.List;
7+
8+
import org.junit.After;
9+
import org.junit.Assert;
10+
import org.junit.Before;
11+
import org.junit.Test;
12+
import org.tron.common.application.TronApplicationContext;
13+
import org.tron.common.utils.FileUtil;
14+
import org.tron.common.utils.ForkController;
15+
import org.tron.core.capsule.BlockCapsule;
16+
import org.tron.core.config.DefaultConfig;
17+
import org.tron.core.config.Parameter;
18+
import org.tron.core.config.args.Args;
19+
import org.tron.core.store.DynamicPropertiesStore;
20+
import org.tron.protos.Protocol;
21+
22+
public class ForkControllerTest {
23+
private static ChainBaseManager chainBaseManager;
24+
private static DynamicPropertiesStore dynamicPropertiesStore;
25+
private static final ForkController forkController = ForkController.instance();
26+
private static TronApplicationContext context;
27+
private static final String dbPath = "output_fork_test";
28+
private static long ENERGY_LIMIT_BLOCK_NUM = 4727890L;
29+
30+
@Before
31+
public void init() {
32+
Args.setParam(new String[]{"-d", dbPath, "-w"}, Constant.TEST_CONF);
33+
context = new TronApplicationContext(DefaultConfig.class);
34+
dynamicPropertiesStore = context.getBean(DynamicPropertiesStore.class);
35+
chainBaseManager = context.getBean(ChainBaseManager.class);
36+
forkController.init(chainBaseManager);
37+
}
38+
39+
@Test
40+
public void testPass() {
41+
boolean flag = forkController.pass(Parameter.ForkBlockVersionEnum.ENERGY_LIMIT);
42+
Assert.assertFalse(flag);
43+
44+
dynamicPropertiesStore.saveLatestBlockHeaderNumber(ENERGY_LIMIT_BLOCK_NUM);
45+
flag = forkController.pass(Parameter.ForkBlockVersionEnum.ENERGY_LIMIT);
46+
Assert.assertTrue(flag);
47+
48+
flag = forkController.pass(Parameter.ForkBlockVersionEnum.VERSION_3_5);
49+
Assert.assertFalse(flag);
50+
51+
byte[] stats = new byte[3];
52+
dynamicPropertiesStore
53+
.statsByVersion(Parameter.ForkBlockVersionEnum.VERSION_3_5.getValue(), stats);
54+
flag = forkController.pass(Parameter.ForkBlockVersionEnum.VERSION_3_5);
55+
Assert.assertFalse(flag);
56+
57+
stats[0] = 1;
58+
stats[1] = 1;
59+
dynamicPropertiesStore
60+
.statsByVersion(Parameter.ForkBlockVersionEnum.VERSION_3_5.getValue(), stats);
61+
flag = forkController.pass(Parameter.ForkBlockVersionEnum.VERSION_3_5);
62+
Assert.assertFalse(flag);
63+
64+
stats[2] = 1;
65+
dynamicPropertiesStore
66+
.statsByVersion(Parameter.ForkBlockVersionEnum.VERSION_3_5.getValue(), stats);
67+
flag = forkController.pass(Parameter.ForkBlockVersionEnum.VERSION_3_5);
68+
Assert.assertTrue(flag);
69+
70+
stats = new byte[5];
71+
flag = forkController.pass(Parameter.ForkBlockVersionEnum.VERSION_4_4);
72+
Assert.assertFalse(flag);
73+
74+
stats[0] = 1;
75+
stats[1] = 1;
76+
stats[2] = 1;
77+
dynamicPropertiesStore
78+
.statsByVersion(Parameter.ForkBlockVersionEnum.VERSION_4_4.getValue(), stats);
79+
flag = forkController.pass(Parameter.ForkBlockVersionEnum.VERSION_4_4);
80+
Assert.assertFalse(flag);
81+
82+
stats[3] = 1;
83+
dynamicPropertiesStore
84+
.statsByVersion(Parameter.ForkBlockVersionEnum.VERSION_4_4.getValue(), stats);
85+
flag = forkController.pass(Parameter.ForkBlockVersionEnum.VERSION_4_4);
86+
Assert.assertFalse(flag);
87+
88+
dynamicPropertiesStore.saveLatestBlockHeaderTimestamp(1596780000000L);
89+
flag = forkController.pass(Parameter.ForkBlockVersionEnum.VERSION_4_4);
90+
Assert.assertTrue(flag);
91+
}
92+
93+
@Test
94+
public void testReset() {
95+
List<ByteString> list = new ArrayList<>();
96+
list.add(ByteString.copyFrom(getBytes(0)));
97+
list.add(ByteString.copyFrom(getBytes(0)));
98+
list.add(ByteString.copyFrom(getBytes(0)));
99+
list.add(ByteString.copyFrom(getBytes(0)));
100+
list.add(ByteString.copyFrom(getBytes(0)));
101+
102+
chainBaseManager.getWitnessScheduleStore().saveActiveWitnesses(list);
103+
104+
byte[] stats1 = {1, 1, 1, 1, 1};
105+
byte[] stats2 = {1, 1, 1, 1, 0};
106+
byte[] stats3 = {1, 1, 1, 0, 0};
107+
dynamicPropertiesStore
108+
.statsByVersion(Parameter.ForkBlockVersionEnum.VERSION_3_5.getValue(), stats1);
109+
dynamicPropertiesStore
110+
.statsByVersion(Parameter.ForkBlockVersionEnum.VERSION_3_6.getValue(), stats2);
111+
dynamicPropertiesStore
112+
.statsByVersion(Parameter.ForkBlockVersionEnum.VERSION_4_4.getValue(), stats2);
113+
dynamicPropertiesStore
114+
.statsByVersion(Parameter.ForkBlockVersionEnum.VERSION_4_5.getValue(), stats3);
115+
116+
dynamicPropertiesStore.saveLatestBlockHeaderTimestamp(1596780000000L);
117+
forkController.reset();
118+
119+
byte[] bytes = dynamicPropertiesStore
120+
.statsByVersion(Parameter.ForkBlockVersionEnum.VERSION_3_5.getValue());
121+
Assert.assertEquals(getSum(bytes), 5);
122+
123+
bytes = dynamicPropertiesStore
124+
.statsByVersion(Parameter.ForkBlockVersionEnum.VERSION_3_6.getValue());
125+
Assert.assertEquals(getSum(bytes), 0);
126+
127+
bytes = dynamicPropertiesStore
128+
.statsByVersion(Parameter.ForkBlockVersionEnum.VERSION_4_4.getValue());
129+
Assert.assertEquals(getSum(bytes), 4);
130+
131+
bytes = dynamicPropertiesStore
132+
.statsByVersion(Parameter.ForkBlockVersionEnum.VERSION_4_5.getValue());
133+
Assert.assertEquals(getSum(bytes), 0);
134+
list.add(ByteString.copyFrom(new byte[32]));
135+
chainBaseManager.getWitnessScheduleStore().saveActiveWitnesses(list);
136+
forkController.reset();
137+
bytes = dynamicPropertiesStore
138+
.statsByVersion(Parameter.ForkBlockVersionEnum.VERSION_4_4.getValue());
139+
Assert.assertEquals(bytes.length, 5);
140+
bytes = dynamicPropertiesStore
141+
.statsByVersion(Parameter.ForkBlockVersionEnum.VERSION_4_5.getValue());
142+
Assert.assertEquals(bytes.length, 6);
143+
}
144+
145+
@Test
146+
public void testUpdate() {
147+
List<ByteString> list = new ArrayList<>();
148+
list.add(ByteString.copyFrom(getBytes(1)));
149+
list.add(ByteString.copyFrom(getBytes(2)));
150+
list.add(ByteString.copyFrom(getBytes(3)));
151+
list.add(ByteString.copyFrom(getBytes(4)));
152+
list.add(ByteString.copyFrom(getBytes(5)));
153+
154+
chainBaseManager.getWitnessScheduleStore().saveActiveWitnesses(list);
155+
156+
byte[] stats1 = {1, 1, 1, 1, 1};
157+
byte[] stats2 = {1, 1, 1, 1, 0};
158+
byte[] stats3 = {1, 1, 1, 0, 0};
159+
160+
dynamicPropertiesStore
161+
.statsByVersion(Parameter.ForkBlockVersionEnum.VERSION_3_5.getValue(), stats1);
162+
dynamicPropertiesStore
163+
.statsByVersion(Parameter.ForkBlockVersionEnum.VERSION_3_6.getValue(), stats2);
164+
dynamicPropertiesStore
165+
.statsByVersion(Parameter.ForkBlockVersionEnum.VERSION_4_4.getValue(), stats2);
166+
dynamicPropertiesStore
167+
.statsByVersion(Parameter.ForkBlockVersionEnum.VERSION_4_5.getValue(), stats3);
168+
169+
BlockCapsule blockCapsule = getBlock(1, Parameter.ForkBlockVersionEnum.VERSION_3_5);
170+
171+
forkController.update(blockCapsule);
172+
173+
byte[] bytes = dynamicPropertiesStore
174+
.statsByVersion(Parameter.ForkBlockVersionEnum.VERSION_3_6.getValue());
175+
Assert.assertEquals(0, bytes[0]);
176+
bytes = dynamicPropertiesStore
177+
.statsByVersion(Parameter.ForkBlockVersionEnum.VERSION_4_4.getValue());
178+
Assert.assertEquals(0, bytes[0]);
179+
bytes = dynamicPropertiesStore
180+
.statsByVersion(Parameter.ForkBlockVersionEnum.VERSION_4_5.getValue());
181+
Assert.assertEquals(0, bytes[0]);
182+
183+
blockCapsule = getBlock(1, Parameter.ForkBlockVersionEnum.VERSION_4_5);
184+
forkController.update(blockCapsule);
185+
bytes = dynamicPropertiesStore
186+
.statsByVersion(Parameter.ForkBlockVersionEnum.VERSION_3_6.getValue());
187+
Assert.assertEquals(0, bytes[0]);
188+
bytes = dynamicPropertiesStore
189+
.statsByVersion(Parameter.ForkBlockVersionEnum.VERSION_4_4.getValue());
190+
Assert.assertEquals(0, bytes[0]);
191+
bytes = dynamicPropertiesStore
192+
.statsByVersion(Parameter.ForkBlockVersionEnum.VERSION_4_5.getValue());
193+
Assert.assertEquals(1, bytes[0]);
194+
195+
blockCapsule = getBlock(4, Parameter.ForkBlockVersionEnum.VERSION_4_5);
196+
forkController.update(blockCapsule);
197+
blockCapsule = getBlock(5, Parameter.ForkBlockVersionEnum.VERSION_4_5);
198+
199+
dynamicPropertiesStore.saveLatestBlockHeaderTimestamp(1596780000000L);
200+
forkController.update(blockCapsule);
201+
202+
bytes = dynamicPropertiesStore
203+
.statsByVersion(Parameter.ForkBlockVersionEnum.VERSION_3_6.getValue());
204+
Assert.assertEquals(getSum(bytes), 5);
205+
bytes = dynamicPropertiesStore
206+
.statsByVersion(Parameter.ForkBlockVersionEnum.VERSION_4_3.getValue());
207+
Assert.assertEquals(getSum(bytes), 5);
208+
bytes = dynamicPropertiesStore
209+
.statsByVersion(Parameter.ForkBlockVersionEnum.VERSION_4_4.getValue());
210+
Assert.assertEquals(getSum(bytes), 5);
211+
bytes = dynamicPropertiesStore
212+
.statsByVersion(Parameter.ForkBlockVersionEnum.VERSION_4_5.getValue());
213+
Assert.assertEquals(getSum(bytes), 4);
214+
215+
blockCapsule = getBlock(1, Parameter.ForkBlockVersionEnum.VERSION_4_3);
216+
forkController.update(blockCapsule);
217+
bytes = dynamicPropertiesStore
218+
.statsByVersion(Parameter.ForkBlockVersionEnum.VERSION_4_4.getValue());
219+
Assert.assertEquals(getSum(bytes), 5);
220+
bytes = dynamicPropertiesStore
221+
.statsByVersion(Parameter.ForkBlockVersionEnum.VERSION_4_5.getValue());
222+
Assert.assertEquals(getSum(bytes), 4);
223+
}
224+
225+
@Test
226+
public void testCheck() {
227+
byte[] stats1 = {0, 0, 0, 0, 0};
228+
byte[] stats2 = {1, 1, 1, 1, 1};
229+
230+
for (Parameter.ForkBlockVersionEnum version : Parameter.ForkBlockVersionEnum.values()) {
231+
dynamicPropertiesStore.statsByVersion(version.getValue(), stats1);
232+
}
233+
234+
dynamicPropertiesStore
235+
.statsByVersion(Parameter.ForkBlockVersionEnum.VERSION_3_5.getValue(), stats2);
236+
237+
forkController.checkLocalVersion();
238+
239+
Assert.assertEquals(dynamicPropertiesStore.getLatestVersion(),
240+
Parameter.ForkBlockVersionEnum.VERSION_3_5.getValue());
241+
242+
243+
Args.getInstance().setVersionCheckEnable(false);
244+
dynamicPropertiesStore.saveLatestVersion(Integer.MAX_VALUE);
245+
246+
forkController.checkLocalVersion();
247+
248+
Args.getInstance().setVersionCheckEnable(true);
249+
250+
try {
251+
forkController.checkLocalVersion();
252+
Assert.fail();
253+
} catch (Exception e) {
254+
Assert.assertTrue(e instanceof RuntimeException);
255+
}
256+
}
257+
258+
private BlockCapsule getBlock(int i, Parameter.ForkBlockVersionEnum versionEnum) {
259+
org.tron.protos.Protocol.BlockHeader.raw rawData =
260+
org.tron.protos.Protocol.BlockHeader.raw.newBuilder()
261+
.setVersion(versionEnum.getValue())
262+
.setWitnessAddress(ByteString.copyFrom(getBytes(i)))
263+
.build();
264+
265+
Protocol.BlockHeader blockHeader = Protocol.BlockHeader.newBuilder()
266+
.setRawData(rawData).build();
267+
268+
Protocol.Block block = Protocol.Block.newBuilder().setBlockHeader(blockHeader).build();
269+
270+
return new BlockCapsule(block);
271+
}
272+
273+
private int getSum(byte[] bytes) {
274+
int sum = 0;
275+
for (byte aByte : bytes) {
276+
sum += aByte;
277+
}
278+
return sum;
279+
}
280+
281+
private byte[] getBytes(int i) {
282+
byte[] bytes = new byte[21];
283+
bytes[i] = 1;
284+
return bytes;
285+
}
286+
287+
@After
288+
public void removeDb() {
289+
Args.clearParam();
290+
context.destroy();
291+
FileUtil.deleteDir(new File(dbPath));
292+
}
293+
294+
}

0 commit comments

Comments
 (0)