@Test public void shouldAllowTransactionWhenAccountWhitelistControllerIsNotPresent() { givenTransactionIsValid(transaction1); assertThat(transactionPool.addLocalTransaction(transaction1)).isEqualTo(valid()); assertTransactionPending(transaction1); }
@Test public void shouldNotAddRemoteTransactionsThatAreInvalidAccordingToInvariantChecks() { givenTransactionIsValid(transaction2); when(transactionValidator.validate(transaction1)) .thenReturn(ValidationResult.invalid(NONCE_TOO_LOW)); transactionPool.addRemoteTransactions(asList(transaction1, transaction2)); assertTransactionNotPending(transaction1); assertTransactionPending(transaction2); verify(batchAddedListener).onTransactionsAdded(singleton(transaction2)); }
@Test public void shouldRejectNonWhitelistedTransactionWhenWhitelistEnabled() { transactionPool.setAccountWhitelist(accountWhitelistController); givenTransactionIsValid(transaction1); when(accountWhitelistController.isAccountWhiteListSet()).thenReturn(true); when(accountWhitelistController.contains(transaction1.getSender().toString())) .thenReturn(false); assertThat(transactionPool.addLocalTransaction(transaction1)) .isEqualTo(ValidationResult.invalid(TX_SENDER_NOT_AUTHORIZED)); assertTransactionNotPending(transaction1); verifyZeroInteractions(batchAddedListener); }
@Test public void shouldAllowWhitelistedTransactionWhenWhitelistEnabled() { transactionPool.setAccountWhitelist(accountWhitelistController); givenTransactionIsValid(transaction1); when(accountWhitelistController.isAccountWhiteListSet()).thenReturn(true); when(accountWhitelistController.contains(transaction1.getSender().toString())).thenReturn(true); assertThat(transactionPool.addLocalTransaction(transaction1)).isEqualTo(valid()); assertTransactionPending(transaction1); }
@Test public void shouldNotAddRemoteTransactionsThatAreInvalidAccordingToStateDependentChecks() { givenTransactionIsValid(transaction2); when(transactionValidator.validate(transaction1)).thenReturn(valid()); when(transactionValidator.validateForSender(transaction1, null, OptionalLong.empty())) .thenReturn(ValidationResult.invalid(NONCE_TOO_LOW)); transactionPool.addRemoteTransactions(asList(transaction1, transaction2)); assertTransactionNotPending(transaction1); assertTransactionPending(transaction2); verify(batchAddedListener).onTransactionsAdded(singleton(transaction2)); }
@Test public void shouldRejectLocalTransactionsWhereGasLimitExceedBlockGasLimit() { final TransactionTestFixture builder = new TransactionTestFixture(); final Transaction transaction1 = builder.gasLimit(genesisBlockGasLimit + 1).createTransaction(KEY_PAIR1); givenTransactionIsValid(transaction1); assertThat(transactionPool.addLocalTransaction(transaction1)) .isEqualTo(ValidationResult.invalid(EXCEEDS_BLOCK_GAS_LIMIT)); assertTransactionNotPending(transaction1); verifyZeroInteractions(batchAddedListener); }
@Test public void shouldRejectRemoteTransactionsWhereGasLimitExceedBlockGasLimit() { final TransactionTestFixture builder = new TransactionTestFixture(); final Transaction transaction1 = builder.gasLimit(genesisBlockGasLimit + 1).createTransaction(KEY_PAIR1); givenTransactionIsValid(transaction1); transactionPool.addRemoteTransactions(singleton(transaction1)); assertTransactionNotPending(transaction1); verifyZeroInteractions(batchAddedListener); }
@Test public void shouldReaddTransactionsFromThePreviousCanonicalHeadWhenAReorgOccurs() { givenTransactionIsValid(transaction1); givenTransactionIsValid(transaction2); transactions.addRemoteTransaction(transaction1); transactions.addRemoteTransaction(transaction2); final BlockHeader commonParent = getHeaderForCurrentChainHead(); final Block originalFork1 = appendBlock(UInt256.of(1000), commonParent, transaction1); final Block originalFork2 = appendBlock(UInt256.ONE, originalFork1.getHeader(), transaction2); assertTransactionNotPending(transaction1); assertTransactionNotPending(transaction2); final Block reorgFork1 = appendBlock(UInt256.ONE, commonParent); verifyChainHeadIs(originalFork2); transactions.addTransactionListener(listener); final Block reorgFork2 = appendBlock(UInt256.of(2000), reorgFork1.getHeader()); verifyChainHeadIs(reorgFork2); assertTransactionPending(transaction1); assertTransactionPending(transaction2); verify(listener).onTransactionAdded(transaction1); verify(listener).onTransactionAdded(transaction2); verifyNoMoreInteractions(listener); }
@Test public void shouldNotReaddTransactionsThatAreInBothForksWhenReorgHappens() { givenTransactionIsValid(transaction1); givenTransactionIsValid(transaction2); transactions.addRemoteTransaction(transaction1); transactions.addRemoteTransaction(transaction2); final BlockHeader commonParent = getHeaderForCurrentChainHead(); final Block originalFork1 = appendBlock(UInt256.of(1000), commonParent, transaction1); final Block originalFork2 = appendBlock(UInt256.ONE, originalFork1.getHeader(), transaction2); assertTransactionNotPending(transaction1); assertTransactionNotPending(transaction2); final Block reorgFork1 = appendBlock(UInt256.ONE, commonParent, transaction1); verifyChainHeadIs(originalFork2); final Block reorgFork2 = appendBlock(UInt256.of(2000), reorgFork1.getHeader()); verifyChainHeadIs(reorgFork2); assertTransactionNotPending(transaction1); assertTransactionPending(transaction2); }