code: def test_async_with_retries_succeeds_after_backoff_on_transient_error(
      self,
  ):
      attempt_times = []
      fake_time = test_util.FakeTime()
  
      # Setup: Server which passes on the third attempt.
      def handler(request, context):
          attempt_times.append(fake_time.time())
          if len(attempt_times) < 3:
              context.abort(grpc.StatusCode.UNAVAILABLE, "foo")
          return make_response(request.nonce)
  
      server = TestGrpcServer(handler)
      with server.run() as client:
          # Execute `async_call_with_retries` against the scripted server.
          future = grpc_util.async_call_with_retries(
              client.TestRpc,
              make_request(42),
              clock=fake_time,
          )
          # Expect:
          # 1) The response contains the expected value.
          # 2) The number of attempts and delays between them.
          self.assertEqual(make_response(42), future.result(2))
          self.assertLen(attempt_times, 3)
          self.assertBetween(attempt_times[1] - attempt_times[0], 2, 4)
          self.assertBetween(attempt_times[2] - attempt_times[1], 4, 8)
  
imports: import contextlib
  import hashlib
  import threading
  import time
  from concurrent import futures
  import grpc
  from tensorboard.util import grpc_util
  from tensorboard.util import grpc_util_test_pb2
  from tensorboard.util import grpc_util_test_pb2_grpc
  from tensorboard.util import test_util
  from tensorboard import test
  from tensorboard import version
label_desc: Use image node_id 5 for calling the AsyncCallWithRetriesTest obj's underlying member method code with example usage: obj.test_async_with_retries_succeeds_after_backoff_on_transient_error() and returns: make_response