public InetSocketAddress next(long spinDelay) { currentIndex = ++currentIndex % serverAddresses.size(); if (currentIndex == lastIndex && spinDelay > 0) { try { Thread.sleep(spinDelay); } catch (InterruptedException e) { LOG.warn("Unexpected exception", e); } } else if (lastIndex == -1) { // We don't want to sleep on the first ever connect attempt. lastIndex = 0; } InetSocketAddress curAddr = serverAddresses.get(currentIndex); try { String curHostString = getHostString(curAddr); List<InetAddress> resolvedAddresses = new ArrayList<InetAddress>(Arrays.asList(this.resolver.getAllByName(curHostString))); if (resolvedAddresses.isEmpty()) { return curAddr; } Collections.shuffle(resolvedAddresses); return new InetSocketAddress(resolvedAddresses.get(0), curAddr.getPort()); } catch (UnknownHostException e) { return curAddr; } }
verify(spyResolver, times(5)).getAllByName("www.apache.org"); verify(spyResolver, times(5)).getAllByName("www.google.com");
verify(spyResolver, times(10)).getAllByName("www.apache.org"); // resolution occurred
assertThat("Bad IP address returned", ipList, hasItems(resolvedThird.getAddress().getHostAddress())); verify(spyResolver, times(3)).getAllByName("www.apache.org"); // resolution occured every time
@Test public void testReResolvingSingle() throws UnknownHostException { // Arrange byte size = 1; ArrayList<InetSocketAddress> list = new ArrayList<InetSocketAddress>(size); // Test a hostname that resolves to a single address list.add(InetSocketAddress.createUnresolved("issues.apache.org", 1234)); final InetAddress issuesApacheOrg = mock(InetAddress.class); when(issuesApacheOrg.getHostAddress()).thenReturn("192.168.1.1"); when(issuesApacheOrg.toString()).thenReturn("issues.apache.org"); when(issuesApacheOrg.getHostName()).thenReturn("issues.apache.org"); StaticHostProvider.Resolver resolver = new StaticHostProvider.Resolver() { @Override public InetAddress[] getAllByName(String name) { return new InetAddress[] { issuesApacheOrg }; } }; StaticHostProvider.Resolver spyResolver = spy(resolver); // Act StaticHostProvider hostProvider = new StaticHostProvider(list, spyResolver); for (int i = 0; i < 10; i++) { InetSocketAddress next = hostProvider.next(0); assertEquals(issuesApacheOrg, next.getAddress()); } // Assert // Resolver called 10 times, because we shouldn't cache the resolved addresses verify(spyResolver, times(10)).getAllByName("issues.apache.org"); // resolution occurred }
private InetSocketAddress resolve(InetSocketAddress address) { try { String curHostString = address.getHostString(); List<InetAddress> resolvedAddresses = new ArrayList<>(Arrays.asList(this.resolver.getAllByName(curHostString))); if (resolvedAddresses.isEmpty()) { return address; } Collections.shuffle(resolvedAddresses); return new InetSocketAddress(resolvedAddresses.get(0), address.getPort()); } catch (UnknownHostException e) { LOG.error("Unable to resolve address: {}", address.toString(), e); return address; } }