io.grpc.Status#fromCode ( )源码实例Demo

下面列出了io.grpc.Status#fromCode ( ) 实例代码,或者点击链接到github查看源代码,也可以在右侧发表评论。


@Test
public void headersRead_closed() {
  ClientStream mockStream1 = mock(ClientStream.class);
  doReturn(mockStream1).when(retriableStreamRecorder).newSubstream(0);
  InOrder inOrder = inOrder(retriableStreamRecorder);

  retriableStream.start(masterListener);

  ArgumentCaptor<ClientStreamListener> sublistenerCaptor1 =
      ArgumentCaptor.forClass(ClientStreamListener.class);
  verify(mockStream1).start(sublistenerCaptor1.capture());

  sublistenerCaptor1.getValue().headersRead(new Metadata());

  inOrder.verify(retriableStreamRecorder).postCommit();

  Status status = Status.fromCode(RETRIABLE_STATUS_CODE_1);
  Metadata metadata = new Metadata();
  sublistenerCaptor1.getValue().closed(status, metadata);

  verify(masterListener).closed(status, metadata);
  inOrder.verify(retriableStreamRecorder, never()).postCommit();
}
 

@Test
public void unretriableClosed_cancel() {
  ClientStream mockStream1 = mock(ClientStream.class);
  doReturn(mockStream1).when(retriableStreamRecorder).newSubstream(0);
  InOrder inOrder = inOrder(retriableStreamRecorder);

  retriableStream.start(masterListener);

  ArgumentCaptor<ClientStreamListener> sublistenerCaptor1 =
      ArgumentCaptor.forClass(ClientStreamListener.class);
  verify(mockStream1).start(sublistenerCaptor1.capture());

  // closed
  Status status = Status.fromCode(NON_RETRIABLE_STATUS_CODE);
  Metadata metadata = new Metadata();
  sublistenerCaptor1.getValue().closed(status, metadata);

  inOrder.verify(retriableStreamRecorder).postCommit();
  verify(masterListener).closed(status, metadata);

  // cancel
  retriableStream.cancel(Status.CANCELLED);
  inOrder.verify(retriableStreamRecorder, never()).postCommit();
}
 

@Test
public void droppedShouldNeverRetry() {
  ClientStream mockStream1 = mock(ClientStream.class);
  ClientStream mockStream2 = mock(ClientStream.class);
  doReturn(mockStream1).when(retriableStreamRecorder).newSubstream(0);
  doReturn(mockStream2).when(retriableStreamRecorder).newSubstream(1);

  // start
  retriableStream.start(masterListener);

  verify(retriableStreamRecorder).newSubstream(0);
  ArgumentCaptor<ClientStreamListener> sublistenerCaptor1 =
      ArgumentCaptor.forClass(ClientStreamListener.class);
  verify(mockStream1).start(sublistenerCaptor1.capture());

  // drop and verify no retry
  Status status = Status.fromCode(RETRIABLE_STATUS_CODE_1);
  sublistenerCaptor1.getValue().closed(status, DROPPED, new Metadata());

  verifyNoMoreInteractions(mockStream1, mockStream2);
  verify(retriableStreamRecorder).postCommit();
  verify(masterListener).closed(same(status), any(Metadata.class));
}
 
源代码4 项目: grpc-java   文件: RetriableStreamTest.java

@Test
public void headersRead_closed() {
  ClientStream mockStream1 = mock(ClientStream.class);
  doReturn(mockStream1).when(retriableStreamRecorder).newSubstream(0);
  InOrder inOrder = inOrder(retriableStreamRecorder);

  retriableStream.start(masterListener);

  ArgumentCaptor<ClientStreamListener> sublistenerCaptor1 =
      ArgumentCaptor.forClass(ClientStreamListener.class);
  verify(mockStream1).start(sublistenerCaptor1.capture());

  sublistenerCaptor1.getValue().headersRead(new Metadata());

  inOrder.verify(retriableStreamRecorder).postCommit();

  Status status = Status.fromCode(RETRIABLE_STATUS_CODE_1);
  Metadata metadata = new Metadata();
  sublistenerCaptor1.getValue().closed(status, metadata);

  verify(masterListener).closed(status, metadata);
  inOrder.verify(retriableStreamRecorder, never()).postCommit();
}
 
源代码5 项目: grpc-java   文件: RetriableStreamTest.java

@Test
public void unretriableClosed_cancel() {
  ClientStream mockStream1 = mock(ClientStream.class);
  doReturn(mockStream1).when(retriableStreamRecorder).newSubstream(0);
  InOrder inOrder = inOrder(retriableStreamRecorder);

  retriableStream.start(masterListener);

  ArgumentCaptor<ClientStreamListener> sublistenerCaptor1 =
      ArgumentCaptor.forClass(ClientStreamListener.class);
  verify(mockStream1).start(sublistenerCaptor1.capture());

  // closed
  Status status = Status.fromCode(NON_RETRIABLE_STATUS_CODE);
  Metadata metadata = new Metadata();
  sublistenerCaptor1.getValue().closed(status, metadata);

  inOrder.verify(retriableStreamRecorder).postCommit();
  verify(masterListener).closed(status, metadata);

  // cancel
  retriableStream.cancel(Status.CANCELLED);
  inOrder.verify(retriableStreamRecorder, never()).postCommit();
}
 
源代码6 项目: grpc-java   文件: RetriableStreamTest.java

@Test
public void droppedShouldNeverRetry() {
  ClientStream mockStream1 = mock(ClientStream.class);
  ClientStream mockStream2 = mock(ClientStream.class);
  doReturn(mockStream1).when(retriableStreamRecorder).newSubstream(0);
  doReturn(mockStream2).when(retriableStreamRecorder).newSubstream(1);

  // start
  retriableStream.start(masterListener);

  verify(retriableStreamRecorder).newSubstream(0);
  ArgumentCaptor<ClientStreamListener> sublistenerCaptor1 =
      ArgumentCaptor.forClass(ClientStreamListener.class);
  verify(mockStream1).start(sublistenerCaptor1.capture());

  // drop and verify no retry
  Status status = Status.fromCode(RETRIABLE_STATUS_CODE_1);
  sublistenerCaptor1.getValue().closed(status, DROPPED, new Metadata());

  verifyNoMoreInteractions(mockStream1, mockStream2);
  verify(retriableStreamRecorder).postCommit();
  verify(masterListener).closed(same(status), any(Metadata.class));
}
 

@Test
public void retry_headersRead_closed() {
  ClientStream mockStream1 = mock(ClientStream.class);
  doReturn(mockStream1).when(retriableStreamRecorder).newSubstream(0);
  InOrder inOrder = inOrder(retriableStreamRecorder);

  retriableStream.start(masterListener);

  ArgumentCaptor<ClientStreamListener> sublistenerCaptor1 =
      ArgumentCaptor.forClass(ClientStreamListener.class);
  verify(mockStream1).start(sublistenerCaptor1.capture());

  // retry
  ClientStream mockStream2 = mock(ClientStream.class);
  doReturn(mockStream2).when(retriableStreamRecorder).newSubstream(1);
  sublistenerCaptor1.getValue().closed(Status.fromCode(RETRIABLE_STATUS_CODE_1), new Metadata());
  fakeClock.forwardTime((long) (INITIAL_BACKOFF_IN_SECONDS * FAKE_RANDOM), TimeUnit.SECONDS);

  ArgumentCaptor<ClientStreamListener> sublistenerCaptor2 =
      ArgumentCaptor.forClass(ClientStreamListener.class);
  verify(mockStream2).start(sublistenerCaptor2.capture());
  inOrder.verify(retriableStreamRecorder, never()).postCommit();

  // headersRead
  sublistenerCaptor2.getValue().headersRead(new Metadata());

  inOrder.verify(retriableStreamRecorder).postCommit();

  // closed even with retriable status
  Status status = Status.fromCode(RETRIABLE_STATUS_CODE_1);
  Metadata metadata = new Metadata();
  sublistenerCaptor2.getValue().closed(status, metadata);

  verify(masterListener).closed(status, metadata);
  inOrder.verify(retriableStreamRecorder, never()).postCommit();
}
 

@Test
public void cancel_closed() {
  ClientStream mockStream1 = mock(ClientStream.class);
  doReturn(mockStream1).when(retriableStreamRecorder).newSubstream(0);
  InOrder inOrder = inOrder(retriableStreamRecorder);

  retriableStream.start(masterListener);

  ArgumentCaptor<ClientStreamListener> sublistenerCaptor1 =
      ArgumentCaptor.forClass(ClientStreamListener.class);
  verify(mockStream1).start(sublistenerCaptor1.capture());

  // cancel
  retriableStream.cancel(Status.CANCELLED);

  inOrder.verify(retriableStreamRecorder).postCommit();
  ArgumentCaptor<Status> statusCaptor = ArgumentCaptor.forClass(Status.class);
  verify(mockStream1).cancel(statusCaptor.capture());
  assertEquals(Status.CANCELLED.getCode(), statusCaptor.getValue().getCode());
  assertEquals(CANCELLED_BECAUSE_COMMITTED, statusCaptor.getValue().getDescription());

  // closed even with retriable status
  Status status = Status.fromCode(RETRIABLE_STATUS_CODE_1);
  Metadata metadata = new Metadata();
  sublistenerCaptor1.getValue().closed(status, metadata);
  inOrder.verify(retriableStreamRecorder, never()).postCommit();
}
 

@Test
public void retry_cancel_closed() {
  ClientStream mockStream1 = mock(ClientStream.class);
  doReturn(mockStream1).when(retriableStreamRecorder).newSubstream(0);
  InOrder inOrder = inOrder(retriableStreamRecorder);

  retriableStream.start(masterListener);

  ArgumentCaptor<ClientStreamListener> sublistenerCaptor1 =
      ArgumentCaptor.forClass(ClientStreamListener.class);
  verify(mockStream1).start(sublistenerCaptor1.capture());

  // retry
  ClientStream mockStream2 = mock(ClientStream.class);
  doReturn(mockStream2).when(retriableStreamRecorder).newSubstream(1);
  sublistenerCaptor1.getValue().closed(Status.fromCode(RETRIABLE_STATUS_CODE_1), new Metadata());
  fakeClock.forwardTime((long) (INITIAL_BACKOFF_IN_SECONDS * FAKE_RANDOM), TimeUnit.SECONDS);

  ArgumentCaptor<ClientStreamListener> sublistenerCaptor2 =
      ArgumentCaptor.forClass(ClientStreamListener.class);
  verify(mockStream2).start(sublistenerCaptor2.capture());
  inOrder.verify(retriableStreamRecorder, never()).postCommit();

  // cancel
  retriableStream.cancel(Status.CANCELLED);

  inOrder.verify(retriableStreamRecorder).postCommit();
  ArgumentCaptor<Status> statusCaptor = ArgumentCaptor.forClass(Status.class);
  verify(mockStream2).cancel(statusCaptor.capture());
  assertEquals(Status.CANCELLED.getCode(), statusCaptor.getValue().getCode());
  assertEquals(CANCELLED_BECAUSE_COMMITTED, statusCaptor.getValue().getDescription());

  // closed
  Status status = Status.fromCode(NON_RETRIABLE_STATUS_CODE);
  Metadata metadata = new Metadata();
  sublistenerCaptor2.getValue().closed(status, metadata);
  inOrder.verify(retriableStreamRecorder, never()).postCommit();
}
 

@Test
public void retry_unretriableClosed_cancel() {
  ClientStream mockStream1 = mock(ClientStream.class);
  doReturn(mockStream1).when(retriableStreamRecorder).newSubstream(0);
  InOrder inOrder = inOrder(retriableStreamRecorder);

  retriableStream.start(masterListener);

  ArgumentCaptor<ClientStreamListener> sublistenerCaptor1 =
      ArgumentCaptor.forClass(ClientStreamListener.class);
  verify(mockStream1).start(sublistenerCaptor1.capture());

  // retry
  ClientStream mockStream2 = mock(ClientStream.class);
  doReturn(mockStream2).when(retriableStreamRecorder).newSubstream(1);
  sublistenerCaptor1.getValue().closed(Status.fromCode(RETRIABLE_STATUS_CODE_1), new Metadata());
  fakeClock.forwardTime((long) (INITIAL_BACKOFF_IN_SECONDS * FAKE_RANDOM), TimeUnit.SECONDS);

  ArgumentCaptor<ClientStreamListener> sublistenerCaptor2 =
      ArgumentCaptor.forClass(ClientStreamListener.class);
  verify(mockStream2).start(sublistenerCaptor2.capture());
  inOrder.verify(retriableStreamRecorder, never()).postCommit();

  // closed
  Status status = Status.fromCode(NON_RETRIABLE_STATUS_CODE);
  Metadata metadata = new Metadata();
  sublistenerCaptor2.getValue().closed(status, metadata);

  inOrder.verify(retriableStreamRecorder).postCommit();
  verify(masterListener).closed(status, metadata);

  // cancel
  retriableStream.cancel(Status.CANCELLED);
  inOrder.verify(retriableStreamRecorder, never()).postCommit();
}
 

private Runnable retriable(final Code code) {
  return new Runnable() {
    boolean failed = false;

    @Override
    public void run() {
      if (!failed) {
        failed = true;
        throw new StatusRuntimeException(Status.fromCode(code));
      }
    }
  };
}
 
源代码12 项目: grpc-java   文件: RetriableStreamTest.java

@Test
public void retry_headersRead_closed() {
  ClientStream mockStream1 = mock(ClientStream.class);
  doReturn(mockStream1).when(retriableStreamRecorder).newSubstream(0);
  InOrder inOrder = inOrder(retriableStreamRecorder);

  retriableStream.start(masterListener);

  ArgumentCaptor<ClientStreamListener> sublistenerCaptor1 =
      ArgumentCaptor.forClass(ClientStreamListener.class);
  verify(mockStream1).start(sublistenerCaptor1.capture());

  // retry
  ClientStream mockStream2 = mock(ClientStream.class);
  doReturn(mockStream2).when(retriableStreamRecorder).newSubstream(1);
  sublistenerCaptor1.getValue().closed(Status.fromCode(RETRIABLE_STATUS_CODE_1), new Metadata());
  fakeClock.forwardTime((long) (INITIAL_BACKOFF_IN_SECONDS * FAKE_RANDOM), TimeUnit.SECONDS);

  ArgumentCaptor<ClientStreamListener> sublistenerCaptor2 =
      ArgumentCaptor.forClass(ClientStreamListener.class);
  verify(mockStream2).start(sublistenerCaptor2.capture());
  inOrder.verify(retriableStreamRecorder, never()).postCommit();

  // headersRead
  sublistenerCaptor2.getValue().headersRead(new Metadata());

  inOrder.verify(retriableStreamRecorder).postCommit();

  // closed even with retriable status
  Status status = Status.fromCode(RETRIABLE_STATUS_CODE_1);
  Metadata metadata = new Metadata();
  sublistenerCaptor2.getValue().closed(status, metadata);

  verify(masterListener).closed(status, metadata);
  inOrder.verify(retriableStreamRecorder, never()).postCommit();
}
 
源代码13 项目: grpc-java   文件: RetriableStreamTest.java

@Test
public void cancel_closed() {
  ClientStream mockStream1 = mock(ClientStream.class);
  doReturn(mockStream1).when(retriableStreamRecorder).newSubstream(0);
  InOrder inOrder = inOrder(retriableStreamRecorder);

  retriableStream.start(masterListener);

  ArgumentCaptor<ClientStreamListener> sublistenerCaptor1 =
      ArgumentCaptor.forClass(ClientStreamListener.class);
  verify(mockStream1).start(sublistenerCaptor1.capture());

  // cancel
  retriableStream.cancel(Status.CANCELLED);

  inOrder.verify(retriableStreamRecorder).postCommit();
  ArgumentCaptor<Status> statusCaptor = ArgumentCaptor.forClass(Status.class);
  verify(mockStream1).cancel(statusCaptor.capture());
  assertEquals(Status.CANCELLED.getCode(), statusCaptor.getValue().getCode());
  assertEquals(CANCELLED_BECAUSE_COMMITTED, statusCaptor.getValue().getDescription());

  // closed even with retriable status
  Status status = Status.fromCode(RETRIABLE_STATUS_CODE_1);
  Metadata metadata = new Metadata();
  sublistenerCaptor1.getValue().closed(status, metadata);
  inOrder.verify(retriableStreamRecorder, never()).postCommit();
}
 
源代码14 项目: grpc-java   文件: RetriableStreamTest.java

@Test
public void retry_cancel_closed() {
  ClientStream mockStream1 = mock(ClientStream.class);
  doReturn(mockStream1).when(retriableStreamRecorder).newSubstream(0);
  InOrder inOrder = inOrder(retriableStreamRecorder);

  retriableStream.start(masterListener);

  ArgumentCaptor<ClientStreamListener> sublistenerCaptor1 =
      ArgumentCaptor.forClass(ClientStreamListener.class);
  verify(mockStream1).start(sublistenerCaptor1.capture());

  // retry
  ClientStream mockStream2 = mock(ClientStream.class);
  doReturn(mockStream2).when(retriableStreamRecorder).newSubstream(1);
  sublistenerCaptor1.getValue().closed(Status.fromCode(RETRIABLE_STATUS_CODE_1), new Metadata());
  fakeClock.forwardTime((long) (INITIAL_BACKOFF_IN_SECONDS * FAKE_RANDOM), TimeUnit.SECONDS);

  ArgumentCaptor<ClientStreamListener> sublistenerCaptor2 =
      ArgumentCaptor.forClass(ClientStreamListener.class);
  verify(mockStream2).start(sublistenerCaptor2.capture());
  inOrder.verify(retriableStreamRecorder, never()).postCommit();

  // cancel
  retriableStream.cancel(Status.CANCELLED);

  inOrder.verify(retriableStreamRecorder).postCommit();
  ArgumentCaptor<Status> statusCaptor = ArgumentCaptor.forClass(Status.class);
  verify(mockStream2).cancel(statusCaptor.capture());
  assertEquals(Status.CANCELLED.getCode(), statusCaptor.getValue().getCode());
  assertEquals(CANCELLED_BECAUSE_COMMITTED, statusCaptor.getValue().getDescription());

  // closed
  Status status = Status.fromCode(NON_RETRIABLE_STATUS_CODE);
  Metadata metadata = new Metadata();
  sublistenerCaptor2.getValue().closed(status, metadata);
  inOrder.verify(retriableStreamRecorder, never()).postCommit();
}
 
源代码15 项目: grpc-java   文件: RetriableStreamTest.java

@Test
public void retry_unretriableClosed_cancel() {
  ClientStream mockStream1 = mock(ClientStream.class);
  doReturn(mockStream1).when(retriableStreamRecorder).newSubstream(0);
  InOrder inOrder = inOrder(retriableStreamRecorder);

  retriableStream.start(masterListener);

  ArgumentCaptor<ClientStreamListener> sublistenerCaptor1 =
      ArgumentCaptor.forClass(ClientStreamListener.class);
  verify(mockStream1).start(sublistenerCaptor1.capture());

  // retry
  ClientStream mockStream2 = mock(ClientStream.class);
  doReturn(mockStream2).when(retriableStreamRecorder).newSubstream(1);
  sublistenerCaptor1.getValue().closed(Status.fromCode(RETRIABLE_STATUS_CODE_1), new Metadata());
  fakeClock.forwardTime((long) (INITIAL_BACKOFF_IN_SECONDS * FAKE_RANDOM), TimeUnit.SECONDS);

  ArgumentCaptor<ClientStreamListener> sublistenerCaptor2 =
      ArgumentCaptor.forClass(ClientStreamListener.class);
  verify(mockStream2).start(sublistenerCaptor2.capture());
  inOrder.verify(retriableStreamRecorder, never()).postCommit();

  // closed
  Status status = Status.fromCode(NON_RETRIABLE_STATUS_CODE);
  Metadata metadata = new Metadata();
  sublistenerCaptor2.getValue().closed(status, metadata);

  inOrder.verify(retriableStreamRecorder).postCommit();
  verify(masterListener).closed(status, metadata);

  // cancel
  retriableStream.cancel(Status.CANCELLED);
  inOrder.verify(retriableStreamRecorder, never()).postCommit();
}
 
源代码16 项目: grpc-java   文件: RetriableStreamTest.java

@Test
public void hedging_transparentRetryNotAllowed() {
  ClientStream mockStream1 = mock(ClientStream.class);
  ClientStream mockStream2 = mock(ClientStream.class);
  ClientStream mockStream3 = mock(ClientStream.class);
  when(retriableStreamRecorder.newSubstream(anyInt()))
      .thenReturn(mockStream1, mockStream2, mockStream3);

  hedgingStream.start(masterListener);
  ArgumentCaptor<ClientStreamListener> sublistenerCaptor1 =
      ArgumentCaptor.forClass(ClientStreamListener.class);
  verify(mockStream1).start(sublistenerCaptor1.capture());

  fakeClock.forwardTime(HEDGING_DELAY_IN_SECONDS, TimeUnit.SECONDS);
  ArgumentCaptor<ClientStreamListener> sublistenerCaptor2 =
      ArgumentCaptor.forClass(ClientStreamListener.class);
  verify(mockStream2).start(sublistenerCaptor2.capture());

  fakeClock.forwardTime(HEDGING_DELAY_IN_SECONDS, TimeUnit.SECONDS);
  ArgumentCaptor<ClientStreamListener> sublistenerCaptor3 =
      ArgumentCaptor.forClass(ClientStreamListener.class);
  verify(mockStream3).start(sublistenerCaptor3.capture());

  sublistenerCaptor2.getValue()
      .closed(Status.fromCode(NON_FATAL_STATUS_CODE_1), new Metadata());

  // no more transparent retry
  Status status = Status.fromCode(FATAL_STATUS_CODE);
  Metadata metadata = new Metadata();
  sublistenerCaptor3.getValue()
      .closed(status, REFUSED, metadata);

  ArgumentCaptor<Status> statusCaptor = ArgumentCaptor.forClass(Status.class);
  verify(mockStream1).cancel(statusCaptor.capture());
  assertEquals(Status.CANCELLED.getCode(), statusCaptor.getValue().getCode());
  assertEquals(CANCELLED_BECAUSE_COMMITTED, statusCaptor.getValue().getDescription());
  verify(retriableStreamRecorder).postCommit();
  verify(masterListener).closed(status, metadata);
}
 
源代码17 项目: buck   文件: LocalFallbackStrategy.java

public FallbackStrategyBuildResult(
    String buildTarget,
    StrategyBuildResult remoteStrategyBuildResult,
    BuildStrategyContext strategyContext,
    BuckEventBus eventBus,
    boolean localFallbackEnabled,
    boolean localFallbackDisabledOnCorruptedArtifacts,
    boolean localFallbackEnabledForCompletedAction) {
  this.lock = new Object();
  this.localStrategyBuildResult = Optional.empty();
  this.buildTarget = buildTarget;
  this.remoteStrategyBuildResult = remoteStrategyBuildResult;
  this.strategyContext = strategyContext;
  this.combinedFinalResult = SettableFuture.create();
  this.hasCancellationBeenRequested = false;
  this.eventBus = eventBus;
  this.startedEvent = LocalFallbackEvent.createStarted(buildTarget);
  this.remoteBuildResult = Optional.empty();
  this.remoteExecutionTimer = Stopwatch.createStarted();
  this.remoteBuildErrorMessage = Optional.empty();
  this.localFallbackEnabled = localFallbackEnabled;
  this.localFallbackDisabledOnCorruptedArtifacts = localFallbackDisabledOnCorruptedArtifacts;
  this.localFallbackEnabledForCompletedAction = localFallbackEnabledForCompletedAction;
  this.remoteGrpcStatus = Status.fromCode(Status.Code.OK);
  this.lastNonTerminalState = State.WAITING;
  this.exitCode = OptionalInt.empty();
  this.remoteExecutionMetadata = Optional.empty();

  this.eventBus.post(this.startedEvent);
  this.remoteStrategyBuildResult
      .getBuildResult()
      .addListener(
          () -> onMainBuildFinished(remoteStrategyBuildResult.getBuildResult()),
          MoreExecutors.directExecutor());
}
 
源代码18 项目: grpc-java   文件: RetriableStreamTest.java

@Test
public void hedging_transparentRetry() {
  ClientStream mockStream1 = mock(ClientStream.class);
  ClientStream mockStream2 = mock(ClientStream.class);
  ClientStream mockStream3 = mock(ClientStream.class);
  ClientStream mockStream4 = mock(ClientStream.class);
  when(retriableStreamRecorder.newSubstream(anyInt()))
      .thenReturn(mockStream1, mockStream2, mockStream3, mockStream4);

  hedgingStream.start(masterListener);
  ArgumentCaptor<ClientStreamListener> sublistenerCaptor1 =
      ArgumentCaptor.forClass(ClientStreamListener.class);
  verify(mockStream1).start(sublistenerCaptor1.capture());

  fakeClock.forwardTime(HEDGING_DELAY_IN_SECONDS, TimeUnit.SECONDS);
  ArgumentCaptor<ClientStreamListener> sublistenerCaptor2 =
      ArgumentCaptor.forClass(ClientStreamListener.class);
  verify(mockStream2).start(sublistenerCaptor2.capture());

  fakeClock.forwardTime(HEDGING_DELAY_IN_SECONDS, TimeUnit.SECONDS);
  ArgumentCaptor<ClientStreamListener> sublistenerCaptor3 =
      ArgumentCaptor.forClass(ClientStreamListener.class);
  verify(mockStream3).start(sublistenerCaptor3.capture());

  // transparent retry for hedge2
  sublistenerCaptor2.getValue()
      .closed(Status.fromCode(FATAL_STATUS_CODE), REFUSED, new Metadata());

  ArgumentCaptor<ClientStreamListener> sublistenerCaptor4 =
      ArgumentCaptor.forClass(ClientStreamListener.class);
  verify(mockStream4).start(sublistenerCaptor4.capture());
  assertEquals(1, fakeClock.numPendingTasks());

  // no more transparent retry
  Status status = Status.fromCode(FATAL_STATUS_CODE);
  Metadata metadata = new Metadata();
  sublistenerCaptor3.getValue()
      .closed(status, REFUSED, metadata);

  ArgumentCaptor<Status> statusCaptor = ArgumentCaptor.forClass(Status.class);
  verify(mockStream1).cancel(statusCaptor.capture());
  assertEquals(Status.CANCELLED.getCode(), statusCaptor.getValue().getCode());
  assertEquals(CANCELLED_BECAUSE_COMMITTED, statusCaptor.getValue().getDescription());
  verify(mockStream4).cancel(statusCaptor.capture());
  assertEquals(Status.CANCELLED.getCode(), statusCaptor.getValue().getCode());
  assertEquals(CANCELLED_BECAUSE_COMMITTED, statusCaptor.getValue().getDescription());
  verify(retriableStreamRecorder).postCommit();
  verify(masterListener).closed(status, metadata);
}