@Test public void shouldNotStartMiningWhenBlockAddedAndInSyncIfMinerNotEnabled() { when(syncState.isInSync()).thenReturn(true); miningCoordinator.onBlockAdded(BlockAddedEvent.createForHeadAdvancement(BLOCK), blockchain); verifyNoMoreInteractions(minerExecutor, blockMiner); }
private BlockAddedEvent createBlockAddedEvent( final List<Transaction> addedTransactions, final List<Transaction> removedTransactions) { final Block block = mock(Block.class); return BlockAddedEvent.createForChainReorg( block, addedTransactions != null ? Lists.newArrayList(addedTransactions) : Collections.emptyList(), removedTransactions != null ? Lists.newArrayList(removedTransactions) : Collections.emptyList()); }
@Test public void doesntAddNewChainHeadEventWhenNotACanonicalHeadBlockEvent() { final BlockAddedEvent fork = BlockAddedEvent.createForFork(block); ibftMiningCoordinator.onBlockAdded(fork, blockChain); assertThat(eventQueue.isEmpty()).isTrue(); } }
@Test public void newChainHeadHeaderEventIsAddedToTheQueue() { final Blockchain mockBlockchain = mock(Blockchain.class); final IbftEventQueue mockQueue = mock(IbftEventQueue.class); final BlockAddedEvent mockBlockAddedEvent = mock(BlockAddedEvent.class); final IbftChainObserver ibftChainObserver = new IbftChainObserver(mockQueue); final BlockHeader header = new BlockHeaderTestFixture() .number(1234) .coinbase(Address.ECREC) .parentHash(Hash.EMPTY_LIST_HASH) .buildHeader(); final Block block = new Block(header, new BlockBody(emptyList(), emptyList())); when(mockBlockAddedEvent.getEventType()).thenReturn(BlockAddedEvent.EventType.HEAD_ADVANCED); when(mockBlockAddedEvent.getBlock()).thenReturn(block); ibftChainObserver.onBlockAdded(mockBlockAddedEvent, mockBlockchain); final ArgumentCaptor<IbftEvent> ibftEventArgumentCaptor = ArgumentCaptor.forClass(IbftEvent.class); verify(mockQueue).add(ibftEventArgumentCaptor.capture()); assertThat(ibftEventArgumentCaptor.getValue() instanceof NewChainHead).isTrue(); assertThat(((NewChainHead) ibftEventArgumentCaptor.getValue()).getNewChainHeadHeader()) .isEqualTo(header); }
@Test(expected = IllegalStateException.class) public void exceptionIsThrownWhenEventTypeIsFork() { final Blockchain mockBlockchain = mock(Blockchain.class); final IbftEventQueue mockQueue = mock(IbftEventQueue.class); final BlockAddedEvent mockBlockAddedEvent = mock(BlockAddedEvent.class); when(mockBlockAddedEvent.getEventType()).thenReturn(BlockAddedEvent.EventType.FORK); final IbftChainObserver ibftChainObserver = new IbftChainObserver(mockQueue); ibftChainObserver.onBlockAdded(mockBlockAddedEvent, mockBlockchain); }
@Test(expected = IllegalStateException.class) public void exceptionIsThrownWhenEventTypeIsChainReorg() { final Blockchain mockBlockchain = mock(Blockchain.class); final IbftEventQueue mockQueue = mock(IbftEventQueue.class); final BlockAddedEvent mockBlockAddedEvent = mock(BlockAddedEvent.class); when(mockBlockAddedEvent.getEventType()).thenReturn(BlockAddedEvent.EventType.CHAIN_REORG); final IbftChainObserver ibftChainObserver = new IbftChainObserver(mockQueue); ibftChainObserver.onBlockAdded(mockBlockAddedEvent, mockBlockchain); } }
@Test public void shouldRestartMiningWhenBlockAddedAndInSync() { when(syncState.isInSync()).thenReturn(true); miningCoordinator.enable(); miningCoordinator.onBlockAdded(BlockAddedEvent.createForHeadAdvancement(BLOCK), blockchain); verify(blockMiner).cancel(); verify(minerExecutor, times(2)).startAsyncMining(any(), any()); verifyNoMoreInteractions(minerExecutor, blockMiner); }
private BlockAddedEvent createBlockAddedEvent( final Transaction addedTransaction, final Transaction removedTransaction) { final Block block = mock(Block.class); return BlockAddedEvent.createForChainReorg( block, addedTransaction != null ? Lists.newArrayList(addedTransaction) : Collections.emptyList(), removedTransaction != null ? Lists.newArrayList(removedTransaction) : Collections.emptyList()); }
@Test public void shouldNotStartWhenBlockAddedAndOutOfSync() { when(syncState.isInSync()).thenReturn(false); miningCoordinator.enable(); miningCoordinator.onBlockAdded(BlockAddedEvent.createForHeadAdvancement(BLOCK), blockchain); verifyNoMoreInteractions(minerExecutor, blockMiner); }
@Test public void addsNewChainHeadEventWhenNewCanonicalHeadBlockEventReceived() throws Exception { BlockAddedEvent headAdvancement = BlockAddedEvent.createForHeadAdvancement(block); ibftMiningCoordinator.onBlockAdded(headAdvancement, blockChain); assertThat(eventQueue.size()).isEqualTo(1); final NewChainHead ibftEvent = (NewChainHead) eventQueue.poll(1, TimeUnit.SECONDS); assertThat(ibftEvent.getNewChainHeadHeader()).isEqualTo(blockHeader); }
private void simulateAddingBlock() { final BlockBody blockBody = new BlockBody(Collections.emptyList(), Collections.emptyList()); final Block testBlock = new Block(blockHeader, blockBody); newBlockHeadersSubscriptionService.onBlockAdded( BlockAddedEvent.createForHeadAdvancement(testBlock), blockchainQueries.getBlockchain()); verify(blockchainQueries, times(1)).getBlockchain(); }
@Test public void shouldBecomeInSyncWhenOurBlockchainCatchesUp() { setupOutOfSyncState(); when(blockchain.getChainHeadBlockNumber()).thenReturn(TARGET_SYNC_NUMBER); blockAddedObserver.onBlockAdded( BlockAddedEvent.createForHeadAdvancement( new Block( targetBlockHeader(), new BlockBody(Collections.emptyList(), Collections.emptyList()))), blockchain); assertThat(syncState.isInSync()).isTrue(); verify(inSyncListener).onSyncStatusChanged(true); }
private void recordNewBlockEvent() { filterManager.recordBlockEvent( BlockAddedEvent.createForHeadAdvancement(new BlockDataGenerator().block()), blockchainQueries.getBlockchain()); }
@Test public void shouldRecheckTrailingPeersWhenBlockAddedThatIsMultipleOf100() { final EthPeer ethPeer1 = addPeerWithEstimatedHeight(1); addPeerWithEstimatedHeight(3); addPeerWithEstimatedHeight(2); final BlockAddedEvent blockAddedEvent = BlockAddedEvent.createForHeadAdvancement( new Block( new BlockHeaderTestFixture().number(500).buildHeader(), new BlockBody(emptyList(), emptyList()))); trailingPeerLimiter.onBlockAdded(blockAddedEvent, blockchain); assertDisconnections(ethPeer1); }
@Test public void shouldNotRecheckTrailingPeersWhenBlockAddedIsNotAMultipleOf100() { addPeerWithEstimatedHeight(1); addPeerWithEstimatedHeight(3); addPeerWithEstimatedHeight(2); final BlockAddedEvent blockAddedEvent = BlockAddedEvent.createForHeadAdvancement( new Block( new BlockHeaderTestFixture().number(599).buildHeader(), new BlockBody(emptyList(), emptyList()))); trailingPeerLimiter.onBlockAdded(blockAddedEvent, blockchain); assertDisconnections(); }
private Hash appendBlockToBlockchain() { final long blockNumber = currentBlock.getHeader().getNumber() + 1; final Hash parentHash = currentBlock.getHash(); final BlockDataGenerator.BlockOptions options = new BlockDataGenerator.BlockOptions().setBlockNumber(blockNumber).setParentHash(parentHash); currentBlock = blockGenerator.block(options); filterManager.recordBlockEvent( BlockAddedEvent.createForHeadAdvancement(currentBlock), blockchainQueries.getBlockchain()); return currentBlock.getHash(); }