@Test
  public void expiredDeadlineCancelsStream_CallOptions() {
    fakeClock.forwardTime(System.nanoTime(), TimeUnit.NANOSECONDS);
    ClientCallImpl<Void, Void> call =
        new ClientCallImpl<Void, Void>(
            DESCRIPTOR,
            MoreExecutors.directExecutor(),
            CallOptions.DEFAULT.withDeadline(Deadline.after(1000, TimeUnit.MILLISECONDS)),
            provider,
            deadlineCancellationExecutor);

    call.start(callListener, new Metadata());

    fakeClock.forwardMillis(1001);

    verify(stream, times(1)).cancel(statusCaptor.capture());
    assertEquals(Status.Code.DEADLINE_EXCEEDED, statusCaptor.getValue().getCode());
  }
 @Test
 public void deadlineExceededBeforeCallStarted() {
   CallOptions callOptions = CallOptions.DEFAULT.withDeadlineAfter(0, TimeUnit.SECONDS);
   fakeClock.forwardTime(System.nanoTime(), TimeUnit.NANOSECONDS);
   ClientCallImpl<Void, Void> call =
       new ClientCallImpl<Void, Void>(
               DESCRIPTOR,
               new SerializingExecutor(Executors.newSingleThreadExecutor()),
               callOptions,
               provider,
               deadlineCancellationExecutor)
           .setDecompressorRegistry(decompressorRegistry);
   call.start(callListener, new Metadata());
   verify(transport, times(0)).newStream(any(MethodDescriptor.class), any(Metadata.class));
   verify(callListener, timeout(1000)).onClose(statusCaptor.capture(), any(Metadata.class));
   assertEquals(Status.Code.DEADLINE_EXCEEDED, statusCaptor.getValue().getCode());
   verifyZeroInteractions(provider);
 }
  @Test
  public void streamCancelAbortsDeadlineTimer() {
    fakeClock.forwardTime(System.nanoTime(), TimeUnit.NANOSECONDS);

    ClientCallImpl<Void, Void> call =
        new ClientCallImpl<Void, Void>(
            DESCRIPTOR,
            MoreExecutors.directExecutor(),
            CallOptions.DEFAULT.withDeadline(Deadline.after(1000, TimeUnit.MILLISECONDS)),
            provider,
            deadlineCancellationExecutor);
    call.start(callListener, new Metadata());
    call.cancel("canceled", null);

    // Run the deadline timer, which should have been cancelled by the previous call to cancel()
    fakeClock.forwardMillis(1001);

    verify(stream, times(1)).cancel(statusCaptor.capture());

    assertEquals(Status.CANCELLED.getCode(), statusCaptor.getValue().getCode());
  }