### Question:
SyncProcessor implements SyncEventsHandler { public void processStatus(MessageChannel sender, Status status) { logger.trace("Receiving syncState from node {} block {} {}", sender.getPeerNodeID(), status.getBestBlockNumber(), HashUtil.shortHash(status.getBestBlockHash())); peerStatuses.registerPeer(sender.getPeerNodeID()).setStatus(status); syncState.newPeerStatus(); } SyncProcessor(Blockchain blockchain,
                         BlockSyncService blockSyncService,
                         PeerScoringManager peerScoringManager,
                         ChannelManager channelManager,
                         SyncConfiguration syncConfiguration,
                         BlockHeaderValidationRule blockHeaderValidationRule,
                         DifficultyCalculator difficultyCalculator); void processStatus(MessageChannel sender, Status status); void processSkeletonResponse(MessageChannel peer, SkeletonResponseMessage message); void processBlockHashResponse(MessageChannel peer, BlockHashResponseMessage message); void processBlockHeadersResponse(MessageChannel peer, BlockHeadersResponseMessage message); void processBodyResponse(MessageChannel peer, BodyResponseMessage message); void processNewBlockHash(MessageChannel peer, NewBlockHashMessage message); void processBlockResponse(MessageChannel peer, BlockResponseMessage message); @Override boolean sendSkeletonRequest(NodeID nodeID, long height); @Override boolean sendBlockHashRequest(long height); @Override boolean sendBlockHeadersRequest(ChunkDescriptor chunk); @Override Long sendBodyRequest(@Nonnull BlockHeader header, NodeID peerId); Set<NodeID> getKnownPeersNodeIDs(); void onTimePassed(Duration timePassed); @Override void startSyncing(NodeID nodeID); @Override void startDownloadingBodies(List<Deque<BlockHeader>> pendingHeaders, Map<NodeID, List<BlockIdentifier>> skeletons); @Override void startDownloadingHeaders(Map<NodeID, List<BlockIdentifier>> skeletons, long connectionPoint); @Override void startDownloadingSkeleton(long connectionPoint); @Override void startFindingConnectionPoint(); @Override void stopSyncing(); @Override void onErrorSyncing(String message, EventType eventType, Object... arguments); @Override void onSyncIssue(String message, Object... arguments); @Override void onCompletedSyncing(); @VisibleForTesting void registerExpectedMessage(MessageWithId message); @VisibleForTesting void setSelectedPeer(MessageChannel peer, Status status, long height); @VisibleForTesting SyncState getSyncState(); @VisibleForTesting boolean isPeerSyncing(NodeID nodeID); @VisibleForTesting Map<Long, MessageType> getExpectedResponses();  }### Answer:
@Test(expected = Exception.class) public void processBlockHashResponseWithUnknownHash() { Blockchain blockchain = BlockChainBuilder.ofSize(0); SimpleMessageChannel sender = new SimpleMessageChannel(new byte[] { 0x01 }); SyncProcessor processor = new SyncProcessor(blockchain, null, UscMockFactory.getPeerScoringManager(), getChannelManager(), SyncConfiguration.IMMEDIATE_FOR_TESTING, new ProofOfWorkRule(config).setFallbackMiningEnabled(false), DIFFICULTY_CALCULATOR); processor.processStatus(sender, new Status(100, null)); }