// // Copyright (C) 2006 SIPfoundry Inc. // Licensed by SIPfoundry under the LGPL license. // // Copyright (C) 2006 Pingtel Corp. // Licensed to SIPfoundry under a Contributor Agreement. // // $$ ////////////////////////////////////////////////////////////////////////////// #include #include #include #include #include #include #include #include /** * Unit test for SipRouter::proxyMessage * * These tests use only loose routes because the adjustment of a strict-routed message into * a loose-routed message is tested in sipXtackLib/src/test/net/SipProxyMessageTest * Similarly, the detailed testing of matching for forwarding rules is done in the * ForwardRulesTest in this directory. */ class SipRouterTest : public CppUnit::TestCase { CPPUNIT_TEST_SUITE(SipRouterTest); CPPUNIT_TEST(testGenericProxy); CPPUNIT_TEST(testNoMaxForwards); CPPUNIT_TEST(testRecordRouteProxy); CPPUNIT_TEST(testRecordRouteOrder); CPPUNIT_TEST(testAuthProxy); CPPUNIT_TEST(testAuthProxyWithRoute); CPPUNIT_TEST(testAuthProxyWithRecordRoute); CPPUNIT_TEST(testAliasRoute); CPPUNIT_TEST(testAliasRouteWithAuth); CPPUNIT_TEST(testAliasRouteWithRecord); CPPUNIT_TEST(testNoAliasRouted); CPPUNIT_TEST(testNoAliasRoutedWithAuth); CPPUNIT_TEST(testNoAliasRoutedWithAuthRecorded); CPPUNIT_TEST_SUITE_END(); private: SipUserAgent* mUserAgent; ForwardRules mForwardingRules; static const char* VoiceMail; static const char* MediaServer; static const char* LocalHost; public: void setUp() { // Construct a SipUserAgent to provide the isMyHostAlias recognizer mUserAgent = new SipUserAgent(SIP_PORT, // udp port SIP_PORT, // tcp port -1, // tls port "127.0.0.2" // public address ); UtlString internalDomainAlias("example.com:5060"); mUserAgent->setHostAliases(internalDomainAlias); UtlString internalHostAlias("internal.example.com:5060"); mUserAgent->setHostAliases(internalHostAlias); UtlString externalAlias("external.example.net:5060"); mUserAgent->setHostAliases(externalAlias); UtlString rulesFile(TEST_DATA_DIR "rulesdata/routing.xml"); mForwardingRules.loadMappings( rulesFile, MediaServer, VoiceMail, LocalHost ); } void tearDown() { delete mUserAgent; } void testGenericProxy() { SipRouter sipRouter(*mUserAgent, mForwardingRules, false, // no auth proxy NULL, false // no record route ); const char* message = "INVITE sip:user@somewhere.com SIP/2.0\r\n" "Via: SIP/2.0/TCP 10.1.1.3:33855\r\n" "To: sip:user@somewhere.com\r\n" "From: Caller ; tag=30543f3483e1cb11ecb40866edd3295b\r\n" "Call-Id: f88dfabce84b6a2787ef024a7dbe8749\r\n" "Cseq: 1 INVITE\r\n" "Max-Forwards: 20\r\n" "Contact: caller@127.0.0.1\r\n" "Content-Length: 0\r\n" "\r\n"; SipMessage testMsg(message, strlen(message)); CPPUNIT_ASSERT(sipRouter.proxyMessage(testMsg)); UtlString proxiedMsg; int msgLen; testMsg.getBytes(&proxiedMsg, &msgLen); UtlString requestUri; testMsg.getRequestUri(&requestUri); ASSERT_STR_EQUAL("sip:user@somewhere.com", requestUri.data()); UtlString noRoute; CPPUNIT_ASSERT( !testMsg.getRouteUri(0, &noRoute) ); UtlString recordRoute; CPPUNIT_ASSERT( ! testMsg.getRecordRouteUri(0, &recordRoute) ); int maxForwards; CPPUNIT_ASSERT(testMsg.getMaxForwards(maxForwards) && maxForwards == 19); } void testNoMaxForwards() { SipRouter sipRouter(*mUserAgent, mForwardingRules, false, // no auth proxy NULL, false // no record route ); const char* message = "INVITE sip:user@somewhere.com SIP/2.0\r\n" "Via: SIP/2.0/TCP 10.1.1.3:33855\r\n" "To: sip:user@somewhere.com\r\n" "From: Caller ; tag=30543f3483e1cb11ecb40866edd3295b\r\n" "Call-Id: f88dfabce84b6a2787ef024a7dbe8749\r\n" "Cseq: 1 INVITE\r\n" "Contact: caller@127.0.0.1\r\n" "Content-Length: 0\r\n" "\r\n"; SipMessage testMsg(message, strlen(message)); CPPUNIT_ASSERT(sipRouter.proxyMessage(testMsg)); UtlString proxiedMsg; int msgLen; testMsg.getBytes(&proxiedMsg, &msgLen); UtlString requestUri; testMsg.getRequestUri(&requestUri); ASSERT_STR_EQUAL("sip:user@somewhere.com", requestUri.data()); UtlString noRoute; CPPUNIT_ASSERT( !testMsg.getRouteUri(0, &noRoute) ); UtlString recordRoute; CPPUNIT_ASSERT( ! testMsg.getRecordRouteUri(0, &recordRoute) ); int maxForwards; CPPUNIT_ASSERT( testMsg.getMaxForwards(maxForwards) && maxForwards == SIP_DEFAULT_MAX_FORWARDS); } void testRecordRouteProxy() { SipRouter sipRouter(*mUserAgent, mForwardingRules, false, // no auth proxy NULL, true // add record route ); const char* message = "INVITE sip:user@somewhere.com SIP/2.0\r\n" "Via: SIP/2.0/TCP 10.1.1.3:33855\r\n" "To: sip:user@somewhere.com\r\n" "From: Caller ; tag=30543f3483e1cb11ecb40866edd3295b\r\n" "Call-Id: f88dfabce84b6a2787ef024a7dbe8749\r\n" "Cseq: 1 INVITE\r\n" "Max-Forwards: 20\r\n" "Contact: caller@127.0.0.1\r\n" "Content-Length: 0\r\n" "\r\n"; SipMessage testMsg(message, strlen(message)); CPPUNIT_ASSERT(sipRouter.proxyMessage(testMsg)); UtlString proxiedMsg; int msgLen; testMsg.getBytes(&proxiedMsg, &msgLen); UtlString requestUri; testMsg.getRequestUri(&requestUri); ASSERT_STR_EQUAL("sip:user@somewhere.com", requestUri.data()); UtlString topRoute; CPPUNIT_ASSERT( ! testMsg.getRouteUri(0, &topRoute) ); UtlString recordRoute; CPPUNIT_ASSERT( testMsg.getRecordRouteUri(0, &recordRoute) ); ASSERT_STR_EQUAL("", recordRoute.data()); int maxForwards; CPPUNIT_ASSERT(testMsg.getMaxForwards(maxForwards) && maxForwards == 19); } void testRecordRouteOrder() { SipRouter sipRouter(*mUserAgent, mForwardingRules, false, // no auth proxy NULL, true // add record route ); const char* message = "INVITE sip:user@somewhere.com SIP/2.0\r\n" "Record-Route: \r\n" "Via: SIP/2.0/TCP 10.1.1.3:33855\r\n" "To: sip:user@somewhere.com\r\n" "From: Caller ; tag=30543f3483e1cb11ecb40866edd3295b\r\n" "Call-Id: f88dfabce84b6a2787ef024a7dbe8749\r\n" "Cseq: 1 INVITE\r\n" "Max-Forwards: 20\r\n" "Contact: caller@127.0.0.1\r\n" "Content-Length: 0\r\n" "\r\n"; SipMessage testMsg(message, strlen(message)); CPPUNIT_ASSERT(sipRouter.proxyMessage(testMsg)); UtlString proxiedMsg; int msgLen; testMsg.getBytes(&proxiedMsg, &msgLen); UtlString requestUri; testMsg.getRequestUri(&requestUri); ASSERT_STR_EQUAL("sip:user@somewhere.com", requestUri.data()); UtlString topRoute; CPPUNIT_ASSERT( ! testMsg.getRouteUri(0, &topRoute) ); // Record-Route: , UtlString myRecordRoute; CPPUNIT_ASSERT( testMsg.getRecordRouteUri(0, &myRecordRoute) ); ASSERT_STR_EQUAL("", myRecordRoute.data()); UtlString existingRecordRoute; CPPUNIT_ASSERT( testMsg.getRecordRouteUri(1, &existingRecordRoute) ); ASSERT_STR_EQUAL("", existingRecordRoute.data()); UtlString nomoreRecordRoute; CPPUNIT_ASSERT( ! testMsg.getRecordRouteUri(2, &nomoreRecordRoute) ); int maxForwards; CPPUNIT_ASSERT(testMsg.getMaxForwards(maxForwards) && maxForwards == 19); } void testAuthProxy() { SipRouter sipRouter(*mUserAgent, mForwardingRules, true, // use auth proxy "authproxy.example.com", false // no record route ); const char* message = "INVITE sip:user@somewhere.com SIP/2.0\r\n" "Via: SIP/2.0/TCP 10.1.1.3:33855\r\n" "To: sip:user@somewhere.com\r\n" "From: Caller ; tag=30543f3483e1cb11ecb40866edd3295b\r\n" "Call-Id: f88dfabce84b6a2787ef024a7dbe8749\r\n" "Cseq: 1 INVITE\r\n" "Max-Forwards: 20\r\n" "Contact: caller@127.0.0.1\r\n" "Content-Length: 0\r\n" "\r\n"; SipMessage testMsg(message, strlen(message)); CPPUNIT_ASSERT(sipRouter.proxyMessage(testMsg)); UtlString proxiedMsg; int msgLen; testMsg.getBytes(&proxiedMsg, &msgLen); UtlString requestUri; testMsg.getRequestUri(&requestUri); ASSERT_STR_EQUAL("sip:user@somewhere.com", requestUri.data()); UtlString topRoute; CPPUNIT_ASSERT( testMsg.getRouteUri(0, &topRoute) ); ASSERT_STR_EQUAL("", topRoute.data()); UtlString noRoute; CPPUNIT_ASSERT( !testMsg.getRouteUri(1, &noRoute) ); UtlString recordRoute; CPPUNIT_ASSERT( ! testMsg.getRecordRouteUri(0, &recordRoute) ); int maxForwards; CPPUNIT_ASSERT(testMsg.getMaxForwards(maxForwards) && maxForwards == 19); } void testAuthProxyWithRoute() { SipRouter sipRouter(*mUserAgent, mForwardingRules, true, // use auth proxy "authproxy.example.com", false // no record route ); const char* message = "INVITE sip:user@somewhere.com SIP/2.0\r\n" "Route: \r\n" "Via: SIP/2.0/TCP 10.1.1.3:33855\r\n" "To: sip:user@somewhere.com\r\n" "From: Caller ; tag=30543f3483e1cb11ecb40866edd3295b\r\n" "Call-Id: f88dfabce84b6a2787ef024a7dbe8749\r\n" "Cseq: 1 INVITE\r\n" "Max-Forwards: 20\r\n" "Contact: caller@127.0.0.1\r\n" "Content-Length: 0\r\n" "\r\n"; SipMessage testMsg(message, strlen(message)); CPPUNIT_ASSERT(sipRouter.proxyMessage(testMsg)); UtlString proxiedMsg; int msgLen; testMsg.getBytes(&proxiedMsg, &msgLen); UtlString requestUri; testMsg.getRequestUri(&requestUri); ASSERT_STR_EQUAL("sip:user@somewhere.com", requestUri.data()); UtlString topRoute; CPPUNIT_ASSERT( testMsg.getRouteUri(0, &topRoute) ); ASSERT_STR_EQUAL("", topRoute.data()); UtlString nextRoute; CPPUNIT_ASSERT( testMsg.getRouteUri(1, &nextRoute) ); ASSERT_STR_EQUAL("", nextRoute.data()); UtlString noRoute; CPPUNIT_ASSERT( !testMsg.getRouteUri(2, &noRoute) ); UtlString recordRoute; CPPUNIT_ASSERT( ! testMsg.getRecordRouteUri(0, &recordRoute) ); int maxForwards; CPPUNIT_ASSERT(testMsg.getMaxForwards(maxForwards) && maxForwards == 19); } void testAuthProxyWithRecordRoute() { SipRouter sipRouter(*mUserAgent, mForwardingRules, true, // use auth proxy "authproxy.example.com", true // add record route ); const char* message = "INVITE sip:user@somewhere.com SIP/2.0\r\n" "Via: SIP/2.0/TCP 10.1.1.3:33855\r\n" "To: sip:user@somewhere.com\r\n" "From: Caller ; tag=30543f3483e1cb11ecb40866edd3295b\r\n" "Call-Id: f88dfabce84b6a2787ef024a7dbe8749\r\n" "Cseq: 1 INVITE\r\n" "Max-Forwards: 20\r\n" "Contact: caller@127.0.0.1\r\n" "Content-Length: 0\r\n" "\r\n"; SipMessage testMsg(message, strlen(message)); CPPUNIT_ASSERT(sipRouter.proxyMessage(testMsg)); UtlString proxiedMsg; int msgLen; testMsg.getBytes(&proxiedMsg, &msgLen); UtlString requestUri; testMsg.getRequestUri(&requestUri); ASSERT_STR_EQUAL("sip:user@somewhere.com", requestUri.data()); UtlString topRoute; CPPUNIT_ASSERT( testMsg.getRouteUri(0, &topRoute) ); ASSERT_STR_EQUAL("", topRoute.data()); UtlString noRoute; CPPUNIT_ASSERT( !testMsg.getRouteUri(1, &noRoute) ); UtlString recordRoute; CPPUNIT_ASSERT( testMsg.getRecordRouteUri(0, &recordRoute) ); ASSERT_STR_EQUAL("", recordRoute.data()); UtlString noRecordRoute; CPPUNIT_ASSERT( !testMsg.getRouteUri(1, &noRecordRoute) ); int maxForwards; CPPUNIT_ASSERT(testMsg.getMaxForwards(maxForwards) && maxForwards == 19); } void testAliasRoute() { SipRouter sipRouter(*mUserAgent, mForwardingRules, false, // no auth proxy NULL, false // no record route ); const char* message = "INVITE sip:user@external.example.net SIP/2.0\r\n" "Via: SIP/2.0/TCP 10.1.1.3:33855\r\n" "To: sip:user@external.example.net\r\n" "From: Caller ; tag=30543f3483e1cb11ecb40866edd3295b\r\n" "Call-Id: f88dfabce84b6a2787ef024a7dbe8749\r\n" "Cseq: 1 INVITE\r\n" "Max-Forwards: 20\r\n" "Contact: caller@127.0.0.1\r\n" "Content-Length: 0\r\n" "\r\n"; SipMessage testMsg(message, strlen(message)); CPPUNIT_ASSERT(sipRouter.proxyMessage(testMsg)); // UtlString proxiedMsg; // int msgLen; // testMsg.getBytes(&proxiedMsg, &msgLen); // printf("In:\n%s\nOut:\n%s\n", message, proxiedMsg.data()); UtlString requestUri; testMsg.getRequestUri(&requestUri); ASSERT_STR_EQUAL("sip:user@external.example.net", requestUri.data()); UtlString topRoute; CPPUNIT_ASSERT( testMsg.getRouteUri(0, &topRoute) ); ASSERT_STR_EQUAL("", topRoute.data()); UtlString noRoute; CPPUNIT_ASSERT( !testMsg.getRouteUri(1, &noRoute) ); UtlString recordRoute; CPPUNIT_ASSERT( ! testMsg.getRecordRouteUri(0, &recordRoute) ); int maxForwards; CPPUNIT_ASSERT(testMsg.getMaxForwards(maxForwards) && maxForwards == 19); } void testAliasRouteWithAuth() { SipRouter sipRouter(*mUserAgent, mForwardingRules, true, // use auth proxy "authproxy.example.com", false // no record route ); const char* message = "INVITE sip:user@external.example.net SIP/2.0\r\n" "Via: SIP/2.0/TCP 10.1.1.3:33855\r\n" "To: sip:user@external.example.net\r\n" "From: Caller ; tag=30543f3483e1cb11ecb40866edd3295b\r\n" "Call-Id: f88dfabce84b6a2787ef024a7dbe8749\r\n" "Cseq: 1 INVITE\r\n" "Max-Forwards: 20\r\n" "Contact: caller@127.0.0.1\r\n" "Content-Length: 0\r\n" "\r\n"; SipMessage testMsg(message, strlen(message)); CPPUNIT_ASSERT(sipRouter.proxyMessage(testMsg)); // UtlString proxiedMsg; // int msgLen; // testMsg.getBytes(&proxiedMsg, &msgLen); // printf("In:\n%s\nOut:\n%s\n", message, proxiedMsg.data()); UtlString requestUri; testMsg.getRequestUri(&requestUri); ASSERT_STR_EQUAL("sip:user@external.example.net", requestUri.data()); // auth proxy is not added because this is mapped UtlString topRoute; CPPUNIT_ASSERT( testMsg.getRouteUri(0, &topRoute) ); ASSERT_STR_EQUAL("", topRoute.data()); UtlString noRoute; CPPUNIT_ASSERT( !testMsg.getRouteUri(1, &noRoute) ); UtlString recordRoute; CPPUNIT_ASSERT( ! testMsg.getRecordRouteUri(0, &recordRoute) ); int maxForwards; CPPUNIT_ASSERT(testMsg.getMaxForwards(maxForwards) && maxForwards == 19); } void testAliasRouteWithRecord() { SipRouter sipRouter(*mUserAgent, mForwardingRules, true, // use auth proxy "authproxy.example.com", true // add record route ); const char* message = "INVITE sip:user@external.example.net SIP/2.0\r\n" "Via: SIP/2.0/TCP 10.1.1.3:33855\r\n" "To: sip:user@external.example.net\r\n" "From: Caller ; tag=30543f3483e1cb11ecb40866edd3295b\r\n" "Call-Id: f88dfabce84b6a2787ef024a7dbe8749\r\n" "Cseq: 1 INVITE\r\n" "Max-Forwards: 20\r\n" "Contact: caller@127.0.0.1\r\n" "Content-Length: 0\r\n" "\r\n"; SipMessage testMsg(message, strlen(message)); CPPUNIT_ASSERT(sipRouter.proxyMessage(testMsg)); // UtlString proxiedMsg; // int msgLen; // testMsg.getBytes(&proxiedMsg, &msgLen); // printf("In:\n%s\nOut:\n%s\n", message, proxiedMsg.data()); UtlString requestUri; testMsg.getRequestUri(&requestUri); ASSERT_STR_EQUAL("sip:user@external.example.net", requestUri.data()); // auth proxy is not added because this is mapped UtlString topRoute; CPPUNIT_ASSERT( testMsg.getRouteUri(0, &topRoute) ); ASSERT_STR_EQUAL("", topRoute.data()); UtlString noRoute; CPPUNIT_ASSERT( !testMsg.getRouteUri(1, &noRoute) ); UtlString recordRoute; CPPUNIT_ASSERT( testMsg.getRecordRouteUri(0, &recordRoute) ); ASSERT_STR_EQUAL("", recordRoute.data()); UtlString noRecordRoute; CPPUNIT_ASSERT( ! testMsg.getRecordRouteUri(1, &recordRoute) ); int maxForwards; CPPUNIT_ASSERT(testMsg.getMaxForwards(maxForwards) && maxForwards == 19); } void testNoAliasRouted() { SipRouter sipRouter(*mUserAgent, mForwardingRules, false, // no auth proxy NULL, false // no record route ); const char* message = "INVITE sip:user@external.example.net SIP/2.0\r\n" "Route: \r\n" "Via: SIP/2.0/TCP 10.1.1.3:33855\r\n" "To: sip:user@external.example.net\r\n" "From: Caller ; tag=30543f3483e1cb11ecb40866edd3295b\r\n" "Call-Id: f88dfabce84b6a2787ef024a7dbe8749\r\n" "Cseq: 1 INVITE\r\n" "Max-Forwards: 20\r\n" "Contact: caller@127.0.0.1\r\n" "Content-Length: 0\r\n" "\r\n"; SipMessage testMsg(message, strlen(message)); CPPUNIT_ASSERT(sipRouter.proxyMessage(testMsg)); // UtlString proxiedMsg; // int msgLen; // testMsg.getBytes(&proxiedMsg, &msgLen); // printf("In:\n%s\nOut:\n%s\n", message, proxiedMsg.data()); UtlString requestUri; testMsg.getRequestUri(&requestUri); ASSERT_STR_EQUAL("sip:user@external.example.net", requestUri.data()); UtlString topRoute; CPPUNIT_ASSERT( testMsg.getRouteUri(0, &topRoute) ); ASSERT_STR_EQUAL("", topRoute.data()); UtlString noRoute; CPPUNIT_ASSERT( !testMsg.getRouteUri(1, &noRoute) ); UtlString recordRoute; CPPUNIT_ASSERT( ! testMsg.getRecordRouteUri(0, &recordRoute) ); int maxForwards; CPPUNIT_ASSERT(testMsg.getMaxForwards(maxForwards) && maxForwards == 19); } void testNoAliasRoutedWithAuth() { SipRouter sipRouter(*mUserAgent, mForwardingRules, true, // use auth proxy "authproxy.example.com", false // no record route ); const char* message = "INVITE sip:user@external.example.net SIP/2.0\r\n" "Route: \r\n" "Via: SIP/2.0/TCP 10.1.1.3:33855\r\n" "To: sip:user@external.example.net\r\n" "From: Caller ; tag=30543f3483e1cb11ecb40866edd3295b\r\n" "Call-Id: f88dfabce84b6a2787ef024a7dbe8749\r\n" "Cseq: 1 INVITE\r\n" "Max-Forwards: 20\r\n" "Contact: caller@127.0.0.1\r\n" "Content-Length: 0\r\n" "\r\n"; SipMessage testMsg(message, strlen(message)); CPPUNIT_ASSERT(sipRouter.proxyMessage(testMsg)); // UtlString proxiedMsg; // int msgLen; // testMsg.getBytes(&proxiedMsg, &msgLen); // printf("In:\n%s\nOut:\n%s\n", message, proxiedMsg.data()); UtlString requestUri; testMsg.getRequestUri(&requestUri); ASSERT_STR_EQUAL("sip:user@external.example.net", requestUri.data()); UtlString topRoute; CPPUNIT_ASSERT( testMsg.getRouteUri(0, &topRoute) ); ASSERT_STR_EQUAL("", topRoute.data()); UtlString nextRoute; CPPUNIT_ASSERT( testMsg.getRouteUri(1, &nextRoute) ); ASSERT_STR_EQUAL("", nextRoute.data()); UtlString noRoute; CPPUNIT_ASSERT( !testMsg.getRouteUri(2, &noRoute) ); UtlString recordRoute; CPPUNIT_ASSERT( ! testMsg.getRecordRouteUri(0, &recordRoute) ); int maxForwards; CPPUNIT_ASSERT(testMsg.getMaxForwards(maxForwards) && maxForwards == 19); } void testNoAliasRoutedWithAuthRecorded() { SipRouter sipRouter(*mUserAgent, mForwardingRules, true, // use auth proxy "authproxy.example.com", true // add record route ); const char* message = "INVITE sip:user@external.example.net SIP/2.0\r\n" "Route: \r\n" "Via: SIP/2.0/TCP 10.1.1.3:33855\r\n" "To: sip:user@external.example.net\r\n" "From: Caller ; tag=30543f3483e1cb11ecb40866edd3295b\r\n" "Call-Id: f88dfabce84b6a2787ef024a7dbe8749\r\n" "Cseq: 1 INVITE\r\n" "Max-Forwards: 20\r\n" "Contact: caller@127.0.0.1\r\n" "Content-Length: 0\r\n" "\r\n"; SipMessage testMsg(message, strlen(message)); CPPUNIT_ASSERT(sipRouter.proxyMessage(testMsg)); // UtlString proxiedMsg; // int msgLen; // testMsg.getBytes(&proxiedMsg, &msgLen); // printf("In:\n%s\nOut:\n%s\n", message, proxiedMsg.data()); UtlString requestUri; testMsg.getRequestUri(&requestUri); ASSERT_STR_EQUAL("sip:user@external.example.net", requestUri.data()); UtlString topRoute; CPPUNIT_ASSERT( testMsg.getRouteUri(0, &topRoute) ); ASSERT_STR_EQUAL("", topRoute.data()); UtlString nextRoute; CPPUNIT_ASSERT( testMsg.getRouteUri(1, &nextRoute) ); ASSERT_STR_EQUAL("", nextRoute.data()); UtlString noRoute; CPPUNIT_ASSERT( !testMsg.getRouteUri(2, &noRoute) ); UtlString recordRoute; CPPUNIT_ASSERT( testMsg.getRecordRouteUri(0, &recordRoute) ); ASSERT_STR_EQUAL("", recordRoute.data()); UtlString noRecordRoute; CPPUNIT_ASSERT( ! testMsg.getRecordRouteUri(1, &recordRoute) ); int maxForwards; CPPUNIT_ASSERT(testMsg.getMaxForwards(maxForwards) && maxForwards == 19); } }; const char* SipRouterTest::VoiceMail = "Voicemail"; const char* SipRouterTest::MediaServer = "Mediaserver"; const char* SipRouterTest::LocalHost = "localhost"; CPPUNIT_TEST_SUITE_REGISTRATION(SipRouterTest);