package org.jivesoftware.openfire.net;
import org.jivesoftware.openfire.net.DNSUtil;
import org.junit.Assert;
import org.junit.Test;
import java.util.List;
/**
* Unit tests for {@link org.jivesoftware.openfire.net.DNSUtil}.
*
* @author Guus der Kinderen, guus.der.kinderen@gmail.com
*/
public class DNSUtilTest {
//@Test
public void testJabberDotOrg() throws Exception {
for (int i=0; i<=10; i++) {
final List<DNSUtil.HostAddress> list = DNSUtil.resolveXMPPDomain("jabber.org", 5222);
for(DNSUtil.HostAddress address : list) {
System.out.println("Address: " + address.toString());
}
System.out.println("");
}
}
/**
* Runs {@link DNSUtil#prioritize(org.jivesoftware.openfire.net.DNSUtil.WeightedHostAddress[])} on a copy of the
* DNS SRV xmpp-server records for jabber.org (as they were last 2012).
*/
@Test
public void testJabberDotOrgMock() throws Exception {
// setup
final DNSUtil.WeightedHostAddress fallback = new DNSUtil.WeightedHostAddress("fallback.jabber.org", 5269, 31, 31);
final DNSUtil.WeightedHostAddress hermes6 = new DNSUtil.WeightedHostAddress("hermes6.jabber.org", 5269, 30, 30);
final DNSUtil.WeightedHostAddress hermes = new DNSUtil.WeightedHostAddress("hermes.jabber.org", 5269, 30, 30);
// do magic
final List<DNSUtil.WeightedHostAddress> result = DNSUtil.prioritize(new DNSUtil.WeightedHostAddress[]{fallback, hermes6, hermes});
// verify
Assert.assertEquals("There were three records in the input, the output should have contained the same amount.", 3, result.size());
Assert.assertTrue("The 'hermes' host should have been included somewhere in the output." , result.contains(hermes));
Assert.assertTrue("The 'hermes6' host should have been included somewhere in the output." , result.contains(hermes6));
Assert.assertTrue("The 'fallback' host should bhave been included somewhere in the output.", result.contains(fallback));
Assert.assertEquals("The 'fallback' host should have been the last record in the result." , fallback, result.get(2));
}
/**
* A basic check that verifies that when one hosts exists, it gets returned in the output.
*/
@Test
public void testOneHost() throws Exception {
// setup
final DNSUtil.WeightedHostAddress host = new DNSUtil.WeightedHostAddress("host", 5222, 1, 1);
// do magic
final List<DNSUtil.WeightedHostAddress> result = DNSUtil.prioritize(new DNSUtil.WeightedHostAddress[]{host});
// verify
Assert.assertEquals( 1, result.size() );
Assert.assertEquals(host, result.get(0));
}
/**
* A check equal to {@link #testOneHost()}, but using (the edge-case) priority value of zero.
*/
@Test
public void testOneHostZeroPiority() throws Exception {
// setup
final DNSUtil.WeightedHostAddress host = new DNSUtil.WeightedHostAddress("host", 5222, 0, 1);
// do magic
final List<DNSUtil.WeightedHostAddress> result = DNSUtil.prioritize(new DNSUtil.WeightedHostAddress[]{host});
// verify
Assert.assertEquals(1, result.size());
Assert.assertEquals(host, result.get(0));
}
/**
* A check equal to {@link #testOneHost()}, but using (the edge-case) weight value of zero.
*/
@Test
public void testOneHostZeroWeight() throws Exception {
// setup
final DNSUtil.WeightedHostAddress host = new DNSUtil.WeightedHostAddress("host", 5222, 1, 0);
// do magic
final List<DNSUtil.WeightedHostAddress> result = DNSUtil.prioritize(new DNSUtil.WeightedHostAddress[]{host});
// verify
Assert.assertEquals(1, result.size());
Assert.assertEquals(host, result.get(0));
}
/**
* Verifies that when a couple of records exist that all have a particular priority, those records are all included
* in the result, ordered (ascending) by their priority.
* @throws Exception
*/
@Test
public void testDifferentPriorities() throws Exception {
// setup
final DNSUtil.WeightedHostAddress hostA = new DNSUtil.WeightedHostAddress("hostA", 5222, 1, 1);
final DNSUtil.WeightedHostAddress hostB = new DNSUtil.WeightedHostAddress("hostB", 5222, 3, 1);
final DNSUtil.WeightedHostAddress hostC = new DNSUtil.WeightedHostAddress("hostC", 5222, 2, 1);
// do magic
final List<DNSUtil.WeightedHostAddress> result = DNSUtil.prioritize(new DNSUtil.WeightedHostAddress[]{hostA, hostB, hostC});
// verify
Assert.assertEquals(3, result.size());
Assert.assertEquals(hostA, result.get(0));
Assert.assertEquals(hostC, result.get( 1 ));
Assert.assertEquals(hostB, result.get(2));
}
/**
* A test equal to {@link #testDifferentPriorities()}, but with one of the priorities set to zero.
*/
@Test
public void testZeroPriority() throws Exception {
// setup
final DNSUtil.WeightedHostAddress hostA = new DNSUtil.WeightedHostAddress("hostA", 5222, 0, 1);
final DNSUtil.WeightedHostAddress hostB = new DNSUtil.WeightedHostAddress("hostB", 5222, 2, 1);
final DNSUtil.WeightedHostAddress hostC = new DNSUtil.WeightedHostAddress("hostC", 5222, 1, 1);
// do magic
final List<DNSUtil.WeightedHostAddress> result = DNSUtil.prioritize(new DNSUtil.WeightedHostAddress[]{hostA, hostB, hostC});
// verify
Assert.assertEquals(3, result.size());
Assert.assertEquals(hostA, result.get(0));
Assert.assertEquals(hostC, result.get(1));
Assert.assertEquals(hostB, result.get(2));
}
/**
* A test that verifies that hosts with equal weight are alternately first in the resulting list.
*
* The test that is done here re-executes until each of the input records was included in the output as the first
* record. This indicates that the returning list is at the very least not always ordered in the exact same way.
*/
@Test
public void testSameWeights() throws Exception {
// setup
final DNSUtil.WeightedHostAddress hostA = new DNSUtil.WeightedHostAddress("hostA", 5222, 1, 10);
final DNSUtil.WeightedHostAddress hostB = new DNSUtil.WeightedHostAddress("hostB", 5222, 1, 10);
final DNSUtil.WeightedHostAddress[] hosts = new DNSUtil.WeightedHostAddress[] { hostA, hostB };
// do magic
boolean hostAWasFirst = false;
boolean hostBWasFirst = false;
final int maxTries = Integer.MAX_VALUE;
for (int i=0; i<maxTries; i++) {
final List<DNSUtil.WeightedHostAddress> result = DNSUtil.prioritize(hosts);
if (hostA.equals(result.get(0))) {
hostAWasFirst = true;
}
if (hostB.equals(result.get(0))) {
hostBWasFirst = true;
}
if (hostAWasFirst && hostBWasFirst) {
break;
}
if (i%1000000==0 && i>0) {
System.err.println("The last " + i + " iterations of this test all had the same result, which is very unlikely to occur (there should be an even distribution between two possible outcomes). We'll iterate up to "+ maxTries +" times, but you might want to abort the unit test at this point...");
}
}
// verify
Assert.assertTrue( hostAWasFirst );
Assert.assertTrue( hostBWasFirst );
}
/**
* A test equal to {@link #testSameWeights()}, but using records with a weight of zero.
*/
@Test
public void testZeroWeights() throws Exception {
// setup
final DNSUtil.WeightedHostAddress hostA = new DNSUtil.WeightedHostAddress("hostA", 5222, 1, 0);
final DNSUtil.WeightedHostAddress hostB = new DNSUtil.WeightedHostAddress("hostB", 5222, 1, 0);
final DNSUtil.WeightedHostAddress[] hosts = new DNSUtil.WeightedHostAddress[] { hostA, hostB };
// do magic
boolean hostAWasFirst = false;
boolean hostBWasFirst = false;
final int maxTries = Integer.MAX_VALUE;
for (int i=0; i<maxTries; i++) {
final List<DNSUtil.WeightedHostAddress> result = DNSUtil.prioritize(hosts);
if (hostA.equals(result.get(0))) {
hostAWasFirst = true;
}
if (hostB.equals(result.get(0))) {
hostBWasFirst = true;
}
if (hostAWasFirst && hostBWasFirst) {
break;
}
if (i%1000000==0 && i>0) {
System.err.println("The last " + i + " iterations of this test all had the same result, which is very unlikely to occur (there should be an even distribution between two possible outcomes). We'll iterate up to "+ maxTries +" times, but you might want to abort the unit test at this point...");
}
}
// verify
Assert.assertTrue(hostAWasFirst);
Assert.assertTrue(hostBWasFirst);
}
/**
* A test that verifies that {@link DNSUtil#isNameCoveredByPattern(String, String)} finds a match when both
* arguments have the same value.
*/
@Test
public void testNameCoverageExactMatch() throws Exception
{
// setup
final String name = "xmpp.example.org";
final String pattern = name;
// do magic
final boolean result = DNSUtil.isNameCoveredByPattern( name, pattern );
// verify
Assert.assertTrue( result );
}
/**
* A test that verifies that {@link DNSUtil#isNameCoveredByPattern(String, String)} does not find a match when both
* arguments have different values.
*/
@Test
public void testNameCoverageUnequal() throws Exception
{
// setup
final String name = "xmpp.example.org";
final String pattern = "something.completely.different";
// do magic
final boolean result = DNSUtil.isNameCoveredByPattern( name, pattern );
// verify
Assert.assertFalse( result );
}
/**
* A test that verifies that {@link DNSUtil#isNameCoveredByPattern(String, String)} does not find a match when the
* needle/name is a subdomain of the DNS pattern, without the DNS pattern including a wildcard.
*/
@Test
public void testNameCoverageSubdomainNoWildcard() throws Exception
{
// setup
final String name = "xmpp.example.org";
final String pattern = "example.org";
// do magic
final boolean result = DNSUtil.isNameCoveredByPattern( name, pattern );
// verify
Assert.assertFalse( result );
}
/**
* A test that verifies that {@link DNSUtil#isNameCoveredByPattern(String, String)} does not find a match when the
* last part of the needle/name equals the pattern.
*/
@Test
public void testNameCoveragePartialMatchButNoSubdomain() throws Exception
{
// setup
final String name = "xmppexample.org";
final String pattern = "example.org";
// do magic
final boolean result = DNSUtil.isNameCoveredByPattern( name, pattern );
// verify
Assert.assertFalse( result );
}
/**
* A test that verifies that {@link DNSUtil#isNameCoveredByPattern(String, String)} finds a match when the
* needle/name is a subdomain of the DNS pattern, while the DNS pattern includes a wildcard.
*/
@Test
public void testNameCoverageSubdomainWithWildcard() throws Exception
{
// setup
final String name = "xmpp.example.org";
final String pattern = "*.example.org";
// do magic
final boolean result = DNSUtil.isNameCoveredByPattern( name, pattern );
// verify
Assert.assertTrue( result );
}
/**
* A test that verifies that {@link DNSUtil#isNameCoveredByPattern(String, String)} finds a match when the
* needle/name is a subdomain of a subdomain of the DNS pattern, while the DNS pattern includes a wildcard.
*/
@Test
public void testNameCoverageSubSubdomainWithWildcard() throws Exception
{
// setup
final String name = "deeper.xmpp.example.org";
final String pattern = "*.example.org";
// do magic
final boolean result = DNSUtil.isNameCoveredByPattern( name, pattern );
// verify
Assert.assertTrue( result );
}
/**
* A test that verifies that {@link DNSUtil#isNameCoveredByPattern(String, String)} finds a match when the
* needle/name equals the domain part of the DNS pattern, while the DNS pattern includes a wildcard.
*
* Although somewhat shady, the certificate management in Openfire depends on this to hold true.
*/
@Test
public void testNameCoverageSubdomainWithWildcardOfSameDomain() throws Exception
{
// setup
final String name = "xmpp.example.org";
final String pattern = "*.xmpp.example.org";
// do magic
final boolean result = DNSUtil.isNameCoveredByPattern( name, pattern );
// verify
Assert.assertTrue( result );
}
}