private void doFixedCountSuccessfulResponseTest(int successfulResponsesCount, boolean shouldSucceed,
      ServerErrorCode errorCodeToReturn) throws Exception {
    List<MockServer> serversInLocalDc = new ArrayList<>();
    serverLayout.getMockServers().forEach(mockServer -> {
      if (mockServer.getDataCenter().equals(localDc)) {
        serversInLocalDc.add(mockServer);
      }
    });
    if (successfulResponsesCount > serversInLocalDc.size()) {
      throw new IllegalArgumentException(successfulResponsesCount + " > num servers: " + serverCount);
    }
    List<ServerErrorCode> serverErrorCodes = Collections.nCopies(serverCount, ServerErrorCode.BlobNotFound);
    setServerErrorCodes(serverErrorCodes, serverLayout);
    if (successfulResponsesCount > 0) {
      for (int i = 0; i < successfulResponsesCount; i++) {
        serversInLocalDc.get(i).setServerErrorForAllRequests(errorCodeToReturn);
      }
      // Set error code from other local dc servers as Disk_Unavailable since it is not practical that we get 1 found
      // and 2 not found from healthy local dc servers.
      for (int i = successfulResponsesCount; i < serversInLocalDc.size(); i++) {
        serversInLocalDc.get(i).setServerErrorForAllRequests(ServerErrorCode.DiskUnavailable);
      }
    }
    RouterErrorCode expectedErrorCode =
        (successfulResponsesCount > 0) ? RouterErrorCode.AmbryUnavailable : RouterErrorCode.BlobDoesNotExist;
    executeOpAndVerify(blobIds, shouldSucceed ? null : expectedErrorCode, false, true, true, false, false);
    serverLayout.getMockServers().forEach(MockServer::resetServerErrors);
  }
Does the fixed count successful response test by setting the appropriate number of successful responses
@param successfulResponsesCount the number of successful responses
@param shouldSucceed {@code true} if the operation must succeed
@param errorCodeToReturn the {@link ServerErrorCode} to configure the servers to return
@throws Exception
ambry-router/src/test/java/com/github/ambry/router/TtlUpdateManagerTest.java