Skip to content

Commit dd007ec

Browse files
committed
refactor getNameResolverProvider()
1 parent e65d7ca commit dd007ec

2 files changed

Lines changed: 131 additions & 2 deletions

File tree

core/src/main/java/io/grpc/internal/ManagedChannelImplBuilder.java

Lines changed: 13 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -155,6 +155,7 @@ public static ManagedChannelBuilder<?> forTarget(String target) {
155155

156156
private final List<ClientInterceptor> interceptors = new ArrayList<>();
157157
NameResolverRegistry nameResolverRegistry = NameResolverRegistry.getDefaultRegistry();
158+
boolean registryProvided;
158159
@Nullable
159160
NameResolverProvider nameResolverProvider;
160161

@@ -343,6 +344,7 @@ public ManagedChannelImplBuilder(
343344
}
344345
if (nameResolverRegistry != null) {
345346
this.nameResolverRegistry = nameResolverRegistry;
347+
this.registryProvided = true;
346348
}
347349
if (nameResolverProvider != null) {
348350
this.nameResolverProvider = nameResolverProvider;
@@ -467,6 +469,8 @@ public ManagedChannelImplBuilder nameResolverFactory(NameResolver.Factory resolv
467469
Preconditions.checkState(directServerAddress == null,
468470
"directServerAddress is set (%s), which forbids the use of NameResolverFactory",
469471
directServerAddress);
472+
Preconditions.checkState(!registryProvided,
473+
"nameResolverRegistry is already set, which forbids the use of NameResolverFactory");
470474
if (resolverFactory != null) {
471475
NameResolverRegistry reg = new NameResolverRegistry();
472476
if (resolverFactory instanceof NameResolverProvider) {
@@ -483,6 +487,7 @@ public ManagedChannelImplBuilder nameResolverFactory(NameResolver.Factory resolv
483487

484488
ManagedChannelImplBuilder nameResolverRegistry(NameResolverRegistry resolverRegistry) {
485489
this.nameResolverRegistry = resolverRegistry;
490+
this.registryProvided = true;
486491
return this;
487492
}
488493

@@ -918,15 +923,21 @@ static ResolvedNameResolver getNameResolverProvider(
918923
// the provider's default scheme (if provider is specified).
919924
String scheme = (provider != null)
920925
? provider.getDefaultScheme()
921-
: nameResolverRegistry.getDefaultScheme();
926+
: (nameResolverProvider != null
927+
? nameResolverProvider.getDefaultScheme()
928+
: nameResolverRegistry.getDefaultScheme());
922929
try {
923930
targetUri = new URI(scheme, "", "/" + target, null);
924931
} catch (URISyntaxException e) {
925932
// Should not happen because we just validated the URI.
926933
throw new IllegalArgumentException(e);
927934
}
928935
if (provider == null) {
929-
provider = nameResolverRegistry.getProviderForScheme(targetUri.getScheme());
936+
if (nameResolverProvider != null) {
937+
provider = nameResolverProvider;
938+
} else {
939+
provider = nameResolverRegistry.getProviderForScheme(targetUri.getScheme());
940+
}
930941
}
931942
}
932943

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

Lines changed: 118 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -48,6 +48,7 @@
4848
import io.grpc.MethodDescriptor;
4949
import io.grpc.MetricSink;
5050
import io.grpc.NameResolver;
51+
import io.grpc.NameResolverProvider;
5152
import io.grpc.NameResolverRegistry;
5253
import io.grpc.StaticTestingClassLoader;
5354
import io.grpc.internal.ManagedChannelImplBuilder.ChannelBuilderDefaultPortProvider;
@@ -800,4 +801,121 @@ public void uriPattern() {
800801
}
801802

802803
private static class CustomSocketAddress extends SocketAddress {}
804+
805+
@Test
806+
public void nameResolverFactory_notAllowedAfterRegistry() {
807+
NameResolverRegistry registry = new NameResolverRegistry();
808+
builder.nameResolverRegistry(registry);
809+
try {
810+
builder.nameResolverFactory(mock(NameResolver.Factory.class));
811+
fail("Should throw");
812+
} catch (IllegalStateException e) {
813+
assertThat(e).hasMessageThat().contains("nameResolverRegistry is already set");
814+
}
815+
}
816+
817+
@Test
818+
public void getNameResolverProvider_explicitProviderWithIpTarget() {
819+
String target = "127.0.0.1:8080";
820+
NameResolverRegistry registry = new NameResolverRegistry();
821+
NameResolverProvider explicitProvider = mock(NameResolverProvider.class);
822+
when(explicitProvider.getDefaultScheme()).thenReturn("dns");
823+
824+
ManagedChannelImplBuilder.ResolvedNameResolver resolved;
825+
resolved = ManagedChannelImplBuilder
826+
.getNameResolverProvider(target, registry, explicitProvider);
827+
828+
assertThat(resolved.provider).isSameInstanceAs(explicitProvider);
829+
assertThat(resolved.targetUri.toString()).isEqualTo("dns:///127.0.0.1:8080");
830+
}
831+
832+
@Test
833+
public void getNameResolverProvider_explicitProviderWithInvalidUri() {
834+
String target = "::1";
835+
NameResolverRegistry registry = new NameResolverRegistry();
836+
NameResolverProvider explicitProvider = mock(NameResolverProvider.class);
837+
when(explicitProvider.getDefaultScheme()).thenReturn("dns");
838+
839+
ManagedChannelImplBuilder.ResolvedNameResolver resolved;
840+
resolved = ManagedChannelImplBuilder
841+
.getNameResolverProvider(target, registry, explicitProvider);
842+
843+
assertThat(resolved.provider).isSameInstanceAs(explicitProvider);
844+
assertThat(resolved.targetUri.toString()).isEqualTo("dns:///::1");
845+
}
846+
847+
@Test
848+
public void getNameResolverProvider_explicitProviderWithValidUri() {
849+
String target = "dns:///localhost";
850+
NameResolverRegistry registry = new NameResolverRegistry();
851+
NameResolverProvider explicitProvider = new NameResolverProvider() {
852+
@Override
853+
public NameResolver newNameResolver(URI targetUri, NameResolver.Args args) {
854+
return null;
855+
}
856+
857+
@Override
858+
public String getDefaultScheme() {
859+
return "dns";
860+
}
861+
862+
@Override
863+
protected boolean isAvailable() {
864+
return true;
865+
}
866+
867+
@Override
868+
protected int priority() {
869+
return 5;
870+
}
871+
};
872+
873+
ManagedChannelImplBuilder.ResolvedNameResolver resolved = ManagedChannelImplBuilder.getNameResolverProvider(
874+
target, registry, explicitProvider);
875+
876+
// Should prefer explicit provider if scheme matches?
877+
// Current logic: provider passed to getNameResolverProvider is prioritized for
878+
// SCHEME determination for fallback
879+
// BUT for valid URI, it logic matches URI scheme.
880+
// If explicit provider is passed, it is used if target not valid URI.
881+
// If target IS valid URI, it checks if provider != null.
882+
// Wait, the code:
883+
// if (provider == null) { ... }
884+
// If explicit 'provider' arg is NOT null, logic uses it?
885+
// Let's re-read ManagedChannelImplBuilder.getNameResolverProvider
886+
assertThat(resolved.provider).isSameInstanceAs(explicitProvider);
887+
}
888+
889+
@Test
890+
public void getNameResolverProvider_registryFallback() {
891+
String target = "dns:///localhost";
892+
final NameResolverProvider registryProvider = new NameResolverProvider() {
893+
@Override
894+
public NameResolver newNameResolver(URI targetUri, NameResolver.Args args) {
895+
return null;
896+
}
897+
898+
@Override
899+
public String getDefaultScheme() {
900+
return "dns";
901+
}
902+
903+
@Override
904+
protected boolean isAvailable() {
905+
return true;
906+
}
907+
908+
@Override
909+
protected int priority() {
910+
return 5;
911+
}
912+
};
913+
NameResolverRegistry registry = new NameResolverRegistry();
914+
registry.register(registryProvider);
915+
916+
ManagedChannelImplBuilder.ResolvedNameResolver resolved = ManagedChannelImplBuilder.getNameResolverProvider(
917+
target, registry, null);
918+
919+
assertThat(resolved.provider).isSameInstanceAs(registryProvider);
920+
}
803921
}

0 commit comments

Comments
 (0)