//
//
// Copyright (C) 2004 SIPfoundry Inc.
// Licensed by SIPfoundry under the LGPL license.
//
// Copyright (C) 2004 Pingtel Corp.
// Licensed to SIPfoundry under a Contributor Agreement.
//
// $$
//////////////////////////////////////////////////////////////////////////////
#include <cppunit/extensions/HelperMacros.h>
#include <cppunit/TestCase.h>
#include <sipxunit/TestUtilities.h>
#include "net/Url.h"
#include "digitmaps/UrlMapping.h"
#include "sipdb/ResultSet.h"
#include "testlib/FileTestContext.h"
#define VM "VoIcEmAiL"
#define MS "MeDiAsErVeR"
#define LH "LoCaLhOsT"
class UrlMappingTest : public CppUnit::TestCase, public UrlMapping
{
CPPUNIT_TEST_SUITE(UrlMappingTest);
CPPUNIT_TEST(testConvertDialString2RegEx);
CPPUNIT_TEST(testSimpleMap);
CPPUNIT_TEST(testFieldParams);
CPPUNIT_TEST(testAddUrlParams);
CPPUNIT_TEST(testHeaderParamAdd);
CPPUNIT_TEST(testFieldAdd);
CPPUNIT_TEST(testAddFieldParams);
CPPUNIT_TEST(testDigits);
CPPUNIT_TEST(testVDigits);
CPPUNIT_TEST(testUserPat);
CPPUNIT_TEST(testEscape);
CPPUNIT_TEST(testSpecials);
CPPUNIT_TEST_SUITE_END();
public:
void setUp()
{
mFileTestContext = new FileTestContext(TEST_DATA_DIR "/mapdata", TEST_WORK_DIR "/mapdata");
}
void tearDown()
{
delete mFileTestContext;
}
void testConvertDialString2RegEx()
{
UtlString regexp;
UtlString pattern;
pattern = "12x";
convertDialString2RegEx(pattern,regexp);
ASSERT_STR_EQUAL("^12(.)$",regexp.data());
pattern = "12.";
convertDialString2RegEx(pattern,regexp);
ASSERT_STR_EQUAL("^12(.*)$",regexp.data());
pattern = "12*";
convertDialString2RegEx(pattern,regexp);
ASSERT_STR_EQUAL("^12\\*$",regexp.data());
pattern = "(12)";
convertDialString2RegEx(pattern,regexp);
ASSERT_STR_EQUAL("^\\(12\\)$",regexp.data());
pattern = "[12]3";
convertDialString2RegEx(pattern,regexp);
ASSERT_STR_EQUAL("^([12]3)$",regexp.data());
pattern = "1[23]";
convertDialString2RegEx(pattern,regexp);
ASSERT_STR_EQUAL("^1([23])$",regexp.data());
pattern = "1\\[23]";
convertDialString2RegEx(pattern,regexp);
ASSERT_STR_EQUAL("^1\\[23]$",regexp.data());
pattern = "1\\[23\\]"; // userPattern 1\[23]
convertDialString2RegEx(pattern,regexp);
ASSERT_STR_EQUAL("^1\\[23\\]$",regexp.data());
pattern = "\\1\\\\2\\\\\\3"; // userPattern \1\\2\\\3
convertDialString2RegEx(pattern,regexp);
ASSERT_STR_EQUAL("^1\\\\2\\\\3$",regexp.data()); // regexp 1\\2\\3
// printf("pattern '%s' regexp '%s'\n", pattern.data(), regexp.data());
}
void testSimpleMap()
{
UrlMapping* urlmap;
ResultSet registrations;
UtlBoolean isPSTNnumber = false;
ResultSet permissions;
UtlString actual;
CPPUNIT_ASSERT( urlmap = new UrlMapping() );
UtlString simpleXml;
mFileTestContext->inputFilePath("simple.xml", simpleXml);
CPPUNIT_ASSERT( urlmap->loadMappings(simpleXml.data(),
MS, VM, LH
)
== OS_SUCCESS
);
// the interface says getContactList returns an OsStatus,
// but it is not set so don't test it
urlmap->getContactList( Url("sip:THISUSER@THISHOST.THISDOMAIN")
,registrations, isPSTNnumber, permissions
);
CPPUNIT_ASSERT( permissions.getSize() == 0 );
CPPUNIT_ASSERT( registrations.getSize() == 1 );
getResult( registrations, 0, "contact", actual);
ASSERT_STR_EQUAL("sip:NEWUSER@NEWHOST.NEWDOMAIN",actual);
registrations.destroyAll();
urlmap->getContactList( Url("sip:THISUSER@THISDOMAIN")
,registrations, isPSTNnumber, permissions
);
CPPUNIT_ASSERT( permissions.getSize() == 0 );
CPPUNIT_ASSERT( registrations.getSize() == 1 );
getResult( registrations, 0, "contact", actual);
ASSERT_STR_EQUAL("sip:NEWUSER@NEWHOST.NEWDOMAIN", actual);
registrations.destroyAll();
urlmap->getContactList( Url("sip:THATUSER@THISHOST.THISDOMAIN")
,registrations, isPSTNnumber, permissions
);
CPPUNIT_ASSERT( permissions.getSize() == 0 );
CPPUNIT_ASSERT( registrations.getSize() == 1 );
getResult( registrations, 0, "contact", actual);
ASSERT_STR_EQUAL( "sip:NEWUSER@NEWHOST.NEWDOMAIN", actual);
registrations.destroyAll();
urlmap->getContactList( Url("sip:THATUSER@THISDOMAIN")
,registrations, isPSTNnumber, permissions
);
CPPUNIT_ASSERT( permissions.getSize() == 0 );
CPPUNIT_ASSERT( registrations.getSize() == 1 );
getResult( registrations, 0, "contact", actual);
ASSERT_STR_EQUAL( "sip:NEWUSER@NEWHOST.NEWDOMAIN", actual );
registrations.destroyAll();
urlmap->getContactList( Url("sip:OTHERUSER@THISHOST.THIDOMAIN")
,registrations, isPSTNnumber, permissions
);
CPPUNIT_ASSERT( permissions.getSize() == 0 );
CPPUNIT_ASSERT( registrations.getSize() == 0 );
urlmap->getContactList( Url("sip:OTHERUSER@THISDOMAIN")
,registrations, isPSTNnumber, permissions
);
CPPUNIT_ASSERT( permissions.getSize() == 0 );
CPPUNIT_ASSERT( registrations.getSize() == 0 );
urlmap->getContactList( Url("sip:THISUSER@OTHERHOST.THIDOMAIN")
,registrations, isPSTNnumber, permissions
);
CPPUNIT_ASSERT( permissions.getSize() == 0 );
CPPUNIT_ASSERT( registrations.getSize() == 0 );
urlmap->getContactList( Url("sip:THISUSER@OTHERDOMAIN")
,registrations, isPSTNnumber, permissions
);
CPPUNIT_ASSERT( permissions.getSize() == 0 );
CPPUNIT_ASSERT( registrations.getSize() == 0 );
urlmap->getContactList( Url("sip:THISUSER@UserChgDOMAIN")
,registrations, isPSTNnumber, permissions
);
CPPUNIT_ASSERT( permissions.getSize() == 0 );
CPPUNIT_ASSERT( registrations.getSize() == 1 );
getResult( registrations, 0, "contact", actual);
ASSERT_STR_EQUAL( "sip:NEWUSER@UserChgDOMAIN", actual );
registrations.destroyAll();
urlmap->getContactList( Url("sip:THATUSER@UserChgDOMAIN")
,registrations, isPSTNnumber, permissions
);
CPPUNIT_ASSERT( permissions.getSize() == 0 );
CPPUNIT_ASSERT( registrations.getSize() == 1 );
getResult( registrations, 0, "contact", actual);
ASSERT_STR_EQUAL( "sip:NEWUSER@UserChgDOMAIN", actual );
registrations.destroyAll();
urlmap->getContactList( Url("sip:OTHERUSER@UserChgDOMAIN")
,registrations, isPSTNnumber, permissions
);
CPPUNIT_ASSERT( permissions.getSize() == 0 );
CPPUNIT_ASSERT( registrations.getSize() == 0 );
registrations.destroyAll();
urlmap->getContactList( Url("sip:THISUSER@HostChgDOMAIN")
,registrations, isPSTNnumber, permissions
);
CPPUNIT_ASSERT( permissions.getSize() == 0 );
CPPUNIT_ASSERT( registrations.getSize() == 1 );
getResult( registrations, 0, "contact", actual);
ASSERT_STR_EQUAL( "sip:THISUSER@NewHost", actual );
registrations.destroyAll();
urlmap->getContactList( Url("sip:THATUSER@HostChgDOMAIN")
,registrations, isPSTNnumber, permissions
);
CPPUNIT_ASSERT( permissions.getSize() == 0 );
CPPUNIT_ASSERT( registrations.getSize() == 1 );
getResult( registrations, 0, "contact", actual);
ASSERT_STR_EQUAL( "sip:THATUSER@NewHost", actual );
registrations.destroyAll();
// do the domain transformtion again and check that the transport is removed [XRR-114]
urlmap->getContactList( Url("<sip:THATUSER@HostChgDOMAIN;transport=xyz>")
,registrations, isPSTNnumber, permissions
);
CPPUNIT_ASSERT( permissions.getSize() == 0 );
CPPUNIT_ASSERT( registrations.getSize() == 1 );
getResult( registrations, 0, "contact", actual);
ASSERT_STR_EQUAL( "sip:THATUSER@NewHost", actual );
registrations.destroyAll();
urlmap->getContactList( Url("sip:OTHERUSER@UserChgDOMAIN")
,registrations, isPSTNnumber, permissions
);
CPPUNIT_ASSERT( permissions.getSize() == 0 );
CPPUNIT_ASSERT( registrations.getSize() == 0 );
registrations.destroyAll();
delete urlmap;
}
void testFieldParams()
{
UrlMapping urlmap;
ResultSet registrations;
UtlBoolean isPSTNnumber = false;
ResultSet permissions;
UtlString actual;
UtlString paramsXml;
mFileTestContext->inputFilePath("params.xml", paramsXml);
CPPUNIT_ASSERT( loadUrlMap( urlmap, paramsXml.data()));
// the interface says getContactList returns an OsStatus,
// but it is not set so don't test it
urlmap.getContactList( Url("sip:ADDFIELDS@thisdomain")
,registrations, isPSTNnumber, permissions
);
CPPUNIT_ASSERT( permissions.getSize() == 0 );
CPPUNIT_ASSERT( registrations.getSize() == 1 );
getResult( registrations, 0, "contact" , actual );
ASSERT_STR_EQUAL("<sip:ADDFIELDS@thisdomain>;NEWFIELDPARAM=FIELDVALUE" , actual );
registrations.destroyAll();
}
void testAddUrlParams()
{
UrlMapping urlmap;
ResultSet registrations;
UtlBoolean isPSTNnumber = false;
ResultSet permissions;
UtlString actual;
UtlString paramsXml;
mFileTestContext->inputFilePath("params.xml", paramsXml);
CPPUNIT_ASSERT( loadUrlMap( urlmap, paramsXml.data()));
urlmap.getContactList( Url("sip:ADDURLPARAM@thisdomain")
,registrations, isPSTNnumber, permissions
);
CPPUNIT_ASSERT( permissions.getSize() == 0 );
CPPUNIT_ASSERT( registrations.getSize() == 1 );
getResult( registrations, 0, "contact" , actual );
ASSERT_STR_EQUAL("<sip:ADDURLPARAM@thisdomain;NEWURLPARAM=URLVALUE>" , actual );
registrations.destroyAll();
}
void testHeaderParamAdd()
{
UrlMapping urlmap;
ResultSet registrations;
UtlBoolean isPSTNnumber = false;
ResultSet permissions;
UtlString actual;
UtlString paramsXml;
mFileTestContext->inputFilePath("params.xml", paramsXml);
CPPUNIT_ASSERT( loadUrlMap( urlmap, paramsXml.data()));
urlmap.getContactList( Url("sip:ADDHEADERPARAM@thisdomain")
,registrations, isPSTNnumber, permissions
);
CPPUNIT_ASSERT( permissions.getSize() == 0 );
CPPUNIT_ASSERT( registrations.getSize() == 1 );
getResult( registrations, 0, "contact" , actual );
ASSERT_STR_EQUAL("<sip:ADDHEADERPARAM@thisdomain?NEWHEADERPARAM=HEADERVALUE>" , actual );
registrations.destroyAll();
}
void testFieldAdd()
{
UrlMapping urlmap;
ResultSet registrations;
UtlBoolean isPSTNnumber = false;
ResultSet permissions;
UtlString actual;
UtlString paramsXml;
mFileTestContext->inputFilePath("params.xml", paramsXml);
CPPUNIT_ASSERT( loadUrlMap( urlmap, paramsXml.data()));
urlmap.getContactList( Url("<sip:ADDFIELDS@thisdomain;urlparam=avalue>;field=oldvalue")
,registrations, isPSTNnumber, permissions
);
CPPUNIT_ASSERT( permissions.getSize() == 0 );
CPPUNIT_ASSERT( registrations.getSize() == 1 );
getResult( registrations, 0, "contact"
, actual
);
ASSERT_STR_EQUAL("<sip:ADDFIELDS@thisdomain;urlparam=avalue>;field=oldvalue;NEWFIELDPARAM=FIELDVALUE"
, actual );
registrations.destroyAll();
}
void testAddFieldParams()
{
UrlMapping urlmap;
ResultSet registrations;
UtlBoolean isPSTNnumber = false;
ResultSet permissions;
UtlString actual;
UtlString paramsXml;
mFileTestContext->inputFilePath("params.xml", paramsXml);
CPPUNIT_ASSERT( loadUrlMap( urlmap, paramsXml.data()));
urlmap.getContactList( Url("<sip:ADDFIELDS@thisdomain;NEWURLPARAM=oldvalue>")
,registrations, isPSTNnumber, permissions
);
CPPUNIT_ASSERT( permissions.getSize() == 0 );
CPPUNIT_ASSERT( registrations.getSize() == 1 );
getResult( registrations, 0, "contact", actual );
ASSERT_STR_EQUAL("<sip:ADDFIELDS@thisdomain;NEWURLPARAM=oldvalue>;NEWFIELDPARAM=FIELDVALUE", actual);
registrations.destroyAll();
}
void testDigits()
{
UrlMapping* urlmap;
ResultSet registrations;
UtlBoolean isPSTNnumber = false;
ResultSet permissions;
UtlString actual;
CPPUNIT_ASSERT( urlmap = new UrlMapping() );
UtlString digitsXml;
mFileTestContext->inputFilePath("digits.xml", digitsXml);
CPPUNIT_ASSERT( urlmap->loadMappings(digitsXml.data(),
MS, VM, LH
)
== OS_SUCCESS
);
// the interface says getContactList returns an OsStatus,
// but it is not set so don't test it
urlmap->getContactList( Url("sip:911@thisdomain")
,registrations, isPSTNnumber, permissions
);
CPPUNIT_ASSERT( permissions.getSize() == 0 );
CPPUNIT_ASSERT( registrations.getSize() == 1 );
getResult( registrations, 0, "contact"
, actual
);
ASSERT_STR_EQUAL("sip:911@GW-EMERGENCY-DIALING-ADDR"
, actual );
registrations.destroyAll();
urlmap->getContactList( Url("911@thisdomain")
,registrations, isPSTNnumber, permissions
);
CPPUNIT_ASSERT( permissions.getSize() == 0 );
CPPUNIT_ASSERT( registrations.getSize() == 1 );
getResult( registrations, 0, "contact"
, actual
);
ASSERT_STR_EQUAL("sip:911@GW-EMERGENCY-DIALING-ADDR"
, actual );
registrations.destroyAll();
urlmap->getContactList( Url("100@thisdomain")
,registrations, isPSTNnumber, permissions
);
CPPUNIT_ASSERT( permissions.getSize() == 0 );
CPPUNIT_ASSERT( registrations.getSize() == 1 );
getResult( registrations, 0, "contact"
, actual
);
ASSERT_STR_EQUAL("<sip:100@" MS ";play=" VM "autoattendant>"
, actual );
registrations.destroyAll();
urlmap->getContactList( Url("operator@thisdomain")
,registrations, isPSTNnumber, permissions
);
CPPUNIT_ASSERT( permissions.getSize() == 0 );
CPPUNIT_ASSERT( registrations.getSize() == 1 );
getResult( registrations, 0, "contact"
, actual
);
ASSERT_STR_EQUAL("<sip:operator@" MS ";play=" VM "autoattendant>"
, actual );
registrations.destroyAll();
urlmap->getContactList( Url("101@thisdomain")
,registrations, isPSTNnumber, permissions
);
CPPUNIT_ASSERT( permissions.getSize() == 0 );
CPPUNIT_ASSERT( registrations.getSize() == 1 );
getResult( registrations, 0, "contact"
, actual
);
ASSERT_STR_EQUAL("<sip:101@" MS ";play=" VM "mailbox%3D101>"
, actual );
registrations.destroyAll();
urlmap->getContactList( Url("2666@thisdomain")
,registrations, isPSTNnumber, permissions
);
CPPUNIT_ASSERT( permissions.getSize() == 0 );
CPPUNIT_ASSERT( registrations.getSize() == 1 );
getResult( registrations, 0, "contact"
, actual
);
ASSERT_STR_EQUAL("<sip:666@" MS ";play=" VM "mailbox%3D666>"
, actual );
registrations.destroyAll();
// Check for plus sign in the URL
// the plus should be escaped in the mailbox parameter
// and NOT in the user part
urlmap->getContactList( Url("+9663@thisdomain")
,registrations, isPSTNnumber, permissions
);
CPPUNIT_ASSERT( permissions.getSize() == 0 );
CPPUNIT_ASSERT( registrations.getSize() == 1 );
getResult( registrations, 0, "contact"
, actual
);
ASSERT_STR_EQUAL("<sip:+9663@" MS ";play=" VM "mailbox%3D%2B9663>;q=0.1"
, actual );
registrations.destroyAll();
urlmap->getContactList( Url("918001234567@thisdomain")
,registrations, isPSTNnumber, permissions
);
CPPUNIT_ASSERT( permissions.getSize() == 0 );
CPPUNIT_ASSERT( registrations.getSize() == 1 );
getResult( registrations, 0, "contact"
, actual
);
ASSERT_STR_EQUAL("sip:8001234567@GW-800-DIALING-ADDR"
, actual );
registrations.destroyAll();
urlmap->getContactList( Url("18001234567@thisdomain")
,registrations, isPSTNnumber, permissions
);
CPPUNIT_ASSERT( permissions.getSize() == 0 );
CPPUNIT_ASSERT( registrations.getSize() == 1 );
getResult( registrations, 0, "contact"
, actual
);
ASSERT_STR_EQUAL("sip:8001234567@GW-800-DIALING-ADDR"
, actual );
registrations.destroyAll();
urlmap->getContactList( Url("8001234567@thisdomain")
,registrations, isPSTNnumber, permissions
);
CPPUNIT_ASSERT( permissions.getSize() == 0 );
CPPUNIT_ASSERT( registrations.getSize() == 1 );
getResult( registrations, 0, "contact"
, actual
);
ASSERT_STR_EQUAL("sip:8001234567@GW-800-DIALING-ADDR"
, actual );
registrations.destroyAll();
urlmap->getContactList( Url("91800123456@thisdomain")
,registrations, isPSTNnumber, permissions
);
CPPUNIT_ASSERT( permissions.getSize() == 0 );
CPPUNIT_ASSERT( registrations.getSize() == 0 );
urlmap->getContactList( Url("691800123@thisdomain")
,registrations, isPSTNnumber, permissions
);
CPPUNIT_ASSERT( permissions.getSize() == 0 );
CPPUNIT_ASSERT( registrations.getSize() == 0 );
delete urlmap;
}
void testVDigits()
{
UrlMapping* urlmap;
ResultSet registrations;
UtlBoolean isPSTNnumber = false;
ResultSet permissions;
UtlString actual;
CPPUNIT_ASSERT( urlmap = new UrlMapping() );
UtlString vdigitsXml;
mFileTestContext->inputFilePath("vdigits.xml", vdigitsXml);
CPPUNIT_ASSERT( urlmap->loadMappings(vdigitsXml.data(),
MS, VM, LH
)
== OS_SUCCESS
);
urlmap->getContactList( Url("sip:15@thisdomain")
,registrations, isPSTNnumber, permissions
);
CPPUNIT_ASSERT( permissions.getSize() == 0 );
CPPUNIT_ASSERT( registrations.getSize() == 2 );
getResult( registrations, 0, "contact"
, actual
);
ASSERT_STR_EQUAL("sip:12315@pattern1"
, actual );
getResult( registrations, 1, "contact"
, actual
);
ASSERT_STR_EQUAL("sip:32115@pattern2"
, actual );
registrations.destroyAll();
urlmap->getContactList( Url("sip:156@thisdomain")
,registrations, isPSTNnumber, permissions
);
CPPUNIT_ASSERT( permissions.getSize() == 0 );
CPPUNIT_ASSERT( registrations.getSize() == 2 );
getResult( registrations, 0, "contact"
, actual
);
ASSERT_STR_EQUAL("sip:123156@pattern1"
, actual );
getResult( registrations, 1, "contact"
, actual
);
ASSERT_STR_EQUAL("sip:321156@pattern2"
, actual );
registrations.destroyAll();
urlmap->getContactList( Url("sip:156789@thisdomain")
,registrations, isPSTNnumber, permissions
);
CPPUNIT_ASSERT( permissions.getSize() == 0 );
CPPUNIT_ASSERT( registrations.getSize() == 2 );
getResult( registrations, 0, "contact"
, actual
);
ASSERT_STR_EQUAL("sip:123156789@pattern1"
, actual );
getResult( registrations, 1, "contact"
, actual
);
ASSERT_STR_EQUAL("sip:321156789@pattern2"
, actual );
registrations.destroyAll();
urlmap->getContactList( Url("sip:5789@thisdomain")
,registrations, isPSTNnumber, permissions
);
CPPUNIT_ASSERT( permissions.getSize() == 0 );
CPPUNIT_ASSERT( registrations.getSize() == 1 );
getResult( registrations, 0, "contact"
, actual
);
ASSERT_STR_EQUAL("sip:fourfive5789@pattern3"
, actual );
registrations.destroyAll();
urlmap->getContactList( Url("sip:4789@thisdomain")
,registrations, isPSTNnumber, permissions
);
CPPUNIT_ASSERT( permissions.getSize() == 0 );
CPPUNIT_ASSERT( registrations.getSize() == 1 );
getResult( registrations, 0, "contact"
, actual
);
ASSERT_STR_EQUAL("sip:fourfive4789@pattern3"
, actual );
registrations.destroyAll();
urlmap->getContactList( Url("sip:6789@thisdomain")
,registrations, isPSTNnumber, permissions
);
CPPUNIT_ASSERT( permissions.getSize() == 0 );
CPPUNIT_ASSERT( registrations.getSize() == 0 );
registrations.destroyAll();
urlmap->getContactList( Url("sip:489@thisdomain")
,registrations, isPSTNnumber, permissions
);
CPPUNIT_ASSERT( permissions.getSize() == 0 );
CPPUNIT_ASSERT( registrations.getSize() == 0 );
registrations.destroyAll();
urlmap->getContactList( Url("sip:89123@thisdomain")
,registrations, isPSTNnumber, permissions
);
CPPUNIT_ASSERT( permissions.getSize() == 0 );
CPPUNIT_ASSERT( registrations.getSize() == 2 );
getResult( registrations, 0, "contact"
, actual
);
ASSERT_STR_EQUAL("sip:eight9123@pattern4"
, actual );
getResult( registrations, 1, "contact"
, actual
);
ASSERT_STR_EQUAL("sip:digits89123@pattern5"
, actual );
registrations.destroyAll();
urlmap->getContactList( Url("sip:81456@thisdomain")
,registrations, isPSTNnumber, permissions
);
CPPUNIT_ASSERT( permissions.getSize() == 0 );
CPPUNIT_ASSERT( registrations.getSize() == 0 );
registrations.destroyAll();
urlmap->getContactList( Url("sip:8045@thisdomain")
,registrations, isPSTNnumber, permissions
);
CPPUNIT_ASSERT( permissions.getSize() == 0 );
CPPUNIT_ASSERT( registrations.getSize() == 0 );
registrations.destroyAll();
urlmap->getContactList( Url("sip:9999@thisdomain")
,registrations, isPSTNnumber, permissions
);
CPPUNIT_ASSERT( permissions.getSize() == 0 );
CPPUNIT_ASSERT( registrations.getSize() == 1 );
getResult( registrations, 0, "contact"
, actual
);
/* this is actually the wrong answer, because the rule is improper,
but this tests that there is no pointer fault, which there used to be */
ASSERT_STR_EQUAL("sip:thisdomain"
, actual );
registrations.destroyAll();
delete urlmap;
}
void testUserPat()
{
UrlMapping* urlmap;
ResultSet registrations;
UtlBoolean isPSTNnumber = false;
ResultSet permissions;
UtlString actual;
CPPUNIT_ASSERT( urlmap = new UrlMapping() );
UtlString userpatXml;
mFileTestContext->inputFilePath("userpat.xml", userpatXml);
CPPUNIT_ASSERT( urlmap->loadMappings(userpatXml.data(),
MS, VM, LH
)
== OS_SUCCESS
);
// this one illustrates a problem - vdigits matches everything after the first non-constant
urlmap->getContactList( Url("sip:THISUSER@thisdomain")
,registrations, isPSTNnumber, permissions
);
CPPUNIT_ASSERT( permissions.getSize() == 0 );
CPPUNIT_ASSERT( registrations.getSize() == 1 );
getResult( registrations, 0, "contact", actual);
ASSERT_STR_EQUAL( "sip:NEWTHISUSER@LEFTDOMAIN", actual );
registrations.destroyAll();
urlmap->getContactList( Url("sip:USERTHIS@thisdomain")
,registrations, isPSTNnumber, permissions
);
CPPUNIT_ASSERT( permissions.getSize() == 0 );
CPPUNIT_ASSERT( registrations.getSize() == 1 );
getResult( registrations, 0, "contact", actual);
ASSERT_STR_EQUAL( "sip:OLDTHIS@RIGHTDOMAIN", actual );
registrations.destroyAll();
// checks case sensitivity
urlmap->getContactList( Url("sip:upperTHIS@thisdomain")
,registrations, isPSTNnumber, permissions
);
CPPUNIT_ASSERT( permissions.getSize() == 0 );
CPPUNIT_ASSERT( registrations.getSize() == 0 );
registrations.destroyAll();
urlmap->getContactList( Url("sip:UPPERTHIS@thisdomain")
,registrations, isPSTNnumber, permissions
);
CPPUNIT_ASSERT( permissions.getSize() == 0 );
CPPUNIT_ASSERT( registrations.getSize() == 1 );
getResult( registrations, 0, "contact", actual);
ASSERT_STR_EQUAL( "sip:NEWTHIS@UPPERDOMAIN", actual );
registrations.destroyAll();
delete urlmap;
}
void testEscape()
{
UrlMapping* urlmap;
ResultSet registrations;
UtlBoolean isPSTNnumber = false;
ResultSet permissions;
UtlString actual;
CPPUNIT_ASSERT( urlmap = new UrlMapping() );
UtlString escapeXml;
mFileTestContext->inputFilePath("escape.xml", escapeXml);
CPPUNIT_ASSERT( urlmap->loadMappings(escapeXml.data(),
MS, VM, LH
)
== OS_SUCCESS
);
urlmap->getContactList( Url("sip:Fixed01@thisdomain")
,registrations, isPSTNnumber, permissions
);
CPPUNIT_ASSERT( permissions.getSize() == 0 );
CPPUNIT_ASSERT( registrations.getSize() == 2 );
getResult( registrations, 0, "contact", actual);
ASSERT_STR_EQUAL( "sip:Fixed01@digits", actual );
getResult( registrations, 1, "contact", actual);
ASSERT_STR_EQUAL( "sip:01@vdigits", actual );
registrations.destroyAll();
urlmap->getContactList( Url("sip:FiNed01@thisdomain")
,registrations, isPSTNnumber, permissions
);
CPPUNIT_ASSERT( permissions.getSize() == 0 );
CPPUNIT_ASSERT( registrations.getSize() == 0 );
registrations.destroyAll();
urlmap->getContactList( Url("sip:aa.999@thisdomain")
,registrations, isPSTNnumber, permissions
);
CPPUNIT_ASSERT( permissions.getSize() == 0 );
CPPUNIT_ASSERT( registrations.getSize() == 2 );
getResult( registrations, 0, "contact", actual);
ASSERT_STR_EQUAL( "sip:aa.999@digits", actual );
getResult( registrations, 1, "contact", actual);
ASSERT_STR_EQUAL( "sip:999@vdigits", actual );
registrations.destroyAll();
urlmap->getContactList( Url("sip:aa0888@thisdomain")
,registrations, isPSTNnumber, permissions
);
CPPUNIT_ASSERT( permissions.getSize() == 0 );
CPPUNIT_ASSERT( registrations.getSize() == 0 );
registrations.destroyAll();
urlmap->getContactList( Url("sip:*99123@thisdomain")
,registrations, isPSTNnumber, permissions
);
CPPUNIT_ASSERT( permissions.getSize() == 0 );
CPPUNIT_ASSERT( registrations.getSize() == 2 );
getResult( registrations, 0, "contact", actual);
ASSERT_STR_EQUAL( "sip:*99123@digits", actual );
getResult( registrations, 1, "contact", actual);
ASSERT_STR_EQUAL( "sip:123@vdigits", actual );
registrations.destroyAll();
delete urlmap;
}
void testSpecials()
{
/* tests characters that are special in Perl Regular Expressions
* but not in a dial string
*/
UrlMapping* urlmap;
ResultSet registrations;
UtlBoolean isPSTNnumber = false;
ResultSet permissions;
UtlString actual;
CPPUNIT_ASSERT( urlmap = new UrlMapping() );
UtlString specialsXml;
mFileTestContext->inputFilePath("specials.xml", specialsXml);
CPPUNIT_ASSERT( urlmap->loadMappings(specialsXml.data(),
MS, VM, LH
)
== OS_SUCCESS
);
// the interface says getContactList returns an OsStatus,
// but it is not set so don't test it
urlmap->getContactList( Url("sip:101@thisdomain")
,registrations, isPSTNnumber, permissions
);
CPPUNIT_ASSERT( permissions.getSize() == 0 );
CPPUNIT_ASSERT( registrations.getSize() == 0 );
registrations.destroyAll();
urlmap->getContactList( Url("sip:101+@thisdomain")
,registrations, isPSTNnumber, permissions
);
CPPUNIT_ASSERT( permissions.getSize() == 0 );
CPPUNIT_ASSERT( registrations.getSize() == 1 );
getResult( registrations, 0, "contact", actual);
ASSERT_STR_EQUAL("sip:OneZeroOnePlus@thisdomain",actual);
registrations.destroyAll();
urlmap->getContactList( Url("sip:1011@thisdomain")
,registrations, isPSTNnumber, permissions
);
CPPUNIT_ASSERT( permissions.getSize() == 0 );
CPPUNIT_ASSERT( registrations.getSize() == 0 );
registrations.destroyAll();
urlmap->getContactList( Url("sip:1012?@thisdomain")
,registrations, isPSTNnumber, permissions
);
CPPUNIT_ASSERT( permissions.getSize() == 0 );
CPPUNIT_ASSERT( registrations.getSize() == 1 );
getResult( registrations, 0, "contact", actual);
ASSERT_STR_EQUAL("sip:OneZeroOneTwoQmark@thisdomain",actual);
registrations.destroyAll();
urlmap->getContactList( Url("sip:(101)@thisdomain")
,registrations, isPSTNnumber, permissions
);
CPPUNIT_ASSERT( permissions.getSize() == 0 );
CPPUNIT_ASSERT( registrations.getSize() == 1 );
getResult( registrations, 0, "contact", actual);
ASSERT_STR_EQUAL("sip:ParenOneZeroOneParen@thisdomain",actual);
registrations.destroyAll();
urlmap->getContactList( Url("sip:1013*@thisdomain")
,registrations, isPSTNnumber, permissions
);
CPPUNIT_ASSERT( permissions.getSize() == 0 );
CPPUNIT_ASSERT( registrations.getSize() == 1 );
getResult( registrations, 0, "contact", actual);
ASSERT_STR_EQUAL("sip:OneZeroOneThreeStar@thisdomain",actual);
registrations.destroyAll();
urlmap->getContactList( Url("sip:101$@thisdomain")
,registrations, isPSTNnumber, permissions
);
CPPUNIT_ASSERT( permissions.getSize() == 0 );
CPPUNIT_ASSERT( registrations.getSize() == 1 );
getResult( registrations, 0, "contact", actual);
ASSERT_STR_EQUAL("sip:OneZeroOneDollar@thisdomain",actual);
registrations.destroyAll();
delete urlmap;
}
protected:
void getResult( ResultSet& resultSet
,int index
,const char* key
,UtlString& result
)
{
UtlHashMap hash;
resultSet.getIndex( index, hash );
UtlString theKey(key);
result = *((UtlString*)hash.findValue(&theKey));
}
bool loadUrlMap( UrlMapping& urlmap, const char* mapfile )
{
return ( urlmap.loadMappings(mapfile, MS, VM, LH )
== OS_SUCCESS
);
};
FileTestContext* mFileTestContext;
};
CPPUNIT_TEST_SUITE_REGISTRATION(UrlMappingTest);
syntax highlighted by Code2HTML, v. 0.9.1