private void appendBlock(final Transaction... transactionsToAdd) { appendBlock(UInt256.ONE, getHeaderForCurrentChainHead(), transactionsToAdd); }
@Test public void shouldNotRemovePendingTransactionsWhenABlockAddedToAFork() { transactions.addRemoteTransaction(transaction1); final BlockHeader commonParent = getHeaderForCurrentChainHead(); final Block canonicalHead = appendBlock(UInt256.of(1000), commonParent); appendBlock(UInt256.ONE, commonParent, transaction1); verifyChainHeadIs(canonicalHead); assertTransactionPending(transaction1); }
@Test public void shouldRemovePendingTransactionsFromAllBlocksOnAForkWhenItBecomesTheCanonicalChain() { transactions.addRemoteTransaction(transaction1); transactions.addRemoteTransaction(transaction2); final BlockHeader commonParent = getHeaderForCurrentChainHead(); final Block originalChainHead = appendBlock(UInt256.of(1000), commonParent); final Block forkBlock1 = appendBlock(UInt256.ONE, commonParent, transaction1); verifyChainHeadIs(originalChainHead); final Block forkBlock2 = appendBlock(UInt256.of(2000), forkBlock1.getHeader(), transaction2); verifyChainHeadIs(forkBlock2); assertTransactionNotPending(transaction1); assertTransactionNotPending(transaction2); }
@Test public void shouldRemoveTransactionsFromPendingListWhenIncludedInBlockOnChain() { transactions.addRemoteTransaction(transaction1); assertTransactionPending(transaction1); appendBlock(transaction1); assertTransactionNotPending(transaction1); }
@Test public void shouldIgnoreUnknownTransactionsThatAreAddedInABlock() { transactions.addRemoteTransaction(transaction1); appendBlock(transaction1, transaction2); assertTransactionNotPending(transaction1); assertTransactionNotPending(transaction2); assertThat(transactions.size()).isZero(); }
@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 shouldRemoveMultipleTransactionsAddedInOneBlock() { transactions.addRemoteTransaction(transaction1); transactions.addRemoteTransaction(transaction2); appendBlock(transaction1, transaction2); assertTransactionNotPending(transaction1); assertTransactionNotPending(transaction2); assertThat(transactions.size()).isZero(); }
@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); }