Skip to content

Commit 4cfc0c6

Browse files
committed
Fix: test cases
1 parent bdcb745 commit 4cfc0c6

8 files changed

Lines changed: 213 additions & 120 deletions

File tree

api/src/test/java/io/grpc/NameResolverTest.java

Lines changed: 9 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -105,7 +105,7 @@ public void args() {
105105
}
106106

107107
private NameResolver.Args createArgs() {
108-
ChannelConfigurator channelConfigurator = mock(ChannelConfigurator.class);
108+
ChannelConfigurator channelConfigurator = new ChannelConfigurator() {};
109109
return NameResolver.Args.newBuilder()
110110
.setDefaultPort(defaultPort)
111111
.setProxyDetector(proxyDetector)
@@ -123,7 +123,13 @@ private NameResolver.Args createArgs() {
123123

124124
@Test
125125
public void args_childChannelConfigurator() {
126-
ChannelConfigurator channelConfigurator = mock(ChannelConfigurator.class);
126+
final ManagedChannelBuilder<?>[] capturedBuilder = new ManagedChannelBuilder<?>[1];
127+
ChannelConfigurator channelConfigurator = new ChannelConfigurator() {
128+
@Override
129+
public void configureChannelBuilder(ManagedChannelBuilder<?> builder) {
130+
capturedBuilder[0] = builder;
131+
}
132+
};
127133

128134
SynchronizationContext realSyncContext = new SynchronizationContext(
129135
new Thread.UncaughtExceptionHandler() {
@@ -148,7 +154,7 @@ public void uncaughtException(Thread t, Throwable e) {
148154
// Validate configurator accepts builders
149155
ManagedChannelBuilder<?> mockBuilder = mock(ManagedChannelBuilder.class);
150156
configurator.configureChannelBuilder(mockBuilder);
151-
verify(channelConfigurator).configureChannelBuilder(mockBuilder);
157+
assertThat(capturedBuilder[0]).isSameInstanceAs(mockBuilder);
152158
}
153159

154160
@Test

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

Lines changed: 59 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,6 @@
2626
import static org.junit.Assert.assertThrows;
2727
import static org.junit.Assert.assertTrue;
2828
import static org.junit.Assert.fail;
29-
import static org.mockito.ArgumentMatchers.any;
3029
import static org.mockito.Mockito.doReturn;
3130
import static org.mockito.Mockito.mock;
3231
import static org.mockito.Mockito.verify;
@@ -52,7 +51,9 @@
5251
import io.grpc.MetricSink;
5352
import io.grpc.NameResolver;
5453
import io.grpc.NameResolverRegistry;
54+
import io.grpc.NoopMetricSink;
5555
import io.grpc.StaticTestingClassLoader;
56+
import io.grpc.Uri;
5657
import io.grpc.internal.ManagedChannelImplBuilder.ChannelBuilderDefaultPortProvider;
5758
import io.grpc.internal.ManagedChannelImplBuilder.ClientTransportFactoryBuilder;
5859
import io.grpc.internal.ManagedChannelImplBuilder.FixedPortProvider;
@@ -77,7 +78,6 @@
7778
import org.junit.runners.Parameterized;
7879
import org.junit.runners.Parameterized.Parameter;
7980
import org.junit.runners.Parameterized.Parameters;
80-
import org.mockito.ArgumentCaptor;
8181
import org.mockito.Mock;
8282
import org.mockito.junit.MockitoJUnit;
8383
import org.mockito.junit.MockitoRule;
@@ -786,7 +786,7 @@ public void setNameResolverExtArgs() {
786786

787787
@Test
788788
public void childChannelConfigurator_setsField() {
789-
ChannelConfigurator configurator = mock(ChannelConfigurator.class);
789+
ChannelConfigurator configurator = new ChannelConfigurator() {};
790790
assertSame(builder, builder.childChannelConfigurator(configurator));
791791
assertSame(configurator, builder.channelConfigurator);
792792
}
@@ -801,8 +801,14 @@ public void childChannelConfigurator_propagatesMetricsAndInterceptors_xdsTarget(
801801
when(mockClientTransportFactory.getSupportedSocketAddressTypes())
802802
.thenReturn(Collections.singleton(InetSocketAddress.class));
803803

804-
MetricSink mockMetricSink = mock(MetricSink.class);
805-
ClientInterceptor mockInterceptor = mock(ClientInterceptor.class);
804+
MetricSink mockMetricSink = new NoopMetricSink();
805+
ClientInterceptor mockInterceptor = new ClientInterceptor() {
806+
@Override
807+
public <ReqT, RespT> ClientCall<ReqT, RespT> interceptCall(
808+
MethodDescriptor<ReqT, RespT> method, CallOptions callOptions, Channel next) {
809+
return next.newCall(method, callOptions);
810+
}
811+
};
806812

807813
// Define the Configurator
808814
ChannelConfigurator configurator = new ChannelConfigurator() {
@@ -814,23 +820,47 @@ public void configureChannelBuilder(ManagedChannelBuilder<?> builder) {
814820
}
815821
};
816822

817-
// Mock NameResolver.Factory to capture Args
818-
NameResolver.Factory mockNameResolverFactory = mock(NameResolver.Factory.class);
819-
when(mockNameResolverFactory.getDefaultScheme()).thenReturn("xds");
820-
NameResolver mockNameResolver = mock(NameResolver.class);
821-
when(mockNameResolver.getServiceAuthority()).thenReturn("foo.authority");
822-
ArgumentCaptor<NameResolver.Args> argsCaptor = ArgumentCaptor.forClass(NameResolver.Args.class);
823-
if (enableRfc3986UrisParam) {
824-
when(mockNameResolverFactory.newNameResolver((io.grpc.Uri) any(),
825-
argsCaptor.capture())).thenReturn(mockNameResolver);
826-
} else {
827-
when(mockNameResolverFactory.newNameResolver((URI) any(),
828-
argsCaptor.capture())).thenReturn(mockNameResolver);
829-
}
823+
// Use NameResolver.Factory to capture Args
824+
final NameResolver.Args[] capturedArgs = new NameResolver.Args[1];
825+
final boolean[] newNameResolverCalled = new boolean[1];
826+
827+
NameResolver realNameResolver = new NameResolver() {
828+
@Override
829+
public String getServiceAuthority() {
830+
return "foo.authority";
831+
}
830832

831-
// Use the configurator and the mock factory
833+
@Override
834+
public void start(Listener2 listener) {}
835+
836+
@Override
837+
public void shutdown() {}
838+
};
839+
840+
NameResolver.Factory realNameResolverFactory = new NameResolver.Factory() {
841+
@Override
842+
public NameResolver newNameResolver(URI targetUri, NameResolver.Args args) {
843+
newNameResolverCalled[0] = true;
844+
capturedArgs[0] = args;
845+
return realNameResolver;
846+
}
847+
848+
@Override
849+
public NameResolver newNameResolver(Uri targetUri, NameResolver.Args args) {
850+
newNameResolverCalled[0] = true;
851+
capturedArgs[0] = args;
852+
return realNameResolver;
853+
}
854+
855+
@Override
856+
public String getDefaultScheme() {
857+
return "xds";
858+
}
859+
};
860+
861+
// Use the configurator and the custom factory
832862
NameResolverRegistry registry = new NameResolverRegistry();
833-
registry.register(new NameResolverFactoryToProviderFacade(mockNameResolverFactory));
863+
registry.register(new NameResolverFactoryToProviderFacade(realNameResolverFactory));
834864

835865
ManagedChannelBuilder<?> parentBuilder = new ManagedChannelImplBuilder(
836866
"xds:///my-service-target",
@@ -843,28 +873,25 @@ public void configureChannelBuilder(ManagedChannelBuilder<?> builder) {
843873
grpcCleanupRule.register(channel);
844874

845875
// Verify that newNameResolver was called
846-
if (enableRfc3986UrisParam) {
847-
verify(mockNameResolverFactory).newNameResolver((io.grpc.Uri) any(), any());
848-
} else {
849-
verify(mockNameResolverFactory).newNameResolver((URI) any(), any());
850-
}
876+
assertThat(newNameResolverCalled[0]).isTrue();
851877

852878
// Extract the childChannelConfigurator from Args
853-
NameResolver.Args args = argsCaptor.getValue();
879+
NameResolver.Args args = capturedArgs[0];
854880
ChannelConfigurator channelConfiguratorInArgs = args.getChildChannelConfigurator();
855881
assertNotNull("Child channel configurator should be present in NameResolver.Args",
856882
channelConfiguratorInArgs);
857883

858884
// Verify the configurator is the one we passed
859885
assertThat(channelConfiguratorInArgs).isSameInstanceAs(configurator);
860886

861-
// Verify the configurator logically applies (by running it on a mock)
862-
ManagedChannelBuilder<?> mockChildBuilder = mock(ManagedChannelBuilder.class);
863-
// Stub addMetricSink to return the builder to avoid generic return type issues
864-
doReturn(mockChildBuilder).when(mockChildBuilder).addMetricSink(any());
887+
// Verify the configurator logically applies (by running it on a real builder)
888+
ManagedChannelImplBuilder childBuilder = new ManagedChannelImplBuilder(
889+
"xds:///child-service-target",
890+
mockClientTransportFactoryBuilder,
891+
new FixedPortProvider(DUMMY_PORT));
865892

866-
configurator.configureChannelBuilder(mockChildBuilder);
867-
verify(mockChildBuilder).addMetricSink(mockMetricSink);
893+
configurator.configureChannelBuilder(childBuilder);
894+
assertThat(childBuilder.metricSinks).contains(mockMetricSink);
868895
}
869896

870897
@Test

rls/src/test/java/io/grpc/rls/RlsLoadBalancerTest.java

Lines changed: 34 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,6 @@
1818

1919
import static com.google.common.base.Preconditions.checkNotNull;
2020
import static com.google.common.truth.Truth.assertThat;
21-
import static org.mockito.AdditionalAnswers.delegatesTo;
2221
import static org.mockito.ArgumentMatchers.any;
2322
import static org.mockito.ArgumentMatchers.anyString;
2423
import static org.mockito.ArgumentMatchers.argThat;
@@ -53,6 +52,7 @@
5352
import io.grpc.LoadBalancer.Subchannel;
5453
import io.grpc.LoadBalancer.SubchannelPicker;
5554
import io.grpc.LoadBalancer.SubchannelStateListener;
55+
import io.grpc.LongCounterMetricInstrument;
5656
import io.grpc.ManagedChannel;
5757
import io.grpc.ManagedChannelBuilder;
5858
import io.grpc.Metadata;
@@ -61,7 +61,6 @@
6161
import io.grpc.MetricInstrument;
6262
import io.grpc.MetricRecorder;
6363
import io.grpc.MetricRecorder.Registration;
64-
import io.grpc.MetricSink;
6564
import io.grpc.NameResolver.ConfigOrError;
6665
import io.grpc.NoopMetricSink;
6766
import io.grpc.ServerCall;
@@ -95,6 +94,7 @@
9594
import java.util.Map;
9695
import java.util.concurrent.ScheduledExecutorService;
9796
import java.util.concurrent.TimeUnit;
97+
import java.util.concurrent.atomic.AtomicBoolean;
9898
import javax.annotation.Nonnull;
9999
import org.junit.After;
100100
import org.junit.Before;
@@ -361,7 +361,7 @@ public void metricsWithRealChannel() throws Exception {
361361
.directExecutor()
362362
.build()
363363
.start());
364-
MetricSink metrics = mock(MetricSink.class, delegatesTo(new NoopMetricSink()));
364+
VerificationMetricSink metrics = new VerificationMetricSink();
365365
ManagedChannel channel = grpcCleanupRule.register(
366366
InternalManagedChannelBuilder.addMetricSink(
367367
InProcessChannelBuilder.forName("fake-bigtable.googleapis.com")
@@ -379,12 +379,7 @@ public void metricsWithRealChannel() throws Exception {
379379
assertThat(recorder.awaitCompletion(10, TimeUnit.SECONDS)).isTrue();
380380
assertThat(recorder.getError()).isNull();
381381

382-
verify(metrics).addLongCounter(
383-
eqMetricInstrumentName("grpc.lb.rls.default_target_picks"),
384-
eq(1L),
385-
eq(Arrays.asList("directaddress:///fake-bigtable.googleapis.com", "localhost:8972",
386-
"defaultTarget", "complete")),
387-
eq(Arrays.asList("customvalue")));
382+
metrics.awaitCall();
388383
}
389384

390385
@Test
@@ -931,4 +926,34 @@ public void registerBackendResponse(boolean throttled) {
931926
}
932927
}
933928

929+
private static final class VerificationMetricSink extends NoopMetricSink {
930+
private final AtomicBoolean called =
931+
new AtomicBoolean();
932+
933+
@Override
934+
public void addLongCounter(
935+
LongCounterMetricInstrument metricInstrument,
936+
long value,
937+
List<String> requiredLabelValues,
938+
List<String> optionalLabelValues) {
939+
if (metricInstrument.getName().equals("grpc.lb.rls.default_target_picks")
940+
&& value == 1L
941+
&& requiredLabelValues.equals(Arrays.asList(
942+
"directaddress:///fake-bigtable.googleapis.com", "localhost:8972",
943+
"defaultTarget", "complete"))
944+
&& optionalLabelValues.equals(Arrays.asList("customvalue"))) {
945+
called.set(true);
946+
}
947+
}
948+
949+
public void awaitCall() throws InterruptedException {
950+
long start = System.currentTimeMillis();
951+
while (!called.get()) {
952+
if (System.currentTimeMillis() - start > 5000) {
953+
throw new AssertionError("Timed out waiting for metric sink call");
954+
}
955+
Thread.sleep(50);
956+
}
957+
}
958+
}
934959
}

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

Lines changed: 34 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -22,13 +22,6 @@
2222
import static io.grpc.xds.XdsTestControlPlaneService.ADS_TYPE_URL_CDS;
2323
import static io.grpc.xds.XdsTestControlPlaneService.ADS_TYPE_URL_EDS;
2424
import static org.junit.Assert.assertEquals;
25-
import static org.mockito.AdditionalAnswers.delegatesTo;
26-
import static org.mockito.ArgumentMatchers.any;
27-
import static org.mockito.ArgumentMatchers.anyList;
28-
import static org.mockito.ArgumentMatchers.anyLong;
29-
import static org.mockito.Mockito.mock;
30-
import static org.mockito.Mockito.timeout;
31-
import static org.mockito.Mockito.verify;
3225

3326
import com.github.xds.type.v3.TypedStruct;
3427
import com.google.common.collect.ImmutableMap;
@@ -66,18 +59,20 @@
6659
import io.grpc.InsecureServerCredentials;
6760
import io.grpc.InternalFeatureFlags;
6861
import io.grpc.LoadBalancerRegistry;
62+
import io.grpc.LongCounterMetricInstrument;
6963
import io.grpc.ManagedChannel;
7064
import io.grpc.ManagedChannelBuilder;
7165
import io.grpc.Metadata;
7266
import io.grpc.MethodDescriptor;
73-
import io.grpc.MetricSink;
7467
import io.grpc.NoopMetricSink;
7568
import io.grpc.Server;
7669
import io.grpc.testing.protobuf.SimpleRequest;
7770
import io.grpc.testing.protobuf.SimpleResponse;
7871
import io.grpc.testing.protobuf.SimpleServiceGrpc;
7972
import java.net.InetSocketAddress;
8073
import java.util.Arrays;
74+
import java.util.List;
75+
import java.util.concurrent.atomic.AtomicInteger;
8176
import org.junit.Before;
8277
import org.junit.Rule;
8378
import org.junit.Test;
@@ -377,12 +372,12 @@ public void pingPong_logicalDns_authorityOverride() {
377372
}
378373

379374
@Test
380-
public void childChannelConfigurator_passesMetricSinkToChannel_E2E() {
381-
MetricSink mockSink = mock(MetricSink.class, delegatesTo(new NoopMetricSink()));
375+
public void childChannelConfigurator_passesMetricSinkToChannel_E2E() throws Exception {
376+
CountingMetricSink sink = new CountingMetricSink();
382377
ChannelConfigurator configurator = new ChannelConfigurator() {
383378
@Override
384379
public void configureChannelBuilder(ManagedChannelBuilder<?> builder) {
385-
builder.addMetricSink(mockSink);
380+
builder.addMetricSink(sink);
386381
}
387382
};
388383

@@ -398,21 +393,20 @@ public void configureChannelBuilder(ManagedChannelBuilder<?> builder) {
398393

399394
// The xDS client inside the channel configurator will have created an ADS stream.
400395
// The metric sink should have received attempt or connection metrics.
401-
verify(mockSink, timeout(5000).atLeastOnce())
402-
.addLongCounter(any(), anyLong(), anyList(), anyList());
396+
sink.awaitCall();
403397
} finally {
404398
channel.shutdownNow();
405399
}
406400
}
407401

408402
@Test
409403
public void childChannelConfigurator_passesMetricSinkToServer_E2E() throws Exception {
410-
MetricSink mockSink = mock(MetricSink.class, delegatesTo(new NoopMetricSink()));
404+
CountingMetricSink sink = new CountingMetricSink();
411405
ChannelConfigurator configurator = new ChannelConfigurator() {
412406
@Override
413407
public void configureChannelBuilder(ManagedChannelBuilder<?> builder) {
414408
// Child channels (xDS client connections) created by this server get the sink.
415-
builder.addMetricSink(mockSink);
409+
builder.addMetricSink(sink);
416410
}
417411
};
418412

@@ -428,10 +422,33 @@ public void configureChannelBuilder(ManagedChannelBuilder<?> builder) {
428422

429423
try {
430424
// The server xDS client will connect to control plane to get LDS.
431-
verify(mockSink, timeout(5000).atLeastOnce())
432-
.addLongCounter(any(), anyLong(), anyList(), anyList());
425+
sink.awaitCall();
433426
} finally {
434427
childServer.shutdownNow();
435428
}
436429
}
430+
431+
private static final class CountingMetricSink extends NoopMetricSink {
432+
private final AtomicInteger count =
433+
new AtomicInteger();
434+
435+
@Override
436+
public void addLongCounter(
437+
LongCounterMetricInstrument metricInstrument,
438+
long value,
439+
List<String> requiredLabelValues,
440+
List<String> optionalLabelValues) {
441+
count.incrementAndGet();
442+
}
443+
444+
public void awaitCall() throws InterruptedException {
445+
long start = System.currentTimeMillis();
446+
while (count.get() == 0) {
447+
if (System.currentTimeMillis() - start > 5000) {
448+
throw new AssertionError("Timed out waiting for metric sink call");
449+
}
450+
Thread.sleep(50);
451+
}
452+
}
453+
}
437454
}

0 commit comments

Comments
 (0)