org.sipfoundry.sipxconfig.admin.dialplan.config.MappingRulesTest.java Source code

Java tutorial

Introduction

Here is the source code for org.sipfoundry.sipxconfig.admin.dialplan.config.MappingRulesTest.java

Source

/*
 *
 *
 * Copyright (C) 2007 Pingtel Corp., certain elements licensed under a Contributor Agreement.
 * Contributors retain copyright to elements licensed under a Contributor Agreement.
 * Licensed to the User under the LGPL license.
 *
 *
 */
package org.sipfoundry.sipxconfig.admin.dialplan.config;

import java.io.InputStream;
import java.net.URL;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.List;

import org.sipfoundry.sipxconfig.admin.dialplan.CallTag;

import org.apache.commons.io.IOUtils;
import org.apache.commons.lang.ArrayUtils;
import org.custommonkey.xmlunit.XMLTestCase;
import org.custommonkey.xmlunit.XMLUnit;
import org.dom4j.Document;
import org.dom4j.Element;
import org.dom4j.VisitorSupport;
import org.easymock.EasyMock;
import org.easymock.IMocksControl;
import org.sipfoundry.sipxconfig.XmlUnitHelper;
import org.sipfoundry.sipxconfig.admin.AbstractConfigurationFile;
import org.sipfoundry.sipxconfig.admin.commserver.Location;
import org.sipfoundry.sipxconfig.admin.commserver.LocationsManager;
import org.sipfoundry.sipxconfig.admin.dialplan.AutoAttendant;
import org.sipfoundry.sipxconfig.admin.dialplan.DialingRule;
import org.sipfoundry.sipxconfig.admin.dialplan.ExchangeMediaServer;
import org.sipfoundry.sipxconfig.admin.dialplan.FreeswitchMediaServer;
import org.sipfoundry.sipxconfig.admin.dialplan.FreeswitchMediaServerTest;
import org.sipfoundry.sipxconfig.admin.dialplan.IDialingRule;
import org.sipfoundry.sipxconfig.admin.dialplan.MappingRule;
import org.sipfoundry.sipxconfig.admin.dialplan.MediaServer;
import org.sipfoundry.sipxconfig.admin.dialplan.VoicemailRedirectRule;
import org.sipfoundry.sipxconfig.admin.localization.LocalizationContext;
import org.sipfoundry.sipxconfig.domain.DomainManager;
import org.sipfoundry.sipxconfig.moh.MohRule;
import org.sipfoundry.sipxconfig.permission.PermissionName;
import org.sipfoundry.sipxconfig.service.SipxPageService;
import org.sipfoundry.sipxconfig.service.SipxParkService;
import org.sipfoundry.sipxconfig.service.SipxRlsService;
import org.sipfoundry.sipxconfig.service.SipxServiceManager;
import org.sipfoundry.sipxconfig.speeddial.RlsRule;
import org.sipfoundry.sipxconfig.test.TestUtil;

import static org.sipfoundry.sipxconfig.admin.AbstractConfigurationFile.getFileContent;

/**
 * MappingRulesTest
 */
public class MappingRulesTest extends XMLTestCase {
    private static final String VOICEMAIL_SERVER = "https%3A%2F%2F192.168.1.1%3A443";

    private final DomainManager m_domainManager;

    // Object Under Test
    private final MappingRules m_out;

    public MappingRulesTest() {
        XmlUnitHelper.setNamespaceAware(false);
        XMLUnit.setIgnoreWhitespace(true);

        m_domainManager = TestUtil.getMockDomainManager();
        EasyMock.replay(m_domainManager);

        m_out = new MappingRules();
        m_out.setDomainManager(m_domainManager);

        Location serviceLocation = new Location();
        serviceLocation.setAddress("192.168.1.5");
        List<Location> locations = new ArrayList<Location>();
        locations.add(serviceLocation);
        LocationsManager locationsManager = EasyMock.createNiceMock(LocationsManager.class);

        SipxParkService parkService = new SipxParkService();
        parkService.setBeanName(SipxParkService.BEAN_ID);
        parkService.setParkServerSipPort("9905");
        locationsManager.getLocationsForService(parkService);
        EasyMock.expectLastCall().andReturn(locations).anyTimes();
        parkService.setLocationsManager(locationsManager);

        SipxRlsService rlsService = new SipxRlsService();
        rlsService.setBeanName(SipxRlsService.BEAN_ID);
        rlsService.setRlsPort("9906");
        locationsManager.getLocationsForService(rlsService);
        EasyMock.expectLastCall().andReturn(locations).anyTimes();
        rlsService.setLocationsManager(locationsManager);

        SipxPageService pageService = new SipxPageService() {
            @Override
            public String getSipPort() {
                return "9910";
            }
        };
        pageService.setBeanName(SipxPageService.BEAN_ID);
        locationsManager.getLocationsForService(pageService);
        EasyMock.expectLastCall().andReturn(locations).anyTimes();
        pageService.setLocationsManager(locationsManager);

        EasyMock.replay(locationsManager);

        SipxServiceManager sipxServiceManager = TestUtil.getMockSipxServiceManager(true, parkService, rlsService,
                pageService);
        m_out.setSipxServiceManager(sipxServiceManager);
    }

    public void testGetDocument() throws Exception {
        m_out.begin();
        m_out.end();
        m_out.localizeDocument(TestUtil.createDefaultLocation());
        Document document = m_out.getDocument();

        String xml = TestUtil.asString(document);
        XmlUnitHelper.assertElementInNamespace(document.getRootElement(),
                "http://www.sipfoundry.org/sipX/schema/xml/urlmap-00-00");

        assertXpathExists("/mappings/hostMatch/hostPattern", xml);
        assertXpathEvaluatesTo("example.org", "/mappings/hostMatch/hostPattern", xml);
        assertXpathEvaluatesTo("sipx.example.org", "/mappings/hostMatch/hostPattern[2]", xml);
        assertXpathEvaluatesTo("sipx", "/mappings/hostMatch/hostPattern[3]", xml);
        assertXpathEvaluatesTo("192.168.1.1", "/mappings/hostMatch/hostPattern[4]", xml);
    }

    public void testGetDocumentInvalidExternals() throws Exception {
        m_out.begin();
        m_out.end();
        m_out.setExternalRulesFileName("/invalid/file/name");
        Document document = m_out.getDocument();

        String xml = TestUtil.asString(document);
        XmlUnitHelper.assertElementInNamespace(document.getRootElement(),
                "http://www.sipfoundry.org/sipX/schema/xml/urlmap-00-00");

        assertXpathExists("/mappings/hostMatch/hostPattern", xml);
    }

    public void testGetDocumentValidExternals() throws Exception {
        URL resource = getClass().getResource("external_mappingrules.test.xml");

        m_out.setExternalRulesFileName(resource.getFile());
        m_out.begin();
        m_out.end();
        m_out.localizeDocument(TestUtil.createDefaultLocation());
        Document document = m_out.getDocument();

        String xml = TestUtil.asString(document);

        XmlUnitHelper.assertElementInNamespace(document.getRootElement(),
                "http://www.sipfoundry.org/sipX/schema/xml/urlmap-00-00");

        assertXpathEvaluatesTo("some_other.domain.com", "/mappings/hostMatch/hostPattern", xml);
        assertXpathEvaluatesTo("example.org", "/mappings/hostMatch/userMatch/permissionMatch/transform/host", xml);

        assertXpathExists("/mappings/hostMatch[2]/hostPattern", xml);
    }

    public void testGetDocumentValidExternalsExtraSpaceInFilename() throws Exception {
        URL resource = getClass().getResource("external_mappingrules.test.xml");

        m_out.setExternalRulesFileName(resource.getFile() + " ");
        m_out.begin();
        m_out.end();
        m_out.localizeDocument(TestUtil.createDefaultLocation());
        Document document = m_out.getDocument();

        String xml = TestUtil.asString(document);

        XmlUnitHelper.assertElementInNamespace(document.getRootElement(),
                "http://www.sipfoundry.org/sipX/schema/xml/urlmap-00-00");

        assertXpathEvaluatesTo("some_other.domain.com", "/mappings/hostMatch/hostPattern", xml);
        assertXpathEvaluatesTo("example.org", "/mappings/hostMatch/userMatch/permissionMatch/transform/host", xml);

        assertXpathExists("/mappings/hostMatch[2]/hostPattern", xml);
    }

    /**
     * This is mostly to demonstrate how complicated the XPatch expression becomes for a document
     * with a namespace
     *
     * @param document
     */
    static void dumpXPaths(Document document) {
        VisitorSupport support = new VisitorSupport() {
            @Override
            public void visit(Element node) {
                System.err.println(node.getPath());
            }
        };
        document.accept(support);
    }

    public void testGetHostMatch() throws Exception {
        m_out.begin();
        m_out.end();
        Element hostMatch = m_out.getFirstHostMatch();
        Document document = m_out.getDocument();
        assertSame(document, hostMatch.getDocument());
        XmlUnitHelper.assertElementInNamespace(document.getRootElement(),
                "http://www.sipfoundry.org/sipX/schema/xml/urlmap-00-00");
        assertEquals("/*[name()='mappings']/*[name()='hostMatch']", hostMatch.getPath());
    }

    public void testGenerate() throws Exception {
        UrlTransform voicemail = new UrlTransform();
        voicemail.setUrl("<sip:{digits}@localhost;transport=tcp;" + "play=" + VOICEMAIL_SERVER
                + "/sipx-cgi/voicemail/mediaserver.cgi?action=deposit&mailbox={digits}>;q=0.1");

        UrlTransform voicemail2 = new UrlTransform();
        voicemail2.setUrl("<sip:{digits}@testserver;" + "play=" + VOICEMAIL_SERVER
                + "/sipx-cgi/voicemail/mediaserver.cgi?action=deposit&mailbox={digits}>;q=0.001");

        IMocksControl control = EasyMock.createNiceControl();
        IDialingRule rule = control.createMock(IDialingRule.class);
        rule.isInternal();
        control.andReturn(true);
        rule.getHostPatterns();
        control.andReturn(ArrayUtils.EMPTY_STRING_ARRAY);
        rule.getName();
        control.andReturn(null);
        rule.getDescription();
        control.andReturn("my rule description");
        rule.getPatterns();
        control.andReturn(new String[] { "x." }).anyTimes();
        rule.isTargetPermission();
        control.andReturn(true);
        rule.getPermissionNames();
        control.andReturn(Arrays.asList(new String[] { PermissionName.VOICEMAIL.getName() }));
        rule.getTransforms();
        control.andReturn(new Transform[] { voicemail, voicemail2 });
        control.replay();

        m_out.begin();
        m_out.generate(rule);
        m_out.end();

        Document document = m_out.getDocument();

        String domDoc = TestUtil.asString(document);

        assertXpathEvaluatesTo("my rule description", "/mappings/hostMatch/userMatch/description", domDoc);
        assertXpathEvaluatesTo("x.", "/mappings/hostMatch/userMatch/userPattern", domDoc);
        assertXpathEvaluatesTo("Voicemail", "/mappings/hostMatch/userMatch/permissionMatch/permission", domDoc);
        assertXpathEvaluatesTo(voicemail.getUrl(), "/mappings/hostMatch/userMatch/permissionMatch/transform/url",
                domDoc);
        assertXpathEvaluatesTo(voicemail2.getUrl(),
                "/mappings/hostMatch/userMatch/permissionMatch/transform[2]/url", domDoc);

        control.verify();
    }

    public void testGenerateRuleWithGateways() throws Exception {
        IMocksControl control = EasyMock.createControl();
        IDialingRule rule = control.createMock(IDialingRule.class);
        rule.isInternal();
        control.andReturn(false);
        rule.getCallTag();
        control.andReturn(CallTag.UNK).anyTimes();
        control.replay();

        m_out.begin();
        m_out.generate(rule);
        m_out.end();

        Document document = m_out.getDocument();
        String domDoc = TestUtil.asString(document);

        assertXpathNotExists("/mappings/hostMatch/userMatch/userPattern", domDoc);
        assertXpathNotExists("/mappings/hostMatch/userMatch/permissionMatch", domDoc);
        assertXpathExists("/mappings/hostMatch/hostPattern", domDoc);

        control.verify();
    }

    public void testVoicemailRules() throws Exception {
        int extension = 3;
        List<DialingRule> rules = new ArrayList<DialingRule>();
        AutoAttendant aa = new AutoAttendant();
        aa.setSystemId(AutoAttendant.OPERATOR_ID);
        aa.setName("Operator");
        aa.resetToFactoryDefault();
        rules.add(new MohRule("192.168.1.5:9905", "~~mh~u"));
        rules.add(new RlsRule());

        LocalizationContext lc = EasyMock.createNiceMock(LocalizationContext.class);

        FreeswitchMediaServer mediaServer = new FreeswitchMediaServer();
        FreeswitchMediaServerTest.configureMediaServer(mediaServer);

        mediaServer.setLocalizationContext(lc);
        MediaServer exchangeMediaServer = new ExchangeMediaServer("exchange.example.com", "102");
        exchangeMediaServer.setLocalizationContext(lc);

        EasyMock.replay(lc);

        rules.add(new MappingRule.Operator(aa, "100", new String[] { "operator", "0" }, mediaServer));
        rules.add(new MappingRule.Voicemail("101", mediaServer));
        rules.add(new MappingRule.Voicemail("102", exchangeMediaServer));
        rules.add(new MappingRule.VoicemailTransfer("2", extension, mediaServer));
        rules.add(new MappingRule.VoicemailTransfer("2", extension, exchangeMediaServer));
        rules.add(new MappingRule.VoicemailFallback(mediaServer));
        rules.add(new MappingRule.VoicemailFallback(exchangeMediaServer));
        rules.add(new VoicemailRedirectRule());

        m_out.begin();
        for (DialingRule rule : rules) {
            m_out.generate(rule);
        }
        m_out.end();
        m_out.localizeDocument(TestUtil.createDefaultLocation());

        String generatedXml = getFileContent(m_out, null);

        InputStream referenceXmlStream = getClass().getResourceAsStream("mappingrules-multiple-servers.test.xml");

        assertEquals(IOUtils.toString(referenceXmlStream, "UTF-8"), generatedXml);
        EasyMock.verify(lc);
    }

    public void testEquals() throws Exception {
        AbstractConfigurationFile f1 = new MappingRules();
        f1.setName("mappingrules.xml");
        AbstractConfigurationFile f2 = new MappingRules();
        f2.setName("mappingrules.xml");
        AbstractConfigurationFile f3 = new FallbackRules();
        f3.setName("fallbackrules.xml");
        assertEquals(f1, f2);
        assertNotSame(f1, f2);
        assertEquals(f1.hashCode(), f2.hashCode());
        assertFalse(f1.equals(null));
        assertFalse(f1.equals(f3));
    }

    public void testHostPatternProvider() throws Exception {
        IMocksControl control = EasyMock.createNiceControl();
        IDialingRule rule = control.createMock(IDialingRule.class);
        rule.isInternal();
        control.andReturn(true);
        rule.isTargetPermission();
        control.andReturn(true);
        rule.getHostPatterns();
        control.andReturn(new String[] { "gander" });
        rule.getPatterns();
        control.andReturn(new String[] { "dot" });
        rule.getPermissionNames();
        control.andReturn(Collections.EMPTY_LIST);
        rule.getTransforms();
        control.andReturn(new Transform[0]);

        control.replay();

        m_out.begin();
        m_out.generate(rule);
        m_out.end();

        Document document = m_out.getDocument();
        String domDoc = TestUtil.asString(document);

        assertXpathExists("/mappings/hostMatch[1]/hostPattern", domDoc);
        assertXpathExists("/mappings/hostMatch[1]/userMatch/userPattern", domDoc);

        assertXpathEvaluatesTo("gander", "/mappings/hostMatch[1]/hostPattern", domDoc);
        assertXpathNotExists("/mappings/hostMatch[1]/hostPattern[2]", domDoc);

        control.verify();
    }

    public void testGenerateInternalRuleWithSourcePermission() throws Exception {
        IMocksControl control = EasyMock.createNiceControl();
        IDialingRule rule = control.createMock(IDialingRule.class);
        rule.isInternal();
        control.andReturn(true);
        rule.getHostPatterns();
        control.andReturn(ArrayUtils.EMPTY_STRING_ARRAY);
        rule.getName();
        control.andReturn(null);
        rule.getDescription();
        control.andReturn("my rule description");
        rule.getPatterns();
        control.andReturn(new String[] { "xxx" }).anyTimes();
        rule.isTargetPermission();
        control.andReturn(false);
        rule.getTransforms();
        control.andReturn(new Transform[0]);
        control.replay();

        m_out.begin();
        m_out.generate(rule);
        m_out.end();

        Document document = m_out.getDocument();

        String domDoc = TestUtil.asString(document);

        assertXpathEvaluatesTo("my rule description", "/mappings/hostMatch/userMatch/description", domDoc);
        assertXpathEvaluatesTo("xxx", "/mappings/hostMatch/userMatch/userPattern", domDoc);
        assertXpathNotExists("/mappings/hostMatch/userMatch/permissionMatch/permission", domDoc);

        control.verify();
    }
}