private void verifyUndelete(RestRequest restRequest, Account expectedAccount, Container expectedContainer)
      throws Exception {
    try {
      router.getBlob(blobId, new GetBlobOptionsBuilder().build()).get(1, TimeUnit.SECONDS);
      fail("Get blob should fail on a deleted blob");
    } catch (ExecutionException e) {
      RouterException routerException = (RouterException) e.getCause();
      assertEquals(RouterErrorCode.BlobDeleted, routerException.getErrorCode());
    }

    RestResponseChannel restResponseChannel = new MockRestResponseChannel();
    sendRequestGetResponse(restRequest, restResponseChannel);
    assertEquals("ResponseStatus not as expected", ResponseStatus.Ok, restResponseChannel.getStatus());
    assertNotNull("Date has not been set", restResponseChannel.getHeader(RestUtils.Headers.DATE));
    assertEquals("Content-length is not as expected", 0,
        Integer.parseInt((String) restResponseChannel.getHeader(RestUtils.Headers.CONTENT_LENGTH)));
    assertEquals("Account not as expected", expectedAccount,
        restRequest.getArgs().get(RestUtils.InternalKeys.TARGET_ACCOUNT_KEY));
    assertEquals("Container not as expected", expectedContainer,
        restRequest.getArgs().get(RestUtils.InternalKeys.TARGET_CONTAINER_KEY));

    router.getBlob(blobId, new GetBlobOptionsBuilder().build()).get(1, TimeUnit.SECONDS);
  }
Verifies that the blob is undeleted
@param restRequest the {@link RestRequest} to get a signed URL.
@param expectedAccount the {@link Account} that should be populated in {@link RestRequest}.
@param expectedContainer the {@link Container} that should be populated in {@link RestRequest}.
@throws Exception
ambry-frontend/src/test/java/com/github/ambry/frontend/UndeleteHandlerTest.java