|
3 | 3 | import com.google.protobuf.Any; |
4 | 4 | import com.google.protobuf.ByteString; |
5 | 5 | import java.lang.reflect.Field; |
| 6 | +import java.lang.reflect.Method; |
6 | 7 | import java.util.ArrayList; |
7 | 8 | import java.util.List; |
8 | 9 | import java.util.Map; |
|
20 | 21 | import org.tron.common.TestConstants; |
21 | 22 | import org.tron.common.runtime.TvmTestUtils; |
22 | 23 | import org.tron.common.utils.ByteArray; |
| 24 | +import org.tron.core.ChainBaseManager; |
23 | 25 | import org.tron.core.config.args.Args; |
| 26 | +import org.tron.core.exception.P2pException; |
| 27 | +import org.tron.core.exception.P2pException.TypeEnum; |
24 | 28 | import org.tron.core.net.TronNetDelegate; |
25 | 29 | import org.tron.core.net.message.adv.TransactionMessage; |
26 | 30 | import org.tron.core.net.message.adv.TransactionsMessage; |
@@ -132,6 +136,75 @@ public void testProcessMessage() { |
132 | 136 | } |
133 | 137 | } |
134 | 138 |
|
| 139 | + @Test |
| 140 | + public void testProcessMessageAfterClose() throws Exception { |
| 141 | + TransactionsMsgHandler handler = new TransactionsMsgHandler(); |
| 142 | + handler.init(); |
| 143 | + handler.close(); |
| 144 | + |
| 145 | + PeerConnection peer = Mockito.mock(PeerConnection.class); |
| 146 | + TransactionsMessage msg = Mockito.mock(TransactionsMessage.class); |
| 147 | + |
| 148 | + handler.processMessage(peer, msg); |
| 149 | + |
| 150 | + Mockito.verify(msg, Mockito.never()).getTransactions(); |
| 151 | + Mockito.verifyNoInteractions(peer); |
| 152 | + } |
| 153 | + |
| 154 | + @Test |
| 155 | + public void testHandleTransaction() throws Exception { |
| 156 | + TransactionsMsgHandler handler = new TransactionsMsgHandler(); |
| 157 | + |
| 158 | + TronNetDelegate tronNetDelegate = Mockito.mock(TronNetDelegate.class); |
| 159 | + AdvService advService = Mockito.mock(AdvService.class); |
| 160 | + ChainBaseManager chainBaseManager = Mockito.mock(ChainBaseManager.class); |
| 161 | + |
| 162 | + Field f1 = TransactionsMsgHandler.class.getDeclaredField("tronNetDelegate"); |
| 163 | + f1.setAccessible(true); |
| 164 | + f1.set(handler, tronNetDelegate); |
| 165 | + Field f2 = TransactionsMsgHandler.class.getDeclaredField("advService"); |
| 166 | + f2.setAccessible(true); |
| 167 | + f2.set(handler, advService); |
| 168 | + Field f3 = TransactionsMsgHandler.class.getDeclaredField("chainBaseManager"); |
| 169 | + f3.setAccessible(true); |
| 170 | + f3.set(handler, chainBaseManager); |
| 171 | + |
| 172 | + PeerConnection peer = Mockito.mock(PeerConnection.class); |
| 173 | + |
| 174 | + BalanceContract.TransferContract tc = BalanceContract.TransferContract.newBuilder() |
| 175 | + .setAmount(10) |
| 176 | + .setOwnerAddress(ByteString.copyFrom(ByteArray.fromHexString("121212a9cf"))) |
| 177 | + .setToAddress(ByteString.copyFrom(ByteArray.fromHexString("232323a9cf"))) |
| 178 | + .build(); |
| 179 | + long now = System.currentTimeMillis(); |
| 180 | + Protocol.Transaction trx = Protocol.Transaction.newBuilder().setRawData( |
| 181 | + Protocol.Transaction.raw.newBuilder() |
| 182 | + .setTimestamp(now) |
| 183 | + .setExpiration(now + 60_000) |
| 184 | + .setRefBlockNum(1) |
| 185 | + .addContract(Protocol.Transaction.Contract.newBuilder() |
| 186 | + .setType(Protocol.Transaction.Contract.ContractType.TransferContract) |
| 187 | + .setParameter(Any.pack(tc)).build()).build()) |
| 188 | + .build(); |
| 189 | + TransactionMessage trxMsg = new TransactionMessage(trx); |
| 190 | + |
| 191 | + Method handleTx = TransactionsMsgHandler.class.getDeclaredMethod( |
| 192 | + "handleTransaction", PeerConnection.class, TransactionMessage.class); |
| 193 | + handleTx.setAccessible(true); |
| 194 | + |
| 195 | + // happy path → push and broadcast |
| 196 | + Mockito.when(chainBaseManager.getNextBlockSlotTime()).thenReturn(now); |
| 197 | + handleTx.invoke(handler, peer, trxMsg); |
| 198 | + Mockito.verify(advService).broadcast(trxMsg); |
| 199 | + |
| 200 | + // P2pException BAD_TRX → disconnect |
| 201 | + Mockito.doThrow(new P2pException(TypeEnum.BAD_TRX, "bad")) |
| 202 | + .when(tronNetDelegate).pushTransaction(Mockito.any()); |
| 203 | + handleTx.invoke(handler, peer, trxMsg); |
| 204 | + Mockito.verify(peer).setBadPeer(true); |
| 205 | + Mockito.verify(peer).disconnect(Protocol.ReasonCode.BAD_TX); |
| 206 | + } |
| 207 | + |
135 | 208 | class TrxEvent { |
136 | 209 |
|
137 | 210 | @Getter |
|
0 commit comments