commonParameter = mockStatic(CommonParameter.class)) {
+ commonParameter.when(CommonParameter::getInstance).thenReturn(commonParameterMock);
+ Assert.assertNull(privateMethod.invoke(dbManager));
+ verify(chainBaseManagerMock).getBlockById(any());
+ }
}
@Test
@@ -561,8 +565,7 @@ public void testPostContractTriggerSwallowsThrowable() throws Exception {
Method method = Manager.class.getDeclaredMethod("postContractTrigger",
TransactionTrace.class, boolean.class, String.class);
method.setAccessible(true);
- // catch (Throwable) absorbs the NPE — invocation must complete normally
- method.invoke(dbManager, traceMock, false, "blockhash");
+ Assert.assertNull(method.invoke(dbManager, traceMock, false, "blockhash"));
} finally {
instanceField.set(null, original);
eventLoadedField.set(dbManager, false);
@@ -577,9 +580,9 @@ public void testPostContractTriggerSwallowsThrowable() throws Exception {
*
* Strategy: spy(Manager), inject mocked khaosDb/revokingStore/chainBaseManager
* so switchFork enters the first apply loop with a single mock block whose
- * validateSignature returns false. The throw is exercised; downstream
- * switchback/finally exceptions from partially-mocked applyBlock are tolerated
- * since the throw line is already executed before they run.
+ * validateSignature returns false. The switchback is arranged to fail with a checked
+ * exception that switchFork handles internally, allowing the test to assert that the
+ * reflected invocation surfaces the original ValidateSignatureException and message.
*/
@SneakyThrows
@Test
@@ -620,6 +623,13 @@ public void testSwitchForkRejectsBlockWithInvalidSignature() {
BlockCapsule.BlockId oldBlockId = mock(BlockCapsule.BlockId.class);
when(oldBlock.getBlockId()).thenReturn(oldBlockId);
when(oldBlock.getParentHash()).thenReturn(sharedHash);
+ when(oldBlock.setSwitch(true)).thenReturn(oldBlock);
+
+ // Make the switchback apply fail with a checked exception that switchFork handles, so the
+ // original invalid-signature exception remains the one surfaced to the caller.
+ Consensus consensus = mock(Consensus.class);
+ when(consensus.validBlock(oldBlock)).thenReturn(false);
+ setField(dbManager, "consensus", consensus);
LinkedList first = new LinkedList<>();
first.add(new KhaosDatabase.KhaosBlock(badBlock));
@@ -631,16 +641,12 @@ public void testSwitchForkRejectsBlockWithInvalidSignature() {
Method switchFork = Manager.class.getDeclaredMethod("switchFork", BlockCapsule.class);
switchFork.setAccessible(true);
- // The throw fires before the finally's switchback runs. Switchback's applyBlock
- // may surface another exception due to partial mocks; we tolerate any throwable
- // here because the new code's throw has already been executed (line covered).
- try {
- switchFork.invoke(dbManager, badBlock);
- } catch (Throwable ignored) {
- // expected: switchback path partially mocked
- }
+ InvocationTargetException thrown = assertThrows(InvocationTargetException.class,
+ () -> switchFork.invoke(dbManager, badBlock));
+ assertTrue(thrown.getCause() instanceof ValidateSignatureException);
+ Assert.assertEquals("switch fork: block 100 signature invalid",
+ thrown.getCause().getMessage());
- // The fix's contract: validateSignature was invoked on the replayed block.
verify(badBlock, atLeastOnce()).validateSignature(
any(DynamicPropertiesStore.class), any(AccountStore.class));
}
@@ -678,8 +684,9 @@ public void testSwitchForkPassesValidSignatureBlockToApply() {
when(goodBlock.getNum()).thenReturn(100L);
when(goodBlock.validateSignature(any(DynamicPropertiesStore.class),
any(AccountStore.class))).thenReturn(true);
- // setSwitch returns self for chained call from applyBlock argument expression.
- when(goodBlock.setSwitch(true)).thenReturn(goodBlock);
+ // Stop at the boundary of applyBlock with a deliberate marker exception. This proves the
+ // valid signature reached the apply path without tolerating arbitrary downstream failures.
+ when(goodBlock.setSwitch(true)).thenThrow(new IllegalStateException("apply path reached"));
LinkedList first = new LinkedList<>();
first.add(new KhaosDatabase.KhaosBlock(goodBlock));
@@ -689,11 +696,10 @@ public void testSwitchForkPassesValidSignatureBlockToApply() {
Method switchFork = Manager.class.getDeclaredMethod("switchFork", BlockCapsule.class);
switchFork.setAccessible(true);
- try {
- switchFork.invoke(dbManager, goodBlock);
- } catch (Throwable ignored) {
- // applyBlock against a mocked BlockCapsule will NPE somewhere; tolerated.
- }
+ InvocationTargetException thrown = assertThrows(InvocationTargetException.class,
+ () -> switchFork.invoke(dbManager, goodBlock));
+ assertTrue(thrown.getCause() instanceof IllegalStateException);
+ Assert.assertEquals("apply path reached", thrown.getCause().getMessage());
// Validation ran AND setSwitch was reached — proves the `if` did not short-circuit
// on the false branch when validateSignature returned true.
@@ -722,4 +728,4 @@ private static Field findField(Class> cls, String name) throws NoSuchFieldExce
throw new NoSuchFieldException(name);
}
-}
\ No newline at end of file
+}
diff --git a/framework/src/test/java/org/tron/core/db/ManagerTest.java b/framework/src/test/java/org/tron/core/db/ManagerTest.java
index 958a132fbbf..fdbbb9d6b88 100755
--- a/framework/src/test/java/org/tron/core/db/ManagerTest.java
+++ b/framework/src/test/java/org/tron/core/db/ManagerTest.java
@@ -265,7 +265,7 @@ public void setBlockReference()
}
@Test
- public void pushBlock() {
+ public void pushBlock() throws ItemNotFoundException {
boolean isUnlinked = false;
try {
dbManager.pushBlock(blockCapsule2);
@@ -282,14 +282,10 @@ public void pushBlock() {
Assert.assertEquals("getBlockIdByNum is error",
0, chainManager.getHeadBlockNum());
} else {
- try {
- Assert.assertEquals(
- "getBlockIdByNum is error",
- blockCapsule2.getBlockId().toString(),
- chainManager.getBlockIdByNum(1).toString());
- } catch (ItemNotFoundException e) {
- e.printStackTrace();
- }
+ Assert.assertEquals(
+ "getBlockIdByNum is error",
+ blockCapsule2.getBlockId().toString(),
+ chainManager.getBlockIdByNum(1).toString());
}
Assert.assertThrows(ItemNotFoundException.class,
@@ -578,89 +574,6 @@ public void pushBlockTooMuchShieldedTransactions() {
}
}
- @Test
- public void pushSwitchFork()
- throws UnLinkedBlockException, NonCommonBlockException, ContractValidateException,
- ValidateScheduleException, ZksnarkException, BadBlockException, VMIllegalException,
- BadNumberBlockException, DupTransactionException, ContractExeException,
- ValidateSignatureException, TooBigTransactionResultException, TransactionExpirationException,
- TaposException, ReceiptCheckErrException, TooBigTransactionException,
- AccountResourceInsufficientException, EventBloomException {
-
- String key = PublicMethod.getRandomPrivateKey();
- String key2 = PublicMethod.getRandomPrivateKey();
- byte[] privateKey = ByteArray.fromHexString(key);
- final ECKey ecKey = ECKey.fromPrivate(privateKey);
- byte[] address = ecKey.getAddress();
-
- ByteString addressByte = ByteString.copyFrom(address);
- AccountCapsule accountCapsule =
- new AccountCapsule(Protocol.Account.newBuilder()
- .setAddress(addressByte).build());
- chainManager.getAccountStore()
- .put(addressByte.toByteArray(), accountCapsule);
-
- WitnessCapsule sr1 = new WitnessCapsule(
- ByteString.copyFrom(address), "www.tron.net/first");
- sr1.setVoteCount(1000000000L);
-
-
- byte[] privateKey2 = ByteArray.fromHexString(key2);
- final ECKey ecKey2 = ECKey.fromPrivate(privateKey2);
- byte[] address2 = ecKey2.getAddress();
- WitnessCapsule sr2 = new WitnessCapsule(
- ByteString.copyFrom(address2), "www.tron.net/second");
- sr2.setVoteCount(100000L);
- chainManager.getWitnessStore().put(address, sr1);
- WitnessCapsule witnessCapsule = new WitnessCapsule(ByteString.copyFrom(address));
- chainManager.getWitnessScheduleStore().saveActiveWitnesses(new ArrayList<>());
- chainManager.addWitness(ByteString.copyFrom(address));
- List witnessStandby1 = chainManager.getWitnessStore().getWitnessStandby(
- chainManager.getDynamicPropertiesStore().allowWitnessSortOptimization());
- Block block = blockGenerate.getSignedBlock(
- witnessCapsule.getAddress(), 1533529947843L, privateKey);
- dbManager.pushBlock(new BlockCapsule(block));
-
- Map addressToProvateKeys = addTestWitnessAndAccount();
- addressToProvateKeys.put(ByteString.copyFrom(address), key);
-
- long num = chainManager.getDynamicPropertiesStore().getLatestBlockHeaderNumber();
- ByteString latestHeadHash =
- chainManager.getDynamicPropertiesStore().getLatestBlockHeaderHash().getByteString();
- BlockCapsule blockCapsule1 =
- createTestBlockCapsule(
- 1533529947843L + 3000,
- num + 1,
- latestHeadHash,
- addressToProvateKeys);
-
- dbManager.pushBlock(blockCapsule1);
-
- BlockCapsule blockCapsule2 =
- createTestBlockCapsule(
- 1533529947843L + 6000,
- num + 2,
- blockCapsule1.getBlockId().getByteString(),
- addressToProvateKeys);
-
- chainManager.getDynamicPropertiesStore()
- .saveLatestBlockHeaderHash(latestHeadHash); // change lastest block head
-
- try {
- dbManager.pushBlock(blockCapsule2);
- Assert.assertTrue(false);
- } catch (BadBlockException e) {
- Assert.assertFalse(e instanceof BadBlockException);
- } catch (Exception e) {
- Assert.assertTrue(e instanceof Exception);
- }
- chainManager.getWitnessStore().put(address, sr2);
- List witnessStandby2 = chainManager.getWitnessStore().getWitnessStandby(
- chainManager.getDynamicPropertiesStore().allowWitnessSortOptimization());
- Assert.assertNotEquals(witnessStandby1, witnessStandby2);
- }
-
-
public void updateWits() {
int sizePrv = chainManager.getWitnessScheduleStore().getActiveWitnesses().size();
chainManager
@@ -1096,16 +1009,16 @@ public void switchBack()
dbManager.pushBlock(blockCapsule0);
dbManager.pushBlock(blockCapsule1);
- try {
- BlockCapsule blockCapsule2 =
- createTestBlockCapsuleError(
- 1533529947843L + 6000,
- num + 2, blockCapsule1.getBlockId().getByteString(), addressToProvateKeys);
+ ValidateScheduleException scheduleException = Assert.assertThrows(
+ ValidateScheduleException.class, () -> {
+ BlockCapsule blockCapsule2 =
+ createTestBlockCapsuleError(
+ 1533529947843L + 6000,
+ num + 2, blockCapsule1.getBlockId().getByteString(), addressToProvateKeys);
- dbManager.pushBlock(blockCapsule2);
- } catch (ValidateScheduleException e) {
- logger.info("the fork chain has error block");
- }
+ dbManager.pushBlock(blockCapsule2);
+ });
+ Assert.assertEquals("validateWitnessSchedule error", scheduleException.getMessage());
Assert.assertNotNull(chainManager.getBlockStore().get(blockCapsule0.getBlockId().getBytes()));
Assert.assertEquals(blockCapsule0.getBlockId(),
@@ -1534,12 +1447,19 @@ public void testReOrgBlockTrigger() throws Exception {
EventPluginLoader originalLoader = (EventPluginLoader) instanceField.get(null);
EventPluginLoader mockLoader = installMockLoader();
when(mockLoader.isBlockLogTriggerEnable()).thenReturn(true);
+ when(mockLoader.isBlockLogTriggerSolidified()).thenReturn(false);
when(mockLoader.isTransactionLogTriggerEnable()).thenReturn(false);
+ BlockingQueue queue = dbManager.getTriggerCapsuleQueue();
+ queue.clear();
try {
Method m = Manager.class.getDeclaredMethod("reOrgBlockTrigger");
m.setAccessible(true);
- // exercises the fetch of the old head block + try/catch; must not throw
m.invoke(dbManager);
+ Assert.assertEquals(1, queue.size());
+ BlockLogTriggerCapsule trigger = (BlockLogTriggerCapsule) queue.poll();
+ Assert.assertTrue(trigger.getBlockLogTrigger().isRemoved());
+ Assert.assertEquals(dbManager.getHeadBlockNum(),
+ trigger.getBlockLogTrigger().getBlockNumber());
} finally {
restoreLoader(originalLoader);
}
@@ -1558,11 +1478,18 @@ public void testPostSolidityTriggerSolidified() throws Exception {
when(mockLoader.isTransactionLogTriggerEthCompatible()).thenReturn(false);
// make getContinuousBlockCapsule cover the current head block
ReflectUtils.setFieldValue(dbManager, "lastUsedSolidityNum", -1L);
+ BlockingQueue queue = dbManager.getTriggerCapsuleQueue();
+ queue.clear();
try {
Method m = Manager.class.getDeclaredMethod("postSolidityTrigger", long.class);
m.setAccessible(true);
- // exercises the solidified-mode block/transaction batch emission
- m.invoke(dbManager, dbManager.getHeadBlockNum());
+ long headBlockNum = dbManager.getHeadBlockNum();
+ m.invoke(dbManager, headBlockNum);
+ Assert.assertFalse(queue.isEmpty());
+ BlockLogTriggerCapsule trigger = (BlockLogTriggerCapsule) queue.poll();
+ Assert.assertFalse(trigger.getBlockLogTrigger().isRemoved());
+ Assert.assertEquals(headBlockNum,
+ trigger.getBlockLogTrigger().getLatestSolidifiedBlockNumber());
} finally {
restoreLoader(originalLoader);
}
diff --git a/framework/src/test/java/org/tron/core/db/MarketPairPriceToOrderStoreTest.java b/framework/src/test/java/org/tron/core/db/MarketPairPriceToOrderStoreTest.java
index 35cbbd1096f..850bdad7fd8 100755
--- a/framework/src/test/java/org/tron/core/db/MarketPairPriceToOrderStoreTest.java
+++ b/framework/src/test/java/org/tron/core/db/MarketPairPriceToOrderStoreTest.java
@@ -83,7 +83,7 @@ public void testOrderWithSamePair() {
MarketOrderIdListCapsule capsule3 = new MarketOrderIdListCapsule(ByteArray.fromLong(3),
ByteArray.fromLong(3));
- //Use out-of-order insertion,key in store should be 1,2,3
+ // Use out-of-order insertion; keys in the store should be 1, 2, 3.
marketPairPriceToOrderStore.put(pairPriceKey2, capsule2);
marketPairPriceToOrderStore.put(pairPriceKey1, capsule1);
marketPairPriceToOrderStore.put(pairPriceKey3, capsule3);
@@ -141,7 +141,7 @@ public void testOrderWithSamePairOrdinal() {
MarketOrderIdListCapsule capsule3 = new MarketOrderIdListCapsule(ByteArray.fromLong(3),
ByteArray.fromLong(3));
- //Use out-of-order insertion,key in store should be 1,2,3
+ // Use out-of-order insertion; keys in the store should be 1, 2, 3.
marketPairPriceToOrderStore.put(pairPriceKey1, capsule1);
marketPairPriceToOrderStore.put(pairPriceKey2, capsule2);
marketPairPriceToOrderStore.put(pairPriceKey3, capsule3);
@@ -207,7 +207,7 @@ public void testAddPrice() {
MarketOrderIdListCapsule capsule3 = new MarketOrderIdListCapsule(ByteArray.fromLong(3),
ByteArray.fromLong(3));
- //Use out-of-order insertion,key in store should be 1,2,3
+ // Use out-of-order insertion; keys in the store should be 1, 2, 3.
marketPairPriceToOrderStore.put(pairPriceKey2, capsule2);
marketPairPriceToOrderStore.put(pairPriceKey1, capsule1);
marketPairPriceToOrderStore.put(pairPriceKey3, capsule3);
@@ -277,7 +277,7 @@ public void testAddPriceWithoutHeadKey() {
Assert.assertFalse(marketPairPriceToOrderStore.has(pairPriceKey2));
Assert.assertFalse(marketPairPriceToOrderStore.has(pairPriceKey3));
- //Use out-of-order insertion,key in store should be 1,2,3
+ // Use out-of-order insertion; keys in the store should be 1, 2, 3.
marketPairPriceToOrderStore.put(pairPriceKey2, capsule2);
try {
Assert
@@ -359,7 +359,7 @@ public void testAddPriceAndHeadKey() {
Assert.assertFalse(marketPairPriceToOrderStore.has(pairPriceKey2));
Assert.assertFalse(marketPairPriceToOrderStore.has(pairPriceKey3));
- //Use out-of-order insertion,key in store should be 1,2,3
+ // Use out-of-order insertion; keys in the store should be 1, 2, 3.
marketPairPriceToOrderStore.put(pairPriceKey1, capsule1);
try {
Assert
@@ -454,7 +454,7 @@ public void testPriceWithSamePair() {
Assert.assertEquals(0, marketPairToPriceStore.getPriceNum(sellTokenID1, buyTokenID1));
- //Use out-of-order insertion,key in store should be 1,2,3
+ // Use out-of-order insertion; keys in the store should be 1, 2, 3.
marketPairPriceToOrderStore.put(pairPriceKey1, new MarketOrderIdListCapsule());
marketPairToPriceStore.addNewPriceKey(sellTokenID1, buyTokenID1, marketPairPriceToOrderStore);
Assert.assertEquals(1, marketPairToPriceStore.getPriceNum(sellTokenID1, buyTokenID1));
@@ -795,4 +795,4 @@ public void testTrim() {
Assert.assertArrayEquals(buyTokenId,
MarketUtils.trim(marketOrderPair.getBuyTokenId().toByteArray()));
}
-}
\ No newline at end of file
+}
diff --git a/framework/src/test/java/org/tron/core/db/TransactionStoreTest.java b/framework/src/test/java/org/tron/core/db/TransactionStoreTest.java
index b79c4cdfc14..a8e14ac2d0a 100644
--- a/framework/src/test/java/org/tron/core/db/TransactionStoreTest.java
+++ b/framework/src/test/java/org/tron/core/db/TransactionStoreTest.java
@@ -311,10 +311,8 @@ public void transactionKeyNullTest() throws BadItemException {
chainBaseManager.getAccountStore());
byte[] key = null;
transactionStore.put(key, ret);
- try {
- transactionStore.get(key);
- } catch (RuntimeException e) {
- Assert.assertEquals("The key argument cannot be null", e.getMessage());
- }
+ IllegalArgumentException exception = Assert.assertThrows(IllegalArgumentException.class,
+ () -> transactionStore.get(key));
+ Assert.assertEquals("The key argument cannot be null", exception.getMessage());
}
}
diff --git a/framework/src/test/java/org/tron/core/db2/SnapshotImplTest.java b/framework/src/test/java/org/tron/core/db2/SnapshotImplTest.java
index 3ee61065d1f..4715fd5f2c9 100644
--- a/framework/src/test/java/org/tron/core/db2/SnapshotImplTest.java
+++ b/framework/src/test/java/org/tron/core/db2/SnapshotImplTest.java
@@ -81,19 +81,19 @@ public void testMergeAhead() throws Exception {
from2.put("key4".getBytes(), "value4".getBytes());
/*
- // before merge get data in from is success,traverse 0 times
+ // before merge get data in from is success, traverse 0 times
byte[] s1 = from.get("key1".getBytes());
assertEquals(new String("value1".getBytes()), new String(s1));
byte[] s2 = from.get("key2".getBytes());
assertEquals(new String("value2".getBytes()), new String(s2));
- // before merge get data in from2 is success, traverse 0 times
+ // before merge get data in from2 is success, traverse 0 times
byte[] s3 = from2.get("key3".getBytes());
assertEquals(new String("value3".getBytes()), new String(s3));
byte[] s4 = from2.get("key4".getBytes());
assertEquals(new String("value4".getBytes()), new String(s4));
*/
- // before merge from2 get data is success, traverse 1 times
+ // before merge from2 get data is success, traverse 1 times
byte[] s11 = from2.get("key1".getBytes());
assertEquals(new String("value1".getBytes()), new String(s11));
byte[] s12 = from2.get("key2".getBytes());
@@ -105,20 +105,20 @@ public void testMergeAhead() throws Exception {
// do mergeAhead
from2.mergeAhead(from);
/*
- // after merge get data in from is success, traverse 0 times
+ // after merge get data in from is success, traverse 0 times
s1 = from.get("key1".getBytes());
assertEquals(new String("value1".getBytes()), new String(s1));
s2 = from.get("key2".getBytes());
assertEquals(new String("value2".getBytes()), new String(s2));
- // after merge get data in from2 is success, traverse 0 times
+ // after merge get data in from2 is success, traverse 0 times
s3 = from2.get("key3".getBytes());
assertEquals(new String("value3".getBytes()), new String(s3));
s4 = from2.get("key4".getBytes());
assertEquals(new String("value4".getBytes()), new String(s4));
*/
- // after merge from2 get data is success, traverse 0 times
+ // after merge from2 get data is success, traverse 0 times
byte[] s1 = from2.get("key1".getBytes());
assertEquals(new String("value1".getBytes()), new String(s1));
byte[] s2 = from2.get("key2".getBytes());
@@ -150,7 +150,7 @@ public void testMergeOverride() throws Exception {
// do mergeAhead
from2.mergeAhead(from);
- // after merge from2 get data is success, traverse 0 times
+ // after merge from2 get data is success, traverse 0 times
byte[] s1 = from2.get("key1".getBytes());
assertEquals(new String("value1".getBytes()), new String(s1));
byte[] s2 = from2.get("key2".getBytes());
diff --git a/framework/src/test/java/org/tron/core/metrics/MetricsUtilTest.java b/framework/src/test/java/org/tron/core/metrics/MetricsUtilTest.java
index 74ff6821b46..28f8ca879ce 100644
--- a/framework/src/test/java/org/tron/core/metrics/MetricsUtilTest.java
+++ b/framework/src/test/java/org/tron/core/metrics/MetricsUtilTest.java
@@ -1,7 +1,10 @@
package org.tron.core.metrics;
+import org.junit.After;
import org.junit.Assert;
+import org.junit.Before;
import org.junit.Test;
+import org.tron.common.parameter.CommonParameter;
public class MetricsUtilTest {
@@ -9,30 +12,45 @@ public class MetricsUtilTest {
private String test2 = "test2";
private String test3 = "test3";
private String test4 = "test4";
+ private boolean metricsEnabled;
+
+ @Before
+ public void enableMetrics() {
+ metricsEnabled = CommonParameter.getInstance().isNodeMetricsEnable();
+ CommonParameter.getInstance().setNodeMetricsEnable(true);
+ }
+
+ @After
+ public void restoreMetricsFlag() {
+ CommonParameter.getInstance().setNodeMetricsEnable(metricsEnabled);
+ }
@Test
public void testCounterInc() {
+ long before = MetricsUtil.getCounter(test1).getCount();
MetricsUtil.counterInc(test1);
- //Assert
- // .assertEquals(1, MetricsUtil.getCounter(test1).getCount());
+ Assert.assertEquals(before + 1, MetricsUtil.getCounter(test1).getCount());
}
- //@Test
+ @Test
public void testMeterMark() {
+ long before = MetricsUtil.getMeter(test2).getCount();
MetricsUtil.meterMark(test2);
- Assert.assertEquals(1, MetricsUtil.getMeter(test2).getCount());
+ Assert.assertEquals(before + 1, MetricsUtil.getMeter(test2).getCount());
}
- //@Test
+ @Test
public void testMeterMark2() {
+ long before = MetricsUtil.getMeter(test3).getCount();
MetricsUtil.meterMark(test3, 1);
- Assert.assertEquals(1, MetricsUtil.getMeter(test3).getCount());
+ Assert.assertEquals(before + 1, MetricsUtil.getMeter(test3).getCount());
}
- //@Test
+ @Test
public void testHistogramUpdate() {
+ long before = MetricsUtil.getHistogram(test4).getCount();
MetricsUtil.histogramUpdate(test4, 1);
- Assert.assertEquals(1,
+ Assert.assertEquals(before + 1,
MetricsUtil.getHistogram(test4).getCount());
}
}
diff --git a/framework/src/test/java/org/tron/core/witness/WitnessControllerTest.java b/framework/src/test/java/org/tron/core/witness/WitnessControllerTest.java
index c07775907d6..1e9b83e9acd 100644
--- a/framework/src/test/java/org/tron/core/witness/WitnessControllerTest.java
+++ b/framework/src/test/java/org/tron/core/witness/WitnessControllerTest.java
@@ -1,6 +1,9 @@
package org.tron.core.witness;
import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertTrue;
+import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.when;
import com.google.protobuf.ByteString;
import java.util.ArrayList;
@@ -10,6 +13,7 @@
import org.tron.common.BaseTest;
import org.tron.common.TestConstants;
import org.tron.common.utils.ByteArray;
+import org.tron.consensus.dpos.DposService;
import org.tron.consensus.dpos.DposSlot;
import org.tron.core.config.args.Args;
@@ -24,48 +28,36 @@ public class WitnessControllerTest extends BaseTest {
}
@Test
- public void testSlot() {
-
- chainBaseManager.getDynamicPropertiesStore().saveLatestBlockHeaderTimestamp(19000);
- chainBaseManager.getDynamicPropertiesStore().saveLatestBlockHeaderNumber(1);
-
- }
-
- // @Test
public void testWitnessSchedule() {
+ DposService dposService = mock(DposService.class);
+ when(dposService.getGenesisBlockTime())
+ .thenReturn(chainBaseManager.getGenesisBlock().getTimeStamp());
+ dposSlot.setDposService(dposService);
+ List activeWitnesses = new ArrayList<>();
+ chainBaseManager.getWitnessStore().getAllWitnesses()
+ .forEach(witness -> activeWitnesses.add(witness.getAddress()));
+ chainBaseManager.getWitnessStore().sortWitness(activeWitnesses,
+ chainBaseManager.getDynamicPropertiesStore().allowWitnessSortOptimization());
+ chainBaseManager.getWitnessScheduleStore().saveActiveWitnesses(activeWitnesses);
// no witness produce block
assertEquals(0, chainBaseManager.getHeadBlockNum());
- // test witnesses in genesis block
- assertEquals(
- "41904fe896536f4bebc64c95326b5054a2c3d27df6", // first(current witness)
- ByteArray.toHexString(
- (dposSlot.getScheduledWitness(0).toByteArray())));
- assertEquals(
- "41904fe896536f4bebc64c95326b5054a2c3d27df6",
- ByteArray.toHexString(
- (dposSlot.getScheduledWitness(5).toByteArray())));
- assertEquals(
- "41807337f180b62a77576377c1d0c9c24df5c0dd62", // second(next witness)
- ByteArray.toHexString(
- (dposSlot.getScheduledWitness(6).toByteArray())));
- assertEquals(
- "41807337f180b62a77576377c1d0c9c24df5c0dd62",
- ByteArray.toHexString(
- (dposSlot.getScheduledWitness(11).toByteArray())));
- assertEquals(
- "415430a3f089154e9e182ddd6fe136a62321af22a7", // third
- ByteArray.toHexString(
- (dposSlot.getScheduledWitness(12).toByteArray())));
+ // DposService initializes the active schedule from the sorted witness store.
+ assertTrue(activeWitnesses.size() > 6);
+ assertEquals(activeWitnesses.get(0), dposSlot.getScheduledWitness(0));
+ assertEquals(activeWitnesses.get(5), dposSlot.getScheduledWitness(5));
+ assertEquals(activeWitnesses.get(6), dposSlot.getScheduledWitness(6));
+ assertEquals(activeWitnesses.get(0),
+ dposSlot.getScheduledWitness(activeWitnesses.size()));
+ assertEquals(activeWitnesses.get(1),
+ dposSlot.getScheduledWitness(activeWitnesses.size() + 1L));
// test maintenance
ByteString a =
ByteString.copyFrom(ByteArray.fromHexString("41ec6525979a351a54fa09fea64beb4cce33ffbb7a"));
ByteString b =
ByteString.copyFrom(ByteArray.fromHexString("41fab5fbf6afb681e4e37e9d33bddb7e923d6132e5"));
- // system.out.print("a address:" + ByteArray.toHexString(a.toByteArray()) + "\n");
- // System.out.print("b address:" + ByteArray.toHexString(b.toByteArray()));
List w = new ArrayList<>();
w.add(a);
w.add(b);
@@ -75,12 +67,9 @@ public void testWitnessSchedule() {
// now 2 active witnesses
assertEquals(2, chainBaseManager.getWitnessScheduleStore().getActiveWitnesses().size());
- // update shuffled witness
- chainBaseManager.getWitnessScheduleStore().saveCurrentShuffledWitnesses(w);
-
- assertEquals(a, dposSlot.getScheduledWitness(1));
- assertEquals(b, dposSlot.getScheduledWitness(2));
- assertEquals(a, dposSlot.getScheduledWitness(3));
- assertEquals(b, dposSlot.getScheduledWitness(4));
+ assertEquals(a, dposSlot.getScheduledWitness(0));
+ assertEquals(b, dposSlot.getScheduledWitness(1));
+ assertEquals(a, dposSlot.getScheduledWitness(2));
+ assertEquals(b, dposSlot.getScheduledWitness(3));
}
}
diff --git a/framework/src/test/java/org/tron/program/AccountVoteWitnessTest.java b/framework/src/test/java/org/tron/program/AccountVoteWitnessTest.java
index bc449be4a8c..7da28d7d314 100755
--- a/framework/src/test/java/org/tron/program/AccountVoteWitnessTest.java
+++ b/framework/src/test/java/org/tron/program/AccountVoteWitnessTest.java
@@ -2,10 +2,9 @@
import com.google.common.collect.Lists;
import com.google.protobuf.ByteString;
-import java.io.File;
import java.util.List;
import javax.annotation.Resource;
-import lombok.extern.slf4j.Slf4j;
+import org.junit.Assert;
import org.junit.Test;
import org.tron.common.BaseTest;
import org.tron.common.TestConstants;
@@ -15,7 +14,6 @@
import org.tron.core.config.args.Args;
import org.tron.protos.Protocol.AccountType;
-@Slf4j
public class AccountVoteWitnessTest extends BaseTest {
@Resource
@@ -25,20 +23,8 @@ public class AccountVoteWitnessTest extends BaseTest {
Args.setParam(new String[]{"-d", dbPath()}, TestConstants.TEST_CONF);
}
- private static Boolean deleteFolder(File index) {
- if (!index.isDirectory() || index.listFiles().length <= 0) {
- return index.delete();
- }
- for (File file : index.listFiles()) {
- if (null != file && !deleteFolder(file)) {
- return false;
- }
- }
- return index.delete();
- }
-
@Test
- public void testAccountVoteWitness() {
+ public void testMaintenanceIgnoresVotesWithoutPendingVoteRecords() {
final List accountCapsuleList = this.getAccountList();
final List witnessCapsuleList = this.getWitnessList();
accountCapsuleList.forEach(
@@ -46,7 +32,6 @@ public void testAccountVoteWitness() {
dbManager
.getAccountStore()
.put(accountCapsule.getAddress().toByteArray(), accountCapsule);
- this.printAccount(accountCapsule.getAddress());
});
witnessCapsuleList.forEach(
witnessCapsule ->
@@ -54,37 +39,17 @@ public void testAccountVoteWitness() {
.getWitnessStore()
.put(witnessCapsule.getAddress().toByteArray(), witnessCapsule));
maintenanceManager.doMaintenance();
- this.printWitness(ByteString.copyFrom("00000000001".getBytes()));
- this.printWitness(ByteString.copyFrom("00000000002".getBytes()));
- this.printWitness(ByteString.copyFrom("00000000003".getBytes()));
- this.printWitness(ByteString.copyFrom("00000000004".getBytes()));
- this.printWitness(ByteString.copyFrom("00000000005".getBytes()));
- this.printWitness(ByteString.copyFrom("00000000006".getBytes()));
- this.printWitness(ByteString.copyFrom("00000000007".getBytes()));
- }
-
- private void printAccount(final ByteString address) {
- final AccountCapsule accountCapsule = dbManager.getAccountStore().get(address.toByteArray());
- if (null == accountCapsule) {
- logger.info("address is {} , account is null", address.toStringUtf8());
- return;
- }
- logger.info(
- "address is {} ,countVoteSize is {}",
- accountCapsule.getAddress().toStringUtf8(),
- accountCapsule.getVotesList().size());
+ Assert.assertEquals(0L, getWitnessVoteCount("00000000001"));
+ Assert.assertEquals(100L, getWitnessVoteCount("00000000003"));
+ Assert.assertEquals(200L, getWitnessVoteCount("00000000005"));
+ Assert.assertEquals(300L, getWitnessVoteCount("00000000006"));
+ Assert.assertNull(dbManager.getWitnessStore().get("00000000002".getBytes()));
}
- private void printWitness(final ByteString address) {
- final WitnessCapsule witnessCapsule = dbManager.getWitnessStore().get(address.toByteArray());
- if (null == witnessCapsule) {
- logger.info("address is {} , witness is null", address.toStringUtf8());
- return;
- }
- logger.info(
- "address is {} ,countVote is {}",
- witnessCapsule.getAddress().toStringUtf8(),
- witnessCapsule.getVoteCount());
+ private long getWitnessVoteCount(String address) {
+ WitnessCapsule witness = dbManager.getWitnessStore().get(address.getBytes());
+ Assert.assertNotNull(witness);
+ return witness.getVoteCount();
}
private List getAccountList() {
diff --git a/framework/src/test/java/org/tron/program/SolidityNodeTest.java b/framework/src/test/java/org/tron/program/SolidityNodeTest.java
index ade00374bc4..66277a486ef 100755
--- a/framework/src/test/java/org/tron/program/SolidityNodeTest.java
+++ b/framework/src/test/java/org/tron/program/SolidityNodeTest.java
@@ -15,6 +15,7 @@
import java.util.concurrent.LinkedBlockingDeque;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.atomic.AtomicLong;
+import java.util.concurrent.atomic.AtomicReference;
import javax.annotation.Resource;
import lombok.extern.slf4j.Slf4j;
import org.junit.Assert;
@@ -80,40 +81,37 @@ private void setFlag(boolean value) throws Exception {
@Test
public void testSolidityGrpcCall() {
- rpcApiService.start();
DatabaseGrpcClient databaseGrpcClient = null;
String address = Args.getInstance().getTrustNodeAddr().split(":")[0] + ":" + rpcPort;
try {
+ rpcApiService.start();
databaseGrpcClient = new DatabaseGrpcClient(address);
- } catch (Exception e) {
- logger.error("Failed to create database grpc client {}", address);
- }
-
- Assert.assertNotNull(databaseGrpcClient);
- DynamicProperties dynamicProperties = databaseGrpcClient.getDynamicProperties();
- Assert.assertNotNull(dynamicProperties);
-
- Block genesisBlock = databaseGrpcClient.getBlock(0);
- Assert.assertNotNull(genesisBlock);
- Assert.assertFalse(genesisBlock.getTransactionsList().isEmpty());
- Block invalidBlock = databaseGrpcClient.getBlock(-1);
- Assert.assertNotNull(invalidBlock);
- try {
- databaseGrpcClient = new DatabaseGrpcClient(address, -1);
- } catch (Exception e) {
- logger.error("Failed to create database grpc client {}", address);
+ DynamicProperties dynamicProperties = databaseGrpcClient.getDynamicProperties();
+ Assert.assertNotNull(dynamicProperties);
+
+ Block genesisBlock = databaseGrpcClient.getBlock(0);
+ Assert.assertNotNull(genesisBlock);
+ Assert.assertFalse(genesisBlock.getTransactionsList().isEmpty());
+ Block invalidBlock = databaseGrpcClient.getBlock(-1);
+ Assert.assertNotNull(invalidBlock);
+
+ IllegalArgumentException exception = Assert.assertThrows(IllegalArgumentException.class,
+ () -> new DatabaseGrpcClient(address, -1));
+ Assert.assertEquals("Invalid host or port: " + address + " -1", exception.getMessage());
+ } finally {
+ if (databaseGrpcClient != null) {
+ databaseGrpcClient.shutdown();
+ }
+ rpcApiService.stop();
}
- databaseGrpcClient.shutdown();
- rpcApiService.stop();
}
@Test
- public void testSolidityNodeHttpApiService() {
+ public void testSolidityNodeHttpApiServiceStartIsIdempotent() {
solidityNodeHttpApiService.start();
// start again
solidityNodeHttpApiService.start();
solidityNodeHttpApiService.stop();
- Assert.assertTrue(true);
}
// ── lifecycle ─────────────────────────────────────────────────────────────────
@@ -584,11 +582,12 @@ public void testGetBlockShutdownPaths() throws Exception {
Method getBlockM = SolidityNode.class.getDeclaredMethod("getBlock");
getBlockM.setAccessible(true);
+ AtomicReference workerFailure = new AtomicReference<>();
Thread t = new Thread(() -> {
try {
getBlockM.invoke(solidityNode);
- } catch (Exception e) {
- Thread.currentThread().interrupt();
+ } catch (Throwable t1) {
+ workerFailure.set(t1);
}
});
t.start();
@@ -596,6 +595,9 @@ public void testGetBlockShutdownPaths() throws Exception {
t.interrupt(); // simulate ExecutorService.shutdownNow()
t.join(4000);
assertFalse("getBlock must exit cleanly when interrupted during put()", t.isAlive());
+ if (workerFailure.get() != null) {
+ throw new AssertionError("getBlock worker failed", workerFailure.get());
+ }
queue.clear();
setFlag(true);
@@ -679,11 +681,12 @@ public void testProcessSolidityBlockHandlesInterrupt() throws Exception {
Method m = SolidityNode.class.getDeclaredMethod("processSolidityBlock");
m.setAccessible(true);
+ AtomicReference workerFailure = new AtomicReference<>();
Thread t = new Thread(() -> {
try {
m.invoke(solidityNode);
- } catch (Exception ignored) {
- // InvocationTargetException should not happen; the method handles interrupt internally
+ } catch (Throwable t1) {
+ workerFailure.set(t1);
}
});
try {
@@ -692,6 +695,9 @@ public void testProcessSolidityBlockHandlesInterrupt() throws Exception {
t.interrupt();
t.join(5000);
assertFalse("processSolidityBlock must exit after interrupt", t.isAlive());
+ if (workerFailure.get() != null) {
+ throw new AssertionError("processSolidityBlock worker failed", workerFailure.get());
+ }
} finally {
setFlag(true);
delegateField.set(solidityNode, origDelegate);
diff --git a/framework/src/test/java/org/tron/program/SupplementTest.java b/framework/src/test/java/org/tron/program/SupplementTest.java
index f95f3222108..555ecbe41f3 100644
--- a/framework/src/test/java/org/tron/program/SupplementTest.java
+++ b/framework/src/test/java/org/tron/program/SupplementTest.java
@@ -130,10 +130,9 @@ public void testPasswordValid() {
}
@Test
- public void testRun() {
+ public void testShutdownHookRunDoesNotThrow() {
TronLogShutdownHook hook = new TronLogShutdownHook();
hook.run();
- assertTrue(true);
}
}
From 96bd8e439563cfe47ed52989d9f27aad62ef9547 Mon Sep 17 00:00:00 2001
From: 3for <287494524@qq.com>
Date: Thu, 27 Aug 2026 12:53:52 +0800
Subject: [PATCH 5/8] test: clean up remaining test fixtures and assertions
---
.../tron/common/crypto/BouncyCastleTest.java | 27 +-
.../common/crypto/SignatureInterfaceTest.java | 39 +-
.../common/jetty/SizeLimitHandlerTest.java | 16 +-
.../common/logsfilter/EventLoaderTest.java | 134 ++-
.../common/logsfilter/FilterQueryTest.java | 6 +-
.../logsfilter/NativeMessageQueueTest.java | 99 +--
.../ContractLogTriggerCapsuleTest.java | 17 +-
.../capsule/ContractTriggerCapsuleTest.java | 38 +-
.../capsule/LogsFilterCapsuleTest.java | 32 +-
.../capsule/SolidityEventCapsuleTest.java | 19 +-
.../capsule/SolidityLogCapsuleTest.java | 18 +-
.../capsule/SolidityTriggerCapsuleTest.java | 18 +-
.../org/tron/common/utils/ByteArrayTest.java | 3 +-
.../org/tron/common/utils/JsonUtilTest.java | 3 +-
.../common/utils/RandomGeneratorTest.java | 43 +-
.../org/tron/common/utils/Sha256HashTest.java | 5 +-
.../utils/client/utils/ShieldAddressInfo.java | 20 -
.../utils/client/utils/TransactionUtils.java | 41 +-
.../tron/core/ShieldedTRC20BuilderTest.java | 42 +-
.../org/tron/core/event/EventServiceTest.java | 31 +-
.../core/event/HistoryEventServiceTest.java | 129 ++-
.../core/event/RealtimeEventServiceTest.java | 37 +-
.../core/event/SolidEventServiceTest.java | 37 +-
.../java/org/tron/core/net/MessageTest.java | 22 +-
.../messagehandler/BlockMsgHandlerTest.java | 117 ++-
.../ChainInventoryMsgHandlerTest.java | 36 +-
.../messagehandler/PbftMsgHandlerTest.java | 20 +-
.../SyncBlockChainMsgHandlerTest.java | 32 +-
.../TransactionsMsgHandlerTest.java | 24 +-
.../core/net/services/RelayServiceTest.java | 150 ++--
.../core/net/services/SyncServiceTest.java | 26 +-
.../tron/core/zksnark/LibrustzcashTest.java | 84 +-
.../core/zksnark/MerkleContainerTest.java | 149 +---
.../org/tron/core/zksnark/MerkleTreeTest.java | 56 +-
.../tron/core/zksnark/SendCoinShieldTest.java | 795 ++++++++----------
.../core/zksnark/ShieldedReceiveTest.java | 70 +-
.../WalletUtilsInputPasswordTest.java | 10 -
.../java/org/tron/plugins/DbMoveTest.java | 2 +-
.../test/java/org/tron/plugins/DbTest.java | 2 +-
39 files changed, 1039 insertions(+), 1410 deletions(-)
diff --git a/framework/src/test/java/org/tron/common/crypto/BouncyCastleTest.java b/framework/src/test/java/org/tron/common/crypto/BouncyCastleTest.java
index ab6b2832c12..70be4300efb 100644
--- a/framework/src/test/java/org/tron/common/crypto/BouncyCastleTest.java
+++ b/framework/src/test/java/org/tron/common/crypto/BouncyCastleTest.java
@@ -2,6 +2,7 @@
import static org.junit.Assert.assertArrayEquals;
import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertThrows;
import static org.tron.common.utils.client.utils.AbiUtil.generateOccupationConstantPrivateKey;
import java.math.BigInteger;
@@ -9,7 +10,6 @@
import java.util.Arrays;
import org.bouncycastle.crypto.digests.SM3Digest;
import org.bouncycastle.util.encoders.Hex;
-import org.junit.Assert;
import org.junit.Test;
import org.tron.common.crypto.sm2.SM2;
import org.tron.common.utils.Sha256Hash;
@@ -135,19 +135,18 @@ public void testSM2SpongySignature() throws SignatureException {
}
@Test
- public void testSignToAddress() {
+ public void testSignToAddressWrapsInvalidSignature() {
String messageHash = "818e0e76976123b9b78b6076cc2b5d53e61b49ff9cf78304de688a860ce7cb95";
- String base64Sign = "G1y76mVO6TRpFwp3qOiLVzHA8uFsrDiOL7hbC2uN9qTHHiLypaW4vnQkfkoUygjo5qBd"
- + "+NlYQ/mAPVWKu6K00co=";
- try {
- SignUtils.signatureToAddress(Hex.decode(messageHash), base64Sign, Boolean.TRUE);
- } catch (Exception e) {
- Assert.assertTrue(e instanceof SignatureException);
- }
- try {
- SignUtils.signatureToAddress(Hex.decode(messageHash), base64Sign, Boolean.FALSE);
- } catch (Exception e) {
- Assert.assertTrue(e instanceof SignatureException);
- }
+ String truncatedBase64Signature = "AA==";
+
+ SignatureException ecException = assertThrows(SignatureException.class,
+ () -> SignUtils.signatureToAddress(
+ Hex.decode(messageHash), truncatedBase64Signature, true));
+ assertEquals(SignatureException.class, ecException.getCause().getClass());
+
+ SignatureException sm2Exception = assertThrows(SignatureException.class,
+ () -> SignUtils.signatureToAddress(
+ Hex.decode(messageHash), truncatedBase64Signature, false));
+ assertEquals(SignatureException.class, sm2Exception.getCause().getClass());
}
}
diff --git a/framework/src/test/java/org/tron/common/crypto/SignatureInterfaceTest.java b/framework/src/test/java/org/tron/common/crypto/SignatureInterfaceTest.java
index b413127db53..f5d1cdb8360 100644
--- a/framework/src/test/java/org/tron/common/crypto/SignatureInterfaceTest.java
+++ b/framework/src/test/java/org/tron/common/crypto/SignatureInterfaceTest.java
@@ -2,16 +2,16 @@
import static org.junit.Assert.assertArrayEquals;
import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertNull;
+import java.nio.charset.StandardCharsets;
+import java.security.SignatureException;
import java.util.Arrays;
-import lombok.extern.slf4j.Slf4j;
import org.bouncycastle.util.encoders.Hex;
import org.junit.Test;
import org.tron.common.crypto.sm2.SM2;
import org.tron.common.utils.PublicMethod;
-
-@Slf4j
public class SignatureInterfaceTest {
private String SM2_privString = PublicMethod.getSM2RandomPrivateKey();
@@ -31,14 +31,9 @@ public class SignatureInterfaceTest {
@Test
- public void testContructor() {
- SignInterface sign = new SM2();
- logger.info(Hex.toHexString(sign.getPrivateKey()) + " :SM2 Generated privkey");
- logger.info(Hex.toHexString(sign.getPubKey()) + " :SM2 Generated pubkey");
-
- sign = new ECKey();
- logger.info(Hex.toHexString(sign.getPrivateKey()) + " :ECDSA Generated privkey");
- logger.info(Hex.toHexString(sign.getPubKey()) + " :ECDSA Generated pubkey");
+ public void testConstructorGeneratesUsableKeys() throws SignatureException {
+ assertGeneratedKey(new SM2(), false);
+ assertGeneratedKey(new ECKey(), true);
}
@Test
@@ -63,10 +58,10 @@ public void testPublicKey() {
@Test
public void testNullKey() {
SignInterface sign = new SM2(SM2_pubKey, false);
- assertEquals(null, sign.getPrivateKey());
+ assertNull(sign.getPrivateKey());
sign = new ECKey(EC_pubKey, false);
- assertEquals(null, sign.getPrivateKey());
+ assertNull(sign.getPrivateKey());
}
@Test
@@ -75,11 +70,25 @@ public void testAddress() {
byte[] prefix_address = sign.getAddress();
byte[] address = Arrays.copyOfRange(prefix_address, 1, prefix_address.length);
byte[] addressTmp = Arrays.copyOfRange(Hex.decode(SM2_address), 1, prefix_address.length);
- assertEquals(Hex.toHexString(addressTmp), Hex.toHexString(address));
+ assertArrayEquals(addressTmp, address);
sign = new ECKey(EC_pubKey, false);
prefix_address = sign.getAddress();
address = Arrays.copyOfRange(prefix_address, 1, prefix_address.length);
byte[] ecAddressTmp = Arrays.copyOfRange(Hex.decode(EC_address), 1, prefix_address.length);
- assertEquals(Hex.toHexString(ecAddressTmp), Hex.toHexString(address));
+ assertArrayEquals(ecAddressTmp, address);
+ }
+
+ private void assertGeneratedKey(SignInterface sign, boolean ecKeyCryptoEngine)
+ throws SignatureException {
+ assertEquals(32, sign.getPrivateKey().length);
+ assertEquals(65, sign.getPubKey().length);
+ assertEquals(21, sign.getAddress().length);
+ assertEquals(64, sign.getNodeId().length);
+
+ byte[] hash = Hash.sha3("signature-interface".getBytes(StandardCharsets.UTF_8));
+ String signature = sign.signHash(hash);
+ assertEquals(65, sign.Base64toBytes(signature).length);
+ assertArrayEquals(sign.getAddress(),
+ SignUtils.signatureToAddress(hash, signature, ecKeyCryptoEngine));
}
}
diff --git a/framework/src/test/java/org/tron/common/jetty/SizeLimitHandlerTest.java b/framework/src/test/java/org/tron/common/jetty/SizeLimitHandlerTest.java
index 145eda6d398..643413b1ae9 100644
--- a/framework/src/test/java/org/tron/common/jetty/SizeLimitHandlerTest.java
+++ b/framework/src/test/java/org/tron/common/jetty/SizeLimitHandlerTest.java
@@ -328,21 +328,23 @@ public void testWireBytesMatchCheckBodySizeForAsciiJson() throws Exception {
}
/**
- * For UTF-8 JSON with multi-byte characters (CJK), wire bytes and
- * {@code body.getBytes().length} must still be identical - UTF-8 round-trips
- * through {@code request.getReader()} -> {@code String.getBytes()} losslessly.
+ * {@code Util.checkBodySize()} uses the platform default charset after the request has been
+ * decoded into a String. That value is not necessarily the UTF-8 wire size (for example, a
+ * US-ASCII default charset replaces CJK characters). The primary SizeLimitHandler assertion is
+ * covered by {@link #testLimitIsBasedOnBytesNotCharacters()}; this test mirrors the deprecated
+ * servlet-side check without assuming a particular process charset.
*/
@Test
- public void testWireBytesMatchCheckBodySizeForUtf8Json() throws Exception {
+ public void testCheckBodySizeUsesPlatformCharsetForUtf8Json() throws Exception {
String jsonBody = "{\"name\":\"测试地址\",\"amount\":100}";
- int wireBytes = jsonBody.getBytes("UTF-8").length;
+ int expectedServletBytes = jsonBody.getBytes().length;
String respBody = postForBody(httpServerUri, new StringEntity(jsonBody, "UTF-8"));
JSONObject json = JSONObject.parseObject(respBody);
int servletBytes = json.getIntValue("bytes");
- Assert.assertEquals("wire bytes should equal checkBodySize for UTF-8 JSON",
- wireBytes, servletBytes);
+ Assert.assertEquals("checkBodySize should use the platform default charset",
+ expectedServletBytes, servletBytes);
}
/**
diff --git a/framework/src/test/java/org/tron/common/logsfilter/EventLoaderTest.java b/framework/src/test/java/org/tron/common/logsfilter/EventLoaderTest.java
index 958af4f7b7b..26570ada47e 100644
--- a/framework/src/test/java/org/tron/common/logsfilter/EventLoaderTest.java
+++ b/framework/src/test/java/org/tron/common/logsfilter/EventLoaderTest.java
@@ -2,19 +2,25 @@
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertSame;
import static org.junit.Assert.assertTrue;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.when;
import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.HashMap;
import java.util.List;
-import org.junit.Assert;
+import java.util.Map;
import org.junit.Test;
import org.pf4j.PluginDescriptor;
import org.pf4j.PluginManager;
import org.pf4j.PluginWrapper;
import org.tron.common.logsfilter.trigger.BlockLogTrigger;
+import org.tron.common.logsfilter.trigger.InternalTransactionPojo;
+import org.tron.common.logsfilter.trigger.LogPojo;
import org.tron.common.logsfilter.trigger.TransactionLogTrigger;
+import org.tron.common.logsfilter.trigger.Trigger;
public class EventLoaderTest {
@@ -82,49 +88,97 @@ private static boolean checkVersion(String version) {
@Test
public void testBlockLogTrigger() {
BlockLogTrigger blt = new BlockLogTrigger();
- blt.setBlockHash(blt.getBlockHash());
- blt.setBlockNumber(blt.getBlockNumber());
- blt.setTransactionSize(blt.getTransactionSize());
- blt.setLatestSolidifiedBlockNumber(blt.getLatestSolidifiedBlockNumber());
- blt.setTriggerName(blt.getTriggerName());
- blt.setTimeStamp(blt.getTimeStamp());
- blt.setTransactionList(blt.getTransactionList());
- Assert.assertNotNull(blt.toString());
+ List transactionIds = Arrays.asList("tx-1", "tx-2");
+ blt.setBlockHash("block-hash");
+ blt.setBlockNumber(42L);
+ blt.setTransactionSize(2L);
+ blt.setLatestSolidifiedBlockNumber(40L);
+ blt.setTimeStamp(123456L);
+ blt.setTransactionList(transactionIds);
+ blt.setRemoved(true);
+
+ assertEquals(Trigger.BLOCK_TRIGGER_NAME, blt.getTriggerName());
+ assertEquals("block-hash", blt.getBlockHash());
+ assertEquals(42L, blt.getBlockNumber());
+ assertEquals(2L, blt.getTransactionSize());
+ assertEquals(40L, blt.getLatestSolidifiedBlockNumber());
+ assertEquals(123456L, blt.getTimeStamp());
+ assertSame(transactionIds, blt.getTransactionList());
+ assertTrue(blt.isRemoved());
+ assertEquals("triggerName: blockTrigger, timestamp: 123456, blockNumber: 42, "
+ + "blockhash: block-hash, transactionSize: 2, latestSolidifiedBlockNumber: 40, "
+ + "removed: true, transactionList: [tx-1, tx-2]", blt.toString());
}
@Test
public void testTransactionLogTrigger() {
TransactionLogTrigger tlt = new TransactionLogTrigger();
- tlt.setBlockHash(tlt.getBlockHash());
- tlt.setBlockNumber(tlt.getBlockNumber());
- tlt.setTransactionId(tlt.getTransactionId());
- tlt.setLatestSolidifiedBlockNumber(tlt.getLatestSolidifiedBlockNumber());
- tlt.setTriggerName(tlt.getTriggerName());
- tlt.setTimeStamp(tlt.getTimeStamp());
- tlt.setEnergyFee(tlt.getEnergyFee());
- tlt.setNetFee(tlt.getNetFee());
- tlt.setEnergyUsage(tlt.getEnergyUsage());
- tlt.setAssetAmount(tlt.getAssetAmount());
- tlt.setContractAddress(tlt.getContractAddress());
- tlt.setResult(tlt.getResult());
- tlt.setContractResult(tlt.getContractResult());
- tlt.setContractType(tlt.getContractType());
- tlt.setContractCallValue(tlt.getContractCallValue());
- tlt.setFromAddress(tlt.getFromAddress());
- tlt.setToAddress(tlt.getToAddress());
- tlt.setTransactionIndex(tlt.getTransactionIndex());
- tlt.setFeeLimit(tlt.getFeeLimit());
- tlt.setCumulativeEnergyUsed(tlt.getCumulativeEnergyUsed());
- tlt.setData(tlt.getData());
- tlt.setOriginEnergyUsage(tlt.getOriginEnergyUsage());
- tlt.setEnergyUsageTotal(tlt.getEnergyUsageTotal());
- tlt.setNetUsage(tlt.getNetUsage());
- tlt.setAssetName(tlt.getAssetName());
- tlt.setInternalTransactionList(tlt.getInternalTransactionList());
- tlt.setPreCumulativeLogCount(tlt.getPreCumulativeLogCount());
- tlt.setLogList(tlt.getLogList());
- tlt.setEnergyUnitPrice(tlt.getEnergyUnitPrice());
- tlt.setTimeStamp(1L);
- Assert.assertNotNull(tlt.toString());
+ List internalTransactions = new ArrayList<>();
+ List logs = new ArrayList<>();
+ Map extensions = new HashMap<>();
+ extensions.put("retryCount", 3L);
+
+ tlt.setTransactionId("transaction-id");
+ tlt.setBlockHash("block-hash");
+ tlt.setBlockNumber(101L);
+ tlt.setEnergyUsage(11L);
+ tlt.setEnergyFee(12L);
+ tlt.setOriginEnergyUsage(13L);
+ tlt.setEnergyUsageTotal(14L);
+ tlt.setNetUsage(15L);
+ tlt.setNetFee(16L);
+ tlt.setResult("SUCCESS");
+ tlt.setContractAddress("contract-address");
+ tlt.setContractType("TriggerSmartContract");
+ tlt.setFeeLimit(17L);
+ tlt.setContractCallValue(18L);
+ tlt.setContractResult("contract-result");
+ tlt.setFromAddress("from-address");
+ tlt.setToAddress("to-address");
+ tlt.setAssetName("asset-name");
+ tlt.setAssetAmount(19L);
+ tlt.setLatestSolidifiedBlockNumber(100L);
+ tlt.setInternalTransactionList(internalTransactions);
+ tlt.setData("deadbeef");
+ tlt.setTransactionIndex(2);
+ tlt.setCumulativeEnergyUsed(20L);
+ tlt.setPreCumulativeLogCount(21L);
+ tlt.setLogList(logs);
+ tlt.setEnergyUnitPrice(22L);
+ tlt.setExtMap(extensions);
+ tlt.setRemoved(true);
+ tlt.setTimeStamp(123456L);
+
+ assertEquals(Trigger.TRANSACTION_TRIGGER_NAME, tlt.getTriggerName());
+ assertEquals("transaction-id", tlt.getTransactionId());
+ assertEquals("block-hash", tlt.getBlockHash());
+ assertEquals(101L, tlt.getBlockNumber());
+ assertEquals(11L, tlt.getEnergyUsage());
+ assertEquals(12L, tlt.getEnergyFee());
+ assertEquals(13L, tlt.getOriginEnergyUsage());
+ assertEquals(14L, tlt.getEnergyUsageTotal());
+ assertEquals(15L, tlt.getNetUsage());
+ assertEquals(16L, tlt.getNetFee());
+ assertEquals("SUCCESS", tlt.getResult());
+ assertEquals("contract-address", tlt.getContractAddress());
+ assertEquals("TriggerSmartContract", tlt.getContractType());
+ assertEquals(17L, tlt.getFeeLimit());
+ assertEquals(18L, tlt.getContractCallValue());
+ assertEquals("contract-result", tlt.getContractResult());
+ assertEquals("from-address", tlt.getFromAddress());
+ assertEquals("to-address", tlt.getToAddress());
+ assertEquals("asset-name", tlt.getAssetName());
+ assertEquals(19L, tlt.getAssetAmount());
+ assertEquals(100L, tlt.getLatestSolidifiedBlockNumber());
+ assertSame(internalTransactions, tlt.getInternalTransactionList());
+ assertEquals("deadbeef", tlt.getData());
+ assertEquals(2, tlt.getTransactionIndex());
+ assertEquals(20L, tlt.getCumulativeEnergyUsed());
+ assertEquals(21L, tlt.getPreCumulativeLogCount());
+ assertSame(logs, tlt.getLogList());
+ assertEquals(22L, tlt.getEnergyUnitPrice());
+ assertSame(extensions, tlt.getExtMap());
+ assertTrue(tlt.isRemoved());
+ assertEquals(123456L, tlt.getTimeStamp());
}
}
diff --git a/framework/src/test/java/org/tron/common/logsfilter/FilterQueryTest.java b/framework/src/test/java/org/tron/common/logsfilter/FilterQueryTest.java
index b57b3a92fcd..a92acd1f301 100644
--- a/framework/src/test/java/org/tron/common/logsfilter/FilterQueryTest.java
+++ b/framework/src/test/java/org/tron/common/logsfilter/FilterQueryTest.java
@@ -103,10 +103,6 @@ public synchronized void testMatchFilter() {
}
TriggerCapsule triggerCapsule = new TriggerCapsule();
- try {
- triggerCapsule.processTrigger();
- } catch (Exception e) {
- assertTrue(e instanceof UnsupportedOperationException);
- }
+ assertThrows(UnsupportedOperationException.class, triggerCapsule::processTrigger);
}
}
diff --git a/framework/src/test/java/org/tron/common/logsfilter/NativeMessageQueueTest.java b/framework/src/test/java/org/tron/common/logsfilter/NativeMessageQueueTest.java
index 5219654977b..3abdf7d80f7 100644
--- a/framework/src/test/java/org/tron/common/logsfilter/NativeMessageQueueTest.java
+++ b/framework/src/test/java/org/tron/common/logsfilter/NativeMessageQueueTest.java
@@ -1,87 +1,68 @@
package org.tron.common.logsfilter;
-import java.util.concurrent.ExecutorService;
-import org.junit.After;
+import java.nio.charset.StandardCharsets;
+import java.util.concurrent.TimeUnit;
import org.junit.Assert;
import org.junit.Test;
-import org.tron.common.es.ExecutorServiceManager;
import org.tron.common.logsfilter.nativequeue.NativeMessageQueue;
+import org.tron.common.utils.PublicMethod;
import org.zeromq.SocketType;
import org.zeromq.ZContext;
import org.zeromq.ZMQ;
public class NativeMessageQueueTest {
- public int bindPort = 5555;
- public String dataToSend = "################";
- public String topic = "testTopic";
-
- private ExecutorService subscriberExecutor;
- private final String zmqSubscriber = "zmq-subscriber";
-
- @After
- public void tearDown() {
- ExecutorServiceManager.shutdownAndAwaitTermination(subscriberExecutor, zmqSubscriber);
- subscriberExecutor = null;
- }
+ private static final String DATA_TO_SEND = "################";
+ private static final String TOPIC = "testTopic";
@Test
public void invalidBindPort() {
- boolean bRet = NativeMessageQueue.getInstance().start(-1111, 0);
- Assert.assertEquals(true, bRet);
- NativeMessageQueue.getInstance().stop();
+ try {
+ Assert.assertTrue(NativeMessageQueue.getInstance().start(-1111, 0));
+ } finally {
+ NativeMessageQueue.getInstance().stop();
+ }
}
@Test
public void invalidSendLength() {
- boolean bRet = NativeMessageQueue.getInstance().start(0, -2222);
- Assert.assertEquals(true, bRet);
- NativeMessageQueue.getInstance().stop();
- }
-
- @Test
- public void publishTrigger() {
-
- int sendLength = 0;
- boolean bRet = NativeMessageQueue.getInstance().start(bindPort, sendLength);
- Assert.assertEquals(true, bRet);
-
- startSubscribeThread();
-
try {
- Thread.sleep(1000);
- } catch (InterruptedException e) {
- Thread.currentThread().interrupt();
+ Assert.assertTrue(NativeMessageQueue.getInstance().start(0, -2222));
+ } finally {
+ NativeMessageQueue.getInstance().stop();
}
-
- NativeMessageQueue.getInstance().publishTrigger(dataToSend, topic);
-
- try {
- Thread.sleep(1000);
- } catch (InterruptedException e) {
- Thread.currentThread().interrupt();
- }
-
- NativeMessageQueue.getInstance().stop();
}
- public void startSubscribeThread() {
- subscriberExecutor = ExecutorServiceManager.newSingleThreadExecutor(zmqSubscriber);
- subscriberExecutor.execute(() -> {
- try (ZContext context = new ZContext()) {
- ZMQ.Socket subscriber = context.createSocket(SocketType.SUB);
+ @Test(timeout = 10_000)
+ public void publishTriggerDeliversTopicAndData() {
+ int bindPort = PublicMethod.chooseRandomPort();
+ Assert.assertTrue(NativeMessageQueue.getInstance().start(bindPort, 0));
+ try (ZContext context = new ZContext()) {
+ try {
+ ZMQ.Socket subscriber = context.createSocket(SocketType.SUB);
Assert.assertTrue(subscriber.connect(String.format("tcp://localhost:%d", bindPort)));
- Assert.assertTrue(subscriber.subscribe(topic));
-
- while (!Thread.currentThread().isInterrupted()) {
- byte[] message = subscriber.recv();
- String triggerMsg = new String(message);
-
- Assert.assertTrue(triggerMsg.contains(dataToSend) || triggerMsg.contains(topic));
+ Assert.assertTrue(subscriber.subscribe(TOPIC));
+ subscriber.setReceiveTimeOut(250);
+
+ byte[] receivedTopic = null;
+ byte[] receivedData = null;
+ long deadline = System.nanoTime() + TimeUnit.SECONDS.toNanos(5);
+ while (receivedTopic == null && System.nanoTime() < deadline) {
+ NativeMessageQueue.getInstance().publishTrigger(DATA_TO_SEND, TOPIC);
+ receivedTopic = subscriber.recv();
+ if (receivedTopic != null) {
+ receivedData = subscriber.recv();
+ }
}
- // ZMQ.Socket will be automatically closed when ZContext is closed
+
+ Assert.assertNotNull("subscriber did not receive the published topic", receivedTopic);
+ Assert.assertNotNull("subscriber did not receive the published data", receivedData);
+ Assert.assertEquals(TOPIC, new String(receivedTopic, StandardCharsets.UTF_8));
+ Assert.assertEquals(DATA_TO_SEND, new String(receivedData, StandardCharsets.UTF_8));
+ } finally {
+ NativeMessageQueue.getInstance().stop();
}
- });
+ }
}
}
diff --git a/framework/src/test/java/org/tron/common/logsfilter/capsule/ContractLogTriggerCapsuleTest.java b/framework/src/test/java/org/tron/common/logsfilter/capsule/ContractLogTriggerCapsuleTest.java
index 3d45eb026ea..d450e86acba 100644
--- a/framework/src/test/java/org/tron/common/logsfilter/capsule/ContractLogTriggerCapsuleTest.java
+++ b/framework/src/test/java/org/tron/common/logsfilter/capsule/ContractLogTriggerCapsuleTest.java
@@ -1,12 +1,14 @@
package org.tron.common.logsfilter.capsule;
import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertTrue;
import static org.tron.common.logsfilter.trigger.Trigger.CONTRACTLOG_TRIGGER_NAME;
+import java.lang.reflect.Field;
import lombok.extern.slf4j.Slf4j;
import org.junit.Before;
import org.junit.Test;
+import org.mockito.Mockito;
+import org.tron.common.logsfilter.EventPluginLoader;
import org.tron.common.logsfilter.trigger.ContractLogTrigger;
@Slf4j
@@ -23,13 +25,20 @@ public void setUp() {
}
@Test
- public void testSetAndGetContractLogTrigger() {
+ public void testSetAndGetContractLogTrigger() throws Exception {
capsule.setContractLogTrigger(capsule.getContractLogTrigger());
assertEquals(CONTRACTLOG_TRIGGER_NAME, capsule.getContractLogTrigger().getTriggerName());
+
+ EventPluginLoader loader = Mockito.mock(EventPluginLoader.class);
+ Field instanceField = EventPluginLoader.class.getDeclaredField("instance");
+ instanceField.setAccessible(true);
+ EventPluginLoader originalInstance = (EventPluginLoader) instanceField.get(null);
+ instanceField.set(null, loader);
try {
capsule.processTrigger();
- } catch (Exception e) {
- assertTrue(e instanceof NullPointerException);
+ Mockito.verify(loader).postContractLogTrigger(capsule.getContractLogTrigger());
+ } finally {
+ instanceField.set(null, originalInstance);
}
}
diff --git a/framework/src/test/java/org/tron/common/logsfilter/capsule/ContractTriggerCapsuleTest.java b/framework/src/test/java/org/tron/common/logsfilter/capsule/ContractTriggerCapsuleTest.java
index 14b86510fea..ec60304f573 100644
--- a/framework/src/test/java/org/tron/common/logsfilter/capsule/ContractTriggerCapsuleTest.java
+++ b/framework/src/test/java/org/tron/common/logsfilter/capsule/ContractTriggerCapsuleTest.java
@@ -1,18 +1,16 @@
package org.tron.common.logsfilter.capsule;
import static com.google.common.collect.Lists.newArrayList;
+import static org.junit.Assert.assertArrayEquals;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertTrue;
+import static org.mockito.ArgumentMatchers.any;
import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.when;
-import com.beust.jcommander.internal.Lists;
import java.lang.reflect.Field;
import java.util.ArrayList;
-import java.util.Arrays;
-import lombok.extern.slf4j.Slf4j;
-import org.apache.commons.collections4.CollectionUtils;
-import org.apache.commons.lang3.ArrayUtils;
import org.junit.Before;
import org.junit.Test;
import org.tron.common.logsfilter.EventPluginLoader;
@@ -22,7 +20,6 @@
import org.tron.common.runtime.vm.LogInfo;
import org.tron.core.config.args.Args;
-@Slf4j
public class ContractTriggerCapsuleTest {
private ContractTriggerCapsule capsule;
@@ -50,17 +47,25 @@ private byte[] bytesToAddress(byte[] address) {
}
@Test
- public void testSetAndGetContractTrigger() {
+ public void testSetAndGetContractTrigger() throws Exception {
capsule.setContractTrigger(capsule.getContractTrigger());
capsule.setBlockHash("e58f33f9baf9305dc6f82b9f1934ea8f0ade2defb951258d50167028c780351f");
capsule.setLatestSolidifiedBlockNumber(0);
assertEquals(0, capsule.getContractTrigger().getLatestSolidifiedBlockNumber());
assertEquals("e58f33f9baf9305dc6f82b9f1934ea8f0ade2defb951258d50167028c780351f",
capsule.getContractTrigger().getBlockHash());
+
+ EventPluginLoader mockLoader = mock(EventPluginLoader.class);
+ when(mockLoader.isContractLogTriggerEnable()).thenReturn(true);
+ Field instanceField = EventPluginLoader.class.getDeclaredField("instance");
+ instanceField.setAccessible(true);
+ EventPluginLoader originalInstance = (EventPluginLoader) instanceField.get(null);
+ instanceField.set(null, mockLoader);
try {
capsule.processTrigger();
- } catch (Exception e) {
- assertTrue(e instanceof NullPointerException);
+ verify(mockLoader).postContractLogTrigger(any(ContractLogTrigger.class));
+ } finally {
+ instanceField.set(null, originalInstance);
}
}
@@ -105,11 +110,16 @@ public void testRemovedTriggerNotWrittenToSolidityMap() throws Exception {
@Test
public void testLogInfo() {
- logger.info("log info to string: {}, ", logInfo.toString());
- logger.info("log clone data: {}, ", logInfo.getClonedData());
- CollectionUtils.isNotEmpty(logInfo.getClonedTopics());
- CollectionUtils.isNotEmpty(logInfo.getHexTopics());
- new LogInfo(null, null, null);
+ assertArrayEquals(new byte[0], logInfo.getClonedData());
+ assertEquals(1, logInfo.getClonedTopics().size());
+ assertArrayEquals(new byte[32], logInfo.getClonedTopics().get(0));
+ assertEquals(1, logInfo.getHexTopics().size());
+ assertTrue(logInfo.toString().contains("address=0000000000000000000000000000000000000011"));
+
+ LogInfo empty = new LogInfo(null, null, null);
+ assertArrayEquals(new byte[0], empty.getAddress());
+ assertArrayEquals(new byte[0], empty.getData());
+ assertTrue(empty.getTopics().isEmpty());
}
}
diff --git a/framework/src/test/java/org/tron/common/logsfilter/capsule/LogsFilterCapsuleTest.java b/framework/src/test/java/org/tron/common/logsfilter/capsule/LogsFilterCapsuleTest.java
index f23c446c23d..09c17d8a66b 100644
--- a/framework/src/test/java/org/tron/common/logsfilter/capsule/LogsFilterCapsuleTest.java
+++ b/framework/src/test/java/org/tron/common/logsfilter/capsule/LogsFilterCapsuleTest.java
@@ -1,11 +1,17 @@
package org.tron.common.logsfilter.capsule;
-import static org.junit.Assert.assertNotNull;
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertSame;
+import static org.junit.Assert.assertTrue;
import java.util.ArrayList;
+import java.util.Collections;
+import java.util.List;
import org.junit.Before;
import org.junit.Test;
import org.tron.common.bloom.Bloom;
+import org.tron.protos.Protocol.TransactionInfo;
public class LogsFilterCapsuleTest {
@@ -20,13 +26,23 @@ public void setUp() {
@Test
public void testSetAndGetLogsFilterCapsule() {
- capsule.setBlockNumber(capsule.getBlockNumber());
- capsule.setBlockHash(capsule.getBlockHash());
- capsule.setSolidified(capsule.isSolidified());
- capsule.setBloom(capsule.getBloom());
- capsule.setRemoved(capsule.isRemoved());
- capsule.setTxInfoList(capsule.getTxInfoList());
- assertNotNull(capsule.toString());
+ Bloom bloom = new Bloom();
+ List transactions =
+ Collections.singletonList(TransactionInfo.getDefaultInstance());
+
+ capsule.setBlockNumber(42L);
+ capsule.setBlockHash("updated-block-hash");
+ capsule.setSolidified(false);
+ capsule.setBloom(bloom);
+ capsule.setRemoved(true);
+ capsule.setTxInfoList(transactions);
+
+ assertEquals(42L, capsule.getBlockNumber());
+ assertEquals("updated-block-hash", capsule.getBlockHash());
+ assertFalse(capsule.isSolidified());
+ assertSame(bloom, capsule.getBloom());
+ assertTrue(capsule.isRemoved());
+ assertSame(transactions, capsule.getTxInfoList());
}
}
diff --git a/framework/src/test/java/org/tron/common/logsfilter/capsule/SolidityEventCapsuleTest.java b/framework/src/test/java/org/tron/common/logsfilter/capsule/SolidityEventCapsuleTest.java
index 9259ca3ea97..2ee847dbe50 100644
--- a/framework/src/test/java/org/tron/common/logsfilter/capsule/SolidityEventCapsuleTest.java
+++ b/framework/src/test/java/org/tron/common/logsfilter/capsule/SolidityEventCapsuleTest.java
@@ -1,11 +1,11 @@
package org.tron.common.logsfilter.capsule;
-import static org.junit.Assert.assertTrue;
-
+import java.lang.reflect.Field;
import lombok.extern.slf4j.Slf4j;
-import org.junit.Assert;
import org.junit.Before;
import org.junit.Test;
+import org.mockito.Mockito;
+import org.tron.common.logsfilter.EventPluginLoader;
import org.tron.common.logsfilter.trigger.ContractEventTrigger;
@Slf4j
@@ -20,12 +20,19 @@ public void setUp() {
}
@Test
- public void testSetAndGetSolidityEventCapsule() {
+ public void testSetAndGetSolidityEventCapsule() throws Exception {
capsule.setSolidityEventTrigger(capsule.getSolidityEventTrigger());
+
+ EventPluginLoader loader = Mockito.mock(EventPluginLoader.class);
+ Field instanceField = EventPluginLoader.class.getDeclaredField("instance");
+ instanceField.setAccessible(true);
+ EventPluginLoader originalInstance = (EventPluginLoader) instanceField.get(null);
+ instanceField.set(null, loader);
try {
capsule.processTrigger();
- } catch (Exception e) {
- assertTrue(e instanceof NullPointerException);
+ Mockito.verify(loader).postSolidityEventTrigger(capsule.getSolidityEventTrigger());
+ } finally {
+ instanceField.set(null, originalInstance);
}
}
diff --git a/framework/src/test/java/org/tron/common/logsfilter/capsule/SolidityLogCapsuleTest.java b/framework/src/test/java/org/tron/common/logsfilter/capsule/SolidityLogCapsuleTest.java
index 4e663930530..ca53187057f 100644
--- a/framework/src/test/java/org/tron/common/logsfilter/capsule/SolidityLogCapsuleTest.java
+++ b/framework/src/test/java/org/tron/common/logsfilter/capsule/SolidityLogCapsuleTest.java
@@ -1,10 +1,11 @@
package org.tron.common.logsfilter.capsule;
-import static org.junit.Assert.assertTrue;
-
+import java.lang.reflect.Field;
import lombok.extern.slf4j.Slf4j;
import org.junit.Before;
import org.junit.Test;
+import org.mockito.Mockito;
+import org.tron.common.logsfilter.EventPluginLoader;
import org.tron.common.logsfilter.trigger.ContractLogTrigger;
@Slf4j
@@ -19,12 +20,19 @@ public void setUp() {
}
@Test
- public void testSetAndGetSolidityLogCapsule() {
+ public void testSetAndGetSolidityLogCapsule() throws Exception {
capsule.setSolidityLogTrigger(capsule.getSolidityLogTrigger());
+
+ EventPluginLoader loader = Mockito.mock(EventPluginLoader.class);
+ Field instanceField = EventPluginLoader.class.getDeclaredField("instance");
+ instanceField.setAccessible(true);
+ EventPluginLoader originalInstance = (EventPluginLoader) instanceField.get(null);
+ instanceField.set(null, loader);
try {
capsule.processTrigger();
- } catch (Exception e) {
- assertTrue(e instanceof NullPointerException);
+ Mockito.verify(loader).postSolidityLogTrigger(capsule.getSolidityLogTrigger());
+ } finally {
+ instanceField.set(null, originalInstance);
}
}
diff --git a/framework/src/test/java/org/tron/common/logsfilter/capsule/SolidityTriggerCapsuleTest.java b/framework/src/test/java/org/tron/common/logsfilter/capsule/SolidityTriggerCapsuleTest.java
index 849803c1f04..c11c4820abc 100644
--- a/framework/src/test/java/org/tron/common/logsfilter/capsule/SolidityTriggerCapsuleTest.java
+++ b/framework/src/test/java/org/tron/common/logsfilter/capsule/SolidityTriggerCapsuleTest.java
@@ -1,12 +1,13 @@
package org.tron.common.logsfilter.capsule;
import static org.junit.Assert.assertNotNull;
-import static org.junit.Assert.assertTrue;
+import java.lang.reflect.Field;
import lombok.extern.slf4j.Slf4j;
-import org.junit.Assert;
import org.junit.Before;
import org.junit.Test;
+import org.mockito.Mockito;
+import org.tron.common.logsfilter.EventPluginLoader;
import org.tron.common.logsfilter.trigger.SolidityTrigger;
@Slf4j
@@ -24,13 +25,20 @@ public void setUp() {
}
@Test
- public void testSetAndGetSolidityLogCapsule() {
+ public void testSetAndGetSolidityLogCapsule() throws Exception {
capsule.setSolidityTrigger(capsule.getSolidityTrigger());
capsule.setTimeStamp(capsule.getSolidityTrigger().getTimeStamp());
+
+ EventPluginLoader loader = Mockito.mock(EventPluginLoader.class);
+ Field instanceField = EventPluginLoader.class.getDeclaredField("instance");
+ instanceField.setAccessible(true);
+ EventPluginLoader originalInstance = (EventPluginLoader) instanceField.get(null);
+ instanceField.set(null, loader);
try {
capsule.processTrigger();
- } catch (Exception e) {
- assertTrue(e instanceof NullPointerException);
+ Mockito.verify(loader).postSolidityTrigger(capsule.getSolidityTrigger());
+ } finally {
+ instanceField.set(null, originalInstance);
}
}
diff --git a/framework/src/test/java/org/tron/common/utils/ByteArrayTest.java b/framework/src/test/java/org/tron/common/utils/ByteArrayTest.java
index c0db8c4b418..81dde9a6449 100644
--- a/framework/src/test/java/org/tron/common/utils/ByteArrayTest.java
+++ b/framework/src/test/java/org/tron/common/utils/ByteArrayTest.java
@@ -41,8 +41,7 @@ public void testToHexString() {
public void long2Bytes() {
long a = 0x123456;
byte[] bb = ByteArray.fromLong(a);
- System.out.println(bb[6]);
- System.out.println(bb[7]);
+ assertArrayEquals(new byte[] {0, 0, 0, 0, 0, 0x12, 0x34, 0x56}, bb);
}
@Test
diff --git a/framework/src/test/java/org/tron/common/utils/JsonUtilTest.java b/framework/src/test/java/org/tron/common/utils/JsonUtilTest.java
index 8681ff58270..51eb31ff50e 100644
--- a/framework/src/test/java/org/tron/common/utils/JsonUtilTest.java
+++ b/framework/src/test/java/org/tron/common/utils/JsonUtilTest.java
@@ -1,6 +1,7 @@
package org.tron.common.utils;
import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertNotNull;
import static org.junit.Assert.assertNull;
import static org.junit.Assert.assertTrue;
import static org.junit.Assert.fail;
@@ -35,7 +36,7 @@ public void test() {
A a2 = JsonUtil.json2Obj(jsonString, A.class);
- assert a2 != null;
+ assertNotNull(a2);
assertEquals("abc", a2.getKey());
assertEquals(100, a2.getValue());
assertNull(obj2Json(null));
diff --git a/framework/src/test/java/org/tron/common/utils/RandomGeneratorTest.java b/framework/src/test/java/org/tron/common/utils/RandomGeneratorTest.java
index 4de441d940d..c6efb400013 100644
--- a/framework/src/test/java/org/tron/common/utils/RandomGeneratorTest.java
+++ b/framework/src/test/java/org/tron/common/utils/RandomGeneratorTest.java
@@ -3,19 +3,11 @@
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertTrue;
-import com.beust.jcommander.internal.Lists;
-import com.google.protobuf.ByteString;
import java.util.Arrays;
import java.util.List;
-import java.util.stream.Collectors;
-import lombok.extern.slf4j.Slf4j;
-import org.joda.time.DateTime;
import org.junit.Before;
-import org.junit.Ignore;
import org.junit.Test;
-import org.tron.core.capsule.WitnessCapsule;
-@Slf4j
public class RandomGeneratorTest {
private RandomGenerator randomGenerator;
@@ -35,37 +27,4 @@ public void testShufflePreservesElements() {
assertTrue(shuffledList.contains(num));
}
}
-
- @Ignore
- @Test
- public void shuffle() {
- final List witnessCapsuleListBefore = this.getWitnessList();
- logger.info("updateWitnessSchedule,before: " + getWitnessStringList(witnessCapsuleListBefore));
- final List witnessCapsuleListAfter = new RandomGenerator()
- .shuffle(witnessCapsuleListBefore, DateTime.now().getMillis());
- logger.info("updateWitnessSchedule,after: " + getWitnessStringList(witnessCapsuleListAfter));
- }
-
- private List getWitnessList() {
- final List witnessCapsuleList = Lists.newArrayList();
- final WitnessCapsule witnessTron = new WitnessCapsule(
- ByteString.copyFrom("00000000001".getBytes()), 0, "");
- final WitnessCapsule witnessOlivier = new WitnessCapsule(
- ByteString.copyFrom("00000000003".getBytes()), 100, "");
- final WitnessCapsule witnessVivider = new WitnessCapsule(
- ByteString.copyFrom("00000000005".getBytes()), 200, "");
- final WitnessCapsule witnessSenaLiu = new WitnessCapsule(
- ByteString.copyFrom("00000000006".getBytes()), 300, "");
- witnessCapsuleList.add(witnessTron);
- witnessCapsuleList.add(witnessOlivier);
- witnessCapsuleList.add(witnessVivider);
- witnessCapsuleList.add(witnessSenaLiu);
- return witnessCapsuleList;
- }
-
- private List getWitnessStringList(List witnessStates) {
- return witnessStates.stream()
- .map(witnessCapsule -> ByteArray.toHexString(witnessCapsule.getAddress().toByteArray()))
- .collect(Collectors.toList());
- }
-}
\ No newline at end of file
+}
diff --git a/framework/src/test/java/org/tron/common/utils/Sha256HashTest.java b/framework/src/test/java/org/tron/common/utils/Sha256HashTest.java
index 0df72cc125d..750c5d5f411 100644
--- a/framework/src/test/java/org/tron/common/utils/Sha256HashTest.java
+++ b/framework/src/test/java/org/tron/common/utils/Sha256HashTest.java
@@ -78,10 +78,11 @@ public void testMultiThreadingHash() {
try {
thread.join();
} catch (InterruptedException e) {
- e.printStackTrace();
+ Thread.currentThread().interrupt();
+ throw new AssertionError("Interrupted while waiting for hash worker", e);
}
});
assertEquals(70000, countAll.get());
assertEquals(0, countFailed.get());
}
-}
\ No newline at end of file
+}
diff --git a/framework/src/test/java/org/tron/common/utils/client/utils/ShieldAddressInfo.java b/framework/src/test/java/org/tron/common/utils/client/utils/ShieldAddressInfo.java
index 5d0de50c0b8..32d907e6d3f 100644
--- a/framework/src/test/java/org/tron/common/utils/client/utils/ShieldAddressInfo.java
+++ b/framework/src/test/java/org/tron/common/utils/client/utils/ShieldAddressInfo.java
@@ -84,26 +84,6 @@ public String getAddress() {
return getShieldAddress(d, pkD);
}
- // public static PaymentAddress parseFromShieldAddress(final String shieldAddress) {
- // PaymentAddress paymentAddress = null;
- // try {
- // byte[] byteShield = ByteArray.fromHexString(shieldAddress);
- // int lenPkd = byteShield.length - Constant.ZC_DIVERSIFIER_SIZE;
- // byte[] d = new byte[Constant.ZC_DIVERSIFIER_SIZE];
- // byte[] pkd = new byte[lenPkd];
- //
- // System.arraycopy(byteShield, 0, d, 0, Constant.ZC_DIVERSIFIER_SIZE);
- // System.arraycopy(byteShield, Constant.ZC_DIVERSIFIER_SIZE, pkd, 0, lenPkd);
- //
- // paymentAddress = new PaymentAddress(new DiversifierT(d), pkd);
- // } catch (Exception e) {
- // System.out.println("parseFromShieldAddress " + shieldAddress + " failure.");
- // e.printStackTrace();
- // }
- //
- // return paymentAddress;
- // }
-
/**
* format shield address info to a string.
*/
diff --git a/framework/src/test/java/org/tron/common/utils/client/utils/TransactionUtils.java b/framework/src/test/java/org/tron/common/utils/client/utils/TransactionUtils.java
index 63ffe1b58ff..e9dc1ad5555 100644
--- a/framework/src/test/java/org/tron/common/utils/client/utils/TransactionUtils.java
+++ b/framework/src/test/java/org/tron/common/utils/client/utils/TransactionUtils.java
@@ -43,11 +43,7 @@
public class TransactionUtils {
- public static final int NORMALTRANSACTION = 0;
- public static final int UNEXECUTEDDEFERREDTRANSACTION = 1;
- public static final int EXECUTINGDEFERREDTRANSACTION = 2;
private static final Logger logger = LoggerFactory.getLogger("Transaction");
- private static final int RESERVE_BALANCE = 10;
/**
* constructor.
@@ -112,7 +108,7 @@ public static byte[] getOwner(Transaction.Contract contract) {
}
return owner.toByteArray();
} catch (Exception ex) {
- ex.printStackTrace();
+ logger.warn("Failed to extract transaction owner", ex);
return null;
}
}
@@ -130,8 +126,10 @@ public static byte[] getOwner(Transaction.Contract contract) {
*/
public static boolean validTransaction(Transaction signedTransaction) {
- assert (signedTransaction.getSignatureCount()
- == signedTransaction.getRawData().getContractCount());
+ if (signedTransaction == null || signedTransaction.getSignatureCount()
+ != signedTransaction.getRawData().getContractCount()) {
+ return false;
+ }
List listContract = signedTransaction.getRawData().getContractList();
byte[] hash = Sha256Hash.hash(CommonParameter
.getInstance().isECKeyCryptoEngine(), signedTransaction.getRawData().toByteArray());
@@ -149,7 +147,7 @@ public static boolean validTransaction(Transaction signedTransaction) {
return false;
}
} catch (SignatureException e) {
- e.printStackTrace();
+ logger.warn("Failed to recover transaction signer", e);
return false;
}
}
@@ -215,31 +213,4 @@ public static Transaction setTimestamp(Transaction transaction) {
return builder.build();
}
- /**
- * constructor.
- */
- /* public static Transaction setDelaySeconds(Transaction transaction, long delaySeconds) {
- DeferredStage deferredStage = transaction.getRawData().toBuilder()
- .getDeferredStage().toBuilder().setDelaySeconds(delaySeconds)
- .setStage(UNEXECUTEDDEFERREDTRANSACTION).build();
- Transaction.raw rawData = transaction.toBuilder().getRawData()
- .toBuilder().setDeferredStage(deferredStage).build();
- return transaction.toBuilder().setRawData(rawData).build();
- }*/
-
- /* *//**
- * constructor.
- *//*
- public static GrpcAPI.TransactionExtention setDelaySecondsToExtension(GrpcAPI
- .TransactionExtention transactionExtention, long delaySeconds) {
- if (delaySeconds == 0) {
- return transactionExtention;
- }
- GrpcAPI.TransactionExtention.Builder builder = transactionExtention.toBuilder();
-
- Transaction transaction = setDelaySeconds(transactionExtention.getTransaction(), delaySeconds);
- builder.setTransaction(transaction);
-
- return builder.build();
- }*/
}
diff --git a/framework/src/test/java/org/tron/core/ShieldedTRC20BuilderTest.java b/framework/src/test/java/org/tron/core/ShieldedTRC20BuilderTest.java
index 00be867fd59..e3c3e2bc84c 100644
--- a/framework/src/test/java/org/tron/core/ShieldedTRC20BuilderTest.java
+++ b/framework/src/test/java/org/tron/core/ShieldedTRC20BuilderTest.java
@@ -2256,9 +2256,7 @@ public void testScanShieldedTRC20NotesByIvk() throws Exception {
GrpcAPI.DecryptNotesTRC20 scannedNotes = wallet.scanShieldedTRC20NotesByIvk(
statNum, endNum, SHIELDED_CONTRACT_ADDRESS, ivk, fvk.getAk(), fvk.getNk());
- for (GrpcAPI.DecryptNotesTRC20.NoteTx noteTx : scannedNotes.getNoteTxsList()) {
- logger.info(noteTx.toString());
- }
+ Assert.assertEquals(0, scannedNotes.getNoteTxsCount());
}
@Test
@@ -2271,13 +2269,11 @@ public void testscanShieldedTRC20NotesByOvk() throws Exception {
GrpcAPI.DecryptNotesTRC20 scannedNotes = wallet.scanShieldedTRC20NotesByOvk(
statNum, endNum, fvk.getOvk(), SHIELDED_CONTRACT_ADDRESS);
- for (GrpcAPI.DecryptNotesTRC20.NoteTx noteTx : scannedNotes.getNoteTxsList()) {
- logger.info(noteTx.toString());
- }
+ Assert.assertEquals(0, scannedNotes.getNoteTxsCount());
}
- @Test(expected = ZksnarkException.class)
- public void isShieldedTRC20ContractNoteSpent() throws Exception {
+ @Test
+ public void isShieldedTRC20ContractNoteSpentRejectsMissingNote() throws Exception {
int statNum = 9200;
int endNum = 9240;
SpendingKey sk = SpendingKey.decode(priKey);
@@ -2286,24 +2282,18 @@ public void isShieldedTRC20ContractNoteSpent() throws Exception {
GrpcAPI.DecryptNotesTRC20 scannedNotes = wallet.scanShieldedTRC20NotesByIvk(
statNum, endNum, SHIELDED_CONTRACT_ADDRESS, ivk, fvk.getAk(), fvk.getNk());
-
- for (GrpcAPI.DecryptNotesTRC20.NoteTx noteTx : scannedNotes.getNoteTxsList()) {
- logger.info(noteTx.toString());
- }
-
- GrpcAPI.NfTRC20Parameters.Builder NfBuilfer;
- NfBuilfer = GrpcAPI.NfTRC20Parameters.newBuilder();
- NfBuilfer.setAk(ByteString.copyFrom(fvk.getAk()));
- NfBuilfer.setNk(ByteString.copyFrom(fvk.getNk()));
- NfBuilfer.setPosition(271);
- NfBuilfer.setShieldedTRC20ContractAddress(ByteString.copyFrom(SHIELDED_CONTRACT_ADDRESS));
- if (scannedNotes.getNoteTxsList().size() > 0) {
- NfBuilfer.setNote(scannedNotes.getNoteTxs(0).getNote());
- }
-
- GrpcAPI.NullifierResult result = wallet
- .isShieldedTRC20ContractNoteSpent(NfBuilfer.build());
- Assert.assertTrue(result.getIsSpent());
+ Assert.assertEquals(0, scannedNotes.getNoteTxsCount());
+
+ GrpcAPI.NfTRC20Parameters request = GrpcAPI.NfTRC20Parameters.newBuilder()
+ .setAk(ByteString.copyFrom(fvk.getAk()))
+ .setNk(ByteString.copyFrom(fvk.getNk()))
+ .setPosition(271)
+ .setShieldedTRC20ContractAddress(ByteString.copyFrom(SHIELDED_CONTRACT_ADDRESS))
+ .build();
+
+ ZksnarkException exception = Assert.assertThrows(ZksnarkException.class,
+ () -> wallet.isShieldedTRC20ContractNoteSpent(request));
+ Assert.assertEquals("paymentAddress format is wrong", exception.getMessage());
}
diff --git a/framework/src/test/java/org/tron/core/event/EventServiceTest.java b/framework/src/test/java/org/tron/core/event/EventServiceTest.java
index ff7aafb1d1a..18158b905cd 100644
--- a/framework/src/test/java/org/tron/core/event/EventServiceTest.java
+++ b/framework/src/test/java/org/tron/core/event/EventServiceTest.java
@@ -6,9 +6,7 @@
import org.mockito.Mockito;
import org.tron.common.logsfilter.EventPluginLoader;
import org.tron.common.utils.ReflectUtils;
-import org.tron.core.capsule.BlockCapsule;
import org.tron.core.db.Manager;
-import org.tron.core.services.event.BlockEventCache;
import org.tron.core.services.event.BlockEventLoad;
import org.tron.core.services.event.EventService;
import org.tron.core.services.event.HistoryEventService;
@@ -18,31 +16,32 @@
public class EventServiceTest {
@Test
- public void test() {
- BlockCapsule.BlockId b1 = new BlockCapsule.BlockId(BlockEventCacheTest.getBlockId(), 1);
- BlockEventCache.init(b1);
-
+ public void initAndCloseDelegateToEventServicesWhenPluginV1IsLoaded() {
EventService eventService = new EventService();
- HistoryEventService historyEventService = new HistoryEventService();
- RealtimeEventService realtimeEventService = new RealtimeEventService();
- SolidEventService solidEventService = new SolidEventService();
- BlockEventLoad blockEventLoad = new BlockEventLoad();
+ HistoryEventService historyEventService = mock(HistoryEventService.class);
+ RealtimeEventService realtimeEventService = mock(RealtimeEventService.class);
+ SolidEventService solidEventService = mock(SolidEventService.class);
+ BlockEventLoad blockEventLoad = mock(BlockEventLoad.class);
+ Manager manager = mock(Manager.class);
+ EventPluginLoader instance = mock(EventPluginLoader.class);
ReflectUtils.setFieldValue(eventService, "historyEventService", historyEventService);
ReflectUtils.setFieldValue(eventService, "solidEventService", solidEventService);
ReflectUtils.setFieldValue(eventService, "realtimeEventService", realtimeEventService);
ReflectUtils.setFieldValue(eventService, "blockEventLoad", blockEventLoad);
-
- Manager manager = mock(Manager.class);
ReflectUtils.setFieldValue(eventService, "manager", manager);
+ ReflectUtils.setFieldValue(eventService, "instance", instance);
+
Mockito.when(manager.isEventPluginLoaded()).thenReturn(true);
+ Mockito.when(instance.getVersion()).thenReturn(1);
eventService.init();
eventService.close();
- EventPluginLoader instance = mock(EventPluginLoader.class);
- Mockito.when(instance.getVersion()).thenReturn(1);
- ReflectUtils.setFieldValue(eventService, "instance", instance);
- eventService.close();
+ Mockito.verify(historyEventService).init();
+ Mockito.verify(historyEventService).close();
+ Mockito.verify(blockEventLoad).close();
+ Mockito.verify(realtimeEventService).close();
+ Mockito.verify(solidEventService).close();
}
}
diff --git a/framework/src/test/java/org/tron/core/event/HistoryEventServiceTest.java b/framework/src/test/java/org/tron/core/event/HistoryEventServiceTest.java
index 1485d726235..2b6b4b14984 100644
--- a/framework/src/test/java/org/tron/core/event/HistoryEventServiceTest.java
+++ b/framework/src/test/java/org/tron/core/event/HistoryEventServiceTest.java
@@ -1,13 +1,13 @@
package org.tron.core.event;
import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.verify;
+import static org.mockito.Mockito.when;
import java.lang.reflect.Method;
import org.junit.Test;
-import org.mockito.Mockito;
import org.tron.common.logsfilter.EventPluginLoader;
import org.tron.common.utils.ReflectUtils;
-import org.tron.common.utils.Sha256Hash;
import org.tron.core.ChainBaseManager;
import org.tron.core.capsule.BlockCapsule;
import org.tron.core.db.Manager;
@@ -21,77 +21,66 @@
public class HistoryEventServiceTest {
- HistoryEventService historyEventService = new HistoryEventService();
+ @Test
+ public void initAtHeadInitializesAllEventServices() {
+ Fixture fixture = new Fixture();
+ BlockCapsule.BlockId headId = mock(BlockCapsule.BlockId.class);
+ when(fixture.instance.getStartSyncBlockNum()).thenReturn(0L);
+ when(fixture.chainBaseManager.getHeadBlockId()).thenReturn(headId);
- @Test(timeout = 60_000)
- public void test() throws Exception {
- EventPluginLoader instance = mock(EventPluginLoader.class);
- Mockito.when(instance.isUseNativeQueue()).thenReturn(true);
- Mockito.when(instance.isUseNativeQueue()).thenReturn(false);
+ fixture.service.init();
- ReflectUtils.setFieldValue(historyEventService, "instance", instance);
-
- DynamicPropertiesStore dynamicPropertiesStore = mock(DynamicPropertiesStore.class);
- ChainBaseManager chainBaseManager = mock(ChainBaseManager.class);
- Manager manager = mock(Manager.class);
- ReflectUtils.setFieldValue(historyEventService, "manager", manager);
- Mockito.when(manager.getChainBaseManager()).thenReturn(chainBaseManager);
- Mockito.when(manager.getDynamicPropertiesStore()).thenReturn(dynamicPropertiesStore);
- Mockito.when(chainBaseManager.getHeadBlockId()).thenReturn(new BlockCapsule.BlockId());
-
- SolidEventService solidEventService = new SolidEventService();
- RealtimeEventService realtimeEventService = new RealtimeEventService();
- BlockEventLoad blockEventLoad = new BlockEventLoad();
- ReflectUtils.setFieldValue(blockEventLoad, "instance", instance);
- ReflectUtils.setFieldValue(blockEventLoad, "manager", manager);
-
- ReflectUtils.setFieldValue(historyEventService, "solidEventService", solidEventService);
- ReflectUtils.setFieldValue(historyEventService, "realtimeEventService", realtimeEventService);
- ReflectUtils.setFieldValue(historyEventService, "blockEventLoad", blockEventLoad);
- historyEventService.init();
- historyEventService.close();
- solidEventService.close();
- realtimeEventService.close();
- blockEventLoad.close();
-
- solidEventService = mock(SolidEventService.class);
- ReflectUtils.setFieldValue(historyEventService, "solidEventService", solidEventService);
- realtimeEventService = mock(RealtimeEventService.class);
- ReflectUtils.setFieldValue(historyEventService, "realtimeEventService", realtimeEventService);
- blockEventLoad = mock(BlockEventLoad.class);
- ReflectUtils.setFieldValue(historyEventService, "blockEventLoad", blockEventLoad);
-
- Mockito.when(instance.getStartSyncBlockNum()).thenReturn(0L);
-
- Mockito.when(dynamicPropertiesStore.getLatestSolidifiedBlockNum()).thenReturn(0L);
- Mockito.when(chainBaseManager.getBlockIdByNum(0L))
- .thenReturn(new BlockCapsule.BlockId(Sha256Hash.ZERO_HASH, 0));
- historyEventService.init();
-
- BlockEvent be2 = new BlockEvent();
- BlockCapsule.BlockId b2 = new BlockCapsule.BlockId(BlockEventCacheTest.getBlockId(), 2);
- be2.setBlockId(b2);
-
- BlockEventGet blockEventGet = mock(BlockEventGet.class);
- ReflectUtils.setFieldValue(historyEventService, "blockEventGet", blockEventGet);
- Mockito.when(blockEventGet.getBlockEvent(1)).thenReturn(be2);
-
- Mockito.when(instance.getStartSyncBlockNum()).thenReturn(1L);
- Mockito.when(dynamicPropertiesStore.getLatestSolidifiedBlockNum()).thenReturn(1L);
-
- Mockito.when(chainBaseManager.getBlockIdByNum(1L))
- .thenReturn(new BlockCapsule.BlockId(Sha256Hash.ZERO_HASH, 1));
-
- Mockito.when(instance.isUseNativeQueue()).thenReturn(true);
+ verify(fixture.realtimeEventService).init();
+ verify(fixture.blockEventLoad).init();
+ verify(fixture.solidEventService).init();
+ }
- Method method1 = historyEventService.getClass().getDeclaredMethod("syncEvent");
- method1.setAccessible(true);
- method1.invoke(historyEventService);
+ @Test
+ public void syncEventFlushesEachHistoricalBlockThenInitializesAtSolidHead() throws Exception {
+ Fixture fixture = new Fixture();
+ BlockEvent blockEvent = mock(BlockEvent.class);
+ BlockCapsule.BlockId solidHeadId = mock(BlockCapsule.BlockId.class);
+ when(fixture.instance.getStartSyncBlockNum()).thenReturn(1L);
+ when(fixture.dynamicPropertiesStore.getLatestSolidifiedBlockNum()).thenReturn(2L);
+ when(fixture.instance.isUseNativeQueue()).thenReturn(false);
+ when(fixture.instance.isBusy()).thenReturn(false);
+ when(fixture.blockEventGet.getBlockEvent(1L)).thenReturn(blockEvent);
+ when(fixture.chainBaseManager.getBlockIdByNum(1L)).thenReturn(solidHeadId);
+ ReflectUtils.setFieldValue(fixture.service, "thread", Thread.currentThread());
+
+ Method syncEvent = HistoryEventService.class.getDeclaredMethod("syncEvent");
+ syncEvent.setAccessible(true);
+ syncEvent.invoke(fixture.service);
+
+ verify(fixture.realtimeEventService).flush(blockEvent, false);
+ verify(fixture.solidEventService).flush(blockEvent);
+ verify(fixture.realtimeEventService).init();
+ verify(fixture.blockEventLoad).init();
+ verify(fixture.solidEventService).init();
+ }
- Mockito.when(instance.isUseNativeQueue()).thenReturn(false);
- Mockito.when(instance.isBusy()).thenReturn(true);
- historyEventService.init();
- Thread.sleep(1000);
- historyEventService.close();
+ private static class Fixture {
+
+ private final HistoryEventService service = new HistoryEventService();
+ private final EventPluginLoader instance = mock(EventPluginLoader.class);
+ private final DynamicPropertiesStore dynamicPropertiesStore =
+ mock(DynamicPropertiesStore.class);
+ private final ChainBaseManager chainBaseManager = mock(ChainBaseManager.class);
+ private final Manager manager = mock(Manager.class);
+ private final SolidEventService solidEventService = mock(SolidEventService.class);
+ private final RealtimeEventService realtimeEventService = mock(RealtimeEventService.class);
+ private final BlockEventLoad blockEventLoad = mock(BlockEventLoad.class);
+ private final BlockEventGet blockEventGet = mock(BlockEventGet.class);
+
+ private Fixture() {
+ when(manager.getChainBaseManager()).thenReturn(chainBaseManager);
+ when(manager.getDynamicPropertiesStore()).thenReturn(dynamicPropertiesStore);
+ ReflectUtils.setFieldValue(service, "instance", instance);
+ ReflectUtils.setFieldValue(service, "manager", manager);
+ ReflectUtils.setFieldValue(service, "solidEventService", solidEventService);
+ ReflectUtils.setFieldValue(service, "realtimeEventService", realtimeEventService);
+ ReflectUtils.setFieldValue(service, "blockEventLoad", blockEventLoad);
+ ReflectUtils.setFieldValue(service, "blockEventGet", blockEventGet);
+ }
}
}
diff --git a/framework/src/test/java/org/tron/core/event/RealtimeEventServiceTest.java b/framework/src/test/java/org/tron/core/event/RealtimeEventServiceTest.java
index f58f725195c..192c2f33aa4 100644
--- a/framework/src/test/java/org/tron/core/event/RealtimeEventServiceTest.java
+++ b/framework/src/test/java/org/tron/core/event/RealtimeEventServiceTest.java
@@ -3,6 +3,7 @@
import static org.mockito.Mockito.mock;
import com.google.protobuf.ByteString;
+import java.lang.reflect.Field;
import java.util.ArrayList;
import java.util.List;
import org.junit.Assert;
@@ -13,6 +14,7 @@
import org.tron.common.logsfilter.capsule.TransactionLogTriggerCapsule;
import org.tron.common.logsfilter.trigger.ContractEventTrigger;
import org.tron.common.logsfilter.trigger.ContractLogTrigger;
+import org.tron.common.logsfilter.trigger.Trigger;
import org.tron.common.utils.ReflectUtils;
import org.tron.common.utils.Sha256Hash;
import org.tron.core.capsule.BlockCapsule;
@@ -91,24 +93,29 @@ public void test() throws Exception {
SmartContractTrigger contractTrigger = new SmartContractTrigger();
be2.setSmartContractTrigger(contractTrigger);
- contractTrigger.getContractEventTriggers().add(mock(ContractEventTrigger.class));
- Mockito.when(instance.isContractLogTriggerEnable()).thenReturn(true);
+ Field loaderInstanceField = EventPluginLoader.class.getDeclaredField("instance");
+ loaderInstanceField.setAccessible(true);
+ EventPluginLoader originalLoader = (EventPluginLoader) loaderInstanceField.get(null);
+ loaderInstanceField.set(null, instance);
try {
+ ContractEventTrigger eventTrigger = mock(ContractEventTrigger.class);
+ contractTrigger.getContractEventTriggers().add(eventTrigger);
+ Mockito.when(instance.isContractEventTriggerEnable()).thenReturn(true);
realtimeEventService.flush(be2, event.isRemove());
- } catch (Exception e) {
- Assert.assertTrue(e instanceof NullPointerException);
- }
-
- contractTrigger.getContractEventTriggers().clear();
-
- realtimeEventService.flush(be2, event.isRemove());
-
- contractTrigger.getContractLogTriggers().add(mock(ContractLogTrigger.class));
- Mockito.when(instance.isContractEventTriggerEnable()).thenReturn(true);
- try {
+ Mockito.verify(eventTrigger).setTriggerName(Trigger.CONTRACTEVENT_TRIGGER_NAME);
+ Mockito.verify(eventTrigger).setRemoved(true);
+ Mockito.verify(instance).postContractEventTrigger(eventTrigger);
+
+ contractTrigger.getContractEventTriggers().clear();
+ ContractLogTrigger logTrigger = mock(ContractLogTrigger.class);
+ contractTrigger.getContractLogTriggers().add(logTrigger);
+ Mockito.when(instance.isContractLogTriggerEnable()).thenReturn(true);
realtimeEventService.flush(be2, event.isRemove());
- } catch (Exception e) {
- Assert.assertTrue(e instanceof NullPointerException);
+ Mockito.verify(logTrigger).setTriggerName(Trigger.CONTRACTLOG_TRIGGER_NAME);
+ Mockito.verify(logTrigger).setRemoved(true);
+ Mockito.verify(instance).postContractLogTrigger(logTrigger);
+ } finally {
+ loaderInstanceField.set(null, originalLoader);
}
}
}
diff --git a/framework/src/test/java/org/tron/core/event/SolidEventServiceTest.java b/framework/src/test/java/org/tron/core/event/SolidEventServiceTest.java
index de0300e31d7..dbf9207d5a2 100644
--- a/framework/src/test/java/org/tron/core/event/SolidEventServiceTest.java
+++ b/framework/src/test/java/org/tron/core/event/SolidEventServiceTest.java
@@ -3,6 +3,7 @@
import static org.mockito.Mockito.mock;
import com.google.protobuf.ByteString;
+import java.lang.reflect.Field;
import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.BlockingQueue;
@@ -17,6 +18,7 @@
import org.tron.common.logsfilter.capsule.TriggerCapsule;
import org.tron.common.logsfilter.trigger.ContractEventTrigger;
import org.tron.common.logsfilter.trigger.ContractLogTrigger;
+import org.tron.common.logsfilter.trigger.Trigger;
import org.tron.common.utils.ReflectUtils;
import org.tron.common.utils.Sha256Hash;
import org.tron.core.capsule.BlockCapsule;
@@ -94,24 +96,29 @@ public void test() throws Exception {
SmartContractTrigger contractTrigger = new SmartContractTrigger();
be2.setSmartContractTrigger(contractTrigger);
- contractTrigger.getContractEventTriggers().add(mock(ContractEventTrigger.class));
- Mockito.when(instance.isSolidityLogTriggerEnable()).thenReturn(true);
+ Field loaderInstanceField = EventPluginLoader.class.getDeclaredField("instance");
+ loaderInstanceField.setAccessible(true);
+ EventPluginLoader originalLoader = (EventPluginLoader) loaderInstanceField.get(null);
+ loaderInstanceField.set(null, instance);
try {
+ ContractEventTrigger eventTrigger = mock(ContractEventTrigger.class);
+ contractTrigger.getContractEventTriggers().add(eventTrigger);
+ Mockito.when(instance.isSolidityEventTriggerEnable()).thenReturn(true);
solidEventService.flush(be2);
- } catch (Exception e) {
- Assert.assertTrue(e instanceof NullPointerException);
- }
-
- contractTrigger.getContractEventTriggers().clear();
-
- solidEventService.flush(be2);
-
- contractTrigger.getContractLogTriggers().add(mock(ContractLogTrigger.class));
- Mockito.when(instance.isSolidityEventTriggerEnable()).thenReturn(true);
- try {
+ Mockito.verify(eventTrigger).setTriggerName(Trigger.SOLIDITYEVENT_TRIGGER_NAME);
+ Mockito.verify(eventTrigger).setRemoved(false);
+ Mockito.verify(instance).postSolidityEventTrigger(eventTrigger);
+
+ contractTrigger.getContractEventTriggers().clear();
+ ContractLogTrigger logTrigger = mock(ContractLogTrigger.class);
+ contractTrigger.getContractLogTriggers().add(logTrigger);
+ Mockito.when(instance.isSolidityLogTriggerEnable()).thenReturn(true);
solidEventService.flush(be2);
- } catch (Exception e) {
- Assert.assertTrue(e instanceof NullPointerException);
+ Mockito.verify(logTrigger).setTriggerName(Trigger.SOLIDITYLOG_TRIGGER_NAME);
+ Mockito.verify(logTrigger).setRemoved(false);
+ Mockito.verify(instance).postSolidityLogTrigger(logTrigger);
+ } finally {
+ loaderInstanceField.set(null, originalLoader);
}
be2.setSmartContractTrigger(null);
diff --git a/framework/src/test/java/org/tron/core/net/MessageTest.java b/framework/src/test/java/org/tron/core/net/MessageTest.java
index 3757333aa6d..9994dec3af3 100644
--- a/framework/src/test/java/org/tron/core/net/MessageTest.java
+++ b/framework/src/test/java/org/tron/core/net/MessageTest.java
@@ -4,7 +4,6 @@
import org.junit.Assert;
import org.junit.Test;
import org.tron.common.overlay.message.Message;
-import org.tron.core.exception.P2pException;
import org.tron.core.net.message.MessageTypes;
import org.tron.core.net.message.adv.FetchInvDataMessage;
import org.tron.core.net.message.adv.InventoryMessage;
@@ -19,18 +18,17 @@ public class MessageTest {
private DisconnectMessage disconnectMessage;
@Test
- public void test1() {
+ public void test1() throws Exception {
DisconnectMessageTest disconnectMessageTest = new DisconnectMessageTest();
- try {
- disconnectMessage = new DisconnectMessage(MessageTypes.P2P_DISCONNECT.asByte(),
- disconnectMessageTest.toByteArray());
- } catch (Exception e) {
- Assert.assertTrue(e instanceof P2pException);
- }
+ disconnectMessage = new DisconnectMessage(MessageTypes.P2P_DISCONNECT.asByte(),
+ disconnectMessageTest.toByteArray());
+
+ Assert.assertNotNull(disconnectMessage);
+ Assert.assertEquals(disconnectMessageTest.getReason(), disconnectMessage.getReason());
}
@Test
- public void testMessageStatistics() {
+ public void testMessageStatistics() throws InterruptedException {
MessageStatistics messageStatistics = new MessageStatistics();
Message message1 = new Message(MessageTypes.P2P_HELLO.asByte(), null) {
@Override
@@ -94,11 +92,7 @@ public Class> getAnswerMessage() {
messageStatistics.addTcpOutMessage(message4);
messageStatistics.addTcpInMessage(message5);
messageStatistics.addTcpOutMessage(message5);
- try {
- Thread.sleep(2000);// so that gap > 1 in MessageCount.update method
- } catch (InterruptedException e) {
- //ignore
- }
+ Thread.sleep(2000);// so that gap > 1 in MessageCount.update method
messageStatistics.addTcpInMessage(message6);
messageStatistics.addTcpOutMessage(message6);
messageStatistics.addTcpInMessage(message7);
diff --git a/framework/src/test/java/org/tron/core/net/messagehandler/BlockMsgHandlerTest.java b/framework/src/test/java/org/tron/core/net/messagehandler/BlockMsgHandlerTest.java
index 82ea2b6cb57..707ab851d9c 100644
--- a/framework/src/test/java/org/tron/core/net/messagehandler/BlockMsgHandlerTest.java
+++ b/framework/src/test/java/org/tron/core/net/messagehandler/BlockMsgHandlerTest.java
@@ -12,7 +12,6 @@
import java.util.ArrayList;
import java.util.List;
import javax.annotation.Resource;
-import lombok.extern.slf4j.Slf4j;
import org.junit.Assert;
import org.junit.Before;
import org.junit.BeforeClass;
@@ -36,7 +35,6 @@
import org.tron.protos.Protocol.Inventory.InventoryType;
import org.tron.protos.Protocol.Transaction;
-@Slf4j
public class BlockMsgHandlerTest extends BaseTest {
@Resource
@@ -64,71 +62,56 @@ public void before() throws Exception {
}
@Test
- public void testProcessMessage() {
- BlockCapsule blockCapsule;
- BlockMessage msg;
- try {
- blockCapsule = new BlockCapsule(1, Sha256Hash.ZERO_HASH,
- System.currentTimeMillis(), Sha256Hash.ZERO_HASH.getByteString());
- msg = new BlockMessage(blockCapsule);
- handler.processMessage(peer, msg);
- } catch (P2pException e) {
- assertEquals("no request", e.getMessage());
- }
-
- try {
- List transactionList = ImmutableList.of(
- Transaction.newBuilder()
- .setRawData(Transaction.raw.newBuilder()
- .setData(
- ByteString.copyFrom(
- new byte[Parameter.ChainConstant.BLOCK_SIZE + Constant.ONE_THOUSAND])))
- .build());
- blockCapsule = new BlockCapsule(1, Sha256Hash.ZERO_HASH.getByteString(),
- System.currentTimeMillis() + 10000, transactionList);
- msg = new BlockMessage(blockCapsule);
- System.out.println("len = " + blockCapsule.getInstance().getSerializedSize());
- peer.getAdvInvRequest()
- .put(new Item(msg.getBlockId(), InventoryType.BLOCK), System.currentTimeMillis());
- handler.processMessage(peer, msg);
- } catch (P2pException e) {
- //System.out.println(e);
- assertEquals("block size over limit", e.getMessage());
- }
-
- try {
- blockCapsule = new BlockCapsule(1, Sha256Hash.ZERO_HASH,
- System.currentTimeMillis() + 10000, Sha256Hash.ZERO_HASH.getByteString());
- msg = new BlockMessage(blockCapsule);
- peer.getAdvInvRequest()
- .put(new Item(msg.getBlockId(), InventoryType.BLOCK), System.currentTimeMillis());
- handler.processMessage(peer, msg);
- } catch (P2pException e) {
- //System.out.println(e);
- assertEquals("block time error", e.getMessage());
- }
-
- try {
- blockCapsule = new BlockCapsule(1, Sha256Hash.ZERO_HASH,
- System.currentTimeMillis() + 1000, Sha256Hash.ZERO_HASH.getByteString());
- msg = new BlockMessage(blockCapsule);
- peer.getSyncBlockRequested()
- .put(msg.getBlockId(), System.currentTimeMillis());
- handler.processMessage(peer, msg);
- } catch (P2pException e) {
- //System.out.println(e);
- }
-
- try {
- blockCapsule = new BlockCapsule(1, Sha256Hash.ZERO_HASH,
- System.currentTimeMillis() + 1000, Sha256Hash.ZERO_HASH.getByteString());
- msg = new BlockMessage(blockCapsule);
- peer.getAdvInvRequest()
- .put(new Item(msg.getBlockId(), InventoryType.BLOCK), System.currentTimeMillis());
- handler.processMessage(peer, msg);
- } catch (NullPointerException | P2pException e) {
- logger.error("error", e);
- }
+ public void testProcessMessage() throws P2pException {
+ BlockCapsule unrequestedBlock = new BlockCapsule(1, Sha256Hash.ZERO_HASH,
+ System.currentTimeMillis(), Sha256Hash.ZERO_HASH.getByteString());
+ BlockMessage unrequestedMessage = new BlockMessage(unrequestedBlock);
+ P2pException noRequest = Assert.assertThrows(P2pException.class,
+ () -> handler.processMessage(peer, unrequestedMessage));
+ assertEquals(P2pException.TypeEnum.BAD_MESSAGE, noRequest.getType());
+ assertEquals("no request", noRequest.getMessage());
+
+ List transactionList = ImmutableList.of(
+ Transaction.newBuilder()
+ .setRawData(Transaction.raw.newBuilder()
+ .setData(
+ ByteString.copyFrom(
+ new byte[Parameter.ChainConstant.BLOCK_SIZE + Constant.ONE_THOUSAND])))
+ .build());
+ BlockCapsule oversizedBlock = new BlockCapsule(1, Sha256Hash.ZERO_HASH.getByteString(),
+ System.currentTimeMillis() + 10000, transactionList);
+ BlockMessage oversizedMessage = new BlockMessage(oversizedBlock);
+ peer.getAdvInvRequest()
+ .put(new Item(oversizedMessage.getBlockId(), InventoryType.BLOCK),
+ System.currentTimeMillis());
+ P2pException oversized = Assert.assertThrows(P2pException.class,
+ () -> handler.processMessage(peer, oversizedMessage));
+ assertEquals(P2pException.TypeEnum.BAD_MESSAGE, oversized.getType());
+ assertEquals("block size over limit", oversized.getMessage());
+
+ BlockCapsule futureBlock = new BlockCapsule(1, Sha256Hash.ZERO_HASH,
+ System.currentTimeMillis() + 10000, Sha256Hash.ZERO_HASH.getByteString());
+ BlockMessage futureMessage = new BlockMessage(futureBlock);
+ peer.getAdvInvRequest()
+ .put(new Item(futureMessage.getBlockId(), InventoryType.BLOCK), System.currentTimeMillis());
+ P2pException future = Assert.assertThrows(P2pException.class,
+ () -> handler.processMessage(peer, futureMessage));
+ assertEquals(P2pException.TypeEnum.BAD_MESSAGE, future.getType());
+ assertEquals("block time error", future.getMessage());
+
+ BlockCapsule syncBlock = new BlockCapsule(1, Sha256Hash.ZERO_HASH,
+ System.currentTimeMillis() + 1000, Sha256Hash.ZERO_HASH.getByteString());
+ BlockMessage syncMessage = new BlockMessage(syncBlock);
+ peer.getSyncBlockRequested().put(syncMessage.getBlockId(), System.currentTimeMillis());
+ handler.processMessage(peer, syncMessage);
+
+ BlockCapsule requestedBlock = new BlockCapsule(1, Sha256Hash.ZERO_HASH,
+ System.currentTimeMillis() + 1000, Sha256Hash.ZERO_HASH.getByteString());
+ BlockMessage requestedMessage = new BlockMessage(requestedBlock);
+ peer.getAdvInvRequest()
+ .put(new Item(requestedMessage.getBlockId(), InventoryType.BLOCK),
+ System.currentTimeMillis());
+ handler.processMessage(peer, requestedMessage);
}
@Test
diff --git a/framework/src/test/java/org/tron/core/net/messagehandler/ChainInventoryMsgHandlerTest.java b/framework/src/test/java/org/tron/core/net/messagehandler/ChainInventoryMsgHandlerTest.java
index 56853c3dbb7..34ff4700e6c 100644
--- a/framework/src/test/java/org/tron/core/net/messagehandler/ChainInventoryMsgHandlerTest.java
+++ b/framework/src/test/java/org/tron/core/net/messagehandler/ChainInventoryMsgHandlerTest.java
@@ -36,19 +36,17 @@ public static void destroy() {
@Test
public void testProcessMessage() throws Exception {
- try {
- handler.processMessage(peer, msg);
- } catch (P2pException e) {
- Assert.assertEquals("not send syncBlockChainMsg", e.getMessage());
- }
+ P2pException notRequested = Assert.assertThrows(P2pException.class,
+ () -> handler.processMessage(peer, msg));
+ Assert.assertEquals(P2pException.TypeEnum.BAD_MESSAGE, notRequested.getType());
+ Assert.assertEquals("not send syncBlockChainMsg", notRequested.getMessage());
peer.setSyncChainRequested(new Pair<>(new LinkedList<>(), System.currentTimeMillis()));
- try {
- handler.processMessage(peer, msg);
- } catch (P2pException e) {
- Assert.assertEquals("blockIds is empty", e.getMessage());
- }
+ P2pException empty = Assert.assertThrows(P2pException.class,
+ () -> handler.processMessage(peer, msg));
+ Assert.assertEquals(P2pException.TypeEnum.BAD_MESSAGE, empty.getType());
+ Assert.assertEquals("blockIds is empty", empty.getMessage());
long size = NetConstants.SYNC_FETCH_BATCH_NUM + 2;
for (int i = 0; i < size; i++) {
@@ -56,11 +54,10 @@ public void testProcessMessage() throws Exception {
}
msg = new ChainInventoryMessage(blockIds, 0L);
- try {
- handler.processMessage(peer, msg);
- } catch (P2pException e) {
- Assert.assertEquals(e.getMessage(), "big blockIds size: " + size);
- }
+ P2pException tooMany = Assert.assertThrows(P2pException.class,
+ () -> handler.processMessage(peer, msg));
+ Assert.assertEquals(P2pException.TypeEnum.BAD_MESSAGE, tooMany.getType());
+ Assert.assertEquals("big blockIds size: " + size, tooMany.getMessage());
blockIds.clear();
size = NetConstants.SYNC_FETCH_BATCH_NUM / 100;
@@ -69,11 +66,10 @@ public void testProcessMessage() throws Exception {
}
msg = new ChainInventoryMessage(blockIds, 100L);
- try {
- handler.processMessage(peer, msg);
- } catch (P2pException e) {
- Assert.assertEquals(e.getMessage(), "remain: 100, blockIds size: " + size);
- }
+ P2pException invalidRemain = Assert.assertThrows(P2pException.class,
+ () -> handler.processMessage(peer, msg));
+ Assert.assertEquals(P2pException.TypeEnum.BAD_MESSAGE, invalidRemain.getType());
+ Assert.assertEquals("remain: 100, blockIds size: " + size, invalidRemain.getMessage());
Assert.assertNotNull(msg.toString());
Assert.assertNull(msg.getAnswerMessage());
}
diff --git a/framework/src/test/java/org/tron/core/net/messagehandler/PbftMsgHandlerTest.java b/framework/src/test/java/org/tron/core/net/messagehandler/PbftMsgHandlerTest.java
index 65a8f615bfe..a4cce94b508 100644
--- a/framework/src/test/java/org/tron/core/net/messagehandler/PbftMsgHandlerTest.java
+++ b/framework/src/test/java/org/tron/core/net/messagehandler/PbftMsgHandlerTest.java
@@ -103,20 +103,16 @@ public void testPbft() throws Exception {
pbftMessage.setSwitch(blockCapsule.isSwitch());
Param.getInstance().setPbftInterface(context.getBean(PbftBaseImpl.class));
peer.setNeedSyncFromPeer(false);
- //Mockito.doNothing().when(pbftMessage).analyzeSignature();
- try {
- context.getBean(PbftMsgHandler.class).processMessage(peer, pbftMessage);
- } catch (P2pException e) {
- Assert.assertEquals(P2pException.TypeEnum.BAD_MESSAGE, e.getType());
- }
-
DynamicPropertiesStore dynamicPropertiesStore = context.getBean(DynamicPropertiesStore.class);
+ PbftMsgHandler handler = context.getBean(PbftMsgHandler.class);
+
+ dynamicPropertiesStore.saveAllowPBFT(0);
+ handler.processMessage(peer, pbftMessage);
+
dynamicPropertiesStore.saveAllowPBFT(1);
- try {
- context.getBean(PbftMsgHandler.class).processMessage(peer, pbftMessage);
- } catch (P2pException e) {
- Assert.assertEquals(P2pException.TypeEnum.BAD_MESSAGE, e.getType());
- }
+ P2pException exception = Assert.assertThrows(
+ P2pException.class, () -> handler.processMessage(peer, pbftMessage));
+ Assert.assertEquals(P2pException.TypeEnum.BAD_MESSAGE, exception.getType());
Assert.assertEquals(1, PeerManager.getPeers().size());
}
diff --git a/framework/src/test/java/org/tron/core/net/messagehandler/SyncBlockChainMsgHandlerTest.java b/framework/src/test/java/org/tron/core/net/messagehandler/SyncBlockChainMsgHandlerTest.java
index 08c5484880f..e5c44299287 100644
--- a/framework/src/test/java/org/tron/core/net/messagehandler/SyncBlockChainMsgHandlerTest.java
+++ b/framework/src/test/java/org/tron/core/net/messagehandler/SyncBlockChainMsgHandlerTest.java
@@ -71,12 +71,11 @@ public void init() throws Exception {
@Test
public void testProcessMessage() throws Exception {
- try {
- peer.setRemainNum(1);
- handler.processMessage(peer, new SyncBlockChainMessage(new ArrayList<>()));
- } catch (P2pException e) {
- Assert.assertEquals("SyncBlockChain blockIds is empty", e.getMessage());
- }
+ peer.setRemainNum(0);
+ P2pException empty = Assert.assertThrows(P2pException.class,
+ () -> handler.processMessage(peer, new SyncBlockChainMessage(new ArrayList<>())));
+ Assert.assertEquals(P2pException.TypeEnum.BAD_MESSAGE, empty.getType());
+ Assert.assertEquals("SyncBlockChain blockIds is empty", empty.getMessage());
List blockIds = new ArrayList<>();
blockIds.add(new BlockCapsule.BlockId());
@@ -97,11 +96,13 @@ public void testProcessMessage() throws Exception {
Method method1 = handler.getClass().getDeclaredMethod(
"getLostBlockIds", List.class, BlockId.class);
method1.setAccessible(true);
- try {
- method1.invoke(handler, blockIds, new BlockCapsule.BlockId());
- } catch (InvocationTargetException e) {
- Assert.assertEquals("unForkId is null", e.getTargetException().getMessage());
- }
+ InvocationTargetException noCommonBlock = Assert.assertThrows(
+ InvocationTargetException.class,
+ () -> method1.invoke(handler, blockIds, new BlockCapsule.BlockId()));
+ Assert.assertTrue(noCommonBlock.getCause() instanceof P2pException);
+ P2pException syncFailed = (P2pException) noCommonBlock.getCause();
+ Assert.assertEquals(P2pException.TypeEnum.SYNC_FAILED, syncFailed.getType());
+ Assert.assertEquals("unForkId is null", syncFailed.getMessage());
Method method2 = handler.getClass().getDeclaredMethod(
"getBlockIds", Long.class, BlockId.class);
@@ -150,14 +151,7 @@ public void testBlockIdsAtLimit() throws Exception {
Method checkMethod = SyncBlockChainMsgHandler.class
.getDeclaredMethod("check", PeerConnection.class, SyncBlockChainMessage.class);
checkMethod.setAccessible(true);
- // does not throw P2pException due to length (may return false for other checks — that's fine)
- try {
- checkMethod.invoke(handler, peer, msg);
- } catch (InvocationTargetException e) {
- Assert.assertFalse("Should not fail with BAD_MESSAGE for length at limit",
- e.getCause() instanceof P2pException
- && ((P2pException) e.getCause()).getMessage().contains("exceeds limit"));
- }
+ Assert.assertEquals(Boolean.TRUE, checkMethod.invoke(handler, peer, msg));
}
@AfterClass
diff --git a/framework/src/test/java/org/tron/core/net/messagehandler/TransactionsMsgHandlerTest.java b/framework/src/test/java/org/tron/core/net/messagehandler/TransactionsMsgHandlerTest.java
index ed2121d360f..eeb391c9481 100644
--- a/framework/src/test/java/org/tron/core/net/messagehandler/TransactionsMsgHandlerTest.java
+++ b/framework/src/test/java/org/tron/core/net/messagehandler/TransactionsMsgHandlerTest.java
@@ -107,7 +107,7 @@ public void testProcessMessage() {
List transactionList1 = new ArrayList<>();
transactionList1.add(trx1);
transactionsMsgHandler.processMessage(peer, new TransactionsMessage(transactionList1));
- Assert.assertNull(advInvRequest.get(item1));
+ Assert.assertFalse(advInvRequest1.containsKey(item1));
// test 0 contract
Protocol.Transaction trx2 = Protocol.Transaction.newBuilder().setRawData(
@@ -116,21 +116,23 @@ public void testProcessMessage() {
.build();
List transactionList2 = new ArrayList<>();
transactionList2.add(trx2);
- try {
- transactionsMsgHandler.processMessage(peer, new TransactionsMessage(transactionList2));
- } catch (Exception ep) {
- Assert.assertTrue(true);
- }
+ P2pException noRequest = Assert.assertThrows(P2pException.class,
+ () -> transactionsMsgHandler.processMessage(
+ peer, new TransactionsMessage(transactionList2)));
+ Assert.assertEquals(TypeEnum.BAD_MESSAGE, noRequest.getType());
+ Assert.assertTrue(noRequest.getMessage().endsWith("without request."));
+
Map- advInvRequest2 = new ConcurrentHashMap<>();
Item item2 = new Item(new TransactionMessage(trx2).getMessageId(),
Protocol.Inventory.InventoryType.TRX);
advInvRequest2.put(item2, 0L);
Mockito.when(peer.getAdvInvRequest()).thenReturn(advInvRequest2);
- try {
- transactionsMsgHandler.processMessage(peer, new TransactionsMessage(transactionList2));
- } catch (Exception ep) {
- Assert.assertTrue(true);
- }
+ P2pException noContract = Assert.assertThrows(P2pException.class,
+ () -> transactionsMsgHandler.processMessage(
+ peer, new TransactionsMessage(transactionList2)));
+ Assert.assertEquals(TypeEnum.BAD_TRX, noContract.getType());
+ Assert.assertTrue(noContract.getMessage()
+ .endsWith("contract size should be greater than 0"));
} catch (Exception e) {
Assert.fail();
} finally {
diff --git a/framework/src/test/java/org/tron/core/net/services/RelayServiceTest.java b/framework/src/test/java/org/tron/core/net/services/RelayServiceTest.java
index 7c28757bd5c..5fc6eea1d88 100644
--- a/framework/src/test/java/org/tron/core/net/services/RelayServiceTest.java
+++ b/framework/src/test/java/org/tron/core/net/services/RelayServiceTest.java
@@ -14,7 +14,6 @@
import java.util.List;
import java.util.Set;
import javax.annotation.Resource;
-import lombok.extern.slf4j.Slf4j;
import org.bouncycastle.util.encoders.Hex;
import org.junit.After;
import org.junit.Assert;
@@ -49,7 +48,6 @@
import org.tron.p2p.utils.NetUtil;
import org.tron.protos.Protocol;
-@Slf4j(topic = "net")
public class RelayServiceTest extends BaseTest {
@Resource
@@ -122,43 +120,38 @@ public void testGetNextWitnesses() throws Exception {
assertContains(s3, "41299F3DB80A24B20A254B89CE639D59132F157F13");
}
- private void testBroadcast() {
- try {
- PeerConnection peer = new PeerConnection();
- InetSocketAddress a1 = new InetSocketAddress("127.0.0.2", 10001);
- Channel c1 = mock(Channel.class);
- Mockito.when(c1.getInetSocketAddress()).thenReturn(a1);
- Mockito.when(c1.getInetAddress()).thenReturn(a1.getAddress());
- doNothing().when(c1).send((byte[]) any());
-
- peer.setChannel(c1);
- peer.setAddress(getFromHexString("41299F3DB80A24B20A254B89CE639D59132F157F13"));
- peer.setNeedSyncFromPeer(false);
- peer.setNeedSyncFromUs(false);
-
- List peers = new ArrayList<>();
- peers.add(peer);
-
- TronNetDelegate tronNetDelegate = Mockito.mock(TronNetDelegate.class);
- Mockito.doReturn(peers).when(tronNetDelegate).getActivePeer();
-
- Field field = service.getClass().getDeclaredField("tronNetDelegate");
- field.setAccessible(true);
- field.set(service, tronNetDelegate);
-
- BlockCapsule blockCapsule = new BlockCapsule(chainBaseManager.getHeadBlockNum() + 1,
- chainBaseManager.getHeadBlockId(),
- 0, getFromHexString("418A8D690BF36806C36A7DAE3AF796643C1AA9CC01"));
- BlockMessage msg = new BlockMessage(blockCapsule);
- service.broadcast(msg);
- Item item = new Item(blockCapsule.getBlockId(), Protocol.Inventory.InventoryType.BLOCK);
- Assert.assertEquals(1, peer.getAdvInvSpread().size());
- Assert.assertNotNull(peer.getAdvInvSpread().getIfPresent(item));
- peer.getChannel().close();
- } catch (Exception e) {
- logger.info("", e);
- assert false;
- }
+ private void testBroadcast() throws Exception {
+ PeerConnection peer = new PeerConnection();
+ InetSocketAddress a1 = new InetSocketAddress("127.0.0.2", 10001);
+ Channel c1 = mock(Channel.class);
+ Mockito.when(c1.getInetSocketAddress()).thenReturn(a1);
+ Mockito.when(c1.getInetAddress()).thenReturn(a1.getAddress());
+ doNothing().when(c1).send((byte[]) any());
+
+ peer.setChannel(c1);
+ peer.setAddress(getFromHexString("41299F3DB80A24B20A254B89CE639D59132F157F13"));
+ peer.setNeedSyncFromPeer(false);
+ peer.setNeedSyncFromUs(false);
+
+ List peers = new ArrayList<>();
+ peers.add(peer);
+
+ TronNetDelegate tronNetDelegate = Mockito.mock(TronNetDelegate.class);
+ Mockito.doReturn(peers).when(tronNetDelegate).getActivePeer();
+
+ Field field = service.getClass().getDeclaredField("tronNetDelegate");
+ field.setAccessible(true);
+ field.set(service, tronNetDelegate);
+
+ BlockCapsule blockCapsule = new BlockCapsule(chainBaseManager.getHeadBlockNum() + 1,
+ chainBaseManager.getHeadBlockId(),
+ 0, getFromHexString("418A8D690BF36806C36A7DAE3AF796643C1AA9CC01"));
+ BlockMessage msg = new BlockMessage(blockCapsule);
+ service.broadcast(msg);
+ Item item = new Item(blockCapsule.getBlockId(), Protocol.Inventory.InventoryType.BLOCK);
+ Assert.assertEquals(1, peer.getAdvInvSpread().size());
+ Assert.assertNotNull(peer.getAdvInvSpread().getIfPresent(item));
+ peer.getChannel().close();
}
private void assertContains(Set set, String string) {
@@ -170,7 +163,7 @@ private ByteString getFromHexString(String s) {
return ByteString.copyFrom(Hex.decode(s));
}
- private void testCheckHelloMessage() {
+ private void testCheckHelloMessage() throws Exception {
String key = "0154435f065a57fec6af1e12eaa2fa600030639448d7809f4c65bdcf8baed7e5";
ByteString address = getFromHexString("418A8D690BF36806C36A7DAE3AF796643C1AA9CC01");
InetSocketAddress a1 = new InetSocketAddress("127.0.0.1", 10001);
@@ -201,53 +194,48 @@ private void testCheckHelloMessage() {
ApplicationContext ctx = (ApplicationContext) ReflectUtils.getFieldObject(p2pEventHandler,
"ctx");
PeerConnection peer1 = PeerManager.add(ctx, c1);
- assert peer1 != null;
+ Assert.assertNotNull(peer1);
peer1.setAddress(address);
PeerConnection peer2 = PeerManager.add(ctx, c2);
- assert peer2 != null;
+ Assert.assertNotNull(peer2);
peer2.setAddress(address);
ReflectUtils.setFieldValue(tronNetService, "p2pConfig", new P2pConfig());
- try {
- Field field = service.getClass().getDeclaredField("witnessScheduleStore");
- field.setAccessible(true);
- field.set(service, chainBaseManager.getWitnessScheduleStore());
-
- Field field2 = service.getClass().getDeclaredField("manager");
- field2.setAccessible(true);
- field2.set(service, dbManager);
-
- boolean res = service.checkHelloMessage(helloMessage, c1);
- Assert.assertTrue(res);
-
- HelloMessage shortSigMsg = new HelloMessage(node, System.currentTimeMillis(),
- ChainBaseManager.getChainBaseManager());
- shortSigMsg.setHelloMessage(shortSigMsg.getHelloMessage().toBuilder()
- .setAddress(address)
- .setSignature(ByteString.copyFrom(new byte[64]))
- .build());
- Assert.assertFalse(service.checkHelloMessage(shortSigMsg, c1));
-
- HelloMessage longSigMsg = new HelloMessage(node, System.currentTimeMillis(),
- ChainBaseManager.getChainBaseManager());
- longSigMsg.setHelloMessage(longSigMsg.getHelloMessage().toBuilder()
- .setAddress(address)
- .setSignature(ByteString.copyFrom(new byte[69]))
- .build());
- Assert.assertFalse(service.checkHelloMessage(longSigMsg, c1));
-
- HelloMessage emptySigMsg = new HelloMessage(node, System.currentTimeMillis(),
- ChainBaseManager.getChainBaseManager());
- emptySigMsg.setHelloMessage(emptySigMsg.getHelloMessage().toBuilder()
- .setAddress(address)
- .setSignature(ByteString.EMPTY)
- .build());
- Assert.assertFalse(service.checkHelloMessage(emptySigMsg, c1));
- } catch (Exception e) {
- logger.info("", e);
- assert false;
- }
+ Field field = service.getClass().getDeclaredField("witnessScheduleStore");
+ field.setAccessible(true);
+ field.set(service, chainBaseManager.getWitnessScheduleStore());
+
+ Field field2 = service.getClass().getDeclaredField("manager");
+ field2.setAccessible(true);
+ field2.set(service, dbManager);
+
+ boolean res = service.checkHelloMessage(helloMessage, c1);
+ Assert.assertTrue(res);
+
+ HelloMessage shortSigMsg = new HelloMessage(node, System.currentTimeMillis(),
+ ChainBaseManager.getChainBaseManager());
+ shortSigMsg.setHelloMessage(shortSigMsg.getHelloMessage().toBuilder()
+ .setAddress(address)
+ .setSignature(ByteString.copyFrom(new byte[64]))
+ .build());
+ Assert.assertFalse(service.checkHelloMessage(shortSigMsg, c1));
+
+ HelloMessage longSigMsg = new HelloMessage(node, System.currentTimeMillis(),
+ ChainBaseManager.getChainBaseManager());
+ longSigMsg.setHelloMessage(longSigMsg.getHelloMessage().toBuilder()
+ .setAddress(address)
+ .setSignature(ByteString.copyFrom(new byte[69]))
+ .build());
+ Assert.assertFalse(service.checkHelloMessage(longSigMsg, c1));
+
+ HelloMessage emptySigMsg = new HelloMessage(node, System.currentTimeMillis(),
+ ChainBaseManager.getChainBaseManager());
+ emptySigMsg.setHelloMessage(emptySigMsg.getHelloMessage().toBuilder()
+ .setAddress(address)
+ .setSignature(ByteString.EMPTY)
+ .build());
+ Assert.assertFalse(service.checkHelloMessage(emptySigMsg, c1));
}
@Test
diff --git a/framework/src/test/java/org/tron/core/net/services/SyncServiceTest.java b/framework/src/test/java/org/tron/core/net/services/SyncServiceTest.java
index 2366aab3ab5..55b16f059a6 100644
--- a/framework/src/test/java/org/tron/core/net/services/SyncServiceTest.java
+++ b/framework/src/test/java/org/tron/core/net/services/SyncServiceTest.java
@@ -65,30 +65,28 @@ public void testStartSync() {
peer = context.getBean(PeerConnection.class);
Assert.assertNull(peer.getSyncChainRequested());
- Channel c1 = new Channel();
- ReflectUtils.setFieldValue(c1, "inetSocketAddress", inetSocketAddress);
- ReflectUtils.setFieldValue(c1, "inetAddress", inetSocketAddress.getAddress());
+ Channel c1 = mock(Channel.class);
+ Mockito.when(c1.getInetSocketAddress()).thenReturn(inetSocketAddress);
+ Mockito.when(c1.getInetAddress()).thenReturn(inetSocketAddress.getAddress());
peer.setChannel(c1);
ReflectUtils.setFieldValue(peer, "tronState", TronState.SYNCING);
service.startSync(peer);
+ Mockito.verify(c1, Mockito.never()).send(Mockito.any(byte[].class));
ReflectUtils.setFieldValue(peer, "tronState", TronState.INIT);
-
- try {
- peer.setBlockBothHave(new BlockCapsule.BlockId(Sha256Hash.ZERO_HASH, -1));
- service.syncNext(peer);
- } catch (Exception e) {
- // no need to deal with
- }
-
service.startSync(peer);
- } catch (Exception e) {
- // no need to deal with
+
+ Assert.assertEquals(TronState.SYNCING, peer.getTronState());
+ Assert.assertTrue(peer.isNeedSyncFromPeer());
+ Assert.assertNotNull(peer.getSyncChainRequested());
+ Assert.assertFalse(peer.getSyncChainRequested().getKey().isEmpty());
+ Mockito.verify(c1).send(Mockito.any(byte[].class));
+ } finally {
+ service.close();
}
- service.close();
}
@Test
diff --git a/framework/src/test/java/org/tron/core/zksnark/LibrustzcashTest.java b/framework/src/test/java/org/tron/core/zksnark/LibrustzcashTest.java
index b471aeb2e42..9d2f0b2a634 100644
--- a/framework/src/test/java/org/tron/core/zksnark/LibrustzcashTest.java
+++ b/framework/src/test/java/org/tron/core/zksnark/LibrustzcashTest.java
@@ -19,14 +19,9 @@
import com.google.protobuf.ByteString;
import java.util.Arrays;
import java.util.Optional;
-import java.util.concurrent.CountDownLatch;
-import java.util.concurrent.ExecutorService;
-import java.util.concurrent.Executors;
-import java.util.stream.LongStream;
import javax.annotation.Resource;
import lombok.extern.slf4j.Slf4j;
import org.junit.BeforeClass;
-import org.junit.Ignore;
import org.junit.Test;
import org.tron.common.BaseTest;
import org.tron.common.TestConstants;
@@ -268,39 +263,6 @@ public long benchmarkCreateSpend() throws ZksnarkException {
return time;
}
- @Ignore
- @Test
- public void calBenchmarkSpendConcurrent() throws Exception {
- System.out.println("--- load ok ---");
-
- int count = 2;
-
- CountDownLatch countDownLatch = new CountDownLatch(count);
-
- int availableProcessors = Runtime.getRuntime().availableProcessors();
- logger.info("availableProcessors:" + availableProcessors);
-
- ExecutorService generatePool =
- Executors.newFixedThreadPool(
- availableProcessors,
- r -> new Thread(r, "generate-transaction"));
-
- long startGenerate = System.currentTimeMillis();
- LongStream.range(0L, count).forEach(l -> generatePool.execute(() -> {
- try {
- benchmarkCreateSpend();
- } catch (Exception ex) {
- ex.printStackTrace();
- logger.error("", ex);
- }
- }));
-
- countDownLatch.await();
- generatePool.shutdown();
-
- logger.info("generate cost time:" + (System.currentTimeMillis() - startGenerate));
- }
-
@Test
public void calBenchmarkSpend() throws ZksnarkException {
System.out.println("--- load ok ---");
@@ -515,21 +477,19 @@ public void testGenerateNote() throws Exception {
try {
Optional op = incomingViewingKey.address(diversifierT);
- // PaymentAddress op = spendingKey.defaultAddress();
- if (op.isPresent()) {
- Note note = new Note(op.get(), 100);
- note.setRcm(ByteArray
- .fromHexString(
- "bf4b2042e3e8c4a0b390e407a79a0b46e36eff4f7bb54b2349dbb0046ee21e02"));
-
- byte[] cm = note.cm();
- if (cm != null) {
- success++;
- } else {
- fail++;
- }
- System.out.println("note is " + Arrays.toString(cm));
+ assertTrue("a valid random diversifier must produce a payment address", op.isPresent());
+ Note note = new Note(op.get(), 100);
+ note.setRcm(ByteArray
+ .fromHexString(
+ "bf4b2042e3e8c4a0b390e407a79a0b46e36eff4f7bb54b2349dbb0046ee21e02"));
+
+ byte[] cm = note.cm();
+ if (cm != null) {
+ success++;
+ } else {
+ fail++;
}
+ System.out.println("note is " + Arrays.toString(cm));
} catch (ZksnarkException e) {
System.out.println("failed: " + e.getMessage());
fail++;
@@ -599,20 +559,14 @@ public void testGenerateNoteWithConstant() throws Exception {
FullViewingKey fullViewingKey = spendingKey.fullViewingKey();
IncomingViewingKey incomingViewingKey = fullViewingKey.inViewingKey();
- try {
- Optional op = incomingViewingKey.address(diversifierT);
- // PaymentAddress op = spendingKey.defaultAddress();
- if (op.isPresent()) {
- Note note = new Note(op.get(), randomInt(100, 100000));
- note.setRcm(ByteArray
- .fromHexString("bf4b2042e3e8c4a0b390e407a79a0b46e36eff4f7bb54b2349dbb0046ee21e02"));
+ Optional op = incomingViewingKey.address(diversifierT);
+ assertTrue(op.isPresent());
+ Note note = new Note(op.get(), randomInt(100, 100000));
+ note.setRcm(ByteArray
+ .fromHexString("bf4b2042e3e8c4a0b390e407a79a0b46e36eff4f7bb54b2349dbb0046ee21e02"));
- byte[] cm = note.cm();
- System.out.println("note is " + Arrays.toString(cm));
- }
- } catch (ZksnarkException e) {
- System.out.println("failed: " + e.getMessage());
- }
+ byte[] cm = note.cm();
+ assertEquals(32, cm.length);
}
diff --git a/framework/src/test/java/org/tron/core/zksnark/MerkleContainerTest.java b/framework/src/test/java/org/tron/core/zksnark/MerkleContainerTest.java
index 61fb36a9f68..9d9602fbe9d 100644
--- a/framework/src/test/java/org/tron/core/zksnark/MerkleContainerTest.java
+++ b/framework/src/test/java/org/tron/core/zksnark/MerkleContainerTest.java
@@ -37,7 +37,6 @@ public class MerkleContainerTest extends BaseTest {
@Resource
private Wallet wallet;
- // private static MerkleContainer merkleContainer;
private static boolean origShieldedApi;
@@ -57,116 +56,6 @@ public static void restoreShieldedApi() {
Args.getInstance().allowShieldedTransactionApi = origShieldedApi;
}
- /*@Before
- public void init() {
- merkleContainer = MerkleContainer
- .createInstance(dbManager.getMerkleTreeStore(), dbManager.getChainBaseManager()
- .getMerkleTreeIndexStore());
- }*/
-
- /*@Test
- public void test() {
- //add
- IncrementalMerkleTreeContainer tree = new IncrementalMerkleTreeContainer(
- new IncrementalMerkleTreeCapsule());
- String s1 = "2ec45f5ae2d1bc7a80df02abfb2814a1239f956c6fb3ac0e112c008ba2c1ab91";
- PedersenHashCapsule compressCapsule1 = new PedersenHashCapsule();
- compressCapsule1.setContent(ByteString.copyFrom(ByteArray.fromHexString(s1)));
- PedersenHash a = compressCapsule1.getInstance();
-
- String s2 = "3daa00c9a1966a37531c829b9b1cd928f8172d35174e1aecd31ba0ed36863017";
- PedersenHashCapsule compressCapsule2 = new PedersenHashCapsule();
- byte[] bytes2 = ByteArray.fromHexString(s2);
- ZksnarkUtils.sort(bytes2);
- compressCapsule2.setContent(ByteString.copyFrom(bytes2));
- PedersenHash b = compressCapsule2.getInstance();
-
- String s3 = "c013c63be33194974dc555d445bac616fca794a0369f9d84fbb5a8556699bf62";
- PedersenHashCapsule compressCapsule3 = new PedersenHashCapsule();
- byte[] bytes3 = ByteArray.fromHexString(s3);
- ZksnarkUtils.sort(bytes3);
- compressCapsule3.setContent(ByteString.copyFrom(bytes3));
- PedersenHash c = compressCapsule3.getInstance();
-
- tree.append(a);
- tree.append(b);
- IncrementalMerkleVoucherContainer witness1 = tree.toVoucher();
- witness1.append(c);
-
- System.out.println(ByteArray.toHexString(witness1.root().getContent().toByteArray()));
-
- tree.append(c);
-
- //root
- //todo : need check
- Assert.assertEquals("9e337370cb3598c6ffcbce991a05ff343fdcc6c9960c0a2ffbdedc007866f06d",
- ByteArray.toHexString(tree.getMerkleTreeKey()));
-
- //save
- merkleContainer.putMerkleTreeIntoStore(tree.getMerkleTreeKey(), tree.getTreeCapsule());
-
- //get
- Assert.assertEquals(true, merkleContainer.merkleRootExist(tree.getMerkleTreeKey()));
-
- tree = merkleContainer.getMerkleTree(tree.getMerkleTreeKey()).toMerkleTreeContainer();
- Assert.assertEquals(3, tree.size());
-
- //other
- Assert.assertEquals(false, tree.isComplete());
- Assert.assertEquals(0, tree.nextDepth(0));
- Assert.assertEquals(96, tree.DynamicMemoryUsage());
- tree.wfcheck();
-
- //saveCmIntoMerkleTree
- byte[] hash = {0x01};
- IncrementalMerkleTreeContainer newTree = merkleContainer
- .saveCmIntoMerkleTree(tree.getMerkleTreeKey(), ByteArray.fromHexString(s1),
- ByteArray.fromHexString(s2), hash);
- //todo : need check
- Assert.assertEquals("c06bcab726d37d35f049a1db7e1c238beb949bde46a02eaf2a435a3a03c1413d",
- ByteArray.toHexString(newTree.getMerkleTreeKey()));
-
- Assert.assertEquals(3, tree.size());
- Assert.assertEquals(5, newTree.size());
- Assert.assertEquals(s2, ByteArray.toHexString(newTree.last().getContent().toByteArray()));
-
- Assert.assertEquals("0100000000",
- ByteArray.toHexString(
- merkleContainer.getVoucher(hash, 0).toMerkleVoucherContainer().getMerkleVoucherKey()));
- Assert.assertEquals("0100000001",
- ByteArray.toHexString(
- merkleContainer.getVoucher(hash, 1).toMerkleVoucherContainer().getMerkleVoucherKey()));
-
- //path
- MerklePath path = tree.path();
- //todo:need to check path
- Assert.assertEquals(false, path.getIndex().get(0));
- Assert.assertEquals(true, path.getIndex().get(1));
-
- //todo:need to check witness
- //witness test
- IncrementalMerkleVoucherContainer witness = tree.toVoucher();
- //witness
- witness.append(a);
- Assert.assertEquals(true, path.getIndex().get(1));
-
- Assert.assertEquals("ae308012692c14afb26cff2dc0178302b2fffcfd1c2e542c0ca9889a5db4cd6b",
- ByteArray.toHexString(witness.getRootArray()));
-
- witness.element();
- witness.path();
-
- witness.getVoucherCapsule().setOutputPoint(ByteString.copyFrom(hash), 1);
-
- //save
- merkleContainer
- .putMerkleVoucherIntoStore(witness.getMerkleVoucherKey(), witness.getVoucherCapsule());
-
- IncrementalMerkleTreeContainer bestMerkleRoot = merkleContainer.getBestMerkle();
- Assert.assertEquals(1, bestMerkleRoot.size());
-
- }*/
-
private Transaction createTransaction(String strCm1, String strCm2) {
ByteString cm1 = ByteString.copyFrom(ByteArray.fromHexString(strCm1));
ByteString cm2 = ByteString.copyFrom(ByteArray.fromHexString(strCm2));
@@ -220,9 +109,6 @@ private void initMerkleTreeWitnessInfo() throws ZksnarkException {
TransactionCapsule transactionCapsule1 = new TransactionCapsule(transaction);
transactionCapsule1.setBlockNum(blockNum);
- System.out.println(
- "blockNum:100,txId(1):" + ByteArray.toHexString(transactionCapsule1
- .getTransactionId().getBytes()));
dbManager.getTransactionStore()
.put(transactionCapsule1.getTransactionId().getBytes(),
transactionCapsule1);
@@ -291,9 +177,6 @@ private void initMerkleTreeWitnessInfo() throws ZksnarkException {
TransactionCapsule transactionCapsule = new TransactionCapsule(transaction2);
transactionCapsule.setBlockNum(blockNum);
- System.out.println(
- "blockNum:102,txId(2):" + ByteArray.toHexString(transactionCapsule
- .getTransactionId().getBytes()));
dbManager.getTransactionStore()
.put(transactionCapsule.getTransactionId().getBytes(),
transactionCapsule);
@@ -358,36 +241,26 @@ public void getMerkleTreeWitnessInfoTest() throws Exception {
int number = 0;
OutputPointInfo outputPointInfo = OutputPointInfo.newBuilder().addOutPoints(outputPoint1)
.addOutPoints(outputPoint2).setBlockNum(number).build();
- // Args.getInstance().setAllowShieldedTransaction(1);
IncrementalMerkleVoucherInfo merkleTreeWitnessInfo = wallet
.getMerkleTreeVoucherInfo(outputPointInfo);
- //Assert.assertEquals(txId1, merkleTreeWitnessInfo.getWitness1().getOutputPoint().getHash());
- Assert.assertEquals(0, merkleTreeWitnessInfo.getVouchers(0).getOutputPoint().getIndex());
- //Assert
- // .assertEquals(13, new IncrementalMerkleVoucherCapsule(merkleTreeWitnessInfo.getWitness1
- // ()).
- // toMerkleVoucherContainer().size());
- //Assert
- // .assertEquals(13, new IncrementalMerkleVoucherCapsule(merkleTreeWitnessInfo.getWitness2
- // ()).
- // toMerkleVoucherContainer().size());
+ Assert.assertEquals(2, merkleTreeWitnessInfo.getVouchersCount());
+ Assert.assertEquals(2, merkleTreeWitnessInfo.getPathsCount());
IncrementalMerkleVoucherCapsule capsule1 = new IncrementalMerkleVoucherCapsule(
merkleTreeWitnessInfo.getVouchers(0));
- capsule1.toMerkleVoucherContainer().printSize();
-
IncrementalMerkleVoucherCapsule capsule2 = new IncrementalMerkleVoucherCapsule(
merkleTreeWitnessInfo.getVouchers(1));
- capsule2.toMerkleVoucherContainer().printSize();
-
- System.out
- .println("kkkkkk" + ByteArray
- .toHexString(merkleTreeWitnessInfo.getVouchers(0).getRt().toByteArray()));
+ Assert.assertTrue(capsule1.toMerkleVoucherContainer().size() > 0);
+ Assert.assertTrue(capsule2.toMerkleVoucherContainer().size() > 0);
+ Assert.assertEquals(
+ ByteString.copyFrom(capsule1.toMerkleVoucherContainer().path().encode()),
+ merkleTreeWitnessInfo.getPaths(0));
Assert.assertEquals(
- ByteArray.toHexString(merkleTreeWitnessInfo.getVouchers(0).getRt().toByteArray()),
- ByteArray.toHexString(merkleTreeWitnessInfo.getVouchers(1).getRt().toByteArray())
- );
+ ByteString.copyFrom(capsule2.toMerkleVoucherContainer().path().encode()),
+ merkleTreeWitnessInfo.getPaths(1));
+ Assert.assertEquals(merkleTreeWitnessInfo.getVouchers(0).getRt(),
+ merkleTreeWitnessInfo.getVouchers(1).getRt());
}
diff --git a/framework/src/test/java/org/tron/core/zksnark/MerkleTreeTest.java b/framework/src/test/java/org/tron/core/zksnark/MerkleTreeTest.java
index cf50dc87fa6..f6d0dd99afe 100644
--- a/framework/src/test/java/org/tron/core/zksnark/MerkleTreeTest.java
+++ b/framework/src/test/java/org/tron/core/zksnark/MerkleTreeTest.java
@@ -5,6 +5,7 @@
import com.google.common.io.Files;
import com.google.protobuf.ByteString;
import java.io.File;
+import java.io.IOException;
import java.util.List;
import org.junit.Assert;
import org.junit.Before;
@@ -21,6 +22,7 @@
import org.tron.core.capsule.IncrementalMerkleVoucherCapsule;
import org.tron.core.capsule.PedersenHashCapsule;
import org.tron.core.config.args.Args;
+import org.tron.core.exception.ZksnarkException;
import org.tron.json.JSONArray;
import org.tron.protos.contract.ShieldContract.PedersenHash;
@@ -56,7 +58,7 @@ public void init() {
init = true;
}
- private JSONArray readFile(String fileName) throws Exception {
+ private JSONArray readFile(String fileName) throws IOException {
String file1 = SendCoinShieldTest.class.getClassLoader()
.getResource("json" + File.separator + fileName).getFile();
List readLines = Files.readLines(new File(file1),
@@ -71,7 +73,7 @@ private String PedersenHash2String(PedersenHash hash) {
}
@Test
- public void testComplexTreePath() throws Exception {
+ public void testComplexTreePath() throws IOException, ZksnarkException {
IncrementalMerkleTreeContainer.setDEPTH(4);
EmptyMerkleRoots.setEmptyMerkleRootsInstance(new EmptyMerkleRoots());
@@ -82,18 +84,13 @@ public void testComplexTreePath() throws Exception {
IncrementalMerkleTreeContainer tree = new IncrementalMerkleTreeCapsule()
.toMerkleTreeContainer();
tree.toVoucher().setDEPTH(4);
- System.out.println("tree depth is " + IncrementalMerkleVoucherContainer.getDEPTH());
// The root of the tree at this point is expected to be the root of the
// empty tree.
Assert.assertEquals(PedersenHash2String(tree.root()),
PedersenHash2String(IncrementalMerkleTreeContainer.emptyRoot()));
- try {
- tree.last();
- Assert.fail("The tree doesn't have a 'last' element added since it's blank.");
- } catch (Exception ex) {
- System.out.println(ex.getMessage());
- }
+ ZksnarkException noCursor = Assert.assertThrows(ZksnarkException.class, tree::last);
+ Assert.assertEquals("tree has no cursor", noCursor.getMessage());
// The tree is empty.
Assert.assertEquals(0, tree.size());
@@ -106,8 +103,6 @@ public void testComplexTreePath() throws Exception {
// Witness here
witnesses.add(tree.toVoucher().getVoucherCapsule());
- System.out.println("i=" + i + ", depth is: " + IncrementalMerkleVoucherContainer.getDEPTH());
-
PedersenHashCapsule test_commitment = new PedersenHashCapsule();
byte[] bytes = ByteArray.fromHexString(commitment_tests.getString(i));
ByteUtil.reverse(bytes);
@@ -129,18 +124,14 @@ public void testComplexTreePath() throws Exception {
// Append the same commitment to all the witnesses
wit.toMerkleVoucherContainer().append(test_commitment.getInstance());
if (first) {
- try {
- wit.toMerkleVoucherContainer().path();
- Assert.fail("The first witness can never form a path");
- } catch (Exception ex) {
- System.out.println(ex.getMessage());
- }
- try {
- wit.toMerkleVoucherContainer().element();
- Assert.fail("The first witness can never form a path");
- } catch (Exception ex) {
- System.out.println(ex.getMessage());
- }
+ ZksnarkException noPath = Assert.assertThrows(ZksnarkException.class,
+ () -> wit.toMerkleVoucherContainer().path());
+ Assert.assertEquals(
+ "can't create an authentication path for the beginning of the tree",
+ noPath.getMessage());
+ ZksnarkException noElement = Assert.assertThrows(ZksnarkException.class,
+ () -> wit.toMerkleVoucherContainer().element());
+ Assert.assertEquals("tree has no cursor", noElement.getMessage());
} else {
MerklePath path = wit.toMerkleVoucherContainer().path();
Assert.assertEquals(path_tests.getString(path_i++), ByteArray.toHexString(path.encode()));
@@ -151,19 +142,14 @@ public void testComplexTreePath() throws Exception {
first = false;
}
}
- try {
- tree.append(new PedersenHashCapsule().getInstance());
- Assert.fail("Tree should be full now");
- } catch (Exception ex) {
- System.out.println(ex.getMessage());
- }
+ ZksnarkException fullTree = Assert.assertThrows(ZksnarkException.class,
+ () -> tree.append(new PedersenHashCapsule().getInstance()));
+ Assert.assertEquals("tree is full", fullTree.getMessage());
for (IncrementalMerkleVoucherCapsule wit : witnesses) {
- try {
- wit.toMerkleVoucherContainer().append(new PedersenHashCapsule().getInstance());
- Assert.fail("Tree should be full now");
- } catch (Exception ex) {
- System.out.println(ex.getMessage());
- }
+ ZksnarkException fullWitness = Assert.assertThrows(ZksnarkException.class,
+ () -> wit.toMerkleVoucherContainer()
+ .append(new PedersenHashCapsule().getInstance()));
+ Assert.assertEquals("tree is full", fullWitness.getMessage());
}
IncrementalMerkleTreeContainer.setDEPTH(32);
diff --git a/framework/src/test/java/org/tron/core/zksnark/SendCoinShieldTest.java b/framework/src/test/java/org/tron/core/zksnark/SendCoinShieldTest.java
index 08de83ca8bf..3026b660dce 100644
--- a/framework/src/test/java/org/tron/core/zksnark/SendCoinShieldTest.java
+++ b/framework/src/test/java/org/tron/core/zksnark/SendCoinShieldTest.java
@@ -130,6 +130,9 @@ public static void initZksnarkParams() {
*/
@Before
public void init() {
+ // Shielded validation reads and mutates this global store value. Reset it for every test so
+ // negative cases reach the proof check they are intended to exercise regardless of order.
+ dbManager.getDynamicPropertiesStore().saveTotalShieldedPoolValue(1000 * 1000000L);
if (init) {
return;
}
@@ -159,11 +162,15 @@ private void addZeroValueOutputNote(ZenTransactionBuilder builder) throws Zksnar
SpendingKey spendingKey = SpendingKey.random();
FullViewingKey fullViewingKey = spendingKey.fullViewingKey();
IncomingViewingKey incomingViewingKey = fullViewingKey.inViewingKey();
- Optional optional = incomingViewingKey.address(DiversifierT.random());
- if (optional.isPresent()) {
- PaymentAddress paymentAddress = optional.get();
- builder.addOutput(DEFAULT_OVK, paymentAddress, 0, "just for decode for ovk".getBytes());
- }
+ PaymentAddress paymentAddress = requirePaymentAddress(
+ incomingViewingKey, DiversifierT.random());
+ builder.addOutput(DEFAULT_OVK, paymentAddress, 0, "just for decode for ovk".getBytes());
+ }
+
+ private PaymentAddress requirePaymentAddress(
+ IncomingViewingKey incomingViewingKey, DiversifierT diversifier) throws ZksnarkException {
+ return incomingViewingKey.address(diversifier)
+ .orElseThrow(() -> new AssertionError("Failed to derive a payment address"));
}
@Test
@@ -177,9 +184,8 @@ public void testPathMock() throws ZksnarkException {
List index = Lists.newArrayList(Arrays.asList(indexArray));
MerklePath path = new MerklePath(authenticationPath, index);
byte[] encode = path.encode();
- String hexString = ByteArray.toHexString(encode);
- System.out.print(hexString);
- Assert.assertNotNull(hexString);
+ Assert.assertEquals("0601a801a801a801a801a801a82a00000000000000",
+ ByteArray.toHexString(encode));
}
private PedersenHash String2PedersenHash(String str) {
@@ -231,9 +237,8 @@ public void testStringRevert() {
byte[] bytes = ByteArray
.fromHexString("6c030e6d7460f91668cc842ceb78cdb54470469e78cd59cf903d3a6e1aa03e7c");
ByteUtil.reverse(bytes);
- String hexString = ByteArray.toHexString(bytes);
- System.out.println("testStringRevert------" + hexString);
- Assert.assertNotNull(hexString);
+ Assert.assertEquals("7c3ea01a6e3a3d90cf59cd789e467044b5cd78eb2c84cc6816f960746d0e036c",
+ ByteArray.toHexString(bytes));
}
@Test
@@ -254,19 +259,24 @@ public void testGenerateSpendProof() throws Exception {
IncomingViewingKey incomingViewingKey = fullViewingKey.inViewingKey();
- Optional op = incomingViewingKey.address(diversifierT);
- if (op.isPresent()) {
- Note note = new Note(op.get(), 100);
- note.setRcm(ByteArray
- .fromHexString("bf4b2042e3e8c4a0b390e407a79a0b46e36eff4f7bb54b2349dbb0046ee21e02"));
-
- IncrementalMerkleVoucherContainer voucher = createComplexMerkleVoucherContainer(note.cm());
+ PaymentAddress paymentAddress = requirePaymentAddress(incomingViewingKey, diversifierT);
+ Note note = new Note(paymentAddress, 100);
+ note.setRcm(ByteArray
+ .fromHexString("bf4b2042e3e8c4a0b390e407a79a0b46e36eff4f7bb54b2349dbb0046ee21e02"));
- byte[] anchor = voucher.root().getContent().toByteArray();
- SpendDescriptionInfo spend = new SpendDescriptionInfo(expsk, note, anchor, voucher);
- long ctx = JLibrustzcash.librustzcashSaplingProvingCtxInit();
- SpendDescriptionCapsule sdesc = builder.generateSpendProof(spend, ctx);
- Assert.assertNotNull(sdesc);
+ IncrementalMerkleVoucherContainer voucher = createComplexMerkleVoucherContainer(note.cm());
+ byte[] anchor = voucher.root().getContent().toByteArray();
+ SpendDescriptionInfo spend = new SpendDescriptionInfo(expsk, note, anchor, voucher);
+ long ctx = JLibrustzcash.librustzcashSaplingProvingCtxInit();
+ try {
+ SpendDescriptionCapsule spendDescription = builder.generateSpendProof(spend, ctx);
+ Assert.assertEquals(32, spendDescription.getValueCommitment().size());
+ Assert.assertEquals(32, spendDescription.getAnchor().size());
+ Assert.assertEquals(32, spendDescription.getNullifier().size());
+ Assert.assertEquals(32, spendDescription.getRk().size());
+ Assert.assertEquals(192, spendDescription.getZkproof().size());
+ } finally {
+ JLibrustzcash.librustzcashSaplingProvingCtxFree(ctx);
}
}
@@ -277,13 +287,18 @@ public void generateOutputProof() throws ZksnarkException {
FullViewingKey fullViewingKey = spendingKey.fullViewingKey();
IncomingViewingKey incomingViewingKey = fullViewingKey.inViewingKey();
- Optional optional = incomingViewingKey.address(new DiversifierT());
- if (optional.isPresent()) {
- PaymentAddress paymentAddress = optional.get();
- Assert.assertNotNull(paymentAddress);
- long ctx = JLibrustzcash.librustzcashSaplingProvingCtxInit();
+ PaymentAddress paymentAddress = requirePaymentAddress(
+ incomingViewingKey, new DiversifierT());
+ long ctx = JLibrustzcash.librustzcashSaplingProvingCtxInit();
+ try {
builder.addOutput(fullViewingKey.getOvk(), paymentAddress, 4000, new byte[512]);
- builder.generateOutputProof(builder.getReceives().get(0), ctx);
+ ReceiveDescriptionCapsule output = builder
+ .generateOutputProof(builder.getReceives().get(0), ctx);
+ Assert.assertEquals(32, output.getValueCommitment().size());
+ Assert.assertEquals(32, output.getCm().size());
+ Assert.assertEquals(32, output.getEphemeralKey().size());
+ Assert.assertEquals(192, output.getZkproof().size());
+ } finally {
JLibrustzcash.librustzcashSaplingProvingCtxFree(ctx);
}
}
@@ -294,26 +309,27 @@ public void verifyOutputProof() throws ZksnarkException {
SpendingKey spendingKey = SpendingKey.random();
FullViewingKey fullViewingKey = spendingKey.fullViewingKey();
IncomingViewingKey incomingViewingKey = fullViewingKey.inViewingKey();
- Optional optional = incomingViewingKey.address(new DiversifierT());
- if (optional.isPresent()) {
- PaymentAddress paymentAddress = optional.get();
- Assert.assertNotNull(paymentAddress);
- long ctx = JLibrustzcash.librustzcashSaplingProvingCtxInit();
+ PaymentAddress paymentAddress = requirePaymentAddress(
+ incomingViewingKey, new DiversifierT());
+ long provingContext = JLibrustzcash.librustzcashSaplingProvingCtxInit();
+ ReceiveDescriptionCapsule capsule;
+ try {
builder.addOutput(fullViewingKey.getOvk(), paymentAddress, 4000, new byte[512]);
- ReceiveDescriptionCapsule capsule = builder
- .generateOutputProof(builder.getReceives().get(0), ctx);
- JLibrustzcash.librustzcashSaplingProvingCtxFree(ctx);
- ReceiveDescription receiveDescription = capsule.getInstance();
- ctx = JLibrustzcash.librustzcashSaplingVerificationCtxInit();
- if (!JLibrustzcash.librustzcashSaplingCheckOutput(
- new CheckOutputParams(ctx, receiveDescription.getValueCommitment().toByteArray(),
+ capsule = builder.generateOutputProof(builder.getReceives().get(0), provingContext);
+ } finally {
+ JLibrustzcash.librustzcashSaplingProvingCtxFree(provingContext);
+ }
+ ReceiveDescription receiveDescription = capsule.getInstance();
+ long verificationContext = JLibrustzcash.librustzcashSaplingVerificationCtxInit();
+ try {
+ Assert.assertTrue(JLibrustzcash.librustzcashSaplingCheckOutput(
+ new CheckOutputParams(
+ verificationContext, receiveDescription.getValueCommitment().toByteArray(),
receiveDescription.getNoteCommitment().toByteArray(),
receiveDescription.getEpk().toByteArray(),
- receiveDescription.getZkproof().toByteArray()))) {
- JLibrustzcash.librustzcashSaplingVerificationCtxFree(ctx);
- throw new RuntimeException("librustzcashSaplingCheckOutput error");
- }
- JLibrustzcash.librustzcashSaplingVerificationCtxFree(ctx);
+ receiveDescription.getZkproof().toByteArray())));
+ } finally {
+ JLibrustzcash.librustzcashSaplingVerificationCtxFree(verificationContext);
}
}
@@ -327,11 +343,10 @@ public void testDecryptReceiveWithIvk() throws ZksnarkException {
FullViewingKey fullViewingKey = spendingKey.fullViewingKey();
IncomingViewingKey incomingViewingKey = fullViewingKey.inViewingKey();
- Optional optional = incomingViewingKey.address(new DiversifierT());
- if (optional.isPresent()) {
- PaymentAddress paymentAddress = optional.get();
-
- long ctx = JLibrustzcash.librustzcashSaplingProvingCtxInit();
+ PaymentAddress paymentAddress = requirePaymentAddress(
+ incomingViewingKey, new DiversifierT());
+ long ctx = JLibrustzcash.librustzcashSaplingProvingCtxInit();
+ try {
byte[] memo = org.tron.keystore.Wallet.generateRandomBytes(512);
builder.addOutput(fullViewingKey.getOvk(), paymentAddress, 4000, memo);
@@ -340,20 +355,13 @@ public void testDecryptReceiveWithIvk() throws ZksnarkException {
.generateOutputProof(output, ctx);
ReceiveDescription receiveDescription = receiveDescriptionCapsule.getInstance();
- Optional ret1 = Note.decrypt(receiveDescription.getCEnc().toByteArray(),//ciphertext
+ Note noteText = Note.decrypt(receiveDescription.getCEnc().toByteArray(),//ciphertext
fullViewingKey.inViewingKey().getValue(), receiveDescription.getEpk().toByteArray(),//epk
receiveDescription.getNoteCommitment().toByteArray() //cm
- );
-
- Assert.assertTrue(ret1.isPresent());
-
- Note noteText = ret1.get();
+ ).orElseThrow(() -> new AssertionError("Failed to decrypt note with ivk"));
byte[] pkD = new byte[32];
- if (!JLibrustzcash.librustzcashIvkToPkd(
- new IvkToPkdParams(incomingViewingKey.getValue(), noteText.getD().getData(), pkD))) {
- JLibrustzcash.librustzcashSaplingProvingCtxFree(ctx);
- return;
- }
+ Assert.assertTrue(JLibrustzcash.librustzcashIvkToPkd(
+ new IvkToPkdParams(incomingViewingKey.getValue(), noteText.getD().getData(), pkD)));
Assert.assertArrayEquals(paymentAddress.getPkD(), pkD);
Assert.assertEquals(4000, noteText.getValue());
@@ -365,7 +373,10 @@ public void testDecryptReceiveWithIvk() throws ZksnarkException {
GrpcAPI.Note grpcAPINote = GrpcAPI.Note.newBuilder().setPaymentAddress(paymentAddressStr)
.setValue(noteText.getValue()).setRcm(ByteString.copyFrom(noteText.getRcm()))
.setMemo(ByteString.copyFrom(noteText.getMemo())).build();
-
+ Assert.assertEquals(4000, grpcAPINote.getValue());
+ Assert.assertEquals(paymentAddressStr, grpcAPINote.getPaymentAddress());
+ Assert.assertEquals(ByteString.copyFrom(memo), grpcAPINote.getMemo());
+ } finally {
JLibrustzcash.librustzcashSaplingProvingCtxFree(ctx);
}
}
@@ -393,9 +404,14 @@ public void testDecryptReceiveWithOvk() throws Exception {
// generate output proof
ZenTransactionBuilder builder2 = new ZenTransactionBuilder();
long ctx = JLibrustzcash.librustzcashSaplingProvingCtxInit();
- builder2.addOutput(fullViewingKey.getOvk(), paymentAddress2, 10000, new byte[512]);
- ZenTransactionBuilder.ReceiveDescriptionInfo output = builder2.getReceives().get(0);
- ReceiveDescriptionCapsule receiveDescriptionCapsule = builder2.generateOutputProof(output, ctx);
+ ReceiveDescriptionCapsule receiveDescriptionCapsule;
+ try {
+ builder2.addOutput(fullViewingKey.getOvk(), paymentAddress2, 10000, new byte[512]);
+ ZenTransactionBuilder.ReceiveDescriptionInfo output = builder2.getReceives().get(0);
+ receiveDescriptionCapsule = builder2.generateOutputProof(output, ctx);
+ } finally {
+ JLibrustzcash.librustzcashSaplingProvingCtxFree(ctx);
+ }
ReceiveDescription receiveDescription = receiveDescriptionCapsule.getInstance();
byte[] pkd = paymentAddress2.getPkD();
@@ -408,50 +424,34 @@ public void testDecryptReceiveWithOvk() throws Exception {
byte[] cmuOpt = note.cm();
Assert.assertNotNull(cmuOpt);
- Optional optional = note.encrypt(pkd);
- if (optional.isPresent()) {
- NotePlaintextEncryptionResult enc = optional.get();
- NoteEncryption encryptor = enc.getNoteEncryption();
- OutgoingPlaintext outgoingPlaintext = new OutgoingPlaintext(
- note.getPkD(), encryptor.getEsk());
- // encrypt with ovk
- Encryption.OutCiphertext outCiphertext = outgoingPlaintext
- .encrypt(fullViewingKey.getOvk(), receiveDescription.getValueCommitment().toByteArray(),
- receiveDescription.getNoteCommitment().toByteArray(), encryptor);
-
- // get pkD, esk from decryption of c_out with ovk
- Optional ret2 = OutgoingPlaintext
- .decrypt(outCiphertext, fullViewingKey.getOvk(),
- receiveDescription.getValueCommitment().toByteArray(),
- receiveDescription.getNoteCommitment().toByteArray(), encryptor.getEpk());
-
- if (ret2.isPresent()) {
- OutgoingPlaintext decryptedOutgoingPlaintext = ret2.get();
- Assert.assertArrayEquals(decryptedOutgoingPlaintext.getPkD(), outgoingPlaintext.getPkD());
- Assert.assertArrayEquals(decryptedOutgoingPlaintext.getEsk(), outgoingPlaintext.getEsk());
-
- //decrypt c_enc with pkd、esk
- Encryption.EncCiphertext ciphertext = new Encryption.EncCiphertext();
- ciphertext.setData(enc.getEncCiphertext());
- Optional foo = Note
- .decrypt(ciphertext, encryptor.getEpk(), decryptedOutgoingPlaintext.getEsk(),
- decryptedOutgoingPlaintext.getPkD(), cmuOpt);
-
- if (foo.isPresent()) {
- Note bar = foo.get();
- //verify result
- Assert.assertEquals(4000, bar.getValue());
- Assert.assertArrayEquals(memo, bar.getMemo());
- } else {
- JLibrustzcash.librustzcashSaplingProvingCtxFree(ctx);
- Assert.fail();
- }
- } else {
- JLibrustzcash.librustzcashSaplingProvingCtxFree(ctx);
- Assert.fail();
- }
- JLibrustzcash.librustzcashSaplingProvingCtxFree(ctx);
- }
+ NotePlaintextEncryptionResult enc = note.encrypt(pkd)
+ .orElseThrow(() -> new AssertionError("Failed to encrypt note"));
+ NoteEncryption encryptor = enc.getNoteEncryption();
+ OutgoingPlaintext outgoingPlaintext = new OutgoingPlaintext(
+ note.getPkD(), encryptor.getEsk());
+ // encrypt with ovk
+ Encryption.OutCiphertext outCiphertext = outgoingPlaintext
+ .encrypt(fullViewingKey.getOvk(), receiveDescription.getValueCommitment().toByteArray(),
+ receiveDescription.getNoteCommitment().toByteArray(), encryptor);
+
+ // get pkD, esk from decryption of c_out with ovk
+ OutgoingPlaintext decryptedOutgoingPlaintext = OutgoingPlaintext
+ .decrypt(outCiphertext, fullViewingKey.getOvk(),
+ receiveDescription.getValueCommitment().toByteArray(),
+ receiveDescription.getNoteCommitment().toByteArray(), encryptor.getEpk())
+ .orElseThrow(() -> new AssertionError("Failed to decrypt outgoing plaintext with ovk"));
+ Assert.assertArrayEquals(decryptedOutgoingPlaintext.getPkD(), outgoingPlaintext.getPkD());
+ Assert.assertArrayEquals(decryptedOutgoingPlaintext.getEsk(), outgoingPlaintext.getEsk());
+
+ // Decrypt c_enc with pkD and esk.
+ Encryption.EncCiphertext ciphertext = new Encryption.EncCiphertext();
+ ciphertext.setData(enc.getEncCiphertext());
+ Note decryptedNote = Note
+ .decrypt(ciphertext, encryptor.getEpk(), decryptedOutgoingPlaintext.getEsk(),
+ decryptedOutgoingPlaintext.getPkD(), cmuOpt)
+ .orElseThrow(() -> new AssertionError("Failed to decrypt note with outgoing plaintext"));
+ Assert.assertEquals(4000, decryptedNote.getValue());
+ Assert.assertArrayEquals(memo, decryptedNote.getMemo());
}
@Test
@@ -461,8 +461,6 @@ public void pushShieldedTransactionAndDecryptWithIvk()
ReceiptCheckErrException, DupTransactionException, VMIllegalException,
ValidateSignatureException, BadItemException, ContractExeException,
AccountResourceInsufficientException, InvalidProtocolBufferException, ZksnarkException {
- long ctx = JLibrustzcash.librustzcashSaplingProvingCtxInit();
-
dbManager.getDynamicPropertiesStore().saveAllowShieldedTransaction(1);
dbManager.getDynamicPropertiesStore().saveTotalShieldedPoolValue(1000 * 1000000L);
ZenTransactionBuilder builder = new ZenTransactionBuilder(wallet);
@@ -484,55 +482,44 @@ public void pushShieldedTransactionAndDecryptWithIvk()
SpendingKey spendingKey = SpendingKey.random();
FullViewingKey fullViewingKey = spendingKey.fullViewingKey();
IncomingViewingKey incomingViewingKey = fullViewingKey.inViewingKey();
- Optional optional = incomingViewingKey.address(new DiversifierT());
- if (optional.isPresent()) {
- PaymentAddress paymentAddress = optional.get();
- byte[] memo = org.tron.keystore.Wallet.generateRandomBytes(512);
- builder.addOutput(senderOvk, paymentAddress,
- 1000 * 1000000L - wallet.getShieldedTransactionFee(), memo);
-
- TransactionCapsule transactionCap = builder.build();
-
- boolean ok = dbManager.pushTransaction(transactionCap);
- Assert.assertTrue(ok);
-
- // add here
- byte[] ivk = incomingViewingKey.getValue();
- Protocol.Transaction t = transactionCap.getInstance();
+ PaymentAddress paymentAddress = requirePaymentAddress(
+ incomingViewingKey, new DiversifierT());
+ byte[] memo = org.tron.keystore.Wallet.generateRandomBytes(512);
+ builder.addOutput(senderOvk, paymentAddress,
+ 1000 * 1000000L - wallet.getShieldedTransactionFee(), memo);
- for (org.tron.protos.Protocol.Transaction.Contract c : t.getRawData().getContractList()) {
- if (c.getType() != ContractType.ShieldedTransferContract) {
- continue;
- }
- ShieldedTransferContract stContract = c.getParameter()
- .unpack(ShieldedTransferContract.class);
- ReceiveDescription receiveDescription = stContract.getReceiveDescription(0);
-
- Optional ret1 = Note.decrypt(receiveDescription.getCEnc().toByteArray(),//ciphertext
- ivk, receiveDescription.getEpk().toByteArray(),//epk
- receiveDescription.getNoteCommitment().toByteArray() //cm
- );
-
- if (ret1.isPresent()) {
- Note noteText = ret1.get();
- byte[] pkD = new byte[32];
- if (!JLibrustzcash.librustzcashIvkToPkd(
- new IvkToPkdParams(incomingViewingKey.getValue(), noteText.getD().getData(), pkD))) {
- JLibrustzcash.librustzcashSaplingProvingCtxFree(ctx);
- return;
- }
- Assert.assertArrayEquals(paymentAddress.getPkD(), pkD);
- Assert.assertEquals(1000 * 1000000L - wallet.getShieldedTransactionFee(),
- noteText.getValue());
- Assert.assertArrayEquals(memo, noteText.getMemo());
- } else {
- Assert.fail();
- }
+ TransactionCapsule transactionCap = builder.build();
+ Assert.assertTrue(dbManager.pushTransaction(transactionCap));
+
+ byte[] ivk = incomingViewingKey.getValue();
+ Protocol.Transaction transaction = transactionCap.getInstance();
+ int shieldedContractCount = 0;
+ for (org.tron.protos.Protocol.Transaction.Contract contract
+ : transaction.getRawData().getContractList()) {
+ if (contract.getType() != ContractType.ShieldedTransferContract) {
+ continue;
}
- // end here
- JLibrustzcash.librustzcashSaplingProvingCtxFree(ctx);
- Assert.assertTrue(ok);
+ shieldedContractCount++;
+ ShieldedTransferContract shieldedTransfer = contract.getParameter()
+ .unpack(ShieldedTransferContract.class);
+ Assert.assertEquals(1, shieldedTransfer.getReceiveDescriptionCount());
+ ReceiveDescription receiveDescription = shieldedTransfer.getReceiveDescription(0);
+
+ Note decryptedNote = Note.decrypt(
+ receiveDescription.getCEnc().toByteArray(), ivk,
+ receiveDescription.getEpk().toByteArray(),
+ receiveDescription.getNoteCommitment().toByteArray())
+ .orElseThrow(() -> new AssertionError("Failed to decrypt pushed note with ivk"));
+ byte[] pkD = new byte[32];
+ Assert.assertTrue(JLibrustzcash.librustzcashIvkToPkd(
+ new IvkToPkdParams(
+ incomingViewingKey.getValue(), decryptedNote.getD().getData(), pkD)));
+ Assert.assertArrayEquals(paymentAddress.getPkD(), pkD);
+ Assert.assertEquals(1000 * 1000000L - wallet.getShieldedTransactionFee(),
+ decryptedNote.getValue());
+ Assert.assertArrayEquals(memo, decryptedNote.getMemo());
}
+ Assert.assertEquals(1, shieldedContractCount);
}
@Test
@@ -549,8 +536,6 @@ public void pushShieldedTransactionAndDecryptWithOvk()
ReceiptCheckErrException, DupTransactionException, VMIllegalException,
ValidateSignatureException, BadItemException, ContractExeException,
AccountResourceInsufficientException, InvalidProtocolBufferException, ZksnarkException {
- long ctx = JLibrustzcash.librustzcashSaplingProvingCtxInit();
-
dbManager.getDynamicPropertiesStore().saveAllowShieldedTransaction(1);
dbManager.getDynamicPropertiesStore().saveTotalShieldedPoolValue(1000 * 1000000L);
ZenTransactionBuilder builder = new ZenTransactionBuilder(wallet);
@@ -572,61 +557,49 @@ public void pushShieldedTransactionAndDecryptWithOvk()
SpendingKey spendingKey = SpendingKey.random();
FullViewingKey fullViewingKey = spendingKey.fullViewingKey();
IncomingViewingKey incomingViewingKey = fullViewingKey.inViewingKey();
- Optional optional = incomingViewingKey.address(new DiversifierT());
- if (optional.isPresent()) {
- PaymentAddress paymentAddress = optional.get();
- byte[] memo = org.tron.keystore.Wallet.generateRandomBytes(512);
- builder.addOutput(senderOvk, paymentAddress,
- 1000 * 1000000L - wallet.getShieldedTransactionFee(), memo);
+ PaymentAddress paymentAddress = requirePaymentAddress(
+ incomingViewingKey, new DiversifierT());
+ byte[] memo = org.tron.keystore.Wallet.generateRandomBytes(512);
+ builder.addOutput(senderOvk, paymentAddress,
+ 1000 * 1000000L - wallet.getShieldedTransactionFee(), memo);
- TransactionCapsule transactionCap = builder.build();
- boolean ok = dbManager.pushTransaction(transactionCap);
- Assert.assertTrue(ok);
-
- // add here
- Protocol.Transaction t = transactionCap.getInstance();
- for (org.tron.protos.Protocol.Transaction.Contract c : t.getRawData().getContractList()) {
- if (c.getType() != Protocol.Transaction.Contract.ContractType.ShieldedTransferContract) {
- continue;
- }
- ShieldedTransferContract stContract = c.getParameter()
- .unpack(ShieldedTransferContract.class);
- ReceiveDescription receiveDescription = stContract.getReceiveDescription(0);
-
- //first try to decrypt cOut with ovk, get pkd、esk
- Encryption.OutCiphertext cOut = new Encryption.OutCiphertext();
- cOut.setData(receiveDescription.getCOut().toByteArray());
- Optional notePlaintext = OutgoingPlaintext.decrypt(cOut,//ciphertext
- senderOvk, receiveDescription.getValueCommitment().toByteArray(), //cv
- receiveDescription.getNoteCommitment().toByteArray(), //cmu
- receiveDescription.getEpk().toByteArray() //epk
- );
-
- //then decrypt c_enc with pkd、esk, get decoded note == ciphertext
- if (notePlaintext.isPresent()) {
- OutgoingPlaintext decryptedOutgoingPlaintext = notePlaintext.get();
-
- Encryption.EncCiphertext ciphertext = new Encryption.EncCiphertext();
- ciphertext.setData(receiveDescription.getCEnc().toByteArray());
- Optional foo = Note.decrypt(ciphertext, receiveDescription.getEpk().toByteArray(),
- decryptedOutgoingPlaintext.getEsk(), decryptedOutgoingPlaintext.getPkD(),
- receiveDescription.getNoteCommitment().toByteArray());
-
- if (foo.isPresent()) {
- Note bar = foo.get();
- //verify result
- Assert.assertEquals(1000 * 1000000L - wallet.getShieldedTransactionFee(),
- bar.getValue());
- Assert.assertArrayEquals(memo, bar.getMemo());
- } else {
- Assert.fail();
- }
- }
+ TransactionCapsule transactionCap = builder.build();
+ Assert.assertTrue(dbManager.pushTransaction(transactionCap));
+
+ Protocol.Transaction transaction = transactionCap.getInstance();
+ int shieldedContractCount = 0;
+ for (org.tron.protos.Protocol.Transaction.Contract contract
+ : transaction.getRawData().getContractList()) {
+ if (contract.getType() != ContractType.ShieldedTransferContract) {
+ continue;
}
- // end here
- JLibrustzcash.librustzcashSaplingProvingCtxFree(ctx);
- Assert.assertTrue(ok);
+ shieldedContractCount++;
+ ShieldedTransferContract shieldedTransfer = contract.getParameter()
+ .unpack(ShieldedTransferContract.class);
+ Assert.assertEquals(1, shieldedTransfer.getReceiveDescriptionCount());
+ ReceiveDescription receiveDescription = shieldedTransfer.getReceiveDescription(0);
+
+ // First decrypt cOut with ovk to recover pkD and esk.
+ Encryption.OutCiphertext cOut = new Encryption.OutCiphertext();
+ cOut.setData(receiveDescription.getCOut().toByteArray());
+ OutgoingPlaintext outgoingPlaintext = OutgoingPlaintext.decrypt(
+ cOut, senderOvk, receiveDescription.getValueCommitment().toByteArray(),
+ receiveDescription.getNoteCommitment().toByteArray(),
+ receiveDescription.getEpk().toByteArray())
+ .orElseThrow(() -> new AssertionError("Failed to decrypt pushed cOut with ovk"));
+
+ // Then decrypt cEnc with the recovered pkD and esk.
+ Encryption.EncCiphertext ciphertext = new Encryption.EncCiphertext();
+ ciphertext.setData(receiveDescription.getCEnc().toByteArray());
+ Note decryptedNote = Note.decrypt(
+ ciphertext, receiveDescription.getEpk().toByteArray(), outgoingPlaintext.getEsk(),
+ outgoingPlaintext.getPkD(), receiveDescription.getNoteCommitment().toByteArray())
+ .orElseThrow(() -> new AssertionError("Failed to decrypt pushed cEnc"));
+ Assert.assertEquals(1000 * 1000000L - wallet.getShieldedTransactionFee(),
+ decryptedNote.getValue());
+ Assert.assertArrayEquals(memo, decryptedNote.getMemo());
}
+ Assert.assertEquals(1, shieldedContractCount);
}
private byte[] getHash() {
@@ -637,7 +610,6 @@ private byte[] getHash() {
@Ignore
@Test
public void checkZksnark() throws BadItemException, ZksnarkException {
- long ctx = JLibrustzcash.librustzcashSaplingProvingCtxInit();
// generate spend proof
dbManager.getDynamicPropertiesStore().saveAllowShieldedTransaction(1);
dbManager.getDynamicPropertiesStore().saveTotalShieldedPoolValue(4010 * 1000000L);
@@ -656,17 +628,14 @@ public void checkZksnark() throws BadItemException, ZksnarkException {
SpendingKey spendingKey = SpendingKey.random();
FullViewingKey fullViewingKey = spendingKey.fullViewingKey();
IncomingViewingKey incomingViewingKey = fullViewingKey.inViewingKey();
- Optional optional = incomingViewingKey.address(DiversifierT.random());
- if (optional.isPresent()) {
- PaymentAddress paymentAddress = optional.get();
- builder.addOutput(fullViewingKey.getOvk(), paymentAddress, 4000 * 1000000L, new byte[512]);
- TransactionCapsule transactionCap = builder.build();
- JLibrustzcash.librustzcashSaplingProvingCtxFree(ctx);
- boolean ret = ZksnarkClient.getInstance().checkZksnarkProof(transactionCap.getInstance(),
- getShieldTransactionHashIgnoreTypeException(transactionCap.getInstance()),
- 10 * 1000000);
- Assert.assertTrue(ret);
- }
+ PaymentAddress paymentAddress = requirePaymentAddress(
+ incomingViewingKey, DiversifierT.random());
+ builder.addOutput(fullViewingKey.getOvk(), paymentAddress, 4000 * 1000000L, new byte[512]);
+ TransactionCapsule transactionCap = builder.build();
+ boolean ret = ZksnarkClient.getInstance().checkZksnarkProof(transactionCap.getInstance(),
+ getShieldTransactionHashIgnoreTypeException(transactionCap.getInstance()),
+ 10 * 1000000);
+ Assert.assertTrue(ret);
}
@Test
@@ -685,55 +654,61 @@ public void testVerifySpendProof() throws BadItemException, ZksnarkException {
// SpendDescriptionInfo spend = builder.getSpends().get(0);
SpendDescriptionInfo spend = new SpendDescriptionInfo(expsk, note, anchor, voucher);
long proofContext = JLibrustzcash.librustzcashSaplingProvingCtxInit();
- SpendDescriptionCapsule spendDescriptionCapsule = builder
- .generateSpendProof(spend, proofContext);
- JLibrustzcash.librustzcashSaplingProvingCtxFree(proofContext);
+ SpendDescriptionCapsule spendDescriptionCapsule;
+ try {
+ spendDescriptionCapsule = builder.generateSpendProof(spend, proofContext);
+ } finally {
+ JLibrustzcash.librustzcashSaplingProvingCtxFree(proofContext);
+ }
byte[] result = new byte[64];
- JLibrustzcash.librustzcashSaplingSpendSig(
- new SpendSigParams(expsk.getAsk(), spend.getAlpha(), getHash(), result));
+ Assert.assertTrue(JLibrustzcash.librustzcashSaplingSpendSig(
+ new SpendSigParams(expsk.getAsk(), spend.getAlpha(), getHash(), result)));
long verifyContext = JLibrustzcash.librustzcashSaplingVerificationCtxInit();
- boolean ok = JLibrustzcash.librustzcashSaplingCheckSpend(new CheckSpendParams(verifyContext,
- spendDescriptionCapsule.getValueCommitment().toByteArray(),
- spendDescriptionCapsule.getAnchor().toByteArray(),
- spendDescriptionCapsule.getNullifier().toByteArray(),
- spendDescriptionCapsule.getRk().toByteArray(),
- spendDescriptionCapsule.getZkproof().toByteArray(), result, getHash()));
- JLibrustzcash.librustzcashSaplingVerificationCtxFree(verifyContext);
- Assert.assertTrue(ok);
+ try {
+ Assert.assertTrue(JLibrustzcash.librustzcashSaplingCheckSpend(
+ new CheckSpendParams(verifyContext,
+ spendDescriptionCapsule.getValueCommitment().toByteArray(),
+ spendDescriptionCapsule.getAnchor().toByteArray(),
+ spendDescriptionCapsule.getNullifier().toByteArray(),
+ spendDescriptionCapsule.getRk().toByteArray(),
+ spendDescriptionCapsule.getZkproof().toByteArray(), result, getHash())));
+ } finally {
+ JLibrustzcash.librustzcashSaplingVerificationCtxFree(verifyContext);
+ }
}
@Test
public void saplingBindingSig() throws BadItemException, ZksnarkException {
long ctx = JLibrustzcash.librustzcashSaplingProvingCtxInit();
- // generate spend proof
- ZenTransactionBuilder builder = new ZenTransactionBuilder(wallet);
- SpendingKey sk = SpendingKey
- .decode("ff2c06269315333a9207f817d2eca0ac555ca8f90196976324c7756504e7c9ee");
- ExpandedSpendingKey expsk = sk.expandedSpendingKey();
- PaymentAddress address = sk.defaultAddress();
- Note note = new Note(address, 4010 * 1000000L);
- IncrementalMerkleVoucherContainer voucher = createSimpleMerkleVoucherContainer(note.cm());
- byte[] anchor = voucher.root().getContent().toByteArray();
- builder.addSpend(expsk, note, anchor, voucher);
- builder.generateSpendProof(builder.getSpends().get(0), ctx);
- // generate output proof
- SpendingKey spendingKey = SpendingKey.random();
- FullViewingKey fullViewingKey = spendingKey.fullViewingKey();
- IncomingViewingKey incomingViewingKey = fullViewingKey.inViewingKey();
- Optional optional = incomingViewingKey.address(new DiversifierT());
- if (optional.isPresent()) {
- PaymentAddress paymentAddress = optional.get();
+ try {
+ // generate spend proof
+ ZenTransactionBuilder builder = new ZenTransactionBuilder(wallet);
+ SpendingKey sk = SpendingKey
+ .decode("ff2c06269315333a9207f817d2eca0ac555ca8f90196976324c7756504e7c9ee");
+ ExpandedSpendingKey expsk = sk.expandedSpendingKey();
+ PaymentAddress address = sk.defaultAddress();
+ Note note = new Note(address, 4010 * 1000000L);
+ IncrementalMerkleVoucherContainer voucher = createSimpleMerkleVoucherContainer(note.cm());
+ byte[] anchor = voucher.root().getContent().toByteArray();
+ builder.addSpend(expsk, note, anchor, voucher);
+ builder.generateSpendProof(builder.getSpends().get(0), ctx);
+ // generate output proof
+ SpendingKey spendingKey = SpendingKey.random();
+ FullViewingKey fullViewingKey = spendingKey.fullViewingKey();
+ PaymentAddress paymentAddress = requirePaymentAddress(
+ fullViewingKey.inViewingKey(), new DiversifierT());
builder.addOutput(fullViewingKey.getOvk(), paymentAddress, 4000 * 1000000L, new byte[512]);
builder.generateOutputProof(builder.getReceives().get(0), ctx);
// test create binding sig
byte[] bindingSig = new byte[64];
- boolean ret = JLibrustzcash.librustzcashSaplingBindingSig(
- new BindingSigParams(ctx, builder.getValueBalance(), getHash(), bindingSig));
+ Assert.assertTrue(JLibrustzcash.librustzcashSaplingBindingSig(
+ new BindingSigParams(ctx, builder.getValueBalance(), getHash(), bindingSig)));
+ Assert.assertFalse(Arrays.equals(new byte[64], bindingSig));
+ } finally {
JLibrustzcash.librustzcashSaplingProvingCtxFree(ctx);
- Assert.assertTrue(ret);
}
}
@@ -744,7 +719,6 @@ public void pushShieldedTransaction()
TaposException, TransactionExpirationException, ReceiptCheckErrException,
DupTransactionException, VMIllegalException, ValidateSignatureException, BadItemException,
ContractExeException, AccountResourceInsufficientException, ZksnarkException {
- long ctx = JLibrustzcash.librustzcashSaplingProvingCtxInit();
// generate spend proof
dbManager.getDynamicPropertiesStore().saveAllowShieldedTransaction(1);
dbManager.getDynamicPropertiesStore().saveTotalShieldedPoolValue(4010 * 1000000L);
@@ -762,22 +736,16 @@ public void pushShieldedTransaction()
// generate output proof
SpendingKey spendingKey = SpendingKey.random();
FullViewingKey fullViewingKey = spendingKey.fullViewingKey();
- IncomingViewingKey incomingViewingKey = fullViewingKey.inViewingKey();
- Optional optional = incomingViewingKey.address(DiversifierT.random());
- if (optional.isPresent()) {
- PaymentAddress paymentAddress = optional.get();
- builder.addOutput(fullViewingKey.getOvk(), paymentAddress,
- 4010 * 1000000L - wallet.getShieldedTransactionFee(), new byte[512]);
- TransactionCapsule transactionCap = builder.build();
- boolean ok = dbManager.pushTransaction(transactionCap);
- JLibrustzcash.librustzcashSaplingProvingCtxFree(ctx);
- Assert.assertTrue(ok);
- }
+ PaymentAddress paymentAddress = requirePaymentAddress(
+ fullViewingKey.inViewingKey(), DiversifierT.random());
+ builder.addOutput(fullViewingKey.getOvk(), paymentAddress,
+ 4010 * 1000000L - wallet.getShieldedTransactionFee(), new byte[512]);
+ TransactionCapsule transactionCap = builder.build();
+ Assert.assertTrue(dbManager.pushTransaction(transactionCap));
}
@Test
public void finalCheck() throws BadItemException, ZksnarkException {
- long ctx = JLibrustzcash.librustzcashSaplingProvingCtxInit();
ZenTransactionBuilder builder = new ZenTransactionBuilder(wallet);
// generate spend proof
SpendingKey sk = SpendingKey
@@ -788,54 +756,61 @@ public void finalCheck() throws BadItemException, ZksnarkException {
IncrementalMerkleVoucherContainer voucher = createSimpleMerkleVoucherContainer(note.cm());
byte[] anchor = voucher.root().getContent().toByteArray();
builder.addSpend(expsk, note, anchor, voucher);
- SpendDescriptionCapsule spendDescriptionCapsule = builder
- .generateSpendProof(builder.getSpends().get(0), ctx);
// generate output proof
SpendingKey spendingKey = SpendingKey.random();
FullViewingKey fullViewingKey = spendingKey.fullViewingKey();
- IncomingViewingKey incomingViewingKey = fullViewingKey.inViewingKey();
- Optional optional = incomingViewingKey.address(new DiversifierT());
- if (optional.isPresent()) {
- PaymentAddress paymentAddress = optional.get();
+ PaymentAddress paymentAddress = requirePaymentAddress(
+ fullViewingKey.inViewingKey(), new DiversifierT());
+
+ SpendDescriptionCapsule spendDescriptionCapsule;
+ ReceiveDescriptionCapsule receiveDescriptionCapsule;
+ byte[] bindingSig = new byte[64];
+ long provingContext = JLibrustzcash.librustzcashSaplingProvingCtxInit();
+ try {
+ spendDescriptionCapsule = builder
+ .generateSpendProof(builder.getSpends().get(0), provingContext);
builder.addOutput(fullViewingKey.getOvk(), paymentAddress, 4000 * 1000000L, new byte[512]);
- ReceiveDescriptionCapsule receiveDescriptionCapsule = builder
- .generateOutputProof(builder.getReceives().get(0), ctx);
+ receiveDescriptionCapsule = builder
+ .generateOutputProof(builder.getReceives().get(0), provingContext);
//create binding sig
- byte[] bindingSig = new byte[64];
- boolean ret = JLibrustzcash.librustzcashSaplingBindingSig(
- new BindingSigParams(ctx, builder.getValueBalance(), getHash(), bindingSig));
- JLibrustzcash.librustzcashSaplingProvingCtxFree(ctx);
- Assert.assertTrue(ret);
- // check spend
- ctx = JLibrustzcash.librustzcashSaplingVerificationCtxInit();
- byte[] result = new byte[64];
- JLibrustzcash.librustzcashSaplingSpendSig(
- new SpendSigParams(expsk.getAsk(), builder.getSpends().get(0).getAlpha(), getHash(),
- result));
+ Assert.assertTrue(JLibrustzcash.librustzcashSaplingBindingSig(
+ new BindingSigParams(
+ provingContext, builder.getValueBalance(), getHash(), bindingSig)));
+ } finally {
+ JLibrustzcash.librustzcashSaplingProvingCtxFree(provingContext);
+ }
+
+ byte[] spendSignature = new byte[64];
+ Assert.assertTrue(JLibrustzcash.librustzcashSaplingSpendSig(
+ new SpendSigParams(expsk.getAsk(), builder.getSpends().get(0).getAlpha(), getHash(),
+ spendSignature)));
+ long verificationContext = JLibrustzcash.librustzcashSaplingVerificationCtxInit();
+ try {
+ // check spend
SpendDescription spendDescription = spendDescriptionCapsule.getInstance();
- boolean ok;
- ok = JLibrustzcash.librustzcashSaplingCheckSpend(
- new CheckSpendParams(ctx, spendDescription.getValueCommitment().toByteArray(),
+ Assert.assertTrue(JLibrustzcash.librustzcashSaplingCheckSpend(
+ new CheckSpendParams(verificationContext,
+ spendDescription.getValueCommitment().toByteArray(),
spendDescription.getAnchor().toByteArray(),
spendDescription.getNullifier().toByteArray(), spendDescription.getRk().toByteArray(),
- spendDescription.getZkproof().toByteArray(), result, getHash()));
- Assert.assertTrue(ok);
+ spendDescription.getZkproof().toByteArray(), spendSignature, getHash())));
// check output
ReceiveDescription receiveDescription = receiveDescriptionCapsule.getInstance();
- ok = JLibrustzcash.librustzcashSaplingCheckOutput(
- new CheckOutputParams(ctx, receiveDescription.getValueCommitment().toByteArray(),
+ Assert.assertTrue(JLibrustzcash.librustzcashSaplingCheckOutput(
+ new CheckOutputParams(verificationContext,
+ receiveDescription.getValueCommitment().toByteArray(),
receiveDescription.getNoteCommitment().toByteArray(),
receiveDescription.getEpk().toByteArray(),
- receiveDescription.getZkproof().toByteArray()));
- Assert.assertTrue(ok);
+ receiveDescription.getZkproof().toByteArray())));
// final check
- ok = JLibrustzcash.librustzcashSaplingFinalCheck(
- new FinalCheckParams(ctx, builder.getValueBalance(), bindingSig, getHash()));
- Assert.assertTrue(ok);
- JLibrustzcash.librustzcashSaplingVerificationCtxFree(ctx);
+ Assert.assertTrue(JLibrustzcash.librustzcashSaplingFinalCheck(
+ new FinalCheckParams(
+ verificationContext, builder.getValueBalance(), bindingSig, getHash())));
+ } finally {
+ JLibrustzcash.librustzcashSaplingVerificationCtxFree(verificationContext);
}
}
@@ -870,42 +845,22 @@ private JSONArray readFile(String fileName) throws Exception {
@Test
public void testComputeCm() throws Exception {
byte[] result = new byte[32];
- if (!JLibrustzcash.librustzcashComputeCm(
+ Assert.assertTrue(JLibrustzcash.librustzcashComputeCm(
new ComputeCmParams((ByteArray.fromHexString("fc6eb90855700861de6639")), ByteArray
.fromHexString("1abfbf64bc4934aaf7f29b9fea995e5a16e654e63dbe07db0ef035499d216e19"),
9990000000L, ByteArray
.fromHexString("08e3a2ff1101b628147125b786c757b483f1cf7c309f8a647055bfb1ca819c02"),
- result))) {
- Assert.fail();
- } else {
- Assert.assertTrue(true);
- }
+ result)));
}
@Test
public void getSpendingKey() throws Exception {
SpendingKey sk = SpendingKey
.decode("0b862f0e70048551c08518ff49a19db027d62cdeeb2fa974db91c10e6ebcdc16");
- System.out.println(sk.encode());
- System.out.println(
- "sk.expandedSpendingKey()" + ByteArray.toHexString(sk.expandedSpendingKey().encode()));
- System.out.println("sk.fullViewKey()" + ByteArray.toHexString(sk.fullViewingKey().encode()));
- System.out
- .println("sk.ivk()" + ByteArray.toHexString(sk.fullViewingKey().inViewingKey().getValue()));
- System.out.println(
- "sk.defaultDiversifier:" + ByteArray.toHexString(sk.defaultDiversifier().getData()));
-
- System.out.println("sk.defaultAddress:" + ByteArray.toHexString(sk.defaultAddress().encode()));
-
- System.out.println("rcm:" + ByteArray.toHexString(Note.generateR()));
-
int count = 10;
for (int i = 0; i < count; i++) {
// new sk
- System.out.println("---- random " + i + " ----");
-
sk = SpendingKey.random();
- System.out.println("sk is: " + ByteArray.toHexString(sk.getValue()));
DiversifierT diversifierT = new DiversifierT();
byte[] d;
@@ -913,32 +868,16 @@ public void getSpendingKey() throws Exception {
d = org.tron.keystore.Wallet.generateRandomBytes(Constant.ZC_DIVERSIFIER_SIZE);
} while (!JLibrustzcash.librustzcashCheckDiversifier(d));
diversifierT.setData(d);
- System.out.println("d is: " + ByteArray.toHexString(d));
ExpandedSpendingKey expsk = sk.expandedSpendingKey();
- System.out.println("expsk-ask is: " + ByteArray.toHexString(expsk.getAsk()));
- System.out.println("expsk-nsk is: " + ByteArray.toHexString(expsk.getNsk()));
- System.out.println("expsk-ovk is: " + ByteArray.toHexString(expsk.getOvk()));
FullViewingKey fullViewingKey = expsk.fullViewingKey();
- System.out.println("fullviewkey-ak is: " + ByteArray.toHexString(fullViewingKey.getAk()));
- System.out.println("fullviewkey-nk is: " + ByteArray.toHexString(fullViewingKey.getNk()));
- System.out.println("fullviewkey-ovk is: " + ByteArray.toHexString(fullViewingKey.getOvk()));
IncomingViewingKey incomingViewingKey = fullViewingKey.inViewingKey();
- System.out.println("ivk is: " + ByteArray.toHexString(incomingViewingKey.getValue()));
Optional op = incomingViewingKey.address(diversifierT);
- System.out.println("pkD is: " + ByteArray.toHexString(op.get().getPkD()));
-
- byte[] rcm = Note.generateR();
- System.out.println("rcm is " + ByteArray.toHexString(rcm));
-
- byte[] alpha = Note.generateR();
- System.out.println("alpha is " + ByteArray.toHexString(alpha));
String address = KeyIo.encodePaymentAddress(op.get());
- System.out.println("saplingaddress is: " + address);
// check
PaymentAddress paymentAddress = KeyIo.decodePaymentAddress(address);
@@ -973,34 +912,16 @@ public void testTwoCMWithDiffSkInOneTx() throws Exception {
.putMerkleTreeIntoStore(anchor, voucher.getVoucherCapsule().getTree());
builder.addSpend(expsk1, note1, anchor, voucher);
- /*SpendingKey sk2 = SpendingKey.random();
- ExpandedSpendingKey expsk2 = sk2.expandedSpendingKey();
- PaymentAddress address2 = sk2.defaultAddress();
- Note note2 = new Note(address2, 100 * 1000000);
- PedersenHashCapsule compressCapsule2 = new PedersenHashCapsule();
- compressCapsule2.setContent(ByteString.copyFrom(note2.cm()));
- PedersenHash a2 = compressCapsule2.getInstance();
- tree.append(a2);
- IncrementalMerkleVoucherContainer voucher2 = tree.toVoucher();
- byte[] anchor2 = voucher2.root().getContent().toByteArray();
- dbManager
- .getMerkleContainer()
- .putMerkleTreeIntoStore(anchor2, voucher2.getVoucherCapsule().getTree());
- builder.addSpend(expsk2, note2, anchor2, voucher2);*/
-
// generate output proof
SpendingKey spendingKey = SpendingKey.random();
FullViewingKey fullViewingKey = spendingKey.fullViewingKey();
IncomingViewingKey incomingViewingKey = fullViewingKey.inViewingKey();
- PaymentAddress paymentAddress = incomingViewingKey.address(new DiversifierT()).get();
+ PaymentAddress paymentAddress = requirePaymentAddress(
+ incomingViewingKey, new DiversifierT());
builder.addOutput(fullViewingKey.getOvk(), paymentAddress,
1000 * 1000000L - wallet.getShieldedTransactionFee(), new byte[512]);
TransactionCapsule transactionCap = builder.build();
- //execute
- List actuator = ActuatorCreator.getINSTANCE().createActuator(transactionCap);
- actuator.get(0).validate();
- TransactionResultCapsule resultCapsule = new TransactionResultCapsule();
- actuator.get(0).execute(resultCapsule);
+ executeAndAssertTx(transactionCap);
}
private void executeTx(TransactionCapsule transactionCap) throws Exception {
@@ -1010,10 +931,20 @@ private void executeTx(TransactionCapsule transactionCap) throws Exception {
actuator.get(0).execute(resultCapsule);
}
+ private void executeAndAssertTx(TransactionCapsule transactionCap) throws Exception {
+ List actuators = ActuatorCreator.getINSTANCE().createActuator(transactionCap);
+ Assert.assertEquals(1, actuators.size());
+ Assert.assertTrue(actuators.get(0).validate());
+ TransactionResultCapsule resultCapsule = new TransactionResultCapsule();
+ Assert.assertTrue(actuators.get(0).execute(resultCapsule));
+ Assert.assertEquals(
+ Protocol.Transaction.Result.code.SUCESS, resultCapsule.getInstance().getRet());
+ }
+
@Test
public void testValueBalance() throws Exception {
dbManager.getDynamicPropertiesStore().saveAllowShieldedTransaction(1);
- //case 1, a public input, no input cm, an output cm, no public output
+ //case 1, a public input, no input cm, an output cm, no public output
{
ZenTransactionBuilder builder = new ZenTransactionBuilder(wallet);
String OWNER_ADDRESS =
@@ -1047,7 +978,7 @@ public void testValueBalance() throws Exception {
}
}
- //case 2, a public input, no input cm, an output cm, a public output
+ //case 2, a public input, no input cm, an output cm, a public output
{
ZenTransactionBuilder builder = new ZenTransactionBuilder(wallet);
@@ -1089,7 +1020,7 @@ public void testValueBalance() throws Exception {
}
}
- //case 3, no public input, an input cm, no output cm, a public output
+ //case 3, no public input, an input cm, no output cm, a public output
{
ZenTransactionBuilder builder = new ZenTransactionBuilder(wallet);
@@ -1134,7 +1065,7 @@ public void testValueBalance() throws Exception {
}
}
- //case 4, no public input, an input cm, an output cm, no public output
+ //case 4, no public input, an input cm, an output cm, no public output
{
ZenTransactionBuilder builder = new ZenTransactionBuilder(wallet);
@@ -1178,7 +1109,7 @@ public void testValueBalance() throws Exception {
}
}
- //case 5, no public input, an input cm, an output cm, a public output
+ //case 5, no public input, an input cm, an output cm, a public output
{
ZenTransactionBuilder builder = new ZenTransactionBuilder(wallet);
@@ -1231,10 +1162,12 @@ public void testValueBalance() throws Exception {
}
@Test
- public void TestCreateMultipleTxAtTheSameTime() throws Exception {
+ public void testExecuteMultipleShieldedTransactionVariants() throws Exception {
dbManager.getDynamicPropertiesStore().saveAllowShieldedTransaction(1);
+ dbManager.getDynamicPropertiesStore().saveTotalShieldedPoolValue(100_000_000L);
+ long shieldedTransactionFee = wallet.getShieldedTransactionFee();
List txList = Lists.newArrayList();
- //case 1, a public input, no input cm, an output cm, no public output
+ //case 1, a public input, no input cm, an output cm, no public output
{
ZenTransactionBuilder builder = new ZenTransactionBuilder(wallet);
String OWNER_ADDRESS =
@@ -1246,7 +1179,8 @@ public void TestCreateMultipleTxAtTheSameTime() throws Exception {
ownerCapsule.setInstance(ownerCapsule.getInstance().toBuilder()
.putAssetV2(CommonParameter.getInstance().zenTokenId, 220_000_000L).build());
dbManager.getAccountStore().put(ownerCapsule.getAddress().toByteArray(), ownerCapsule);
- builder.setTransparentInput(ByteArray.fromHexString(OWNER_ADDRESS), 210_000_000L);
+ builder.setTransparentInput(
+ ByteArray.fromHexString(OWNER_ADDRESS), 200_000_000L + shieldedTransactionFee);
// generate output proof
SpendingKey spendingKey = SpendingKey.random();
@@ -1259,22 +1193,23 @@ public void TestCreateMultipleTxAtTheSameTime() throws Exception {
transactionCap1.setBlockNum(1);
txList.add(transactionCap1);
- // 210_000_000L + 0L = 200_000_000L + 0L + 10_000_000L
+ // public input = shielded output + protocol fee
}
- //case 2, a public input, no input cm, an output cm, a public output
+ //case 2, a public input, no input cm, an output cm, a public output
{
ZenTransactionBuilder builder = new ZenTransactionBuilder(wallet);
String OWNER_ADDRESS =
- Wallet.getAddressPreFixString() + "548794500882809695a8a687866e76d4271a1abc";
+ Wallet.getAddressPreFixString() + "648794500882809695a8a687866e76d4271a1abc";
AccountCapsule ownerCapsule = new AccountCapsule(ByteString.copyFromUtf8("owner"),
ByteString.copyFrom(ByteArray.fromHexString(OWNER_ADDRESS)), AccountType.Normal,
230_000_000L);
ownerCapsule.setInstance(ownerCapsule.getInstance().toBuilder()
.putAssetV2(CommonParameter.getInstance().zenTokenId, 230_000_000L).build());
dbManager.getAccountStore().put(ownerCapsule.getAddress().toByteArray(), ownerCapsule);
- builder.setTransparentInput(ByteArray.fromHexString(OWNER_ADDRESS), 220_000_000L);
+ builder.setTransparentInput(
+ ByteArray.fromHexString(OWNER_ADDRESS), 210_000_000L + shieldedTransactionFee);
// generate output proof
SpendingKey spendingKey = SpendingKey.random();
@@ -1294,11 +1229,11 @@ public void TestCreateMultipleTxAtTheSameTime() throws Exception {
transactionCap1.setBlockNum(2);
txList.add(transactionCap1);
- //220_000_000L + 0L = 200_000_000L + 10_000_000L + 10_000_000L
+ // public input = shielded output + public output + protocol fee
}
- //case 3, no public input, an input cm, no output cm, a public output
+ //case 3, no public input, an input cm, a zero-value output cm, a public output
{
ZenTransactionBuilder builder = new ZenTransactionBuilder(wallet);
@@ -1306,7 +1241,7 @@ public void TestCreateMultipleTxAtTheSameTime() throws Exception {
SpendingKey sk1 = SpendingKey.random();
ExpandedSpendingKey expsk1 = sk1.expandedSpendingKey();
PaymentAddress address1 = sk1.defaultAddress();
- Note note1 = new Note(address1, 20 * 1000000L);
+ Note note1 = new Note(address1, 10_000_000L + shieldedTransactionFee);
IncrementalMerkleTreeContainer tree = new IncrementalMerkleTreeContainer(
new IncrementalMerkleTreeCapsule());
@@ -1327,30 +1262,31 @@ public void TestCreateMultipleTxAtTheSameTime() throws Exception {
AccountCapsule toCapsule = new AccountCapsule(ByteString.copyFromUtf8("to"),
ByteString.copyFrom(ByteArray.fromHexString(TO_ADDRESS)), AccountType.Normal, 0L);
dbManager.getAccountStore().put(toCapsule.getAddress().toByteArray(), toCapsule);
+ addZeroValueOutputNote(builder);
builder.setTransparentOutput(ByteArray.fromHexString(TO_ADDRESS), 10_000_000L);
TransactionCapsule transactionCap1 = builder.build();
transactionCap1.setBlockNum(3);
txList.add(transactionCap1);
- // 0L + 20_000_000L = 0L + 10_000_000L + 10_000_000L
+ // shielded input = public output + protocol fee
}
- System.out.println("TxList size:" + txList.size());
- txList.parallelStream().forEach(transactionCapsule -> {
+ Assert.assertEquals(3, txList.size());
+ for (TransactionCapsule transactionCapsule : txList) {
try {
- executeTx(transactionCapsule);
- System.out.println("Success execute tx,num:" + transactionCapsule.getBlockNum());
+ executeAndAssertTx(transactionCapsule);
} catch (Exception ex) {
- logger.error("error", ex);
+ throw new AssertionError(
+ "Failed to execute transaction " + transactionCapsule.getBlockNum(), ex);
}
- });
+ }
}
@Test
public void TestCtxGeneratesTooMuchProof() throws Exception {
dbManager.getDynamicPropertiesStore().saveAllowShieldedTransaction(1);
- //case 3, no public input, an input cm, no output cm, a public output
+ //case 3, no public input, an input cm, no output cm, a public output
{
//prepare two cm with different sk, cm1 is used for fake spendDesc
SpendingKey sk1 = SpendingKey.random();
@@ -1425,7 +1361,7 @@ public SpendDescriptionCapsule generateSpendProof(SpendDescriptionInfo spend, lo
public void TestGeneratesProofWithDiffCtx() throws Exception {
dbManager.getDynamicPropertiesStore().saveAllowShieldedTransaction(1);
- //case 3, no public input, an input cm, no output cm, a public output
+ //case 3, no public input, an input cm, no output cm, a public output
{
SpendingKey sk2 = SpendingKey.random();
@@ -1450,7 +1386,11 @@ public void TestGeneratesProofWithDiffCtx() throws Exception {
public SpendDescriptionCapsule generateSpendProof(SpendDescriptionInfo spend, long ctx)
throws ZksnarkException {
long fakeCtx = JLibrustzcash.librustzcashSaplingProvingCtxInit();
- return super.generateSpendProof(spend, fakeCtx);
+ try {
+ return super.generateSpendProof(spend, fakeCtx);
+ } finally {
+ JLibrustzcash.librustzcashSaplingProvingCtxFree(fakeCtx);
+ }
}
};
@@ -1480,67 +1420,50 @@ public SpendDescriptionCapsule generateSpendProof(SpendDescriptionInfo spend, lo
}
@Test
- public void TestGeneratesProofWithWrongAlpha() throws Exception {
+ public void testSpendSignatureRejectsNonCanonicalAlpha() throws Exception {
dbManager.getDynamicPropertiesStore().saveAllowShieldedTransaction(1);
- //case 3, no public input, an input cm, no output cm, a public output
- {
- SpendingKey sk2 = SpendingKey.random();
- ExpandedSpendingKey expsk2 = sk2.expandedSpendingKey();
- PaymentAddress address2 = sk2.defaultAddress();
- Note note2 = new Note(address2, 20 * 1000000L);
-
- IncrementalMerkleTreeContainer tree = new IncrementalMerkleTreeContainer(
- new IncrementalMerkleTreeCapsule());
-
- PedersenHashCapsule compressCapsule2 = new PedersenHashCapsule();
- compressCapsule2.setContent(ByteString.copyFrom(note2.cm()));
- PedersenHash a2 = compressCapsule2.getInstance();
- tree.append(a2);
- IncrementalMerkleVoucherContainer voucher2 = tree.toVoucher();
- byte[] anchor2 = voucher2.root().getContent().toByteArray();
+ ExpandedSpendingKey expandedSpendingKey = SpendingKey.random().expandedSpendingKey();
+ // Sapling scalars are little-endian field elements. This value has high bits set and is not
+ // canonical, even though it satisfies the Java wrapper's 32-byte length check.
+ byte[] nonCanonicalAlpha = ByteArray
+ .fromHexString("0eadb4ea6533afa906673b0101343b00a6682093ccc81082d0970e5ed6f72cbd");
+ byte[] dataToBeSigned = ByteArray
+ .fromHexString("0eadb4ea6533afa906673b0101343b00a6682093ccc81082d0970e5ed6f72cbd");
+ byte[] result = new byte[64];
- SpendDescriptionInfo spendDescriptionInfo = new SpendDescriptionInfo(expsk2, note2, anchor2,
- voucher2);
- byte[] bytes = ByteArray
- .fromHexString("0eadb4ea6533afa906673b0101343b00a6682093ccc81082d0970e5ed6f72cbd");
- spendDescriptionInfo.setAlpha(bytes);
-
- byte[] dataToBeSigned = ByteArray
- .fromHexString("0eadb4ea6533afa906673b0101343b00a6682093ccc81082d0970e5ed6f72cbd");
- byte[] result = new byte[64];
- JLibrustzcash.librustzcashSaplingSpendSig(
- new SpendSigParams(spendDescriptionInfo.getExpsk().getAsk(),
- spendDescriptionInfo.getAlpha(), dataToBeSigned, result));
- }
+ Assert.assertFalse(JLibrustzcash.librustzcashSaplingSpendSig(
+ new SpendSigParams(
+ expandedSpendingKey.getAsk(), nonCanonicalAlpha, dataToBeSigned, result)));
+ Assert.assertArrayEquals(new byte[64], result);
}
@Test
public void TestGeneratesProofWithWrongRcm() throws Exception {
long ctx = JLibrustzcash.librustzcashSaplingProvingCtxInit();
- ZenTransactionBuilder builder = new ZenTransactionBuilder(wallet);
- // generate spend proof
- SpendingKey sk = SpendingKey.random();
- ExpandedSpendingKey expsk = sk.expandedSpendingKey();
- PaymentAddress address = sk.defaultAddress();
-
- Note note = new Note(address, 4010 * 1000000L);
- //note.r = ByteArray
- // .fromHexString("0xe7db4ea6533afa906673b0101343b00a6682093ccc81082d0970e5ed6f72cb6");
-
- IncrementalMerkleVoucherContainer voucher = createSimpleMerkleVoucherContainer(note.cm());
- byte[] anchor = voucher.root().getContent().toByteArray();
- builder.addSpend(expsk, note, anchor, voucher);
- SpendDescriptionCapsule spendDescriptionCapsule = builder
- .generateSpendProof(builder.getSpends().get(0), ctx);
- Assert.assertNotNull(spendDescriptionCapsule);
+ try {
+ ZenTransactionBuilder builder = new ZenTransactionBuilder(wallet);
+ // generate spend proof
+ SpendingKey sk = SpendingKey.random();
+ ExpandedSpendingKey expsk = sk.expandedSpendingKey();
+ PaymentAddress address = sk.defaultAddress();
+ Note note = new Note(address, 4010 * 1000000L);
+ IncrementalMerkleVoucherContainer voucher = createSimpleMerkleVoucherContainer(note.cm());
+ byte[] anchor = voucher.root().getContent().toByteArray();
+ builder.addSpend(expsk, note, anchor, voucher);
+ SpendDescriptionCapsule spendDescriptionCapsule = builder
+ .generateSpendProof(builder.getSpends().get(0), ctx);
+ Assert.assertNotNull(spendDescriptionCapsule);
+ } finally {
+ JLibrustzcash.librustzcashSaplingProvingCtxFree(ctx);
+ }
}
@Test
public void TestWrongAsk() throws Exception {
dbManager.getDynamicPropertiesStore().saveAllowShieldedTransaction(1);
- //case 3, no public input, an input cm, no output cm, a public output
+ //case 3, no public input, an input cm, no output cm, a public output
{
SpendingKey sk2 = SpendingKey.random();
ExpandedSpendingKey expsk2 = sk2.expandedSpendingKey();
@@ -1646,13 +1569,13 @@ private TransactionCapsule generateDefaultBuilder(ZenTransactionBuilder builder)
}
@Test
- public void TestDefaultBuilder() throws Exception {
+ public void testDefaultBuilder() throws Exception {
dbManager.getDynamicPropertiesStore().saveAllowShieldedTransaction(1);
dbManager.getDynamicPropertiesStore().saveTotalShieldedPoolValue(1000 * 1000000L);
ZenTransactionBuilder builder = new ZenTransactionBuilder(wallet);
TransactionCapsule transactionCapsule = generateDefaultBuilder(builder);
- executeTx(transactionCapsule);
+ executeAndAssertTx(transactionCapsule);
}
@Test
diff --git a/framework/src/test/java/org/tron/core/zksnark/ShieldedReceiveTest.java b/framework/src/test/java/org/tron/core/zksnark/ShieldedReceiveTest.java
index 5854b731e97..835f86b0dac 100755
--- a/framework/src/test/java/org/tron/core/zksnark/ShieldedReceiveTest.java
+++ b/framework/src/test/java/org/tron/core/zksnark/ShieldedReceiveTest.java
@@ -335,13 +335,11 @@ public void testBroadcastBeforeAllowZksnark()
TransactionCapsule transactionCap = builder.build();
//Add public address sign
- transactionCap = TransactionUtils.addTransactionSign(transactionCap.getInstance(),
+ TransactionCapsule signedTransactionCap = TransactionUtils.addTransactionSign(
+ transactionCap.getInstance(),
ADDRESS_ONE_PRIVATE_KEY, chainBaseManager.getAccountStore());
- try {
- dbManager.pushTransaction(transactionCap);
- } catch (Exception e) {
- Assert.assertTrue(e instanceof ContractValidateException);
- }
+ Assert.assertThrows(ContractValidateException.class,
+ () -> dbManager.pushTransaction(signedTransactionCap));
}
/*
@@ -1341,55 +1339,7 @@ public void testRandomOvk()
updateTotalShieldedPoolValue(builder.getValueBalance());
TransactionCapsule transactionCap = builder.build();
- Assert.assertTrue(true);
- }
-
- /*
- * test add two same cm into spend
- */
- //@Test not used
- public void testSameInputCm()
- throws BadItemException, RuntimeException, ZksnarkException {
- chainBaseManager.getDynamicPropertiesStore().saveAllowShieldedTransaction(1);
- chainBaseManager.getDynamicPropertiesStore().saveTotalShieldedPoolValue(100 * 1000000L);
- ZenTransactionBuilder builder = new ZenTransactionBuilder(wallet);
-
- // generate input
- SpendingKey sk = SpendingKey
- .decode("ff2c06269315333a9207f817d2eca0ac555ca8f90196976324c7756504e7c9ee");
- ExpandedSpendingKey expsk = sk.expandedSpendingKey();
- PaymentAddress address = sk.defaultAddress();
- Note note = new Note(address, 100 * 1000000L);
- IncrementalMerkleVoucherContainer voucher = createSimpleMerkleVoucherContainer(note.cm());
- byte[] anchor = voucher.root().getContent().toByteArray();
- //put the voucher and anchor into db
- chainBaseManager.getMerkleContainer()
- .putMerkleTreeIntoStore(anchor, voucher.getVoucherCapsule().getTree());
-
- //add two same cm
- builder.addSpend(expsk, note, anchor, voucher);
- builder.addSpend(expsk, note, anchor, voucher);
-
- // generate output
- SpendingKey sk1 = SpendingKey.random();
- FullViewingKey fullViewingKey1 = sk1.fullViewingKey();
- IncomingViewingKey ivk1 = fullViewingKey1.inViewingKey();
- PaymentAddress paymentAddress1 = ivk1.address(new DiversifierT()).get();
- builder.addOutput(expsk.getOvk(), paymentAddress1,
- 200 * 1000000L - wallet.getShieldedTransactionFee(), new byte[512]);
-
- updateTotalShieldedPoolValue(builder.getValueBalance());
- TransactionCapsule transactionCap = builder.build();
-
- try {
- //validate
- List actuator = ActuatorCreator.getINSTANCE().createActuator(transactionCap);
- actuator.get(0).validate();
- Assert.assertFalse(true);
- } catch (Exception e) {
- Assert.assertTrue(e instanceof ContractValidateException);
- Assert.assertEquals("duplicate sapling nullifiers in this transaction", e.getMessage());
- }
+ Assert.assertNotNull(transactionCap);
}
/*
@@ -1770,7 +1720,7 @@ public void testSignWithoutFromAddress()
List actuator = ActuatorCreator.getINSTANCE().createActuator(transactionCap);
actuator.get(0).validate(); //there is hash(transaction) in librustzcashSaplingFinalCheck
- Assert.assertTrue(true);
+ Assert.assertEquals(1, actuator.size());
}
/*
@@ -1809,7 +1759,7 @@ public void testSignWithoutFromAmout()
List actuator = ActuatorCreator.getINSTANCE().createActuator(transactionCap);
actuator.get(0).validate(); //there is hash(transaction) in librustzcashSaplingFinalCheck
- Assert.assertTrue(true);
+ Assert.assertEquals(1, actuator.size());
}
/*
@@ -1940,7 +1890,7 @@ public void testSignWithoutToAddress()
List actuator = ActuatorCreator.getINSTANCE().createActuator(transactionCap);
actuator.get(0).validate(); //there is hash(transaction) in librustzcashSaplingFinalCheck
- Assert.assertTrue(true);
+ Assert.assertEquals(1, actuator.size());
}
/*
@@ -1979,7 +1929,7 @@ public void testSignWithoutToAmount()
List actuator = ActuatorCreator.getINSTANCE().createActuator(transactionCap);
actuator.get(0).validate(); //there is hash(transaction) in librustzcashSaplingFinalCheck
- Assert.assertTrue(true);
+ Assert.assertEquals(1, actuator.size());
}
/*
@@ -2404,7 +2354,7 @@ public void pushSameSkAndScanAndSpend() throws Exception {
List localPrivateKeys = Args.getLocalWitnesses().getPrivateKeys();
byte[] privateKey = ByteArray.fromHexString(localPrivateKeys.get(0));
final ECKey ecKey = ECKey.fromPrivate(privateKey);
- assert ecKey != null;
+ Assert.assertNotNull(ecKey);
byte[] witnessAddress = ecKey.getAddress();
WitnessCapsule witnessCapsule = new WitnessCapsule(ByteString.copyFrom(witnessAddress));
// Stop the consensus task before modifying the witness schedule: DposTask uses the same
diff --git a/framework/src/test/java/org/tron/keystore/WalletUtilsInputPasswordTest.java b/framework/src/test/java/org/tron/keystore/WalletUtilsInputPasswordTest.java
index 64752b9ca49..2fb769d9935 100644
--- a/framework/src/test/java/org/tron/keystore/WalletUtilsInputPasswordTest.java
+++ b/framework/src/test/java/org/tron/keystore/WalletUtilsInputPasswordTest.java
@@ -71,16 +71,6 @@ public void testInputPasswordStripsTrailingCr() {
assertEquals("Trailing \\r must be stripped", "password123", pw);
}
- @Test(timeout = 5000)
- public void testInputPasswordStripsBom() {
- System.setIn(new ByteArrayInputStream(
- "\uFEFFpassword123\n".getBytes(StandardCharsets.UTF_8)));
-
- String pw = WalletUtils.inputPassword();
-
- assertEquals("UTF-8 BOM must be stripped from the start", "password123", pw);
- }
-
@Test(timeout = 5000)
public void testInputPasswordPreservesLeadingAndTrailingSpaces() {
// The legacy bug also called trim(); post-fix, spaces at the edges
diff --git a/plugins/src/test/java/org/tron/plugins/DbMoveTest.java b/plugins/src/test/java/org/tron/plugins/DbMoveTest.java
index ec4f0d545b0..5955b689eed 100644
--- a/plugins/src/test/java/org/tron/plugins/DbMoveTest.java
+++ b/plugins/src/test/java/org/tron/plugins/DbMoveTest.java
@@ -44,7 +44,7 @@ public void destroy() {
private static boolean deleteDir(File dir) {
if (dir.isDirectory()) {
String[] children = dir.list();
- assert children != null;
+ Assert.assertNotNull("Failed to list directory " + dir, children);
for (String child : children) {
boolean success = deleteDir(new File(dir, child));
if (!success) {
diff --git a/plugins/src/test/java/org/tron/plugins/DbTest.java b/plugins/src/test/java/org/tron/plugins/DbTest.java
index d22addfbae8..914232f8d1e 100644
--- a/plugins/src/test/java/org/tron/plugins/DbTest.java
+++ b/plugins/src/test/java/org/tron/plugins/DbTest.java
@@ -74,7 +74,7 @@ private static void initDB(String sourceDir, String dbName, DbTool.DbType dbType
2003L
);
- //Use out-of-order insertion,key in store should be 1,2,3
+ // Use out-of-order insertion; keys in the store should be 1, 2, 3.
db.put(pairPriceKey1, "1".getBytes(StandardCharsets.UTF_8));
db.put(pairPriceKey2, "2".getBytes(StandardCharsets.UTF_8));
db.put(pairPriceKey3, "3".getBytes(StandardCharsets.UTF_8));
From 917dfae8bbc3425d68e3076c1e73f64d670993ae Mon Sep 17 00:00:00 2001
From: 3for <287494524@qq.com>
Date: Thu, 27 Aug 2026 21:46:43 +0800
Subject: [PATCH 6/8] fix(backup): ensure backup server shuts down promptly
---
.../org/tron/common/backup/socket/BackupServer.java | 9 +++++++--
.../org/tron/common/backup/BackupServerTest.java | 13 ++++++-------
2 files changed, 13 insertions(+), 9 deletions(-)
diff --git a/framework/src/main/java/org/tron/common/backup/socket/BackupServer.java b/framework/src/main/java/org/tron/common/backup/socket/BackupServer.java
index 67739ac50d2..d825c7c4b76 100644
--- a/framework/src/main/java/org/tron/common/backup/socket/BackupServer.java
+++ b/framework/src/main/java/org/tron/common/backup/socket/BackupServer.java
@@ -8,6 +8,7 @@
import io.netty.handler.codec.protobuf.ProtobufVarint32FrameDecoder;
import io.netty.handler.codec.protobuf.ProtobufVarint32LengthFieldPrepender;
import java.util.concurrent.ExecutorService;
+import java.util.concurrent.Future;
import java.util.concurrent.TimeUnit;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
@@ -33,6 +34,7 @@ public class BackupServer implements AutoCloseable {
private final String name = "BackupServer";
private ExecutorService executor;
+ private Future> serverTask;
@Autowired
public BackupServer(final BackupManager backupManager) {
@@ -42,7 +44,7 @@ public BackupServer(final BackupManager backupManager) {
public void initServer() {
if (port > 0 && commonParameter.getBackupMembers().size() > 0) {
executor = ExecutorServiceManager.newSingleThreadExecutor(name);
- executor.submit(() -> {
+ serverTask = executor.submit(() -> {
try {
start();
} catch (Exception e) {
@@ -95,7 +97,6 @@ public void initChannel(NioDatagramChannel ch)
public void close() {
logger.info("Closing backup server...");
shutdown = true;
- backupManager.stop();
if (channel != null) {
try {
channel.close().await(10, TimeUnit.SECONDS);
@@ -103,6 +104,10 @@ public void close() {
logger.warn("Closing backup server failed.", e);
}
}
+ if (serverTask != null) {
+ serverTask.cancel(true);
+ }
+ backupManager.stop();
ExecutorServiceManager.shutdownAndAwaitTermination(executor, name);
logger.info("Backup server closed.");
}
diff --git a/framework/src/test/java/org/tron/common/backup/BackupServerTest.java b/framework/src/test/java/org/tron/common/backup/BackupServerTest.java
index 50778970d87..acda8c88d65 100644
--- a/framework/src/test/java/org/tron/common/backup/BackupServerTest.java
+++ b/framework/src/test/java/org/tron/common/backup/BackupServerTest.java
@@ -1,5 +1,7 @@
package org.tron.common.backup;
+import static org.mockito.Mockito.mock;
+
import java.util.ArrayList;
import java.util.List;
import org.junit.After;
@@ -21,7 +23,7 @@ public class BackupServerTest {
public TemporaryFolder temporaryFolder = new TemporaryFolder();
@Rule
- public Timeout globalTimeout = Timeout.seconds(60);
+ public Timeout globalTimeout = Timeout.seconds(30);
private BackupServer backupServer;
@Before
@@ -32,8 +34,7 @@ public void setUp() throws Exception {
List members = new ArrayList<>();
members.add("127.0.0.2");
CommonParameter.getInstance().setBackupMembers(members);
- BackupManager backupManager = new BackupManager();
- backupManager.init();
+ BackupManager backupManager = mock(BackupManager.class);
backupServer = new BackupServer(backupManager);
}
@@ -43,10 +44,8 @@ public void tearDown() {
Args.clearParam();
}
- @Test(timeout = 60_000)
- public void test() throws InterruptedException {
+ @Test
+ public void test() {
backupServer.initServer();
- // wait for the server to start so channel is assigned before close() is called
- Thread.sleep(1000);
}
}
From 2bd1d6228ac5002e83cd83cf31f312a192d10f4a Mon Sep 17 00:00:00 2001
From: 3for <287494524@qq.com>
Date: Thu, 27 Aug 2026 21:46:54 +0800
Subject: [PATCH 7/8] test(api): restore and strengthen HTTP endpoint coverage
---
.../filter/HttpApiAccessFilterTest.java | 54 +-
.../http/EstimateEnergyServletTest.java | 109 ++++
.../core/services/http/HttpServletTest.java | 538 ++++++++++++++++++
.../TriggerConstantContractServletTest.java | 44 ++
4 files changed, 736 insertions(+), 9 deletions(-)
create mode 100644 framework/src/test/java/org/tron/core/services/http/EstimateEnergyServletTest.java
create mode 100644 framework/src/test/java/org/tron/core/services/http/HttpServletTest.java
diff --git a/framework/src/test/java/org/tron/core/services/filter/HttpApiAccessFilterTest.java b/framework/src/test/java/org/tron/core/services/filter/HttpApiAccessFilterTest.java
index c99b6064d15..e7256a16a66 100644
--- a/framework/src/test/java/org/tron/core/services/filter/HttpApiAccessFilterTest.java
+++ b/framework/src/test/java/org/tron/core/services/filter/HttpApiAccessFilterTest.java
@@ -5,14 +5,18 @@
import java.io.InputStreamReader;
import java.lang.reflect.Method;
import java.util.ArrayList;
+import java.util.Arrays;
import java.util.Collections;
+import java.util.HashSet;
import java.util.List;
+import java.util.Set;
import javax.annotation.Resource;
-import org.apache.http.HttpResponse;
import org.apache.http.HttpStatus;
+import org.apache.http.client.methods.CloseableHttpResponse;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.HttpClients;
+import org.junit.After;
import org.junit.Assert;
import org.junit.Test;
import org.tron.common.BaseTest;
@@ -26,6 +30,18 @@
public class HttpApiAccessFilterTest extends BaseTest {
+ private static final Set UNREGISTERED_PATHS = new HashSet<>(Arrays.asList(
+ "/wallet/getmerkletreevoucherinfo",
+ "/wallet/isspend",
+ "/wallet/scanandmarknotebyivk",
+ "/wallet/scannotebyivk",
+ "/wallet/scannotebyovk",
+ "/walletsolidity/getmerkletreevoucherinfo",
+ "/walletsolidity/isspend",
+ "/walletsolidity/scanandmarknotebyivk",
+ "/walletsolidity/scannotebyivk",
+ "/walletsolidity/scannotebyovk"));
+
@Resource
private FullNodeHttpApiService httpApiService;
@Resource
@@ -34,7 +50,7 @@ public class HttpApiAccessFilterTest extends BaseTest {
private HttpApiOnPBFTService httpApiOnPBFTService;
@Resource
private HttpApiAccessFilter httpApiAccessFilter;
- private static final CloseableHttpClient httpClient = HttpClients.createDefault();
+ private final CloseableHttpClient httpClient = HttpClients.createDefault();
static {
Args.setParam(new String[]{"-d", dbPath()}, TestConstants.TEST_CONF);
@@ -48,6 +64,11 @@ public class HttpApiAccessFilterTest extends BaseTest {
Args.getInstance().setP2pDisable(true);
}
+ @After
+ public void closeHttpClient() throws IOException {
+ httpClient.close();
+ }
+
@Test
public void testHttpFilter() {
appT.startup();
@@ -87,14 +108,32 @@ public void testHttpFilter() {
Assert.assertEquals(HttpStatus.SC_OK, statusCode);
}
}
+
+ Args.getInstance().setOpenHistoryQueryWhenLiteFN(true);
+
+ for (String path : LiteFnQueryHttpFilter.getFilterPaths()) {
+ if (UNREGISTERED_PATHS.contains(path)) {
+ continue;
+ }
+ String url = String.format("http://127.0.0.1:%d%s", portFor(path), path);
+ Assert.assertEquals("path=" + path, HttpStatus.SC_OK, getRequestCode(url));
+ }
+ }
+
+ private static int portFor(String path) {
+ if (path.startsWith("/walletsolidity/")) {
+ return Args.getInstance().getSolidityHttpPort();
+ }
+ if (path.startsWith("/walletpbft/")) {
+ return Args.getInstance().getPBFTHttpPort();
+ }
+ return Args.getInstance().getFullNodeHttpPort();
}
private String sendGetRequest(String url) {
HttpGet request = new HttpGet(url);
request.setHeader("User-Agent", "Java client");
- HttpResponse response;
- try {
- response = httpClient.execute(request);
+ try (CloseableHttpResponse response = httpClient.execute(request)) {
BufferedReader rd = new BufferedReader(
new InputStreamReader(response.getEntity().getContent()));
StringBuilder result = new StringBuilder();
@@ -112,10 +151,7 @@ private String sendGetRequest(String url) {
private int getRequestCode(String url) {
HttpGet request = new HttpGet(url);
request.setHeader("User-Agent", "Java client");
- HttpResponse response;
-
- try {
- response = httpClient.execute(request);
+ try (CloseableHttpResponse response = httpClient.execute(request)) {
return response.getStatusLine().getStatusCode();
} catch (IOException e) {
e.printStackTrace();
diff --git a/framework/src/test/java/org/tron/core/services/http/EstimateEnergyServletTest.java b/framework/src/test/java/org/tron/core/services/http/EstimateEnergyServletTest.java
new file mode 100644
index 00000000000..8f88a273d54
--- /dev/null
+++ b/framework/src/test/java/org/tron/core/services/http/EstimateEnergyServletTest.java
@@ -0,0 +1,109 @@
+package org.tron.core.services.http;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertFalse;
+import static org.mockito.ArgumentMatchers.any;
+import static org.mockito.ArgumentMatchers.eq;
+import static org.mockito.Mockito.never;
+import static org.mockito.Mockito.verify;
+import static org.mockito.Mockito.when;
+
+import com.google.protobuf.ByteString;
+import org.junit.Test;
+import org.mockito.ArgumentCaptor;
+import org.springframework.mock.web.MockHttpServletResponse;
+import org.tron.api.GrpcAPI.EstimateEnergyMessage;
+import org.tron.api.GrpcAPI.Return;
+import org.tron.common.crypto.ECKey;
+import org.tron.common.utils.ByteArray;
+import org.tron.core.capsule.TransactionCapsule;
+import org.tron.core.exception.ContractValidateException;
+import org.tron.json.JSONObject;
+import org.tron.protos.Protocol.Transaction.Contract.ContractType;
+import org.tron.protos.contract.SmartContractOuterClass.TriggerSmartContract;
+
+public class EstimateEnergyServletTest extends BaseHttpTest {
+
+ private final byte[] ownerAddress = new ECKey().getAddress();
+ private final byte[] contractAddress = new ECKey().getAddress();
+ private EstimateEnergyServlet servlet;
+
+ @Override
+ protected void setUpMocks() throws Exception {
+ servlet = new EstimateEnergyServlet();
+ injectWallet(servlet);
+ }
+
+ @Test
+ public void testPostBuildsTriggerAndReturnsEstimatedEnergy() throws Exception {
+ when(wallet.createTransactionCapsule(any(), any()))
+ .thenReturn(new TransactionCapsule(MINIMAL_TX));
+ when(wallet.estimateEnergy(any(), any(), any(), any(), any()))
+ .thenAnswer(invocation -> {
+ Return.Builder result = invocation.getArgument(3);
+ EstimateEnergyMessage.Builder estimate = invocation.getArgument(4);
+ result.setResult(true).setCode(Return.response_code.SUCCESS);
+ estimate.setEnergyRequired(321L);
+ return MINIMAL_TX;
+ });
+ String body = "{\"owner_address\":\"" + ByteArray.toHexString(ownerAddress)
+ + "\",\"contract_address\":\"" + ByteArray.toHexString(contractAddress)
+ + "\",\"function_selector\":\"test()\"}";
+ MockHttpServletResponse response = newResponse();
+
+ servlet.doPost(postRequest(body), response);
+
+ assertEquals(200, response.getStatus());
+ ArgumentCaptor triggerCaptor =
+ ArgumentCaptor.forClass(TriggerSmartContract.class);
+ verify(wallet).createTransactionCapsule(triggerCaptor.capture(),
+ eq(ContractType.TriggerSmartContract));
+ TriggerSmartContract trigger = triggerCaptor.getValue();
+ assertEquals(ByteString.copyFrom(ownerAddress), trigger.getOwnerAddress());
+ assertEquals(ByteString.copyFrom(contractAddress), trigger.getContractAddress());
+ assertEquals(4, trigger.getData().size());
+
+ JSONObject json = JSONObject.parseObject(response.getContentAsString());
+ assertEquals(321L, ((Number) json.get("energy_required")).longValue());
+ assertEquals(Boolean.TRUE, json.getJSONObject("result").get("result"));
+ }
+
+ @Test
+ public void testContractValidationErrorIsReturned() throws Exception {
+ when(wallet.createTransactionCapsule(any(), any()))
+ .thenThrow(new ContractValidateException("invalid contract"));
+ String body = "{\"owner_address\":\"" + ByteArray.toHexString(ownerAddress)
+ + "\",\"contract_address\":\"" + ByteArray.toHexString(contractAddress) + "\"}";
+ MockHttpServletResponse response = newResponse();
+
+ servlet.doPost(postRequest(body), response);
+
+ JSONObject result = JSONObject.parseObject(response.getContentAsString())
+ .getJSONObject("result");
+ assertFalse(result.containsKey("result"));
+ assertEquals("CONTRACT_VALIDATE_ERROR", result.getString("code"));
+ assertEquals("invalid contract", decodeMessage(result));
+ verify(wallet, never()).estimateEnergy(any(), any(), any(), any(), any());
+ }
+
+ @Test
+ public void testMissingOwnerReturnsBusinessErrorWithoutCallingWallet() throws Exception {
+ String body = "{\"contract_address\":\"" + ByteArray.toHexString(contractAddress) + "\"}";
+ MockHttpServletResponse response = newResponse();
+
+ servlet.doPost(postRequest(body), response);
+
+ JSONObject result = JSONObject.parseObject(response.getContentAsString())
+ .getJSONObject("result");
+ assertFalse(result.containsKey("result"));
+ assertEquals("OTHER_ERROR", result.getString("code"));
+ assertEquals("class java.security.InvalidParameterException : owner_address isn't set.",
+ decodeMessage(result));
+ verify(wallet, never()).createTransactionCapsule(any(), any());
+ verify(wallet, never()).estimateEnergy(any(), any(), any(), any(), any());
+ }
+
+ private static String decodeMessage(JSONObject result) {
+ return ByteString.copyFrom(ByteArray.fromHexString(result.getString("message"))).toStringUtf8();
+ }
+}
diff --git a/framework/src/test/java/org/tron/core/services/http/HttpServletTest.java b/framework/src/test/java/org/tron/core/services/http/HttpServletTest.java
new file mode 100644
index 00000000000..03cf11f39a1
--- /dev/null
+++ b/framework/src/test/java/org/tron/core/services/http/HttpServletTest.java
@@ -0,0 +1,538 @@
+package org.tron.core.services.http;
+
+import lombok.extern.slf4j.Slf4j;
+import org.junit.Before;
+import org.junit.Test;
+import org.springframework.mock.web.MockHttpServletRequest;
+import org.springframework.mock.web.MockHttpServletResponse;
+
+@Slf4j
+public class HttpServletTest {
+ private AccountPermissionUpdateServlet accountPermissionUpdateServlet;
+ private BroadcastHexServlet broadcastHexServlet;
+ private BroadcastServlet broadcastServlet;
+ private ClearABIServlet clearABIServlet;
+ private CreateAccountServlet createAccountServlet;
+ private CreateAssetIssueServlet createAssetIssueServlet;
+ private CreateCommonTransactionServlet createCommonTransactionServlet;
+ private CreateShieldedContractParametersServlet createShieldedContractParametersServlet;
+ private CreateShieldedContractParametersWithoutAskServlet
+ createShieldedContractParametersWithoutAskServlet;
+ private CreateShieldedTransactionServlet createShieldedTransactionServlet;
+ private CreateShieldedTransactionWithoutSpendAuthSigServlet
+ createShieldedTransactionWithoutSpendAuthSigServlet;
+ private CreateShieldNullifierServlet createShieldNullifierServlet;
+ private CreateSpendAuthSigServlet createSpendAuthSigServlet;
+ private CreateWitnessServlet createWitnessServlet;
+ private DelegateResourceServlet delegateResourceServlet;
+ private DeployContractServlet deployContractServlet;
+ private EstimateEnergyServlet estimateEnergyServlet;
+ private ExchangeCreateServlet exchangeCreateServlet;
+ private ExchangeInjectServlet exchangeInjectServlet;
+ private ExchangeTransactionServlet exchangeTransactionServlet;
+ private ExchangeWithdrawServlet exchangeWithdrawServlet;
+ private FreezeBalanceServlet freezeBalanceServlet;
+ private FreezeBalanceV2Servlet freezeBalanceV2Servlet;
+ private GetAccountBalanceServlet getAccountBalanceServlet;
+ private GetAccountByIdServlet getAccountByIdServlet;
+ private GetAccountNetServlet getAccountNetServlet;
+ private GetAccountResourceServlet getAccountResourceServlet;
+ private GetAccountServlet getAccountServlet;
+ private GetAkFromAskServlet getAkFromAskServlet;
+ private GetAssetIssueByAccountServlet getAssetIssueByAccountServlet;
+ private GetAssetIssueByIdServlet getAssetIssueByIdServlet;
+ private GetAssetIssueByNameServlet getAssetIssueByNameServlet;
+ private GetAssetIssueListByNameServlet getAssetIssueListByNameServlet;
+ private GetAssetIssueListServlet getAssetIssueListServlet;
+ private GetAvailableUnfreezeCountServlet getAvailableUnfreezeCountServlet;
+ private GetBandwidthPricesServlet getBandwidthPricesServlet;
+ private GetBlockBalanceServlet getBlockBalanceServlet;
+ private GetBlockByIdServlet getBlockByIdServlet;
+ private GetBlockByLatestNumServlet getBlockByLatestNumServlet;
+ private GetBlockByLimitNextServlet getBlockByLimitNextServlet;
+ private GetBlockByNumServlet getBlockByNumServlet;
+ private GetBlockServlet getBlockServlet;
+ private GetBrokerageServlet getBrokerageServlet;
+ private GetBurnTrxServlet getBurnTrxServlet;
+ private GetCanDelegatedMaxSizeServlet getCanDelegatedMaxSizeServlet;
+ private GetCanWithdrawUnfreezeAmountServlet getCanWithdrawUnfreezeAmountServlet;
+ private GetChainParametersServlet getChainParametersServlet;
+ private GetContractInfoServlet getContractInfoServlet;
+ private GetContractServlet getContractServlet;
+ private GetDelegatedResourceAccountIndexServlet getDelegatedResourceAccountIndexServlet;
+ private GetDelegatedResourceAccountIndexV2Servlet getDelegatedResourceAccountIndexV2Servlet;
+ private GetDelegatedResourceServlet getDelegatedResourceServlet;
+ private GetDelegatedResourceV2Servlet getDelegatedResourceV2Servlet;
+ private GetDiversifierServlet getDiversifierServlet;
+ private GetEnergyPricesServlet getEnergyPricesServlet;
+ private GetExchangeByIdServlet getExchangeByIdServlet;
+ private GetExpandedSpendingKeyServlet getExpandedSpendingKeyServlet;
+ private GetIncomingViewingKeyServlet getIncomingViewingKeyServlet;
+ private GetMarketOrderByAccountServlet getMarketOrderByAccountServlet;
+ private GetMarketOrderByIdServlet getMarketOrderByIdServlet;
+ private GetMarketOrderListByPairServlet getMarketOrderListByPairServlet;
+ private GetMarketPairListServlet getMarketPairListServlet;
+ private GetMarketPriceByPairServlet getMarketPriceByPairServlet;
+ private GetMemoFeePricesServlet getMemoFeePricesServlet;
+ private GetMerkleTreeVoucherInfoServlet getMerkleTreeVoucherInfoServlet;
+ private GetNewShieldedAddressServlet getNewShieldedAddressServlet;
+ private GetNextMaintenanceTimeServlet getNextMaintenanceTimeServlet;
+ private GetNkFromNskServlet getNkFromNskServlet;
+ private GetNodeInfoServlet getNodeInfoServlet;
+ private GetNowBlockServlet getNowBlockServlet;
+ private GetPaginatedAssetIssueListServlet getPaginatedAssetIssueListServlet;
+ private GetPaginatedExchangeListServlet getPaginatedExchangeListServlet;
+ private GetPaginatedProposalListServlet getPaginatedProposalListServlet;
+ private GetPendingSizeServlet getPendingSizeServlet;
+ private GetProposalByIdServlet getProposalByIdServlet;
+ private GetRcmServlet getRcmServlet;
+ private GetRewardServlet getRewardServlet;
+ private GetShieldTransactionHashServlet getShieldTransactionHashServlet;
+ private GetSpendingKeyServlet getSpendingKeyServlet;
+ private GetTransactionApprovedListServlet getTransactionApprovedListServlet;
+ private GetTransactionByIdServlet getTransactionByIdServlet;
+ private GetTransactionCountByBlockNumServlet getTransactionCountByBlockNumServlet;
+ private GetTransactionFromPendingServlet getTransactionFromPendingServlet;
+ private GetTransactionInfoByBlockNumServlet getTransactionInfoByBlockNumServlet;
+ private GetTransactionInfoByIdServlet getTransactionInfoByIdServlet;
+ private GetTransactionListFromPendingServlet getTransactionListFromPendingServlet;
+ private GetTransactionReceiptByIdServlet getTransactionReceiptByIdServlet;
+ private GetTransactionSignWeightServlet getTransactionSignWeightServlet;
+ private GetTriggerInputForShieldedTRC20ContractServlet
+ getTriggerInputForShieldedTRC20ContractServlet;
+ private GetZenPaymentAddressServlet getZenPaymentAddressServlet;
+ private IsShieldedTRC20ContractNoteSpentServlet isShieldedTRC20ContractNoteSpentServlet;
+ private IsSpendServlet isSpendServlet;
+ private ListExchangesServlet listExchangesServlet;
+ private ListNodesServlet listNodesServlet;
+ private ListProposalsServlet listProposalsServlet;
+ private ListWitnessesServlet listWitnessesServlet;
+ private GetPaginatedNowWitnessListServlet getPaginatedNowWitnessListServlet;
+ private MarketCancelOrderServlet marketCancelOrderServlet;
+ private MarketSellAssetServlet marketSellAssetServlet;
+ private MetricsServlet metricsServlet;
+ private ParticipateAssetIssueServlet participateAssetIssueServlet;
+ private ProposalApproveServlet proposalApproveServlet;
+ private ProposalCreateServlet proposalCreateServlet;
+ private ProposalDeleteServlet proposalDeleteServlet;
+ private ScanAndMarkNoteByIvkServlet scanAndMarkNoteByIvkServlet;
+ private ScanNoteByIvkServlet scanNoteByIvkServlet;
+ private ScanNoteByOvkServlet scanNoteByOvkServlet;
+ private ScanShieldedTRC20NotesByIvkServlet scanShieldedTRC20NotesByIvkServlet;
+ private ScanShieldedTRC20NotesByOvkServlet scanShieldedTRC20NotesByOvkServlet;
+ private SetAccountIdServlet setAccountIdServlet;
+ private TotalTransactionServlet totalTransactionServlet;
+ private TransferAssetServlet transferAssetServlet;
+ private TransferServlet transferServlet;
+ private TriggerConstantContractServlet triggerConstantContractServlet;
+ private TriggerSmartContractServlet triggerSmartContractServlet;
+ private UnDelegateResourceServlet unDelegateResourceServlet;
+ private UnFreezeAssetServlet unFreezeAssetServlet;
+ private UnFreezeBalanceServlet unFreezeBalanceServlet;
+ private UnFreezeBalanceV2Servlet unFreezeBalanceV2Servlet;
+ private UpdateAccountServlet updateAccountServlet;
+ private UpdateAssetServlet updateAssetServlet;
+ private UpdateBrokerageServlet updateBrokerageServlet;
+ private UpdateEnergyLimitServlet updateEnergyLimitServlet;
+ private UpdateSettingServlet updateSettingServlet;
+ private UpdateWitnessServlet updateWitnessServlet;
+ private ValidateAddressServlet validateAddressServlet;
+ private VoteWitnessAccountServlet voteWitnessAccountServlet;
+ private WithdrawBalanceServlet withdrawBalanceServlet;
+ private WithdrawExpireUnfreezeServlet withdrawExpireUnfreezeServlet;
+ private CancelAllUnfreezeV2Servlet cancelAllUnfreezeV2Servlet;
+ private MockHttpServletRequest request;
+ private MockHttpServletResponse response;
+
+ @Before
+ public void setUp() {
+ accountPermissionUpdateServlet = new AccountPermissionUpdateServlet();
+ broadcastHexServlet = new BroadcastHexServlet();
+ broadcastServlet = new BroadcastServlet();
+ clearABIServlet = new ClearABIServlet();
+ createAccountServlet = new CreateAccountServlet();
+ createAssetIssueServlet = new CreateAssetIssueServlet();
+ createCommonTransactionServlet = new CreateCommonTransactionServlet();
+ createShieldedContractParametersServlet = new CreateShieldedContractParametersServlet();
+ createShieldedContractParametersWithoutAskServlet =
+ new CreateShieldedContractParametersWithoutAskServlet();
+ createShieldedTransactionServlet = new CreateShieldedTransactionServlet();
+ createShieldedTransactionWithoutSpendAuthSigServlet =
+ new CreateShieldedTransactionWithoutSpendAuthSigServlet();
+ createShieldNullifierServlet = new CreateShieldNullifierServlet();
+ createSpendAuthSigServlet = new CreateSpendAuthSigServlet();
+ createWitnessServlet = new CreateWitnessServlet();
+ delegateResourceServlet = new DelegateResourceServlet();
+ deployContractServlet = new DeployContractServlet();
+ estimateEnergyServlet = new EstimateEnergyServlet();
+ exchangeCreateServlet = new ExchangeCreateServlet();
+ exchangeInjectServlet = new ExchangeInjectServlet();
+ exchangeTransactionServlet = new ExchangeTransactionServlet();
+ exchangeWithdrawServlet = new ExchangeWithdrawServlet();
+ freezeBalanceServlet = new FreezeBalanceServlet();
+ freezeBalanceV2Servlet = new FreezeBalanceV2Servlet();
+ getAccountBalanceServlet = new GetAccountBalanceServlet();
+ getAccountByIdServlet = new GetAccountByIdServlet();
+ getAccountNetServlet = new GetAccountNetServlet();
+ getAccountResourceServlet = new GetAccountResourceServlet();
+ getAccountServlet = new GetAccountServlet();
+ getAkFromAskServlet = new GetAkFromAskServlet();
+ getAssetIssueByAccountServlet = new GetAssetIssueByAccountServlet();
+ getAssetIssueByIdServlet = new GetAssetIssueByIdServlet();
+ getAssetIssueByNameServlet = new GetAssetIssueByNameServlet();
+ getAssetIssueListByNameServlet = new GetAssetIssueListByNameServlet();
+ getAssetIssueListServlet = new GetAssetIssueListServlet();
+ getAvailableUnfreezeCountServlet = new GetAvailableUnfreezeCountServlet();
+ getBandwidthPricesServlet = new GetBandwidthPricesServlet();
+ getBlockBalanceServlet = new GetBlockBalanceServlet();
+ getBlockByIdServlet = new GetBlockByIdServlet();
+ getBlockByLatestNumServlet = new GetBlockByLatestNumServlet();
+ getBlockByLimitNextServlet = new GetBlockByLimitNextServlet();
+ getBlockByNumServlet = new GetBlockByNumServlet();
+ getBlockServlet = new GetBlockServlet();
+ getBrokerageServlet = new GetBrokerageServlet();
+ getBurnTrxServlet = new GetBurnTrxServlet();
+ getCanDelegatedMaxSizeServlet = new GetCanDelegatedMaxSizeServlet();
+ getCanWithdrawUnfreezeAmountServlet = new GetCanWithdrawUnfreezeAmountServlet();
+ getChainParametersServlet = new GetChainParametersServlet();
+ getContractInfoServlet = new GetContractInfoServlet();
+ getContractServlet = new GetContractServlet();
+ getDelegatedResourceAccountIndexServlet = new GetDelegatedResourceAccountIndexServlet();
+ getDelegatedResourceAccountIndexV2Servlet = new GetDelegatedResourceAccountIndexV2Servlet();
+ getDelegatedResourceServlet = new GetDelegatedResourceServlet();
+ getDelegatedResourceV2Servlet = new GetDelegatedResourceV2Servlet();
+ getDiversifierServlet = new GetDiversifierServlet();
+ getEnergyPricesServlet = new GetEnergyPricesServlet();
+ getExchangeByIdServlet = new GetExchangeByIdServlet();
+ getExpandedSpendingKeyServlet = new GetExpandedSpendingKeyServlet();
+ getIncomingViewingKeyServlet = new GetIncomingViewingKeyServlet();
+ getMarketOrderByAccountServlet = new GetMarketOrderByAccountServlet();
+ getMarketOrderByIdServlet = new GetMarketOrderByIdServlet();
+ getMarketOrderListByPairServlet = new GetMarketOrderListByPairServlet();
+ getMarketPairListServlet = new GetMarketPairListServlet();
+ getMarketPriceByPairServlet = new GetMarketPriceByPairServlet();
+ getMemoFeePricesServlet = new GetMemoFeePricesServlet();
+ getMerkleTreeVoucherInfoServlet = new GetMerkleTreeVoucherInfoServlet();
+ getNewShieldedAddressServlet = new GetNewShieldedAddressServlet();
+ getNextMaintenanceTimeServlet = new GetNextMaintenanceTimeServlet();
+ getNkFromNskServlet = new GetNkFromNskServlet();
+ getNodeInfoServlet = new GetNodeInfoServlet();
+ getNowBlockServlet = new GetNowBlockServlet();
+ getPaginatedAssetIssueListServlet = new GetPaginatedAssetIssueListServlet();
+ getPaginatedExchangeListServlet = new GetPaginatedExchangeListServlet();
+ getPaginatedProposalListServlet = new GetPaginatedProposalListServlet();
+ getPendingSizeServlet = new GetPendingSizeServlet();
+ getProposalByIdServlet = new GetProposalByIdServlet();
+ getRcmServlet = new GetRcmServlet();
+ getRewardServlet = new GetRewardServlet();
+ getShieldTransactionHashServlet = new GetShieldTransactionHashServlet();
+ getSpendingKeyServlet = new GetSpendingKeyServlet();
+ getTransactionApprovedListServlet = new GetTransactionApprovedListServlet();
+ getTransactionByIdServlet = new GetTransactionByIdServlet();
+ getTransactionCountByBlockNumServlet = new GetTransactionCountByBlockNumServlet();
+ getTransactionFromPendingServlet = new GetTransactionFromPendingServlet();
+ getTransactionInfoByBlockNumServlet = new GetTransactionInfoByBlockNumServlet();
+ getTransactionInfoByIdServlet = new GetTransactionInfoByIdServlet();
+ getTransactionListFromPendingServlet = new GetTransactionListFromPendingServlet();
+ getTransactionReceiptByIdServlet = new GetTransactionReceiptByIdServlet();
+ getTransactionSignWeightServlet = new GetTransactionSignWeightServlet();
+ getTriggerInputForShieldedTRC20ContractServlet =
+ new GetTriggerInputForShieldedTRC20ContractServlet();
+ getZenPaymentAddressServlet = new GetZenPaymentAddressServlet();
+ isShieldedTRC20ContractNoteSpentServlet = new IsShieldedTRC20ContractNoteSpentServlet();
+ isSpendServlet = new IsSpendServlet();
+ listExchangesServlet = new ListExchangesServlet();
+ listNodesServlet = new ListNodesServlet();
+ listProposalsServlet = new ListProposalsServlet();
+ listWitnessesServlet = new ListWitnessesServlet();
+ getPaginatedNowWitnessListServlet = new GetPaginatedNowWitnessListServlet();
+ marketCancelOrderServlet = new MarketCancelOrderServlet();
+ marketSellAssetServlet = new MarketSellAssetServlet();
+ metricsServlet = new MetricsServlet();
+ participateAssetIssueServlet = new ParticipateAssetIssueServlet();
+ proposalApproveServlet = new ProposalApproveServlet();
+ proposalCreateServlet = new ProposalCreateServlet();
+ proposalDeleteServlet = new ProposalDeleteServlet();
+ scanAndMarkNoteByIvkServlet = new ScanAndMarkNoteByIvkServlet();
+ scanNoteByIvkServlet = new ScanNoteByIvkServlet();
+ scanNoteByOvkServlet = new ScanNoteByOvkServlet();
+ scanShieldedTRC20NotesByIvkServlet = new ScanShieldedTRC20NotesByIvkServlet();
+ scanShieldedTRC20NotesByOvkServlet = new ScanShieldedTRC20NotesByOvkServlet();
+ setAccountIdServlet = new SetAccountIdServlet();
+ totalTransactionServlet = new TotalTransactionServlet();
+ transferAssetServlet = new TransferAssetServlet();
+ transferServlet = new TransferServlet();
+ triggerConstantContractServlet = new TriggerConstantContractServlet();
+ triggerSmartContractServlet = new TriggerSmartContractServlet();
+ unDelegateResourceServlet = new UnDelegateResourceServlet();
+ unFreezeAssetServlet = new UnFreezeAssetServlet();
+ unFreezeBalanceServlet = new UnFreezeBalanceServlet();
+ unFreezeBalanceV2Servlet = new UnFreezeBalanceV2Servlet();
+ updateAccountServlet = new UpdateAccountServlet();
+ updateAssetServlet = new UpdateAssetServlet();
+ updateBrokerageServlet = new UpdateBrokerageServlet();
+ updateEnergyLimitServlet = new UpdateEnergyLimitServlet();
+ updateSettingServlet = new UpdateSettingServlet();
+ updateWitnessServlet = new UpdateWitnessServlet();
+ validateAddressServlet = new ValidateAddressServlet();
+ voteWitnessAccountServlet = new VoteWitnessAccountServlet();
+ withdrawBalanceServlet = new WithdrawBalanceServlet();
+ withdrawExpireUnfreezeServlet = new WithdrawExpireUnfreezeServlet();
+ cancelAllUnfreezeV2Servlet = new CancelAllUnfreezeV2Servlet();
+ request = new MockHttpServletRequest();
+ request.setCharacterEncoding("UTF-8");
+ response = new MockHttpServletResponse();
+ }
+
+ @Test
+ public void doGetTest() {
+ accountPermissionUpdateServlet.doGet(request, response);
+ clearABIServlet.doGet(request, response);
+ createAssetIssueServlet.doGet(request, response);
+ createShieldedContractParametersServlet.doGet(request, response);
+ createShieldedContractParametersWithoutAskServlet.doGet(request, response);
+ createShieldedTransactionServlet.doGet(request, response);
+ createShieldedTransactionWithoutSpendAuthSigServlet.doGet(request, response);
+ createShieldNullifierServlet.doGet(request, response);
+ createSpendAuthSigServlet.doGet(request, response);
+ createWitnessServlet.doGet(request, response);
+ deployContractServlet.doGet(request, response);
+ estimateEnergyServlet.doGet(request, response);
+ getAccountByIdServlet.doGet(request, response);
+ getAccountNetServlet.doGet(request, response);
+ getAccountResourceServlet.doGet(request, response);
+ getAccountServlet.doGet(request, response);
+ getAkFromAskServlet.doGet(request, response);
+ getAssetIssueByAccountServlet.doGet(request, response);
+ getAssetIssueByIdServlet.doGet(request, response);
+ getAssetIssueByNameServlet.doGet(request, response);
+ getAssetIssueListByNameServlet.doGet(request, response);
+ getAssetIssueListServlet.doGet(request, response);
+ getAvailableUnfreezeCountServlet.doGet(request, response);
+ getBandwidthPricesServlet.doGet(request, response);
+ getBlockByIdServlet.doGet(request, response);
+ getBlockByLatestNumServlet.doGet(request, response);
+ getBlockByLimitNextServlet.doGet(request, response);
+ getBlockByNumServlet.doGet(request, response);
+ getBlockServlet.doGet(request, response);
+ getBrokerageServlet.doGet(request, response);
+ getBurnTrxServlet.doGet(request, response);
+ getCanDelegatedMaxSizeServlet.doGet(request, response);
+ getCanWithdrawUnfreezeAmountServlet.doGet(request, response);
+ getChainParametersServlet.doGet(request, response);
+ getContractInfoServlet.doGet(request, response);
+ getContractServlet.doGet(request, response);
+ getDelegatedResourceAccountIndexServlet.doGet(request, response);
+ getDelegatedResourceAccountIndexV2Servlet.doGet(request, response);
+ getDelegatedResourceServlet.doGet(request, response);
+ getDelegatedResourceV2Servlet.doGet(request, response);
+ getDiversifierServlet.doGet(request, response);
+ getEnergyPricesServlet.doGet(request, response);
+ getExchangeByIdServlet.doGet(request, response);
+ getExpandedSpendingKeyServlet.doGet(request, response);
+ getIncomingViewingKeyServlet.doGet(request, response);
+ getMarketOrderByAccountServlet.doGet(request, response);
+ getMarketOrderByIdServlet.doGet(request, response);
+ getMarketOrderListByPairServlet.doGet(request, response);
+ getMarketPairListServlet.doGet(request, response);
+ getMarketPriceByPairServlet.doGet(request, response);
+ getMemoFeePricesServlet.doGet(request, response);
+ getMerkleTreeVoucherInfoServlet.doGet(request, response);
+ getNewShieldedAddressServlet.doGet(request, response);
+ getNextMaintenanceTimeServlet.doGet(request, response);
+ getNkFromNskServlet.doGet(request, response);
+ getNodeInfoServlet.doGet(request, response);
+ getNowBlockServlet.doGet(request, response);
+ getPaginatedAssetIssueListServlet.doGet(request, response);
+ getPaginatedExchangeListServlet.doGet(request, response);
+ getPaginatedProposalListServlet.doGet(request, response);
+ getPendingSizeServlet.doGet(request, response);
+ getProposalByIdServlet.doGet(request, response);
+ getRcmServlet.doGet(request, response);
+ getRewardServlet.doGet(request, response);
+ getShieldTransactionHashServlet.doGet(request, response);
+ getSpendingKeyServlet.doGet(request, response);
+ getTransactionApprovedListServlet.doGet(request, response);
+ getTransactionByIdServlet.doGet(request, response);
+ getTransactionCountByBlockNumServlet.doGet(request, response);
+ getTransactionFromPendingServlet.doGet(request, response);
+ getTransactionInfoByBlockNumServlet.doGet(request, response);
+ getTransactionInfoByIdServlet.doGet(request, response);
+ getTransactionListFromPendingServlet.doGet(request, response);
+ getTransactionReceiptByIdServlet.doGet(request, response);
+ getTransactionSignWeightServlet.doGet(request, response);
+ getTriggerInputForShieldedTRC20ContractServlet.doGet(request, response);
+ getZenPaymentAddressServlet.doGet(request, response);
+ isShieldedTRC20ContractNoteSpentServlet.doGet(request, response);
+ isSpendServlet.doGet(request, response);
+ listExchangesServlet.doGet(request, response);
+ listNodesServlet.doGet(request, response);
+ listProposalsServlet.doGet(request, response);
+ listWitnessesServlet.doGet(request, response);
+ getPaginatedNowWitnessListServlet.doGet(request, response);
+ marketCancelOrderServlet.doGet(request, response);
+ marketSellAssetServlet.doGet(request, response);
+ metricsServlet.doGet(request, response);
+ participateAssetIssueServlet.doGet(request, response);
+ proposalApproveServlet.doGet(request, response);
+ proposalCreateServlet.doGet(request, response);
+ proposalDeleteServlet.doGet(request, response);
+ scanAndMarkNoteByIvkServlet.doGet(request, response);
+ scanNoteByIvkServlet.doGet(request, response);
+ scanNoteByOvkServlet.doGet(request, response);
+ scanShieldedTRC20NotesByIvkServlet.doGet(request, response);
+ scanShieldedTRC20NotesByOvkServlet.doGet(request, response);
+ setAccountIdServlet.doGet(request, response);
+ totalTransactionServlet.doGet(request, response);
+ transferAssetServlet.doGet(request, response);
+ transferServlet.doGet(request, response);
+ triggerConstantContractServlet.doGet(request, response);
+ triggerSmartContractServlet.doGet(request, response);
+ unDelegateResourceServlet.doGet(request, response);
+ unFreezeAssetServlet.doGet(request, response);
+ unFreezeBalanceServlet.doGet(request, response);
+ unFreezeBalanceV2Servlet.doGet(request, response);
+ updateAccountServlet.doGet(request, response);
+ updateAssetServlet.doGet(request, response);
+ updateEnergyLimitServlet.doGet(request, response);
+ updateSettingServlet.doGet(request, response);
+ updateWitnessServlet.doGet(request, response);
+ validateAddressServlet.doGet(request, response);
+ voteWitnessAccountServlet.doGet(request, response);
+ withdrawBalanceServlet.doGet(request, response);
+ withdrawExpireUnfreezeServlet.doGet(request, response);
+ }
+
+
+ @Test
+ public void doPostTest() {
+ request.addParameter("owner_address", "TZ4UXDV5ZhNW7fb2AMSbgfAEZ7hWsnYS2g");
+ accountPermissionUpdateServlet.doPost(request, response);
+ broadcastHexServlet.doPost(request, response);
+ broadcastServlet.doPost(request, response);
+ clearABIServlet.doPost(request, response);
+ createAccountServlet.doPost(request, response);
+ createAssetIssueServlet.doPost(request, response);
+ createCommonTransactionServlet.doPost(request, response);
+ createShieldedContractParametersServlet.doPost(request, response);
+ createShieldedContractParametersWithoutAskServlet.doPost(request, response);
+ createShieldedTransactionServlet.doPost(request, response);
+ createShieldedTransactionWithoutSpendAuthSigServlet.doPost(request, response);
+ createShieldNullifierServlet.doPost(request, response);
+ createSpendAuthSigServlet.doPost(request, response);
+ createWitnessServlet.doPost(request, response);
+ delegateResourceServlet.doPost(request, response);
+ deployContractServlet.doPost(request, response);
+ exchangeCreateServlet.doPost(request, response);
+ exchangeInjectServlet.doPost(request, response);
+ exchangeTransactionServlet.doPost(request, response);
+ exchangeWithdrawServlet.doPost(request, response);
+ freezeBalanceServlet.doPost(request, response);
+ freezeBalanceV2Servlet.doPost(request, response);
+ getAccountBalanceServlet.doPost(request, response);
+ getAccountByIdServlet.doPost(request, response);
+ getAccountNetServlet.doPost(request, response);
+ getAccountResourceServlet.doPost(request, response);
+ getAccountServlet.doPost(request, response);
+ getAkFromAskServlet.doPost(request, response);
+ getAssetIssueByAccountServlet.doPost(request, response);
+ getAssetIssueByIdServlet.doPost(request, response);
+ getAssetIssueByNameServlet.doPost(request, response);
+ getAssetIssueListByNameServlet.doPost(request, response);
+ getAssetIssueListServlet.doPost(request, response);
+ getAvailableUnfreezeCountServlet.doPost(request, response);
+ getBandwidthPricesServlet.doPost(request, response);
+ getBlockBalanceServlet.doPost(request, response);
+ getBlockByIdServlet.doPost(request, response);
+ getBlockByLatestNumServlet.doPost(request, response);
+ getBlockByLimitNextServlet.doPost(request, response);
+ getBlockByNumServlet.doPost(request, response);
+ getBlockServlet.doPost(request, response);
+ getBrokerageServlet.doPost(request, response);
+ getBurnTrxServlet.doPost(request, response);
+ getCanDelegatedMaxSizeServlet.doPost(request, response);
+ getCanWithdrawUnfreezeAmountServlet.doPost(request, response);
+ getChainParametersServlet.doPost(request, response);
+ getContractInfoServlet.doPost(request, response);
+ getContractServlet.doPost(request, response);
+ getDelegatedResourceAccountIndexServlet.doPost(request, response);
+ getDelegatedResourceAccountIndexV2Servlet.doPost(request, response);
+ getDelegatedResourceServlet.doPost(request, response);
+ getDelegatedResourceV2Servlet.doPost(request, response);
+ getDiversifierServlet.doPost(request, response);
+ getEnergyPricesServlet.doPost(request, response);
+ getExchangeByIdServlet.doPost(request, response);
+ getExpandedSpendingKeyServlet.doPost(request, response);
+ getIncomingViewingKeyServlet.doPost(request, response);
+ getMarketOrderByAccountServlet.doPost(request, response);
+ getMarketOrderByIdServlet.doPost(request, response);
+ getMarketOrderListByPairServlet.doPost(request, response);
+ getMarketPairListServlet.doPost(request, response);
+ getMarketPriceByPairServlet.doPost(request, response);
+ getMemoFeePricesServlet.doPost(request, response);
+ getMerkleTreeVoucherInfoServlet.doPost(request, response);
+ getNewShieldedAddressServlet.doPost(request, response);
+ getNextMaintenanceTimeServlet.doPost(request, response);
+ getNkFromNskServlet.doPost(request, response);
+ getNodeInfoServlet.doPost(request, response);
+ getNowBlockServlet.doPost(request, response);
+ getPaginatedAssetIssueListServlet.doPost(request, response);
+ getPaginatedExchangeListServlet.doPost(request, response);
+ getPaginatedProposalListServlet.doPost(request, response);
+ getPendingSizeServlet.doPost(request, response);
+ getProposalByIdServlet.doPost(request, response);
+ getRcmServlet.doPost(request, response);
+ getRewardServlet.doPost(request, response);
+ getShieldTransactionHashServlet.doPost(request, response);
+ getSpendingKeyServlet.doPost(request, response);
+ getTransactionApprovedListServlet.doPost(request, response);
+ getTransactionByIdServlet.doPost(request, response);
+ getTransactionCountByBlockNumServlet.doPost(request, response);
+ getTransactionFromPendingServlet.doPost(request, response);
+ getTransactionInfoByBlockNumServlet.doPost(request, response);
+ getTransactionInfoByIdServlet.doPost(request, response);
+ getTransactionListFromPendingServlet.doPost(request, response);
+ getTransactionReceiptByIdServlet.doPost(request, response);
+ getTransactionSignWeightServlet.doPost(request, response);
+ getTriggerInputForShieldedTRC20ContractServlet.doPost(request, response);
+ getZenPaymentAddressServlet.doPost(request, response);
+ isShieldedTRC20ContractNoteSpentServlet.doPost(request, response);
+ isSpendServlet.doPost(request, response);
+ listExchangesServlet.doPost(request, response);
+ listNodesServlet.doPost(request, response);
+ listProposalsServlet.doPost(request, response);
+ listWitnessesServlet.doPost(request, response);
+ getPaginatedNowWitnessListServlet.doPost(request, response);
+ marketCancelOrderServlet.doPost(request, response);
+ marketSellAssetServlet.doPost(request, response);
+ participateAssetIssueServlet.doPost(request, response);
+ proposalApproveServlet.doPost(request, response);
+ proposalCreateServlet.doPost(request, response);
+ proposalDeleteServlet.doPost(request, response);
+ scanAndMarkNoteByIvkServlet.doPost(request, response);
+ scanNoteByIvkServlet.doPost(request, response);
+ scanNoteByOvkServlet.doPost(request, response);
+ scanShieldedTRC20NotesByIvkServlet.doPost(request, response);
+ scanShieldedTRC20NotesByOvkServlet.doPost(request, response);
+ setAccountIdServlet.doPost(request, response);
+ totalTransactionServlet.doPost(request, response);
+ transferAssetServlet.doPost(request, response);
+ transferServlet.doPost(request, response);
+ unDelegateResourceServlet.doPost(request, response);
+ unFreezeAssetServlet.doPost(request, response);
+ unFreezeBalanceServlet.doPost(request, response);
+ unFreezeBalanceV2Servlet.doPost(request, response);
+ updateAccountServlet.doPost(request, response);
+ updateAssetServlet.doPost(request, response);
+ updateBrokerageServlet.doPost(request, response);
+ updateEnergyLimitServlet.doPost(request, response);
+ updateSettingServlet.doPost(request, response);
+ updateWitnessServlet.doPost(request, response);
+ validateAddressServlet.doPost(request, response);
+ voteWitnessAccountServlet.doPost(request, response);
+ withdrawBalanceServlet.doPost(request, response);
+ withdrawExpireUnfreezeServlet.doPost(request, response);
+ cancelAllUnfreezeV2Servlet.doPost(request, response);
+ }
+
+}
diff --git a/framework/src/test/java/org/tron/core/services/http/TriggerConstantContractServletTest.java b/framework/src/test/java/org/tron/core/services/http/TriggerConstantContractServletTest.java
index 4a0643e6cff..204615d484c 100644
--- a/framework/src/test/java/org/tron/core/services/http/TriggerConstantContractServletTest.java
+++ b/framework/src/test/java/org/tron/core/services/http/TriggerConstantContractServletTest.java
@@ -1,8 +1,10 @@
package org.tron.core.services.http;
import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertTrue;
import static org.mockito.ArgumentMatchers.any;
+import static org.mockito.Mockito.never;
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.when;
@@ -13,6 +15,7 @@
import org.tron.common.crypto.ECKey;
import org.tron.common.utils.ByteArray;
import org.tron.core.capsule.TransactionCapsule;
+import org.tron.core.exception.ContractValidateException;
import org.tron.json.JSONObject;
import org.tron.protos.contract.SmartContractOuterClass.TriggerSmartContract;
@@ -63,4 +66,45 @@ public void testManyFlatFieldsDoesNotOverflowStack() throws Exception {
assertTrue(json.containsKey("transaction"));
assertTrue(json.getJSONObject("transaction").containsKey("txID"));
}
+
+ @Test
+ public void testContractValidationErrorIsReturned() throws Exception {
+ String owner = ByteArray.toHexString(new ECKey().getAddress());
+ String contract = ByteArray.toHexString(new ECKey().getAddress());
+ when(wallet.createTransactionCapsule(any(), any()))
+ .thenThrow(new ContractValidateException("invalid contract"));
+ MockHttpServletResponse response = newResponse();
+
+ servlet.doPost(postRequest("{\"owner_address\":\"" + owner
+ + "\",\"contract_address\":\"" + contract
+ + "\",\"function_selector\":\"test()\"}"), response);
+
+ JSONObject result = JSONObject.parseObject(response.getContentAsString())
+ .getJSONObject("result");
+ assertFalse(result.containsKey("result"));
+ assertEquals("CONTRACT_VALIDATE_ERROR", result.getString("code"));
+ assertEquals("invalid contract", decodeMessage(result));
+ verify(wallet, never()).triggerConstantContract(any(), any(), any(), any());
+ }
+
+ @Test
+ public void testMissingOwnerReturnsBusinessErrorWithoutCallingWallet() throws Exception {
+ String contract = ByteArray.toHexString(new ECKey().getAddress());
+ MockHttpServletResponse response = newResponse();
+
+ servlet.doPost(postRequest("{\"contract_address\":\"" + contract + "\"}"), response);
+
+ JSONObject result = JSONObject.parseObject(response.getContentAsString())
+ .getJSONObject("result");
+ assertFalse(result.containsKey("result"));
+ assertEquals("OTHER_ERROR", result.getString("code"));
+ assertEquals("class java.security.InvalidParameterException : owner_address isn't set.",
+ decodeMessage(result));
+ verify(wallet, never()).createTransactionCapsule(any(), any());
+ verify(wallet, never()).triggerConstantContract(any(), any(), any(), any());
+ }
+
+ private static String decodeMessage(JSONObject result) {
+ return ByteString.copyFrom(ByteArray.fromHexString(result.getString("message"))).toStringUtf8();
+ }
}
From 6ebcb1bd2ba3cfbad7d78663deddf96078bf50fd Mon Sep 17 00:00:00 2001
From: 3for <287494524@qq.com>
Date: Thu, 27 Aug 2026 21:47:09 +0800
Subject: [PATCH 8/8] test(core): align transfer-to-contract setup with account
store
---
.../core/actuator/TransferActuatorTest.java | 39 +++----------------
1 file changed, 6 insertions(+), 33 deletions(-)
diff --git a/framework/src/test/java/org/tron/core/actuator/TransferActuatorTest.java b/framework/src/test/java/org/tron/core/actuator/TransferActuatorTest.java
index 897fa3f06cf..e30bf0880fe 100644
--- a/framework/src/test/java/org/tron/core/actuator/TransferActuatorTest.java
+++ b/framework/src/test/java/org/tron/core/actuator/TransferActuatorTest.java
@@ -7,25 +7,18 @@
import com.google.protobuf.ByteString;
import java.util.Date;
import lombok.extern.slf4j.Slf4j;
-import org.bouncycastle.util.encoders.Hex;
import org.junit.Assert;
import org.junit.Before;
import org.junit.Test;
import org.tron.common.BaseTest;
import org.tron.common.TestConstants;
-import org.tron.common.runtime.TvmTestUtils;
import org.tron.common.utils.ByteArray;
import org.tron.core.Wallet;
import org.tron.core.capsule.AccountCapsule;
import org.tron.core.capsule.TransactionResultCapsule;
import org.tron.core.config.args.Args;
-import org.tron.core.exception.BalanceInsufficientException;
import org.tron.core.exception.ContractExeException;
import org.tron.core.exception.ContractValidateException;
-import org.tron.core.exception.ReceiptCheckErrException;
-import org.tron.core.exception.VMIllegalException;
-import org.tron.core.store.StoreFactory;
-import org.tron.core.vm.repository.RepositoryImpl;
import org.tron.protos.Protocol.AccountType;
import org.tron.protos.Protocol.Transaction.Result.code;
import org.tron.protos.contract.AssetIssueContractOuterClass;
@@ -467,33 +460,13 @@ public void commonErrorCheck() {
}
@Test
- public void transferToSmartContractAddress()
- throws ContractExeException, ReceiptCheckErrException, VMIllegalException,
- ContractValidateException, BalanceInsufficientException {
+ public void transferToSmartContractAddress() {
dbManager.getDynamicPropertiesStore().saveForbidTransferToContract(1);
- String contractName = "testContract";
- byte[] address = Hex.decode(OWNER_ADDRESS);
- String ABI =
- "[]";
- String codes = "608060405261019c806100136000396000f3fe608060405260043610610045577c0100000000000"
- + "00000000000000000000000000000000000000000000060003504632a205edf811461004a5780634cd2270c"
- + "146100c8575b600080fd5b34801561005657600080fd5b50d3801561006357600080fd5b50d2801561007057"
- + "600080fd5b506100c6600480360360c081101561008757600080fd5b5073ffffffffffffffffffffffffffff"
- + "ffffffffffff813581169160208101358216916040820135169060608101359060808101359060a001356100"
- + "d0565b005b6100c661016e565b60405173ffffffffffffffffffffffffffffffffffffffff87169084156108"
- + "fc029085906000818181858888f1505060405173ffffffffffffffffffffffffffffffffffffffff89169350"
- + "85156108fc0292508591506000818181858888f1505060405173ffffffffffffffffffffffffffffffffffff"
- + "ffff8816935084156108fc0292508491506000818181858888f15050505050505050505050565b56fea16562"
- + "7a7a72305820cc2d598d1b3f968bbdc7825ce83d22dad48192f4bf95bda7f9e4ddf61669ba830029";
-
- long value = 1;
- long feeLimit = 100000000;
- long consumeUserResourcePercent = 0;
- RepositoryImpl repository = RepositoryImpl.createRoot(StoreFactory.getInstance());
- byte[] contractAddress = TvmTestUtils
- .deployContractWholeProcessReturnContractAddress(contractName, address, ABI, codes, value,
- feeLimit, consumeUserResourcePercent, null, 0, 0,
- repository, null);
+ byte[] contractAddress = ByteArray.fromHexString(TO_ADDRESS);
+ AccountCapsule contractAccount = new AccountCapsule(
+ ByteString.copyFromUtf8("contract"), ByteString.copyFrom(contractAddress),
+ AccountType.Contract, 0);
+ dbManager.getAccountStore().put(contractAddress, contractAccount);
TransferActuator actuator = new TransferActuator();
actuator.setChainBaseManager(dbManager.getChainBaseManager())