From 54e95f43d9e9f9b1ccf840decf569c106be2c60c Mon Sep 17 00:00:00 2001 From: 3for <287494524@qq.com> Date: Thu, 27 Aug 2026 08:17:57 +0800 Subject: [PATCH 1/8] chore: clean stale dependency metadata and align account test - remove unused InfluxDB, c3p0, mchange, and HikariCP verification entries - align the null-address GetAccount test with the actual empty response - rename the test to reflect its expected behavior --- .../services/http/GetAccountServletTest.java | 8 ++--- gradle/verification-metadata.xml | 32 ------------------- 2 files changed, 4 insertions(+), 36 deletions(-) diff --git a/framework/src/test/java/org/tron/core/services/http/GetAccountServletTest.java b/framework/src/test/java/org/tron/core/services/http/GetAccountServletTest.java index 1c1d42c9a5c..a0a024669d4 100644 --- a/framework/src/test/java/org/tron/core/services/http/GetAccountServletTest.java +++ b/framework/src/test/java/org/tron/core/services/http/GetAccountServletTest.java @@ -47,17 +47,17 @@ public void testGetAccountPost() throws Exception { } @Test - public void testGetAccountPostNullAddressKeepsDefault() throws Exception { + public void testGetAccountPostNullAddressReturnsEmptyResponse() throws Exception { MockHttpServletRequest request = postRequest("{\"address\": null}"); + when(wallet.getAccount(argThat(req -> req != null + && req.getAddress().equals(ByteString.EMPTY)))).thenReturn(null); MockHttpServletResponse response = newResponse(); servlet.doPost(request, response); assertEquals(200, response.getStatus()); verify(wallet).getAccount(argThat(req -> req != null && req.getAddress().equals(ByteString.EMPTY))); - String content = response.getContentAsString(); - assertFalse("Should not contain error", content.contains("\"Error\"")); - assertTrue("Should contain address", content.contains("address")); + assertEquals("{}", response.getContentAsString().trim()); } @Test diff --git a/gradle/verification-metadata.xml b/gradle/verification-metadata.xml index 6a3e641d5d6..75b750f3432 100644 --- a/gradle/verification-metadata.xml +++ b/gradle/verification-metadata.xml @@ -287,14 +287,6 @@ - - - - - - - - @@ -873,22 +865,6 @@ - - - - - - - - - - - - - - - - @@ -962,14 +938,6 @@ - - - - - - - - From 3787e9e68493aef9b06753b9cde1e24f690efe84 Mon Sep 17 00:00:00 2001 From: 3for <287494524@qq.com> Date: Thu, 27 Aug 2026 12:52:11 +0800 Subject: [PATCH 2/8] test: remove obsolete standalone test artifacts --- .../java/org/tron/common/command/CliTest.java | 27 - .../org/tron/common/utils/LoggerTest.java | 31 - .../tron/core/consensus/client/ReadIp.java | 44 -- .../tron/core/consensus/server/TronTest.java | 51 -- .../core/services/http/HttpServletTest.java | 538 ------------------ 5 files changed, 691 deletions(-) delete mode 100644 framework/src/test/java/org/tron/common/command/CliTest.java delete mode 100644 framework/src/test/java/org/tron/common/utils/LoggerTest.java delete mode 100755 framework/src/test/java/org/tron/core/consensus/client/ReadIp.java delete mode 100755 framework/src/test/java/org/tron/core/consensus/server/TronTest.java delete mode 100644 framework/src/test/java/org/tron/core/services/http/HttpServletTest.java diff --git a/framework/src/test/java/org/tron/common/command/CliTest.java b/framework/src/test/java/org/tron/common/command/CliTest.java deleted file mode 100644 index bfcf02eba61..00000000000 --- a/framework/src/test/java/org/tron/common/command/CliTest.java +++ /dev/null @@ -1,27 +0,0 @@ -/* - * java-tron is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * java-tron is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ - -package org.tron.common.command; - -import lombok.extern.slf4j.Slf4j; - -@Slf4j -public class CliTest { - // @Test - // public void testCli() { - // Cli cli = new Cli(); - // cli.run(Peer.getInstance(Peer.PEER_NORMAL)); - // } -} diff --git a/framework/src/test/java/org/tron/common/utils/LoggerTest.java b/framework/src/test/java/org/tron/common/utils/LoggerTest.java deleted file mode 100644 index 249eae31123..00000000000 --- a/framework/src/test/java/org/tron/common/utils/LoggerTest.java +++ /dev/null @@ -1,31 +0,0 @@ -/* - * java-tron is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * java-tron is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ - -package org.tron.common.utils; - -import lombok.extern.slf4j.Slf4j; -import org.junit.Test; - -@Slf4j -public class LoggerTest { - - @Test - public void testLogger() { - logger.debug("test debug: {}", "success"); - logger.info("test info: {}", "success"); - logger.warn("test warn: {}", "success"); - logger.error("test error: {}", "success"); - } -} diff --git a/framework/src/test/java/org/tron/core/consensus/client/ReadIp.java b/framework/src/test/java/org/tron/core/consensus/client/ReadIp.java deleted file mode 100755 index 25b08cdb3e5..00000000000 --- a/framework/src/test/java/org/tron/core/consensus/client/ReadIp.java +++ /dev/null @@ -1,44 +0,0 @@ -/* - * java-tron is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * java-tron is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ - -package org.tron.core.consensus.client; - -import java.io.BufferedReader; -import java.io.FileInputStream; -import java.io.IOException; -import java.io.InputStreamReader; -import lombok.extern.slf4j.Slf4j; - -@Slf4j -public class ReadIp { - - /** - * readFile from path. - */ - public String readFile(String path) { - String laststr = ""; - try (BufferedReader reader = - new BufferedReader(new InputStreamReader(new FileInputStream(path), "UTF-8"))) { - String tempString = null; - while ((tempString = reader.readLine()) != null) { - laststr += tempString; - } - } catch (IOException e) { - logger.debug(e.getMessage(), e); - } - return laststr; - } - -} diff --git a/framework/src/test/java/org/tron/core/consensus/server/TronTest.java b/framework/src/test/java/org/tron/core/consensus/server/TronTest.java deleted file mode 100755 index 5746a3cb59c..00000000000 --- a/framework/src/test/java/org/tron/core/consensus/server/TronTest.java +++ /dev/null @@ -1,51 +0,0 @@ -/* - * java-tron is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * java-tron is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ - -package org.tron.core.consensus.server; - -import java.net.Inet4Address; -import java.net.InetAddress; -import java.net.NetworkInterface; -import java.util.Enumeration; -import lombok.extern.slf4j.Slf4j; - -@Slf4j -public class TronTest { - - /** - * main of trontest. - */ - public static void main(String[] args) { - try { - Enumeration allNetInterfaces = NetworkInterface.getNetworkInterfaces(); - InetAddress ip = null; - while (allNetInterfaces.hasMoreElements()) { - NetworkInterface netInterface = (NetworkInterface) allNetInterfaces.nextElement(); - System.out.println(netInterface.getName()); - Enumeration addresses = netInterface.getInetAddresses(); - while (addresses.hasMoreElements()) { - ip = (InetAddress) addresses.nextElement(); - if (ip != null && ip instanceof Inet4Address) { - System.out.println("IP = " + ip.getHostAddress()); - } - } - } - } catch (Exception e) { - logger.debug(e.getMessage(), e); - } - - - } -} 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 deleted file mode 100644 index 03cf11f39a1..00000000000 --- a/framework/src/test/java/org/tron/core/services/http/HttpServletTest.java +++ /dev/null @@ -1,538 +0,0 @@ -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); - } - -} From 0726402af13d6ccae57c637e98dd59ae31ef9601 Mon Sep 17 00:00:00 2001 From: 3for <287494524@qq.com> Date: Thu, 27 Aug 2026 12:52:34 +0800 Subject: [PATCH 3/8] test(api): align service tests with current behavior --- .../java/org/tron/core/WalletMockTest.java | 79 +++- .../test/java/org/tron/core/WalletTest.java | 94 +---- .../java/org/tron/core/jsonrpc/BloomTest.java | 61 +-- .../core/jsonrpc/BuildTransactionTest.java | 16 +- .../org/tron/core/jsonrpc/JsonRpcTest.java | 160 +++----- .../tron/core/jsonrpc/JsonrpcServiceTest.java | 13 +- .../tron/core/jsonrpc/WalletCursorTest.java | 43 ++- .../java/org/tron/core/pbft/PbftApiTest.java | 16 +- .../core/services/RpcApiServicesTest.java | 359 ++++++++---------- .../filter/CachedBodyRequestWrapperTest.java | 15 +- .../filter/LiteFnQueryHttpFilterTest.java | 202 +++++----- .../services/http/BroadcastServletTest.java | 211 +++------- .../http/GetAccountByIdServletTest.java | 87 +++-- .../GetAssetIssueListByNameServletTest.java | 4 +- .../http/GetAssetIssueListServletTest.java | 103 ++--- .../http/GetBandwidthPricesServletTest.java | 2 +- .../http/GetBlockByIdServletTest.java | 84 ++-- .../http/GetBlockByNumServletTest.java | 41 +- .../http/GetEnergyPricesServletTest.java | 2 +- .../http/GetMemoFeePricesServletTest.java | 2 +- ...TransactionListFromPendingServletTest.java | 8 +- .../services/http/JsonFormatEscapeTest.java | 4 +- .../core/services/http/JsonFormatTest.java | 51 ++- .../services/http/ListNodesServletTest.java | 113 +++--- .../http/ListProposalsServletTest.java | 100 ++--- .../TriggerConstantContractServletTest.java | 19 +- .../http/TriggerSmartContractServletTest.java | 147 +++---- .../http/UpdateAccountServletTest.java | 65 ++-- .../tron/core/services/http/UtilMockTest.java | 102 +++-- ...GetTransactionByIdSolidityServletTest.java | 218 ++--------- .../mockito/HttpUrlStreamHandler.java | 30 -- .../GetBandwidthPricesOnPBFTServletTest.java | 2 +- .../GetEnergyPricesOnPBFTServletTest.java | 2 +- ...tBandwidthPricesOnSolidityServletTest.java | 2 +- .../GetEnergyPricesOnSolidityServletTest.java | 2 +- 35 files changed, 1013 insertions(+), 1446 deletions(-) delete mode 100644 framework/src/test/java/org/tron/core/services/http/solidity/mockito/HttpUrlStreamHandler.java diff --git a/framework/src/test/java/org/tron/core/WalletMockTest.java b/framework/src/test/java/org/tron/core/WalletMockTest.java index 2f4c08d8f9f..a4543dadd24 100644 --- a/framework/src/test/java/org/tron/core/WalletMockTest.java +++ b/framework/src/test/java/org/tron/core/WalletMockTest.java @@ -5,6 +5,7 @@ import static org.junit.Assert.assertNull; import static org.junit.Assert.assertThrows; import static org.junit.Assert.assertTrue; +import static org.mockito.AdditionalMatchers.aryEq; import static org.mockito.ArgumentMatchers.any; import static org.mockito.ArgumentMatchers.anyLong; import static org.mockito.Mockito.doReturn; @@ -108,7 +109,8 @@ public void testSetTransactionNullException() throws Exception { Method privateMethod = Wallet.class.getDeclaredMethod( "setTransaction", TransactionCapsule.class); privateMethod.setAccessible(true); - privateMethod.invoke(wallet, transactionCapsuleMock); + assertNull(privateMethod.invoke(wallet, transactionCapsuleMock)); + Mockito.verifyNoInteractions(transactionCapsuleMock); } @Test @@ -131,7 +133,10 @@ public void testCreateTransactionCapsuleWithoutValidateWithTimeoutNullException( Protocol.Transaction.Contract.ContractType.class, long.class); privateMethod.setAccessible(true); - privateMethod.invoke(wallet, message, contractType, timeout); + Object result = privateMethod.invoke(wallet, message, contractType, timeout); + + assertEquals(1, mocked.constructed().size()); + assertEquals(mocked.constructed().get(0), result); } } @@ -157,6 +162,7 @@ public void testCreateTransactionCapsuleWithoutValidateWithTimeout() field.set(wallet, chainBaseManagerMock); when(chainBaseManagerMock.getHeadBlockId()).thenReturn(blockId); + when(chainBaseManagerMock.getSolidBlockId()).thenReturn(blockId); Method privateMethod = Wallet.class.getDeclaredMethod( "createTransactionCapsuleWithoutValidateWithTimeout", @@ -164,7 +170,14 @@ public void testCreateTransactionCapsuleWithoutValidateWithTimeout() Protocol.Transaction.Contract.ContractType.class, long.class); privateMethod.setAccessible(true); - privateMethod.invoke(wallet, message, contractType, timeout); + Object result = privateMethod.invoke(wallet, message, contractType, timeout); + + assertEquals(1, mocked.constructed().size()); + TransactionCapsule constructed = mocked.constructed().get(0); + assertEquals(constructed, result); + Mockito.verify(chainBaseManagerMock).getHeadBlockTimeStamp(); + Mockito.verify(constructed).setExpiration(timeout * 1000); + Mockito.verify(constructed).setTimestamp(); } } @@ -620,9 +633,11 @@ public void testGetTransactionById() throws Exception { } @Test - public void testGetTransactionById2() throws Exception { + public void testGetTransactionByIdReturnsNullOnStoreException() throws Exception { Wallet wallet = new Wallet(); - ByteString transactionId = ByteString.empty(); + byte[] transactionIdBytes = Sha256Hash.of(true, + "unreadable-transaction-id".getBytes(StandardCharsets.UTF_8)).getBytes(); + ByteString transactionId = ByteString.copyFrom(transactionIdBytes); ChainBaseManager chainBaseManagerMock = mock(ChainBaseManager.class); TransactionStore transactionStoreMock = mock(TransactionStore.class); @@ -630,16 +645,32 @@ public void testGetTransactionById2() throws Exception { Field field = wallet.getClass().getDeclaredField("chainBaseManager"); field.setAccessible(true); field.set(wallet, chainBaseManagerMock); - doThrow(new BadItemException()).when(transactionStoreMock).get(any()); + doThrow(new BadItemException()).when(transactionStoreMock).get(aryEq(transactionIdBytes)); Protocol.Transaction transaction = wallet.getTransactionById(transactionId); assertNull(transaction); } @Test - public void testGetTransactionById3() throws Exception { + public void testGetTransactionByEmptyIdReturnsNullWhenMissing() throws Exception { Wallet wallet = new Wallet(); - ByteString transactionId = ByteString.empty(); + ChainBaseManager chainBaseManagerMock = mock(ChainBaseManager.class); + TransactionStore transactionStoreMock = mock(TransactionStore.class); + when(chainBaseManagerMock.getTransactionStore()).thenReturn(transactionStoreMock); + Field field = wallet.getClass().getDeclaredField("chainBaseManager"); + field.setAccessible(true); + field.set(wallet, chainBaseManagerMock); + when(transactionStoreMock.get(aryEq(new byte[0]))).thenReturn(null); + + assertNull(wallet.getTransactionById(ByteString.EMPTY)); + } + + @Test + public void testGetTransactionByIdReturnsStoredTransaction() throws Exception { + Wallet wallet = new Wallet(); + byte[] transactionIdBytes = Sha256Hash.of(true, + "transaction-id".getBytes(StandardCharsets.UTF_8)).getBytes(); + ByteString transactionId = ByteString.copyFrom(transactionIdBytes); ChainBaseManager chainBaseManagerMock = mock(ChainBaseManager.class); TransactionStore transactionStoreMock = mock(TransactionStore.class); TransactionCapsule transactionCapsuleMock = mock(TransactionCapsule.class); @@ -649,7 +680,7 @@ public void testGetTransactionById3() throws Exception { Field field = wallet.getClass().getDeclaredField("chainBaseManager"); field.setAccessible(true); field.set(wallet, chainBaseManagerMock); - when(transactionStoreMock.get(any())).thenReturn(transactionCapsuleMock); + when(transactionStoreMock.get(aryEq(transactionIdBytes))).thenReturn(transactionCapsuleMock); when(transactionCapsuleMock.getInstance()).thenReturn(transaction); Protocol.Transaction transactionRet = wallet.getTransactionById(transactionId); @@ -935,11 +966,11 @@ public void testGetShieldedContractScalingFactorException() throws Exception { when(walletMock.createTransactionCapsule(any(), any())) .thenReturn(new TransactionCapsule(transaction)); - try { - when(walletMock.getShieldedContractScalingFactor(contractAddress)).thenCallRealMethod(); - } catch (Exception e) { - assertNotNull(e); - } + when(walletMock.getShieldedContractScalingFactor(contractAddress)).thenCallRealMethod(); + + ContractExeException exception = assertThrows(ContractExeException.class, + () -> walletMock.getShieldedContractScalingFactor(contractAddress)); + assertEquals("trigger contract to get scaling factor error.", exception.getMessage()); } @Test @@ -1354,6 +1385,8 @@ public void testBuildShieldedTRC20InputWithAK1() throws Exception { builder, spendNote, ak, nk); + + assertEquals(100L, builder.getValueBalance()); } } @@ -1393,6 +1426,8 @@ public void testBuildShieldedTRC20Input() throws Exception { builder, spendNote, expandedSpendingKey); + + assertEquals(100L, builder.getValueBalance()); } } @@ -1417,10 +1452,12 @@ public void testGetContractInfo() throws Exception { } @Test - public void testGetContractInfo1() throws Exception { + public void testGetContractInfoReturnsStoredContract() throws Exception { Wallet wallet = new Wallet(); + byte[] contractAddress = ByteArray.fromHexString( + "41abd4b9367799eaa3197fecb144eb71de1e049abc"); GrpcAPI.BytesMessage bytesMessage = GrpcAPI.BytesMessage.newBuilder() - .setValue(ByteString.copyFrom("test".getBytes())) + .setValue(ByteString.copyFrom(contractAddress)) .build(); ChainBaseManager chainBaseManagerMock = mock(ChainBaseManager.class); @@ -1445,13 +1482,13 @@ public void testGetContractInfo1() throws Exception { when(chainBaseManagerMock.getContractStateStore()).thenReturn(contractStateStore); when(chainBaseManagerMock.getDynamicPropertiesStore()).thenReturn(dynamicPropertiesStore); - when(accountStore.get(any())).thenReturn(accountCapsule); - when(contractStore.get(any())).thenReturn(contractCapsule); + when(accountStore.get(aryEq(contractAddress))).thenReturn(accountCapsule); + when(contractStore.get(aryEq(contractAddress))).thenReturn(contractCapsule); when(contractCapsule.generateWrapper()) .thenReturn(SmartContractOuterClass.SmartContractDataWrapper.newBuilder().build()); - when(abiStore.get(any())).thenReturn(null); - when(codeStore.get(any())).thenReturn(null); - when(contractStateStore.get(any())).thenReturn(contractStateCapsule); + when(abiStore.get(aryEq(contractAddress))).thenReturn(null); + when(codeStore.get(aryEq(contractAddress))).thenReturn(null); + when(contractStateStore.get(aryEq(contractAddress))).thenReturn(contractStateCapsule); when(dynamicPropertiesStore.getCurrentCycleNumber()).thenReturn(100L); SmartContractOuterClass.SmartContractDataWrapper smartContractDataWrapper = diff --git a/framework/src/test/java/org/tron/core/WalletTest.java b/framework/src/test/java/org/tron/core/WalletTest.java index 9dbab338b67..8cc3ed03364 100644 --- a/framework/src/test/java/org/tron/core/WalletTest.java +++ b/framework/src/test/java/org/tron/core/WalletTest.java @@ -31,7 +31,6 @@ import com.google.protobuf.ByteString; import java.util.ArrayList; -import java.util.Arrays; import javax.annotation.Resource; import lombok.SneakyThrows; import lombok.extern.slf4j.Slf4j; @@ -77,9 +76,7 @@ import org.tron.core.exception.ContractValidateException; import org.tron.core.exception.MaintenanceUnavailableException; import org.tron.core.exception.NonUniqueObjectException; -import org.tron.core.store.DynamicPropertiesStore; import org.tron.core.utils.ProposalUtil.ProposalType; -import org.tron.core.utils.TransactionUtil; import org.tron.core.vm.config.ConfigLoader; import org.tron.core.vm.config.VMConfig; import org.tron.core.vm.program.Program; @@ -384,19 +381,6 @@ public void testGetEcKey() { assertEquals("Wallet ECKey should match provided ECKey", wallet1.getCryptoEngine(), ecKey); } - @Test - public void ss() { - for (int i = 0; i < 4; i++) { - ECKey ecKey = new ECKey(Utils.getRandom()); - assertNotNull(ecKey); - System.out.println(i + 1); - System.out.println("privateKey:" + ByteArray.toHexString(ecKey.getPrivKeyBytes())); - System.out.println("publicKey:" + ByteArray.toHexString(ecKey.getPubKey())); - System.out.println("address:" + ByteArray.toHexString(ecKey.getAddress())); - System.out.println(); - } - } - @Test public void getBlockById() { Block blockById = wallet @@ -507,19 +491,11 @@ public void getBlockByLatestNum() { public void getPaginatedAssetIssueList() { buildAssetIssue(); AssetIssueList assetList1 = wallet.getAssetIssueList(0, 100); + assertEquals("AssetIssueList1 size", 1, assetList1.getAssetIssueCount()); assertEquals("get Asset1", assetList1.getAssetIssue(0).getName(), Asset1.getName()); - try { - assertNotNull(assetList1.getAssetIssue(1)); - } catch (Exception e) { - Assert.assertTrue("AssetIssueList1 size should be 1", true); - } AssetIssueList assetList2 = wallet.getAssetIssueList(0, 0); - try { - assertNotNull(assetList2.getAssetIssue(0)); - } catch (Exception e) { - Assert.assertTrue("AssetIssueList2 size should be 0", true); - } + Assert.assertNull("An empty page is represented by null", assetList2); } @Test @@ -644,18 +620,10 @@ public void getBlock() { GrpcAPI.BlockReq req = GrpcAPI.BlockReq.getDefaultInstance(); Block block = wallet.getBlock(req); assertNotNull(block); - try { - req = req.toBuilder().setIdOrNum("-1").build(); - wallet.getBlock(req); - } catch (Exception e) { - Assert.assertTrue(e instanceof IllegalArgumentException); - } - try { - req = req.toBuilder().setIdOrNum("hash000001").build(); - wallet.getBlock(req); - } catch (Exception e) { - Assert.assertTrue(e instanceof IllegalArgumentException); - } + Assert.assertThrows(IllegalArgumentException.class, + () -> wallet.getBlock(GrpcAPI.BlockReq.newBuilder().setIdOrNum("-1").build())); + Assert.assertThrows(IllegalArgumentException.class, + () -> wallet.getBlock(GrpcAPI.BlockReq.newBuilder().setIdOrNum("hash000001").build())); req = GrpcAPI.BlockReq.newBuilder().setIdOrNum("0").build(); block = wallet.getBlock(req); req = req.toBuilder().setDetail(true).build(); @@ -671,28 +639,6 @@ public void testGetNextMaintenanceTime() { Assert.assertEquals(0, numberMessage.getNum()); } - //@Test - public void testChainParameters() { - - Protocol.ChainParameters.Builder builder = Protocol.ChainParameters.newBuilder(); - - Arrays.stream(ProposalType.values()).forEach(parameters -> { - String methodName = TransactionUtil.makeUpperCamelMethod(parameters.name()); - try { - builder.addChainParameter(Protocol.ChainParameters.ChainParameter.newBuilder() - .setKey(methodName) - .setValue((long) DynamicPropertiesStore.class.getDeclaredMethod(methodName) - .invoke(chainBaseManager.getDynamicPropertiesStore())) - .build()); - } catch (Exception ex) { - Assert.fail("get chainParameter : " + methodName + ", error : " + ex.getMessage()); - } - - }); - - System.out.print(builder.build()); - } - @Test public void testGetDelegatedResource() { long frozenBalance = 1_000_000_000L; @@ -859,28 +805,28 @@ public void testGetDelegatedResourceV2() { } @Test - public void testGetPaginatedNowWitnessList_Error() { + public void testGetPaginatedNowWitnessList_Error() throws MaintenanceUnavailableException { // To avoid throw MaintenanceClearingException dbManager.getChainBaseManager().getDynamicPropertiesStore().saveStateFlag(1); - Exception maintenanceEx = Assert.assertThrows(Exception.class, + MaintenanceUnavailableException maintenanceEx = Assert.assertThrows( + MaintenanceUnavailableException.class, () -> wallet.getPaginatedNowWitnessList(0, 10)); - Assert.assertTrue("Should throw MaintenanceClearingException", - maintenanceEx instanceof MaintenanceUnavailableException); + Assert.assertEquals( + "Service temporarily unavailable during maintenance period. Please try again later.", + maintenanceEx.getMessage()); try { Args.getInstance().setSolidityNode(true); - wallet.getPaginatedNowWitnessList(0, 10); + Assert.assertNotNull(wallet.getPaginatedNowWitnessList(0, 10)); Args.getInstance().setSolidityNode(false); dbManager.setCursor(Chainbase.Cursor.SOLIDITY); - wallet.getPaginatedNowWitnessList(0, 10); + Assert.assertNotNull(wallet.getPaginatedNowWitnessList(0, 10)); + } finally { dbManager.setCursor(Chainbase.Cursor.HEAD); - } catch (Exception e) { - Assert.assertFalse("Should not throw MaintenanceClearingException", - e instanceof MaintenanceUnavailableException); + Args.getInstance().setSolidityNode(false); + dbManager.getChainBaseManager().getDynamicPropertiesStore().saveStateFlag(0); } - - dbManager.getChainBaseManager().getDynamicPropertiesStore().saveStateFlag(0); } @Test @@ -1380,11 +1326,6 @@ public void testEstimateEnergyOutOfTime() { @Test public void testListNodes() { - try { - wallet.listNodes(); - } catch (Exception e) { - Assert.assertTrue(e instanceof NullPointerException); - } Args.getInstance().setP2pDisable(true); GrpcAPI.NodeList nodeList = wallet.listNodes(); assertEquals(0, nodeList.getNodesList().size()); @@ -1569,4 +1510,3 @@ public void testApprovedListTooManySigs() { assertEquals(0, rejected.getApprovedListCount()); } } - diff --git a/framework/src/test/java/org/tron/core/jsonrpc/BloomTest.java b/framework/src/test/java/org/tron/core/jsonrpc/BloomTest.java index c88615d2d2f..fa2b094ec4d 100644 --- a/framework/src/test/java/org/tron/core/jsonrpc/BloomTest.java +++ b/framework/src/test/java/org/tron/core/jsonrpc/BloomTest.java @@ -1,6 +1,5 @@ package org.tron.core.jsonrpc; -import static org.tron.common.bloom.Bloom.BLOOM_BYTE_SIZE; import static org.tron.common.bloom.Bloom.getLowBits; import java.util.ArrayList; @@ -71,40 +70,6 @@ public void testBloomExtensively() { Assert.assertEquals(Hex.toHexString(Hash.sha3(b2.getData())), exp); } - @Test - public void benchmarkNewBloom() { - int times = 100000; - byte[] data = new byte[BLOOM_BYTE_SIZE]; - byte[] test = "testestestest".getBytes(); - System.arraycopy(test, 0, data, 0, test.length); - - long start = System.currentTimeMillis(); - - for (int i = 0; i < times; i++) { - Bloom bloom = new Bloom(data); - } - - long end = System.currentTimeMillis(); - System.out - .println(String.format("benchmarkNewBloom total %d times cost %d ms", times, end - start)); - } - - @Test - public void benchmarkMatches() { - int times = 100000; - byte[] test = "testtest".getBytes(); - - long start = System.currentTimeMillis(); - Bloom bloom = new Bloom(); - for (int i = 0; i < times; i++) { - bloom.matches(Bloom.create(Hash.sha3(test))); - } - - long end = System.currentTimeMillis(); - System.out.println( - String.format("benchmarkMatches total %d times cost %d ms", times, end - start)); - } - private byte[] bytesToAddress(byte[] address) { byte[] data = new byte[20]; System.arraycopy(address, 0, data, 20 - address.length, address.length); @@ -130,9 +95,7 @@ private TransactionInfo createTransactionInfo(byte[] address1, byte[] address2) } @Test - public void benchmarkCreateByTransaction() { - int times = 1000; - + public void testCreateByTransaction() { // small TransactionRetCapsule smallCapsule = new TransactionRetCapsule(); smallCapsule.addTransactionInfo(createTransactionInfo(new byte[] {0x11}, @@ -140,16 +103,7 @@ public void benchmarkCreateByTransaction() { smallCapsule.addTransactionInfo(createTransactionInfo(new byte[] {0x22}, new byte[] {0x02, 0x22})); - long start = System.currentTimeMillis(); - - Bloom sBloom = new Bloom(); - for (int i = 0; i < times; i++) { - sBloom = Bloom.createBloom(smallCapsule); - } - - long end = System.currentTimeMillis(); - System.out.println( - String.format("benchmarkCreateByTransaction %d times cost %d ms", times, end - start)); + Bloom sBloom = Bloom.createBloom(smallCapsule); String exp = "c384c56ece49458a427c67b90fefe979ebf7104795be65dc398b280f24104949"; String got = Hex.toHexString(Hash.sha3(sBloom.getData())); @@ -164,16 +118,7 @@ public void benchmarkCreateByTransaction() { new byte[] {0x02, 0x22})); } - start = System.currentTimeMillis(); - - Bloom lBloom = new Bloom(); - for (int i = 0; i < times; i++) { - lBloom = Bloom.createBloom(largeCapsule); - } - - end = System.currentTimeMillis(); - System.out.println( - String.format("benchmarkCreateByTransaction %d times cost %d ms", times, end - start)); + Bloom lBloom = Bloom.createBloom(largeCapsule); got = Hex.toHexString(Hash.sha3(lBloom.getData())); Assert.assertEquals(got, exp); diff --git a/framework/src/test/java/org/tron/core/jsonrpc/BuildTransactionTest.java b/framework/src/test/java/org/tron/core/jsonrpc/BuildTransactionTest.java index 56cfd25ae5d..16d3ea0f0f5 100644 --- a/framework/src/test/java/org/tron/core/jsonrpc/BuildTransactionTest.java +++ b/framework/src/test/java/org/tron/core/jsonrpc/BuildTransactionTest.java @@ -13,6 +13,7 @@ import org.tron.core.capsule.AccountCapsule; import org.tron.core.capsule.ContractCapsule; import org.tron.core.config.args.Args; +import org.tron.core.exception.jsonrpc.JsonRpcInvalidRequestException; import org.tron.core.services.jsonrpc.types.BuildArguments; import org.tron.protos.Protocol; import org.tron.protos.Protocol.Transaction.Contract.ContractType; @@ -165,16 +166,13 @@ public void testTriggerSmartContract() { } @Test - public void testNoToNoData() { + public void testMissingToAndDataThrowsInvalidRequest() { BuildArguments buildArguments = new BuildArguments(); buildArguments.setFrom("0xabd4b9367799eaa3197fecb144eb71de1e049abc"); - buildArguments.setTo("0x548794500882809695a8a687866e76d4271a1abc"); - try { - ContractType contractType = buildArguments.getContractType(wallet); - Assert.assertEquals(ContractType.TriggerSmartContract, contractType); - } catch (Exception e) { - Assert.assertEquals("invalid json request", e.getMessage()); - } + JsonRpcInvalidRequestException exception = Assert.assertThrows( + JsonRpcInvalidRequestException.class, + () -> buildArguments.getContractType(wallet)); + Assert.assertEquals("invalid json request", exception.getMessage()); } -} \ No newline at end of file +} diff --git a/framework/src/test/java/org/tron/core/jsonrpc/JsonRpcTest.java b/framework/src/test/java/org/tron/core/jsonrpc/JsonRpcTest.java index 49f875f3823..c88db208d3e 100644 --- a/framework/src/test/java/org/tron/core/jsonrpc/JsonRpcTest.java +++ b/framework/src/test/java/org/tron/core/jsonrpc/JsonRpcTest.java @@ -10,91 +10,22 @@ import java.util.BitSet; import java.util.Collections; import java.util.List; -import org.bouncycastle.util.encoders.Hex; import org.junit.Assert; import org.junit.Test; import org.tron.common.bloom.Bloom; import org.tron.common.crypto.Hash; import org.tron.common.parameter.CommonParameter; -import org.tron.common.runtime.vm.DataWord; import org.tron.common.utils.ByteArray; -import org.tron.common.utils.ByteUtil; -import org.tron.common.utils.Commons; import org.tron.core.exception.jsonrpc.JsonRpcInvalidParamsException; import org.tron.core.services.jsonrpc.JsonRpcApiUtil; import org.tron.core.services.jsonrpc.TronJsonRpc.FilterRequest; import org.tron.core.services.jsonrpc.filters.LogBlockQuery; import org.tron.core.services.jsonrpc.filters.LogFilter; import org.tron.core.services.jsonrpc.filters.LogFilterWrapper; -import org.tron.core.services.jsonrpc.types.CallArguments; public class JsonRpcTest { - public void generateCallParameterWIthMethodAndParam() { - String ownerAddress = "TXvRyjomvtNWSKvNouTvAedRGD4w9RXLZD"; - String usdjAddress = "TLBaRhANQoJFTqre9Nf1mjuwNWjCJeYqUL"; // nile udsj address - - byte[] addressData = Commons.decodeFromBase58Check(ownerAddress); - byte[] addressDataWord = new byte[32]; - System.arraycopy(Commons.decodeFromBase58Check(ownerAddress), 0, addressDataWord, - 32 - addressData.length, addressData.length); - String data = getMethodSign("balanceOf(address)") + Hex.toHexString(addressDataWord); - - CallArguments transactionCall = new CallArguments(); - transactionCall.setFrom(ByteArray.toHexString(Commons.decodeFromBase58Check(ownerAddress))); - transactionCall.setTo(ByteArray.toHexString(Commons.decodeFromBase58Check(usdjAddress))); - transactionCall.setData(data); - - StringBuffer sb = new StringBuffer("{\"jsonrpc\":\"2.0\",\"method\":\"eth_call\",\"params\":["); - sb.append(transactionCall); - sb.append(", \"latest\"],\"id\":1}"); - - System.out.println(sb.toString()); - } - - public void generateCallParameterWithMethod() { - String ownerAddress = "TRXPT6Ny7EFvTPv7mFUqaFUST39WUZ4zzz"; - String usdjAddress = "TXYZopYRdj2D9XRtbG411XZZ3kM5VkAeBf"; // nile udsj address - - byte[] addressData = Commons.decodeFromBase58Check(ownerAddress); - byte[] addressDataWord = new byte[32]; - System.arraycopy(Commons.decodeFromBase58Check(ownerAddress), 0, addressDataWord, - 32 - addressData.length, addressData.length); - String data = getMethodSign("name()"); - - CallArguments transactionCall = new CallArguments(); - transactionCall.setFrom(ByteArray.toHexString(Commons.decodeFromBase58Check(ownerAddress))); - transactionCall.setTo(ByteArray.toHexString(Commons.decodeFromBase58Check(usdjAddress))); - transactionCall.setData(data); - - StringBuffer sb = new StringBuffer("{\"jsonrpc\":\"2.0\",\"method\":\"eth_call\",\"params\":["); - sb.append(transactionCall); - sb.append(", \"latest\"],\"id\":1}"); - - System.out.println(sb.toString()); - } - - private String generateStorageParameter() { - // nile contract:TXEphLzyv5jFwvjzwMok9UoehaSn294ZhN - String contractAddress = "41E94EAD5F4CA072A25B2E5500934709F1AEE3C64B"; - - // nile:TXvRyjomvtNWSKvNouTvAedRGD4w9RXLZD - String sendAddress = "41F0CC5A2A84CD0F68ED1667070934542D673ACBD8"; - String index = "01"; - byte[] byte1 = new DataWord(new DataWord(sendAddress).getLast20Bytes()).getData(); - byte[] byte2 = new DataWord(new DataWord(index).getLast20Bytes()).getData(); - byte[] byte3 = ByteUtil.merge(byte1, byte2); - String position = ByteArray.toJsonHex(Hash.sha3(byte3)); - - StringBuffer sb = new StringBuffer( - "{\"jsonrpc\":\"2.0\",\"method\":\"eth_getStorageAt\",\"params\":[\"0x"); - sb.append(contractAddress + "\",\""); - sb.append(position + "\","); - sb.append("\"latest\"],\"id\":1}"); - return sb.toString(); - } - private String constructData(String functionSelector, String parameter) { return getMethodSign(functionSelector) + parameter; } @@ -140,17 +71,28 @@ public void testAddressCompatibleToByteArray() { Assert.fail(); } + // Odd-length hex is intentionally left-padded by ByteArray.fromHexString before the + // TRON address prefix is added, so this is another supported compatibility form. + byte[] oddLengthExpected = ByteArray.fromHexString( + addressPreFixString + "0" + rawAddress.substring(1)); try { - addressCompatibleToByteArray(rawAddress.substring(1)); + Assert.assertArrayEquals( + oddLengthExpected, addressCompatibleToByteArray(rawAddress.substring(1))); } catch (JsonRpcInvalidParamsException e) { - Assert.assertEquals("invalid address", e.getMessage()); + Assert.fail(); } - try { - addressCompatibleToByteArray(rawAddress + "00"); - } catch (JsonRpcInvalidParamsException e) { - Assert.assertEquals("invalid address", e.getMessage()); - } + // Removing a complete byte leaves only 19 address bytes and must be rejected. + JsonRpcInvalidParamsException shortAddress = Assert.assertThrows( + JsonRpcInvalidParamsException.class, + () -> addressCompatibleToByteArray(rawAddress.substring(2))); + Assert.assertEquals("invalid address", shortAddress.getMessage()); + + // A 21-byte value must already carry the configured TRON network prefix. + JsonRpcInvalidParamsException wrongNetworkPrefix = Assert.assertThrows( + JsonRpcInvalidParamsException.class, + () -> addressCompatibleToByteArray(rawAddress + "00")); + Assert.assertEquals("invalid address", wrongNetworkPrefix.getMessage()); } @@ -223,20 +165,19 @@ public void testLogFilter() { Assert.fail(); } - try { - new LogFilter(new FilterRequest(null, null, null, new String[] {"0x0"}, null)); - } catch (JsonRpcInvalidParamsException e) { - Assert.assertTrue(e.getMessage().contains("invalid topic")); - } + JsonRpcInvalidParamsException invalidTopic = Assert.assertThrows( + JsonRpcInvalidParamsException.class, + () -> new LogFilter( + new FilterRequest(null, null, null, new String[] {"0x0"}, null))); + Assert.assertTrue(invalidTopic.getMessage().contains("invalid topic")); // not empty topic and null cannot be in same level - try { - new LogFilter(new FilterRequest(null, null, null, new String[][] { - {"0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef", null}, - }, null)); - } catch (JsonRpcInvalidParamsException e) { - Assert.assertTrue(e.getMessage().contains("invalid topic")); - } + JsonRpcInvalidParamsException mixedNullTopic = Assert.assertThrows( + JsonRpcInvalidParamsException.class, + () -> new LogFilter(new FilterRequest(null, null, null, new String[][] { + {"0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef", null}, + }, null))); + Assert.assertTrue(mixedNullTopic.getMessage().contains("invalid topic")); // non-string element in address array -> -32602, not a leaked ClassCastException JsonRpcInvalidParamsException badAddrElement = Assert.assertThrows( @@ -253,23 +194,23 @@ public void testLogFilter() { Assert.assertEquals("invalid topic(s): 1", badTopicElement.getMessage()); // topic size should be <= 4 - try { - new LogFilter(new FilterRequest(null, null, null, - new String[] {"0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef", - "0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef", - "0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef", - "0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef", - "0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef"}, null)); - } catch (JsonRpcInvalidParamsException e) { - Assert.assertEquals("topics size should be <= 4", e.getMessage()); - } + JsonRpcInvalidParamsException tooManyTopics = Assert.assertThrows( + JsonRpcInvalidParamsException.class, + () -> new LogFilter(new FilterRequest(null, null, null, + new String[] { + "0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef", + "0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef", + "0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef", + "0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef", + "0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef" + }, null))); + Assert.assertEquals("topics size should be <= 4", tooManyTopics.getMessage()); //address must be 40 hex string, not 41 ahead - try { - new LogFilter(new FilterRequest(null, null, "0x0", null, null)); - } catch (JsonRpcInvalidParamsException e) { - Assert.assertTrue(e.getMessage().contains("invalid address")); - } + JsonRpcInvalidParamsException shortFilterAddress = Assert.assertThrows( + JsonRpcInvalidParamsException.class, + () -> new LogFilter(new FilterRequest(null, null, "0x0", null, null))); + Assert.assertTrue(shortFilterAddress.getMessage().contains("invalid address")); try { new LogFilter( new FilterRequest(null, null, "0xaa6612f03443517ced2bdcf27958c22353ceeab9", null, null)); @@ -278,13 +219,12 @@ public void testLogFilter() { } //address length of 42 hex string with 41 ahead will be invalid - try { - new LogFilter( - new FilterRequest(null, null, "0x41aa6612f03443517ced2bdcf27958c22353ceeab9", null, - null)); - } catch (JsonRpcInvalidParamsException e) { - Assert.assertTrue(e.getMessage().contains("invalid address")); - } + JsonRpcInvalidParamsException prefixedTronAddress = Assert.assertThrows( + JsonRpcInvalidParamsException.class, + () -> new LogFilter( + new FilterRequest(null, null, "0x41aa6612f03443517ced2bdcf27958c22353ceeab9", + null, null))); + Assert.assertTrue(prefixedTronAddress.getMessage().contains("invalid address")); } @Test diff --git a/framework/src/test/java/org/tron/core/jsonrpc/JsonrpcServiceTest.java b/framework/src/test/java/org/tron/core/jsonrpc/JsonrpcServiceTest.java index e8d14ace060..a67f4d0fe8a 100644 --- a/framework/src/test/java/org/tron/core/jsonrpc/JsonrpcServiceTest.java +++ b/framework/src/test/java/org/tron/core/jsonrpc/JsonrpcServiceTest.java @@ -233,19 +233,18 @@ public void testWeb3Sha3() { result); try { - tronJsonRpc.web3Sha3("1122334455667788"); + Assert.assertEquals(result, tronJsonRpc.web3Sha3("1122334455667788")); } catch (Exception e) { - Assert.assertEquals("invalid input value", e.getMessage()); + Assert.fail(); } } @Test public void testGetBlockTransactionCountByHash() { - try { - tronJsonRpc.ethGetBlockTransactionCountByHash("0x111111"); - } catch (Exception e) { - Assert.assertEquals("invalid hash value", e.getMessage()); - } + JsonRpcInvalidParamsException invalidHash = Assert.assertThrows( + JsonRpcInvalidParamsException.class, + () -> tronJsonRpc.ethGetBlockTransactionCountByHash("0x111111")); + Assert.assertEquals("invalid hash value", invalidHash.getMessage()); String result = ""; try { diff --git a/framework/src/test/java/org/tron/core/jsonrpc/WalletCursorTest.java b/framework/src/test/java/org/tron/core/jsonrpc/WalletCursorTest.java index 24ca71a74bc..abd44ee0a88 100644 --- a/framework/src/test/java/org/tron/core/jsonrpc/WalletCursorTest.java +++ b/framework/src/test/java/org/tron/core/jsonrpc/WalletCursorTest.java @@ -17,6 +17,7 @@ import org.tron.core.config.args.Args; import org.tron.core.db2.core.Chainbase.Cursor; import org.tron.core.exception.jsonrpc.JsonRpcExceedLimitException; +import org.tron.core.exception.jsonrpc.JsonRpcMethodNotFoundException; import org.tron.core.services.NodeInfoService; import org.tron.core.services.jsonrpc.TronJsonRpc.FilterRequest; import org.tron.core.services.jsonrpc.TronJsonRpcImpl; @@ -83,7 +84,7 @@ public void testSource() { } @Test - public void testDisableInSolidity() { + public void testDisableInSolidity() throws Exception { BuildArguments buildArguments = new BuildArguments(); buildArguments.setFrom("0xabd4b9367799eaa3197fecb144eb71de1e049abc"); buildArguments.setTo("0x548794500882809695a8a687866e76d4271a1abc"); @@ -95,18 +96,19 @@ public void testDisableInSolidity() { TronJsonRpcImpl tronJsonRpc = new TronJsonRpcImpl(nodeInfoService, wallet); tronJsonRpc.setManager(dbManager); try { - tronJsonRpc.buildTransaction(buildArguments); - tronJsonRpc.close(); - } catch (Exception e) { + JsonRpcMethodNotFoundException exception = Assert.assertThrows( + JsonRpcMethodNotFoundException.class, + () -> tronJsonRpc.buildTransaction(buildArguments)); Assert.assertEquals("the method buildTransaction does not exist/is not available in " - + "SOLIDITY", e.getMessage()); + + "SOLIDITY", exception.getMessage()); + } finally { + tronJsonRpc.close(); + dbManager.resetCursor(); } - - dbManager.resetCursor(); } @Test - public void testDisableInPBFT() { + public void testDisableInPBFT() throws Exception { BuildArguments buildArguments = new BuildArguments(); buildArguments.setFrom("0xabd4b9367799eaa3197fecb144eb71de1e049abc"); buildArguments.setTo("0x548794500882809695a8a687866e76d4271a1abc"); @@ -118,22 +120,23 @@ public void testDisableInPBFT() { TronJsonRpcImpl tronJsonRpc = new TronJsonRpcImpl(nodeInfoService, wallet); tronJsonRpc.setManager(dbManager); try { - tronJsonRpc.buildTransaction(buildArguments); - } catch (Exception e) { + JsonRpcMethodNotFoundException buildException = Assert.assertThrows( + JsonRpcMethodNotFoundException.class, + () -> tronJsonRpc.buildTransaction(buildArguments)); Assert.assertEquals("the method buildTransaction does not exist/is not available in " - + "PBFT", e.getMessage()); - } + + "PBFT", buildException.getMessage()); - String method = "test"; - try { - tronJsonRpc.disableInPBFT(method); - } catch (Exception e) { + String method = "test"; + JsonRpcMethodNotFoundException disabledMethod = Assert.assertThrows( + JsonRpcMethodNotFoundException.class, + () -> tronJsonRpc.disableInPBFT(method)); String expMsg = String.format("the method %s does not exist/is not available in PBFT", method); - Assert.assertEquals(expMsg, e.getMessage()); + Assert.assertEquals(expMsg, disabledMethod.getMessage()); + } finally { + tronJsonRpc.close(); + dbManager.resetCursor(); } - - dbManager.resetCursor(); } @Test @@ -189,4 +192,4 @@ public void testNewFilter_exceedsCapThrowsException() throws Exception { } } -} \ No newline at end of file +} diff --git a/framework/src/test/java/org/tron/core/pbft/PbftApiTest.java b/framework/src/test/java/org/tron/core/pbft/PbftApiTest.java index 36253333a4e..f2d28228595 100755 --- a/framework/src/test/java/org/tron/core/pbft/PbftApiTest.java +++ b/framework/src/test/java/org/tron/core/pbft/PbftApiTest.java @@ -2,9 +2,9 @@ import com.google.protobuf.ByteString; import java.io.IOException; -import java.util.Objects; import javax.annotation.Resource; import lombok.extern.slf4j.Slf4j; +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; @@ -63,21 +63,21 @@ public void pbftapi() throws IOException { Assert.assertTrue(dynamicPropertiesStore.getLatestBlockHeaderNumber() >= 10); commonDataBase.saveLatestPbftBlockNum(6); httpApiOnPBFTService.start(); - CloseableHttpResponse response; try (CloseableHttpClient httpClient = HttpClients.createDefault()) { HttpGet httpGet = new HttpGet("http://127.0.0.1:" + CommonParameter.getInstance().getPBFTHttpPort() + "/walletpbft/getnowblock"); - response = httpClient.execute(httpGet); - String responseString = EntityUtils.toString(response.getEntity()); - JSONObject jsonObject = JSON.parseObject(responseString); - if (Objects.nonNull(jsonObject)) { + try (CloseableHttpResponse response = httpClient.execute(httpGet)) { + Assert.assertEquals(HttpStatus.SC_OK, response.getStatusLine().getStatusCode()); + String responseString = EntityUtils.toString(response.getEntity()); + JSONObject jsonObject = JSON.parseObject(responseString); + Assert.assertNotNull(jsonObject); long num = jsonObject.getJSONObject("block_header").getJSONObject("raw_data") .getLongValue("number"); Assert.assertEquals(commonDataBase.getLatestPbftBlockNum(), num); } - response.close(); + } finally { + httpApiOnPBFTService.stop(); } - httpApiOnPBFTService.stop(); } private BlockCapsule createTestBlockCapsule(long time, long number, Sha256Hash hash) { diff --git a/framework/src/test/java/org/tron/core/services/RpcApiServicesTest.java b/framework/src/test/java/org/tron/core/services/RpcApiServicesTest.java index c3ac5800971..184e08c4f27 100644 --- a/framework/src/test/java/org/tron/core/services/RpcApiServicesTest.java +++ b/framework/src/test/java/org/tron/core/services/RpcApiServicesTest.java @@ -8,6 +8,7 @@ import com.google.protobuf.Any; import com.google.protobuf.ByteString; +import com.google.protobuf.Message; import io.grpc.ManagedChannel; import io.grpc.ManagedChannelBuilder; import io.grpc.Status; @@ -36,6 +37,7 @@ import org.tron.api.GrpcAPI.DelegatedResourceMessage; import org.tron.api.GrpcAPI.DiversifierMessage; import org.tron.api.GrpcAPI.EmptyMessage; +import org.tron.api.GrpcAPI.EstimateEnergyMessage; import org.tron.api.GrpcAPI.ExpandedSpendingKeyMessage; import org.tron.api.GrpcAPI.GetAvailableUnfreezeCountRequestMessage; import org.tron.api.GrpcAPI.IncomingViewingKeyDiversifierMessage; @@ -47,8 +49,13 @@ import org.tron.api.GrpcAPI.OvkDecryptParameters; import org.tron.api.GrpcAPI.OvkDecryptTRC20Parameters; import org.tron.api.GrpcAPI.PaginatedMessage; +import org.tron.api.GrpcAPI.PaymentAddressMessage; import org.tron.api.GrpcAPI.PrivateParameters; import org.tron.api.GrpcAPI.PrivateParametersWithoutAsk; +import org.tron.api.GrpcAPI.Return; +import org.tron.api.GrpcAPI.Return.response_code; +import org.tron.api.GrpcAPI.ShieldedAddressInfo; +import org.tron.api.GrpcAPI.TransactionExtention; import org.tron.api.GrpcAPI.ViewingKeyMessage; import org.tron.api.WalletGrpc; import org.tron.api.WalletGrpc.WalletBlockingStub; @@ -108,6 +115,7 @@ import org.tron.protos.contract.ProposalContract.ProposalDeleteContract; import org.tron.protos.contract.SmartContractOuterClass.ClearABIContract; import org.tron.protos.contract.SmartContractOuterClass.CreateSmartContract; +import org.tron.protos.contract.SmartContractOuterClass.SmartContract; import org.tron.protos.contract.SmartContractOuterClass.TriggerSmartContract; import org.tron.protos.contract.SmartContractOuterClass.UpdateEnergyLimitContract; import org.tron.protos.contract.SmartContractOuterClass.UpdateSettingContract; @@ -258,9 +266,9 @@ public void testGetAccount() { @Test public void testGetAccountById() { Account account = Account.newBuilder().setAccountId(ownerAddress).build(); - assertNotNull(blockingStubFull.getAccountById(account)); - assertNotNull(blockingStubSolidity.getAccountById(account)); - assertNotNull(blockingStubPBFT.getAccountById(account)); + assertDefaultResponse(blockingStubFull.getAccountById(account)); + assertDefaultResponse(blockingStubSolidity.getAccountById(account)); + assertDefaultResponse(blockingStubPBFT.getAccountById(account)); } @Test @@ -299,25 +307,25 @@ public void testGetPaginatedAssetIssueList() { @Test public void testGetAssetIssueByName() { BytesMessage message = BytesMessage.newBuilder().setValue(ownerAddress).build(); - assertNotNull(blockingStubFull.getAssetIssueByName(message)); - assertNotNull(blockingStubSolidity.getAssetIssueByName(message)); - assertNotNull(blockingStubPBFT.getAssetIssueByName(message)); + assertDefaultResponse(blockingStubFull.getAssetIssueByName(message)); + assertDefaultResponse(blockingStubSolidity.getAssetIssueByName(message)); + assertDefaultResponse(blockingStubPBFT.getAssetIssueByName(message)); } @Test public void testGetAssetIssueListByName() { BytesMessage message = BytesMessage.newBuilder().setValue(ownerAddress).build(); - assertNotNull(blockingStubFull.getAssetIssueListByName(message)); - assertNotNull(blockingStubSolidity.getAssetIssueListByName(message)); - assertNotNull(blockingStubPBFT.getAssetIssueListByName(message)); + assertDefaultResponse(blockingStubFull.getAssetIssueListByName(message)); + assertDefaultResponse(blockingStubSolidity.getAssetIssueListByName(message)); + assertDefaultResponse(blockingStubPBFT.getAssetIssueListByName(message)); } @Test public void testGetAssetIssueById() { BytesMessage message = BytesMessage.newBuilder().setValue(ownerAddress).build(); - assertNotNull(blockingStubFull.getAssetIssueById(message)); - assertNotNull(blockingStubSolidity.getAssetIssueById(message)); - assertNotNull(blockingStubPBFT.getAssetIssueById(message)); + assertDefaultResponse(blockingStubFull.getAssetIssueById(message)); + assertDefaultResponse(blockingStubSolidity.getAssetIssueById(message)); + assertDefaultResponse(blockingStubPBFT.getAssetIssueById(message)); } @Test @@ -399,9 +407,9 @@ public void testGetCanWithdrawUnfreezeAmount() { @Test public void testGetExchangeById() { BytesMessage message = BytesMessage.newBuilder().setValue(ownerAddress).build(); - assertNotNull(blockingStubFull.getExchangeById(message)); - assertNotNull(blockingStubSolidity.getExchangeById(message)); - assertNotNull(blockingStubPBFT.getExchangeById(message)); + assertDefaultResponse(blockingStubFull.getExchangeById(message)); + assertDefaultResponse(blockingStubSolidity.getExchangeById(message)); + assertDefaultResponse(blockingStubPBFT.getExchangeById(message)); } @Test @@ -429,17 +437,17 @@ public void testListNodes() { @Test public void testGetTransactionById() { BytesMessage message = BytesMessage.newBuilder().setValue(ownerAddress).build(); - assertNotNull(blockingStubFull.getTransactionById(message)); - assertNotNull(blockingStubSolidity.getTransactionById(message)); - assertNotNull(blockingStubPBFT.getTransactionById(message)); + assertDefaultResponse(blockingStubFull.getTransactionById(message)); + assertDefaultResponse(blockingStubSolidity.getTransactionById(message)); + assertDefaultResponse(blockingStubPBFT.getTransactionById(message)); } @Test public void testGetTransactionInfoById() { BytesMessage message = BytesMessage.newBuilder().setValue(ownerAddress).build(); - assertNotNull(blockingStubFull.getTransactionInfoById(message)); - assertNotNull(blockingStubSolidity.getTransactionInfoById(message)); - assertNotNull(blockingStubPBFT.getTransactionInfoById(message)); + assertDefaultResponse(blockingStubFull.getTransactionInfoById(message)); + assertDefaultResponse(blockingStubSolidity.getTransactionInfoById(message)); + assertDefaultResponse(blockingStubPBFT.getTransactionInfoById(message)); } @Test @@ -466,16 +474,6 @@ public void testGetBurnTrx() { assertNotNull(blockingStubPBFT.getBurnTrx(message)); } - // @Test - // public void testGetMerkleTreeVoucherInfo() { - // OutputPoint outputPoint = OutputPoint.newBuilder().build(); - // OutputPointInfo message = OutputPointInfo.newBuilder() - // .addOutPoints(outputPoint).setBlockNum(0).build(); - // assertNotNull(blockingStubFull.getMerkleTreeVoucherInfo(message)); - // assertNotNull(blockingStubSolidity.getMerkleTreeVoucherInfo(message)); - // assertNotNull(blockingStubPBFT.getMerkleTreeVoucherInfo(message)); - // } - @Test public void testScanNoteByIvk() { IvkDecryptParameters message = IvkDecryptParameters.newBuilder() @@ -510,15 +508,6 @@ public void test08ScanNoteByOvk() { assertNotNull(blockingStubPBFT.scanNoteByOvk(message)); } - // @Test - // public void testIsSpend() { - // NoteParameters message = NoteParameters.newBuilder() - // .build(); - // assertNotNull(blockingStubFull.isSpend(message)); - // assertNotNull(blockingStubSolidity.isSpend(message)); - // assertNotNull(blockingStubPBFT.isSpend(message)); - // } - @Test public void testScanShieldedTRC20NotesByIvk() { IvkDecryptTRC20Parameters message = IvkDecryptTRC20Parameters.newBuilder() @@ -627,28 +616,11 @@ public void testScanShieldedTRC20NotesByOvkEmptyEventsPassesGuard() { } } - // @Test - // public void testIsShieldedTRC20ContractNoteSpent() { - // NfTRC20Parameters message = NfTRC20Parameters.newBuilder().build(); - // assertNotNull(blockingStubFull.isShieldedTRC20ContractNoteSpent(message)); - // assertNotNull(blockingStubSolidity.isShieldedTRC20ContractNoteSpent(message)); - // assertNotNull(blockingStubPBFT.isShieldedTRC20ContractNoteSpent(message)); - // } - - // @Test - // public void testGetTriggerInputForShieldedTRC20Contract() { - // ShieldedTRC20TriggerContractParameters message = - // ShieldedTRC20TriggerContractParameters.newBuilder() - // .setAmount("1000") - // .build(); - // assertNotNull(blockingStubFull.getTriggerInputForShieldedTRC20Contract(message)); - // } - @Test public void testUpdateBrokerage() { UpdateBrokerageContract message = UpdateBrokerageContract.newBuilder() .setOwnerAddress(ownerAddress).setBrokerage(1).build(); - assertNotNull(blockingStubFull.updateBrokerage(message)); + assertContractValidationFailure(blockingStubFull.updateBrokerage(message)); } @Test @@ -665,7 +637,7 @@ public void testCreateCommonTransaction() { .setParameter(Any.pack(updateBrokerageContract.build())); raw.addContract(contract.build()); transaction.setRawData(raw.build()); - assertNotNull(blockingStubFull.createCommonTransaction(transaction.build())); + assertContractValidationFailure(blockingStubFull.createCommonTransaction(transaction.build())); } @Test @@ -688,7 +660,7 @@ public void testMarketSellAsset() { .setSellTokenQuantity(sellTokenQuant) .setSellTokenId(ByteString.copyFrom(sellTokenId.getBytes())) .build(); - assertNotNull(blockingStubFull.marketSellAsset(message)); + assertContractValidationFailure(blockingStubFull.marketSellAsset(message)); } @Test @@ -697,7 +669,7 @@ public void testMarketCancelOrder() { .setOwnerAddress(ownerAddress) .setOrderId(ByteString.copyFromUtf8("123")) .build(); - assertNotNull(blockingStubFull.marketCancelOrder(message)); + assertContractValidationFailure(blockingStubFull.marketCancelOrder(message)); } @Test @@ -708,14 +680,6 @@ public void testGetMarketOrderByAccount() { assertNotNull(blockingStubPBFT.getMarketOrderByAccount(message)); } - // @Test - // public void testGetMarketOrderById() { - // BytesMessage message = BytesMessage.newBuilder().setValue(ownerAddress).build(); - // assertNotNull(blockingStubFull.getMarketOrderById(message)); - // assertNotNull(blockingStubSolidity.getMarketOrderById(message)); - // assertNotNull(blockingStubPBFT.getMarketOrderById(message)); - // } - @Test public void testGetMarketPriceByPair() { MarketOrderPair marketOrderPair = getMarketOrderPair(); @@ -823,8 +787,8 @@ public void testCreateTransaction() { .setToAddress(ownerAddress) .setAmount(1000) .build(); - assertNotNull(blockingStubFull.createTransaction(transferContract)); - assertNotNull(blockingStubFull.createTransaction2(transferContract)); + assertDefaultResponse(blockingStubFull.createTransaction(transferContract)); + assertContractValidationFailure(blockingStubFull.createTransaction2(transferContract)); } @Test @@ -865,244 +829,253 @@ public void testGetTransactionApprovedList() { public void testCreateAssetIssue() { AssetIssueContract assetIssueContract = AssetIssueContract.newBuilder() .build(); - assertNotNull(blockingStubFull.createAssetIssue(assetIssueContract)); - assertNotNull(blockingStubFull.createAssetIssue2(assetIssueContract)); + assertDefaultResponse(blockingStubFull.createAssetIssue(assetIssueContract)); + assertContractValidationFailure(blockingStubFull.createAssetIssue2(assetIssueContract)); } @Test public void testUnfreezeAsset() { UnfreezeAssetContract message = UnfreezeAssetContract.newBuilder().build(); - assertNotNull(blockingStubFull.unfreezeAsset(message)); - assertNotNull(blockingStubFull.unfreezeAsset2(message)); + assertDefaultResponse(blockingStubFull.unfreezeAsset(message)); + assertContractValidationFailure(blockingStubFull.unfreezeAsset2(message)); } @Test public void testVoteWitnessAccount() { VoteWitnessContract message = VoteWitnessContract.newBuilder().build(); - assertNotNull(blockingStubFull.voteWitnessAccount(message)); - assertNotNull(blockingStubFull.voteWitnessAccount2(message)); + assertDefaultResponse(blockingStubFull.voteWitnessAccount(message)); + assertContractValidationFailure(blockingStubFull.voteWitnessAccount2(message)); } @Test public void testUpdateSetting() { UpdateSettingContract message = UpdateSettingContract.newBuilder().build(); - assertNotNull(blockingStubFull.updateSetting(message)); + assertContractValidationFailure(blockingStubFull.updateSetting(message)); } @Test public void testUpdateEnergyLimit() { UpdateEnergyLimitContract message = UpdateEnergyLimitContract.newBuilder().build(); - assertNotNull(blockingStubFull.updateEnergyLimit(message)); + assertContractValidationFailure(blockingStubFull.updateEnergyLimit(message)); } @Test public void testClearContractABI() { ClearABIContract message = ClearABIContract.newBuilder().build(); - assertNotNull(blockingStubFull.clearContractABI(message)); + assertContractValidationFailure(blockingStubFull.clearContractABI(message)); } @Test public void testCreateWitness() { WitnessCreateContract message = WitnessCreateContract.newBuilder().build(); - assertNotNull(blockingStubFull.createWitness(message)); - assertNotNull(blockingStubFull.createWitness2(message)); + assertDefaultResponse(blockingStubFull.createWitness(message)); + assertContractValidationFailure(blockingStubFull.createWitness2(message)); } @Test public void testCreateAccount() { AccountCreateContract message = AccountCreateContract.newBuilder().build(); - assertNotNull(blockingStubFull.createAccount(message)); - assertNotNull(blockingStubFull.createAccount2(message)); + assertDefaultResponse(blockingStubFull.createAccount(message)); + assertContractValidationFailure(blockingStubFull.createAccount2(message)); } @Test public void testUpdateWitness() { WitnessUpdateContract message = WitnessUpdateContract.newBuilder().build(); - assertNotNull(blockingStubFull.updateWitness(message)); - assertNotNull(blockingStubFull.updateWitness2(message)); + assertDefaultResponse(blockingStubFull.updateWitness(message)); + assertContractValidationFailure(blockingStubFull.updateWitness2(message)); } @Test public void testUpdateAccount() { AccountUpdateContract message = AccountUpdateContract.newBuilder().build(); - assertNotNull(blockingStubFull.updateAccount(message)); - assertNotNull(blockingStubFull.updateAccount2(message)); + assertDefaultResponse(blockingStubFull.updateAccount(message)); + assertContractValidationFailure(blockingStubFull.updateAccount2(message)); } @Test public void testSetAccountId() { SetAccountIdContract message = SetAccountIdContract.newBuilder().build(); - assertNotNull(blockingStubFull.setAccountId(message)); + assertDefaultResponse(blockingStubFull.setAccountId(message)); } @Test public void testUpdateAsset() { UpdateAssetContract message = UpdateAssetContract.newBuilder().build(); - assertNotNull(blockingStubFull.updateAsset(message)); - assertNotNull(blockingStubFull.updateAsset2(message)); + assertDefaultResponse(blockingStubFull.updateAsset(message)); + assertContractValidationFailure(blockingStubFull.updateAsset2(message)); } @Test public void testFreezeBalance2() { FreezeBalanceContract message = FreezeBalanceContract.newBuilder().build(); - assertNotNull(blockingStubFull.freezeBalance(message)); - assertNotNull(blockingStubFull.freezeBalance2(message)); + assertDefaultResponse(blockingStubFull.freezeBalance(message)); + assertContractValidationFailure(blockingStubFull.freezeBalance2(message)); } @Test public void testFreezeBalanceV2() { FreezeBalanceV2Contract message = FreezeBalanceV2Contract.newBuilder().build(); - assertNotNull(blockingStubFull.freezeBalanceV2(message)); + assertContractValidationFailure(blockingStubFull.freezeBalanceV2(message)); } @Test public void testUnfreezeBalance() { UnfreezeBalanceContract message = UnfreezeBalanceContract.newBuilder().build(); - assertNotNull(blockingStubFull.unfreezeBalance(message)); - assertNotNull(blockingStubFull.unfreezeBalance2(message)); + assertDefaultResponse(blockingStubFull.unfreezeBalance(message)); + assertContractValidationFailure(blockingStubFull.unfreezeBalance2(message)); } @Test public void testUnfreezeBalanceV2() { UnfreezeBalanceV2Contract message = UnfreezeBalanceV2Contract.newBuilder().build(); - assertNotNull(blockingStubFull.unfreezeBalanceV2(message)); + assertContractValidationFailure(blockingStubFull.unfreezeBalanceV2(message)); } @Test public void testWithdrawBalance() { WithdrawBalanceContract message = WithdrawBalanceContract.newBuilder().build(); - assertNotNull(blockingStubFull.withdrawBalance(message)); - assertNotNull(blockingStubFull.withdrawBalance2(message)); + assertDefaultResponse(blockingStubFull.withdrawBalance(message)); + assertContractValidationFailure(blockingStubFull.withdrawBalance2(message)); } @Test public void testWithdrawExpireUnfreeze() { WithdrawExpireUnfreezeContract message = WithdrawExpireUnfreezeContract.newBuilder().build(); - assertNotNull(blockingStubFull.withdrawExpireUnfreeze(message)); + assertContractValidationFailure(blockingStubFull.withdrawExpireUnfreeze(message)); } @Test public void testDelegateResource() { DelegateResourceContract message = DelegateResourceContract.newBuilder().build(); - assertNotNull(blockingStubFull.delegateResource(message)); + assertContractValidationFailure(blockingStubFull.delegateResource(message)); } @Test public void testUnDelegateResource() { UnDelegateResourceContract message = UnDelegateResourceContract.newBuilder().build(); - assertNotNull(blockingStubFull.unDelegateResource(message)); + assertContractValidationFailure(blockingStubFull.unDelegateResource(message)); } @Test public void testCancelAllUnfreezeV2() { CancelAllUnfreezeV2Contract message = CancelAllUnfreezeV2Contract.newBuilder().build(); - assertNotNull(blockingStubFull.cancelAllUnfreezeV2(message)); + assertContractValidationFailure(blockingStubFull.cancelAllUnfreezeV2(message)); } @Test public void testProposalCreate() { ProposalCreateContract message = ProposalCreateContract.newBuilder().build(); - assertNotNull(blockingStubFull.proposalCreate(message)); + assertContractValidationFailure(blockingStubFull.proposalCreate(message)); } @Test public void testProposalApprove() { ProposalApproveContract message = ProposalApproveContract.newBuilder().build(); - assertNotNull(blockingStubFull.proposalApprove(message)); + assertContractValidationFailure(blockingStubFull.proposalApprove(message)); } @Test public void testProposalDelete() { ProposalDeleteContract message = ProposalDeleteContract.newBuilder().build(); - assertNotNull(blockingStubFull.proposalDelete(message)); + assertContractValidationFailure(blockingStubFull.proposalDelete(message)); } @Test public void testExchangeCreate() { ExchangeCreateContract message = ExchangeCreateContract.newBuilder().build(); - assertNotNull(blockingStubFull.exchangeCreate(message)); + assertContractValidationFailure(blockingStubFull.exchangeCreate(message)); } @Test public void testExchangeInject() { ExchangeInjectContract message = ExchangeInjectContract.newBuilder().build(); - assertNotNull(blockingStubFull.exchangeInject(message)); + assertContractValidationFailure(blockingStubFull.exchangeInject(message)); } @Test public void testExchangeWithdraw() { ExchangeWithdrawContract message = ExchangeWithdrawContract.newBuilder().build(); - assertNotNull(blockingStubFull.exchangeWithdraw(message)); + assertContractValidationFailure(blockingStubFull.exchangeWithdraw(message)); } @Test public void testExchangeTransaction() { ExchangeTransactionContract message = ExchangeTransactionContract.newBuilder().build(); - assertNotNull(blockingStubFull.exchangeTransaction(message)); + assertContractValidationFailure(blockingStubFull.exchangeTransaction(message)); } @Test public void testTransferAsset() { TransferAssetContract message = TransferAssetContract.newBuilder().build(); - assertNotNull(blockingStubFull.transferAsset(message)); - assertNotNull(blockingStubFull.transferAsset2(message)); + assertDefaultResponse(blockingStubFull.transferAsset(message)); + assertContractValidationFailure(blockingStubFull.transferAsset2(message)); } @Test public void testParticipateAssetIssue() { ParticipateAssetIssueContract message = ParticipateAssetIssueContract.newBuilder().build(); - assertNotNull(blockingStubFull.participateAssetIssue(message)); - assertNotNull(blockingStubFull.participateAssetIssue2(message)); + assertDefaultResponse(blockingStubFull.participateAssetIssue(message)); + assertContractValidationFailure(blockingStubFull.participateAssetIssue2(message)); } @Test public void testGetAssetIssueByAccount() { Account message = Account.newBuilder().build(); - assertNotNull(blockingStubFull.getAssetIssueByAccount(message)); + assertDefaultResponse(blockingStubFull.getAssetIssueByAccount(message)); } @Test public void testGetAccountNet() { Account message = Account.newBuilder().build(); - assertNotNull(blockingStubFull.getAccountNet(message)); + assertDefaultResponse(blockingStubFull.getAccountNet(message)); } @Test public void testGetAccountResource() { Account message = Account.newBuilder().build(); - assertNotNull(blockingStubFull.getAccountResource(message)); + assertDefaultResponse(blockingStubFull.getAccountResource(message)); } @Test public void testGetBlockById() { BytesMessage message = BytesMessage.newBuilder().build(); - assertNotNull(blockingStubFull.getBlockById(message)); + assertDefaultResponse(blockingStubFull.getBlockById(message)); } @Test public void testGetProposalById() { BytesMessage message = BytesMessage.newBuilder().build(); - assertNotNull(blockingStubFull.getProposalById(message)); + assertDefaultResponse(blockingStubFull.getProposalById(message)); } @Test public void testGetBlockByLimitNext() { BlockLimit message = BlockLimit.newBuilder().build(); - assertNotNull(blockingStubFull.getBlockByLimitNext(message)); - assertNotNull(blockingStubFull.getBlockByLimitNext2(message)); + assertDefaultResponse(blockingStubFull.getBlockByLimitNext(message)); + assertDefaultResponse(blockingStubFull.getBlockByLimitNext2(message)); } @Test public void testGetBlockByLatestNum() { NumberMessage message = NumberMessage.newBuilder().setNum(0).build(); - assertNotNull(blockingStubFull.getBlockByLatestNum(message)); - assertNotNull(blockingStubFull.getBlockByLatestNum2(message)); + assertDefaultResponse(blockingStubFull.getBlockByLatestNum(message)); + assertDefaultResponse(blockingStubFull.getBlockByLatestNum2(message)); } @Test - public void testDeployContract() { - CreateSmartContract message = CreateSmartContract.newBuilder().build(); - assertNotNull(blockingStubFull.deployContract(message)); + public void testDeployContractReturnsUnsignedTransaction() { + CreateSmartContract message = CreateSmartContract.newBuilder() + .setOwnerAddress(ownerAddress) + .setNewContract(SmartContract.newBuilder().setOriginAddress(ownerAddress).build()) + .build(); + TransactionExtention response = blockingStubFull.deployContract(message); + assertNotNull(response); + Assert.assertTrue(response.hasResult()); + Assert.assertTrue(response.getResult().getResult()); + Assert.assertEquals(response_code.SUCCESS, response.getResult().getCode()); + Assert.assertTrue(response.hasTransaction()); + Assert.assertFalse(response.getTxid().isEmpty()); } @Test @@ -1118,35 +1091,37 @@ public void testGetNextMaintenanceTime() { } @Test - public void testTriggerContract() { + public void testEstimateEnergyReturnsDisabledErrorOnAllNodeTypes() { TriggerSmartContract message = TriggerSmartContract.newBuilder().build(); - assertNotNull(blockingStubFull.estimateEnergy(message)); - assertNotNull(blockingStubSolidity.estimateEnergy(message)); - assertNotNull(blockingStubPBFT.estimateEnergy(message)); + assertContractValidationFailure(blockingStubFull.estimateEnergy(message)); + assertContractValidationFailure(blockingStubSolidity.estimateEnergy(message)); + assertContractValidationFailure(blockingStubPBFT.estimateEnergy(message)); } @Test - public void testEstimateEnergy() { - TriggerSmartContract message = TriggerSmartContract.newBuilder().build(); - assertNotNull(blockingStubFull.estimateEnergy(message)); + public void testTriggerConstantContractRejectsUnknownContract() { + TriggerSmartContract message = TriggerSmartContract.newBuilder() + .setContractAddress(ownerAddress) + .build(); + assertContractValidationFailure(blockingStubFull.triggerConstantContract(message)); } @Test - public void testTriggerConstantContract() { + public void testTriggerContractRejectsEmptyRequest() { TriggerSmartContract message = TriggerSmartContract.newBuilder().build(); - assertNotNull(blockingStubFull.triggerConstantContract(message)); + assertContractValidationFailure(blockingStubFull.triggerContract(message)); } @Test public void testGetContract() { BytesMessage message = BytesMessage.newBuilder().build(); - assertNotNull(blockingStubFull.getContract(message)); + assertDefaultResponse(blockingStubFull.getContract(message)); } @Test public void testGetContractInfo() { BytesMessage message = BytesMessage.newBuilder().build(); - assertNotNull(blockingStubFull.getContractInfo(message)); + assertDefaultResponse(blockingStubFull.getContractInfo(message)); } @Test @@ -1204,46 +1179,59 @@ public void testGetNodeInfo() { @Test public void testAccountPermissionUpdate() { AccountPermissionUpdateContract message = AccountPermissionUpdateContract.newBuilder().build(); - assertNotNull(blockingStubFull.accountPermissionUpdate(message)); + assertContractValidationFailure(blockingStubFull.accountPermissionUpdate(message)); } @Test public void testCreateShieldedTransaction() { PrivateParameters message = PrivateParameters.newBuilder().build(); - assertNotNull(blockingStubFull.createShieldedTransaction(message)); + assertContractValidationFailure(blockingStubFull.createShieldedTransaction(message)); } @Test public void testCreateShieldedTransactionWithoutSpendAuthSig() { PrivateParametersWithoutAsk message = PrivateParametersWithoutAsk.newBuilder().build(); - assertNotNull(blockingStubFull.createShieldedTransactionWithoutSpendAuthSig(message)); + assertContractValidationFailure( + blockingStubFull.createShieldedTransactionWithoutSpendAuthSig(message)); } @Test public void testGetNewShieldedAddress() { EmptyMessage message = EmptyMessage.newBuilder().build(); - assertNotNull(blockingStubFull.getNewShieldedAddress(message)); + ShieldedAddressInfo address = blockingStubFull.getNewShieldedAddress(message); + Assert.assertEquals(32, address.getSk().size()); + Assert.assertEquals(32, address.getAsk().size()); + Assert.assertEquals(32, address.getNsk().size()); + Assert.assertEquals(32, address.getOvk().size()); + Assert.assertEquals(32, address.getAk().size()); + Assert.assertEquals(32, address.getNk().size()); + Assert.assertEquals(32, address.getIvk().size()); + Assert.assertEquals(11, address.getD().size()); + Assert.assertEquals(32, address.getPkD().size()); + Assert.assertFalse(address.getPaymentAddress().isEmpty()); } @Test public void test01GetSpendingKey() { EmptyMessage message = EmptyMessage.newBuilder().build(); BytesMessage spendingKey = blockingStubFull.getSpendingKey(message); - assertNotNull(spendingKey); + Assert.assertEquals(32, spendingKey.getValue().size()); sk = spendingKey.getValue(); } @Test public void testGetRcm() { EmptyMessage message = EmptyMessage.newBuilder().build(); - assertNotNull(blockingStubFull.getRcm(message)); + Assert.assertEquals(32, blockingStubFull.getRcm(message).getValue().size()); } @Test public void test02GetExpandedSpendingKey() { BytesMessage message = BytesMessage.newBuilder().setValue(sk).build(); ExpandedSpendingKeyMessage eskMessage = blockingStubFull.getExpandedSpendingKey(message); - assertNotNull(eskMessage); + Assert.assertEquals(32, eskMessage.getAsk().size()); + Assert.assertEquals(32, eskMessage.getNsk().size()); + Assert.assertEquals(32, eskMessage.getOvk().size()); ask = eskMessage.getAsk(); nsk = eskMessage.getNsk(); ovk = eskMessage.getOvk(); @@ -1253,7 +1241,7 @@ public void test02GetExpandedSpendingKey() { public void test03GetAkFromAsk() { BytesMessage message = BytesMessage.newBuilder().setValue(ask).build(); BytesMessage akMessage = blockingStubFull.getAkFromAsk(message); - assertNotNull(akMessage); + Assert.assertEquals(32, akMessage.getValue().size()); ak = akMessage.getValue(); } @@ -1261,7 +1249,7 @@ public void test03GetAkFromAsk() { public void test04GetNkFromNsk() { BytesMessage message = BytesMessage.newBuilder().setValue(nsk).build(); BytesMessage nkFromNsk = blockingStubFull.getNkFromNsk(message); - assertNotNull(nkFromNsk); + Assert.assertEquals(32, nkFromNsk.getValue().size()); nk = nkFromNsk.getValue(); } @@ -1273,7 +1261,7 @@ public void test05GetIncomingViewingKey() { .build(); IncomingViewingKeyMessage incomingViewingKey = blockingStubFull .getIncomingViewingKey(viewingKeyMessage); - assertNotNull(incomingViewingKey); + Assert.assertEquals(32, incomingViewingKey.getIvk().size()); ivk = incomingViewingKey.getIvk(); } @@ -1281,7 +1269,7 @@ public void test05GetIncomingViewingKey() { public void test06GetDiversifier() { EmptyMessage message = EmptyMessage.newBuilder().build(); DiversifierMessage diversifier = blockingStubFull.getDiversifier(message); - assertNotNull(diversifier); + Assert.assertEquals(11, diversifier.getD().size()); d = diversifier.getD(); } @@ -1295,49 +1283,34 @@ public void test07GetZenPaymentAddress() { .setD(diversifierMessage) .setIvk(incomingViewingKey) .build(); - assertNotNull(blockingStubFull.getZenPaymentAddress(message)); - } - - // @Test - // public void testCreateShieldNullifier() { - // NfParameters message = NfParameters - // .newBuilder().build(); - // assertNotNull(blockingStubFull.createShieldNullifier(message)); - // } - - // @Test - // public void testCreateSpendAuthSig() { - // SpendAuthSigParameters message = SpendAuthSigParameters - // .newBuilder().build(); - // assertNotNull(blockingStubFull.createSpendAuthSig(message)); - // } - - // @Test - // public void testGetShieldTransactionHash() { - // Transaction message = Transaction - // .newBuilder().build(); - // assertNotNull(blockingStubFull.getShieldTransactionHash(message)); - // } - - // @Test - // public void testCreateShieldedContractParameters() { - // PrivateShieldedTRC20Parameters message = PrivateShieldedTRC20Parameters - // .newBuilder().build(); - // assertNotNull(blockingStubFull.createShieldedContractParameters(message)); - // } - - // @Test - // public void testCreateShieldedContractParametersWithoutAsk() throws ZksnarkException { - // SpendingKey sk = SpendingKey.random(); - // ExpandedSpendingKey expsk = sk.expandedSpendingKey(); - // byte[] ovk = expsk.getOvk(); - // PrivateShieldedTRC20ParametersWithoutAsk message = PrivateShieldedTRC20ParametersWithoutAsk - // .newBuilder() - // .setOvk(ByteString.copyFrom(ovk)) - // .setFromAmount(BigInteger.valueOf(50).toString()) - // .setShieldedTRC20ContractAddress(ownerAddress) - // .build(); - // assertNotNull(blockingStubFull - // .createShieldedContractParametersWithoutAsk(message)); - // } + PaymentAddressMessage paymentAddress = blockingStubFull.getZenPaymentAddress(message); + Assert.assertEquals(d, paymentAddress.getD().getD()); + Assert.assertEquals(32, paymentAddress.getPkD().size()); + Assert.assertFalse(paymentAddress.getPaymentAddress().isEmpty()); + } + + private static void assertContractValidationFailure(TransactionExtention response) { + assertNotNull(response); + Assert.assertTrue(response.hasResult()); + assertContractValidationFailure(response.getResult()); + } + + private static void assertContractValidationFailure(EstimateEnergyMessage response) { + assertNotNull(response); + Assert.assertTrue(response.hasResult()); + assertContractValidationFailure(response.getResult()); + } + + private static void assertContractValidationFailure(Return result) { + Assert.assertFalse(result.getResult()); + Assert.assertEquals(response_code.CONTRACT_VALIDATE_ERROR, result.getCode()); + String message = result.getMessage().toStringUtf8(); + Assert.assertTrue(message.startsWith(Wallet.CONTRACT_VALIDATE_ERROR)); + Assert.assertTrue(message.length() > Wallet.CONTRACT_VALIDATE_ERROR.length()); + } + + private static void assertDefaultResponse(Message response) { + assertNotNull(response); + Assert.assertEquals(response.getDefaultInstanceForType(), response); + } } diff --git a/framework/src/test/java/org/tron/core/services/filter/CachedBodyRequestWrapperTest.java b/framework/src/test/java/org/tron/core/services/filter/CachedBodyRequestWrapperTest.java index 813b1a61bea..7c14e922175 100644 --- a/framework/src/test/java/org/tron/core/services/filter/CachedBodyRequestWrapperTest.java +++ b/framework/src/test/java/org/tron/core/services/filter/CachedBodyRequestWrapperTest.java @@ -1,5 +1,6 @@ package org.tron.core.services.filter; +import static org.junit.Assert.assertArrayEquals; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertTrue; @@ -36,9 +37,12 @@ public void getInputStream_returnsBodyContent() throws IOException { @Test public void getInputStream_calledTwice_bothSucceed() throws IOException { CachedBodyRequestWrapper w = new CachedBodyRequestWrapper(new MockHttpServletRequest(), BODY); - w.getInputStream(); + byte[] firstRead = readFully(w.getInputStream()); // second call of the same accessor is allowed by the servlet spec - w.getInputStream(); + byte[] secondRead = readFully(w.getInputStream()); + + assertArrayEquals(BODY, firstRead); + assertArrayEquals(BODY, secondRead); } // --- getReader --- @@ -53,8 +57,11 @@ public void getReader_returnsBodyContent() throws IOException { @Test public void getReader_calledTwice_bothSucceed() throws IOException { CachedBodyRequestWrapper w = new CachedBodyRequestWrapper(new MockHttpServletRequest(), BODY); - w.getReader(); - w.getReader(); + String firstRead = w.getReader().readLine(); + String secondRead = w.getReader().readLine(); + + assertEquals("hello world", firstRead); + assertEquals("hello world", secondRead); } // --- mutual exclusion --- diff --git a/framework/src/test/java/org/tron/core/services/filter/LiteFnQueryHttpFilterTest.java b/framework/src/test/java/org/tron/core/services/filter/LiteFnQueryHttpFilterTest.java index 5c9b1d9a52c..2d0f273d3fb 100644 --- a/framework/src/test/java/org/tron/core/services/filter/LiteFnQueryHttpFilterTest.java +++ b/framework/src/test/java/org/tron/core/services/filter/LiteFnQueryHttpFilterTest.java @@ -1,128 +1,118 @@ package org.tron.core.services.filter; -import static org.tron.core.ChainBaseManager.NodeType.FULL; -import static org.tron.core.ChainBaseManager.NodeType.LITE; +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertFalse; +import static org.mockito.Mockito.mock; +import static org.mockito.Mockito.verify; +import static org.mockito.Mockito.verifyNoInteractions; +import static org.mockito.Mockito.when; -import java.io.BufferedReader; -import java.io.IOException; -import java.io.InputStreamReader; +import java.lang.reflect.Field; import java.util.Set; -import lombok.extern.slf4j.Slf4j; -import org.apache.http.HttpResponse; -import org.apache.http.client.methods.HttpGet; -import org.apache.http.client.methods.HttpPost; -import org.apache.http.entity.StringEntity; -import org.apache.http.impl.client.CloseableHttpClient; -import org.apache.http.impl.client.HttpClients; -import org.junit.Assert; +import javax.servlet.FilterChain; +import org.junit.AfterClass; import org.junit.Before; +import org.junit.BeforeClass; import org.junit.Test; -import org.tron.common.BaseTest; +import org.springframework.mock.web.MockHttpServletRequest; +import org.springframework.mock.web.MockHttpServletResponse; import org.tron.common.TestConstants; -import org.tron.common.utils.PublicMethod; +import org.tron.core.ChainBaseManager; import org.tron.core.config.args.Args; -@Slf4j -public class LiteFnQueryHttpFilterTest extends BaseTest { - - private final String ip = "127.0.0.1"; - private int fullHttpPort; - private final CloseableHttpClient httpClient = HttpClients.createDefault(); - - static { - Args.setParam(new String[]{"-d", dbPath()}, TestConstants.TEST_CONF); - Args.getInstance().setAllowShieldedTransactionApi(false); - Args.getInstance().setRpcEnable(false); - Args.getInstance().setRpcSolidityEnable(false); - Args.getInstance().setRpcPBFTEnable(false); - Args.getInstance().setFullNodeHttpEnable(true); - Args.getInstance().setFullNodeHttpPort(PublicMethod.chooseRandomPort()); - Args.getInstance().setPBFTHttpEnable(true); - Args.getInstance().setPBFTHttpPort(PublicMethod.chooseRandomPort()); - Args.getInstance().setSolidityNodeHttpEnable(true); - Args.getInstance().setSolidityHttpPort(PublicMethod.chooseRandomPort()); - Args.getInstance().setJsonRpcHttpFullNodeEnable(false); - Args.getInstance().setJsonRpcHttpSolidityNodeEnable(false); - Args.getInstance().setJsonRpcHttpPBFTNodeEnable(false); - Args.getInstance().setP2pDisable(true); +public class LiteFnQueryHttpFilterTest { + + private static final String CLOSED_MESSAGE = + "this API is closed because this node is a lite fullnode"; + + private ChainBaseManager chainBaseManager; + private LiteFnQueryHttpFilter filter; + + @BeforeClass + public static void initArgs() { + Args.setParam(new String[]{}, TestConstants.TEST_CONF); + } + + @AfterClass + public static void clearArgs() { + Args.clearParam(); } - /** - * init dependencies. - */ @Before - public void init() { - appT.startup(); + public void setUp() throws Exception { + chainBaseManager = mock(ChainBaseManager.class); + filter = new LiteFnQueryHttpFilter(); + Field field = LiteFnQueryHttpFilter.class.getDeclaredField("chainBaseManager"); + field.setAccessible(true); + field.set(filter, chainBaseManager); } @Test - public void testHttpFilter() { - Set urlPathSets = LiteFnQueryHttpFilter.getFilterPaths(); - urlPathSets.forEach(urlPath -> { - if (urlPath.contains("/walletsolidity")) { - fullHttpPort = Args.getInstance().getSolidityHttpPort(); - } else if (urlPath.contains("/walletpbft")) { - fullHttpPort = Args.getInstance().getPBFTHttpPort(); - } else { - fullHttpPort = Args.getInstance().getFullNodeHttpPort(); - } - String url = String.format("http://%s:%d%s", ip, fullHttpPort, urlPath); - // test lite fullnode with history query closed - chainBaseManager.setNodeType(LITE); - Args.getInstance().setOpenHistoryQueryWhenLiteFN(false); - String response = sendGetRequest(url); - logger.info("response:{}", response); - - // test lite fullnode with history query opened - chainBaseManager.setNodeType(FULL); - Args.getInstance().setOpenHistoryQueryWhenLiteFN(true); - response = sendGetRequest(url); - Assert.assertNotEquals("this API is closed because this node is a lite fullnode", - response); - - // test normal fullnode - chainBaseManager.setNodeType(FULL); - Args.getInstance().setOpenHistoryQueryWhenLiteFN(true); - response = sendGetRequest(url); - Assert.assertNotEquals("this API is closed because this node is a lite fullnode", - response); - }); + public void testEveryProtectedPathIsBlockedOnLiteNodeWhenHistoryIsClosed() throws Exception { + when(chainBaseManager.isLiteNode()).thenReturn(true); + Args.getInstance().setOpenHistoryQueryWhenLiteFN(false); + Set paths = LiteFnQueryHttpFilter.getFilterPaths(); + assertFalse(paths.isEmpty()); + FilterChain filterChain = mock(FilterChain.class); - } + for (String path : paths) { + MockHttpServletRequest request = requestFor(path); + MockHttpServletResponse response = new MockHttpServletResponse(); - private String sendGetRequest(String url) { - HttpGet request = new HttpGet(url); - request.setHeader("User-Agent", "Java client"); - HttpResponse response; - try { - response = httpClient.execute(request); - BufferedReader rd = new BufferedReader( - new InputStreamReader(response.getEntity().getContent())); - StringBuilder result = new StringBuilder(); - String line; - while ((line = rd.readLine()) != null) { - result.append(line); - } - return result.toString(); - } catch (IOException e) { - e.printStackTrace(); + filter.doFilter(request, response, filterChain); + + assertEquals("path=" + path, "application/json; charset=utf-8", + response.getContentType()); + assertEquals("path=" + path, CLOSED_MESSAGE, response.getContentAsString()); } - return null; + verifyNoInteractions(filterChain); } - private String sendPostRequest(String url, String body) throws IOException { - HttpPost request = new HttpPost(url); - request.setHeader("User-Agent", "Java client"); - StringEntity entity = new StringEntity(body); - request.setEntity(entity); - HttpResponse response = httpClient.execute(request); - BufferedReader rd = new BufferedReader( - new InputStreamReader(response.getEntity().getContent())); - StringBuilder result = new StringBuilder(); - String line; - while ((line = rd.readLine()) != null) { - result.append(line); - } - return result.toString(); + @Test + public void testProtectedPathContinuesWhenLiteHistoryQueriesAreEnabled() throws Exception { + when(chainBaseManager.isLiteNode()).thenReturn(true); + Args.getInstance().setOpenHistoryQueryWhenLiteFN(true); + FilterChain filterChain = mock(FilterChain.class); + MockHttpServletRequest request = requestFor("/wallet/getblockbyid"); + MockHttpServletResponse response = new MockHttpServletResponse(); + + filter.doFilter(request, response, filterChain); + + verify(filterChain).doFilter(request, response); + assertEquals("", response.getContentAsString()); + } + + @Test + public void testUnprotectedPathContinuesWhenLiteHistoryQueriesAreClosed() throws Exception { + when(chainBaseManager.isLiteNode()).thenReturn(true); + Args.getInstance().setOpenHistoryQueryWhenLiteFN(false); + FilterChain filterChain = mock(FilterChain.class); + MockHttpServletRequest request = requestFor("/wallet/getnowblock"); + MockHttpServletResponse response = new MockHttpServletResponse(); + + filter.doFilter(request, response, filterChain); + + verify(filterChain).doFilter(request, response); + assertEquals("", response.getContentAsString()); + } + + @Test + public void testProtectedPathContinuesOnFullNode() throws Exception { + when(chainBaseManager.isLiteNode()).thenReturn(false); + Args.getInstance().setOpenHistoryQueryWhenLiteFN(false); + FilterChain filterChain = mock(FilterChain.class); + MockHttpServletRequest request = requestFor("/walletpbft/gettransactionbyid"); + MockHttpServletResponse response = new MockHttpServletResponse(); + + filter.doFilter(request, response, filterChain); + + verify(filterChain).doFilter(request, response); + } + + private static MockHttpServletRequest requestFor(String path) { + MockHttpServletRequest request = new MockHttpServletRequest(); + request.setContextPath(""); + request.setServletPath(path); + return request; } } diff --git a/framework/src/test/java/org/tron/core/services/http/BroadcastServletTest.java b/framework/src/test/java/org/tron/core/services/http/BroadcastServletTest.java index d6bf3850f30..b0adde69d0c 100644 --- a/framework/src/test/java/org/tron/core/services/http/BroadcastServletTest.java +++ b/framework/src/test/java/org/tron/core/services/http/BroadcastServletTest.java @@ -1,162 +1,75 @@ package org.tron.core.services.http; -import static org.mockito.BDDMockito.given; -import static org.mockito.Mockito.mock; +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.verify; import static org.mockito.Mockito.when; -import java.io.BufferedReader; -import java.io.ByteArrayInputStream; -import java.io.ByteArrayOutputStream; -import java.io.File; -import java.io.FileInputStream; -import java.io.IOException; -import java.io.InputStreamReader; -import java.io.OutputStreamWriter; -import java.io.PrintStream; -import java.io.PrintWriter; -import java.net.HttpURLConnection; -import java.net.URL; -import java.net.URLStreamHandlerFactory; -import java.nio.charset.StandardCharsets; -import javax.servlet.http.HttpServletRequest; -import javax.servlet.http.HttpServletResponse; -import lombok.extern.slf4j.Slf4j; -import org.junit.After; -import org.junit.Assert; -import org.junit.Before; -import org.junit.BeforeClass; import org.junit.Test; -import org.tron.common.utils.FileUtil; -import org.tron.common.utils.PublicMethod; -import org.tron.core.services.http.solidity.mockito.HttpUrlStreamHandler; - -@Slf4j -public class BroadcastServletTest { - - private static HttpUrlStreamHandler httpUrlStreamHandler; - private BroadcastServlet broadcastServlet; - private HttpServletRequest request; - private HttpServletResponse response; - private HttpURLConnection httpUrlConnection; - private OutputStreamWriter outputStreamWriter; - private URL url; - - /** - * init before class. - */ - @BeforeClass - public static void init() { - // Allows for mocking URL connections - URLStreamHandlerFactory urlStreamHandlerFactory = mock(URLStreamHandlerFactory.class); - try { - URL.setURLStreamHandlerFactory(urlStreamHandlerFactory); - } catch (Error e) { - logger.info("Ignore error: {}", e.getMessage()); - } - - - httpUrlStreamHandler = new HttpUrlStreamHandler(); - given(urlStreamHandlerFactory.createURLStreamHandler("http")).willReturn(httpUrlStreamHandler); - - } - - /** - * set up. - * - */ - @Before - public void setUp() { - broadcastServlet = new BroadcastServlet(); - this.request = mock(HttpServletRequest.class); - this.response = mock(HttpServletResponse.class); - this.httpUrlConnection = mock(HttpURLConnection.class); - this.outputStreamWriter = mock(OutputStreamWriter.class); - httpUrlStreamHandler.resetConnections(); +import org.mockito.ArgumentCaptor; +import org.springframework.mock.web.MockHttpServletResponse; +import org.tron.api.GrpcAPI; +import org.tron.common.utils.ByteArray; +import org.tron.core.capsule.TransactionCapsule; +import org.tron.json.JSONObject; +import org.tron.protos.Protocol.Transaction; + +public class BroadcastServletTest extends BaseHttpTest { + + private static final String TRANSACTION_JSON = + "{\"signature\":[\"97c825b41c77de2a8bd65b3df55cd4c0df59c307c0187e42321dcc1cc4" + + "55ddba583dd9502e17cfec5945b34cad0511985a6165999092a6dec84c2bdd97e649fc01\"]," + + "\"raw_data\":{\"contract\":[{\"parameter\":{\"value\":{\"amount\":1000," + + "\"owner_address\":\"41e552f6487585c2b58bc2c9bb4492bc1f17132cd0\"," + + "\"to_address\":\"41d1e7a6bc354106cb410e65ff8b181c600ff14292\"}," + + "\"type_url\":\"type.googleapis.com/protocol.TransferContract\"}," + + "\"type\":\"TransferContract\"}],\"ref_block_bytes\":\"267e\"," + + "\"ref_block_hash\":\"9a447d222e8de9f2\",\"expiration\":1530893064000," + + "\"timestamp\":1530893006233}}"; + + private BroadcastServlet servlet; + + @Override + protected void setUpMocks() throws Exception { + servlet = new BroadcastServlet(); + injectWallet(servlet); + when(wallet.broadcastTransaction(any())).thenReturn(GrpcAPI.Return.newBuilder() + .setResult(true) + .setCode(GrpcAPI.Return.response_code.SUCCESS) + .build()); } - /** - * after test. - */ - @After - public void tearDown() { - if (FileUtil.deleteDir(new File("temp.txt"))) { - logger.info("Release resources successful."); - } else { - logger.info("Release resources failure."); - } + @Test + public void testPostBroadcastsParsedTransactionAndReturnsItsId() throws Exception { + MockHttpServletResponse response = newResponse(); + + servlet.doPost(postRequest(TRANSACTION_JSON), response); + + assertEquals(200, response.getStatus()); + ArgumentCaptor transactionCaptor = ArgumentCaptor.forClass(Transaction.class); + verify(wallet).broadcastTransaction(transactionCaptor.capture()); + Transaction transaction = transactionCaptor.getValue(); + assertEquals(1, transaction.getRawData().getContractCount()); + assertEquals(Transaction.Contract.ContractType.TransferContract, + transaction.getRawData().getContract(0).getType()); + + JSONObject result = JSONObject.parseObject(response.getContentAsString()); + assertEquals(Boolean.TRUE, result.get("result")); + assertFalse(result.containsKey("Error")); + assertEquals(ByteArray.toHexString(new TransactionCapsule(transaction) + .getTransactionId().getBytes()), result.getString("txid")); } @Test - public void doPostTest() throws IOException { - URLStreamHandlerFactory urlStreamHandlerFactory = mock(URLStreamHandlerFactory.class); - httpUrlStreamHandler = new HttpUrlStreamHandler(); - given(urlStreamHandlerFactory.createURLStreamHandler("http")).willReturn(httpUrlStreamHandler); - - broadcastServlet = new BroadcastServlet(); - this.request = mock(HttpServletRequest.class); - this.response = mock(HttpServletResponse.class); - this.httpUrlConnection = mock(HttpURLConnection.class); - this.outputStreamWriter = mock(OutputStreamWriter.class); - httpUrlStreamHandler.resetConnections(); - - final ByteArrayOutputStream outContent = new ByteArrayOutputStream(); - System.setOut(new PrintStream(outContent)); - String href = "http://127.0.0.1:" - + PublicMethod.chooseRandomPort() + "/wallet/broadcasttransaction"; - httpUrlStreamHandler.addConnection(new URL(href), httpUrlConnection); - httpUrlConnection.setRequestMethod("POST"); - httpUrlConnection.setRequestProperty("Content-Type", "application/json"); - httpUrlConnection.setRequestProperty("Connection", "Keep-Alive"); - httpUrlConnection.setUseCaches(false); - httpUrlConnection.setDoOutput(true); - String postData = "{\"signature\":[\"97c825b41c77de2a8bd65b3df55cd4c0df59c307c0187e" - + "42321dcc1cc455ddba583dd9502e17cfec5945b34cad0511985a6165999092a6dec84c2bdd9" - + "7e649fc01\"],\"txID\":\"454f156bf1256587ff6ccdbc56e64ad0c51e4f8efea5490dcbc7" - + "20ee606bc7b8\",\"raw_data\":{\"contract\":[{\"parame" - + "ter\":{\"value\":{\"amount\":1000,\"owner_address\":\"41e552f6" - + "487585c2b58bc2c9bb4492bc1f17132cd0\",\"to_address\":\"41d1e7a6bc354106cb410e" - + "65ff8b181c600ff14292\"},\"type_url\":\"type.googl" - + "eapis.com/protocol.TransferContract\"},\"type\":\"TransferCon" - + "tract\"}],\"ref_block_bytes\":\"267e\",\"ref_block_hash\":\"9a447d222e8" - + "de9f2\",\"expiration\":1530893064000,\"timestamp\":1530893006233}}"; - httpUrlConnection.setRequestProperty("Content-Length", String.valueOf(postData.length())); - - when(httpUrlConnection.getOutputStream()).thenReturn(outContent); - OutputStreamWriter out = new OutputStreamWriter(httpUrlConnection.getOutputStream(), - StandardCharsets.UTF_8); - out.write(postData); - out.flush(); - out.close(); - PrintWriter writer = new PrintWriter("temp.txt"); - when(response.getWriter()).thenReturn(writer); - - broadcastServlet.doPost(request, response); - // Get Response Body - String line; - StringBuilder result = new StringBuilder(); - - byte[] buffer = new byte[1024]; - ByteArrayInputStream byteArrayInputStream = new ByteArrayInputStream(buffer); - when(httpUrlConnection.getInputStream()).thenReturn(byteArrayInputStream); - BufferedReader in = new BufferedReader(new InputStreamReader(httpUrlConnection.getInputStream(), - StandardCharsets.UTF_8)); + public void testMalformedTransactionReturnsBusinessError() throws Exception { + MockHttpServletResponse response = newResponse(); - while ((line = in.readLine()) != null) { - result.append(line).append("\n"); - } - Assert.assertNotNull(result); - in.close(); - writer.flush(); - FileInputStream fileInputStream = new FileInputStream("temp.txt"); - InputStreamReader inputStreamReader = new InputStreamReader(fileInputStream); - BufferedReader bufferedReader = new BufferedReader(inputStreamReader); + servlet.doPost(postRequest("{}"), response); - StringBuilder sb = new StringBuilder(); - String text; - while ((text = bufferedReader.readLine()) != null) { - sb.append(text); - } - Assert.assertTrue(sb.toString().contains("null")); - httpUrlConnection.disconnect(); + assertEquals(200, response.getStatus()); + JSONObject result = JSONObject.parseObject(response.getContentAsString()); + assertTrue(result.containsKey("Error")); } -} \ No newline at end of file +} diff --git a/framework/src/test/java/org/tron/core/services/http/GetAccountByIdServletTest.java b/framework/src/test/java/org/tron/core/services/http/GetAccountByIdServletTest.java index 885e5b2a1cf..2ec89a2496e 100644 --- a/framework/src/test/java/org/tron/core/services/http/GetAccountByIdServletTest.java +++ b/framework/src/test/java/org/tron/core/services/http/GetAccountByIdServletTest.java @@ -1,47 +1,62 @@ package org.tron.core.services.http; -import static org.apache.commons.lang3.StringUtils.isNotEmpty; - -import javax.annotation.Resource; -import org.junit.Assert; +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertFalse; +import static org.mockito.ArgumentMatchers.any; +import static org.mockito.ArgumentMatchers.argThat; +import static org.mockito.Mockito.verify; +import static org.mockito.Mockito.when; + +import com.google.protobuf.ByteString; import org.junit.Test; -import org.springframework.mock.web.MockHttpServletRequest; import org.springframework.mock.web.MockHttpServletResponse; -import org.tron.common.BaseTest; -import org.tron.common.TestConstants; -import org.tron.core.config.args.Args; - -public class GetAccountByIdServletTest extends BaseTest { - - static { - Args.setParam( - new String[]{ - "--output-directory", dbPath(), - }, TestConstants.TEST_CONF - ); +import org.tron.common.utils.ByteArray; +import org.tron.json.JSONObject; +import org.tron.protos.Protocol.Account; + +public class GetAccountByIdServletTest extends BaseHttpTest { + + private static final String ACCOUNT_ID_HEX = "6161616162626262"; + private static final ByteString ACCOUNT_ID = + ByteString.copyFrom(ByteArray.fromHexString(ACCOUNT_ID_HEX)); + + private GetAccountByIdServlet servlet; + + @Override + protected void setUpMocks() throws Exception { + servlet = new GetAccountByIdServlet(); + injectWallet(servlet); + when(wallet.getAccountById(any())).thenReturn(Account.newBuilder() + .setAccountId(ACCOUNT_ID) + .setBalance(42L) + .build()); } - @Resource - private GetAccountByIdServlet getAccountByIdServlet; - - public MockHttpServletRequest createRequest(String contentType) { - MockHttpServletRequest request = new MockHttpServletRequest(); - request.setMethod("POST"); - if (isNotEmpty(contentType)) { - request.setContentType(contentType); - } - request.setCharacterEncoding("UTF-8"); - return request; + @Test + public void testPostPassesAccountIdToWalletAndReturnsAccount() throws Exception { + MockHttpServletResponse response = newResponse(); + + servlet.doPost(postRequest("{\"account_id\":\"" + ACCOUNT_ID_HEX + "\"}"), response); + + assertEquals(200, response.getStatus()); + verify(wallet).getAccountById(argThat(account -> account != null + && ACCOUNT_ID.equals(account.getAccountId()))); + JSONObject json = JSONObject.parseObject(response.getContentAsString()); + assertFalse(json.containsKey("Error")); + assertEquals(ACCOUNT_ID_HEX, json.getString("account_id")); + assertEquals(42L, ((Number) json.get("balance")).longValue()); } @Test - public void testGetAccountById() { - String jsonParam = "{\"account_id\": \"6161616162626262\"}"; - MockHttpServletRequest request = createRequest("application/json"); - request.setContent(jsonParam.getBytes()); - MockHttpServletResponse response = new MockHttpServletResponse(); - - getAccountByIdServlet.doPost(request, response); - Assert.assertEquals(200, response.getStatus()); + public void testGetReturnsEmptyObjectWhenAccountIsNotFound() throws Exception { + when(wallet.getAccountById(any())).thenReturn(null); + MockHttpServletResponse response = newResponse(); + + servlet.doGet(getRequest("account_id", ACCOUNT_ID_HEX), response); + + assertEquals(200, response.getStatus()); + verify(wallet).getAccountById(argThat(account -> account != null + && ACCOUNT_ID.equals(account.getAccountId()))); + assertEquals("{}", response.getContentAsString().trim()); } } diff --git a/framework/src/test/java/org/tron/core/services/http/GetAssetIssueListByNameServletTest.java b/framework/src/test/java/org/tron/core/services/http/GetAssetIssueListByNameServletTest.java index e3055e21f99..d6566e2935e 100644 --- a/framework/src/test/java/org/tron/core/services/http/GetAssetIssueListByNameServletTest.java +++ b/framework/src/test/java/org/tron/core/services/http/GetAssetIssueListByNameServletTest.java @@ -10,6 +10,7 @@ import org.junit.Test; import org.springframework.mock.web.MockHttpServletRequest; import org.springframework.mock.web.MockHttpServletResponse; +import org.tron.api.GrpcAPI.AssetIssueList; import org.tron.common.utils.ByteArray; public class GetAssetIssueListByNameServletTest extends BaseHttpTest { @@ -21,7 +22,8 @@ public class GetAssetIssueListByNameServletTest extends BaseHttpTest { protected void setUpMocks() throws Exception { servlet = new GetAssetIssueListByNameServlet(); injectWallet(servlet); - when(wallet.getAssetIssueListByName(any())).thenReturn(null); + // Wallet returns an empty protobuf list for a valid name with no matching assets. + when(wallet.getAssetIssueListByName(any())).thenReturn(AssetIssueList.getDefaultInstance()); } @Test diff --git a/framework/src/test/java/org/tron/core/services/http/GetAssetIssueListServletTest.java b/framework/src/test/java/org/tron/core/services/http/GetAssetIssueListServletTest.java index 2b9e997cf80..5b5c4efe235 100644 --- a/framework/src/test/java/org/tron/core/services/http/GetAssetIssueListServletTest.java +++ b/framework/src/test/java/org/tron/core/services/http/GetAssetIssueListServletTest.java @@ -1,82 +1,57 @@ package org.tron.core.services.http; -import static java.nio.charset.StandardCharsets.UTF_8; -import static org.junit.Assert.fail; +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertFalse; +import static org.mockito.Mockito.verify; +import static org.mockito.Mockito.when; -import java.io.UnsupportedEncodingException; -import javax.annotation.Resource; +import com.google.protobuf.ByteString; import org.junit.Test; -import org.springframework.mock.web.MockHttpServletRequest; import org.springframework.mock.web.MockHttpServletResponse; -import org.tron.common.BaseTest; -import org.tron.common.TestConstants; -import org.tron.core.config.args.Args; +import org.tron.api.GrpcAPI.AssetIssueList; +import org.tron.json.JSONArray; import org.tron.json.JSONObject; +import org.tron.protos.contract.AssetIssueContractOuterClass.AssetIssueContract; -public class GetAssetIssueListServletTest extends BaseTest { +public class GetAssetIssueListServletTest extends BaseHttpTest { - @Resource - private GetAssetIssueListServlet getAssetIssueListServlet; + private GetAssetIssueListServlet servlet; - static { - Args.setParam( - new String[]{ - "--output-directory", dbPath(), - }, TestConstants.TEST_CONF - ); - } - - public MockHttpServletRequest createRequest(String contentType) { - MockHttpServletRequest request = new MockHttpServletRequest(); - request.setMethod("POST"); - request.setContentType(contentType); - request.setCharacterEncoding("UTF-8"); - return request; + @Override + protected void setUpMocks() throws Exception { + servlet = new GetAssetIssueListServlet(); + injectWallet(servlet); + when(wallet.getAssetIssueList()).thenReturn(AssetIssueList.newBuilder() + .addAssetIssue(AssetIssueContract.newBuilder() + .setName(ByteString.copyFromUtf8("asset")) + .setTotalSupply(5000L)) + .build()); } @Test - public void testGetAssetIssueListByJson() { - String jsonParam = "{\"visible\": true}"; - MockHttpServletRequest request = createRequest("application/json"); - request.setContent(jsonParam.getBytes()); - MockHttpServletResponse response = new MockHttpServletResponse(); - getAssetIssueListServlet.doPost(request, response); - try { - String contentAsString = response.getContentAsString(); - JSONObject.parseObject(contentAsString); - } catch (UnsupportedEncodingException e) { - fail(e.getMessage()); - } + public void testPostReturnsAssetList() throws Exception { + MockHttpServletResponse response = newResponse(); + + servlet.doPost(postRequest("{}"), response); + + assertEquals(200, response.getStatus()); + verify(wallet).getAssetIssueList(); + JSONObject json = JSONObject.parseObject(response.getContentAsString()); + assertFalse(json.containsKey("Error")); + JSONArray assets = json.getJSONArray("assetIssue"); + assertEquals(1, assets.size()); + assertEquals(5000L, ((Number) assets.getJSONObject(0).get("total_supply")).longValue()); } @Test - public void testGetAssetIssueListValue() { - MockHttpServletRequest request = createRequest("application/x-www-form-urlencoded"); - try { - String params = "visible=true"; - request.setContent(params.getBytes(UTF_8)); - MockHttpServletResponse response = new MockHttpServletResponse(); - getAssetIssueListServlet.doPost(request, response); - String contentAsString = response.getContentAsString(); - JSONObject.parseObject(contentAsString); - } catch (UnsupportedEncodingException e) { - fail(e.getMessage()); - } - } + public void testGetReturnsEmptyObjectWhenWalletReturnsNull() throws Exception { + when(wallet.getAssetIssueList()).thenReturn(null); + MockHttpServletResponse response = newResponse(); - @Test - public void testGetAssetIssueListEmptyParam() { - MockHttpServletRequest request = createRequest("application/x-www-form-urlencoded"); - String params = "visible="; - request.setContent(params.getBytes(UTF_8)); - MockHttpServletResponse response = new MockHttpServletResponse(); - getAssetIssueListServlet.doPost(request, response); - try { - String contentAsString = response.getContentAsString(); - JSONObject.parseObject(contentAsString); - } catch (UnsupportedEncodingException e) { - fail(e.getMessage()); - } - } + servlet.doGet(getRequest("visible", "true"), response); + assertEquals(200, response.getStatus()); + verify(wallet).getAssetIssueList(); + assertEquals("{}", response.getContentAsString().trim()); + } } diff --git a/framework/src/test/java/org/tron/core/services/http/GetBandwidthPricesServletTest.java b/framework/src/test/java/org/tron/core/services/http/GetBandwidthPricesServletTest.java index 2ddfda17bef..6113cda7252 100644 --- a/framework/src/test/java/org/tron/core/services/http/GetBandwidthPricesServletTest.java +++ b/framework/src/test/java/org/tron/core/services/http/GetBandwidthPricesServletTest.java @@ -31,7 +31,7 @@ public static void init() { public void testGet() { MockHttpServletRequest request = createRequest(HttpGet.METHOD_NAME); MockHttpServletResponse response = new MockHttpServletResponse(); - getBandwidthPricesServlet.doPost(request, response); + getBandwidthPricesServlet.doGet(request, response); try { String contentAsString = response.getContentAsString(); JSONObject result = JSONObject.parseObject(contentAsString); diff --git a/framework/src/test/java/org/tron/core/services/http/GetBlockByIdServletTest.java b/framework/src/test/java/org/tron/core/services/http/GetBlockByIdServletTest.java index 8e04713922a..7d1026360d9 100644 --- a/framework/src/test/java/org/tron/core/services/http/GetBlockByIdServletTest.java +++ b/framework/src/test/java/org/tron/core/services/http/GetBlockByIdServletTest.java @@ -1,51 +1,65 @@ package org.tron.core.services.http; -import static java.nio.charset.StandardCharsets.UTF_8; -import static org.tron.common.utils.client.utils.HttpMethed.createRequest; +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.ArgumentMatchers.eq; +import static org.mockito.Mockito.verify; +import static org.mockito.Mockito.when; -import javax.annotation.Resource; - -import org.apache.http.client.methods.HttpGet; -import org.apache.http.client.methods.HttpPost; -import org.junit.Assert; +import com.google.protobuf.ByteString; import org.junit.Test; -import org.springframework.mock.web.MockHttpServletRequest; import org.springframework.mock.web.MockHttpServletResponse; -import org.tron.common.BaseTest; -import org.tron.common.TestConstants; -import org.tron.core.config.args.Args; +import org.tron.common.utils.ByteArray; +import org.tron.common.utils.Sha256Hash; +import org.tron.core.capsule.BlockCapsule; +import org.tron.json.JSONObject; +import org.tron.protos.Protocol.Block; + +public class GetBlockByIdServletTest extends BaseHttpTest { -public class GetBlockByIdServletTest extends BaseTest { + private static final String BLOCK_ID = + "0000000000000001000000000000000000000000000000000000000000000000"; + private static final ByteString BLOCK_ID_BYTES = + ByteString.copyFrom(ByteArray.fromHexString(BLOCK_ID)); - @Resource - private GetBlockByIdServlet getBlockByIdServlet; + private GetBlockByIdServlet servlet; + private Block block; - static { - Args.setParam( - new String[]{ - "--output-directory", dbPath(), - }, TestConstants.TEST_CONF - ); + @Override + protected void setUpMocks() throws Exception { + servlet = new GetBlockByIdServlet(); + injectWallet(servlet); + block = new BlockCapsule(1L, Sha256Hash.ZERO_HASH, 1234L, + Sha256Hash.ZERO_HASH.getByteString()).getInstance(); + when(wallet.getBlockById(any())).thenReturn(block); } @Test - public void testGetBlockById() { - String jsonParam = "{\"value\": " - + "\"0000000002951a2f65db6725c2d0583f1ab9bdb1520eeedece99d9c98f3\"}"; - MockHttpServletRequest request = createRequest(HttpPost.METHOD_NAME); - request.setContentType("application/json"); - request.setContent(jsonParam.getBytes(UTF_8)); - MockHttpServletResponse response = new MockHttpServletResponse(); - getBlockByIdServlet.doPost(request, response); - Assert.assertEquals(200, response.getStatus()); + public void testPostReturnsRequestedBlock() throws Exception { + MockHttpServletResponse response = newResponse(); + + servlet.doPost(postRequest("{\"value\":\"" + BLOCK_ID + "\"}"), response); + + assertEquals(200, response.getStatus()); + verify(wallet).getBlockById(eq(BLOCK_ID_BYTES)); + JSONObject json = JSONObject.parseObject(response.getContentAsString()); + assertFalse(json.containsKey("Error")); + assertEquals(ByteArray.toHexString(new BlockCapsule(block).getBlockId().getBytes()), + json.getString("blockID")); + assertTrue(json.containsKey("block_header")); } @Test - public void testGet() { - MockHttpServletRequest request = createRequest(HttpGet.METHOD_NAME); - request.addParameter("value", "0000000002951a2f65db6725c2d0583f1ab9bdb1520eeedece99d9c98f3"); - MockHttpServletResponse response = new MockHttpServletResponse(); - getBlockByIdServlet.doGet(request, response); - Assert.assertEquals(200, response.getStatus()); + public void testGetReturnsEmptyObjectWhenBlockIsNotFound() throws Exception { + when(wallet.getBlockById(eq(BLOCK_ID_BYTES))).thenReturn(null); + MockHttpServletResponse response = newResponse(); + + servlet.doGet(getRequest("value", BLOCK_ID), response); + + assertEquals(200, response.getStatus()); + verify(wallet).getBlockById(eq(BLOCK_ID_BYTES)); + assertEquals("{}", response.getContentAsString().trim()); } } diff --git a/framework/src/test/java/org/tron/core/services/http/GetBlockByNumServletTest.java b/framework/src/test/java/org/tron/core/services/http/GetBlockByNumServletTest.java index b28e1d33308..80c33281ba0 100644 --- a/framework/src/test/java/org/tron/core/services/http/GetBlockByNumServletTest.java +++ b/framework/src/test/java/org/tron/core/services/http/GetBlockByNumServletTest.java @@ -1,10 +1,11 @@ package org.tron.core.services.http; +import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertTrue; import static org.tron.common.utils.client.utils.HttpMethed.createRequest; -import java.io.UnsupportedEncodingException; import javax.annotation.Resource; +import org.apache.http.client.methods.HttpGet; import org.apache.http.client.methods.HttpPost; import org.junit.Test; import org.springframework.mock.web.MockHttpServletRequest; @@ -28,40 +29,30 @@ public class GetBlockByNumServletTest extends BaseTest { } @Test - public void testGetBlockByNum() { - String jsonParam = "{\"number\": 1}"; + public void testGetBlockByNum() throws Exception { + String jsonParam = "{\"num\": 0}"; MockHttpServletRequest request = createRequest(HttpPost.METHOD_NAME); request.setContentType("application/json"); request.setContent(jsonParam.getBytes()); MockHttpServletResponse response = new MockHttpServletResponse(); - try { - getBlockByNumServlet.doPost(request, response); - String contentAsString = response.getContentAsString(); - JSONObject result = JSONObject.parseObject(contentAsString); - assertTrue(result.containsKey("blockID")); - assertTrue(result.containsKey("transactions")); - } catch (UnsupportedEncodingException e) { - e.printStackTrace(); - } + getBlockByNumServlet.doPost(request, response); + String contentAsString = response.getContentAsString(); + JSONObject result = JSONObject.parseObject(contentAsString); + assertTrue(result.containsKey("blockID")); + assertTrue(result.containsKey("transactions")); } @Test - public void testGet() { - String jsonParam = "{\"number\": 1}"; - MockHttpServletRequest request = createRequest("application/json"); - request.setContent(jsonParam.getBytes()); + public void testGetMissingBlockReturnsEmptyObject() throws Exception { + MockHttpServletRequest request = createRequest(HttpGet.METHOD_NAME); + request.addParameter("num", "1"); MockHttpServletResponse response = new MockHttpServletResponse(); - try { - getBlockByNumServlet.doPost(request, response); - String contentAsString = response.getContentAsString(); - JSONObject result = JSONObject.parseObject(contentAsString); - assertTrue(result.containsKey("blockID")); - assertTrue(result.containsKey("transactions")); - } catch (UnsupportedEncodingException e) { - e.printStackTrace(); - } + getBlockByNumServlet.doGet(request, response); + String contentAsString = response.getContentAsString(); + JSONObject result = JSONObject.parseObject(contentAsString); + assertEquals(0, result.size()); } } diff --git a/framework/src/test/java/org/tron/core/services/http/GetEnergyPricesServletTest.java b/framework/src/test/java/org/tron/core/services/http/GetEnergyPricesServletTest.java index f0fe69fe450..28b13a11405 100644 --- a/framework/src/test/java/org/tron/core/services/http/GetEnergyPricesServletTest.java +++ b/framework/src/test/java/org/tron/core/services/http/GetEnergyPricesServletTest.java @@ -31,7 +31,7 @@ public static void init() { public void testGet() { MockHttpServletRequest request = createRequest(HttpGet.METHOD_NAME); MockHttpServletResponse response = new MockHttpServletResponse(); - getEnergyPricesServlet.doPost(request, response); + getEnergyPricesServlet.doGet(request, response); try { String contentAsString = response.getContentAsString(); JSONObject result = JSONObject.parseObject(contentAsString); diff --git a/framework/src/test/java/org/tron/core/services/http/GetMemoFeePricesServletTest.java b/framework/src/test/java/org/tron/core/services/http/GetMemoFeePricesServletTest.java index b9440aa948f..d8e961303ba 100644 --- a/framework/src/test/java/org/tron/core/services/http/GetMemoFeePricesServletTest.java +++ b/framework/src/test/java/org/tron/core/services/http/GetMemoFeePricesServletTest.java @@ -31,7 +31,7 @@ public static void init() { public void testGet() { MockHttpServletRequest request = createRequest(HttpGet.METHOD_NAME); MockHttpServletResponse response = new MockHttpServletResponse(); - getMemoFeePricesServlet.doPost(request, response); + getMemoFeePricesServlet.doGet(request, response); try { String contentAsString = response.getContentAsString(); JSONObject result = JSONObject.parseObject(contentAsString); diff --git a/framework/src/test/java/org/tron/core/services/http/GetTransactionListFromPendingServletTest.java b/framework/src/test/java/org/tron/core/services/http/GetTransactionListFromPendingServletTest.java index 52277992850..ce364a56fdf 100644 --- a/framework/src/test/java/org/tron/core/services/http/GetTransactionListFromPendingServletTest.java +++ b/framework/src/test/java/org/tron/core/services/http/GetTransactionListFromPendingServletTest.java @@ -1,6 +1,7 @@ package org.tron.core.services.http; import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertFalse; import static org.tron.common.utils.client.utils.HttpMethed.createRequest; import javax.annotation.Resource; @@ -12,6 +13,7 @@ import org.tron.common.BaseTest; import org.tron.common.TestConstants; import org.tron.core.config.args.Args; +import org.tron.json.JSONObject; public class GetTransactionListFromPendingServletTest extends BaseTest { @@ -28,11 +30,13 @@ public class GetTransactionListFromPendingServletTest extends BaseTest { } @Test - public void testGet() { + public void testGet() throws Exception { MockHttpServletRequest request = createRequest(HttpGet.METHOD_NAME); MockHttpServletResponse response = new MockHttpServletResponse(); - getTransactionListFromPendingServlet.doPost(request, response); + getTransactionListFromPendingServlet.doGet(request, response); assertEquals(200, response.getStatus()); + JSONObject result = JSONObject.parseObject(response.getContentAsString()); + assertFalse(result.containsKey("Error")); } } diff --git a/framework/src/test/java/org/tron/core/services/http/JsonFormatEscapeTest.java b/framework/src/test/java/org/tron/core/services/http/JsonFormatEscapeTest.java index a5c74cc434d..f8b2ce330f5 100644 --- a/framework/src/test/java/org/tron/core/services/http/JsonFormatEscapeTest.java +++ b/framework/src/test/java/org/tron/core/services/http/JsonFormatEscapeTest.java @@ -194,7 +194,7 @@ public void testNewlineIsEscapedNotRaw() { @Test public void testValidUtf8IsPreserved() { assertEquals("ok", escapeName("ok", URL_FIELD)); - assertEquals("中文", escapeName("中文", URL_FIELD)); + assertEquals("€✓", escapeName("€✓", URL_FIELD)); } @Test @@ -474,7 +474,7 @@ public void testValidUtf8NameStringsRoundTripThroughEscaping() throws Exception "a\nb", "a\"b", "a\\u0041", - "中文", + "€✓", "\uFFFF sentinel", new String(Character.toChars(0x1F600))}) { ByteString original = ByteString.copyFromUtf8(value); diff --git a/framework/src/test/java/org/tron/core/services/http/JsonFormatTest.java b/framework/src/test/java/org/tron/core/services/http/JsonFormatTest.java index 46d1743c5b9..9610efd7506 100644 --- a/framework/src/test/java/org/tron/core/services/http/JsonFormatTest.java +++ b/framework/src/test/java/org/tron/core/services/http/JsonFormatTest.java @@ -40,12 +40,12 @@ public void testPrintErrorMsg() { @Test public void testPrintWithHelloMessage() throws IOException { Protocol.HelloMessage message = Protocol.HelloMessage.newBuilder() - .setAddress(ByteString.copyFrom("address".getBytes())) + .setAddress(ByteString.copyFromUtf8("address")) .build(); StringWriter output = new StringWriter(); JsonFormat.print(message, output, true); - assertNotNull(output.toString()); + assertEquals("{\"address\": \"61646472657373\"}", output.toString()); } private UnknownFieldSet createValidUnknownFieldSet() { @@ -63,19 +63,24 @@ private UnknownFieldSet createValidUnknownFieldSet() { .build(); } + private String expectedUnknownFieldsJson() { + return "{\"1\": [12345678, \"0x0000007b\", \"0x0000000000003039\", " + + "\"6c656e677468\", {}]}"; + } + @Test public void testPrintWithFields() throws IOException { UnknownFieldSet unknownFieldSet = createValidUnknownFieldSet(); StringWriter output = new StringWriter(); JsonFormat.print(unknownFieldSet, output, true); - assertNotNull(output.toString()); + assertEquals(expectedUnknownFieldsJson(), output.toString()); } @Test public void testPrintToString() { UnknownFieldSet unknownFieldSet = createValidUnknownFieldSet(); String output = JsonFormat.printToString(unknownFieldSet, true); - assertNotNull(output); + assertEquals(expectedUnknownFieldsJson(), output); } @Test @@ -85,7 +90,7 @@ public void testUnsignedToString() throws Exception { String out3 = (String)privateMethod.invoke(null, 100); assertEquals("100", out3); String out4 = (String)privateMethod.invoke(null, -100); - assertNotNull(out4); + assertEquals("4294967196", out4); } @Test @@ -109,19 +114,19 @@ public void testUnicodeEscaped() throws Exception { char input1 = 0x09; String out = (String)privateMethod.invoke(null, input1); - assertNotNull(out); + assertEquals("\\u" + "0009", out); char input2 = 0x99; String out2 = (String)privateMethod.invoke(null, input2); - assertNotNull(out2); + assertEquals("\\u0099", out2); char input3 = 0x999; String out3 = (String)privateMethod.invoke(null, input3); - assertNotNull(out3); + assertEquals("\\u0999", out3); char input4 = 0x1001; String out4 = (String)privateMethod.invoke(null, input4); - assertNotNull(out4); + assertEquals("\\u1001", out4); } @Test @@ -129,9 +134,10 @@ public void testEscapeText() throws Exception { Method privateMethod = JsonFormat.class.getDeclaredMethod("escapeText", String.class); privateMethod.setAccessible(true); - String input1 = "\b\f\n\r\t\\\"\\b\\f\\n\\r\\t\\\\\"test123"; + String input1 = "\b\f\n\r\t\\\"" + ((char) 1) + "test123"; String out = (String)privateMethod.invoke(null, input1); - assertNotNull(out); + String expected = "\\b\\f\\n\\r\\t" + "\\\\" + "\\\"" + "\\u0001test123"; + assertEquals(expected, out); } @Test @@ -144,22 +150,22 @@ public void testAppendEscapedUnicode() throws Exception { StringBuilder out1 = new StringBuilder(); privateMethod.invoke(null, out1, input1); - assertNotNull(out1); + assertEquals("\\u" + "0009", out1.toString()); char input2 = 0x99; StringBuilder out2 = new StringBuilder(); privateMethod.invoke(null, out2, input2); - assertNotNull(out2); + assertEquals("\\u0099", out2.toString()); char input3 = 0x999; StringBuilder out3 = new StringBuilder(); privateMethod.invoke(null, out3, input3); - assertNotNull(out3); + assertEquals("\\u0999", out3.toString()); char input4 = 0x1001; StringBuilder out4 = new StringBuilder(); privateMethod.invoke(null, out4, input4); - assertNotNull(out4); + assertEquals("\\u1001", out4.toString()); } @Test @@ -167,9 +173,20 @@ public void testUnescapeText() throws Exception { Method privateMethod = JsonFormat.class.getDeclaredMethod("unescapeText", String.class); privateMethod.setAccessible(true); - String input = "\\u1234\\b\\f\\n\\r\\t\\\\\"test123";; + String input = "\\u1234\\b\\f\\n\\r\\t" + "\\\\" + "\\\"" + "test123"; String out = (String)privateMethod.invoke(null, input); - assertNotNull(out); + String expected = new StringBuilder() + .append((char) 0x1234) + .append('\b') + .append('\f') + .append('\n') + .append('\r') + .append('\t') + .append('\\') + .append('"') + .append("test123") + .toString(); + assertEquals(expected, out); } @Test diff --git a/framework/src/test/java/org/tron/core/services/http/ListNodesServletTest.java b/framework/src/test/java/org/tron/core/services/http/ListNodesServletTest.java index 767d89c6e2f..0c7d0063b9f 100644 --- a/framework/src/test/java/org/tron/core/services/http/ListNodesServletTest.java +++ b/framework/src/test/java/org/tron/core/services/http/ListNodesServletTest.java @@ -1,82 +1,59 @@ package org.tron.core.services.http; -import static java.nio.charset.StandardCharsets.UTF_8; -import static org.junit.Assert.assertNotNull; -import static org.junit.Assert.fail; +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertFalse; +import static org.mockito.Mockito.verify; +import static org.mockito.Mockito.when; -import java.io.UnsupportedEncodingException; -import javax.annotation.Resource; +import com.google.protobuf.ByteString; import org.junit.Test; -import org.springframework.mock.web.MockHttpServletRequest; import org.springframework.mock.web.MockHttpServletResponse; -import org.tron.common.BaseTest; -import org.tron.common.TestConstants; -import org.tron.core.config.args.Args; - -public class ListNodesServletTest extends BaseTest { - - @Resource - private ListNodesServlet listNodesServlet; - - static { - Args.setParam( - new String[]{ - "--output-directory", dbPath(), - }, TestConstants.TEST_CONF - ); - } - - public MockHttpServletRequest createRequest(String contentType) { - MockHttpServletRequest request = new MockHttpServletRequest(); - request.setMethod("POST"); - request.setContentType(contentType); - request.setCharacterEncoding("UTF-8"); - return request; +import org.tron.api.GrpcAPI.Address; +import org.tron.api.GrpcAPI.Node; +import org.tron.api.GrpcAPI.NodeList; +import org.tron.json.JSONArray; +import org.tron.json.JSONObject; + +public class ListNodesServletTest extends BaseHttpTest { + + private ListNodesServlet servlet; + + @Override + protected void setUpMocks() throws Exception { + servlet = new ListNodesServlet(); + injectWallet(servlet); + when(wallet.listNodes()).thenReturn(NodeList.newBuilder() + .addNodes(Node.newBuilder().setAddress(Address.newBuilder() + .setHost(ByteString.copyFromUtf8("127.0.0.1")) + .setPort(18888))) + .build()); } @Test - public void testListNodesByJson() { - String jsonParam = "{\"visible\": true}"; - MockHttpServletRequest request = createRequest("application/json"); - request.setContent(jsonParam.getBytes()); - MockHttpServletResponse response = new MockHttpServletResponse(); - listNodesServlet.doPost(request, response); - try { - String contentAsString = response.getContentAsString(); - assertNotNull(contentAsString); - } catch (UnsupportedEncodingException e) { - fail(e.getMessage()); - } + public void testPostReturnsNodeList() throws Exception { + MockHttpServletResponse response = newResponse(); + + servlet.doPost(postRequest("{}"), response); + + assertEquals(200, response.getStatus()); + verify(wallet).listNodes(); + JSONObject json = JSONObject.parseObject(response.getContentAsString()); + assertFalse(json.containsKey("Error")); + JSONArray nodes = json.getJSONArray("nodes"); + assertEquals(1, nodes.size()); + assertEquals(18888L, ((Number) nodes.getJSONObject(0) + .getJSONObject("address").get("port")).longValue()); } @Test - public void testListNodesValue() { - MockHttpServletRequest request = createRequest("application/x-www-form-urlencoded"); - try { - String params = "visible=true"; - request.setContent(params.getBytes(UTF_8)); - MockHttpServletResponse response = new MockHttpServletResponse(); - listNodesServlet.doPost(request, response); - String contentAsString = response.getContentAsString(); - assertNotNull(contentAsString); - } catch (UnsupportedEncodingException e) { - fail(e.getMessage()); - } - } + public void testGetReturnsEmptyObjectWhenWalletReturnsNull() throws Exception { + when(wallet.listNodes()).thenReturn(null); + MockHttpServletResponse response = newResponse(); - @Test - public void testListNodesEmptyParam() { - MockHttpServletRequest request = createRequest("application/x-www-form-urlencoded"); - String params = "visible="; - request.setContent(params.getBytes(UTF_8)); - MockHttpServletResponse response = new MockHttpServletResponse(); - listNodesServlet.doPost(request, response); - try { - String contentAsString = response.getContentAsString(); - assertNotNull(contentAsString); - } catch (UnsupportedEncodingException e) { - fail(e.getMessage()); - } - } + servlet.doGet(getRequest("visible", "true"), response); + assertEquals(200, response.getStatus()); + verify(wallet).listNodes(); + assertEquals("{}", response.getContentAsString().trim()); + } } diff --git a/framework/src/test/java/org/tron/core/services/http/ListProposalsServletTest.java b/framework/src/test/java/org/tron/core/services/http/ListProposalsServletTest.java index f600f704aa7..b2136597170 100644 --- a/framework/src/test/java/org/tron/core/services/http/ListProposalsServletTest.java +++ b/framework/src/test/java/org/tron/core/services/http/ListProposalsServletTest.java @@ -1,82 +1,54 @@ package org.tron.core.services.http; -import static java.nio.charset.StandardCharsets.UTF_8; -import static org.junit.Assert.fail; +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertFalse; +import static org.mockito.Mockito.verify; +import static org.mockito.Mockito.when; -import java.io.UnsupportedEncodingException; -import javax.annotation.Resource; import org.junit.Test; -import org.springframework.mock.web.MockHttpServletRequest; import org.springframework.mock.web.MockHttpServletResponse; -import org.tron.common.BaseTest; -import org.tron.common.TestConstants; -import org.tron.core.config.args.Args; +import org.tron.api.GrpcAPI.ProposalList; +import org.tron.json.JSONArray; import org.tron.json.JSONObject; +import org.tron.protos.Protocol.Proposal; -public class ListProposalsServletTest extends BaseTest { +public class ListProposalsServletTest extends BaseHttpTest { - @Resource - private ListProposalsServlet listProposalsServlet; + private ListProposalsServlet servlet; - static { - Args.setParam( - new String[]{ - "--output-directory", dbPath(), - }, TestConstants.TEST_CONF - ); - } - - public MockHttpServletRequest createRequest(String contentType) { - MockHttpServletRequest request = new MockHttpServletRequest(); - request.setMethod("POST"); - request.setContentType(contentType); - request.setCharacterEncoding("UTF-8"); - return request; + @Override + protected void setUpMocks() throws Exception { + servlet = new ListProposalsServlet(); + injectWallet(servlet); + when(wallet.getProposalList()).thenReturn(ProposalList.newBuilder() + .addProposals(Proposal.newBuilder().setProposalId(7L)) + .build()); } @Test - public void testListProposalsByJson() { - String jsonParam = "{\"visible\": true}"; - MockHttpServletRequest request = createRequest("application/json"); - request.setContent(jsonParam.getBytes()); - MockHttpServletResponse response = new MockHttpServletResponse(); - listProposalsServlet.doPost(request, response); - try { - String contentAsString = response.getContentAsString(); - JSONObject.parseObject(contentAsString); - } catch (UnsupportedEncodingException e) { - fail(e.getMessage()); - } + public void testPostReturnsProposalList() throws Exception { + MockHttpServletResponse response = newResponse(); + + servlet.doPost(postRequest("{}"), response); + + assertEquals(200, response.getStatus()); + verify(wallet).getProposalList(); + JSONObject json = JSONObject.parseObject(response.getContentAsString()); + assertFalse(json.containsKey("Error")); + JSONArray proposals = json.getJSONArray("proposals"); + assertEquals(1, proposals.size()); + assertEquals(7L, ((Number) proposals.getJSONObject(0).get("proposal_id")).longValue()); } @Test - public void testListProposalsValue() { - MockHttpServletRequest request = createRequest("application/x-www-form-urlencoded"); - try { - String params = "visible=true"; - request.setContent(params.getBytes(UTF_8)); - MockHttpServletResponse response = new MockHttpServletResponse(); - listProposalsServlet.doPost(request, response); - String contentAsString = response.getContentAsString(); - JSONObject.parseObject(contentAsString); - } catch (UnsupportedEncodingException e) { - fail(e.getMessage()); - } - } + public void testGetReturnsEmptyObjectWhenWalletReturnsNull() throws Exception { + when(wallet.getProposalList()).thenReturn(null); + MockHttpServletResponse response = newResponse(); - @Test - public void testListProposalsEmptyParam() { - MockHttpServletRequest request = createRequest("application/x-www-form-urlencoded"); - String params = "visible="; - request.setContent(params.getBytes(UTF_8)); - MockHttpServletResponse response = new MockHttpServletResponse(); - listProposalsServlet.doPost(request, response); - try { - String contentAsString = response.getContentAsString(); - JSONObject.parseObject(contentAsString); - } catch (UnsupportedEncodingException e) { - fail(e.getMessage()); - } - } + servlet.doGet(getRequest("visible", "true"), response); + assertEquals(200, response.getStatus()); + verify(wallet).getProposalList(); + assertEquals("{}", response.getContentAsString().trim()); + } } 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 2a139f8a158..4a0643e6cff 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,15 +1,20 @@ package org.tron.core.services.http; import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertTrue; import static org.mockito.ArgumentMatchers.any; 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.common.crypto.ECKey; import org.tron.common.utils.ByteArray; import org.tron.core.capsule.TransactionCapsule; +import org.tron.json.JSONObject; +import org.tron.protos.contract.SmartContractOuterClass.TriggerSmartContract; public class TriggerConstantContractServletTest extends BaseHttpTest { @@ -44,6 +49,18 @@ public void testManyFlatFieldsDoesNotOverflowStack() throws Exception { servlet.doPost(postRequest(body.toString()), response); assertEquals(200, response.getStatus()); - verify(wallet).triggerConstantContract(any(), any(), any(), any()); + ArgumentCaptor triggerCaptor = + ArgumentCaptor.forClass(TriggerSmartContract.class); + verify(wallet).triggerConstantContract(triggerCaptor.capture(), any(), any(), any()); + TriggerSmartContract trigger = triggerCaptor.getValue(); + assertEquals(ByteString.copyFrom(ByteArray.fromHexString(owner)), trigger.getOwnerAddress()); + assertEquals(ByteString.copyFrom(ByteArray.fromHexString(contract)), + trigger.getContractAddress()); + assertEquals(ByteString.copyFrom(new byte[]{0}), trigger.getData()); + + JSONObject json = JSONObject.parseObject(response.getContentAsString()); + assertEquals(Boolean.TRUE, json.getJSONObject("result").get("result")); + assertTrue(json.containsKey("transaction")); + assertTrue(json.getJSONObject("transaction").containsKey("txID")); } } diff --git a/framework/src/test/java/org/tron/core/services/http/TriggerSmartContractServletTest.java b/framework/src/test/java/org/tron/core/services/http/TriggerSmartContractServletTest.java index bae9523401b..a72a7565168 100644 --- a/framework/src/test/java/org/tron/core/services/http/TriggerSmartContractServletTest.java +++ b/framework/src/test/java/org/tron/core/services/http/TriggerSmartContractServletTest.java @@ -1,88 +1,89 @@ package org.tron.core.services.http; -import com.google.gson.JsonObject; -import lombok.extern.slf4j.Slf4j; -import org.apache.http.HttpResponse; -import org.bouncycastle.util.encoders.Hex; -import org.junit.Assert; -import org.junit.Before; -import org.junit.BeforeClass; +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.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.tron.common.BaseTest; -import org.tron.common.TestConstants; +import org.mockito.ArgumentCaptor; +import org.springframework.mock.web.MockHttpServletResponse; +import org.tron.common.crypto.ECKey; import org.tron.common.utils.ByteArray; -import org.tron.common.utils.PublicMethod; -import org.tron.common.utils.client.utils.HttpMethed; -import org.tron.core.capsule.ContractCapsule; -import org.tron.core.config.args.Args; -import org.tron.core.store.StoreFactory; -import org.tron.core.vm.repository.Repository; -import org.tron.core.vm.repository.RepositoryImpl; -import org.tron.protos.Protocol; -import org.tron.protos.contract.SmartContractOuterClass; +import org.tron.core.capsule.TransactionCapsule; +import org.tron.json.JSONObject; +import org.tron.protos.Protocol.Transaction; +import org.tron.protos.contract.SmartContractOuterClass.TriggerSmartContract; + +public class TriggerSmartContractServletTest extends BaseHttpTest { -@Slf4j -public class TriggerSmartContractServletTest extends BaseTest { - private static String httpNode; - private static final byte[] ownerAddr = Hex.decode("410000000000000000000000000000000000000000"); - private static final byte[] contractAddr = Hex.decode( - "41000000000000000000000000000000000000dEaD"); + private final byte[] ownerAddress = new ECKey().getAddress(); + private final byte[] contractAddress = new ECKey().getAddress(); + private TriggerSmartContractServlet servlet; - @BeforeClass - public static void init() throws Exception { - Args.setParam( - new String[]{"--output-directory", dbPath(), "--debug"}, TestConstants.TEST_CONF); - Args.getInstance().needSyncCheck = false; - Args.getInstance().setFullNodeHttpEnable(true); - Args.getInstance().setFullNodeHttpPort(PublicMethod.chooseRandomPort()); - Args.getInstance().setP2pDisable(true); - httpNode = String.format("%s:%d", "127.0.0.1", - Args.getInstance().getFullNodeHttpPort()); + @Override + protected void setUpMocks() throws Exception { + servlet = new TriggerSmartContractServlet(); + injectWallet(servlet); + when(wallet.createTransactionCapsule(any(), any())) + .thenReturn(new TransactionCapsule(MINIMAL_TX)); + when(wallet.triggerContract(any(), any(), any(), any())) + .thenAnswer(invocation -> ((TransactionCapsule) invocation.getArgument(1)).getInstance()); } - @Before - public void before() { - // start services - appT.startup(); + @Test + public void testPostBuildsTriggerAndReturnsSuccessfulTransaction() throws Exception { + String body = "{\"owner_address\":\"" + ByteArray.toHexString(ownerAddress) + + "\",\"contract_address\":\"" + ByteArray.toHexString(contractAddress) + + "\",\"function_selector\":\"test()\",\"fee_limit\":123}"; + MockHttpServletResponse response = newResponse(); - // create contract for testing - Repository rootRepository = RepositoryImpl.createRoot(StoreFactory.getInstance()); - rootRepository.createAccount(contractAddr, Protocol.AccountType.Contract); - rootRepository.createContract(contractAddr, new ContractCapsule( - SmartContractOuterClass.SmartContract.newBuilder().build())); - rootRepository.saveCode(contractAddr, Hex.decode( - "608060405260043610601c5760003560e01c8063f8a8fd6d146021575b600080fd5b60276029565b00" - + "5b3373ffffffffffffffffffffffffffffffffffffffff166108fc34908115029060405160006040518" - + "0830381858888f19350505050158015606e573d6000803e3d6000fd5b5056fea2646970667358221220" - + "45fe2c565cf16b27bb8cbafbe251a850a0bb5cd8806a186dbda12d57685ced6f64736f6c63430008120" - + "033")); - rootRepository.commit(); - } + servlet.doPost(postRequest(body), response); + assertEquals(200, response.getStatus()); + ArgumentCaptor triggerCaptor = + ArgumentCaptor.forClass(TriggerSmartContract.class); + verify(wallet).createTransactionCapsule(triggerCaptor.capture(), + eq(org.tron.protos.Protocol.Transaction.Contract.ContractType.TriggerSmartContract)); + TriggerSmartContract trigger = triggerCaptor.getValue(); + assertEquals(ByteString.copyFrom(ownerAddress), trigger.getOwnerAddress()); + assertEquals(ByteString.copyFrom(contractAddress), trigger.getContractAddress()); + assertEquals(4, trigger.getData().size()); - @Test - public void testNormalCall() { - HttpMethed.waitToProduceOneBlock(httpNode); - JsonObject parameter = new JsonObject(); - parameter.addProperty("owner_address", ByteArray.toHexString(ownerAddr)); - parameter.addProperty("contract_address", ByteArray.toHexString(contractAddr)); - parameter.addProperty("function_selector", "test()"); - HttpResponse triggersmartcontract1 = invokeToLocal("triggersmartcontract", parameter); - HttpResponse triggersmartcontract2 = invokeToLocal("triggerconstantcontract", parameter); - HttpResponse triggersmartcontract3 = invokeToLocal("estimateenergy", parameter); - Assert.assertNotNull(triggersmartcontract1); - Assert.assertNotNull(triggersmartcontract2); - Assert.assertNotNull(triggersmartcontract3); + JSONObject json = JSONObject.parseObject(response.getContentAsString()); + JSONObject result = json.getJSONObject("result"); + assertEquals(Boolean.TRUE, result.get("result")); + assertTrue(json.containsKey("transaction")); + assertTrue(json.getJSONObject("transaction").containsKey("txID")); + Number feeLimit = (Number) json.getJSONObject("transaction") + .getJSONObject("raw_data").get("fee_limit"); + assertEquals(123L, feeLimit.longValue()); } - public static HttpResponse invokeToLocal( - String method, JsonObject parameter) { - try { - final String requestUrl = "http://" + httpNode + "/wallet/" + method; - return HttpMethed.createConnect(requestUrl, parameter); - } catch (Exception e) { - e.printStackTrace(); - return null; - } + @Test + public void testMissingOwnerReturnsBusinessErrorWithoutCallingWallet() throws Exception { + String body = "{\"contract_address\":\"" + ByteArray.toHexString(contractAddress) + "\"}"; + MockHttpServletResponse response = newResponse(); + + servlet.doPost(postRequest(body), response); + + assertEquals(200, response.getStatus()); + JSONObject result = JSONObject.parseObject(response.getContentAsString()) + .getJSONObject("result"); + // Protobuf JSON omits scalar fields that hold their default value. A failed Return therefore + // has no "result" member rather than serializing it as false. + assertFalse(result.containsKey("result")); + assertEquals("OTHER_ERROR", result.getString("code")); + String errorMessage = ByteString.copyFrom( + ByteArray.fromHexString(result.getString("message"))).toStringUtf8(); + assertEquals( + "class java.security.InvalidParameterException : owner_address isn't set.", errorMessage); + verify(wallet, never()).createTransactionCapsule(any(), any()); + verify(wallet, never()).triggerContract(any(), any(), any(), any()); } } diff --git a/framework/src/test/java/org/tron/core/services/http/UpdateAccountServletTest.java b/framework/src/test/java/org/tron/core/services/http/UpdateAccountServletTest.java index 4d60a39d0b8..6cc6ff19116 100644 --- a/framework/src/test/java/org/tron/core/services/http/UpdateAccountServletTest.java +++ b/framework/src/test/java/org/tron/core/services/http/UpdateAccountServletTest.java @@ -1,16 +1,23 @@ package org.tron.core.services.http; +import static java.nio.charset.StandardCharsets.UTF_8; import static org.tron.common.utils.client.utils.HttpMethed.createRequest; +import com.google.protobuf.ByteString; import javax.annotation.Resource; import org.apache.http.client.methods.HttpPost; import org.junit.Assert; +import org.junit.Before; import org.junit.Test; import org.springframework.mock.web.MockHttpServletRequest; import org.springframework.mock.web.MockHttpServletResponse; import org.tron.common.BaseTest; import org.tron.common.TestConstants; +import org.tron.common.utils.ByteArray; +import org.tron.core.capsule.AccountCapsule; import org.tron.core.config.args.Args; +import org.tron.json.JSONObject; +import org.tron.protos.Protocol; public class UpdateAccountServletTest extends BaseTest { @@ -24,54 +31,38 @@ public class UpdateAccountServletTest extends BaseTest { @Resource private UpdateAccountServlet updateAccountServlet; - + + private static final String OWNER_ADDRESS = + "4199357684BC659F5166046B56C95A0E99F1265CD1"; + + @Before + public void init() { + ByteString ownerAddress = ByteString.copyFrom(ByteArray.fromHexString(OWNER_ADDRESS)); + AccountCapsule accountCapsule = new AccountCapsule( + Protocol.Account.newBuilder().setAddress(ownerAddress).build()); + chainBaseManager.getAccountStore().put(ownerAddress.toByteArray(), accountCapsule); + } + private String getParam() { return "{" - + " \"owner_address\": \"TXmVpin5vq5gdZsciyyjdZgKRUju4st1wM\"," - + " \"owner\": {" - + " \"type\": 0," - + " \"permission_name\": \"owner\"," - + " \"threshold\": 1," - + " \"keys\": [{" - + " \"address\": \"TXmVpin5vq5gdZsciyyjdZgKRUju4st1wM\"," - + " \"weight\": 1" - + " }]" - + " }," - + " \"witness\": {" - + " \"type\": 1," - + " \"permission_name\": \"witness\"," - + " \"threshold\": 1," - + " \"keys\": [{" - + " \"address\": \"TXmVpin5vq5gdZsciyyjdZgKRUju4st1wM\"," - + " \"weight\": 1" - + " }]" - + " }," - + " \"actives\": [{" - + " \"type\": 2," - + " \"permission_name\": \"active12323\"," - + " \"threshold\": 2," - + " \"operations\": " - + "\"7fff1fc0033e0000000000000000000000000000000000000000000000000000\"," - + " \"keys\": [{" - + " \"address\": \"TXmVpin5vq5gdZsciyyjdZgKRUju4st1wM\"," - + " \"weight\": 1" - + " }, {" - + " \"address\": \"TXmVpin5vq5gdZsciyyjdZgKRUju4st1wM\"," - + " \"weight\": 1" - + " }]" - + " }]," - + " \"visible\": true}"; + + "\"owner_address\": \"" + OWNER_ADDRESS + "\"," + + "\"account_name\": \"757064617465642d6e616d65\"" + + "}"; } @Test - public void test() { + public void testUpdateAccount() throws Exception { String jsonParam = getParam(); MockHttpServletRequest request = createRequest(HttpPost.METHOD_NAME); request.setContentType("application/json"); - request.setContent(jsonParam.getBytes()); + request.setContent(jsonParam.getBytes(UTF_8)); MockHttpServletResponse response = new MockHttpServletResponse(); updateAccountServlet.doPost(request, response); Assert.assertEquals(200, response.getStatus()); + JSONObject result = JSONObject.parseObject(response.getContentAsString()); + Assert.assertFalse(result.containsKey("Error")); + Assert.assertTrue(result.containsKey("raw_data")); + Assert.assertTrue(result.containsKey("txID")); } } diff --git a/framework/src/test/java/org/tron/core/services/http/UtilMockTest.java b/framework/src/test/java/org/tron/core/services/http/UtilMockTest.java index d4124c90adf..a5dbb640fa8 100644 --- a/framework/src/test/java/org/tron/core/services/http/UtilMockTest.java +++ b/framework/src/test/java/org/tron/core/services/http/UtilMockTest.java @@ -4,14 +4,12 @@ import com.google.protobuf.Descriptors; import java.security.InvalidParameterException; import java.util.ArrayList; +import java.util.Arrays; import java.util.HashMap; import java.util.List; import java.util.Map; -import org.apache.commons.lang3.StringUtils; -import org.junit.After; import org.junit.Assert; import org.junit.Test; -import org.mockito.Mockito; import org.tron.api.GrpcAPI; import org.tron.common.utils.Sha256Hash; import org.tron.core.capsule.BlockCapsule; @@ -23,23 +21,21 @@ import org.tron.protos.contract.BalanceContract; import org.tron.protos.contract.SmartContractOuterClass; -public class UtilMockTest { - @After - public void clearMocks() { - Mockito.framework().clearInlineMocks(); - } - - +public class UtilMockTest { @Test public void testPrintTransactionFee() { Protocol.ResourceReceipt resourceReceipt = Protocol.ResourceReceipt.newBuilder() + .setEnergyUsage(7L) .build(); Protocol.TransactionInfo result = Protocol.TransactionInfo.newBuilder() .setReceipt(resourceReceipt) .build(); String transactionFee = JsonFormat.printToString(result, true); String out = Util.printTransactionFee(transactionFee); - Assert.assertNotNull(out); + JSONObject json = JSONObject.parseObject(out); + Assert.assertTrue(json.containsKey("Receipt")); + Assert.assertEquals(7L, + ((Number) json.getJSONObject("Receipt").get("energy_usage")).longValue()); } @Test @@ -205,7 +201,10 @@ public void testPrintTransactionList() { .addTransaction(transactionCapsule.getInstance()) .build(); String out = Util.printTransactionList(list, true); - Assert.assertNotNull(out); + JSONArray transactions = JSONObject.parseObject(out).getJSONArray("transaction"); + Assert.assertEquals(1, transactions.size()); + Assert.assertTrue(transactions.getJSONObject(0).containsKey("txID")); + Assert.assertTrue(transactions.getJSONObject(0).containsKey("raw_data")); } private TransactionCapsule getTransactionCapsuleExample() { @@ -234,7 +233,10 @@ public void testPrintTransactionSignWeight() { .build(); String out = Util.printTransactionSignWeight(txSignWeight, true); - Assert.assertNotNull(out); + JSONObject transaction = JSONObject.parseObject(out) + .getJSONObject("transaction").getJSONObject("transaction"); + Assert.assertTrue(transaction.containsKey("txID")); + Assert.assertTrue(transaction.containsKey("raw_data")); } @Test @@ -250,7 +252,10 @@ public void testPrintTransactionApprovedList() { .build(); String out = Util.printTransactionApprovedList( transactionApprovedList, true); - Assert.assertNotNull(out); + JSONObject transaction = JSONObject.parseObject(out) + .getJSONObject("transaction").getJSONObject("transaction"); + Assert.assertTrue(transaction.containsKey("txID")); + Assert.assertTrue(transaction.containsKey("raw_data")); } @Test @@ -258,8 +263,11 @@ public void testGenerateContractAddress() { final String OWNER_ADDRESS = "41548794500882809695a8a687866e76d4271a1abc"; TransactionCapsule transactionCapsule = getTransactionCapsuleExample(); byte[] out = Util.generateContractAddress( - transactionCapsule.getInstance(), OWNER_ADDRESS.getBytes()); - Assert.assertNotNull(out); + transactionCapsule.getInstance(), ByteArray.fromHexString(OWNER_ADDRESS)); + Assert.assertEquals(21, out.length); + Assert.assertEquals(0x41, out[0] & 0xff); + Assert.assertArrayEquals(out, Util.generateContractAddress( + transactionCapsule.getInstance(), ByteArray.fromHexString(OWNER_ADDRESS))); } @Test @@ -274,7 +282,11 @@ public void testPrintTransactionToJSON() { JSONObject out = Util.printTransactionToJSON( transactionCapsule.getInstance(), true); - Assert.assertNotNull(out); + Assert.assertTrue(out.containsKey("txID")); + Assert.assertTrue(out.containsKey("raw_data")); + String contractAddress = out.getString("contract_address"); + Assert.assertEquals(42, contractAddress.length()); + Assert.assertTrue(contractAddress.startsWith("41")); } @Test @@ -286,7 +298,8 @@ public void testGetContractType() { @Test public void testGetHexAddress() { String out = Util.getHexAddress("TBxSocpujP6UGKV5ydXNVTDQz7fAgdmoaB"); - Assert.assertNotNull(out); + Assert.assertEquals(42, out.length()); + Assert.assertTrue(out.startsWith("41")); Assert.assertNull(Util.getHexAddress(null)); } @@ -296,7 +309,7 @@ public void testSetTransactionPermissionId() { TransactionCapsule transactionCapsule = getTransactionCapsuleExample(); Protocol.Transaction out = Util.setTransactionPermissionId( 123, transactionCapsule.getInstance()); - Assert.assertNotNull(out); + Assert.assertEquals(123, out.getRawData().getContract(0).getPermissionId()); } @Test @@ -305,20 +318,21 @@ public void testSetTransactionExtraData() { JSONObject jsonObject = JSONObject.parseObject("{\"extra_data\":\"test\"}"); Protocol.Transaction out = Util.setTransactionExtraData(jsonObject, transactionCapsule.getInstance(), true); - Assert.assertNotNull(out); + Assert.assertEquals(ByteString.copyFromUtf8("test"), out.getRawData().getData()); } @Test public void testConvertOutput() { Protocol.Account account = Protocol.Account.newBuilder().build(); String out = Util.convertOutput(account); - Assert.assertNotNull(out); + Assert.assertEquals("{}", out); account = Protocol.Account.newBuilder() - .setAssetIssuedID(ByteString.copyFrom("asset_issued_ID".getBytes())) + .setAssetIssuedID(ByteString.copyFromUtf8("asset_issued_ID")) .build(); out = Util.convertOutput(account); - Assert.assertNotNull(out); + Assert.assertEquals("asset_issued_ID", + JSONObject.parseObject(out).getString("asset_issued_ID")); } @Test @@ -334,47 +348,53 @@ public void testConvertLogAddressToTronAddress() { .addAllLog(logs); List logList = Util.convertLogAddressToTronAddress(builder.build()); - Assert.assertNotNull(logList.size() > 0); + Assert.assertEquals(1, logList.size()); + Protocol.TransactionInfo.Log converted = logList.get(0); + Assert.assertEquals(ByteString.copyFromUtf8("data"), converted.getData()); + Assert.assertEquals(ByteString.copyFromUtf8("topic"), converted.getTopics(0)); + byte[] convertedAddress = converted.getAddress().toByteArray(); + Assert.assertEquals(21, convertedAddress.length); + Assert.assertEquals(0x41, convertedAddress[0] & 0xff); + Assert.assertArrayEquals("address".getBytes(), + Arrays.copyOfRange(convertedAddress, convertedAddress.length - "address".length(), + convertedAddress.length)); } @Test public void testValidateParameter() { String contract = "{\"address\":\"owner_address\"}"; - Assert.assertThrows( + InvalidParameterException missingOwner = Assert.assertThrows( InvalidParameterException.class, - () -> { - Util.validateParameter(contract); - } - ); + () -> Util.validateParameter(contract)); + Assert.assertEquals("owner_address isn't set.", missingOwner.getMessage()); String contract1 = "{\"owner_address\":\"owner_address\"," + " \"contract_address1\":\"contract_address\", \"data1\":\"data\"}"; - Assert.assertThrows( + InvalidParameterException missingTarget = Assert.assertThrows( InvalidParameterException.class, - () -> { - Util.validateParameter(contract1); - } - ); + () -> Util.validateParameter(contract1)); + Assert.assertEquals( + "At least one of contract_address and data must be set.", missingTarget.getMessage()); String contract2 = "{\"owner_address\":\"owner_address\", " + "\"function_selector\":\"function_selector\", \"data\":\"data\"}"; - Assert.assertThrows( + InvalidParameterException conflictingDeployInput = Assert.assertThrows( InvalidParameterException.class, - () -> { - Util.validateParameter(contract2); - } - ); + () -> Util.validateParameter(contract2)); + Assert.assertEquals( + "While trying to deploy, function_selector and data can not be both set.", + conflictingDeployInput.getMessage()); } @Test public void testGetJsonString() { String str = ""; String ret = Util.getJsonString(str); - Assert.assertTrue(StringUtils.isEmpty(ret)); + Assert.assertEquals("", ret); String str1 = "{\"owner_address\":\"owner_address\"}"; String ret1 = Util.getJsonString(str1); - Assert.assertTrue(str1.equals(ret1)); + Assert.assertEquals(str1, ret1); String str2 = "owner_address=owner_address&contract_address=contract_address"; String ret2 = Util.getJsonString(str2); diff --git a/framework/src/test/java/org/tron/core/services/http/solidity/GetTransactionByIdSolidityServletTest.java b/framework/src/test/java/org/tron/core/services/http/solidity/GetTransactionByIdSolidityServletTest.java index e1abb41d1e1..6f2a79be7b7 100644 --- a/framework/src/test/java/org/tron/core/services/http/solidity/GetTransactionByIdSolidityServletTest.java +++ b/framework/src/test/java/org/tron/core/services/http/solidity/GetTransactionByIdSolidityServletTest.java @@ -1,202 +1,58 @@ package org.tron.core.services.http.solidity; -import static org.mockito.BDDMockito.given; -import static org.mockito.Mockito.mock; +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.ArgumentMatchers.eq; +import static org.mockito.Mockito.verify; import static org.mockito.Mockito.when; -import java.io.BufferedReader; -import java.io.ByteArrayInputStream; -import java.io.ByteArrayOutputStream; -import java.io.File; -import java.io.FileInputStream; -import java.io.IOException; -import java.io.InputStreamReader; -import java.io.OutputStreamWriter; -import java.io.PrintStream; -import java.io.PrintWriter; -import java.net.HttpURLConnection; -import java.net.URL; -import java.net.URLStreamHandlerFactory; -import java.nio.charset.StandardCharsets; -import javax.servlet.http.HttpServletRequest; -import javax.servlet.http.HttpServletResponse; -import lombok.extern.slf4j.Slf4j; -import org.junit.After; -import org.junit.Assert; -import org.junit.Before; -import org.junit.BeforeClass; +import com.google.protobuf.ByteString; import org.junit.Test; -import org.tron.common.utils.FileUtil; -import org.tron.common.utils.PublicMethod; -import org.tron.core.services.http.solidity.mockito.HttpUrlStreamHandler; +import org.springframework.mock.web.MockHttpServletResponse; +import org.tron.common.utils.ByteArray; +import org.tron.core.services.http.BaseHttpTest; +public class GetTransactionByIdSolidityServletTest extends BaseHttpTest { -@Slf4j -public class GetTransactionByIdSolidityServletTest { + private static final String TX_ID = + "309b6fa3d01353e46f57dd8a8f27611f98e392b50d035cef213f2c55225a8bd2"; + private static final ByteString TX_ID_BYTES = + ByteString.copyFrom(ByteArray.fromHexString(TX_ID)); - private static HttpUrlStreamHandler httpUrlStreamHandler; - private GetTransactionByIdSolidityServlet getTransactionByIdSolidityServlet; - private HttpServletRequest request; - private HttpServletResponse response; - private HttpURLConnection httpUrlConnection; - private OutputStreamWriter outputStreamWriter; - private URL url; + private GetTransactionByIdSolidityServlet servlet; - /** - * . - */ - @BeforeClass - public static void init() { - // Allows for mocking URL connections - URLStreamHandlerFactory urlStreamHandlerFactory = mock(URLStreamHandlerFactory.class); - try { - URL.setURLStreamHandlerFactory(urlStreamHandlerFactory); - } catch (Error e) { - logger.info("Ignore error: {}", e.getMessage()); - } - - httpUrlStreamHandler = new HttpUrlStreamHandler(); - given(urlStreamHandlerFactory.createURLStreamHandler("http")).willReturn(httpUrlStreamHandler); - } - - /** - * Init. - */ - - @Before - public void setUp() { - getTransactionByIdSolidityServlet = new GetTransactionByIdSolidityServlet(); - this.request = mock(HttpServletRequest.class); - this.response = mock(HttpServletResponse.class); - this.httpUrlConnection = mock(HttpURLConnection.class); - this.outputStreamWriter = mock(OutputStreamWriter.class); - httpUrlStreamHandler.resetConnections(); - } - - /** - * Release Resource. - */ - @After - public void tearDown() { - if (FileUtil.deleteDir(new File("temp.txt"))) { - logger.info("Release resources successful."); - } else { - logger.info("Release resources failure."); - } + @Override + protected void setUpMocks() throws Exception { + servlet = new GetTransactionByIdSolidityServlet(); + injectWallet(servlet); + when(wallet.getTransactionById(any())).thenReturn(MINIMAL_TX); } @Test - public void doPostTest() throws IOException { - - //send Post request - - final ByteArrayOutputStream outContent = new ByteArrayOutputStream(); - System.setOut(new PrintStream(outContent)); - String href = "http://127.0.0.1:" - + PublicMethod.chooseRandomPort() + "/walletsolidity/gettransactioninfobyid"; - httpUrlStreamHandler.addConnection(new URL(href), httpUrlConnection); - httpUrlConnection.setRequestMethod("POST"); - httpUrlConnection.setRequestProperty("Content-Type", "application/json"); - httpUrlConnection.setRequestProperty("Connection", "Keep-Alive"); - httpUrlConnection.setUseCaches(false); - httpUrlConnection.setDoOutput(true); - String postData = "{\"value\": \"309b6fa3d01353e46f57dd8a8f27611f98e392b50d035cef21" - + "3f2c55225a8bd2\"}"; - httpUrlConnection.setRequestProperty("Content-Length", String.valueOf(postData.length())); + public void testPostReturnsTransaction() throws Exception { + MockHttpServletResponse response = newResponse(); - when(httpUrlConnection.getOutputStream()).thenReturn(outContent); - OutputStreamWriter out = new OutputStreamWriter(httpUrlConnection.getOutputStream(), - StandardCharsets.UTF_8); - out.write(postData); - out.flush(); - out.close(); - PrintWriter writer = new PrintWriter("temp.txt"); - when(response.getWriter()).thenReturn(writer); + servlet.doPost(postRequest("{\"value\":\"" + TX_ID + "\"}"), response); - getTransactionByIdSolidityServlet.doPost(request, response); - // Get Response Body - String line; - StringBuilder result = new StringBuilder(); - - byte[] buffer = new byte[1024]; - ByteArrayInputStream byteArrayInputStream = new ByteArrayInputStream(buffer); - when(httpUrlConnection.getInputStream()).thenReturn(byteArrayInputStream); - BufferedReader in = new BufferedReader(new InputStreamReader(httpUrlConnection.getInputStream(), - StandardCharsets.UTF_8)); - - while ((line = in.readLine()) != null) { - result.append(line).append("\n"); - } - Assert.assertNotNull(result); - in.close(); - writer.flush(); - FileInputStream fileInputStream = new FileInputStream("temp.txt"); - InputStreamReader inputStreamReader = new InputStreamReader(fileInputStream); - BufferedReader bufferedReader = new BufferedReader(inputStreamReader); - - StringBuilder sb = new StringBuilder(); - String text; - while ((text = bufferedReader.readLine()) != null) { - sb.append(text); - } - Assert.assertTrue(sb.toString().contains("null")); - httpUrlConnection.disconnect(); + assertEquals(200, response.getStatus()); + verify(wallet).getTransactionById(eq(TX_ID_BYTES)); + String content = response.getContentAsString(); + assertFalse(content.contains("\"Error\"")); + assertTrue(content.contains("\"txID\"")); + assertTrue(content.contains("\"raw_data\"")); } @Test - public void doGetTest() throws IOException { - - final ByteArrayOutputStream outContent = new ByteArrayOutputStream(); - System.setOut(new PrintStream(outContent)); - String href = "http://127.0.0.1:" - + PublicMethod.chooseRandomPort() + "/walletsolidity/gettransactioninfobyid"; - httpUrlStreamHandler.addConnection(new URL(href), httpUrlConnection); - httpUrlConnection.setRequestMethod("GET"); - httpUrlConnection.setRequestProperty("Content-Type", "application/json"); - httpUrlConnection.setRequestProperty("Connection", "Keep-Alive"); - httpUrlConnection.setUseCaches(false); - httpUrlConnection.setDoOutput(true); - String postData = "{\"value\": \"309b6fa3d01353e46f57dd8a8f27611f98e392b50d035cef21" - + "3f2c55225a8bd2\"}"; - httpUrlConnection.setRequestProperty("Content-Length", String.valueOf(postData.length())); + public void testGetReturnsEmptyObjectWhenTransactionIsNotFound() throws Exception { + when(wallet.getTransactionById(eq(TX_ID_BYTES))).thenReturn(null); + MockHttpServletResponse response = newResponse(); - when(httpUrlConnection.getOutputStream()).thenReturn(outContent); - OutputStreamWriter out = new OutputStreamWriter(httpUrlConnection.getOutputStream(), - StandardCharsets.UTF_8); - out.write(postData); - out.flush(); - out.close(); - PrintWriter writer = new PrintWriter("temp.txt"); - when(response.getWriter()).thenReturn(writer); + servlet.doGet(getRequest("value", TX_ID), response); - getTransactionByIdSolidityServlet.doPost(request, response); - // Get Response Body - String line; - StringBuilder result = new StringBuilder(); - - byte[] buffer = new byte[1024]; - ByteArrayInputStream byteArrayInputStream = new ByteArrayInputStream(buffer); - when(httpUrlConnection.getInputStream()).thenReturn(byteArrayInputStream); - BufferedReader in = new BufferedReader(new InputStreamReader(httpUrlConnection.getInputStream(), - StandardCharsets.UTF_8)); - - while ((line = in.readLine()) != null) { - result.append(line).append("\n"); - } - Assert.assertNotNull(result); - in.close(); - writer.flush(); - FileInputStream fileInputStream = new FileInputStream("temp.txt"); - InputStreamReader inputStreamReader = new InputStreamReader(fileInputStream); - BufferedReader bufferedReader = new BufferedReader(inputStreamReader); - - StringBuilder sb = new StringBuilder(); - String text; - while ((text = bufferedReader.readLine()) != null) { - sb.append(text); - } - Assert.assertTrue(sb.toString().contains("null")); - httpUrlConnection.disconnect(); + assertEquals(200, response.getStatus()); + verify(wallet).getTransactionById(eq(TX_ID_BYTES)); + assertEquals("{}", response.getContentAsString().trim()); } } - diff --git a/framework/src/test/java/org/tron/core/services/http/solidity/mockito/HttpUrlStreamHandler.java b/framework/src/test/java/org/tron/core/services/http/solidity/mockito/HttpUrlStreamHandler.java deleted file mode 100644 index f21987a58d8..00000000000 --- a/framework/src/test/java/org/tron/core/services/http/solidity/mockito/HttpUrlStreamHandler.java +++ /dev/null @@ -1,30 +0,0 @@ -package org.tron.core.services.http.solidity.mockito; - -import java.io.IOException; -import java.net.URL; -import java.net.URLConnection; -import java.net.URLStreamHandler; -import java.util.HashMap; -import java.util.Map; - -/** - * . - */ -public class HttpUrlStreamHandler extends URLStreamHandler { - - private Map connections = new HashMap(); - - @Override - protected URLConnection openConnection(URL url) throws IOException { - return connections.get(url); - } - - public void resetConnections() { - connections = new HashMap(); - } - - public HttpUrlStreamHandler addConnection(URL url, URLConnection urlConnection) { - connections.put(url, urlConnection); - return this; - } -} \ No newline at end of file diff --git a/framework/src/test/java/org/tron/core/services/interfaceOnPBFT/http/GetBandwidthPricesOnPBFTServletTest.java b/framework/src/test/java/org/tron/core/services/interfaceOnPBFT/http/GetBandwidthPricesOnPBFTServletTest.java index b37a792bc45..bcfb1ba1383 100644 --- a/framework/src/test/java/org/tron/core/services/interfaceOnPBFT/http/GetBandwidthPricesOnPBFTServletTest.java +++ b/framework/src/test/java/org/tron/core/services/interfaceOnPBFT/http/GetBandwidthPricesOnPBFTServletTest.java @@ -31,7 +31,7 @@ public static void init() { public void testGet() { MockHttpServletRequest request = createRequest(HttpGet.METHOD_NAME); MockHttpServletResponse response = new MockHttpServletResponse(); - getBandwidthPricesOnPBFTServlet.doPost(request, response); + getBandwidthPricesOnPBFTServlet.doGet(request, response); try { String contentAsString = response.getContentAsString(); JSONObject result = JSONObject.parseObject(contentAsString); diff --git a/framework/src/test/java/org/tron/core/services/interfaceOnPBFT/http/GetEnergyPricesOnPBFTServletTest.java b/framework/src/test/java/org/tron/core/services/interfaceOnPBFT/http/GetEnergyPricesOnPBFTServletTest.java index 71d7e7e4b0b..2a103e99d4c 100644 --- a/framework/src/test/java/org/tron/core/services/interfaceOnPBFT/http/GetEnergyPricesOnPBFTServletTest.java +++ b/framework/src/test/java/org/tron/core/services/interfaceOnPBFT/http/GetEnergyPricesOnPBFTServletTest.java @@ -31,7 +31,7 @@ public static void init() { public void testGet() { MockHttpServletRequest request = createRequest(HttpGet.METHOD_NAME); MockHttpServletResponse response = new MockHttpServletResponse(); - getEnergyPricesOnPBFTServlet.doPost(request, response); + getEnergyPricesOnPBFTServlet.doGet(request, response); try { String contentAsString = response.getContentAsString(); JSONObject result = JSONObject.parseObject(contentAsString); diff --git a/framework/src/test/java/org/tron/core/services/interfaceOnSolidity/http/GetBandwidthPricesOnSolidityServletTest.java b/framework/src/test/java/org/tron/core/services/interfaceOnSolidity/http/GetBandwidthPricesOnSolidityServletTest.java index 890528b72e4..14b14f24552 100644 --- a/framework/src/test/java/org/tron/core/services/interfaceOnSolidity/http/GetBandwidthPricesOnSolidityServletTest.java +++ b/framework/src/test/java/org/tron/core/services/interfaceOnSolidity/http/GetBandwidthPricesOnSolidityServletTest.java @@ -31,7 +31,7 @@ public static void init() { public void testGet() { MockHttpServletRequest request = createRequest(HttpGet.METHOD_NAME); MockHttpServletResponse response = new MockHttpServletResponse(); - getBandwidthPricesOnSolidityServlet.doPost(request, response); + getBandwidthPricesOnSolidityServlet.doGet(request, response); try { String contentAsString = response.getContentAsString(); JSONObject result = JSONObject.parseObject(contentAsString); diff --git a/framework/src/test/java/org/tron/core/services/interfaceOnSolidity/http/GetEnergyPricesOnSolidityServletTest.java b/framework/src/test/java/org/tron/core/services/interfaceOnSolidity/http/GetEnergyPricesOnSolidityServletTest.java index b7310d065f3..aeb646865b6 100644 --- a/framework/src/test/java/org/tron/core/services/interfaceOnSolidity/http/GetEnergyPricesOnSolidityServletTest.java +++ b/framework/src/test/java/org/tron/core/services/interfaceOnSolidity/http/GetEnergyPricesOnSolidityServletTest.java @@ -31,7 +31,7 @@ public static void init() { public void testGet() { MockHttpServletRequest request = createRequest(HttpGet.METHOD_NAME); MockHttpServletResponse response = new MockHttpServletResponse(); - getEnergyPricesOnSolidityServlet.doPost(request, response); + getEnergyPricesOnSolidityServlet.doGet(request, response); try { String contentAsString = response.getContentAsString(); JSONObject result = JSONObject.parseObject(contentAsString); From a3820db705156646a123910ecd157682678274e1 Mon Sep 17 00:00:00 2001 From: 3for <287494524@qq.com> Date: Thu, 27 Aug 2026 12:53:24 +0800 Subject: [PATCH 4/8] test(core): strengthen runtime, actuator, and storage tests --- .../actuator/MarketSellAssetActuator.java | 2 +- .../test/java/org/tron/common/BaseTest.java | 2 +- .../common/runtime/RuntimeImplMockTest.java | 21 +-- .../tron/common/runtime/RuntimeImplTest.java | 8 +- .../common/runtime/vm/AllowTvmLondonTest.java | 32 +++- .../vm/BandWidthRuntimeOutOfTimeTest.java | 43 ++--- ...andWidthRuntimeOutOfTimeWithCheckTest.java | 47 +++--- .../runtime/vm/BandWidthRuntimeTest.java | 134 +++++++-------- .../vm/BandWidthRuntimeWithCheckTest.java | 159 +++++++++--------- .../vm/BatchValidateSignContractTest.java | 2 +- .../tron/common/runtime/vm/DataWordTest.java | 67 +------- .../runtime/vm/EnergyWhenAssertStyleTest.java | 72 -------- .../vm/EnergyWhenTimeoutStyleTest.java | 9 +- .../vm/InternalTransactionCallTest.java | 6 - .../tron/common/runtime/vm/IstanbulTest.java | 25 +++ .../common/runtime/vm/OperationsTest.java | 61 ++++--- .../runtime/vm/PrecompiledContractsTest.java | 140 --------------- .../PrecompiledContractsVerifyProofTest.java | 12 +- .../runtime/vm/TransferToAccountTest.java | 7 + .../vm/ValidateMultiSignContractTest.java | 2 +- .../common/storage/CheckOrInitEngineTest.java | 32 ++++ .../leveldb/LevelDbDataSourceImplTest.java | 20 +-- .../rocksdb/RocksDbDataSourceImplTest.java | 9 +- .../java/org/tron/core/TxInputUtilTest.java | 8 - .../AccountPermissionUpdateActuatorTest.java | 3 +- .../actuator/CreateAccountActuatorTest.java | 1 + .../DelegateResourceActuatorTest.java | 24 +-- .../ExchangeTransactionActuatorTest.java | 27 ++- .../ExchangeWithdrawActuatorTest.java | 74 ++------ .../actuator/FreezeBalanceActuatorTest.java | 14 +- .../MarketCancelOrderActuatorTest.java | 4 +- .../actuator/MarketSellAssetActuatorTest.java | 86 ++-------- .../actuator/SetAccountIdActuatorTest.java | 24 +-- .../ShieldedTransferActuatorTest.java | 46 ++--- .../core/actuator/TransferActuatorTest.java | 17 +- .../actuator/TransferAssetActuatorTest.java | 139 +++++++-------- .../actuator/UnfreezeBalanceActuatorTest.java | 56 ------ .../UnfreezeBalanceV2ActuatorTest.java | 75 +++------ .../actuator/UpdateAccountActuatorTest.java | 19 +-- .../actuator/UpdateAssetActuatorTest.java | 2 +- .../actuator/VoteWitnessActuatorTest.java | 38 ++--- .../actuator/WitnessCreateActuatorTest.java | 4 +- .../actuator/utils/TransactionUtilTest.java | 15 +- .../actuator/vm/ProgramTraceListenerTest.java | 19 ++- .../tron/core/capsule/BlockCapsuleTest.java | 43 ++--- .../core/capsule/utils/MerkleTreeTest.java | 9 +- .../core/config/args/DynamicArgsTest.java | 35 ++-- .../tron/core/config/args/WitnessTest.java | 1 + .../org/tron/core/db/AccountStoreTest.java | 4 + .../java/org/tron/core/db/BlockStoreTest.java | 4 - .../tron/core/db/CheckPointV2StoreTest.java | 1 + .../java/org/tron/core/db/DBIteratorTest.java | 69 +++----- .../org/tron/core/db/KhaosDatabaseTest.java | 72 +++----- .../org/tron/core/db/ManagerMockTest.java | 104 ++++++------ .../java/org/tron/core/db/ManagerTest.java | 135 ++++----------- .../db/MarketPairPriceToOrderStoreTest.java | 14 +- .../tron/core/db/TransactionStoreTest.java | 8 +- .../org/tron/core/db2/SnapshotImplTest.java | 14 +- .../tron/core/metrics/MetricsUtilTest.java | 34 +++- .../core/witness/WitnessControllerTest.java | 65 +++---- .../tron/program/AccountVoteWitnessTest.java | 57 ++----- .../org/tron/program/SolidityNodeTest.java | 58 ++++--- .../java/org/tron/program/SupplementTest.java | 3 +- 63 files changed, 877 insertions(+), 1460 deletions(-) diff --git a/actuator/src/main/java/org/tron/core/actuator/MarketSellAssetActuator.java b/actuator/src/main/java/org/tron/core/actuator/MarketSellAssetActuator.java index 369857ae6c1..4b0c87178b9 100644 --- a/actuator/src/main/java/org/tron/core/actuator/MarketSellAssetActuator.java +++ b/actuator/src/main/java/org/tron/core/actuator/MarketSellAssetActuator.java @@ -235,7 +235,7 @@ public boolean validate() throws ContractValidateException { if (marketAccountOrderCapsule != null && marketAccountOrderCapsule.getCount() >= MAX_ACTIVE_ORDER_NUM) { throw new ContractValidateException( - "Maximum number of orders exceeded," + MAX_ACTIVE_ORDER_NUM); + "Maximum number of orders exceeded, " + MAX_ACTIVE_ORDER_NUM); } try { diff --git a/framework/src/test/java/org/tron/common/BaseTest.java b/framework/src/test/java/org/tron/common/BaseTest.java index 6d075a2d6aa..be06a06e5df 100644 --- a/framework/src/test/java/org/tron/common/BaseTest.java +++ b/framework/src/test/java/org/tron/common/BaseTest.java @@ -126,7 +126,7 @@ public Protocol.Block getSignedBlock(ByteString witness, long time, byte[] priva .build(); ECKey ecKey = ECKey.fromPrivate(privateKey); - assert ecKey != null; + Assert.assertNotNull(ecKey); ECKey.ECDSASignature signature = ecKey.sign(Sha256Hash.of(CommonParameter .getInstance().isECKeyCryptoEngine(), raw.toByteArray()).getBytes()); ByteString sign = ByteString.copyFrom(signature.toByteArray()); diff --git a/framework/src/test/java/org/tron/common/runtime/RuntimeImplMockTest.java b/framework/src/test/java/org/tron/common/runtime/RuntimeImplMockTest.java index e694f1c194f..0692cde3187 100644 --- a/framework/src/test/java/org/tron/common/runtime/RuntimeImplMockTest.java +++ b/framework/src/test/java/org/tron/common/runtime/RuntimeImplMockTest.java @@ -1,21 +1,12 @@ package org.tron.common.runtime; import java.lang.reflect.Method; - -import lombok.extern.slf4j.Slf4j; -import org.junit.After; +import org.junit.Assert; import org.junit.Test; import org.tron.core.vm.program.Program; +import org.tron.protos.Protocol.Transaction.Result.contractResult; - - -@Slf4j public class RuntimeImplMockTest { - @After - public void clearMocks() { - - } - @Test public void testSetResultCode1() throws Exception { RuntimeImpl runtime = new RuntimeImpl(); @@ -28,26 +19,30 @@ public void testSetResultCode1() throws Exception { = new Program.BadJumpDestinationException("Operation with pc isn't 'JUMPDEST': PC[%d];", 0); programResult.setException(badJumpDestinationException); privateMethod.invoke(runtime, programResult); + Assert.assertEquals(contractResult.BAD_JUMP_DESTINATION, programResult.getResultCode()); Program.OutOfTimeException outOfTimeException = new Program.OutOfTimeException("CPU timeout for 0x0a executing"); programResult.setException(outOfTimeException); privateMethod.invoke(runtime, programResult); + Assert.assertEquals(contractResult.OUT_OF_TIME, programResult.getResultCode()); Program.PrecompiledContractException precompiledContractException = new Program.PrecompiledContractException("precompiled contract exception"); programResult.setException(precompiledContractException); privateMethod.invoke(runtime, programResult); + Assert.assertEquals(contractResult.PRECOMPILED_CONTRACT, programResult.getResultCode()); Program.StackTooSmallException stackTooSmallException = new Program.StackTooSmallException("Expected stack size %d but actual %d;", 100, 10); programResult.setException(stackTooSmallException); privateMethod.invoke(runtime, programResult); + Assert.assertEquals(contractResult.STACK_TOO_SMALL, programResult.getResultCode()); Program.JVMStackOverFlowException jvmStackOverFlowException = new Program.JVMStackOverFlowException(); programResult.setException(jvmStackOverFlowException); privateMethod.invoke(runtime, programResult); + Assert.assertEquals(contractResult.JVM_STACK_OVER_FLOW, programResult.getResultCode()); } - -} \ No newline at end of file +} diff --git a/framework/src/test/java/org/tron/common/runtime/RuntimeImplTest.java b/framework/src/test/java/org/tron/common/runtime/RuntimeImplTest.java index 7fcdfae2753..7516c6d1e68 100644 --- a/framework/src/test/java/org/tron/common/runtime/RuntimeImplTest.java +++ b/framework/src/test/java/org/tron/common/runtime/RuntimeImplTest.java @@ -5,6 +5,7 @@ import lombok.extern.slf4j.Slf4j; import org.bouncycastle.util.encoders.Hex; +import org.junit.After; import org.junit.Assert; import org.junit.Before; import org.junit.Test; @@ -22,6 +23,7 @@ import org.tron.core.exception.ReceiptCheckErrException; import org.tron.core.exception.VMIllegalException; import org.tron.core.store.StoreFactory; +import org.tron.core.vm.config.VMConfig; import org.tron.core.vm.repository.Repository; import org.tron.core.vm.repository.RepositoryImpl; import org.tron.protos.Protocol.AccountType; @@ -62,6 +64,11 @@ public void init() { repository.commit(); } + @After + public void clearVmConfigLocalSnapshot() { + VMConfig.clearLocalSnapshot(); + } + // // solidity src code // pragma solidity ^0.4.2; // @@ -416,4 +423,3 @@ public void getCallerAndCreatorEnergyLimit2With100PercentTest() expectEnergyLimit3); } } - diff --git a/framework/src/test/java/org/tron/common/runtime/vm/AllowTvmLondonTest.java b/framework/src/test/java/org/tron/common/runtime/vm/AllowTvmLondonTest.java index e93eca39092..2832a597e29 100644 --- a/framework/src/test/java/org/tron/common/runtime/vm/AllowTvmLondonTest.java +++ b/framework/src/test/java/org/tron/common/runtime/vm/AllowTvmLondonTest.java @@ -22,6 +22,34 @@ @Slf4j public class AllowTvmLondonTest extends VMTestBase { + private boolean savedAllowTvmTransferTrc10; + private boolean savedAllowTvmConstantinople; + private boolean savedAllowTvmSolidity059; + private boolean savedAllowTvmIstanbul; + private boolean savedAllowTvmLondon; + + @Override + protected void afterInit() { + super.afterInit(); + VMConfig.clearLocalSnapshot(); + savedAllowTvmTransferTrc10 = VMConfig.allowTvmTransferTrc10(); + savedAllowTvmConstantinople = VMConfig.allowTvmConstantinople(); + savedAllowTvmSolidity059 = VMConfig.allowTvmSolidity059(); + savedAllowTvmIstanbul = VMConfig.allowTvmIstanbul(); + savedAllowTvmLondon = VMConfig.allowTvmLondon(); + } + + @Override + protected void beforeDestroy() { + VMConfig.clearLocalSnapshot(); + VMConfig.initAllowTvmTransferTrc10(savedAllowTvmTransferTrc10 ? 1 : 0); + VMConfig.initAllowTvmConstantinople(savedAllowTvmConstantinople ? 1 : 0); + VMConfig.initAllowTvmSolidity059(savedAllowTvmSolidity059 ? 1 : 0); + VMConfig.initAllowTvmIstanbul(savedAllowTvmIstanbul ? 1 : 0); + VMConfig.initAllowTvmLondon(savedAllowTvmLondon ? 1 : 0); + ConfigLoader.disable = false; + } + /*contract c { function getbasefee() public returns(uint) { @@ -74,8 +102,8 @@ public void testBaseFee() throws ContractExeException, ReceiptCheckErrException, factoryAddress, Hex.decode(hexInput), 0, feeLimit, manager, null); byte[] returnValue = result.getRuntime().getResult().getHReturn(); Assert.assertNull(result.getRuntime().getRuntimeError()); - Assert.assertArrayEquals(returnValue, - longTo32Bytes(manager.getDynamicPropertiesStore().getEnergyFee())); + Assert.assertArrayEquals(longTo32Bytes(manager.getDynamicPropertiesStore().getEnergyFee()), + returnValue); } @Test diff --git a/framework/src/test/java/org/tron/common/runtime/vm/BandWidthRuntimeOutOfTimeTest.java b/framework/src/test/java/org/tron/common/runtime/vm/BandWidthRuntimeOutOfTimeTest.java index 86b26c24672..4688afb9ee8 100644 --- a/framework/src/test/java/org/tron/common/runtime/vm/BandWidthRuntimeOutOfTimeTest.java +++ b/framework/src/test/java/org/tron/common/runtime/vm/BandWidthRuntimeOutOfTimeTest.java @@ -17,17 +17,18 @@ import com.google.protobuf.Any; import com.google.protobuf.ByteString; +import java.util.concurrent.atomic.AtomicLong; 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.parameter.CommonParameter; import org.tron.common.runtime.RuntimeImpl; import org.tron.common.runtime.TvmTestUtils; import org.tron.common.utils.Commons; import org.tron.core.Constant; import org.tron.core.capsule.AccountCapsule; -import org.tron.core.capsule.BlockCapsule; import org.tron.core.capsule.TransactionCapsule; import org.tron.core.config.args.Args; import org.tron.core.db.TransactionTrace; @@ -36,13 +37,13 @@ import org.tron.core.exception.ContractValidateException; import org.tron.core.exception.TooBigTransactionException; import org.tron.core.exception.TooBigTransactionResultException; -import org.tron.core.exception.TronException; import org.tron.core.exception.VMIllegalException; import org.tron.core.store.StoreFactory; import org.tron.protos.Protocol.AccountType; import org.tron.protos.Protocol.Transaction; import org.tron.protos.Protocol.Transaction.Contract; import org.tron.protos.Protocol.Transaction.Contract.ContractType; +import org.tron.protos.Protocol.Transaction.Result.contractResult; import org.tron.protos.Protocol.Transaction.raw; import org.tron.protos.contract.SmartContractOuterClass.CreateSmartContract; import org.tron.protos.contract.SmartContractOuterClass.TriggerSmartContract; @@ -65,14 +66,14 @@ public class BandWidthRuntimeOutOfTimeTest extends BaseTest { private static final String OwnerAddress = "TCWHANtDDdkZCTo2T2peyEq3Eg9c2XB7ut"; private static final String TriggerOwnerAddress = "TCSgeWapPJhCqgWRxXCKb6jJ5AgNWSGjPA"; - private static boolean init; + private static final AtomicLong TRANSACTION_TIMESTAMP = + new AtomicLong(System.currentTimeMillis()); static { Args.setParam( new String[]{ "--output-directory", dbPath(), "--storage-db-directory", dbDirectory, - "--debug" }, TestConstants.TEST_CONF ); @@ -83,9 +84,6 @@ public class BandWidthRuntimeOutOfTimeTest extends BaseTest { */ @Before public void init() { - if (init) { - return; - } //init energy dbManager.getDynamicPropertiesStore().saveLatestBlockHeaderTimestamp(1526647828000L); dbManager.getDynamicPropertiesStore().saveTotalEnergyWeight(10_000_000L); @@ -109,12 +107,14 @@ public void init() { .put(Commons.decodeFromBase58Check(TriggerOwnerAddress), accountCapsule2); dbManager.getDynamicPropertiesStore() .saveLatestBlockHeaderTimestamp(System.currentTimeMillis() / 1000); - init = true; } @Test - public void testSuccess() { + public void testSuccess() throws Exception { + boolean originalDebug = CommonParameter.getInstance().isDebug(); + long originalMaxCpuTime = dbManager.getDynamicPropertiesStore().getMaxCpuTimeOfOneTx(); try { + CommonParameter.getInstance().setDebug(true); byte[] contractAddress = createContract(); AccountCapsule triggerOwner = dbManager.getAccountStore() .get(Commons.decodeFromBase58Check(TriggerOwnerAddress)); @@ -125,13 +125,16 @@ public void testSuccess() { 0, Commons.decodeFromBase58Check(TriggerOwnerAddress)); Transaction transaction = Transaction.newBuilder().setRawData(raw.newBuilder().addContract( Contract.newBuilder().setParameter(Any.pack(triggerContract)) - .setType(ContractType.TriggerSmartContract)).setFeeLimit(100000000000L)).build(); + .setType(ContractType.TriggerSmartContract)) + .setFeeLimit(dbManager.getDynamicPropertiesStore().getMaxFeeLimit())).build(); TransactionCapsule trxCap = new TransactionCapsule(transaction); TransactionTrace trace = new TransactionTrace(trxCap, StoreFactory.getInstance(), new RuntimeImpl()); dbManager.consumeBandwidth(trxCap, trace); - BlockCapsule blockCapsule = null; - trace.init(blockCapsule); + + CommonParameter.getInstance().setDebug(false); + dbManager.getDynamicPropertiesStore().saveMaxCpuTimeOfOneTx(0L); + trace.init(null); trace.exec(); trace.finalization(); @@ -139,6 +142,8 @@ public void testSuccess() { .get(Commons.decodeFromBase58Check(TriggerOwnerAddress)); energy = triggerOwner.getEnergyUsage() - energy; balance = balance - triggerOwner.getBalance(); + Assert.assertEquals(contractResult.OUT_OF_TIME, + trace.getRuntimeResult().getResultCode()); Assert.assertNotNull(trace.getRuntimeError()); Assert.assertTrue(trace.getRuntimeError().contains(" timeout ")); Assert.assertEquals(9950000, trace.getReceipt().getEnergyUsageTotal()); @@ -146,8 +151,9 @@ public void testSuccess() { Assert.assertEquals(990000000, balance); Assert.assertEquals(9950000 * Constant.SUN_PER_ENERGY, balance + energy * Constant.SUN_PER_ENERGY); - } catch (TronException e) { - Assert.assertNotNull(e); + } finally { + dbManager.getDynamicPropertiesStore().saveMaxCpuTimeOfOneTx(originalMaxCpuTime); + CommonParameter.getInstance().setDebug(originalDebug); } } @@ -189,7 +195,8 @@ private byte[] createContract() 100); Transaction transaction = Transaction.newBuilder().setRawData(raw.newBuilder().addContract( Contract.newBuilder().setParameter(Any.pack(smartContract)) - .setType(ContractType.CreateSmartContract)).setFeeLimit(1000000000)).build(); + .setType(ContractType.CreateSmartContract)).setFeeLimit(1000000000) + .setTimestamp(TRANSACTION_TIMESTAMP.incrementAndGet())).build(); TransactionCapsule trxCap = new TransactionCapsule(transaction); TransactionTrace trace = new TransactionTrace(trxCap, StoreFactory.getInstance(), new RuntimeImpl()); @@ -205,10 +212,8 @@ private byte[] createContract() Assert.assertEquals(50000, energy); Assert.assertEquals(3852900, balance); Assert.assertEquals(88529 * 100, balance + energy * 100); - if (trace.getRuntimeError() != null) { - return trace.getRuntimeResult().getContractAddress(); - } + Assert.assertNull(trace.getRuntimeError()); return trace.getRuntimeResult().getContractAddress(); } -} \ No newline at end of file +} diff --git a/framework/src/test/java/org/tron/common/runtime/vm/BandWidthRuntimeOutOfTimeWithCheckTest.java b/framework/src/test/java/org/tron/common/runtime/vm/BandWidthRuntimeOutOfTimeWithCheckTest.java index bb5fbf36d55..92ef4926338 100644 --- a/framework/src/test/java/org/tron/common/runtime/vm/BandWidthRuntimeOutOfTimeWithCheckTest.java +++ b/framework/src/test/java/org/tron/common/runtime/vm/BandWidthRuntimeOutOfTimeWithCheckTest.java @@ -17,11 +17,13 @@ import com.google.protobuf.Any; import com.google.protobuf.ByteString; +import java.util.concurrent.atomic.AtomicLong; 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.parameter.CommonParameter; import org.tron.common.runtime.RuntimeImpl; import org.tron.common.runtime.TvmTestUtils; import org.tron.common.utils.Commons; @@ -34,10 +36,8 @@ import org.tron.core.exception.AccountResourceInsufficientException; import org.tron.core.exception.ContractExeException; import org.tron.core.exception.ContractValidateException; -import org.tron.core.exception.ReceiptCheckErrException; import org.tron.core.exception.TooBigTransactionException; import org.tron.core.exception.TooBigTransactionResultException; -import org.tron.core.exception.TronException; import org.tron.core.exception.VMIllegalException; import org.tron.core.store.StoreFactory; import org.tron.protos.Protocol.AccountType; @@ -66,14 +66,14 @@ public class BandWidthRuntimeOutOfTimeWithCheckTest extends BaseTest { private static final String dbDirectory = "db_BandWidthRuntimeOutOfTimeTest_test"; private static final String OwnerAddress = "TCWHANtDDdkZCTo2T2peyEq3Eg9c2XB7ut"; private static final String TriggerOwnerAddress = "TCSgeWapPJhCqgWRxXCKb6jJ5AgNWSGjPA"; - private static boolean init; + private static final AtomicLong TRANSACTION_TIMESTAMP = + new AtomicLong(System.currentTimeMillis()); static { Args.setParam( new String[]{ "--output-directory", dbPath(), "--storage-db-directory", dbDirectory, - "--debug" }, TestConstants.TEST_CONF ); @@ -84,9 +84,6 @@ public class BandWidthRuntimeOutOfTimeWithCheckTest extends BaseTest { */ @Before public void init() { - if (init) { - return; - } //init energy dbManager.getDynamicPropertiesStore().saveLatestBlockHeaderTimestamp(1526647837000L); dbManager.getDynamicPropertiesStore().saveTotalEnergyWeight(10_000_000L); @@ -110,12 +107,14 @@ public void init() { .put(Commons.decodeFromBase58Check(TriggerOwnerAddress), accountCapsule2); dbManager.getDynamicPropertiesStore() .saveLatestBlockHeaderTimestamp(System.currentTimeMillis() / 1000); - init = true; } @Test - public void testSuccess() { + public void testSuccess() throws Exception { + boolean originalDebug = CommonParameter.getInstance().isDebug(); + long originalMaxCpuTime = dbManager.getDynamicPropertiesStore().getMaxCpuTimeOfOneTx(); try { + CommonParameter.getInstance().setDebug(true); byte[] contractAddress = createContract(); AccountCapsule triggerOwner = dbManager.getAccountStore() .get(Commons.decodeFromBase58Check(TriggerOwnerAddress)); @@ -126,21 +125,27 @@ public void testSuccess() { 0, Commons.decodeFromBase58Check(TriggerOwnerAddress)); Transaction transaction = Transaction.newBuilder().setRawData(raw.newBuilder().addContract( Contract.newBuilder().setParameter(Any.pack(triggerContract)) - .setType(ContractType.TriggerSmartContract)).setFeeLimit(1000000000)).build(); + .setType(ContractType.TriggerSmartContract)) + .setFeeLimit(dbManager.getDynamicPropertiesStore().getMaxFeeLimit())).build(); TransactionCapsule trxCap = new TransactionCapsule(transaction); - trxCap.setResultCode(contractResult.OUT_OF_ENERGY); + trxCap.setResultCode(contractResult.OUT_OF_TIME); TransactionTrace trace = new TransactionTrace(trxCap, StoreFactory.getInstance(), new RuntimeImpl()); dbManager.consumeBandwidth(trxCap, trace); - BlockCapsule blockCapsule = null; - trace.init(blockCapsule); + + CommonParameter.getInstance().setDebug(false); + dbManager.getDynamicPropertiesStore().saveMaxCpuTimeOfOneTx(0L); + trace.init(null); trace.exec(); - trace.finalization(); + trace.setResult(); trace.check(); + trace.finalization(); + triggerOwner = dbManager.getAccountStore() .get(Commons.decodeFromBase58Check(TriggerOwnerAddress)); energy = triggerOwner.getEnergyUsage() - energy; balance = balance - triggerOwner.getBalance(); + Assert.assertEquals(contractResult.OUT_OF_TIME, trace.getReceipt().getResult()); Assert.assertNotNull(trace.getRuntimeError()); Assert.assertTrue(trace.getRuntimeError().contains(" timeout ")); Assert.assertEquals(9950000, trace.getReceipt().getEnergyUsageTotal()); @@ -148,8 +153,9 @@ public void testSuccess() { Assert.assertEquals(990000000, balance); Assert.assertEquals(9950000 * Constant.SUN_PER_ENERGY, balance + energy * Constant.SUN_PER_ENERGY); - } catch (TronException | ReceiptCheckErrException e) { - Assert.assertNotNull(e); + } finally { + dbManager.getDynamicPropertiesStore().saveMaxCpuTimeOfOneTx(originalMaxCpuTime); + CommonParameter.getInstance().setDebug(originalDebug); } } @@ -191,7 +197,8 @@ private byte[] createContract() 0, 100); Transaction transaction = Transaction.newBuilder().setRawData(raw.newBuilder().addContract( Contract.newBuilder().setParameter(Any.pack(smartContract)) - .setType(ContractType.CreateSmartContract)).setFeeLimit(1000000000)).build(); + .setType(ContractType.CreateSmartContract)).setFeeLimit(1000000000) + .setTimestamp(TRANSACTION_TIMESTAMP.incrementAndGet())).build(); TransactionCapsule trxCap = new TransactionCapsule(transaction); TransactionTrace trace = new TransactionTrace(trxCap, StoreFactory.getInstance(), new RuntimeImpl()); @@ -208,9 +215,7 @@ private byte[] createContract() Assert.assertEquals(50000, energy); Assert.assertEquals(3852900, balance); Assert.assertEquals(88529 * 100, balance + energy * 100); - if (trace.getRuntimeError() != null) { - return trace.getRuntimeResult().getContractAddress(); - } + Assert.assertNull(trace.getRuntimeError()); return trace.getRuntimeResult().getContractAddress(); } -} \ No newline at end of file +} diff --git a/framework/src/test/java/org/tron/common/runtime/vm/BandWidthRuntimeTest.java b/framework/src/test/java/org/tron/common/runtime/vm/BandWidthRuntimeTest.java index fb682bcb50f..1f0f3a09c5a 100644 --- a/framework/src/test/java/org/tron/common/runtime/vm/BandWidthRuntimeTest.java +++ b/framework/src/test/java/org/tron/common/runtime/vm/BandWidthRuntimeTest.java @@ -19,6 +19,8 @@ import com.google.protobuf.Any; import com.google.protobuf.ByteString; +import java.util.concurrent.atomic.AtomicLong; +import org.junit.After; import org.junit.Assert; import org.junit.Before; import org.junit.BeforeClass; @@ -41,7 +43,6 @@ import org.tron.core.exception.ContractValidateException; import org.tron.core.exception.TooBigTransactionException; import org.tron.core.exception.TooBigTransactionResultException; -import org.tron.core.exception.TronException; import org.tron.core.exception.VMIllegalException; import org.tron.core.store.StoreFactory; import org.tron.protos.Protocol.AccountType; @@ -61,7 +62,9 @@ public class BandWidthRuntimeTest extends BaseTest { private static final String OwnerAddress = "TCWHANtDDdkZCTo2T2peyEq3Eg9c2XB7ut"; private static final String TriggerOwnerAddress = "TCSgeWapPJhCqgWRxXCKb6jJ5AgNWSGjPA"; private static final String TriggerOwnerTwoAddress = "TPMBUANrTwwQAPwShn7ZZjTJz1f3F8jknj"; - private static boolean init; + private static final AtomicLong TRANSACTION_TIMESTAMP = + new AtomicLong(System.currentTimeMillis()); + private boolean originalDebug; @BeforeClass public static void init() { @@ -79,9 +82,9 @@ public static void init() { */ @Before public void before() { - if (init) { - return; - } + originalDebug = CommonParameter.getInstance().isDebug(); + CommonParameter.getInstance().setDebug(true); + //init energy dbManager.getDynamicPropertiesStore().saveLatestBlockHeaderTimestamp(1526547838000L); dbManager.getDynamicPropertiesStore().saveTotalEnergyWeight(10_000_000L); @@ -117,82 +120,70 @@ public void before() { dbManager.getDynamicPropertiesStore() .saveLatestBlockHeaderTimestamp(System.currentTimeMillis() / 1000); - init = true; + } + + @After + public void after() { + CommonParameter.getInstance().setDebug(originalDebug); } @Test - public void testSuccess() { - try { - byte[] contractAddress = createContract(); - TriggerSmartContract triggerContract = TvmTestUtils.createTriggerContract(contractAddress, - "setCoin(uint256)", "3", false, - 0, Commons.decodeFromBase58Check(TriggerOwnerAddress)); - Transaction transaction = Transaction.newBuilder().setRawData(raw.newBuilder().addContract( - Contract.newBuilder().setParameter(Any.pack(triggerContract)) - .setType(ContractType.TriggerSmartContract)).setFeeLimit(1000000000)).build(); - TransactionCapsule trxCap = new TransactionCapsule(transaction); - TransactionTrace trace = new TransactionTrace(trxCap, StoreFactory.getInstance(), - new RuntimeImpl()); - dbManager.consumeBandwidth(trxCap, trace); + public void testSuccess() throws Exception { + byte[] contractAddress = createContract(); + TriggerSmartContract triggerContract = TvmTestUtils.createTriggerContract(contractAddress, + "setCoin(uint256)", "3", false, + 0, Commons.decodeFromBase58Check(TriggerOwnerAddress)); + Transaction transaction = Transaction.newBuilder().setRawData(raw.newBuilder().addContract( + Contract.newBuilder().setParameter(Any.pack(triggerContract)) + .setType(ContractType.TriggerSmartContract)).setFeeLimit(1000000000)).build(); + TransactionCapsule trxCap = new TransactionCapsule(transaction); + TransactionTrace trace = new TransactionTrace(trxCap, StoreFactory.getInstance(), + new RuntimeImpl()); + dbManager.consumeBandwidth(trxCap, trace); - trace.init(null); - trace.exec(); - trace.finalization(); + trace.init(null); + trace.exec(); + trace.finalization(); - AccountCapsule triggerOwner = dbManager.getAccountStore() - .get(Commons.decodeFromBase58Check(TriggerOwnerAddress)); - long energy = triggerOwner.getEnergyUsage(); - long balance = triggerOwner.getBalance(); - Assert.assertEquals(45706, trace.getReceipt().getEnergyUsageTotal()); - Assert.assertEquals(45706, energy); - Assert.assertEquals(totalBalance, balance); - } catch (TronException e) { - Assert.assertNotNull(e); - } + AccountCapsule triggerOwner = dbManager.getAccountStore() + .get(Commons.decodeFromBase58Check(TriggerOwnerAddress)); + long energy = triggerOwner.getEnergyUsage(); + long balance = triggerOwner.getBalance(); + Assert.assertEquals(45706, trace.getReceipt().getEnergyUsageTotal()); + Assert.assertEquals(45706, energy); + Assert.assertEquals(totalBalance, balance); } @Test - public void testSuccessNoBandd() { - boolean originalDebug = CommonParameter.getInstance().isDebug(); - try { - byte[] contractAddress = createContract(); - // Enable debug mode to bypass CPU time limit check in Program.checkCPUTimeLimit(). - // Without this, the heavy contract execution (setCoin) may exceed the time threshold - // on slow machines and cause the test to fail non-deterministically. - CommonParameter.getInstance().setDebug(true); - TriggerSmartContract triggerContract = TvmTestUtils.createTriggerContract(contractAddress, - "setCoin(uint256)", "50", false, - 0, Commons.decodeFromBase58Check(TriggerOwnerTwoAddress)); - Transaction transaction = Transaction.newBuilder().setRawData(raw.newBuilder().addContract( - Contract.newBuilder().setParameter(Any.pack(triggerContract)) - .setType(ContractType.TriggerSmartContract)).setFeeLimit(1000000000)).build(); - TransactionCapsule trxCap = new TransactionCapsule(transaction); - TransactionTrace trace = new TransactionTrace(trxCap, StoreFactory.getInstance(), - new RuntimeImpl()); - dbManager.consumeBandwidth(trxCap, trace); - long bandWidth = trxCap.getSerializedSize() + Constant.MAX_RESULT_SIZE_IN_TX; - BlockCapsule blockCapsule = null; + public void testSuccessNoBandd() throws Exception { + byte[] contractAddress = createContract(); + TriggerSmartContract triggerContract = TvmTestUtils.createTriggerContract(contractAddress, + "setCoin(uint256)", "50", false, + 0, Commons.decodeFromBase58Check(TriggerOwnerTwoAddress)); + Transaction transaction = Transaction.newBuilder().setRawData(raw.newBuilder().addContract( + Contract.newBuilder().setParameter(Any.pack(triggerContract)) + .setType(ContractType.TriggerSmartContract)).setFeeLimit(1000000000)).build(); + TransactionCapsule trxCap = new TransactionCapsule(transaction); + TransactionTrace trace = new TransactionTrace(trxCap, StoreFactory.getInstance(), + new RuntimeImpl()); + dbManager.consumeBandwidth(trxCap, trace); + long bandWidth = trxCap.getSerializedSize() + Constant.MAX_RESULT_SIZE_IN_TX; + BlockCapsule blockCapsule = null; - trace.init(blockCapsule); - trace.exec(); - trace.finalization(); + trace.init(blockCapsule); + trace.exec(); + trace.finalization(); - AccountCapsule triggerOwnerTwo = dbManager.getAccountStore() - .get(Commons.decodeFromBase58Check(TriggerOwnerTwoAddress)); - long balance = triggerOwnerTwo.getBalance(); - ReceiptCapsule receipt = trace.getReceipt(); + AccountCapsule triggerOwnerTwo = dbManager.getAccountStore() + .get(Commons.decodeFromBase58Check(TriggerOwnerTwoAddress)); + long balance = triggerOwnerTwo.getBalance(); + ReceiptCapsule receipt = trace.getReceipt(); - Assert.assertEquals(bandWidth, receipt.getNetUsage()); - Assert.assertEquals(522850, receipt.getEnergyUsageTotal()); - Assert.assertEquals(50000, receipt.getEnergyUsage()); - Assert.assertEquals(47285000, receipt.getEnergyFee()); - Assert.assertEquals(totalBalance - receipt.getEnergyFee(), - balance); - } catch (TronException e) { - Assert.assertNotNull(e); - } finally { - CommonParameter.getInstance().setDebug(originalDebug); - } + Assert.assertEquals(bandWidth, receipt.getNetUsage()); + Assert.assertEquals(522850, receipt.getEnergyUsageTotal()); + Assert.assertEquals(50000, receipt.getEnergyUsage()); + Assert.assertEquals(47285000, receipt.getEnergyFee()); + Assert.assertEquals(totalBalance - receipt.getEnergyFee(), balance); } private byte[] createContract() @@ -224,7 +215,8 @@ private byte[] createContract() 100); Transaction transaction = Transaction.newBuilder().setRawData(raw.newBuilder().addContract( Contract.newBuilder().setParameter(Any.pack(smartContract)) - .setType(ContractType.CreateSmartContract)).setFeeLimit(1000000000)).build(); + .setType(ContractType.CreateSmartContract)).setFeeLimit(1000000000) + .setTimestamp(TRANSACTION_TIMESTAMP.incrementAndGet())).build(); TransactionCapsule trxCap = new TransactionCapsule(transaction); TransactionTrace trace = new TransactionTrace(trxCap, StoreFactory.getInstance(), new RuntimeImpl()); diff --git a/framework/src/test/java/org/tron/common/runtime/vm/BandWidthRuntimeWithCheckTest.java b/framework/src/test/java/org/tron/common/runtime/vm/BandWidthRuntimeWithCheckTest.java index a05d6603874..a0899a5ced2 100644 --- a/framework/src/test/java/org/tron/common/runtime/vm/BandWidthRuntimeWithCheckTest.java +++ b/framework/src/test/java/org/tron/common/runtime/vm/BandWidthRuntimeWithCheckTest.java @@ -17,11 +17,14 @@ import com.google.protobuf.Any; import com.google.protobuf.ByteString; +import java.util.concurrent.atomic.AtomicLong; +import org.junit.After; 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.parameter.CommonParameter; import org.tron.common.runtime.RuntimeImpl; import org.tron.common.runtime.TvmTestUtils; import org.tron.common.utils.Commons; @@ -37,7 +40,6 @@ import org.tron.core.exception.ReceiptCheckErrException; import org.tron.core.exception.TooBigTransactionException; import org.tron.core.exception.TooBigTransactionResultException; -import org.tron.core.exception.TronException; import org.tron.core.exception.VMIllegalException; import org.tron.core.store.StoreFactory; import org.tron.protos.Protocol.AccountType; @@ -67,8 +69,9 @@ public class BandWidthRuntimeWithCheckTest extends BaseTest { private static final String OwnerAddress = "TCWHANtDDdkZCTo2T2peyEq3Eg9c2XB7ut"; private static final String TriggerOwnerAddress = "TCSgeWapPJhCqgWRxXCKb6jJ5AgNWSGjPA"; private static final String TriggerOwnerTwoAddress = "TPMBUANrTwwQAPwShn7ZZjTJz1f3F8jknj"; - - private static boolean init; + private static final AtomicLong TRANSACTION_TIMESTAMP = + new AtomicLong(System.currentTimeMillis()); + private boolean originalDebug; static { Args.setParam( @@ -85,9 +88,9 @@ public class BandWidthRuntimeWithCheckTest extends BaseTest { */ @Before public void init() { - if (init) { - return; - } + originalDebug = CommonParameter.getInstance().isDebug(); + CommonParameter.getInstance().setDebug(true); + //init energy dbManager.getDynamicPropertiesStore().saveLatestBlockHeaderTimestamp(1526647838000L); dbManager.getDynamicPropertiesStore().saveTotalEnergyWeight(10_000_000L); @@ -117,81 +120,80 @@ public void init() { accountCapsule3.setFrozenForEnergy(10_000_000L, 0L); dbManager.getAccountStore() .put(Commons.decodeFromBase58Check(TriggerOwnerTwoAddress), accountCapsule3); - init = true; } - @Test - public void testSuccess() { - try { - byte[] contractAddress = createContract(); - AccountCapsule triggerOwner = dbManager.getAccountStore() - .get(Commons.decodeFromBase58Check(TriggerOwnerAddress)); - long energy = triggerOwner.getEnergyUsage(); - long balance = triggerOwner.getBalance(); - TriggerSmartContract triggerContract = TvmTestUtils.createTriggerContract(contractAddress, - "fibonacciNotify(uint256)", "7000", false, - 0, Commons.decodeFromBase58Check(TriggerOwnerAddress)); - Transaction transaction = Transaction.newBuilder().setRawData(raw.newBuilder().addContract( - Contract.newBuilder().setParameter(Any.pack(triggerContract)) - .setType(ContractType.TriggerSmartContract)).setFeeLimit(1000000000)).build(); - TransactionCapsule trxCap = new TransactionCapsule(transaction); - TransactionTrace trace = new TransactionTrace(trxCap, StoreFactory.getInstance(), - new RuntimeImpl()); - dbManager.consumeBandwidth(trxCap, trace); + @After + public void after() { + CommonParameter.getInstance().setDebug(originalDebug); + } - trace.init(null); - trace.exec(); - trace.finalization(); + @Test + public void testSuccess() throws Exception { + byte[] contractAddress = createContract(); + AccountCapsule triggerOwner = dbManager.getAccountStore() + .get(Commons.decodeFromBase58Check(TriggerOwnerAddress)); + long energy = triggerOwner.getEnergyUsage(); + long balance = triggerOwner.getBalance(); + TriggerSmartContract triggerContract = TvmTestUtils.createTriggerContract(contractAddress, + "fibonacciNotify(uint256)", "7000", false, + 0, Commons.decodeFromBase58Check(TriggerOwnerAddress)); + Transaction transaction = Transaction.newBuilder().setRawData(raw.newBuilder().addContract( + Contract.newBuilder().setParameter(Any.pack(triggerContract)) + .setType(ContractType.TriggerSmartContract)).setFeeLimit(1000000000)).build(); + TransactionCapsule trxCap = new TransactionCapsule(transaction); + trxCap.setResultCode(contractResult.SUCCESS); + TransactionTrace trace = new TransactionTrace(trxCap, StoreFactory.getInstance(), + new RuntimeImpl()); + dbManager.consumeBandwidth(trxCap, trace); - triggerOwner = dbManager.getAccountStore() - .get(Commons.decodeFromBase58Check(TriggerOwnerAddress)); - energy = triggerOwner.getEnergyUsage() - energy; - balance = balance - triggerOwner.getBalance(); - Assert.assertEquals(624668, trace.getReceipt().getEnergyUsageTotal()); - Assert.assertEquals(50000, energy); - Assert.assertEquals(57466800, balance); - Assert.assertEquals(624668 * Constant.SUN_PER_ENERGY, - balance + energy * Constant.SUN_PER_ENERGY); - } catch (TronException | ReceiptCheckErrException e) { - Assert.assertNotNull(e); - } + trace.init(null); + trace.exec(); + trace.setResult(); + trace.check(); + trace.finalization(); + triggerOwner = dbManager.getAccountStore() + .get(Commons.decodeFromBase58Check(TriggerOwnerAddress)); + energy = triggerOwner.getEnergyUsage() - energy; + balance = balance - triggerOwner.getBalance(); + Assert.assertEquals(624668, trace.getReceipt().getEnergyUsageTotal()); + Assert.assertEquals(50000, energy); + Assert.assertEquals(57466800, balance); + Assert.assertEquals(624668 * Constant.SUN_PER_ENERGY, + balance + energy * Constant.SUN_PER_ENERGY); } @Test - public void testSuccessNoBandWidth() { - try { - byte[] contractAddress = createContract(); - TriggerSmartContract triggerContract = TvmTestUtils.createTriggerContract(contractAddress, - "fibonacciNotify(uint256)", "50", false, - 0, Commons.decodeFromBase58Check(TriggerOwnerTwoAddress)); - Transaction transaction = Transaction.newBuilder().setRawData(raw.newBuilder().addContract( - Contract.newBuilder().setParameter(Any.pack(triggerContract)) - .setType(ContractType.TriggerSmartContract)).setFeeLimit(1000000000)).build(); - TransactionCapsule trxCap = new TransactionCapsule(transaction); - trxCap.setResultCode(contractResult.SUCCESS); - TransactionTrace trace = new TransactionTrace(trxCap, StoreFactory.getInstance(), - new RuntimeImpl()); - dbManager.consumeBandwidth(trxCap, trace); - long bandWidth = trxCap.getSerializedSize() + Constant.MAX_RESULT_SIZE_IN_TX; - trace.init(null); - trace.exec(); - trace.finalization(); - trace.check(); - AccountCapsule triggerOwnerTwo = dbManager.getAccountStore() - .get(Commons.decodeFromBase58Check(TriggerOwnerTwoAddress)); - long balance = triggerOwnerTwo.getBalance(); - ReceiptCapsule receipt = trace.getReceipt(); - Assert.assertNull(trace.getRuntimeError()); - Assert.assertEquals(bandWidth, receipt.getNetUsage()); - Assert.assertEquals(6118, receipt.getEnergyUsageTotal()); - Assert.assertEquals(6118, receipt.getEnergyUsage()); - Assert.assertEquals(0, receipt.getEnergyFee()); - Assert.assertEquals(totalBalance, - balance); - } catch (TronException | ReceiptCheckErrException e) { - Assert.assertNotNull(e); - } + public void testSuccessNoBandWidth() throws Exception { + byte[] contractAddress = createContract(); + TriggerSmartContract triggerContract = TvmTestUtils.createTriggerContract(contractAddress, + "fibonacciNotify(uint256)", "50", false, + 0, Commons.decodeFromBase58Check(TriggerOwnerTwoAddress)); + Transaction transaction = Transaction.newBuilder().setRawData(raw.newBuilder().addContract( + Contract.newBuilder().setParameter(Any.pack(triggerContract)) + .setType(ContractType.TriggerSmartContract)).setFeeLimit(1000000000)).build(); + TransactionCapsule trxCap = new TransactionCapsule(transaction); + trxCap.setResultCode(contractResult.SUCCESS); + TransactionTrace trace = new TransactionTrace(trxCap, StoreFactory.getInstance(), + new RuntimeImpl()); + dbManager.consumeBandwidth(trxCap, trace); + long bandWidth = trxCap.getInstance().toBuilder().clearRet().build().getSerializedSize() + + Constant.MAX_RESULT_SIZE_IN_TX; + trace.init(null); + trace.exec(); + trace.setResult(); + trace.check(); + trace.finalization(); + AccountCapsule triggerOwnerTwo = dbManager.getAccountStore() + .get(Commons.decodeFromBase58Check(TriggerOwnerTwoAddress)); + long balance = triggerOwnerTwo.getBalance(); + ReceiptCapsule receipt = trace.getReceipt(); + Assert.assertNull(trace.getRuntimeError()); + Assert.assertEquals(bandWidth, receipt.getNetUsage()); + Assert.assertEquals(6118, receipt.getEnergyUsageTotal()); + Assert.assertEquals(6118, receipt.getEnergyUsage()); + Assert.assertEquals(0, receipt.getEnergyFee()); + Assert.assertEquals(totalBalance, balance); } private byte[] createContract() @@ -231,7 +233,8 @@ private byte[] createContract() 100); Transaction transaction = Transaction.newBuilder().setRawData(raw.newBuilder().addContract( Contract.newBuilder().setParameter(Any.pack(smartContract)) - .setType(ContractType.CreateSmartContract)).setFeeLimit(1000000000)).build(); + .setType(ContractType.CreateSmartContract)).setFeeLimit(1000000000) + .setTimestamp(TRANSACTION_TIMESTAMP.incrementAndGet())).build(); TransactionCapsule trxCap = new TransactionCapsule(transaction); trxCap.setResultCode(contractResult.SUCCESS); TransactionTrace trace = new TransactionTrace(trxCap, StoreFactory.getInstance(), @@ -240,8 +243,9 @@ private byte[] createContract() trace.init(null); trace.exec(); - trace.finalization(); + trace.setResult(); trace.check(); + trace.finalization(); owner = dbManager.getAccountStore() .get(Commons.decodeFromBase58Check(OwnerAddress)); @@ -254,10 +258,7 @@ private byte[] createContract() Assert .assertEquals(88529 * Constant.SUN_PER_ENERGY, balance + energy * Constant.SUN_PER_ENERGY); - if (trace.getRuntimeError() != null) { - return trace.getRuntimeResult().getContractAddress(); - } return trace.getRuntimeResult().getContractAddress(); } -} \ No newline at end of file +} diff --git a/framework/src/test/java/org/tron/common/runtime/vm/BatchValidateSignContractTest.java b/framework/src/test/java/org/tron/common/runtime/vm/BatchValidateSignContractTest.java index 8849e114c94..e902ee463b7 100644 --- a/framework/src/test/java/org/tron/common/runtime/vm/BatchValidateSignContractTest.java +++ b/framework/src/test/java/org/tron/common/runtime/vm/BatchValidateSignContractTest.java @@ -220,7 +220,7 @@ Pair validateMultiSign(byte[] hash, List signatures, long maxExecutionTime = 2000; // ms contract.setVmShouldEndInUs(System.nanoTime() / 1000 + maxExecutionTime * 1000); Pair ret = contract.execute(input); - logger.info("BytesArray:{},HexString:{}", Arrays.toString(ret.getValue()), + logger.info("BytesArray:{}, HexString:{}", Arrays.toString(ret.getValue()), Hex.toHexString(ret.getValue())); return ret; } diff --git a/framework/src/test/java/org/tron/common/runtime/vm/DataWordTest.java b/framework/src/test/java/org/tron/common/runtime/vm/DataWordTest.java index 172e3f17f1b..19d49886ec5 100644 --- a/framework/src/test/java/org/tron/common/runtime/vm/DataWordTest.java +++ b/framework/src/test/java/org/tron/common/runtime/vm/DataWordTest.java @@ -19,6 +19,7 @@ package org.tron.common.runtime.vm; import static org.apache.commons.lang3.ArrayUtils.isNotEmpty; +import static org.junit.Assert.assertArrayEquals; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertFalse; import static org.junit.Assert.assertNotEquals; @@ -38,59 +39,6 @@ @Slf4j public class DataWordTest { - private static BigInteger pow(BigInteger x, BigInteger y) { - if (y.compareTo(BigInteger.ZERO) < 0) { - throw new IllegalArgumentException(); - } - BigInteger z = x; // z will successively become x^2, x^4, x^8, x^16, - // x^32... - BigInteger result = BigInteger.ONE; - byte[] bytes = y.toByteArray(); - for (int i = bytes.length - 1; i >= 0; i--) { - byte bits = bytes[i]; - for (int j = 0; j < 8; j++) { - if ((bits & 1) != 0) { - result = result.multiply(z); - } - // short cut out if there are no more bits to handle: - if ((bits >>= 1) == 0 && i == 0) { - return result; - } - z = z.multiply(z); - } - } - return result; - } - - @Test - public void testAddPerformance() { - boolean enabled = false; - - if (enabled) { - byte[] one = new byte[]{0x01, 0x31, 0x54, 0x41, 0x01, 0x31, 0x54, 0x41, 0x01, 0x31, 0x54, - 0x41, 0x01, 0x31, 0x54, 0x41, 0x01, 0x31, 0x54, 0x41, 0x01, 0x31, 0x54, 0x41, 0x01, 0x31, - 0x54, 0x41, 0x01, 0x31, 0x54, 0x41}; // Random value - - int ITERATIONS = 10000000; - - long now1 = System.currentTimeMillis(); - for (int i = 0; i < ITERATIONS; i++) { - DataWord x = new DataWord(one); - x.add(x); - } - logger.info("Add1: " + (System.currentTimeMillis() - now1) + "ms"); - - long now2 = System.currentTimeMillis(); - for (int i = 0; i < ITERATIONS; i++) { - DataWord x = new DataWord(one); - x.add2(x); - } - logger.info("Add2: " + (System.currentTimeMillis() - now2) + "ms"); - } else { - logger.info("ADD performance test is disabled."); - } - } - @Test public void testAdd2() { byte[] two = new byte[32]; @@ -102,7 +50,7 @@ public void testAdd2() { DataWord y = new DataWord(two); y.add2(new DataWord(two)); - logger.info(Hex.toHexString(y.getData())); + assertArrayEquals(x.getData(), y.getData()); } @Test @@ -228,14 +176,13 @@ public void testSDivNegative() { @Test public void testPow() { + BigInteger base = BigInteger.valueOf(Integer.MAX_VALUE); + BigInteger exponent = BigInteger.valueOf(1000); + DataWord result = new DataWord(base.toByteArray()); - BigInteger x = BigInteger.valueOf(Integer.MAX_VALUE); - BigInteger y = BigInteger.valueOf(1000); + result.exp(new DataWord(exponent.toByteArray())); - BigInteger result1 = x.modPow(x, y); - BigInteger result2 = pow(x, y); - logger.info(result1.toString()); - logger.info(result2.toString()); + assertEquals(base.modPow(exponent, DataWord._2_256), result.value()); } @Test diff --git a/framework/src/test/java/org/tron/common/runtime/vm/EnergyWhenAssertStyleTest.java b/framework/src/test/java/org/tron/common/runtime/vm/EnergyWhenAssertStyleTest.java index 196efc7065f..bff1a1330f5 100644 --- a/framework/src/test/java/org/tron/common/runtime/vm/EnergyWhenAssertStyleTest.java +++ b/framework/src/test/java/org/tron/common/runtime/vm/EnergyWhenAssertStyleTest.java @@ -18,7 +18,6 @@ import org.tron.core.store.StoreFactory; import org.tron.core.vm.program.Program.IllegalOperationException; import org.tron.core.vm.program.Program.OutOfMemoryException; -import org.tron.core.vm.program.Program.PrecompiledContractException; import org.tron.core.vm.repository.RepositoryImpl; import org.tron.protos.Protocol.AccountType; @@ -437,76 +436,6 @@ public void assertTest() } - // pragma solidity ^0.4.0; - // - // contract TronNative{ - // - // address public voteContractAddress= 0x10001; - // - // function voteForSingleWitness (address witnessAddr, uint256 voteValue) public{ - // if (!voteContractAddress.delegatecall(witnessAddr,voteValue)){ - // revert(); - // } - // } - // - // - // } - - //@Test - public void systemPrecompileTest() - throws ContractExeException, ReceiptCheckErrException, - ContractValidateException, VMIllegalException { - long value = 0; - long feeLimit = 1_000_000_000L; // sun - long consumeUserResourcePercent = 100; - - String contractName = "test"; - byte[] address = Hex.decode(OWNER_ADDRESS); - String ABI = "[{\"constant\":true,\"inputs\":[],\"name\":\"voteContractAddress\",\"outputs\":" - + "[{\"name\":\"\",\"type\":\"address\"}],\"payable\":false,\"stateMutability\":\"view\"," - + "\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"witnessAddr\",\"" - + "type\":\"address\"},{\"name\":\"voteValue\",\"type\":\"uint256\"}],\"name\":\"" - + "voteForSingleWitness\",\"outputs\":[],\"payable\":false,\"stateMutability\":\"" - + "nonpayable\",\"type\":\"function\"}]"; - String code = "608060405260008054600160a060020a0319166201000117905534801561002557600080fd5b506" - + "10159806100356000396000f30060806040526004361061004b5763ffffffff7c0100000000000000000000" - + "000000000000000000000000000000000000600035041663906fbec98114610050578063cee14bb41461008" - + "e575b600080fd5b34801561005c57600080fd5b506100656100c1565b6040805173ffffffffffffffffffff" - + "ffffffffffffffffffff9092168252519081900360200190f35b34801561009a57600080fd5b506100bf73f" - + "fffffffffffffffffffffffffffffffffffffff600435166024356100dd565b005b60005473ffffffffffff" - + "ffffffffffffffffffffffffffff1681565b600080546040805173fffffffffffffffffffffffffffffffff" - + "fffffff868116825260208201869052825193169381830193909290918290030181855af491505015156101" - + "2957600080fd5b50505600a165627a7a723058206090aa7a8ac0e45fac642652417495e81dad6f1592343bf" - + "f8cfe97f61cf74e880029"; - - TVMTestResult result = TvmTestUtils - .deployContractAndReturnTvmTestResult(contractName, address, ABI, code, value, feeLimit, - consumeUserResourcePercent, null, dbManager, null); - - long expectEnergyUsageTotal = 89214; - Assert.assertEquals(result.getReceipt().getEnergyUsageTotal(), expectEnergyUsageTotal); - Assert.assertEquals(dbManager.getAccountStore().get(address).getBalance(), - totalBalance - expectEnergyUsageTotal * 100); - byte[] contractAddress = result.getContractAddress(); - - String params = - Hex.toHexString(new DataWord(new DataWord(contractAddress).getLast20Bytes()).getData()) - + "0000000000000000000000000000000000000000000000000000000000000003"; - - byte[] triggerData = TvmTestUtils.parseAbi("voteForSingleWitness(address,uint256)", params); - result = TvmTestUtils - .triggerContractAndReturnTvmTestResult(Hex.decode(OWNER_ADDRESS), contractAddress, - triggerData, 0, feeLimit, dbManager, null); - - long expectEnergyUsageTotal2 = feeLimit / 100; - Assert.assertEquals(result.getReceipt().getEnergyUsageTotal(), expectEnergyUsageTotal2); - Assert.assertFalse(result.getRuntime().getResult().isRevert()); - Assert.assertTrue( - result.getRuntime().getResult().getException() instanceof PrecompiledContractException); - Assert.assertEquals(dbManager.getAccountStore().get(address).getBalance(), - totalBalance - (expectEnergyUsageTotal + expectEnergyUsageTotal2) * 100); - } - // pragma solidity ^0.4.0; // // contract TestMemContract{ @@ -563,4 +492,3 @@ public void outOfMemTest() } } - diff --git a/framework/src/test/java/org/tron/common/runtime/vm/EnergyWhenTimeoutStyleTest.java b/framework/src/test/java/org/tron/common/runtime/vm/EnergyWhenTimeoutStyleTest.java index 60a9bd8a604..f5e766d3cb4 100644 --- a/framework/src/test/java/org/tron/common/runtime/vm/EnergyWhenTimeoutStyleTest.java +++ b/framework/src/test/java/org/tron/common/runtime/vm/EnergyWhenTimeoutStyleTest.java @@ -80,13 +80,8 @@ public void endlessLoopTest() TVMTestResult result = deployEndlessLoopContract(value, feeLimit, consumeUserResourcePercent); - if (null != result.getRuntime().getResult().getException()) { - long expectEnergyUsageTotal = feeLimit / 100; - Assert.assertEquals(result.getReceipt().getEnergyUsageTotal(), expectEnergyUsageTotal); - Assert.assertEquals(dbManager.getAccountStore().get(address).getBalance(), - totalBalance - expectEnergyUsageTotal * 100); - return; - } + Assert.assertNull("contract deployment must succeed before testing the endless-loop call", + result.getRuntime().getResult().getException()); long expectEnergyUsageTotal = 55107; Assert.assertEquals(result.getReceipt().getEnergyUsageTotal(), expectEnergyUsageTotal); Assert.assertEquals(dbManager.getAccountStore().get(address).getBalance(), diff --git a/framework/src/test/java/org/tron/common/runtime/vm/InternalTransactionCallTest.java b/framework/src/test/java/org/tron/common/runtime/vm/InternalTransactionCallTest.java index 24c81295423..bc0773951b7 100644 --- a/framework/src/test/java/org/tron/common/runtime/vm/InternalTransactionCallTest.java +++ b/framework/src/test/java/org/tron/common/runtime/vm/InternalTransactionCallTest.java @@ -231,12 +231,6 @@ public void callCodeTest() "0000000000000000000000000000000000000000000000000000000000000000"); } - @Test - public void staticCallTest() { - //TODO: need to implement this - } - - // Just for the AB example above public byte[] deployAContractandGetItsAddress() throws ContractExeException, ReceiptCheckErrException, ContractValidateException, diff --git a/framework/src/test/java/org/tron/common/runtime/vm/IstanbulTest.java b/framework/src/test/java/org/tron/common/runtime/vm/IstanbulTest.java index df3333539a7..c0c5d8504b5 100644 --- a/framework/src/test/java/org/tron/common/runtime/vm/IstanbulTest.java +++ b/framework/src/test/java/org/tron/common/runtime/vm/IstanbulTest.java @@ -16,6 +16,31 @@ public class IstanbulTest extends VMTestBase { + private boolean savedAllowTvmTransferTrc10; + private boolean savedAllowTvmConstantinople; + private boolean savedAllowTvmSolidity059; + private boolean savedAllowTvmIstanbul; + + @Override + protected void afterInit() { + super.afterInit(); + VMConfig.clearLocalSnapshot(); + savedAllowTvmTransferTrc10 = VMConfig.allowTvmTransferTrc10(); + savedAllowTvmConstantinople = VMConfig.allowTvmConstantinople(); + savedAllowTvmSolidity059 = VMConfig.allowTvmSolidity059(); + savedAllowTvmIstanbul = VMConfig.allowTvmIstanbul(); + } + + @Override + protected void beforeDestroy() { + VMConfig.clearLocalSnapshot(); + VMConfig.initAllowTvmTransferTrc10(savedAllowTvmTransferTrc10 ? 1 : 0); + VMConfig.initAllowTvmConstantinople(savedAllowTvmConstantinople ? 1 : 0); + VMConfig.initAllowTvmSolidity059(savedAllowTvmSolidity059 ? 1 : 0); + VMConfig.initAllowTvmIstanbul(savedAllowTvmIstanbul ? 1 : 0); + ConfigLoader.disable = false; + } + /* pragma solidity ^0.5.12; diff --git a/framework/src/test/java/org/tron/common/runtime/vm/OperationsTest.java b/framework/src/test/java/org/tron/common/runtime/vm/OperationsTest.java index a1627f4f2e2..619b5e4f91d 100644 --- a/framework/src/test/java/org/tron/common/runtime/vm/OperationsTest.java +++ b/framework/src/test/java/org/tron/common/runtime/vm/OperationsTest.java @@ -767,6 +767,7 @@ public void testPushDupSwapAndLogOperations() throws ContractValidateException { @Test public void testCallOperations() throws ContractValidateException { invoke = new ProgramInvokeMockImpl(); + invoke.setEnergyLimit(10000); Protocol.Transaction trx = Protocol.Transaction.getDefaultInstance(); InternalTransaction interTrx = new InternalTransaction(trx, InternalTransaction.TrxType.TRX_UNKNOWN_TYPE); @@ -774,18 +775,26 @@ public void testCallOperations() throws ContractValidateException { byte prePrefixByte = DecodeUtil.addressPreFixByte; DecodeUtil.addressPreFixByte = Constant.ADD_PRE_FIX_BYTE_MAINNET; VMConfig.initAllowTvmSelfdestructRestriction(1); - - program = new Program(new byte[0], new byte[0], invoke, interTrx); - MessageCall messageCall = new MessageCall( - Op.CALL, new DataWord(10000), - DataWord.ZERO(), DataWord.ZERO(), - DataWord.ZERO(), DataWord.ZERO(), - DataWord.ZERO(), DataWord.ZERO(), - DataWord.ZERO(), false); - program.callToPrecompiledAddress(messageCall, new PrecompiledContracts.ECRecover()); - - DecodeUtil.addressPreFixByte = prePrefixByte; - VMConfig.initAllowTvmSelfdestructRestriction(0); + try { + program = new Program(new byte[0], new byte[0], invoke, interTrx); + MessageCall messageCall = new MessageCall( + Op.CALL, new DataWord(10000), + DataWord.ZERO(), DataWord.ZERO(), + DataWord.ZERO(), DataWord.ZERO(), + DataWord.ZERO(), DataWord.ZERO(), + DataWord.ZERO(), false); + // CALL precharges the forwarded energy before invoking a precompile. + program.spendEnergy(10000, "precompiled call"); + program.callToPrecompiledAddress(messageCall, new PrecompiledContracts.ECRecover()); + + Assert.assertEquals(DataWord.ONE(), program.getStack().pop()); + Assert.assertEquals(3000, program.getResult().getEnergyUsed()); + Assert.assertEquals(DataWord.ZERO(), program.getReturnDataBufferSize()); + Assert.assertNull(program.getResult().getException()); + } finally { + DecodeUtil.addressPreFixByte = prePrefixByte; + VMConfig.initAllowTvmSelfdestructRestriction(0); + } } @Test @@ -1166,10 +1175,11 @@ public void testSuicideCost() throws ContractValidateException { @Test public void testSuicideAction() throws ContractValidateException { + byte[] contractAddress = Hex.decode("41471fd3ad3e9eeadeec4608b92d16ce6b500704cc"); invoke = new ProgramInvokeMockImpl( StoreFactory.getInstance(), new byte[0], - Hex.decode("41471fd3ad3e9eeadeec4608b92d16ce6b500704cc")); + contractAddress); program = new Program(null, null, invoke, new InternalTransaction( @@ -1179,12 +1189,25 @@ public void testSuicideAction() throws ContractValidateException { VMConfig.initAllowEnergyAdjustment(1); byte prePrefixByte = DecodeUtil.addressPreFixByte; DecodeUtil.addressPreFixByte = Constant.ADD_PRE_FIX_BYTE_MAINNET; - - program.suicide(new DataWord( - dbManager.getAccountStore().getBlackhole().getAddress().toByteArray())); - - DecodeUtil.addressPreFixByte = prePrefixByte; - VMConfig.initAllowEnergyAdjustment(0); + try { + byte[] blackHoleAddress = dbManager.getAccountStore().getBlackhole() + .getAddress().toByteArray(); + program.suicide(new DataWord(blackHoleAddress)); + + Assert.assertTrue(program.getResult().getDeleteAccounts() + .contains(new DataWord(contractAddress))); + Assert.assertEquals(1, program.getResult().getInternalTransactions().size()); + InternalTransaction suicideTransaction = + program.getResult().getInternalTransactions().get(0); + Assert.assertEquals("suicide", suicideTransaction.getNote()); + Assert.assertArrayEquals(contractAddress, suicideTransaction.getSender()); + Assert.assertArrayEquals(blackHoleAddress, suicideTransaction.getTransferToAddress()); + Assert.assertEquals(0, suicideTransaction.getValue()); + Assert.assertFalse(suicideTransaction.isRejected()); + } finally { + DecodeUtil.addressPreFixByte = prePrefixByte; + VMConfig.initAllowEnergyAdjustment(0); + } } @Test diff --git a/framework/src/test/java/org/tron/common/runtime/vm/PrecompiledContractsTest.java b/framework/src/test/java/org/tron/common/runtime/vm/PrecompiledContractsTest.java index d5a50ea4f9d..3dbee7102da 100644 --- a/framework/src/test/java/org/tron/common/runtime/vm/PrecompiledContractsTest.java +++ b/framework/src/test/java/org/tron/common/runtime/vm/PrecompiledContractsTest.java @@ -167,126 +167,6 @@ private PrecompiledContract createPrecompiledContract(DataWord addr, String owne return contract; } - //@Test - public void voteWitnessNativeTest() - throws NoSuchMethodException, IllegalAccessException, InvocationTargetException, - InstantiationException, ContractValidateException, ContractExeException { - PrecompiledContract contract = createPrecompiledContract(voteContractAddr, OWNER_ADDRESS); - Repository deposit = RepositoryImpl.createRoot(StoreFactory.getInstance()); - byte[] witnessAddressBytes = new byte[32]; - byte[] witnessAddressBytes21 = Hex.decode(WITNESS_ADDRESS); - System.arraycopy(witnessAddressBytes21, 0, witnessAddressBytes, - witnessAddressBytes.length - witnessAddressBytes21.length, - witnessAddressBytes21.length); - - DataWord voteCount = new DataWord( - "0000000000000000000000000000000000000000000000000000000000000001"); - byte[] voteCountBytes = voteCount.getData(); - byte[] data = new byte[witnessAddressBytes.length + voteCountBytes.length]; - System.arraycopy(witnessAddressBytes, 0, data, 0, witnessAddressBytes.length); - System.arraycopy(voteCountBytes, 0, data, witnessAddressBytes.length, - voteCountBytes.length); - - long frozenBalance = 1_000_000_000_000L; - long duration = 3; - Any freezeContract = getFreezeContract(OWNER_ADDRESS, frozenBalance, duration); - Constructor constructor = - FreezeBalanceActuator.class - .getDeclaredConstructor(Any.class, dbManager.getClass()); - constructor.setAccessible(true); - FreezeBalanceActuator freezeBalanceActuator = constructor - .newInstance(freezeContract, dbManager); - - TransactionResultCapsule ret = new TransactionResultCapsule(); - freezeBalanceActuator.validate(); - freezeBalanceActuator.execute(ret); - contract.setRepository(deposit); - Boolean result = contract.execute(data).getLeft(); - deposit.commit(); - Assert.assertEquals(1, - dbManager.getAccountStore().get(ByteArray.fromHexString(OWNER_ADDRESS)).getVotesList() - .get(0).getVoteCount()); - Assert.assertArrayEquals(ByteArray.fromHexString(WITNESS_ADDRESS), - dbManager.getAccountStore().get(ByteArray.fromHexString(OWNER_ADDRESS)).getVotesList() - .get(0).getVoteAddress().toByteArray()); - Assert.assertEquals(true, result); - } - - //@Test - public void proposalTest() { - - try { - /* - * create proposal Test - */ - DataWord key = new DataWord( - "0000000000000000000000000000000000000000000000000000000000000000"); - // 1000000 == 0xF4240 - DataWord value = new DataWord( - "00000000000000000000000000000000000000000000000000000000000F4240"); - byte[] data4Create = new byte[64]; - System.arraycopy(key.getData(), 0, data4Create, 0, key.getData().length); - System - .arraycopy(value.getData(), 0, data4Create, - key.getData().length, value.getData().length); - PrecompiledContract createContract = createPrecompiledContract(proposalCreateAddr, - WITNESS_ADDRESS); - - Assert.assertEquals(0, dbManager.getDynamicPropertiesStore().getLatestProposalNum()); - ProposalCapsule proposalCapsule; - Repository deposit1 = RepositoryImpl.createRoot(StoreFactory.getInstance()); - createContract.setRepository(deposit1); - byte[] idBytes = createContract.execute(data4Create).getRight(); - long id = ByteUtil.byteArrayToLong(idBytes); - deposit1.commit(); - proposalCapsule = dbManager.getProposalStore().get(ByteArray.fromLong(id)); - Assert.assertNotNull(proposalCapsule); - Assert.assertEquals(1, dbManager.getDynamicPropertiesStore().getLatestProposalNum()); - Assert.assertEquals(0, proposalCapsule.getApprovals().size()); - Assert.assertEquals(1000000, proposalCapsule.getCreateTime()); - Assert.assertEquals(261200000, proposalCapsule.getExpirationTime() - ); // 2000000 + 3 * 4 * 21600000 - - - - /* - * approve proposal Test - */ - - byte[] data4Approve = new byte[64]; - DataWord isApprove = new DataWord( - "0000000000000000000000000000000000000000000000000000000000000001"); - System.arraycopy(idBytes, 0, data4Approve, 0, idBytes.length); - System.arraycopy(isApprove.getData(), 0, data4Approve, idBytes.length, - isApprove.getData().length); - PrecompiledContract approveContract = createPrecompiledContract(proposalApproveAddr, - WITNESS_ADDRESS); - Repository deposit2 = RepositoryImpl.createRoot(StoreFactory.getInstance()); - approveContract.setRepository(deposit2); - approveContract.execute(data4Approve); - deposit2.commit(); - proposalCapsule = dbManager.getProposalStore().get(ByteArray.fromLong(id)); - Assert.assertEquals(1, proposalCapsule.getApprovals().size()); - Assert.assertEquals(ByteString.copyFrom(ByteArray.fromHexString(WITNESS_ADDRESS)), - proposalCapsule.getApprovals().get(0)); - - /* - * delete proposal Test - */ - PrecompiledContract deleteContract = createPrecompiledContract(proposalDeleteAddr, - WITNESS_ADDRESS); - Repository deposit3 = RepositoryImpl.createRoot(StoreFactory.getInstance()); - deleteContract.setRepository(deposit3); - deleteContract.execute(idBytes); - deposit3.commit(); - proposalCapsule = dbManager.getProposalStore().get(ByteArray.fromLong(id)); - Assert.assertEquals(State.CANCELED, proposalCapsule.getState()); - - } catch (ItemNotFoundException e) { - Assert.fail(); - } - } - @Test public void tvmFreezeV2SwitchTest() { VMConfig.initAllowTvmFreezeV2(0L); @@ -1126,26 +1006,6 @@ public void totalAcquiredResourceTest() { Assert.assertEquals(0, ByteArray.toLong(res.getRight())); } - //@Test - public void convertFromTronBase58AddressNative() { - // 27WnTihwXsqCqpiNedWvtKCZHsLjDt4Hfmf TestNet address - DataWord word1 = new DataWord( - "3237576e54696877587371437170694e65645776744b435a48734c6a44743448"); - DataWord word2 = new DataWord( - "666d660000000000000000000000000000000000000000000000000000000000"); - - byte[] data = new byte[35]; - System.arraycopy(word1.getData(), 0, data, 0, word1.getData().length); - System.arraycopy(Arrays.copyOfRange(word2.getData(), 0, 3), 0, - data, word1.getData().length, 3); - PrecompiledContract contract = createPrecompiledContract(convertFromTronBase58AddressAddr, - WITNESS_ADDRESS); - - byte[] solidityAddress = contract.execute(data).getRight(); - Assert.assertArrayEquals(solidityAddress, - new DataWord(Hex.decode(WITNESS_ADDRESS_BASE)).getData()); - } - private static byte[] encodeMultiWord(byte[]... words) { if (words == null) { return null; diff --git a/framework/src/test/java/org/tron/common/runtime/vm/PrecompiledContractsVerifyProofTest.java b/framework/src/test/java/org/tron/common/runtime/vm/PrecompiledContractsVerifyProofTest.java index 080441bfaf4..4abb0735673 100644 --- a/framework/src/test/java/org/tron/common/runtime/vm/PrecompiledContractsVerifyProofTest.java +++ b/framework/src/test/java/org/tron/common/runtime/vm/PrecompiledContractsVerifyProofTest.java @@ -831,14 +831,10 @@ public void merkleHashCorrectTest() throws ZksnarkException { //initialize uncommitted uncommitted[0] = ByteArray.fromHexString( "0100000000000000000000000000000000000000000000000000000000000000"); - try { - for (int i = 0; i < 31; i++) { - JLibrustzcash.librustzcashMerkleHash( - new LibrustzcashParam.MerkleHashParams( - i, uncommitted[i], uncommitted[i], uncommitted[i + 1])); - } - } catch (Throwable any) { - any.printStackTrace(); + for (int i = 0; i < 31; i++) { + JLibrustzcash.librustzcashMerkleHash( + new LibrustzcashParam.MerkleHashParams( + i, uncommitted[i], uncommitted[i], uncommitted[i + 1])); } for (int cnt = 0; cnt < totalCountNum; cnt++) { SpendingKey sk = SpendingKey.random(); diff --git a/framework/src/test/java/org/tron/common/runtime/vm/TransferToAccountTest.java b/framework/src/test/java/org/tron/common/runtime/vm/TransferToAccountTest.java index 0cbdd43c3a1..7f24484470d 100644 --- a/framework/src/test/java/org/tron/common/runtime/vm/TransferToAccountTest.java +++ b/framework/src/test/java/org/tron/common/runtime/vm/TransferToAccountTest.java @@ -3,6 +3,7 @@ import com.google.protobuf.ByteString; import lombok.extern.slf4j.Slf4j; import org.bouncycastle.util.encoders.Hex; +import org.junit.After; import org.junit.Assert; import org.junit.Before; import org.junit.Test; @@ -31,6 +32,7 @@ import org.tron.core.exception.VMIllegalException; import org.tron.core.store.StoreFactory; import org.tron.core.vm.EnergyCost; +import org.tron.core.vm.config.VMConfig; import org.tron.core.vm.repository.RepositoryImpl; import org.tron.protos.Protocol.AccountType; import org.tron.protos.Protocol.Transaction; @@ -74,6 +76,11 @@ public void before() { ownerCapsule.setBalance(1000_1000_1000L); } + @After + public void clearVmConfigLocalSnapshot() { + VMConfig.clearLocalSnapshot(); + } + private long createAsset(String tokenName) { chainBaseManager.getDynamicPropertiesStore().saveAllowSameTokenName(1); chainBaseManager.getDynamicPropertiesStore().saveAllowTvmTransferTrc10(1); diff --git a/framework/src/test/java/org/tron/common/runtime/vm/ValidateMultiSignContractTest.java b/framework/src/test/java/org/tron/common/runtime/vm/ValidateMultiSignContractTest.java index d7ccab73bd9..c550998608c 100644 --- a/framework/src/test/java/org/tron/common/runtime/vm/ValidateMultiSignContractTest.java +++ b/framework/src/test/java/org/tron/common/runtime/vm/ValidateMultiSignContractTest.java @@ -270,7 +270,7 @@ Pair validateMultiSign(String address, int permissionId, byte[] Pair ret = contract.execute(input); - logger.info("BytesArray:{},HexString:{}", Arrays.toString(ret.getValue()), + logger.info("BytesArray:{}, HexString:{}", Arrays.toString(ret.getValue()), Hex.toHexString(ret.getValue())); return ret; } diff --git a/framework/src/test/java/org/tron/common/storage/CheckOrInitEngineTest.java b/framework/src/test/java/org/tron/common/storage/CheckOrInitEngineTest.java index 90aac10c0b6..b6461079cc6 100644 --- a/framework/src/test/java/org/tron/common/storage/CheckOrInitEngineTest.java +++ b/framework/src/test/java/org/tron/common/storage/CheckOrInitEngineTest.java @@ -4,6 +4,8 @@ import static org.junit.Assert.assertThrows; import static org.junit.Assert.assertTrue; import static org.mockito.Mockito.mockStatic; +import static org.mockito.Mockito.never; +import static org.mockito.Mockito.times; import static org.tron.core.db.common.DbSourceInter.ENGINE_FILE; import static org.tron.core.db.common.DbSourceInter.ENGINE_KEY; import static org.tron.core.db.common.DbSourceInter.LEVELDB; @@ -162,6 +164,12 @@ public void testSuccessfulFirstTimeInit() throws IOException { TronError.ErrCode errCode = TronError.ErrCode.LEVELDB_INIT; checkOrInitEngine(LEVELDB, dir, errCode); + + fileUtil.verify(() -> FileUtil.createDirIfNotExists(dir)); + fileUtil.verify(() -> FileUtil.createFileIfNotExists(engineFile)); + propUtil.verify(() -> PropUtil.readProperty(engineFile, ENGINE_KEY), times(2)); + strings.verify(() -> Strings.isNullOrEmpty(null)); + propUtil.verify(() -> PropUtil.writeProperty(engineFile, ENGINE_KEY, LEVELDB)); } } @@ -181,6 +189,12 @@ public void testSuccessfulExistingEngine() throws IOException { TronError.ErrCode errCode = TronError.ErrCode.ROCKSDB_INIT; checkOrInitEngine(ROCKSDB, dir, errCode); + + fileUtil.verify(() -> FileUtil.createDirIfNotExists(dir)); + fileUtil.verify(() -> FileUtil.createFileIfNotExists(engineFile)); + propUtil.verify(() -> PropUtil.readProperty(engineFile, ENGINE_KEY), times(2)); + strings.verify(() -> Strings.isNullOrEmpty(ROCKSDB)); + propUtil.verify(() -> PropUtil.writeProperty(engineFile, ENGINE_KEY, ROCKSDB), never()); } } @@ -206,6 +220,12 @@ public void testCurrentFileExistsWithNoEngineFile() throws IOException { TronError.ErrCode errCode = TronError.ErrCode.LEVELDB_INIT; checkOrInitEngine(LEVELDB, dir, errCode); + + fileUtil.verify(() -> FileUtil.createDirIfNotExists(dir)); + fileUtil.verify(() -> FileUtil.createFileIfNotExists(engineFile)); + propUtil.verify(() -> PropUtil.readProperty(engineFile, ENGINE_KEY), times(2)); + strings.verify(() -> Strings.isNullOrEmpty(LEVELDB)); + propUtil.verify(() -> PropUtil.writeProperty(engineFile, ENGINE_KEY, LEVELDB), never()); } } @@ -235,6 +255,12 @@ public void testCurrentFileExistsEngineFileExists() throws IOException { TronError.ErrCode errCode = TronError.ErrCode.ROCKSDB_INIT; checkOrInitEngine(ROCKSDB, dir, errCode); + + fileUtil.verify(() -> FileUtil.createDirIfNotExists(dir)); + fileUtil.verify(() -> FileUtil.createFileIfNotExists(engineFile)); + propUtil.verify(() -> PropUtil.readProperty(engineFile, ENGINE_KEY), times(2)); + strings.verify(() -> Strings.isNullOrEmpty(ROCKSDB)); + propUtil.verify(() -> PropUtil.writeProperty(engineFile, ENGINE_KEY, ROCKSDB), never()); } } @@ -258,6 +284,12 @@ public void testEmptyStringEngine() throws IOException { .thenReturn(true); TronError.ErrCode errCode = TronError.ErrCode.ROCKSDB_INIT; checkOrInitEngine(ROCKSDB, dir, errCode); + + fileUtil.verify(() -> FileUtil.createDirIfNotExists(dir)); + fileUtil.verify(() -> FileUtil.createFileIfNotExists(engineFile)); + propUtil.verify(() -> PropUtil.readProperty(engineFile, ENGINE_KEY), times(2)); + strings.verify(() -> Strings.isNullOrEmpty("")); + propUtil.verify(() -> PropUtil.writeProperty(engineFile, ENGINE_KEY, ROCKSDB)); } } } diff --git a/framework/src/test/java/org/tron/common/storage/leveldb/LevelDbDataSourceImplTest.java b/framework/src/test/java/org/tron/common/storage/leveldb/LevelDbDataSourceImplTest.java index 41e8749e1ec..ebed100338f 100644 --- a/framework/src/test/java/org/tron/common/storage/leveldb/LevelDbDataSourceImplTest.java +++ b/framework/src/test/java/org/tron/common/storage/leveldb/LevelDbDataSourceImplTest.java @@ -93,25 +93,25 @@ public void initDbTest() { @Test public void testCheckOrInitEngine() { - String dir = - Args.getInstance().getOutputDirectory() + Args.getInstance().getStorage().getDbDirectory(); - String enginePath = dir + File.separator + "test_engine" + File.separator + "engine.properties"; - FileUtil.createDirIfNotExists(dir + File.separator + "test_engine"); + String parentDir = Args.getInstance().getOutputDirectory(); + String databaseDir = java.nio.file.Paths.get(parentDir, + Args.getInstance().getStorage().getDbDirectory(), "test_engine").toString(); + String enginePath = java.nio.file.Paths.get(databaseDir, "engine.properties").toString(); + FileUtil.createDirIfNotExists(databaseDir); FileUtil.createFileIfNotExists(enginePath); PropUtil.writeProperty(enginePath, "ENGINE", "LEVELDB"); Assert.assertEquals("LEVELDB", PropUtil.readProperty(enginePath, "ENGINE")); LevelDbDataSourceImpl dataSource; - dataSource = new LevelDbDataSourceImpl(dir, "test_engine"); + dataSource = new LevelDbDataSourceImpl(parentDir, "test_engine"); dataSource.closeDB(); PropUtil.writeProperty(enginePath, "ENGINE", "ROCKSDB"); Assert.assertEquals("ROCKSDB", PropUtil.readProperty(enginePath, "ENGINE")); - try { - new LevelDbDataSourceImpl(dir, "test_engine"); - } catch (TronError e) { - Assert.assertEquals("Cannot open ROCKSDB database with LEVELDB engine.", e.getMessage()); - } + TronError mismatch = assertThrows(TronError.class, + () -> new LevelDbDataSourceImpl(parentDir, "test_engine")); + assertEquals(TronError.ErrCode.LEVELDB_INIT, mismatch.getErrCode()); + assertEquals("Cannot open ROCKSDB database with LEVELDB engine.", mismatch.getMessage()); } @Test diff --git a/framework/src/test/java/org/tron/common/storage/rocksdb/RocksDbDataSourceImplTest.java b/framework/src/test/java/org/tron/common/storage/rocksdb/RocksDbDataSourceImplTest.java index b0f13eb9154..7055997354f 100644 --- a/framework/src/test/java/org/tron/common/storage/rocksdb/RocksDbDataSourceImplTest.java +++ b/framework/src/test/java/org/tron/common/storage/rocksdb/RocksDbDataSourceImplTest.java @@ -79,11 +79,10 @@ public void testCheckOrInitEngine() { PropUtil.writeProperty(enginePath, "ENGINE", "LEVELDB"); Assert.assertEquals("LEVELDB", PropUtil.readProperty(enginePath, "ENGINE")); - try { - new RocksDbDataSourceImpl(dir, "test_engine"); - } catch (TronError e) { - Assert.assertEquals("Cannot open LEVELDB database with ROCKSDB engine.", e.getMessage()); - } + TronError mismatch = assertThrows(TronError.class, + () -> new RocksDbDataSourceImpl(dir, "test_engine")); + assertEquals(TronError.ErrCode.ROCKSDB_INIT, mismatch.getErrCode()); + assertEquals("Cannot open LEVELDB database with ROCKSDB engine.", mismatch.getMessage()); PropUtil.writeProperty(enginePath, "ENGINE", "ROCKSDB"); } diff --git a/framework/src/test/java/org/tron/core/TxInputUtilTest.java b/framework/src/test/java/org/tron/core/TxInputUtilTest.java index 17d0082256f..aad440724e1 100644 --- a/framework/src/test/java/org/tron/core/TxInputUtilTest.java +++ b/framework/src/test/java/org/tron/core/TxInputUtilTest.java @@ -25,14 +25,6 @@ @Slf4j public class TxInputUtilTest { - @Test - public void testNewput() { - byte[] bytes = new byte[32]; - for (int i = 0; i < bytes.length; i++) { - System.out.println("-----------" + bytes[i]); - } - } - @Test public void testNewTxInput() { byte[] txId = ByteArray diff --git a/framework/src/test/java/org/tron/core/actuator/AccountPermissionUpdateActuatorTest.java b/framework/src/test/java/org/tron/core/actuator/AccountPermissionUpdateActuatorTest.java index 250f7b9dc01..d7360a657be 100644 --- a/framework/src/test/java/org/tron/core/actuator/AccountPermissionUpdateActuatorTest.java +++ b/framework/src/test/java/org/tron/core/actuator/AccountPermissionUpdateActuatorTest.java @@ -166,7 +166,6 @@ private void processAndCheckInvalid(AccountPermissionUpdateActuator actuator, fail(failMsg); } catch (ContractValidateException | RuntimeException e) { - Assert.assertTrue(true); Assert.assertEquals(expectedMsg, e.getMessage()); } catch (ContractExeException e) { Assert.fail(); @@ -1019,4 +1018,4 @@ public void checkActiveDefaultOperations() { } -} \ No newline at end of file +} diff --git a/framework/src/test/java/org/tron/core/actuator/CreateAccountActuatorTest.java b/framework/src/test/java/org/tron/core/actuator/CreateAccountActuatorTest.java index 4cb8e639089..baeef7abb14 100755 --- a/framework/src/test/java/org/tron/core/actuator/CreateAccountActuatorTest.java +++ b/framework/src/test/java/org/tron/core/actuator/CreateAccountActuatorTest.java @@ -101,6 +101,7 @@ public void secondCreateAccount() { try { actuator.validate(); actuator.execute(ret); + Assert.fail("Expected existing account validation to fail"); } catch (ContractValidateException e) { Assert.assertTrue(e instanceof ContractValidateException); Assert.assertEquals("Account has existed", e.getMessage()); diff --git a/framework/src/test/java/org/tron/core/actuator/DelegateResourceActuatorTest.java b/framework/src/test/java/org/tron/core/actuator/DelegateResourceActuatorTest.java index e9263cc4adb..bcbdae9c2a7 100644 --- a/framework/src/test/java/org/tron/core/actuator/DelegateResourceActuatorTest.java +++ b/framework/src/test/java/org/tron/core/actuator/DelegateResourceActuatorTest.java @@ -283,15 +283,9 @@ public void testDelegateResourceWithContractAddress() { actuator.setChainBaseManager(dbManager.getChainBaseManager()).setAny( getDelegateContractForBandwidth(OWNER_ADDRESS, RECEIVER_ADDRESS, 1_000_000_000L)); - TransactionResultCapsule ret = new TransactionResultCapsule(); - try { - actuator.validate(); - actuator.execute(ret); - } catch (ContractValidateException e) { - assertEquals("Do not allow delegate resources to contract addresses", e.getMessage()); - } catch (ContractExeException e) { - fail(e.getMessage()); - } + ContractValidateException error = assertThrows(ContractValidateException.class, + actuator::validate); + assertEquals("Do not allow delegate resources to contract addresses", error.getMessage()); } @Test @@ -302,15 +296,9 @@ public void testDelegateResourceToSelf() { actuator.setChainBaseManager(dbManager.getChainBaseManager()).setAny( getDelegateContractForBandwidth(OWNER_ADDRESS, OWNER_ADDRESS, 1_000_000_000L)); - TransactionResultCapsule ret = new TransactionResultCapsule(); - try { - actuator.validate(); - actuator.execute(ret); - } catch (ContractValidateException e) { - assertEquals("receiverAddress must not be the same as ownerAddress", e.getMessage()); - } catch (ContractExeException e) { - fail(e.getMessage()); - } + ContractValidateException error = assertThrows(ContractValidateException.class, + actuator::validate); + assertEquals("receiverAddress must not be the same as ownerAddress", error.getMessage()); } @Test diff --git a/framework/src/test/java/org/tron/core/actuator/ExchangeTransactionActuatorTest.java b/framework/src/test/java/org/tron/core/actuator/ExchangeTransactionActuatorTest.java index 413e669dceb..0790b936b79 100644 --- a/framework/src/test/java/org/tron/core/actuator/ExchangeTransactionActuatorTest.java +++ b/framework/src/test/java/org/tron/core/actuator/ExchangeTransactionActuatorTest.java @@ -1745,20 +1745,19 @@ private void processAndCheckInvalid(ExchangeTransactionActuator actuator, */ @Test public void isExchangeTransactionPush() { - try { - TransactionCapsule transactionCap = new TransactionCapsule( - ExchangeTransactionContract.newBuilder() - .setOwnerAddress(ByteString.copyFrom(ByteArray.fromHexString(OWNER_ADDRESS_SECOND))) - .setExchangeId(1) - .setTokenId(ByteString.copyFrom("_".getBytes())) - .setQuant(1) - .setExpected(1) - .build(), ContractType.ExchangeTransactionContract); - dbManager.pushTransaction(transactionCap); - - } catch (Exception e) { - Assert.assertTrue(true); - } + dbManager.getDynamicPropertiesStore().saveAllowHardenExchangeCalculation(0); + TransactionCapsule transactionCap = new TransactionCapsule( + ExchangeTransactionContract.newBuilder() + .setOwnerAddress(ByteString.copyFrom(ByteArray.fromHexString(OWNER_ADDRESS_SECOND))) + .setExchangeId(1) + .setTokenId(ByteString.copyFrom("_".getBytes())) + .setQuant(1) + .setExpected(1) + .build(), ContractType.ExchangeTransactionContract); + + ContractValidateException exception = assertThrows(ContractValidateException.class, + () -> dbManager.pushTransaction(transactionCap)); + Assert.assertEquals("ExchangeTransactionContract is rejected", exception.getMessage()); } @Test diff --git a/framework/src/test/java/org/tron/core/actuator/ExchangeWithdrawActuatorTest.java b/framework/src/test/java/org/tron/core/actuator/ExchangeWithdrawActuatorTest.java index 7b38dddd746..290ef6069ad 100644 --- a/framework/src/test/java/org/tron/core/actuator/ExchangeWithdrawActuatorTest.java +++ b/framework/src/test/java/org/tron/core/actuator/ExchangeWithdrawActuatorTest.java @@ -1443,22 +1443,14 @@ public void SameTokenNameCloseNotPreciseEnough2() { } quant = 11; - actuator = new ExchangeWithdrawActuator(); - actuator.setChainBaseManager(dbManager.getChainBaseManager()).setAny(getContract( + ExchangeWithdrawActuator precisionActuator = new ExchangeWithdrawActuator(); + precisionActuator.setChainBaseManager(dbManager.getChainBaseManager()).setAny(getContract( OWNER_ADDRESS_FIRST, exchangeId, secondTokenId, quant)); - ret = new TransactionResultCapsule(); - try { - actuator.validate(); - actuator.execute(ret); - Assert.assertEquals(ret.getInstance().getRet(), code.SUCESS); - } catch (ContractValidateException e) { - Assert.assertTrue(e instanceof ContractValidateException); - Assert.assertEquals("Not precise enough", - e.getMessage()); - } catch (ContractExeException e) { - Assert.assertFalse(e instanceof ContractExeException); + ContractValidateException error = Assert.assertThrows(ContractValidateException.class, + precisionActuator::validate); + Assert.assertEquals("Not precise enough", error.getMessage()); } finally { dbManager.getExchangeStore().delete(ByteArray.fromLong(1L)); dbManager.getExchangeStore().delete(ByteArray.fromLong(2L)); @@ -1498,22 +1490,14 @@ public void SameTokenNameOpenNotPreciseEnough2() { } quant = 11; - actuator = new ExchangeWithdrawActuator(); - actuator.setChainBaseManager(dbManager.getChainBaseManager()).setAny(getContract( + ExchangeWithdrawActuator precisionActuator = new ExchangeWithdrawActuator(); + precisionActuator.setChainBaseManager(dbManager.getChainBaseManager()).setAny(getContract( OWNER_ADDRESS_FIRST, exchangeId, secondTokenId, quant)); - ret = new TransactionResultCapsule(); - try { - actuator.validate(); - actuator.execute(ret); - Assert.assertEquals(ret.getInstance().getRet(), code.SUCESS); - } catch (ContractValidateException e) { - Assert.assertTrue(e instanceof ContractValidateException); - Assert.assertEquals("Not precise enough", - e.getMessage()); - } catch (ContractExeException e) { - Assert.assertFalse(e instanceof ContractExeException); + ContractValidateException error = Assert.assertThrows(ContractValidateException.class, + precisionActuator::validate); + Assert.assertEquals("Not precise enough", error.getMessage()); } finally { dbManager.getExchangeStore().delete(ByteArray.fromLong(1L)); dbManager.getExchangeStore().delete(ByteArray.fromLong(2L)); @@ -1865,42 +1849,4 @@ public void hardenedPrecisionCheckFailsWhenImprecise() { } } - /** - * Hardened mode: subtractExact in execute() throws on underflow. - */ - @Test - public void hardenedSubtractExactUnderflow() { - dbManager.getDynamicPropertiesStore().saveAllowSameTokenName(1); - dbManager.getDynamicPropertiesStore().saveAllowHardenExchangeCalculation(1); - InitExchangeSameTokenNameActive(); - - // Corrupt account: balance < calcFee triggers subtractExact underflow - // (this is unrealistic but exercises the addExact/subtractExact path) - byte[] ownerAddress = ByteArray.fromHexString(OWNER_ADDRESS_FIRST); - AccountCapsule accountCapsule = dbManager.getAccountStore().get(ownerAddress); - accountCapsule.setBalance(0L); - dbManager.getAccountStore().put(ownerAddress, accountCapsule); - - String firstTokenId = "123"; - long firstTokenQuant = 100000000L; - ExchangeWithdrawActuator actuator = new ExchangeWithdrawActuator(); - actuator.setChainBaseManager(dbManager.getChainBaseManager()).setAny(getContract( - OWNER_ADDRESS_FIRST, 1L, firstTokenId, firstTokenQuant)); - - try { - // calcFee() returns 0 in this actuator, so this won't actually underflow. - // The test still exercises the subtractExact code path with hardened on. - actuator.validate(); - actuator.execute(new TransactionResultCapsule()); - } catch (Exception ignore) { - // any outcome is acceptable; we just need execute() exercised under hardened - } finally { - dbManager.getExchangeStore().delete(ByteArray.fromLong(1L)); - dbManager.getExchangeStore().delete(ByteArray.fromLong(2L)); - dbManager.getExchangeV2Store().delete(ByteArray.fromLong(1L)); - dbManager.getExchangeV2Store().delete(ByteArray.fromLong(2L)); - dbManager.getDynamicPropertiesStore().saveAllowHardenExchangeCalculation(0); - } - } - } diff --git a/framework/src/test/java/org/tron/core/actuator/FreezeBalanceActuatorTest.java b/framework/src/test/java/org/tron/core/actuator/FreezeBalanceActuatorTest.java index c830cd091e6..ff1cf342304 100644 --- a/framework/src/test/java/org/tron/core/actuator/FreezeBalanceActuatorTest.java +++ b/framework/src/test/java/org/tron/core/actuator/FreezeBalanceActuatorTest.java @@ -195,16 +195,10 @@ public void testFreezeDelegatedBalanceForBandwidthWithContractAddress() { actuator.setChainBaseManager(dbManager.getChainBaseManager()).setAny( getDelegatedContractForBandwidth(OWNER_ADDRESS, RECEIVER_ADDRESS, frozenBalance, duration)); - TransactionResultCapsule ret = new TransactionResultCapsule(); - - try { - actuator.validate(); - actuator.execute(ret); - } catch (ContractValidateException e) { - Assert.assertEquals("Do not allow delegate resources to contract addresses", e.getMessage()); - } catch (ContractExeException e) { - Assert.fail(); - } + ContractValidateException error = Assert.assertThrows(ContractValidateException.class, + actuator::validate); + Assert.assertEquals("Do not allow delegate resources to contract addresses", + error.getMessage()); } @Test diff --git a/framework/src/test/java/org/tron/core/actuator/MarketCancelOrderActuatorTest.java b/framework/src/test/java/org/tron/core/actuator/MarketCancelOrderActuatorTest.java index 4966ef67987..fe9acb4654c 100644 --- a/framework/src/test/java/org/tron/core/actuator/MarketCancelOrderActuatorTest.java +++ b/framework/src/test/java/org/tron/core/actuator/MarketCancelOrderActuatorTest.java @@ -483,7 +483,7 @@ public void multipleOrdersAtThisPrice1() throws Exception { .getPriceKeysList(TOKEN_ID_ONE.getBytes(), TOKEN_ID_TWO.getBytes(), 3); MarketOrderPair marketOrderPair = MarketUtils.decodeKeyToMarketPair(priceKeysList.get(0)); MarketPrice marketPrice = MarketUtils.decodeKeyToMarketPrice(priceKeysList.get(1)); - // 100:300 => 1;3 + // 100:300 => 1:3 Assert.assertEquals(1L, marketPrice.getSellTokenQuantity()); Assert.assertEquals(3L, marketPrice.getBuyTokenQuantity()); @@ -758,4 +758,4 @@ public void testGetOwnerAddress() throws InvalidProtocolBufferException { Assert.assertEquals(OWNER_ADDRESS_FIRST, ByteArray.toHexString(actuator.getOwnerAddress().toByteArray())); } -} \ No newline at end of file +} diff --git a/framework/src/test/java/org/tron/core/actuator/MarketSellAssetActuatorTest.java b/framework/src/test/java/org/tron/core/actuator/MarketSellAssetActuatorTest.java index c8eb2e66686..4c8ef002036 100644 --- a/framework/src/test/java/org/tron/core/actuator/MarketSellAssetActuatorTest.java +++ b/framework/src/test/java/org/tron/core/actuator/MarketSellAssetActuatorTest.java @@ -526,7 +526,7 @@ public void exceedMakerBuyOrderNumLimit() throws Exception { actuator.setChainBaseManager(dbManager.getChainBaseManager()).setAny(getContract( OWNER_ADDRESS_FIRST, sellTokenId, sellTokenQuant, buyTokenId, buyTokenQuant)); - String errorMessage = "Maximum number of orders exceeded,100"; + String errorMessage = "Maximum number of orders exceeded, 100"; try { actuator.validate(); fail(errorMessage); @@ -601,26 +601,26 @@ private void addOrder(String sellTokenId, long sellTokenQuant, } // execute: combination - // Trading object: + // Trading object: // abc to def // abc to trx // trx to abc - // Scenes: + // Scenes: // no buy orders before,add first sell order - // no buy orders before,add multiple sell orders, need to maintain the correct sequence - // no buy orders before,add multiple sell orders, need to maintain the correct sequence, + // no buy orders before, add multiple sell orders, need to maintain the correct sequence + // no buy orders before, add multiple sell orders, need to maintain the correct sequence, // same price - // has buy orders before,add first sell order,not match - // has buy orders and sell orders before,add sell order,not match, + // has buy orders before, add first sell order, not match + // has buy orders and sell orders before, add sell order, not match, // need to maintain the correct sequence // all match with 2 existing same price buy orders and complete all 3 orders // part match with 2 existing buy orders and complete the makers, // left enough - // left not enough and return left(Accuracy problem) + // left not enough and return left (accuracy problem) // part match with 2 existing buy orders and complete the taker, // left enough - // left not enough and return left(Accuracy problem)(not exist) + // left not enough and return left (accuracy problem) (not exist) /** * no buy orders before,add first sell order,selling TRX and buying token @@ -864,7 +864,7 @@ public void noBuyAddFirstSellOrder3() throws Exception { /** - * no buy orders before,add multiple sell orders,need to maintain the correct sequence + * no buy orders before, add multiple sell orders, need to maintain the correct sequence */ @Test public void noBuyAddMultiSellOrder1() throws Exception { @@ -950,7 +950,8 @@ public void noBuyAddMultiSellOrder1() throws Exception { /** - * no buy orders before,add multiple sell orders,need to maintain the correct sequence,same price + * No buy orders before; add multiple sell orders while maintaining the correct sequence at the + * same price. */ @Test public void noBuyAddMultiSellOrderSamePrice1() throws Exception { @@ -1038,7 +1039,7 @@ public void noBuyAddMultiSellOrderSamePrice1() throws Exception { /** - * has buy orders before,add first sell order,not match + * has buy orders before, add first sell order, not match */ @Test public void hasBuyAddFirstSellOrderNotMatch1() throws Exception { @@ -1131,7 +1132,7 @@ public void hasBuyAddFirstSellOrderNotMatch1() throws Exception { /** - * has buy orders and sell orders before,add sell order ,not match,need to maintain the sequence + * has buy orders and sell orders before, add sell order, not match, need to maintain the sequence * order */ @Test @@ -1235,61 +1236,6 @@ public void hasBuySellAddSellOrderNotMatch1() throws Exception { orderId.toByteArray()); } - // @Test - public void matchTimeTest() throws Exception { - InitAsset(); - int num = 10; - int numMatch = 20; - int k = 0; - long sum = 0; - while (k < num) { - sum += doMatchTimeTest(numMatch); - k++; - System.out.println("sum:" + sum); - } - System.out.println("time:" + sum / num); - } - - public long doMatchTimeTest(int num) throws Exception { - - MarketSellAssetActuator.setMAX_ACTIVE_ORDER_NUM(10000); - //(sell id_1 and buy id_2) - String sellTokenId = TOKEN_ID_ONE; - long sellTokenQuant = 2000L * num; - String buyTokenId = TOKEN_ID_TWO; - long buyTokenQuant = 1000L * num; - - byte[] ownerAddress = ByteArray.fromHexString(OWNER_ADDRESS_FIRST); - AccountCapsule accountCapsule = dbManager.getAccountStore().get(ownerAddress); - accountCapsule.addAssetAmountV2(sellTokenId.getBytes(), sellTokenQuant, - dbManager.getDynamicPropertiesStore(), dbManager.getAssetIssueStore()); - dbManager.getAccountStore().put(ownerAddress, accountCapsule); - Assert.assertEquals(sellTokenQuant, - (long) accountCapsule.getAssetV2MapForTest().get(sellTokenId)); - - // Initialize the order book - - //add three order(sell id_2 and buy id_1) with different price by the same account - //TOKEN_ID_TWO is twice as expensive as TOKEN_ID_ONE - for (int i = 0; i < num; i++) { - addOrder(TOKEN_ID_TWO, 1000L + i / 10, TOKEN_ID_ONE, - 2000L, OWNER_ADDRESS_SECOND); - } - - // do process - MarketSellAssetActuator actuator = new MarketSellAssetActuator(); - actuator.setChainBaseManager(dbManager.getChainBaseManager()).setAny(getContract( - OWNER_ADDRESS_FIRST, sellTokenId, sellTokenQuant, buyTokenId, buyTokenQuant)); - - TransactionResultCapsule ret = new TransactionResultCapsule(); - long l = System.nanoTime(); - actuator.validate(); - actuator.execute(ret); - // System.out.println("time:"+(System.currentTimeMillis() - l)); - return (System.nanoTime() - l); - } - - /** * all match with 2 existing same price buy orders and complete this order */ @@ -1713,7 +1659,7 @@ public void partMatchTakerBuyOrders1() throws Exception { /** * match with 2 existing buy orders and complete the maker, taker left not enough and return - * left(Accuracy problem) + * left (accuracy problem) */ @Test public void partMatchMakerLeftNotEnoughBuyOrders1() throws Exception { @@ -1882,4 +1828,4 @@ public void testGetOwnerAddress() throws InvalidProtocolBufferException { ByteArray.toHexString(actuator.getOwnerAddress().toByteArray())); } -} \ No newline at end of file +} diff --git a/framework/src/test/java/org/tron/core/actuator/SetAccountIdActuatorTest.java b/framework/src/test/java/org/tron/core/actuator/SetAccountIdActuatorTest.java index 623e223d1e7..61090f10179 100644 --- a/framework/src/test/java/org/tron/core/actuator/SetAccountIdActuatorTest.java +++ b/framework/src/test/java/org/tron/core/actuator/SetAccountIdActuatorTest.java @@ -87,7 +87,6 @@ public void rightSetAccountId() { AccountCapsule accountCapsule = dbManager.getAccountStore() .get(ByteArray.fromHexString(OWNER_ADDRESS)); Assert.assertEquals(ACCOUNT_NAME, accountCapsule.getAccountId().toStringUtf8()); - Assert.assertTrue(true); } catch (ContractValidateException e) { logger.info(e.getMessage()); Assert.assertFalse(e instanceof ContractValidateException); @@ -148,7 +147,6 @@ public void twiceUpdateAccount() { AccountCapsule accountCapsule = dbManager.getAccountStore() .get(ByteArray.fromHexString(OWNER_ADDRESS)); Assert.assertEquals(ACCOUNT_NAME, accountCapsule.getAccountId().toStringUtf8()); - Assert.assertTrue(true); } catch (ContractValidateException e) { Assert.assertFalse(e instanceof ContractValidateException); } catch (ContractExeException e) { @@ -186,7 +184,6 @@ public void nameAlreadyUsed() { AccountCapsule accountCapsule = dbManager.getAccountStore() .get(ByteArray.fromHexString(OWNER_ADDRESS)); Assert.assertEquals(ACCOUNT_NAME, accountCapsule.getAccountId().toStringUtf8()); - Assert.assertTrue(true); } catch (ContractValidateException e) { logger.info(e.getMessage()); Assert.assertFalse(e instanceof ContractValidateException); @@ -234,7 +231,6 @@ public void invalidName() { .get(ByteArray.fromHexString(OWNER_ADDRESS)); Assert.assertEquals("testname0123456789abcdefghijgklm", accountCapsule.getAccountId().toStringUtf8()); - Assert.assertTrue(true); } catch (ContractValidateException e) { Assert.assertFalse(e instanceof ContractValidateException); } catch (ContractExeException e) { @@ -257,7 +253,6 @@ public void invalidName() { .get(ByteArray.fromHexString(OWNER_ADDRESS)); Assert.assertEquals("test1111", accountCapsule.getAccountId().toStringUtf8()); - Assert.assertTrue(true); } catch (ContractValidateException e) { logger.info(e.getMessage()); Assert.assertFalse(e instanceof ContractValidateException); @@ -270,19 +265,12 @@ public void invalidName() { .get(ByteArray.fromHexString(OWNER_ADDRESS)); accountCapsule.setAccountId(ByteString.EMPTY.toByteArray()); dbManager.getAccountStore().put(accountCapsule.createDbKey(), accountCapsule); - try { - SetAccountIdActuator actuator = new SetAccountIdActuator(); - actuator.setChainBaseManager(dbManager.getChainBaseManager()) - .setAny(getContract(ByteString.EMPTY, OWNER_ADDRESS)); - actuator.validate(); - actuator.execute(ret); - Assert.assertEquals(ret.getInstance().getRet(), code.SUCESS); - } catch (ContractValidateException e) { - Assert.assertTrue(e instanceof ContractValidateException); - Assert.assertEquals("Invalid accountId", e.getMessage()); - } catch (ContractExeException e) { - Assert.assertFalse(e instanceof ContractExeException); - } + SetAccountIdActuator emptyIdActuator = new SetAccountIdActuator(); + emptyIdActuator.setChainBaseManager(dbManager.getChainBaseManager()) + .setAny(getContract(ByteString.EMPTY, OWNER_ADDRESS)); + ContractValidateException emptyIdError = Assert.assertThrows( + ContractValidateException.class, emptyIdActuator::validate); + Assert.assertEquals("Invalid accountId", emptyIdError.getMessage()); //Too long name 33 bytes accountCapsule = dbManager.getAccountStore() diff --git a/framework/src/test/java/org/tron/core/actuator/ShieldedTransferActuatorTest.java b/framework/src/test/java/org/tron/core/actuator/ShieldedTransferActuatorTest.java index 578f9f5ebed..522467d751c 100755 --- a/framework/src/test/java/org/tron/core/actuator/ShieldedTransferActuatorTest.java +++ b/framework/src/test/java/org/tron/core/actuator/ShieldedTransferActuatorTest.java @@ -268,17 +268,13 @@ public void publicAddressToShieldedAddressInvalidSign() { * no public sign */ @Test - public void publicAddressToPublicAddressNoPublicSign() { + public void publicAddressToPublicAddressNoPublicSign() throws Exception { dbManager.getDynamicPropertiesStore().saveAllowShieldedTransaction(1); - try { - TransactionCapsule transactionCap = getPublicToShieldedTransaction(); - Assert.assertTrue(dbManager.pushTransaction(transactionCap)); - } catch (ValidateSignatureException e) { - Assert.assertTrue(e instanceof ValidateSignatureException); - Assert.assertEquals("miss sig or contract", e.getMessage()); - } catch (Exception e) { - Assert.assertTrue(false); - } + TransactionCapsule transactionCap = getPublicToShieldedTransaction(); + + ValidateSignatureException error = Assert.assertThrows(ValidateSignatureException.class, + () -> dbManager.pushTransaction(transactionCap)); + Assert.assertEquals("miss sig or contract", error.getMessage()); } /** @@ -858,7 +854,7 @@ public void publicAddressToShieldAddressNoFromAddressFailure() throws ZksnarkExc } /** - * transaction has no from address,and has validate shield input + * Transaction has no from address and has a valid shielded input. */ @Test public void publicAddressAndShieldAddressToShieldAddressNoFromAddressFailure() { @@ -907,7 +903,7 @@ public void publicAddressAndShieldAddressToShieldAddressNoFromAddressFailure() { } /** - * transaction hasn't to address,and has validate shield out + * Transaction has no to address and has a valid shielded output. */ @Test public void publicAddressAToShieldAddressNoToAddressFailure() { @@ -1132,7 +1128,7 @@ public void publicAddressToShieldNoteValueFailure() { long fee = dbManager.getDynamicPropertiesStore().getShieldedTransactionFee(); dbManager.getDynamicPropertiesStore().saveAllowShieldedTransaction(1); - try { + ArithmeticException exception = Assert.assertThrows(ArithmeticException.class, () -> { ZenTransactionBuilder builder = new ZenTransactionBuilder(wallet); //From amount long fromAmount = Long.MAX_VALUE + AMOUNT + fee; @@ -1145,27 +1141,8 @@ public void publicAddressToShieldNoteValueFailure() { PaymentAddress paymentAddress = incomingViewingKey.address(DiversifierT.random()).get(); builder.addOutput(fullViewingKey.getOvk(), paymentAddress, AMOUNT, new byte[512]); builder.addOutput(fullViewingKey.getOvk(), paymentAddress, Long.MAX_VALUE, new byte[512]); - TransactionCapsule transactionCap = builder.build(); - - Contract contract = - transactionCap.getInstance().toBuilder().getRawDataBuilder().getContract(0); - ShieldedTransferActuator actuator = new ShieldedTransferActuator(); - actuator.setChainBaseManager(dbManager.getChainBaseManager()).setContract(contract) - .setTx(transactionCap); - TransactionResultCapsule ret = new TransactionResultCapsule(); - - actuator.validate(); - actuator.execute(ret); - Assert.assertTrue(false); - } catch (ArithmeticException e) { - // StrictMathWrapper.subtractExact throws ArithmeticException on overflow - Assert.assertTrue(true); - } catch (ContractValidateException e) { - Assert.assertTrue(e instanceof ContractValidateException); - Assert.assertEquals("librustzcashSaplingFinalCheck error", e.getMessage()); - } catch (Exception e) { - Assert.assertTrue(false); - } + }); + Assert.assertEquals("long overflow", exception.getMessage()); } /** @@ -1403,4 +1380,3 @@ public void shieldedTransferValidationWorksWhenApiDisabled() { } } } - 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 2d52b93a4bc..897fa3f06cf 100644 --- a/framework/src/test/java/org/tron/core/actuator/TransferActuatorTest.java +++ b/framework/src/test/java/org/tron/core/actuator/TransferActuatorTest.java @@ -121,7 +121,6 @@ public void rightTransfer() { Assert.assertEquals(owner.getBalance(), OWNER_BALANCE - AMOUNT - TRANSFER_FEE); Assert.assertEquals(toAccount.getBalance(), TO_BALANCE + AMOUNT); - Assert.assertTrue(true); } catch (ContractValidateException e) { Assert.assertFalse(e instanceof ContractValidateException); } catch (ContractExeException e) { @@ -147,7 +146,6 @@ public void perfectTransfer() { Assert.assertEquals(owner.getBalance(), 0); Assert.assertEquals(toAccount.getBalance(), TO_BALANCE + OWNER_BALANCE); - Assert.assertTrue(true); } catch (ContractValidateException e) { Assert.assertFalse(e instanceof ContractValidateException); } catch (ContractExeException e) { @@ -500,18 +498,9 @@ public void transferToSmartContractAddress() TransferActuator actuator = new TransferActuator(); actuator.setChainBaseManager(dbManager.getChainBaseManager()) .setAny(getContract(1, contractAddress)); - TransactionResultCapsule ret = new TransactionResultCapsule(); - try { - actuator.validate(); - actuator.execute(ret); - Assert.assertEquals(ret.getInstance().getRet(), code.SUCESS); - AccountCapsule owner = - dbManager.getAccountStore().get(ByteArray.fromHexString(OWNER_ADDRESS)); - AccountCapsule toAccount = - dbManager.getAccountStore().get(contractAddress); - } catch (ContractValidateException e) { - Assert.assertTrue(e.getMessage().contains("Cannot transfer")); - } + ContractValidateException error = Assert.assertThrows(ContractValidateException.class, + actuator::validate); + Assert.assertEquals("Cannot transfer TRX to a smartContract.", error.getMessage()); } } diff --git a/framework/src/test/java/org/tron/core/actuator/TransferAssetActuatorTest.java b/framework/src/test/java/org/tron/core/actuator/TransferAssetActuatorTest.java index 7da07653f1e..bdafa3fa06d 100755 --- a/framework/src/test/java/org/tron/core/actuator/TransferAssetActuatorTest.java +++ b/framework/src/test/java/org/tron/core/actuator/TransferAssetActuatorTest.java @@ -22,6 +22,7 @@ import com.google.protobuf.ByteString; import lombok.extern.slf4j.Slf4j; import org.bouncycastle.util.encoders.Hex; +import org.junit.After; import org.junit.Assert; import org.junit.Before; import org.junit.Test; @@ -70,6 +71,7 @@ public class TransferAssetActuatorTest extends BaseTest { private static final int VOTE_SCORE = 2; private static final String DESCRIPTION = "TRX"; private static final String URL = "https://tron.network"; + private long originalCreateNewAccountFee; static { Args.setParam(new String[]{"--output-directory", dbPath()}, TestConstants.TEST_CONF); @@ -87,6 +89,8 @@ public class TransferAssetActuatorTest extends BaseTest { */ @Before public void createCapsule() { + originalCreateNewAccountFee = dbManager.getDynamicPropertiesStore() + .getCreateNewAccountFeeInSystemContract(); AccountCapsule toAccountCapsule = new AccountCapsule( ByteString.copyFrom(ByteArray.fromHexString(TO_ADDRESS)), @@ -96,6 +100,12 @@ public void createCapsule() { } + @After + public void restoreCreateNewAccountFee() { + dbManager.getDynamicPropertiesStore() + .saveCreateNewAccountFeeInSystemContract(originalCreateNewAccountFee); + } + private boolean isNullOrZero(Long value) { if (null == value || value == 0) { return true; @@ -766,77 +776,68 @@ public void SameTokenNameOpenNoneExistAssetTest() { * SameTokenName close,If to account not exit, create it. */ @Test - public void SameTokenNameCloseNoExitToAccount() { + public void SameTokenNameCloseNoExitToAccount() throws Exception { createAssertBeforSameTokenNameActive(); + dbManager.getDynamicPropertiesStore().saveCreateNewAccountFeeInSystemContract(0); TransferAssetActuator actuator = new TransferAssetActuator(); actuator.setChainBaseManager(dbManager.getChainBaseManager()) .setAny(getContract(100L, OWNER_ADDRESS, NOT_EXIT_ADDRESS)); TransactionResultCapsule ret = new TransactionResultCapsule(); - try { - AccountCapsule noExitAccount = dbManager.getAccountStore() - .get(ByteArray.fromHexString(NOT_EXIT_ADDRESS)); - Assert.assertTrue(null == noExitAccount); - actuator.validate(); - actuator.execute(ret); - noExitAccount = dbManager.getAccountStore() - .get(ByteArray.fromHexString(NOT_EXIT_ADDRESS)); - Assert.assertFalse(null == noExitAccount); //Had created. - Assert.assertEquals(noExitAccount.getBalance(), 0); - actuator.execute(ret); - } catch (ContractValidateException e) { - Assert.assertTrue(e instanceof ContractValidateException); - Assert.assertEquals( - "Validate TransferAssetActuator error, insufficient fee.", e.getMessage()); - AccountCapsule owner = dbManager.getAccountStore() - .get(ByteArray.fromHexString(OWNER_ADDRESS)); - Assert.assertEquals(owner.getAssetMapForTest() - .get(ASSET_NAME).longValue(), OWNER_ASSET_BALANCE); - AccountCapsule noExitAccount = dbManager.getAccountStore() - .get(ByteArray.fromHexString(NOT_EXIT_ADDRESS)); - Assert.assertTrue(noExitAccount == null); - } catch (ContractExeException e) { - Assert.assertFalse(e instanceof ContractExeException); - } + Assert.assertNull(dbManager.getAccountStore().get(ByteArray.fromHexString(NOT_EXIT_ADDRESS))); + + actuator.validate(); + actuator.execute(ret); + + Assert.assertEquals(code.SUCESS, ret.getInstance().getRet()); + AccountCapsule owner = dbManager.getAccountStore() + .get(ByteArray.fromHexString(OWNER_ADDRESS)); + AccountCapsule createdAccount = dbManager.getAccountStore() + .get(ByteArray.fromHexString(NOT_EXIT_ADDRESS)); + Assert.assertNotNull(createdAccount); + Assert.assertEquals(0, createdAccount.getBalance()); + Assert.assertEquals(OWNER_ASSET_BALANCE - 100, + owner.getAssetMapForTest().get(ASSET_NAME).longValue()); + Assert.assertEquals(100L, + createdAccount.getAssetMapForTest().get(ASSET_NAME).longValue()); + long tokenIdNum = dbManager.getDynamicPropertiesStore().getTokenIdNum(); + Assert.assertEquals(OWNER_ASSET_BALANCE - 100, + owner.getAssetV2MapForTest().get(String.valueOf(tokenIdNum)).longValue()); + Assert.assertEquals(100L, + createdAccount.getAssetV2MapForTest().get(String.valueOf(tokenIdNum)).longValue()); } /** * SameTokenName open,If to account not exit, create it. */ @Test - public void SameTokenNameOpenNoExitToAccount() { + public void SameTokenNameOpenNoExitToAccount() throws Exception { createAssertSameTokenNameActive(); + dbManager.getDynamicPropertiesStore().saveCreateNewAccountFeeInSystemContract(0); TransferAssetActuator actuator = new TransferAssetActuator(); actuator.setChainBaseManager(dbManager.getChainBaseManager()) .setAny(getContract(100L, OWNER_ADDRESS, NOT_EXIT_ADDRESS_2)); TransactionResultCapsule ret = new TransactionResultCapsule(); - try { - AccountCapsule noExitAccount = dbManager.getAccountStore() - .get(ByteArray.fromHexString(NOT_EXIT_ADDRESS_2)); - Assert.assertTrue(null == noExitAccount); - actuator.validate(); - actuator.execute(ret); - noExitAccount = dbManager.getAccountStore() - .get(ByteArray.fromHexString(NOT_EXIT_ADDRESS_2)); - Assert.assertFalse(null == noExitAccount); //Had created. - Assert.assertEquals(noExitAccount.getBalance(), 0); - actuator.execute(ret); - } catch (ContractValidateException e) { - Assert.assertTrue(e instanceof ContractValidateException); - Assert.assertEquals( - "Validate TransferAssetActuator error, insufficient fee.", e.getMessage()); - AccountCapsule owner = dbManager.getAccountStore() - .get(ByteArray.fromHexString(OWNER_ADDRESS)); - long tokenIdNum = dbManager.getDynamicPropertiesStore().getTokenIdNum(); - Assert.assertEquals(owner.getAssetV2MapForTest() - .get(String.valueOf(tokenIdNum)).longValue(), OWNER_ASSET_BALANCE); - AccountCapsule noExitAccount = dbManager.getAccountStore() - .get(ByteArray.fromHexString(NOT_EXIT_ADDRESS_2)); - Assert.assertTrue(noExitAccount == null); - } catch (ContractExeException e) { - Assert.assertFalse(e instanceof ContractExeException); - } + Assert.assertNull(dbManager.getAccountStore().get(ByteArray.fromHexString(NOT_EXIT_ADDRESS_2))); + + actuator.validate(); + actuator.execute(ret); + + Assert.assertEquals(code.SUCESS, ret.getInstance().getRet()); + AccountCapsule owner = dbManager.getAccountStore() + .get(ByteArray.fromHexString(OWNER_ADDRESS)); + AccountCapsule createdAccount = dbManager.getAccountStore() + .get(ByteArray.fromHexString(NOT_EXIT_ADDRESS_2)); + Assert.assertNotNull(createdAccount); + Assert.assertEquals(0, createdAccount.getBalance()); + Assert.assertNull(owner.getAssetMapForTest().get(ASSET_NAME)); + Assert.assertNull(createdAccount.getAssetMapForTest().get(ASSET_NAME)); + long tokenIdNum = dbManager.getDynamicPropertiesStore().getTokenIdNum(); + Assert.assertEquals(OWNER_ASSET_BALANCE - 100, + owner.getAssetV2MapForTest().get(String.valueOf(tokenIdNum)).longValue()); + Assert.assertEquals(100L, + createdAccount.getAssetV2MapForTest().get(String.valueOf(tokenIdNum)).longValue()); } /** @@ -1411,30 +1412,12 @@ public void transferToContractAddress() TransferAssetActuator actuator = new TransferAssetActuator(); actuator.setChainBaseManager(dbManager.getChainBaseManager()) .setAny(getContract(100L, contractAddress)); - TransactionResultCapsule ret = new TransactionResultCapsule(); - try { - actuator.validate(); - actuator.execute(ret); - Assert.assertEquals(ret.getInstance().getRet(), code.SUCESS); - AccountCapsule owner = - dbManager.getAccountStore().get(ByteArray.fromHexString(OWNER_ADDRESS)); - AccountCapsule toAccount = - dbManager.getAccountStore().get(contractAddress); - // V1, data is not exist - Assert.assertNull(owner.getAssetMapForTest().get(ASSET_NAME)); - Assert.assertNull(toAccount.getAssetMapForTest().get(ASSET_NAME)); - // check V2 - long tokenIdNum = dbManager.getDynamicPropertiesStore().getTokenIdNum(); - Assert.assertEquals( - owner.getInstance().getAssetV2Map().get(String.valueOf(tokenIdNum)).longValue(), - OWNER_ASSET_BALANCE - 100); - Assert.assertEquals( - toAccount.getInstance().getAssetV2Map().get(String.valueOf(tokenIdNum)).longValue(), - 100L); - } catch (ContractValidateException e) { - Assert.assertTrue(e.getMessage().contains("Cannot transfer")); - } catch (ContractExeException e) { - Assert.assertFalse(e instanceof ContractExeException); - } + AccountCapsule contractAccount = dbManager.getAccountStore().get(contractAddress); + Assert.assertNotNull(contractAccount); + Assert.assertEquals(AccountType.Contract, contractAccount.getType()); + + ContractValidateException exception = Assert.assertThrows( + ContractValidateException.class, actuator::validate); + Assert.assertEquals("Cannot transfer asset to smartContract.", exception.getMessage()); } } diff --git a/framework/src/test/java/org/tron/core/actuator/UnfreezeBalanceActuatorTest.java b/framework/src/test/java/org/tron/core/actuator/UnfreezeBalanceActuatorTest.java index 7f74ee3fcc5..e72481bf804 100644 --- a/framework/src/test/java/org/tron/core/actuator/UnfreezeBalanceActuatorTest.java +++ b/framework/src/test/java/org/tron/core/actuator/UnfreezeBalanceActuatorTest.java @@ -962,61 +962,6 @@ public void testClearVotes() { } - /*@Test - public void InvalidTotalNetWeight(){ - long now = System.currentTimeMillis(); - dbManager.getDynamicPropertiesStore().saveLatestBlockHeaderTimestamp(now); - dbManager.getDynamicPropertiesStore().saveTotalNetWeight(smallTatalResource); - - AccountCapsule accountCapsule = dbManager.getAccountStore() - .get(ByteArray.fromHexString(OWNER_ADDRESS)); - accountCapsule.setFrozen(frozenBalance, now); - dbManager.getAccountStore().put(accountCapsule.createDbKey(), accountCapsule); - - Assert.assertTrue(frozenBalance/1000_000L > smallTatalResource ); - UnfreezeBalanceActuator actuator = new UnfreezeBalanceActuator( - getContract(OWNER_ADDRESS), dbManager); - TransactionResultCapsule ret = new TransactionResultCapsule(); - try { - actuator.validate(); - actuator.execute(ret); - - Assert.assertTrue(dbManager.getDynamicPropertiesStore().getTotalNetWeight() >= 0); - } catch (ContractValidateException e) { - Assert.assertTrue(e instanceof ContractValidateException); - } catch (ContractExeException e) { - Assert.assertTrue(e instanceof ContractExeException); - } - } - - @Test - public void InvalidTotalEnergyWeight(){ - long now = System.currentTimeMillis(); - dbManager.getDynamicPropertiesStore().saveLatestBlockHeaderTimestamp(now); - dbManager.getDynamicPropertiesStore().saveTotalEnergyWeight(smallTatalResource); - - AccountCapsule accountCapsule = dbManager.getAccountStore() - .get(ByteArray.fromHexString(OWNER_ADDRESS)); - accountCapsule.setFrozenForEnergy(frozenBalance, now); - dbManager.getAccountStore().put(accountCapsule.createDbKey(), accountCapsule); - - Assert.assertTrue(frozenBalance/1000_000L > smallTatalResource ); - UnfreezeBalanceActuator actuator = new UnfreezeBalanceActuator( - getContract(OWNER_ADDRESS, Contract.ResourceCode.ENERGY), dbManager); - TransactionResultCapsule ret = new TransactionResultCapsule(); - try { - actuator.validate(); - actuator.execute(ret); - - Assert.assertTrue(dbManager.getDynamicPropertiesStore().getTotalEnergyWeight() >= 0); - } catch (ContractValidateException e) { - Assert.assertTrue(e instanceof ContractValidateException); - } catch (ContractExeException e) { - Assert.assertTrue(e instanceof ContractExeException); - } - }*/ - - @Test public void commonErrorCheck() { UnfreezeBalanceActuator actuator = new UnfreezeBalanceActuator(); @@ -1172,4 +1117,3 @@ public void testUnfreezeBalanceForTronPowerWithOldTronPowerAfterNewResourceModel } } - diff --git a/framework/src/test/java/org/tron/core/actuator/UnfreezeBalanceV2ActuatorTest.java b/framework/src/test/java/org/tron/core/actuator/UnfreezeBalanceV2ActuatorTest.java index fd3a13990b6..93605ce3bdb 100644 --- a/framework/src/test/java/org/tron/core/actuator/UnfreezeBalanceV2ActuatorTest.java +++ b/framework/src/test/java/org/tron/core/actuator/UnfreezeBalanceV2ActuatorTest.java @@ -123,7 +123,8 @@ private Any getContractForTronPowerV2_001(String ownerAddress, long unfreezeBala } @Test - public void testUnfreezeBalanceForBandwidth() { + public void testUnfreezeBalanceForBandwidth() + throws ContractValidateException, ContractExeException { long now = System.currentTimeMillis(); dbManager.getDynamicPropertiesStore().saveLatestBlockHeaderTimestamp(now); dbManager.getDynamicPropertiesStore().saveTotalNetWeight(1000); @@ -144,29 +145,22 @@ public void testUnfreezeBalanceForBandwidth() { long totalNetWeightBefore = dbManager.getDynamicPropertiesStore().getTotalNetWeight(); - try { - actuator.validate(); - actuator.execute(ret); - Assert.assertEquals(code.SUCESS, ret.getInstance().getRet()); - AccountCapsule owner = dbManager.getAccountStore() - .get(ByteArray.fromHexString(OWNER_ADDRESS)); - - //Assert.assertEquals(owner.getBalance(), initBalance + frozenBalance); - Assert.assertEquals(100, owner.getFrozenV2BalanceForBandwidth()); - Assert.assertEquals(100L, owner.getTronPower()); - - long totalNetWeightAfter = dbManager.getDynamicPropertiesStore().getTotalNetWeight(); - Assert.assertEquals(totalNetWeightBefore - 1000, totalNetWeightAfter); + Assert.assertTrue(actuator.validate()); + Assert.assertTrue(actuator.execute(ret)); + Assert.assertEquals(code.SUCESS, ret.getInstance().getRet()); + AccountCapsule owner = dbManager.getAccountStore() + .get(ByteArray.fromHexString(OWNER_ADDRESS)); + Assert.assertEquals(100, owner.getFrozenV2BalanceForBandwidth()); + Assert.assertEquals(100L, owner.getTronPower()); - } catch (Exception e) { - Assert.assertFalse(e instanceof ContractValidateException); - Assert.assertFalse(e instanceof ContractExeException); - } + long totalNetWeightAfter = dbManager.getDynamicPropertiesStore().getTotalNetWeight(); + Assert.assertEquals(totalNetWeightBefore - 1000, totalNetWeightAfter); } @Test - public void testUnfreezeBalanceForEnergy() { + public void testUnfreezeBalanceForEnergy() + throws ContractValidateException, ContractExeException { long now = System.currentTimeMillis(); dbManager.getDynamicPropertiesStore().saveLatestBlockHeaderTimestamp(now); dbManager.getDynamicPropertiesStore().saveTotalNetWeight(1000); @@ -185,22 +179,15 @@ public void testUnfreezeBalanceForEnergy() { TransactionResultCapsule ret = new TransactionResultCapsule(); long totalEnergyWeightBefore = dbManager.getDynamicPropertiesStore().getTotalEnergyWeight(); - try { - actuator.validate(); - actuator.execute(ret); - Assert.assertEquals(code.SUCESS, ret.getInstance().getRet()); - AccountCapsule owner = dbManager.getAccountStore() - .get(ByteArray.fromHexString(OWNER_ADDRESS)); - - //Assert.assertEquals(owner.getBalance(), initBalance + frozenBalance); - Assert.assertEquals(100, owner.getAllFrozenBalanceForEnergy()); - Assert.assertEquals(100, owner.getTronPower()); - long totalEnergyWeightAfter = dbManager.getDynamicPropertiesStore().getTotalEnergyWeight(); - Assert.assertEquals(totalEnergyWeightBefore - 1000, totalEnergyWeightAfter); - } catch (Exception e) { - Assert.assertFalse(e instanceof ContractValidateException); - Assert.assertFalse(e instanceof ContractExeException); - } + Assert.assertTrue(actuator.validate()); + Assert.assertTrue(actuator.execute(ret)); + Assert.assertEquals(code.SUCESS, ret.getInstance().getRet()); + AccountCapsule owner = dbManager.getAccountStore() + .get(ByteArray.fromHexString(OWNER_ADDRESS)); + Assert.assertEquals(100, owner.getAllFrozenBalanceForEnergy()); + Assert.assertEquals(100, owner.getTronPower()); + long totalEnergyWeightAfter = dbManager.getDynamicPropertiesStore().getTotalEnergyWeight(); + Assert.assertEquals(totalEnergyWeightBefore - 1000, totalEnergyWeightAfter); } @@ -485,7 +472,7 @@ public void testUnfreezeBalanceForTronPowerWithOldTronPowerAfterNewResourceModel @Test - public void testUnfreezeBalanceForTronPowerWithOldTronPowerAfterNewResourceModelError() { + public void testUnfreezeTronPowerWithoutFrozenBalanceAfterNewResourceModel() { long now = System.currentTimeMillis(); dbManager.getDynamicPropertiesStore().saveLatestBlockHeaderTimestamp(now); dbManager.getDynamicPropertiesStore().saveAllowNewResourceModel(1L); @@ -494,22 +481,15 @@ public void testUnfreezeBalanceForTronPowerWithOldTronPowerAfterNewResourceModel AccountCapsule accountCapsule = dbManager.getAccountStore() .get(ByteArray.fromHexString(OWNER_ADDRESS)); accountCapsule.addFrozenBalanceForEnergyV2(frozenBalance); - accountCapsule.addFrozenForTronPowerV2(frozenBalance); - accountCapsule.addVotes( - ByteString.copyFrom(ByteArray.fromHexString(OWNER_ADDRESS)), 100L); - dbManager.getAccountStore().put(accountCapsule.createDbKey(), accountCapsule); + UnfreezeBalanceV2Actuator actuator = new UnfreezeBalanceV2Actuator(); actuator.setChainBaseManager(dbManager.getChainBaseManager()) .setAny(getContractForTronPowerV2(OWNER_ADDRESS, unfreezeBalance)); - TransactionResultCapsule ret = new TransactionResultCapsule(); - try { - actuator.validate(); - //Assert.fail(); - } catch (Exception e) { - Assert.assertTrue(e instanceof ContractValidateException); - } + ContractValidateException exception = Assert.assertThrows( + ContractValidateException.class, actuator::validate); + Assert.assertEquals("no frozenBalance(TronPower)", exception.getMessage()); } @@ -795,4 +775,3 @@ public void testUnfreezeBalanceUnfreezeCount() { } - diff --git a/framework/src/test/java/org/tron/core/actuator/UpdateAccountActuatorTest.java b/framework/src/test/java/org/tron/core/actuator/UpdateAccountActuatorTest.java index ab2108096dd..9de1fd27889 100755 --- a/framework/src/test/java/org/tron/core/actuator/UpdateAccountActuatorTest.java +++ b/framework/src/test/java/org/tron/core/actuator/UpdateAccountActuatorTest.java @@ -94,7 +94,6 @@ private void UpdateAccount(String accountName, String OwnerAddress) { AccountCapsule accountCapsule = dbManager.getAccountStore() .get(ByteArray.fromHexString(OwnerAddress)); Assert.assertEquals(accountName, accountCapsule.getAccountName().toStringUtf8()); - Assert.assertTrue(true); } catch (ContractValidateException e) { Assert.assertFalse(e instanceof ContractValidateException); } catch (ContractExeException e) { @@ -255,7 +254,6 @@ public void invalidName() { .get(ByteArray.fromHexString(OWNER_ADDRESS)); Assert.assertEquals("testname0123456789abcdefghijgklm", accountCapsule.getAccountName().toStringUtf8()); - Assert.assertTrue(true); } catch (ContractValidateException e) { Assert.assertFalse(e instanceof ContractValidateException); } catch (ContractExeException e) { @@ -278,26 +276,27 @@ public void invalidName() { .get(ByteArray.fromHexString(OWNER_ADDRESS)); Assert.assertEquals("testname", accountCapsule.getAccountName().toStringUtf8()); - Assert.assertTrue(true); } catch (ContractValidateException e) { Assert.assertFalse(e instanceof ContractValidateException); } catch (ContractExeException e) { Assert.assertFalse(e instanceof ContractExeException); } - //Empty name + // Empty name is allowed and clears the existing account name. try { UpdateAccountActuator actuator = new UpdateAccountActuator(); actuator.setChainBaseManager(dbManager.getChainBaseManager()) .setAny(getContract(ByteString.EMPTY, OWNER_ADDRESS)); - actuator.validate(); - actuator.execute(ret); - Assert.assertEquals(ret.getInstance().getRet(), code.SUCESS); + Assert.assertTrue(actuator.validate()); + Assert.assertTrue(actuator.execute(ret)); + Assert.assertEquals(code.SUCESS, ret.getInstance().getRet()); + accountCapsule = dbManager.getAccountStore() + .get(ByteArray.fromHexString(OWNER_ADDRESS)); + Assert.assertTrue(accountCapsule.getAccountName().isEmpty()); } catch (ContractValidateException e) { - Assert.assertTrue(e instanceof ContractValidateException); - Assert.assertEquals("Invalid accountName", e.getMessage()); + Assert.fail("Empty account name should be valid: " + e.getMessage()); } catch (ContractExeException e) { - Assert.assertFalse(e instanceof ContractExeException); + Assert.fail("Empty account name update should execute: " + e.getMessage()); } //Too long name 33 bytes try { diff --git a/framework/src/test/java/org/tron/core/actuator/UpdateAssetActuatorTest.java b/framework/src/test/java/org/tron/core/actuator/UpdateAssetActuatorTest.java index 45a956b59f3..f3eb085d353 100644 --- a/framework/src/test/java/org/tron/core/actuator/UpdateAssetActuatorTest.java +++ b/framework/src/test/java/org/tron/core/actuator/UpdateAssetActuatorTest.java @@ -245,7 +245,7 @@ public void successUpdateAssetAfterSameTokenNameActive() { actuator.validate(); actuator.execute(ret); Assert.assertEquals(ret.getInstance().getRet(), Protocol.Transaction.Result.code.SUCESS); - //V1,Data is no longer update + // V1 data is no longer updated. AssetIssueCapsule assetIssueCapsule = dbManager.getAssetIssueStore().get(ByteString.copyFromUtf8(NAME).toByteArray()); Assert.assertNull(assetIssueCapsule); diff --git a/framework/src/test/java/org/tron/core/actuator/VoteWitnessActuatorTest.java b/framework/src/test/java/org/tron/core/actuator/VoteWitnessActuatorTest.java index 9823c3aba51..fbfc832612e 100644 --- a/framework/src/test/java/org/tron/core/actuator/VoteWitnessActuatorTest.java +++ b/framework/src/test/java/org/tron/core/actuator/VoteWitnessActuatorTest.java @@ -575,7 +575,8 @@ public void voteWitnessWithoutEnoughOldTronPowerAfterNewResourceModel() { } @Test - public void voteWitnessWithOldTronPowerAfterNewResourceModel() { + public void voteWitnessWithOldTronPowerAfterNewResourceModel() + throws ContractValidateException, ContractExeException { dbManager.getDynamicPropertiesStore().saveAllowNewResourceModel(1L); @@ -589,24 +590,20 @@ public void voteWitnessWithOldTronPowerAfterNewResourceModel() { .setAny(getContract(OWNER_ADDRESS, WITNESS_ADDRESS, 1L)); TransactionResultCapsule ret = new TransactionResultCapsule(); try { - actuator.validate(); - actuator.execute(ret); + Assert.assertTrue(actuator.validate()); + Assert.assertTrue(actuator.execute(ret)); - owner = - dbManager.getAccountStore().get(ByteArray.fromHexString(OWNER_ADDRESS)); + owner = dbManager.getAccountStore().get(ByteArray.fromHexString(OWNER_ADDRESS)); Assert.assertEquals(2000000L, owner.getInstance().getOldTronPower()); - } catch (ContractValidateException e) { - e.printStackTrace(); - Assert.assertFalse(e instanceof ContractValidateException); - } catch (ContractExeException e) { - Assert.assertFalse(e instanceof ContractExeException); + } finally { + dbManager.getDynamicPropertiesStore().saveAllowNewResourceModel(0L); } - dbManager.getDynamicPropertiesStore().saveAllowNewResourceModel(0L); } @Test - public void voteWitnessWithOldAndNewTronPowerAfterNewResourceModel() { + public void voteWitnessWithOldAndNewTronPowerAfterNewResourceModel() + throws ContractValidateException, ContractExeException { dbManager.getDynamicPropertiesStore().saveAllowNewResourceModel(1L); @@ -621,21 +618,16 @@ public void voteWitnessWithOldAndNewTronPowerAfterNewResourceModel() { .setAny(getContract(OWNER_ADDRESS, WITNESS_ADDRESS, 1L)); TransactionResultCapsule ret = new TransactionResultCapsule(); try { - actuator.validate(); - actuator.execute(ret); + Assert.assertTrue(actuator.validate()); + Assert.assertTrue(actuator.execute(ret)); - owner = - dbManager.getAccountStore().get(ByteArray.fromHexString(OWNER_ADDRESS)); + owner = dbManager.getAccountStore().get(ByteArray.fromHexString(OWNER_ADDRESS)); Assert.assertEquals(3000000L, owner.getAllTronPower()); Assert.assertEquals(2000000L, owner.getInstance().getOldTronPower()); Assert.assertEquals(1000000L, owner.getInstance().getTronPower().getFrozenBalance()); - } catch (ContractValidateException e) { - e.printStackTrace(); - Assert.assertFalse(e instanceof ContractValidateException); - } catch (ContractExeException e) { - Assert.assertFalse(e instanceof ContractExeException); + } finally { + dbManager.getDynamicPropertiesStore().saveAllowNewResourceModel(0L); } - dbManager.getDynamicPropertiesStore().saveAllowNewResourceModel(0L); } @@ -659,4 +651,4 @@ public void voteWitnessWithoutEnoughOldAndNewTronPowerAfterNewResourceModel() { dbManager.getDynamicPropertiesStore().saveAllowNewResourceModel(0L); } -} \ No newline at end of file +} diff --git a/framework/src/test/java/org/tron/core/actuator/WitnessCreateActuatorTest.java b/framework/src/test/java/org/tron/core/actuator/WitnessCreateActuatorTest.java index bf146382f48..76d513a03ec 100644 --- a/framework/src/test/java/org/tron/core/actuator/WitnessCreateActuatorTest.java +++ b/framework/src/test/java/org/tron/core/actuator/WitnessCreateActuatorTest.java @@ -219,7 +219,6 @@ public void InvalidUrlTest() { dbManager.getWitnessStore().get(ByteArray.fromHexString(OWNER_ADDRESS_FIRST)); Assert.assertNotNull(witnessCapsule); Assert.assertEquals(witnessCapsule.getInstance().getUrl(), "0"); - Assert.assertTrue(true); } catch (ContractValidateException e) { Assert.assertFalse(e instanceof ContractValidateException); } catch (ContractExeException e) { @@ -239,7 +238,6 @@ public void InvalidUrlTest() { dbManager.getWitnessStore().get(ByteArray.fromHexString(OWNER_ADDRESS_FIRST)); Assert.assertNotNull(witnessCapsule); Assert.assertEquals(witnessCapsule.getInstance().getUrl(), url256Bytes); - Assert.assertTrue(true); } catch (ContractValidateException e) { Assert.assertFalse(e instanceof ContractValidateException); } catch (ContractExeException e) { @@ -323,4 +321,4 @@ public void commonErrorCheck() { actuatorTest.setNullDBManagerMsg("No account store or dynamic store!"); actuatorTest.nullDBManger(); } -} \ No newline at end of file +} diff --git a/framework/src/test/java/org/tron/core/actuator/utils/TransactionUtilTest.java b/framework/src/test/java/org/tron/core/actuator/utils/TransactionUtilTest.java index 54e611e0aac..84b0fd1e7f6 100644 --- a/framework/src/test/java/org/tron/core/actuator/utils/TransactionUtilTest.java +++ b/framework/src/test/java/org/tron/core/actuator/utils/TransactionUtilTest.java @@ -18,6 +18,7 @@ import java.nio.charset.StandardCharsets; import java.util.ArrayList; import java.util.List; +import java.util.concurrent.atomic.AtomicReference; import javax.annotation.Resource; import lombok.extern.slf4j.Slf4j; import org.junit.Assert; @@ -450,9 +451,16 @@ public void testConcurrentToString() throws InterruptedException { Transaction.Builder builder = Transaction.newBuilder(); TransactionCapsule trx = new TransactionCapsule(builder.build()); List threadList = new ArrayList<>(); + AtomicReference workerFailure = new AtomicReference<>(); int n = 10; for (int i = 0; i < n; i++) { - threadList.add(new Thread(() -> trx.toString())); + threadList.add(new Thread(() -> { + try { + trx.toString(); + } catch (Throwable t) { + workerFailure.compareAndSet(null, t); + } + })); } for (int i = 0; i < n; i++) { threadList.get(i).start(); @@ -460,7 +468,10 @@ public void testConcurrentToString() throws InterruptedException { for (int i = 0; i < n; i++) { threadList.get(i).join(); } - Assert.assertTrue(true); + if (workerFailure.get() != null) { + throw new AssertionError("Concurrent TransactionCapsule.toString() failed", + workerFailure.get()); + } } @Test diff --git a/framework/src/test/java/org/tron/core/actuator/vm/ProgramTraceListenerTest.java b/framework/src/test/java/org/tron/core/actuator/vm/ProgramTraceListenerTest.java index fc0bc502790..4166399d972 100644 --- a/framework/src/test/java/org/tron/core/actuator/vm/ProgramTraceListenerTest.java +++ b/framework/src/test/java/org/tron/core/actuator/vm/ProgramTraceListenerTest.java @@ -192,15 +192,16 @@ public void testGetSet() { programTrace.setResult("result"); programTrace.setContractAddress("contractAddress"); programTrace.setError("error"); - programTrace.result(new byte[] {}); - programTrace.error(new Exception()); - programTrace.getOps(); - programTrace.getContractAddress(); - programTrace.getError(); - programTrace.getResult(); - programTrace.toString(); - - Assert.assertTrue(true); + Assert.assertSame(programTrace, programTrace.result(new byte[] {})); + Assert.assertSame(programTrace, programTrace.error(new Exception("failure"))); + + Assert.assertSame(ops, programTrace.getOps()); + Assert.assertEquals("contractAddress", programTrace.getContractAddress()); + Assert.assertEquals("class java.lang.Exception: failure", programTrace.getError()); + Assert.assertEquals("", programTrace.getResult()); + String json = programTrace.toString(); + Assert.assertTrue(json.contains("contractAddress")); + Assert.assertTrue(json.contains("failure")); } } diff --git a/framework/src/test/java/org/tron/core/capsule/BlockCapsuleTest.java b/framework/src/test/java/org/tron/core/capsule/BlockCapsuleTest.java index b258fbf99a1..ff5b187b1ca 100644 --- a/framework/src/test/java/org/tron/core/capsule/BlockCapsuleTest.java +++ b/framework/src/test/java/org/tron/core/capsule/BlockCapsuleTest.java @@ -8,6 +8,7 @@ import java.util.ArrayList; import java.util.Arrays; import java.util.List; +import java.util.concurrent.atomic.AtomicReference; import lombok.extern.slf4j.Slf4j; import org.junit.AfterClass; import org.junit.Assert; @@ -131,33 +132,12 @@ public void testValidateMerkleRoot() throws Exception { } } - /* @Test - public void testAddTransaction() { - TransactionCapsule transactionCapsule = new TransactionCapsule("123", 1L); - blockCapsule0.addTransaction(transactionCapsule); - Assert.assertArrayEquals(blockCapsule0.getTransactions().get(0).getHash().getBytes(), - transactionCapsule.getHash().getBytes()); - Assert.assertEquals(transactionCapsule.getInstance().getRawData().getVout(0).getValue(), - blockCapsule0.getTransactions().get(0).getInstance().getRawData().getVout(0).getValue()); - } */ - @Test - public void testGetData() { - blockCapsule0.getData(); + public void testGetData() throws BadItemException { byte[] b = blockCapsule0.getData(); - BlockCapsule blockCapsule1 = null; - try { - blockCapsule1 = new BlockCapsule(b); - Assert.assertEquals(blockCapsule0.getBlockId(), blockCapsule1.getBlockId()); - } catch (BadItemException e) { - e.printStackTrace(); - } - - } - - @Test - public void testValidate() { - + BlockCapsule blockCapsule1 = new BlockCapsule(b); + Assert.assertEquals(blockCapsule0.getBlockId(), blockCapsule1.getBlockId()); + Assert.assertArrayEquals(b, blockCapsule1.getData()); } @Test @@ -280,9 +260,16 @@ public void testValidateSignatureThrowsForMalformedSignature() throws Exception @Test public void testConcurrentToString() throws InterruptedException { List threadList = new ArrayList<>(); + AtomicReference workerFailure = new AtomicReference<>(); int n = 10; for (int i = 0; i < n; i++) { - threadList.add(new Thread(() -> blockCapsule0.toString())); + threadList.add(new Thread(() -> { + try { + blockCapsule0.toString(); + } catch (Throwable t) { + workerFailure.compareAndSet(null, t); + } + })); } for (int i = 0; i < n; i++) { threadList.get(i).start(); @@ -290,7 +277,9 @@ public void testConcurrentToString() throws InterruptedException { for (int i = 0; i < n; i++) { threadList.get(i).join(); } - Assert.assertTrue(true); + if (workerFailure.get() != null) { + throw new AssertionError("Concurrent BlockCapsule.toString() failed", workerFailure.get()); + } } } diff --git a/framework/src/test/java/org/tron/core/capsule/utils/MerkleTreeTest.java b/framework/src/test/java/org/tron/core/capsule/utils/MerkleTreeTest.java index c9fea6bce45..71f23f83aa5 100644 --- a/framework/src/test/java/org/tron/core/capsule/utils/MerkleTreeTest.java +++ b/framework/src/test/java/org/tron/core/capsule/utils/MerkleTreeTest.java @@ -8,16 +8,13 @@ import java.util.List; import java.util.stream.Collectors; import java.util.stream.IntStream; -import lombok.extern.slf4j.Slf4j; import org.junit.Assert; import org.junit.Test; import org.tron.common.parameter.CommonParameter; -import org.tron.common.utils.ByteArray; import org.tron.common.utils.MerkleRoot; import org.tron.common.utils.Sha256Hash; import org.tron.core.capsule.utils.MerkleTree.Leaf; -@Slf4j public class MerkleTreeTest { private static List getHash(int hashNum) { @@ -64,8 +61,6 @@ private static void pareTree(Leaf head, List hashList, int maxRank, Assert.assertTrue(left == null); Assert.assertTrue(right == null); Assert.assertEquals(head.getHash(), hashList.get(number)); - System.out.println("curBank :" + curBank + " number :" + number); - System.out.println(ByteArray.toHexString(head.getHash().getBytes())); } } @@ -95,9 +90,7 @@ private static int getRank(int num) { */ public void test0HashNum() { List hashList = getHash(0); //Empty list. - Exception e = Assert.assertThrows(Exception.class, - () -> MerkleTree.build(hashList)); - Assert.assertTrue(e instanceof IndexOutOfBoundsException); + Assert.assertThrows(IndexOutOfBoundsException.class, () -> MerkleTree.build(hashList)); } @Test diff --git a/framework/src/test/java/org/tron/core/config/args/DynamicArgsTest.java b/framework/src/test/java/org/tron/core/config/args/DynamicArgsTest.java index 733c862e6a4..be7073b3515 100644 --- a/framework/src/test/java/org/tron/core/config/args/DynamicArgsTest.java +++ b/framework/src/test/java/org/tron/core/config/args/DynamicArgsTest.java @@ -1,6 +1,7 @@ package org.tron.core.config.args; import java.io.File; +import java.io.IOException; import org.junit.Assert; import org.junit.Test; import org.tron.common.BaseMethodTest; @@ -19,7 +20,7 @@ protected void afterInit() { } @Test - public void start() { + public void start() throws IOException { CommonParameter parameter = Args.getInstance(); Assert.assertEquals(TestConstants.TEST_CONF, Args.getConfigFilePath()); Assert.assertTrue(parameter.isDynamicConfigEnable()); @@ -34,25 +35,25 @@ public void start() { TronNetService tronNetService = context.getBean(TronNetService.class); ReflectUtils.setFieldValue(tronNetService, "p2pConfig", new P2pConfig()); File config = new File(Args.getConfigFilePath()); - if (!config.exists()) { - try { - config.createNewFile(); - } catch (Exception e) { - return; + boolean created = false; + try { + if (!config.exists()) { + created = config.createNewFile(); + Assert.assertTrue("Test configuration file was not created", created); + dynamicArgs.run(); + Assert.assertTrue("Temporary test configuration file was not deleted", config.delete()); + created = false; } - dynamicArgs.run(); + dynamicArgs.reload(); + } finally { try { - config.delete(); - } catch (Exception e) { - return; + dynamicArgs.close(); + } finally { + if (created && config.exists()) { + Assert.assertTrue("Temporary test configuration file was not deleted", + config.delete() || !config.exists()); + } } } - try { - dynamicArgs.reload(); - } catch (Exception e) { - // no need to deal with - } - - dynamicArgs.close(); } } diff --git a/framework/src/test/java/org/tron/core/config/args/WitnessTest.java b/framework/src/test/java/org/tron/core/config/args/WitnessTest.java index b73c6fdfe43..68d90b1f943 100644 --- a/framework/src/test/java/org/tron/core/config/args/WitnessTest.java +++ b/framework/src/test/java/org/tron/core/config/args/WitnessTest.java @@ -77,6 +77,7 @@ public void whenSetEmptyUrlShouldThrowIllegalArgumentException() { @Test public void setUrlRight() { witness.setUrl("afwe"); + Assert.assertEquals("afwe", witness.getUrl()); } @Test diff --git a/framework/src/test/java/org/tron/core/db/AccountStoreTest.java b/framework/src/test/java/org/tron/core/db/AccountStoreTest.java index 003c3fe4ab3..39c560f097f 100755 --- a/framework/src/test/java/org/tron/core/db/AccountStoreTest.java +++ b/framework/src/test/java/org/tron/core/db/AccountStoreTest.java @@ -100,6 +100,10 @@ public void put() { ByteString.copyFrom(accountName), AccountType.forNumber(1)); accountStore.put(data, accountCapsule); + AccountCapsule stored = accountStore.get(data); + Assert.assertNotNull(stored); + Assert.assertEquals(ByteString.copyFrom(address), stored.getAddress()); + Assert.assertEquals(ByteString.copyFrom(accountName), stored.getAccountName()); } @Test diff --git a/framework/src/test/java/org/tron/core/db/BlockStoreTest.java b/framework/src/test/java/org/tron/core/db/BlockStoreTest.java index b85a6312278..4d97c70fdf5 100644 --- a/framework/src/test/java/org/tron/core/db/BlockStoreTest.java +++ b/framework/src/test/java/org/tron/core/db/BlockStoreTest.java @@ -28,10 +28,6 @@ private BlockCapsule getBlockCapsule(long number) { System.currentTimeMillis(), ByteString.EMPTY); } - @Test - public void testCreateBlockStore() { - } - @Test public void testPut() throws Exception { long number = 1; diff --git a/framework/src/test/java/org/tron/core/db/CheckPointV2StoreTest.java b/framework/src/test/java/org/tron/core/db/CheckPointV2StoreTest.java index bdb13376f34..d6448d05e18 100644 --- a/framework/src/test/java/org/tron/core/db/CheckPointV2StoreTest.java +++ b/framework/src/test/java/org/tron/core/db/CheckPointV2StoreTest.java @@ -113,6 +113,7 @@ public void testCloseWhenDbSourceThrows() throws Exception { try { store.close(); + verify(mockDbSource).closeDB(); } finally { originalDbSource.closeDB(); } diff --git a/framework/src/test/java/org/tron/core/db/DBIteratorTest.java b/framework/src/test/java/org/tron/core/db/DBIteratorTest.java index 0966d904093..b050931c560 100644 --- a/framework/src/test/java/org/tron/core/db/DBIteratorTest.java +++ b/framework/src/test/java/org/tron/core/db/DBIteratorTest.java @@ -10,9 +10,7 @@ import org.iq80.leveldb.Options; import org.junit.Assert; import org.junit.ClassRule; -import org.junit.Rule; import org.junit.Test; -import org.junit.rules.ExpectedException; import org.junit.rules.TemporaryFolder; import org.rocksdb.ReadOptions; import org.rocksdb.RocksDB; @@ -26,10 +24,6 @@ public class DBIteratorTest { @ClassRule public static final TemporaryFolder temporaryFolder = new TemporaryFolder(); - @Rule - public final ExpectedException thrown = ExpectedException.none(); - - @Test public void testLevelDb() throws IOException { TestConstants.assumeLevelDbAvailable(); @@ -37,43 +31,31 @@ public void testLevelDb() throws IOException { try (DB db = factory.open(file, new Options().createIfMissing(true))) { db.put("1".getBytes(StandardCharsets.UTF_8), "1".getBytes(StandardCharsets.UTF_8)); db.put("2".getBytes(StandardCharsets.UTF_8), "2".getBytes(StandardCharsets.UTF_8)); - StoreIterator iterator = new StoreIterator(db.iterator()); - iterator.seekToFirst(); - Assert.assertArrayEquals("1".getBytes(StandardCharsets.UTF_8), iterator.getKey()); - Assert.assertArrayEquals("1".getBytes(StandardCharsets.UTF_8), iterator.next().getValue()); - Assert.assertTrue(iterator.hasNext()); - - Assert.assertArrayEquals("2".getBytes(StandardCharsets.UTF_8), iterator.getValue()); - Assert.assertArrayEquals("2".getBytes(StandardCharsets.UTF_8), iterator.next().getKey()); - Assert.assertFalse(iterator.hasNext()); - - try { - iterator.seekToLast(); - } catch (Exception e) { - Assert.assertTrue(e instanceof IllegalStateException); - } - - iterator = new StoreIterator(db.iterator()); - iterator.seekToLast(); - Assert.assertArrayEquals("2".getBytes(StandardCharsets.UTF_8), iterator.getKey()); - Assert.assertArrayEquals("2".getBytes(StandardCharsets.UTF_8), iterator.getValue()); - iterator.seekToFirst(); - while (iterator.hasNext()) { - iterator.next(); - } - Assert.assertFalse(iterator.hasNext()); - try { - iterator.getKey(); - } catch (Exception e) { - Assert.assertTrue(e instanceof IllegalStateException); - } - try { - iterator.getValue(); - } catch (Exception e) { - Assert.assertTrue(e instanceof IllegalStateException); + StoreIterator forwardIterator = new StoreIterator(db.iterator()); + forwardIterator.seekToFirst(); + Assert.assertArrayEquals("1".getBytes(StandardCharsets.UTF_8), forwardIterator.getKey()); + Assert.assertArrayEquals("1".getBytes(StandardCharsets.UTF_8), + forwardIterator.next().getValue()); + Assert.assertTrue(forwardIterator.hasNext()); + + Assert.assertArrayEquals("2".getBytes(StandardCharsets.UTF_8), forwardIterator.getValue()); + Assert.assertArrayEquals("2".getBytes(StandardCharsets.UTF_8), + forwardIterator.next().getKey()); + Assert.assertFalse(forwardIterator.hasNext()); + Assert.assertThrows(IllegalStateException.class, forwardIterator::seekToLast); + + StoreIterator reverseIterator = new StoreIterator(db.iterator()); + reverseIterator.seekToLast(); + Assert.assertArrayEquals("2".getBytes(StandardCharsets.UTF_8), reverseIterator.getKey()); + Assert.assertArrayEquals("2".getBytes(StandardCharsets.UTF_8), reverseIterator.getValue()); + reverseIterator.seekToFirst(); + while (reverseIterator.hasNext()) { + reverseIterator.next(); } - thrown.expect(NoSuchElementException.class); - iterator.next(); + Assert.assertFalse(reverseIterator.hasNext()); + Assert.assertThrows(IllegalStateException.class, reverseIterator::getKey); + Assert.assertThrows(IllegalStateException.class, reverseIterator::getValue); + Assert.assertThrows(NoSuchElementException.class, reverseIterator::next); } @@ -113,8 +95,7 @@ public void testRocksDb() throws RocksDBException, IOException { Assert.assertFalse(iterator.hasNext()); Assert.assertThrows(IllegalStateException.class, iterator::getKey); Assert.assertThrows(IllegalStateException.class, iterator::getValue); - thrown.expect(NoSuchElementException.class); - iterator.next(); + Assert.assertThrows(NoSuchElementException.class, iterator::next); } } } diff --git a/framework/src/test/java/org/tron/core/db/KhaosDatabaseTest.java b/framework/src/test/java/org/tron/core/db/KhaosDatabaseTest.java index ba7478cb22d..5c241597ca4 100644 --- a/framework/src/test/java/org/tron/core/db/KhaosDatabaseTest.java +++ b/framework/src/test/java/org/tron/core/db/KhaosDatabaseTest.java @@ -4,14 +4,13 @@ import com.google.protobuf.ByteString; import java.lang.ref.Reference; import java.lang.ref.WeakReference; -import java.util.List; +import java.util.LinkedList; 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; -import org.tron.common.parameter.CommonParameter; import org.tron.common.utils.ByteArray; import org.tron.common.utils.Pair; import org.tron.common.utils.Sha256Hash; @@ -57,11 +56,8 @@ public void testPushGetBlock() { ByteArray.fromHexString( "9938a342238077182498b464ac029222ae169360e540d1fd6aee7c2ae9575a06"))))).build()); khaosDatabase.start(blockCapsule); - try { - khaosDatabase.push(blockCapsule2); - } catch (UnLinkedBlockException | BadNumberBlockException e) { - System.out.println(e.getMessage()); - } + Assert.assertThrows(UnLinkedBlockException.class, + () -> khaosDatabase.push(blockCapsule2)); Assert.assertEquals(blockCapsule2, khaosDatabase.getBlock(blockCapsule2.getBlockId())); Assert.assertTrue("contain is error", khaosDatabase.containBlock(blockCapsule2.getBlockId())); @@ -101,7 +97,8 @@ public void checkWeakReference() throws UnLinkedBlockException, BadNumberBlockEx } @Test - public void testGetBranch() { + public void testGetBranch() + throws UnLinkedBlockException, BadNumberBlockException, NonCommonBlockException { final String mockedHash = "0304f784e4e7bae517bcab94c3e0c9214fb4ac7ff9d7d5a937d1f40031f87b82"; // common parent block BlockCapsule parentBlock = new BlockCapsule(Block.newBuilder().setBlockHeader( @@ -114,49 +111,32 @@ public void testGetBranch() { 1, parentBlock.getBlockId(), 0, ByteString.EMPTY); BlockCapsule block2OnforkA = new BlockCapsule( 2, block1OnforkA.getBlockId(), 0, ByteString.EMPTY); - List forkA = Lists.newLinkedList(); + LinkedList forkA = Lists.newLinkedList(); forkA.add(new KhaosDatabase.KhaosBlock(block2OnforkA)); forkA.add(new KhaosDatabase.KhaosBlock(block1OnforkA)); - forkA.add(new KhaosDatabase.KhaosBlock(parentBlock)); // fork-chain-B BlockCapsule block1OnforkB = new BlockCapsule( - 1, parentBlock.getBlockId(), 0, ByteString.EMPTY); - List forkB = Lists.newLinkedList(); - forkA.add(new KhaosDatabase.KhaosBlock(block1OnforkB)); - forkA.add(new KhaosDatabase.KhaosBlock(parentBlock)); + 1, parentBlock.getBlockId(), 1, ByteString.EMPTY); + LinkedList forkB = Lists.newLinkedList(); + forkB.add(new KhaosDatabase.KhaosBlock(block1OnforkB)); khaosDatabase.start(parentBlock); - try { - khaosDatabase.push(block1OnforkA); - khaosDatabase.push(block2OnforkA); - khaosDatabase.push(block1OnforkB); - // case: block num of param1 > block num of param2 - Pair result1 = khaosDatabase.getBranch( - Sha256Hash.of( - CommonParameter - .getInstance().isECKeyCryptoEngine(), - block2OnforkA.getInstance().getBlockHeader().getRawData().toByteArray()), - Sha256Hash.of( - CommonParameter - .getInstance().isECKeyCryptoEngine(), - block1OnforkB.getInstance().getBlockHeader().getRawData().toByteArray())); - Assert.assertEquals(forkA, result1.getKey()); - Assert.assertEquals(forkB, result1.getValue()); - // case: block num of param2 > block num of param1 - Pair result2 = khaosDatabase.getBranch( - Sha256Hash.of( - CommonParameter - .getInstance().isECKeyCryptoEngine(), - block1OnforkB.getInstance().getBlockHeader().getRawData().toByteArray()), - Sha256Hash.of( - CommonParameter - .getInstance().isECKeyCryptoEngine(), - block2OnforkA.getInstance().getBlockHeader().getRawData().toByteArray())); - Assert.assertEquals(forkB, result2.getKey()); - Assert.assertEquals(forkA, result2.getValue()); - } catch (UnLinkedBlockException | BadNumberBlockException | NonCommonBlockException e) { - System.out.println(e.getMessage()); - } + khaosDatabase.push(block1OnforkA); + khaosDatabase.push(block2OnforkA); + khaosDatabase.push(block1OnforkB); + // Keep the static type as Sha256Hash so this exercises the strict branch lookup overload. + Sha256Hash forkAHead = block2OnforkA.getBlockId(); + Sha256Hash forkBHead = block1OnforkB.getBlockId(); + // case: block num of param1 > block num of param2 + Pair, LinkedList> result1 = + khaosDatabase.getBranch(forkAHead, forkBHead); + Assert.assertEquals(forkA, result1.getKey()); + Assert.assertEquals(forkB, result1.getValue()); + // case: block num of param2 > block num of param1 + Pair, LinkedList> result2 = + khaosDatabase.getBranch(forkBHead, forkAHead); + Assert.assertEquals(forkB, result2.getKey()); + Assert.assertEquals(forkA, result2.getValue()); } @Test(expected = UnsupportedOperationException.class) @@ -168,4 +148,4 @@ public void testIsNotEmpty() { khaosDatabase.start(blockCapsule); khaosDatabase.isNotEmpty(); } -} \ No newline at end of file +} diff --git a/framework/src/test/java/org/tron/core/db/ManagerMockTest.java b/framework/src/test/java/org/tron/core/db/ManagerMockTest.java index 946bef022d2..7f65e198a0f 100644 --- a/framework/src/test/java/org/tron/core/db/ManagerMockTest.java +++ b/framework/src/test/java/org/tron/core/db/ManagerMockTest.java @@ -1,6 +1,5 @@ package org.tron.core.db; -import static org.junit.Assert.assertNotNull; import static org.junit.Assert.assertThrows; import static org.junit.Assert.assertTrue; import static org.mockito.ArgumentMatchers.any; @@ -47,6 +46,7 @@ import org.tron.common.runtime.vm.LogInfo; import org.tron.common.utils.Pair; import org.tron.common.utils.Sha256Hash; +import org.tron.consensus.Consensus; import org.tron.core.ChainBaseManager; import org.tron.core.capsule.BlockCapsule; import org.tron.core.capsule.TransactionCapsule; @@ -78,15 +78,11 @@ public void clearMocks() { @Test public void processTransactionCostTimeMoreThan100() throws Exception { - TransactionTrace traceMock = mock(TransactionTrace.class); - BandwidthProcessor bandwidthProcessorMock = mock(BandwidthProcessor.class); - try (MockedConstruction mockedConstruction2 - = mockConstruction(TransactionTrace.class,(mock, context) -> { - when(mock).thenReturn(traceMock); }); - MockedConstruction mockedConstruction3 - = mockConstruction(BandwidthProcessor.class,(mock, context) -> { - when(mock).thenReturn(bandwidthProcessorMock); - }); + ProgramResult result = new ProgramResult(); + result.setResultCode(Protocol.Transaction.Result.contractResult.SUCCESS); + try (MockedConstruction mockedConstruction + = mockConstruction(TransactionTrace.class, (trace, context) -> + when(trace.getRuntimeResult()).thenReturn(result)); MockedStatic mockedStatic = mockStatic(TransactionUtil.class)) { Manager dbManager = mock(Manager.class); BalanceContract.TransferContract transferContract = @@ -108,14 +104,13 @@ public void processTransactionCostTimeMoreThan100() throws Exception { .setType(Protocol.Transaction.Contract.ContractType.TransferContract))) .build(); TransactionCapsule trxCap = new TransactionCapsule(transaction); - ProgramResult result = new ProgramResult(); - result.setResultCode(Protocol.Transaction.Result.contractResult.SUCCESS); Sha256Hash transactionId = trxCap.getTransactionId(); TransactionCapsule trxCapMock = mock(TransactionCapsule.class); ChainBaseManager chainBaseManagerMock = mock(ChainBaseManager.class); BalanceTraceStore balanceTraceStoreMock = mock(BalanceTraceStore.class); + DynamicPropertiesStore dynamicPropertiesStoreMock = mock(DynamicPropertiesStore.class); TransactionStore transactionStoreMock = mock(TransactionStore.class); TransactionInfoCapsule transactionInfoCapsuleMock = mock(TransactionInfoCapsule.class); Protocol.TransactionInfo transactionInfo = Protocol.TransactionInfo.newBuilder().build(); @@ -126,8 +121,9 @@ public void processTransactionCostTimeMoreThan100() throws Exception { BlockCapsule blockCapMock = Mockito.mock(BlockCapsule.class); - when(TransactionUtil - .buildTransactionInfoInstance(trxCapMock, blockCapMock, traceMock)) + mockedStatic.when(() -> TransactionUtil.buildTransactionInfoInstance( + Mockito.same(trxCapMock), Mockito.same(blockCapMock), + Mockito.any(TransactionTrace.class))) .thenReturn(transactionInfoCapsuleMock); // this make cost > 100 cond is true @@ -142,10 +138,10 @@ public Boolean answer(InvocationOnMock invocation) throws Throwable { when(chainBaseManagerMock.getBalanceTraceStore()).thenReturn(balanceTraceStoreMock); when(chainBaseManagerMock.getAccountStore()).thenReturn(mock(AccountStore.class)); when(chainBaseManagerMock.getDynamicPropertiesStore()) - .thenReturn(mock(DynamicPropertiesStore.class)); + .thenReturn(dynamicPropertiesStoreMock); when(chainBaseManagerMock.getTransactionStore()).thenReturn(transactionStoreMock); + when(dbManager.getDynamicPropertiesStore()).thenReturn(dynamicPropertiesStoreMock); when(trxCapMock.getTransactionId()).thenReturn(transactionId); - when(traceMock.getRuntimeResult()).thenReturn(result); when(transactionInfoCapsuleMock.getId()).thenReturn(transactionId.getBytes()); when(transactionInfoCapsuleMock.getInstance()).thenReturn(transactionInfo); when(trxCapMock.getInstance()).thenReturn(trxCap.getInstance()); @@ -162,16 +158,18 @@ public Boolean answer(InvocationOnMock invocation) throws Throwable { doNothing().when(transactionStoreMock).put(transactionId.getBytes(), trxCapMock); - doNothing().when(bandwidthProcessorMock).consume(trxCapMock, traceMock); - doNothing().when(dbManager).consumeBandwidth(trxCapMock, traceMock); + doNothing().when(dbManager).consumeBandwidth( + Mockito.same(trxCapMock), Mockito.any(TransactionTrace.class)); doNothing().when(balanceTraceStoreMock).initCurrentTransactionBalanceTrace(trxCapMock); doNothing().when(balanceTraceStoreMock).updateCurrentTransactionStatus(anyString()); doNothing().when(balanceTraceStoreMock).resetCurrentTransactionTrace(); + when(dbManager.processTransaction(trxCapMock, blockCapMock)).thenCallRealMethod(); - assertNotNull( - when(dbManager.processTransaction(trxCapMock, blockCapMock)).thenCallRealMethod() - ); + Protocol.TransactionInfo actual = dbManager.processTransaction(trxCapMock, blockCapMock); + + Assert.assertEquals(transactionInfo, actual); + Assert.assertEquals(1, mockedConstruction.constructed().size()); } } @@ -338,7 +336,7 @@ public void testProcessTransaction() throws Exception { "processTransaction", TransactionCapsule.class, BlockCapsule.class); privateMethod.setAccessible(true); - privateMethod.invoke(dbManager, transactionCapsuleMock, blockCapsuleMock); + Assert.assertNull(privateMethod.invoke(dbManager, transactionCapsuleMock, blockCapsuleMock)); } @Test @@ -379,6 +377,8 @@ public void testRePush() { when(transactionStoreMock.has(any())).thenReturn(true); dbManager.rePush(trx); + + verify(dbManager, Mockito.never()).pushTransaction(any()); } @SneakyThrows @@ -429,26 +429,26 @@ public void testRePush1() { doThrow(new TooBigTransactionResultException()).when(dbManager).pushTransaction(any()); dbManager.rePush(trx); + + verify(dbManager, Mockito.times(7)).pushTransaction(trx); } @Test - public void testPostSolidityFilter() throws Exception { + public void testPostSolidityFilterReturnsWhenRangeIsEmpty() throws Exception { Manager dbManager = spy(new Manager()); Method privateMethod = Manager.class.getDeclaredMethod( "postSolidityFilter", long.class, long.class); privateMethod.setAccessible(true); - privateMethod.invoke(dbManager, 100L, 10L); + Assert.assertNull(privateMethod.invoke(dbManager, 100L, 10L)); } @Test public void testReOrgLogsFilter() throws Exception { Manager dbManager = spy(new Manager()); CommonParameter commonParameterMock = mock(Args.class); - mockStatic(CommonParameter.class); ChainBaseManager chainBaseManagerMock = mock(ChainBaseManager.class); - when(CommonParameter.getInstance()).thenReturn(commonParameterMock); when(commonParameterMock.isJsonRpcHttpFullNodeEnable()).thenReturn(true); when(chainBaseManagerMock.getDynamicPropertiesStore()) .thenReturn(mock(DynamicPropertiesStore.class)); @@ -459,7 +459,11 @@ public void testReOrgLogsFilter() throws Exception { Method privateMethod = Manager.class.getDeclaredMethod("reOrgLogsFilter"); privateMethod.setAccessible(true); - privateMethod.invoke(dbManager); + try (MockedStatic 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())