| /* |
| * Copyright 2015, Google Inc. All rights reserved. |
| * |
| * Redistribution and use in source and binary forms, with or without |
| * modification, are permitted provided that the following conditions are |
| * met: |
| * |
| * * Redistributions of source code must retain the above copyright |
| * notice, this list of conditions and the following disclaimer. |
| * * Redistributions in binary form must reproduce the above |
| * copyright notice, this list of conditions and the following disclaimer |
| * in the documentation and/or other materials provided with the |
| * distribution. |
| * |
| * * Neither the name of Google Inc. nor the names of its |
| * contributors may be used to endorse or promote products derived from |
| * this software without specific prior written permission. |
| * |
| * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS |
| * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT |
| * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR |
| * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT |
| * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, |
| * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT |
| * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
| * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
| * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
| * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE |
| * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
| */ |
| |
| package io.grpc.internal; |
| |
| import static org.junit.Assert.assertEquals; |
| import static org.junit.Assert.assertNotNull; |
| import static org.junit.Assert.fail; |
| |
| import io.grpc.Attributes; |
| import io.grpc.NameResolver; |
| import io.grpc.NameResolver.Factory; |
| |
| import org.junit.Test; |
| import org.junit.runner.RunWith; |
| import org.junit.runners.JUnit4; |
| |
| import java.net.URI; |
| |
| /** Unit tests for {@link ManagedChannelImpl#getNameResolver}. */ |
| @RunWith(JUnit4.class) |
| public class ManagedChannelImplGetNameResolverTest { |
| private static final Attributes NAME_RESOLVER_PARAMS = |
| Attributes.newBuilder().set(NameResolver.Factory.PARAMS_DEFAULT_PORT, 447).build(); |
| |
| @Test |
| public void invalidUriTarget() { |
| testInvalidTarget("defaultscheme:///[invalid]"); |
| } |
| |
| @Test |
| public void validTargetWithInvalidDnsName() throws Exception { |
| testValidTarget("[valid]", "defaultscheme:///%5Bvalid%5D", |
| new URI("defaultscheme", "", "/[valid]", null)); |
| } |
| |
| @Test |
| public void validAuthorityTarget() throws Exception { |
| testValidTarget("foo.googleapis.com:8080", "defaultscheme:///foo.googleapis.com:8080", |
| new URI("defaultscheme", "", "/foo.googleapis.com:8080", null)); |
| } |
| |
| @Test |
| public void validUriTarget() throws Exception { |
| testValidTarget("scheme:///foo.googleapis.com:8080", "scheme:///foo.googleapis.com:8080", |
| new URI("scheme", "", "/foo.googleapis.com:8080", null)); |
| } |
| |
| @Test |
| public void validIpv4AuthorityTarget() throws Exception { |
| testValidTarget("127.0.0.1:1234", "defaultscheme:///127.0.0.1:1234", |
| new URI("defaultscheme", "", "/127.0.0.1:1234", null)); |
| } |
| |
| @Test |
| public void validIpv4UriTarget() throws Exception { |
| testValidTarget("dns:///127.0.0.1:1234", "dns:///127.0.0.1:1234", |
| new URI("dns", "", "/127.0.0.1:1234", null)); |
| } |
| |
| @Test |
| public void validIpv6AuthorityTarget() throws Exception { |
| testValidTarget("[::1]:1234", "defaultscheme:///%5B::1%5D:1234", |
| new URI("defaultscheme", "", "/[::1]:1234", null)); |
| } |
| |
| @Test |
| public void invalidIpv6UriTarget() throws Exception { |
| testInvalidTarget("dns:///[::1]:1234"); |
| } |
| |
| @Test |
| public void validIpv6UriTarget() throws Exception { |
| testValidTarget("dns:///%5B::1%5D:1234", "dns:///%5B::1%5D:1234", |
| new URI("dns", "", "/[::1]:1234", null)); |
| } |
| |
| @Test |
| public void validTargetStartingWithSlash() throws Exception { |
| testValidTarget("/target", "defaultscheme:////target", |
| new URI("defaultscheme", "", "//target", null)); |
| } |
| |
| @Test |
| public void validTargetNoResovler() { |
| Factory nameResolverFactory = new NameResolver.Factory() { |
| @Override |
| public NameResolver newNameResolver(URI targetUri, Attributes params) { |
| return null; |
| } |
| |
| @Override |
| public String getDefaultScheme() { |
| return "defaultscheme"; |
| } |
| }; |
| try { |
| ManagedChannelImpl.getNameResolver( |
| "foo.googleapis.com:8080", nameResolverFactory, NAME_RESOLVER_PARAMS); |
| fail("Should fail"); |
| } catch (IllegalArgumentException e) { |
| // expected |
| } |
| } |
| |
| private void testValidTarget(String target, String expectedUriString, URI expectedUri) { |
| Factory nameResolverFactory = new FakeNameResolverFactory(expectedUri.getScheme()); |
| FakeNameResolver nameResolver = (FakeNameResolver) ManagedChannelImpl.getNameResolver( |
| target, nameResolverFactory, NAME_RESOLVER_PARAMS); |
| assertNotNull(nameResolver); |
| assertEquals(expectedUri, nameResolver.uri); |
| assertEquals(expectedUriString, nameResolver.uri.toString()); |
| } |
| |
| private void testInvalidTarget(String target) { |
| Factory nameResolverFactory = new FakeNameResolverFactory("dns"); |
| |
| try { |
| FakeNameResolver nameResolver = (FakeNameResolver) ManagedChannelImpl.getNameResolver( |
| target, nameResolverFactory, NAME_RESOLVER_PARAMS); |
| fail("Should have failed, but got resolver with " + nameResolver.uri); |
| } catch (IllegalArgumentException e) { |
| // expected |
| } |
| } |
| |
| private static class FakeNameResolverFactory extends NameResolver.Factory { |
| final String expectedScheme; |
| |
| FakeNameResolverFactory(String expectedScheme) { |
| this.expectedScheme = expectedScheme; |
| } |
| |
| @Override |
| public NameResolver newNameResolver(URI targetUri, Attributes params) { |
| if (expectedScheme.equals(targetUri.getScheme())) { |
| return new FakeNameResolver(targetUri); |
| } |
| return null; |
| } |
| |
| @Override |
| public String getDefaultScheme() { |
| return expectedScheme; |
| } |
| } |
| |
| private static class FakeNameResolver extends NameResolver { |
| final URI uri; |
| |
| FakeNameResolver(URI uri) { |
| this.uri = uri; |
| } |
| |
| @Override public String getServiceAuthority() { |
| return uri.getAuthority(); |
| } |
| |
| @Override public void start(final Listener listener) {} |
| |
| @Override public void shutdown() {} |
| } |
| } |