Skip to content

Commit c692f73

Browse files
committed
core, opentelemetry, xds: Replace mock tracers and pickers in delay tests with concrete Fake implementations
1 parent 5fcca43 commit c692f73

3 files changed

Lines changed: 113 additions & 120 deletions

File tree

core/src/test/java/io/grpc/internal/DelayedClientTransportTest.java

Lines changed: 106 additions & 89 deletions
Original file line numberDiff line numberDiff line change
@@ -51,6 +51,10 @@
5151
import io.grpc.StringMarshaller;
5252
import io.grpc.SynchronizationContext;
5353
import io.grpc.internal.ClientStreamListener.RpcProgress;
54+
import java.util.ArrayList;
55+
import java.util.Arrays;
56+
import java.util.Collections;
57+
import java.util.List;
5458
import java.util.concurrent.CyclicBarrier;
5559
import java.util.concurrent.TimeUnit;
5660
import java.util.concurrent.atomic.AtomicBoolean;
@@ -774,152 +778,165 @@ public void pendingStream_appendTimeoutInsight_waitForReady_withLastPickFailure(
774778

775779
@Test
776780
public void streamDelayMetrics() {
777-
ClientStreamTracer mockTracer = mock(ClientStreamTracer.class);
778-
ClientStreamTracer[] customTracers = new ClientStreamTracer[] { mockTracer };
779-
780-
SubchannelPicker connectingPicker = mock(SubchannelPicker.class);
781-
when(connectingPicker.pickSubchannel(any(PickSubchannelArgs.class)))
782-
.thenReturn(PickResult.withNoResult("connecting", "pick_first: attempting to connect"));
783-
784-
delayedTransport.reprocess(connectingPicker);
781+
FakeStreamTracer fakeTracer = new FakeStreamTracer();
782+
ClientStreamTracer[] customTracers = new ClientStreamTracer[] { fakeTracer };
783+
784+
delayedTransport.reprocess(fakePicker(
785+
PickResult.withNoResult("connecting", "pick_first: attempting to connect")));
785786
delayedTransport.newStream(method, headers, callOptions, customTracers);
786-
787-
InOrder inOrder = inOrder(mockTracer);
788-
inOrder.verify(mockTracer).recordAttemptDelayStart(
789-
"connecting", "pick_first: attempting to connect");
790-
791-
SubchannelPicker customDelayPicker = mock(SubchannelPicker.class);
792-
when(customDelayPicker.pickSubchannel(any(PickSubchannelArgs.class)))
793-
.thenReturn(PickResult.withNoResult("rls_lookup_pending", "RLS request pending."));
794-
795-
delayedTransport.reprocess(customDelayPicker);
796-
797-
inOrder.verify(mockTracer).recordAttemptDelayEnd();
798-
inOrder.verify(mockTracer).recordAttemptDelayStart(
799-
"rls_lookup_pending", "RLS request pending.");
800-
787+
788+
assertEquals(Collections.singletonList("connecting"), fakeTracer.startedDelayTypes);
789+
assertEquals(Collections.singletonList("pick_first: attempting to connect"),
790+
fakeTracer.startedDelayReasons);
791+
792+
delayedTransport.reprocess(fakePicker(
793+
PickResult.withNoResult("rls_lookup_pending", "RLS request pending.")));
794+
795+
assertEquals(1, fakeTracer.delayEndedCount);
796+
assertEquals(Arrays.asList("connecting", "rls_lookup_pending"),
797+
fakeTracer.startedDelayTypes);
798+
assertEquals(Arrays.asList("pick_first: attempting to connect", "RLS request pending."),
799+
fakeTracer.startedDelayReasons);
800+
801801
delayedTransport.reprocess(mockPicker);
802-
803-
inOrder.verify(mockTracer).recordAttemptDelayEnd();
802+
803+
assertEquals(2, fakeTracer.delayEndedCount);
804804
}
805805

806806
@Test
807807
public void streamDelayMetrics_cancelled() {
808-
ClientStreamTracer mockTracer = mock(ClientStreamTracer.class);
809-
ClientStreamTracer[] customTracers = new ClientStreamTracer[] { mockTracer };
810-
811-
SubchannelPicker connectingPicker = mock(SubchannelPicker.class);
812-
when(connectingPicker.pickSubchannel(any(PickSubchannelArgs.class)))
813-
.thenReturn(PickResult.withNoResult("connecting", "pick_first: attempting to connect"));
814-
815-
delayedTransport.reprocess(connectingPicker);
808+
FakeStreamTracer fakeTracer = new FakeStreamTracer();
809+
ClientStreamTracer[] customTracers = new ClientStreamTracer[] { fakeTracer };
810+
811+
delayedTransport.reprocess(fakePicker(
812+
PickResult.withNoResult("connecting", "pick_first: attempting to connect")));
816813
ClientStream stream = delayedTransport.newStream(method, headers, callOptions, customTracers);
817814
stream.start(streamListener);
818-
819-
verify(mockTracer).recordAttemptDelayStart(
820-
"connecting", "pick_first: attempting to connect");
821-
815+
816+
assertEquals(Collections.singletonList("connecting"), fakeTracer.startedDelayTypes);
817+
822818
stream.cancel(Status.CANCELLED);
823-
824-
verify(mockTracer).recordAttemptDelayEnd();
819+
820+
assertEquals(1, fakeTracer.delayEndedCount);
825821
}
826822

827823
@Test
828824
public void streamDelayMetrics_shutdownNow() {
829-
ClientStreamTracer mockTracer = mock(ClientStreamTracer.class);
830-
ClientStreamTracer[] customTracers = new ClientStreamTracer[] { mockTracer };
825+
FakeStreamTracer fakeTracer = new FakeStreamTracer();
826+
ClientStreamTracer[] customTracers = new ClientStreamTracer[] { fakeTracer };
831827

832-
SubchannelPicker connectingPicker = mock(SubchannelPicker.class);
833-
when(connectingPicker.pickSubchannel(any(PickSubchannelArgs.class)))
834-
.thenReturn(PickResult.withNoResult("connecting", "pick_first: attempting to connect"));
835-
836-
delayedTransport.reprocess(connectingPicker);
828+
delayedTransport.reprocess(fakePicker(
829+
PickResult.withNoResult("connecting", "pick_first: attempting to connect")));
837830
ClientStream stream = delayedTransport.newStream(method, headers, callOptions, customTracers);
838831
stream.start(streamListener);
839832

840-
verify(mockTracer).recordAttemptDelayStart(
841-
"connecting", "pick_first: attempting to connect");
833+
assertEquals(Collections.singletonList("connecting"), fakeTracer.startedDelayTypes);
842834

843835
delayedTransport.shutdownNow(Status.UNAVAILABLE);
844836

845-
verify(mockTracer).recordAttemptDelayEnd();
837+
assertEquals(1, fakeTracer.delayEndedCount);
846838
}
847839

848840
@Test
849841
public void streamDelayMetrics_cadenceReasonUpdate_doesNotStartNewTypeSegment() {
850-
ClientStreamTracer mockTracer = mock(ClientStreamTracer.class);
851-
ClientStreamTracer[] customTracers = new ClientStreamTracer[] { mockTracer };
852-
853-
SubchannelPicker picker1 = mock(SubchannelPicker.class);
854-
when(picker1.pickSubchannel(any(PickSubchannelArgs.class)))
855-
.thenReturn(PickResult.withNoResult("connecting", "attempt 1"));
842+
FakeStreamTracer fakeTracer = new FakeStreamTracer();
843+
ClientStreamTracer[] customTracers = new ClientStreamTracer[] { fakeTracer };
856844

857-
delayedTransport.reprocess(picker1);
845+
delayedTransport.reprocess(fakePicker(
846+
PickResult.withNoResult("connecting", "attempt 1")));
858847
delayedTransport.newStream(method, headers, callOptions, customTracers);
859848

860-
verify(mockTracer, times(1)).recordAttemptDelayStart("connecting", "attempt 1");
849+
assertEquals(Collections.singletonList("connecting"), fakeTracer.startedDelayTypes);
850+
assertEquals(Collections.singletonList("attempt 1"), fakeTracer.startedDelayReasons);
861851

862-
SubchannelPicker picker2 = mock(SubchannelPicker.class);
863-
when(picker2.pickSubchannel(any(PickSubchannelArgs.class)))
864-
.thenReturn(PickResult.withNoResult("connecting", "attempt 2"));
865-
866-
delayedTransport.reprocess(picker2);
852+
delayedTransport.reprocess(fakePicker(
853+
PickResult.withNoResult("connecting", "attempt 2")));
867854

868-
verify(mockTracer, times(1)).recordAttemptDelayStart("connecting", "attempt 1");
869-
verify(mockTracer).recordAttemptDelayReasonChanged("attempt 2");
870-
verify(mockTracer, never()).recordAttemptDelayEnd();
855+
assertEquals(Collections.singletonList("connecting"), fakeTracer.startedDelayTypes);
856+
assertEquals(Collections.singletonList("attempt 1"), fakeTracer.startedDelayReasons);
857+
assertEquals(Collections.singletonList("attempt 2"), fakeTracer.changedDelayReasons);
858+
assertEquals(0, fakeTracer.delayEndedCount);
871859
}
872860

873861
@Test
874862
public void streamDelayMetrics_channelFallback_clientChannelInit() {
875-
ClientStreamTracer mockTracer = mock(ClientStreamTracer.class);
876-
ClientStreamTracer[] customTracers = new ClientStreamTracer[] { mockTracer };
863+
FakeStreamTracer fakeTracer = new FakeStreamTracer();
864+
ClientStreamTracer[] customTracers = new ClientStreamTracer[] { fakeTracer };
877865

878866
// No picker reprocessed yet (lastPicker == null)
879867
delayedTransport.newStream(method, headers, callOptions, customTracers);
880868

881-
verify(mockTracer).recordAttemptDelayStart(
882-
"connecting", "client channel: waiting for picker");
869+
assertEquals(Collections.singletonList("connecting"), fakeTracer.startedDelayTypes);
870+
assertEquals(Collections.singletonList("client channel: waiting for picker"),
871+
fakeTracer.startedDelayReasons);
883872
}
884873

885874
@Test
886875
public void streamDelayMetrics_channelFallback_subchannelStateMismatch() {
887-
ClientStreamTracer mockTracer = mock(ClientStreamTracer.class);
888-
ClientStreamTracer[] customTracers = new ClientStreamTracer[] { mockTracer };
876+
FakeStreamTracer fakeTracer = new FakeStreamTracer();
877+
ClientStreamTracer[] customTracers = new ClientStreamTracer[] { fakeTracer };
889878

890879
io.grpc.LoadBalancer.Subchannel disconnectedSubchannel =
891880
mock(io.grpc.LoadBalancer.Subchannel.class);
892881
when(disconnectedSubchannel.getInternalSubchannel())
893882
.thenReturn(newTransportProvider(null));
894883

895-
SubchannelPicker stalePicker = mock(SubchannelPicker.class);
896-
when(stalePicker.pickSubchannel(any(PickSubchannelArgs.class)))
897-
.thenReturn(PickResult.withSubchannel(disconnectedSubchannel));
898-
899-
delayedTransport.reprocess(stalePicker);
884+
delayedTransport.reprocess(fakePicker(PickResult.withSubchannel(disconnectedSubchannel)));
900885
delayedTransport.newStream(method, headers, callOptions, customTracers);
901886

902-
verify(mockTracer).recordAttemptDelayStart(
903-
"subchannel_state_mismatch",
904-
"subchannel returned by LB picker has no connected subchannel");
887+
assertEquals(Collections.singletonList("subchannel_state_mismatch"),
888+
fakeTracer.startedDelayTypes);
889+
assertEquals(Collections.singletonList(
890+
"subchannel returned by LB picker has no connected subchannel"),
891+
fakeTracer.startedDelayReasons);
905892
}
906893

907894
@Test
908895
public void streamDelayMetrics_channelFallback_waitForReadyFailed() {
909-
ClientStreamTracer mockTracer = mock(ClientStreamTracer.class);
910-
ClientStreamTracer[] customTracers = new ClientStreamTracer[] { mockTracer };
911-
912-
SubchannelPicker failPicker = mock(SubchannelPicker.class);
913-
when(failPicker.pickSubchannel(any(PickSubchannelArgs.class)))
914-
.thenReturn(PickResult.withError(Status.UNAVAILABLE));
896+
FakeStreamTracer fakeTracer = new FakeStreamTracer();
897+
ClientStreamTracer[] customTracers = new ClientStreamTracer[] { fakeTracer };
915898

916-
delayedTransport.reprocess(failPicker);
899+
delayedTransport.reprocess(fakePicker(PickResult.withError(Status.UNAVAILABLE)));
917900
CallOptions wfrOptions = callOptions.withWaitForReady();
918901
delayedTransport.newStream(method, headers, wfrOptions, customTracers);
919902

920-
verify(mockTracer).recordAttemptDelayStart(
921-
"picker_failing_with_wait_for_ready",
922-
"wait_for_ready RPC failed with status: " + Status.UNAVAILABLE);
903+
assertEquals(Collections.singletonList("picker_failing_with_wait_for_ready"),
904+
fakeTracer.startedDelayTypes);
905+
assertEquals(Collections.singletonList(
906+
"wait_for_ready RPC failed with status: " + Status.UNAVAILABLE),
907+
fakeTracer.startedDelayReasons);
908+
}
909+
910+
private static final class FakeStreamTracer extends ClientStreamTracer {
911+
final List<String> startedDelayTypes = new ArrayList<>();
912+
final List<String> startedDelayReasons = new ArrayList<>();
913+
final List<String> changedDelayReasons = new ArrayList<>();
914+
int delayEndedCount = 0;
915+
916+
@Override
917+
public void recordAttemptDelayStart(String delayType, String delayReason) {
918+
startedDelayTypes.add(delayType);
919+
startedDelayReasons.add(delayReason);
920+
}
921+
922+
@Override
923+
public void recordAttemptDelayReasonChanged(String delayReason) {
924+
changedDelayReasons.add(delayReason);
925+
}
926+
927+
@Override
928+
public void recordAttemptDelayEnd() {
929+
delayEndedCount++;
930+
}
931+
}
932+
933+
private static SubchannelPicker fakePicker(final PickResult result) {
934+
return new SubchannelPicker() {
935+
@Override
936+
public PickResult pickSubchannel(PickSubchannelArgs args) {
937+
return result;
938+
}
939+
};
923940
}
924941

925942
private static TransportProvider newTransportProvider(final ClientTransport transport) {

opentelemetry/src/test/java/io/grpc/opentelemetry/OpenTelemetryTracingModuleTest.java

Lines changed: 0 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -281,32 +281,6 @@ public void clientBasicTracingMocking() {
281281
inOrder.verifyNoMoreInteractions();
282282
}
283283

284-
@Test
285-
public void clientDelayTracingMocking() {
286-
Span mockDelaySpan = mock(Span.class);
287-
when(mockSpanBuilder.setAttribute(
288-
org.mockito.ArgumentMatchers.anyString(),
289-
org.mockito.ArgumentMatchers.anyString()))
290-
.thenReturn(mockSpanBuilder);
291-
when(mockSpanBuilder.startSpan()).thenReturn(mockAttemptSpan, mockDelaySpan);
292-
293-
OpenTelemetryTracingModule tracingModule = new OpenTelemetryTracingModule(mockOpenTelemetry);
294-
CallAttemptsTracerFactory callTracer =
295-
tracingModule.newClientCallTracer(mockClientSpan, method);
296-
ClientStreamTracer clientStreamTracer =
297-
callTracer.newClientStreamTracer(STREAM_INFO, new Metadata());
298-
299-
clientStreamTracer.recordAttemptDelayStart("connecting", "pick_first: attempting to connect");
300-
clientStreamTracer.recordAttemptDelayEnd();
301-
302-
verify(mockTracer).spanBuilder(eq("Attempt Delay"));
303-
verify(mockSpanBuilder).setAttribute(eq("grpc.delay_type"), eq("connecting"));
304-
verify(mockDelaySpan).addEvent(
305-
eq("Delay state transition"),
306-
org.mockito.ArgumentMatchers.<io.opentelemetry.api.common.Attributes>any());
307-
verify(mockDelaySpan).end();
308-
}
309-
310284
@Test
311285
public void clientBasicTracingRule() {
312286
OpenTelemetryTracingModule tracingModule = new OpenTelemetryTracingModule(

xds/src/test/java/io/grpc/xds/PriorityLoadBalancerTest.java

Lines changed: 7 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1041,11 +1041,13 @@ public void priorityPicker_prependsToken() throws Exception {
10411041

10421042
Helper helper0 = Iterables.getOnlyElement(fooHelpers); // priority p0
10431043

1044-
SubchannelPicker mockChildPicker = mock(SubchannelPicker.class);
1045-
when(mockChildPicker.pickSubchannel(any(PickSubchannelArgs.class)))
1046-
.thenReturn(PickResult.withNoResult("connecting", "child_reason"));
1047-
1048-
helper0.updateBalancingState(CONNECTING, mockChildPicker);
1044+
SubchannelPicker fakeChildPicker = new SubchannelPicker() {
1045+
@Override
1046+
public PickResult pickSubchannel(PickSubchannelArgs args) {
1047+
return PickResult.withNoResult("connecting", "child_reason");
1048+
}
1049+
};
1050+
helper0.updateBalancingState(CONNECTING, fakeChildPicker);
10491051

10501052
verify(helper, atLeastOnce())
10511053
.updateBalancingState(eq(CONNECTING), pickerCaptor.capture());

0 commit comments

Comments
 (0)