private void executeOpAndVerifyQuotaRejected(Collection<String> ids, RouterErrorCode expectedErrorCode)
      throws Exception {
    FutureResult<Void> future = new FutureResult<>();
    router.currentOperationsCount.addAndGet(ids.size());
    List<String> chunkIds = new ArrayList<>(ids);
    undeleteManager.submitUndeleteOperation(chunkIds.get(0), chunkIds.subList(1, chunkIds.size()), UNDELETE_SERVICE_ID,
        future, future::done, quotaChargeCallback);
    sendRequestsGetResponse(future, undeleteManager, false, true);
    try {
      future.get(1, TimeUnit.MILLISECONDS);
      fail("Operation should fail, exception is expected");
    } catch (Exception e) {
      assertEquals("RouterErrorCode should be " + RouterErrorCode.TooManyRequests + " (future)",
          RouterErrorCode.TooManyRequests, ((RouterException) e.getCause()).getErrorCode());
    }
  }
Generates {@link Properties} that includes initial configuration.
@param parallelism undelete request parallelism.
@return Properties
ambry-router/src/test/java/com/github/ambry/router/UndeleteManagerTest.java