private void respondPartially(
      final List<RespondingEthPeer> peers,
      final WorldStateArchive remoteWorldStateArchive,
      final CompletableFuture<?> downloaderFuture) {
    final RespondingEthPeer.Responder fullResponder =
        RespondingEthPeer.blockchainResponder(
            mock(Blockchain.class), remoteWorldStateArchive, mock(TransactionPool.class));
    final RespondingEthPeer.Responder partialResponder =
        RespondingEthPeer.partialResponder(
            mock(Blockchain.class),
            remoteWorldStateArchive,
            mock(TransactionPool.class),
            ProtocolScheduleFixture.MAINNET,
            .5f);
    final RespondingEthPeer.Responder emptyResponder = RespondingEthPeer.emptyResponder();

    // Send a few partial responses
    for (int i = 0; i < 5; i++) {
      for (final RespondingEthPeer peer : peers) {
        peer.respond(partialResponder);
      }
      giveOtherThreadsAGo();
    }

    // Downloader should not complete with partial responses
    assertThat(downloaderFuture).isNotDone();

    // Send a few empty responses
    for (int i = 0; i < 3; i++) {
      for (final RespondingEthPeer peer : peers) {
        peer.respond(emptyResponder);
      }
      giveOtherThreadsAGo();
    }

    // Downloader should not complete with empty responses
    assertThat(downloaderFuture).isNotDone();

    respondUntilDone(peers, fullResponder, downloaderFuture);
  }
Returns the first set of node hashes that would need to be requested from the network after
retrieving the root node in order to rebuild the trie represented by the given rootHash and
storage.

@param storage Storage holding node data required to reconstitute the trie represented by
    rootHash
@param rootHash The hash of the root node of some trie
@return A list of node hashes
ethereum/eth/src/test/java/org/hyperledger/besu/ethereum/eth/sync/fastsync/worldstate/FastWorldStateDownloaderTest.java