private Future<String> completeOperation(String input, BlobProperties blobProperties, Callback<String> callback) {
      lastInput = input;
      lastBlobProperties = blobProperties;
      if (exceptionToThrow != null) {
        throw exceptionToThrow;
      }
      FutureResult<String> futureResult = new FutureResult<String>();
      String toReturn = null;
      if (exceptionToReturn == null) {
        toReturn = translation == null ? returnInputIfTranslationNull ? input : null : translation;
      }
      lastConvertedId = toReturn;
      futureResult.done(toReturn, exceptionToReturn);
      if (callback != null) {
        callback.onCompletion(toReturn, exceptionToReturn);
      }
      return futureResult;
    }
Completes the operation by creating and invoking a {@link Future} and invoking the {@code callback} if non-null.

@param input          the original input ID received
@param blobProperties the blob info received.
@param callback       the {@link Callback} to invoke. Can be null.
@return the created {@link Future}.
ambry-frontend/src/test/java/com/github/ambry/frontend/FrontendRestRequestServiceTest.java