@Test public void selectTransactionsUntilPendingIsEmpty() { transactions.addRemoteTransaction(transaction1); transactions.addRemoteTransaction(transaction2); final List<Transaction> parsedTransactions = Lists.newArrayList(); transactions.selectTransactions( transaction -> { parsedTransactions.add(transaction); return TransactionSelectionResult.CONTINUE; }); assertThat(parsedTransactions.size()).isEqualTo(2); assertThat(parsedTransactions.get(0)).isEqualTo(transaction2); assertThat(parsedTransactions.get(1)).isEqualTo(transaction1); }
@Test public void selectTransactionsUntilSelectorRequestsNoMore() { transactions.addRemoteTransaction(transaction1); transactions.addRemoteTransaction(transaction2); final List<Transaction> parsedTransactions = Lists.newArrayList(); transactions.selectTransactions( transaction -> { parsedTransactions.add(transaction); return TransactionSelectionResult.COMPLETE_OPERATION; }); assertThat(parsedTransactions.size()).isEqualTo(1); assertThat(parsedTransactions.get(0)).isEqualTo(transaction2); }
@Test public void invalidTransactionIsDeletedFromPendingTransactions() { transactions.addRemoteTransaction(transaction1); transactions.addRemoteTransaction(transaction2); final List<Transaction> parsedTransactions = Lists.newArrayList(); transactions.selectTransactions( transaction -> { parsedTransactions.add(transaction); return TransactionSelectionResult.DELETE_TRANSACTION_AND_CONTINUE; }); assertThat(parsedTransactions.size()).isEqualTo(2); assertThat(parsedTransactions.get(0)).isEqualTo(transaction2); assertThat(parsedTransactions.get(1)).isEqualTo(transaction1); assertThat(transactions.size()).isZero(); }
@Test public void shouldNotForceNonceOrderWhenSendersDiffer() { final Transaction transaction1 = transactionWithNonceAndSender(0, KEYS1); final Transaction transaction2 = transactionWithNonceAndSender(1, KEYS2); transactions.addLocalTransaction(transaction1); transactions.addLocalTransaction(transaction2); final List<Transaction> iterationOrder = new ArrayList<>(); transactions.selectTransactions( transaction -> { iterationOrder.add(transaction); return TransactionSelectionResult.CONTINUE; }); assertThat(iterationOrder).containsExactly(transaction2, transaction1); }
@Test public void shouldIterateTransactionsFromSameSenderInNonceOrder() { final Transaction transaction1 = transactionWithNonceAndSender(0, KEYS1); final Transaction transaction2 = transactionWithNonceAndSender(1, KEYS1); final Transaction transaction3 = transactionWithNonceAndSender(2, KEYS1); transactions.addLocalTransaction(transaction1); transactions.addLocalTransaction(transaction2); transactions.addLocalTransaction(transaction3); final List<Transaction> iterationOrder = new ArrayList<>(); transactions.selectTransactions( transaction -> { iterationOrder.add(transaction); return TransactionSelectionResult.CONTINUE; }); assertThat(iterationOrder).containsExactly(transaction1, transaction2, transaction3); }
@Test public void shouldNotIncreasePriorityOfTransactionsBecauseOfNonceOrder() { final Transaction transaction1 = transactionWithNonceAndSender(0, KEYS1); final Transaction transaction2 = transactionWithNonceAndSender(1, KEYS1); final Transaction transaction3 = transactionWithNonceAndSender(2, KEYS1); final Transaction transaction4 = transactionWithNonceAndSender(5, KEYS2); transactions.addLocalTransaction(transaction1); transactions.addLocalTransaction(transaction4); transactions.addLocalTransaction(transaction2); transactions.addLocalTransaction(transaction3); final List<Transaction> iterationOrder = new ArrayList<>(); transactions.selectTransactions( transaction -> { iterationOrder.add(transaction); return TransactionSelectionResult.CONTINUE; }); // Ignoring nonces, the order would be 3, 2, 4, 1 but we have to delay 3 and 2 until after 1. assertThat(iterationOrder) .containsExactly(transaction4, transaction1, transaction2, transaction3); }