add exponential backoff and tests