FileDocCategorySizeDatePackage
DNSServerTest.javaAPI DocApache James 2.3.16301Fri Jan 12 12:56:36 GMT 2007org.apache.james.dnsserver

DNSServerTest.java

/****************************************************************
 * 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.james.dnsserver;

import org.apache.avalon.framework.configuration.Configuration;
import org.apache.avalon.framework.configuration.DefaultConfigurationBuilder;
import org.apache.james.test.mock.avalon.MockLogger;
import org.xbill.DNS.Name;
import org.xbill.DNS.Record;
import org.xbill.DNS.Resolver;
import org.xbill.DNS.SetResponse;
import org.xbill.DNS.TextParseException;
import org.xbill.DNS.Zone;

import java.io.ByteArrayInputStream;
import java.util.Collection;
import java.util.Iterator;

import junit.framework.TestCase;

public class DNSServerTest extends TestCase {

    private TestableDNSServer dnsServer;

    /**
     * Please note that this is an hardcoded test that works because
     * www.pippo.com. is an alias to pippo.com and pippo.com has
     * "pippo.com.inbound.mxlogic.net." as its mx record.
     * This is the first domain with a record proving a previous james bug.
     * This test will be invalidated by any change in the pippo.com dns records
     * 
     * @param args
     * @throws Exception
     */
    public void testINARecords() throws Exception {
        Zone z = new Zone(Name.fromString("pippo.com."),getClass().getResource("pippo-com.zone").getFile());
        dnsServer.setResolver(null);
        dnsServer.setLookupper(new ZoneLookupper(z));
        Collection records = dnsServer.findMXRecords("www.pippo.com.");
        assertEquals(1, records.size());
        assertEquals("pippo.com.inbound.mxlogic.net.", records.iterator()
                .next());
    }

    /**
     * @throws Exception
     */
    public void testMXCatches() throws Exception {
        Zone z = new Zone(Name.fromString("test-zone.com."),getClass().getResource("test-zone-com.zone").getFile());
        dnsServer.setResolver(null);
        dnsServer.setLookupper(new ZoneLookupper(z));
        Collection res = dnsServer.findMXRecords("test-zone.com.");
        try {
            res.add(new Object());
            fail("MX Collection should not be modifiable");
        } catch (UnsupportedOperationException e) {
        }
        assertEquals(1,res.size());
        assertEquals("mail.test-zone.com.",res.iterator().next());
    }
    
    /**
     * Please note that this is an hardcoded test that works because
     * brandilyncollins.com. has an MX record that point to mxmail.register.com
     * and this is a CNAME to the real address.
     * This test will be invalidated by any change in the brandilyncollins.com dns records
     * 
     * @param args
     * @throws Exception
     */
    public void testCNAMEasMXrecords() throws Exception {
        Zone z = new Zone(Name.fromString("brandilyncollins.com."),getClass().getResource("brandilyncollins-com.zone").getFile());
        dnsServer.setResolver(null);
        dnsServer.setLookupper(new ZoneLookupper(z));
        Iterator records = dnsServer.getSMTPHostAddresses("brandilyncollins.com.");
        assertEquals(true, records.hasNext());
    }

    protected void setUp() throws Exception {
        dnsServer = new TestableDNSServer();
        DefaultConfigurationBuilder db = new DefaultConfigurationBuilder();

        Configuration c = db.build(
                new ByteArrayInputStream("<dnsserver><autodiscover>true</autodiscover><authoritative>false</authoritative></dnsserver>".getBytes()),
                "dnsserver");
        dnsServer.enableLogging(new MockLogger());
        dnsServer.configure(c);
        dnsServer.initialize();
    }

    protected void tearDown() throws Exception {
        dnsServer.setLookupper(null);
        dnsServer.dispose();
    }

    private class ZoneLookupper implements Lookupper {
        private final Zone z;

        private ZoneLookupper(Zone z) {
            super();
            this.z = z;
        }

        public SetResponse lookup(Name name, int type) {
            SetResponse s = z.findRecords(name,type);
            System.out.println("Zone Lookup: "+name+" "+type+" = "+s);
            return s; 
        }
    }

    private interface Lookupper {
        SetResponse lookup(Name name, int type);
    }
    
    private final class TestableDNSServer extends DNSServer {
        
        private Lookupper lookupper;

        public void setLookupper(Lookupper l) {
            this.lookupper = l;
        }
        
        public Record[] lookup(String name, int type) {
            if (lookupper != null) {
                try {
                    SetResponse lookup = lookupper.lookup(Name.fromString(name), type);
                    if (lookup != null && lookup.isSuccessful()) {
                        return processSetResponse(lookup);
                    } else {
                        return null;
                    }
                } catch (TextParseException e) {
                    e.printStackTrace();
                    return null;
                }
            } else {
                return super.lookup(name, type);
            }
        }

        public void setResolver(Resolver r) {
            resolver = r;
        }

        public Resolver getResolver() {
            return resolver;
        }
    }

}