package com.workshare.msnos.soup.net; import static org.junit.Assert.assertArrayEquals; import static org.mockito.Matchers.anyString; import static org.mockito.Mockito.mock; import static org.mockito.Mockito.when; import java.net.InetAddress; import java.net.UnknownHostException; import org.apache.http.conn.DnsResolver; import org.junit.Before; import org.junit.Test; import org.mockito.invocation.InvocationOnMock; import org.mockito.stubbing.Answer; public class DnsResolverWithTimeoutTest { private DnsResolverWithTimeout resolver; private DnsResolver systemResolver; private long timeoutInMillis; @Before public void setup() { systemResolver = mock(DnsResolver.class); timeoutInMillis = 100l; } @Test public void shouldReturnResolvedHostWhenWithinTimeout() throws UnknownHostException { InetAddress[] address = new InetAddress[]{}; when(systemResolver.resolve(anyString())).thenReturn(address); InetAddress[] result = resolver().resolve("foo"); assertArrayEquals(address, result); } @Test(expected=UnknownHostException.class) public void shouldThrowUnknownHostExceptionOnTimeout() throws UnknownHostException { when(systemResolver.resolve(anyString())).thenAnswer(new Answer<InetAddress[]>(){ @Override public InetAddress[] answer(InvocationOnMock invocation) throws Throwable { Thread.sleep(timeoutInMillis*2); return null; }}); resolver().resolve("foo"); } @Test(expected=UnknownHostException.class) public void shouldThrowUnknownHostExceptionOnException() throws UnknownHostException { when(systemResolver.resolve(anyString())).thenThrow(new RuntimeException("boom!")); resolver().resolve("foo"); } @Test(expected=UnknownHostException.class) public void shouldThrowUnknownHostExceptionOnInterruption() throws UnknownHostException { when(systemResolver.resolve(anyString())).thenAnswer(new Answer<InetAddress[]>(){ @Override public InetAddress[] answer(InvocationOnMock invocation) throws Throwable { throw new InterruptedException("NMI!"); }}); resolver().resolve("foo"); } private DnsResolverWithTimeout resolver() { if (resolver == null) resolver = new DnsResolverWithTimeout(DnsResolverWithTimeout.DNS_RESOLVE_EXECUTOR, systemResolver, timeoutInMillis); return resolver; } }