|
48 | 48 | import io.grpc.MethodDescriptor; |
49 | 49 | import io.grpc.MetricSink; |
50 | 50 | import io.grpc.NameResolver; |
| 51 | +import io.grpc.NameResolverProvider; |
51 | 52 | import io.grpc.NameResolverRegistry; |
52 | 53 | import io.grpc.StaticTestingClassLoader; |
53 | 54 | import io.grpc.internal.ManagedChannelImplBuilder.ChannelBuilderDefaultPortProvider; |
@@ -800,4 +801,121 @@ public void uriPattern() { |
800 | 801 | } |
801 | 802 |
|
802 | 803 | 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 | + } |
803 | 921 | } |
0 commit comments