package com.lambdaworks.redis.resource;
import static org.assertj.core.api.AssertionsForClassTypes.assertThat;
import java.net.Inet4Address;
import java.net.Inet6Address;
import java.net.InetAddress;
import java.net.UnknownHostException;
import java.util.Arrays;
import java.util.Properties;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;
/**
* @author Mark Paluch
*/
public class DirContextDnsResolverTest {
DirContextDnsResolver resolver;
@Before
public void before() throws Exception {
System.getProperties().remove(DirContextDnsResolver.PREFER_IPV4_KEY);
System.getProperties().remove(DirContextDnsResolver.PREFER_IPV6_KEY);
}
@After
public void tearDown() throws Exception {
if (resolver != null) {
resolver.close();
}
}
@Test
public void shouldResolveDefault() throws Exception {
resolver = new DirContextDnsResolver();
InetAddress[] resolved = resolver.resolve("google.com");
assertThat(resolved.length).isGreaterThan(1);
assertThat(resolved[0]).isInstanceOf(Inet6Address.class);
assertThat(resolved[0].getHostName()).isEqualTo("google.com");
assertThat(resolved[resolved.length - 1]).isInstanceOf(Inet4Address.class);
}
@Test
public void shouldResolvePreferIpv4WithProperties() throws Exception {
resolver = new DirContextDnsResolver(true, false, new Properties());
InetAddress[] resolved = resolver.resolve("google.com");
assertThat(resolved.length).isGreaterThan(1);
assertThat(resolved[0]).isInstanceOf(Inet4Address.class);
}
@Test
public void shouldResolveWithDnsServer() throws Exception {
resolver = new DirContextDnsResolver(Arrays.asList("[2001:4860:4860::8888]", "8.8.8.8"));
InetAddress[] resolved = resolver.resolve("google.com");
assertThat(resolved.length).isGreaterThan(1);
}
@Test
public void shouldPreferIpv4() throws Exception {
System.setProperty(DirContextDnsResolver.PREFER_IPV4_KEY, "true");
resolver = new DirContextDnsResolver();
InetAddress[] resolved = resolver.resolve("google.com");
assertThat(resolved.length).isGreaterThan(0);
assertThat(resolved[0]).isInstanceOf(Inet4Address.class);
}
@Test
public void shouldPreferIpv4AndNotIpv6() throws Exception {
System.setProperty(DirContextDnsResolver.PREFER_IPV4_KEY, "true");
System.setProperty(DirContextDnsResolver.PREFER_IPV6_KEY, "false");
resolver = new DirContextDnsResolver();
InetAddress[] resolved = resolver.resolve("google.com");
assertThat(resolved.length).isGreaterThan(0);
assertThat(resolved[0]).isInstanceOf(Inet4Address.class);
}
@Test
public void shouldPreferIpv6AndNotIpv4() throws Exception {
System.setProperty(DirContextDnsResolver.PREFER_IPV4_KEY, "false");
System.setProperty(DirContextDnsResolver.PREFER_IPV6_KEY, "true");
resolver = new DirContextDnsResolver();
InetAddress[] resolved = resolver.resolve("google.com");
assertThat(resolved.length).isGreaterThan(0);
assertThat(resolved[0]).isInstanceOf(Inet6Address.class);
}
@Test(expected = UnknownHostException.class)
public void shouldFailWithUnknownHost() throws Exception {
resolver = new DirContextDnsResolver("8.8.8.8");
resolver.resolve("unknown-domain-name");
}
@Test
public void shouldResolveCname() throws Exception {
resolver = new DirContextDnsResolver();
InetAddress[] resolved = resolver.resolve("www.github.io");
assertThat(resolved.length).isGreaterThan(0);
assertThat(resolved[0]).isInstanceOf(InetAddress.class);
assertThat(resolved[0].getHostName()).isEqualTo("www.github.io");
}
@Test
public void shouldResolveWithoutSubdomain() throws Exception {
resolver = new DirContextDnsResolver();
InetAddress[] resolved = resolver.resolve("paluch.biz");
assertThat(resolved.length).isGreaterThan(0);
assertThat(resolved[0]).isInstanceOf(InetAddress.class);
assertThat(resolved[0].getHostName()).isEqualTo("paluch.biz");
resolved = resolver.resolve("gmail.com");
assertThat(resolved.length).isGreaterThan(0);
assertThat(resolved[0]).isInstanceOf(InetAddress.class);
assertThat(resolved[0].getHostName()).isEqualTo("gmail.com");
}
@Test
public void shouldWorkWithIpv4Address() throws Exception {
resolver = new DirContextDnsResolver();
InetAddress[] resolved = resolver.resolve("127.0.0.1");
assertThat(resolved.length).isGreaterThan(0);
assertThat(resolved[0]).isInstanceOf(Inet4Address.class);
assertThat(resolved[0].getHostAddress()).isEqualTo("127.0.0.1");
}
@Test
public void shouldWorkWithIpv6Addresses() throws Exception {
resolver = new DirContextDnsResolver();
InetAddress[] resolved = resolver.resolve("::1");
assertThat(resolved.length).isGreaterThan(0);
assertThat(resolved[0]).isInstanceOf(Inet6Address.class);
assertThat(resolved[0].getHostAddress()).isEqualTo("0:0:0:0:0:0:0:1");
resolved = resolver.resolve("2a00:1450:4001:816::200e");
assertThat(resolved.length).isGreaterThan(0);
assertThat(resolved[0]).isInstanceOf(Inet6Address.class);
assertThat(resolved[0].getHostAddress()).isEqualTo("2a00:1450:4001:816:0:0:0:200e");
}
}