/*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The ASF licenses this file to You under the Apache License, Version 2.0
* (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*
*/
package org.apache.jmeter.protocol.http.control;
import static org.junit.Assert.assertThat;
import static org.junit.Assert.fail;
import static org.junit.Assume.assumeTrue;
import java.net.InetAddress;
import java.net.UnknownHostException;
import java.util.Arrays;
import org.apache.jmeter.junit.JMeterTestCase;
import org.hamcrest.CoreMatchers;
import org.junit.Assert;
import org.junit.Test;
import org.xbill.DNS.ExtendedResolver;
public class TestDNSCacheManager extends JMeterTestCase {
private static final String INVALID_DNS_SERVER = "8.8.8.8.9"; //$NON-NLS-1$
private static final String VALID_DNS_SERVER = "8.8.8.8"; //$NON-NLS-1$
@Test
public void testWithOneStaticHost() throws Exception {
DNSCacheManager manager = new DNSCacheManager();
manager.setCustomResolver(true);
manager.addHost("jmeter.example.org", "127.0.0.1");
assertThat(manager.resolve("jmeter.example.org"),
CoreMatchers.is(CoreMatchers.equalTo(new InetAddress[] { InetAddress.getByName("127.0.0.1") })));
}
@Test
public void testWithMultipleStaticHost() throws Exception {
DNSCacheManager manager = new DNSCacheManager();
manager.setCustomResolver(true);
manager.addHost("jmeter.example.org", "127.0.0.1, 1.2.3.4");
assertThat(manager.resolve("jmeter.example.org"),
CoreMatchers.is(CoreMatchers.equalTo(new InetAddress[] { InetAddress.getByName("127.0.0.1"), InetAddress.getByName("1.2.3.4") })));
}
@Test
public void testAddAndClearStaticHost() throws Exception {
DNSCacheManager manager = new DNSCacheManager();
manager.setCustomResolver(true);
manager.addHost("apache.jmeter.org", "127.0.0.1");
manager.resolve("apache.jmeter.org");
manager.clear();
assertThat(Arrays.asList(manager.resolve("jmeter.apache.org")),
CoreMatchers.hasItem(InetAddress.getByName("jmeter.apache.org")));
assertThat(Arrays.asList(manager.resolve("jmeter.apache.org")),
CoreMatchers.not(CoreMatchers.hasItem(InetAddress.getByName("127.0.0.1"))));
}
@Test
public void testWithCustomResolverAnd1WrongServer() throws UnknownHostException {
DNSCacheManager original = new DNSCacheManager();
original.addServer(INVALID_DNS_SERVER);
original.setCustomResolver(true);
original.setTimeoutMs(100);
try {
original.resolve("jmeter.apache.org");
fail("Should have failed as DNS server does not exist");
} catch (UnknownHostException e) {
Assert.assertNull(original.resolver);
Assert.assertTrue(original.initFailed);
}
try {
original.resolve("www.apache.org");
fail("Should have failed as DNS server does not exist");
// OK
} catch (UnknownHostException e) {
Assert.assertNull(original.resolver);
Assert.assertTrue(original.initFailed);
}
}
@Test
public void testWithCustomResolverAnd1Server() throws UnknownHostException {
assumeTrue(!Boolean.getBoolean("skip.test_TestDNSCacheManager.testWithCustomResolverAnd1Server"));
DNSCacheManager original = new DNSCacheManager();
original.addServer(VALID_DNS_SERVER);
original.setCustomResolver(true);
original.setTimeoutMs(100);
try {
original.resolve("jmeter.apache.org");
Assert.assertNotNull(original.resolver);
Assert.assertEquals(((ExtendedResolver)original.resolver).getResolvers().length, 1);
Assert.assertEquals(original.cache.size(), 1);
// OK
} catch (UnknownHostException e) {
fail("Should have succeeded resolving jmeter.apache.org, error:"+e.getMessage());
}
}
@Test
public void testUseCache() throws UnknownHostException {
DNSCacheManager original = new DNSCacheManager();
original.addServer(VALID_DNS_SERVER);
original.setCustomResolver(true);
original.setTimeoutMs(100);
try {
InetAddress[] expectedResult = new InetAddress[0];
original.cache.put("jmeter.apache.org", new InetAddress[0]);
InetAddress[] actual = original.resolve("jmeter.apache.org");
Assert.assertArrayEquals(expectedResult, actual);
// OK
} catch (UnknownHostException e) {
fail("Cache should have been used");
}
try {
original.cache.put("jmeter.apache.org", null);
Assert.assertNull(original.resolve("jmeter.apache.org"));
// OK
} catch (UnknownHostException e) {
fail("Cache should have been used");
}
}
@Test
public void testWithCustomResolverAndNoServer() throws UnknownHostException {
DNSCacheManager original = new DNSCacheManager();
original.setCustomResolver(true);
original.setTimeoutMs(100);
try {
// This will use Default System DNS resolver
original.resolve("jmeter.apache.org");
Assert.assertNotNull(original.resolver);
Assert.assertEquals(((ExtendedResolver)original.resolver).getResolvers().length, 0);
} catch (UnknownHostException e) {
fail("Should have failed as no DNS server provided");
}
}
@Test
public void testWithCustomResolverAndInvalidNameserver() throws UnknownHostException {
DNSCacheManager original = new DNSCacheManager();
original.setCustomResolver(true);
original.addServer(INVALID_DNS_SERVER);
original.setTimeoutMs(100);
try {
original.resolve("jmeter.apache.org");
fail();
} catch (UnknownHostException e) {
// OK
}
}
@Test
public void testCloneWithCustomResolverAndInvalidNameserver() throws UnknownHostException {
DNSCacheManager original = new DNSCacheManager();
original.setCustomResolver(true);
original.addServer(INVALID_DNS_SERVER);
DNSCacheManager clone = (DNSCacheManager) original.clone();
clone.setTimeoutMs(100);
try {
clone.resolve("jmeter.apache.org");
fail();
} catch (UnknownHostException e) {
// OK
}
}
@Test
public void testResolveExistingHostWithSystemDefaultDnsServer() throws UnknownHostException {
DNSCacheManager original = new DNSCacheManager();
original.setCustomResolver(false);
try {
InetAddress[] result = original.resolve("www.example.org");
Assert.assertNotNull(result);
Assert.assertNull(original.resolver);
// IPv4 and/or IPv6
Assert.assertTrue(result.length>0);
} catch (UnknownHostException e) {
Assert.fail("Should not have failed");
}
}
@Test
public void testResolveNonExistingHostWithSystemDefaultDnsServer() throws UnknownHostException {
DNSCacheManager original = new DNSCacheManager();
original.setCustomResolver(false);
try {
original.resolve("jmeterxxx.apache.org");
fail();
} catch (UnknownHostException e) {
Assert.assertNull(original.resolver);
// OK
}
}
}