static void undeleteBlob(ConnectedChannel channel, BlobId blobId, long ts, ServerErrorCode expectedErrorCode,
      short lifeVersion) throws Exception {
    UndeleteRequest undeleteRequest = new UndeleteRequest(1, "undeleteClient", blobId, ts);
    DataInputStream stream = channel.sendAndReceive(undeleteRequest).getInputStream();
    UndeleteResponse undeleteResponse = UndeleteResponse.readFrom(stream);
    releaseNettyBufUnderneathStream(stream);
    Assert.assertEquals("Unexpected ServerErrorCode for UndeleteRequest", expectedErrorCode, undeleteResponse.getError());
    if (undeleteResponse.getError() == ServerErrorCode.NoError
        || undeleteResponse.getError() == ServerErrorCode.BlobAlreadyUndeleted) {
      Assert.assertEquals(lifeVersion, undeleteResponse.getLifeVersion());
    }
  }
Updates the TTL of the given {@code blobId}
@param channel the {@link ConnectedChannel} to make the {@link GetRequest} on.
@param blobId the ID of the blob to TTL update
@param ts the operation time
@param expectedError expected error code
@throws IOException
ambry-test-utils/src/main/java/com/github/ambry/server/ServerTestUtil.java