reSIProcate/stack  9694
Defines | Functions
SipTortureTests.cxx File Reference
#include <iostream>
#include <memory>
#include "TestSupport.hxx"
#include "resip/stack/Contents.hxx"
#include "resip/stack/SdpContents.hxx"
#include "resip/stack/SipMessage.hxx"
#include "resip/stack/ExtensionHeader.hxx"
#include "resip/stack/Uri.hxx"
#include "rutil/Logger.hxx"
#include "tassert.h"
Include dependency graph for SipTortureTests.cxx:

Go to the source code of this file.

Defines

#define RESIPROCATE_SUBSYSTEM   Subsystem::TEST
#define BUGTRAILINGSPACE   " "

Functions

void test1 ()
void test2 ()
void test3 ()
void test4 ()
void test5 ()
void test6 ()
void test7 ()
void test8 ()
void test9 ()
void test10 ()
void test11 ()
void test12 ()
void test13 ()
void test14 ()
void test15 ()
int main (int argc, const char *argv[])

Define Documentation

#define BUGTRAILINGSPACE   " "

Definition at line 18 of file SipTortureTests.cxx.

Referenced by test1().

#define RESIPROCATE_SUBSYSTEM   Subsystem::TEST

Definition at line 16 of file SipTortureTests.cxx.


Function Documentation

int main ( int  argc,
const char *  argv[] 
)

Definition at line 919 of file SipTortureTests.cxx.

References resip::Log::Cout, resip::Log::Crit, CritLog, resip::Log::Debug, resip::Log::Info, resip::Log::initialize(), resip::Log::Stack, test1(), test10(), test11(), test12(), test13(), test14(), test2(), test3(), test4(), test5(), test6(), test7(), test8(), and test9().

{
    Log::Level l = Log::Debug;
    
    if (argc > 1)
    {
        switch(*argv[1])
        {
            case 'd': l = Log::Debug;
                break;
            case 'i': l = Log::Info;
                break;
            case 's': l = Log::Stack;
                break;
            case 'c': l = Log::Crit;
                break;
        }
    }
    
    Log::initialize(Log::Cout, l, argv[0]);
    CritLog(<<"Test Driver Starting");
    tassert_init(14);
    test1();
    test2();
    test3();
    test4();
    test5();
    test6();
    test7();
    test8();
    test9();
    test10();//this should fail as written
    test11();
    test12();
    test13();
    test14();


    tassert_report();

 CritLog(<<"Test Driver Done");
}

Here is the call graph for this function:

void test1 ( )

ah! temporary until compact headers fixed.

Definition at line 21 of file SipTortureTests.cxx.

References BUGTRAILINGSPACE, CritLog, and resip::TestSupport::makeMessage().

Referenced by main().

{
  CritLog(<< "2.1 INVITE Parser Torture Test Message" );
      
      const char *txt = ("INVITE sip:called@called-company.com SIP/2.0\r\n"
                   "TO :\r\n"
                   " sip:called@called-company.com ;       tag      = 1918181833n\r\n"
                   "From     : \"Caller Name \\\\\\\"\" <sip:caller@caller-company.com>\r\n"
                   "  ;\r\n"
                   "  tag = 98asjd8\r\n"
                   "Max-Forwards: 8\r\n"
                   "Call-ID: 0ha0isndaksdj@10.0.0.1\r\n"
                   "Date: Mon, 02 Jun 1982 08:21:11 GMT\r\n"
                   "CSeq: 8\r\n"
                   "   INVITE\r\n"
                   "Via  : SIP  /   2.0\r\n" 
                   " /UDP\r\n" 
                   "    135.180.130.133;branch=z9hG4bKkdjuw\r\n" 
                   "Subject : \r\n"
                   "NewFangledHeader:   newfangled value\r\n" 
                   " more newfangled value \r\n" 
                   "Content-Type: application/sdp \r\n" 
                   "v:  SIP  / 2.0  / TCP     1192.168.156.222   ;\r\n" 
                   "  branch  =   9ikj8  , \r\n"
                   " SIP  /    2.0   / UDP  192.168.255.111   ; hidden\r\n" 
                   "m:\"Quoted string\\\"\\\"\"<sip:caller@caller-company.com>; newparam =\r\n" 
                   " newvalue ;\r\n" 
                   "  secondparam = secondvalue  ; q = 0.33,\r\n" 
                   " tel:4443322 \r\n"
                   "\r\n"
                   "v=0\r\n" 
                   "o=mhandley 29739 7272939 IN IP4 126.5.4.3 \r\n"
                   "s=-\r\n" 
                   "c=IN IP4 135.180.130.88 \r\n"
                   "t=0 0 \r\n"
                   "m=audio 492170 RTP/AVP 0 12 \r\n"
                   "m=video 3227 RTP/AVP 31 \r\n"
                   "a=rtpmap:31 LPC \r\n\r\n");



      SipMessage* msg = TestSupport::makeMessage(txt);
      

      tassert_reset();
      tassert(msg);

      auto_ptr<SipMessage> message(msg);

      tassert(message->isRequest());
      tassert(message->isResponse() == false);

      tassert(message->exists(h_To));
      tassert(message->header(h_To).uri().user() == "called");
      tassert(message->header(h_To).uri().host() == "called-company.com");
      tassert(message->header(h_To).param(p_tag) == "1918181833n");

      tassert(message->exists(h_From));
      tassert(message->header(h_From).uri().user() == "caller");
      tassert(message->header(h_From).uri().host() == "caller-company.com");

      tassert(message->header(h_From).param(p_tag) == "98asjd8");

      tassert(message->exists(h_MaxForwards));
      tassert(message->header(h_MaxForwards).value() == 8);
      tassert(message->header(h_MaxForwards).exists(p_tag) == false);

      // !ah! compact headers not working.
      // skip if ''not present'' -- actually check by unknown hdr... :-)
      if (message->exists(h_Contacts))
      {
        
        tassert(message->exists(h_Contacts) == true);
        tassert(message->header(h_Contacts).empty() == false);
        tassert(message->header(h_Contacts).front().uri().user() == "caller");
        tassert(message->header(h_Contacts).front().uri().host() == "caller-company.com");
        tassert(message->header(h_Contacts).front().uri().port() == 0);
        
      }
      else
      {
         CritLog(<<"TODO: Compact headers .. doing by unknown interface!!");
         tassert(message->exists(h_Contacts) == false);
         tassert(message->exists(ExtensionHeader("m")) == true);
         tassert(message->header(ExtensionHeader("m")).empty() == false);
         tassert(message->header(ExtensionHeader("m")).front().value() == 
                 "\"Quoted string\\\"\\\"\"<sip:caller@caller-company.com>;"
                 " newparam =   newvalue ;    secondparam = secondvalue  ; q"
                 " = 0.33,   tel:4443322 ");
      }

      tassert(message->exists(h_CallId));
      tassert(message->header(h_CallId).value() == "0ha0isndaksdj@10.0.0.1");

      tassert(message->exists(h_CSeq));
      tassert(message->header(h_CSeq).sequence() == 8);
      tassert(message->header(h_CSeq).method() == INVITE);

      tassert(message->exists(h_Vias));
      tassert(message->header(h_Vias).empty() == false);
      tassert(message->header(h_Vias).front().protocolName() == "SIP");
      tassert(message->header(h_Vias).front().protocolVersion() == "2.0");
      tassert(message->header(h_Vias).front().transport() == "UDP");
      tassert(message->header(h_Vias).front().sentHost() == "135.180.130.133");
      tassert(message->header(h_Vias).front().sentPort() == 0);
      tassert(message->header(h_Vias).front().exists(p_branch));
      tassert(message->header(h_Vias).front().param(p_branch).hasMagicCookie());
      tassert(message->header(h_Vias).front().param(p_branch).getTransactionId() == "kdjuw");
      tassert(message->exists(h_Subject));
      tassert(message->header(h_Subject).value().empty());

      tassert(message->exists(ExtensionHeader("NewFangledHeader")));
      tassert(message->header(ExtensionHeader("NewFangledHeader")).front().value() == "newfangled value   more newfangled value"BUGTRAILINGSPACE);
      //TODO: Need to check the ContentType header value
      tassert(message->exists(h_ContentType));
      CritLog(<<"TODO:Check content type"); // << *message);
      tassert_verify(1);
   }

Here is the call graph for this function:

void test10 ( )

Definition at line 641 of file SipTortureTests.cxx.

References CritLog, and resip::TestSupport::makeMessage().

Referenced by main().

{
   CritLog( << "2.10 Multiple SIP Request in a Single Message");
   
   const char* txt = ("REGISTER sip:company.com SIP/2.0\r\n"
                "To: sip:j.user@company.com\r\n"
                "From: sip:j.user@company.com;tag=43251j3j324\r\n"
                "Max-Forwards: 8\r\n"
                "Call-ID: 0ha0isndaksdj@10.0.2.2\r\n"
                "Contact: sip:j.user@host.company.com\r\n"
                "CSeq: 8 REGISTER\r\n"
                "Via: SIP/2.0/UDP 135.180.130.133;branch=z9hG4bKkdjuw\r\n"
                "Content-Length: 0\r\n\r\n"
                "INVITE sip:joe@company.com SIP/2.0\r\n"
                "To: sip:joe@company.com\r\n"
                "From: sip:caller@university.edu;tag=141334\r\n"
                "Max-Forwards: 8\r\n"
                "Call-ID: 0ha0isnda977644900765@10.0.0.1\r\n"
                "CSeq: 8 INVITE\r\n"
                "Via: SIP/2.0/UDP 135.180.130.133;branch=z9hG4bKkdjuw\r\n"
                "Content-Type: application/sdp\r\n"
                "\r\n"
                "v=0\r\n"
                "o=mhandley 29739 7272939 IN IP4 126.5.4.3\r\n"
                "s=-\r\n"
                "c=IN IP4 135.180.130.88\r\n"
                "t=0 0\r\n"
                "m=audio 492170 RTP/AVP 0 12\r\n"
                "m =video 3227 RTP/AVP 31\r\n"
                "a=rtpmap:31 LPC\r\n"
                "\r\n");
   tassert_reset();
   try
   {
      auto_ptr<SipMessage> message(TestSupport::makeMessage(txt));
      tassert(0);
   }
   catch (ParseException& e)
   {
   }
   
   tassert_verify(10);
}

Here is the call graph for this function:

void test11 ( )

Definition at line 685 of file SipTortureTests.cxx.

References CritLog, and resip::TestSupport::makeMessage().

Referenced by main().

{
   CritLog( << "2.11 INVITE missing Required Headers");

   const char* txt = ("INVITE sip:user@company.com SIP/2.0\r\n"
                "CSeq: 0 INVITE\r\n"
                "Via: SIP/2.0/UDP 135.180.130.133;branch=z9hG4bKkdjuw\r\n"
                "Content-Type: application/sdp\r\n"
                "\r\n"
                "v=0\r\n"
                "o=mhandley 29739 7272939 IN IP4 126.5.4.3\r\n"
                "s=-\r\n"
                "c=IN IP4 135.180.130.88\r\n"
                "t=0 0\r\n"
                "m=audio 492170 RTP/AVP 0 12\r\n"
                "m=video 3227 RTP/AVP 31\r\n"
                "a=rtpmap:31 LPC\r\n"
                "\r\n");
   auto_ptr<SipMessage> message(TestSupport::makeMessage(txt));
   tassert_reset();
   tassert(message->isRequest());
   tassert(!message->isResponse());

   tassert(!message->exists(h_CallId));
   tassert(!message->exists(h_From));
   tassert(!message->exists(h_To));
   tassert_verify(11);
}

Here is the call graph for this function:

void test12 ( )

Definition at line 714 of file SipTortureTests.cxx.

References CritLog, and resip::TestSupport::makeMessage().

Referenced by main().

{
   CritLog( << "2.12 INVITE with Duplicate Required Headers");
   //with duplicate headers that are not multi, the first header is kept
   
   const char* txt = ("INVITE sip:user@company.com SIP/2.0\r\n"
                "Via: SIP/2.0/UDP 135.180.130.133;branch=z9hG4bKkdjuw\r\n"
                "Max-Forwards: 70\r\n"
                "CSeq: 0 INVITE\r\n"
                "Call-ID: 98asdh@10.1.1.1\r\n"
                "Call-ID: 98asdh@10.1.1.2\r\n"
                "From: sip:caller@university.edu;tag=3413415\r\n"
                "From: sip:caller@organization.org\r\n"
                "To: sip:user@company.com\r\n"
                "Content-Type: application/sdp\r\n"
                "\r\n"
                "v=0\r\n"
                "o=mhandley 29739 7272939 IN IP4 126.5.4.3\r\n"
                "s=-\r\n"
                "c=IN IP4 135.180.130.88\r\n"
                "t=0 0\r\n"
                "m=audio 492170 RTP/AVP 0 12\r\n"
                "m=video 3227 RTP/AVP 31\r\n"
                "a=rtpmap:31 LPC\r\n"
                "\r\n");
   
   tassert_reset();
   try
   {
      auto_ptr<SipMessage> message(TestSupport::makeMessage(txt));
   }
   catch (ParseException& e)
   {
      tassert(0);
   }
   tassert_verify(12);
}

Here is the call graph for this function:

void test13 ( )

Definition at line 753 of file SipTortureTests.cxx.

References CritLog, and resip::TestSupport::makeMessage().

Referenced by main().

{
   CritLog( << "2.13 INVITE with lots of header types");
   //with duplicate headers that are not multi, the first header is kept
   
   const char* txt = ("INVITE sip:user@company.com SIP/2.0\r\n"
                "User-Agent: Lame Agent\r\n"
                "Via: SIP/2.0/UDP 135.180.130.133;branch=z9hG4bKkdjuw\r\n"
                "Max-Forwards: 70\r\n"
                "CSeq: 0 INVITE\r\n"
                "Call-ID: 98asdh@10.1.1.2\r\n"
                "From: sip:caller@university.edu;tag=3413415\r\n"
                "From: sip:caller@organization.org\r\n"
                "To: sip:user@company.com\r\n"
                "Content-Type: application/sdp\r\n"
                "\r\n"
                "v=0\r\n"
                "o=mhandley 29739 7272939 IN IP4 126.5.4.3\r\n"
                "s=-\r\n"
                "c=IN IP4 135.180.130.88\r\n"
                "t=0 0\r\n"
                "m=audio 492170 RTP/AVP 0 12\r\n"
                "m=video 3227 RTP/AVP 31\r\n"
                "a=rtpmap:31 LPC\r\n"
                "\r\n");
   
   tassert_reset();
   try
   {
      auto_ptr<SipMessage> message(TestSupport::makeMessage(txt));

       tassert(message->header(h_UserAgent).value() == "Lame Agent"); 
       message->header(h_UserAgent).value() = "Foo";
       tassert(message->header(h_UserAgent).value() == "Foo"); 
   }
   catch (ParseException& e)
   {
      tassert(0);
   }
   tassert_verify(13);
}

Here is the call graph for this function:

void test14 ( )

Definition at line 796 of file SipTortureTests.cxx.

References CritLog, DebugLog, and resip::TestSupport::makeMessage().

Referenced by main().

{
   CritLog( << "2.14 Response with lots of headers");
   
   const char* txt = ("SIP/2.0 200 OK\r\n"
                "To: <sip:fluffy@example.org>;tag=fb86ad2694115d75c77dce61523c9f07.ca6e\r\n"
                "From: <sip:fluffy@example.org>;tag=a1fd\r\n"
                "Via: SIP/2.0/UDP cj14:5002;branch=z9hG4bK-c87542-472987176-1;received=1.2.3.4\r\n"
                "Call-ID: 048cec32\r\n"
                "CSeq: 2 REGISTER\r\n"
                "Contact: <sip:fluffy@1.2.3.4:5002>;q=1.00;expires=1951\r\n"
                "Contact: <sip:fluffy@example.com:5002>;q=0.50;expires=10\r\n"
                "Contact: <sip:floppy@example.com:5002>;q=0.00;expires=100\r\n"
                "Server: The Server\r\n"
                "Content-Length: 0\r\n"
                "Warning: junk junk junk \r\n"
                "\r\n");
   
   tassert_reset();
   try
   {
      auto_ptr<SipMessage> msg(TestSupport::makeMessage(txt));
      
      tassert(  msg->header(h_Contacts).size() == 3 );
      
      resip::ParserContainer<resip::NameAddr>::iterator i =  msg->header(h_Contacts).begin();
      while ( i != msg->header(h_Contacts).end() )
      {
         DebugLog(<< "i=" << *i  );
         i++;
      }
   }
   catch (ParseException& e)
   {
   }
   tassert_verify(14);
}

Here is the call graph for this function:

void test15 ( )

Definition at line 835 of file SipTortureTests.cxx.

References CritLog, and resip::TestSupport::makeMessage().

{
   CritLog( << "2.15 Interesting bodies");
   
   const char* txt = (
    "NOTIFY sip:fluffy@212.157.205.40 SIP/2.0\r\n"
    "Via: SIP/2.0/TCP 212.157.205.198:5060;branch=z9hG4bK2367411811584019109\r\n"
    "To: sip:fluffy@212.157.205.40\r\n"
    "From: sip:ntt2@h1.ntt2.sipit.net;tag=727823805122397238\r\n"
    "Max-Forwards: 70\r\n"
    "CSeq: 1 NOTIFY\r\n"
    "Call-ID: 28067261571992032320\r\n"
    "Contact: sip:ntt2@212.157.205.198:5060\r\n"
    "Content-Length: 1929\r\n"
    "Content-Type: multipart/signed;\r\n"
    " protocol=\"application/pkcs7-signature\";\r\n"
    " micalg=sha1; boundary=\"----YvhIjyjTU8lfNqGe8Fyvxcmb4mleF6quxsMFpT2hOhrDfS3LLs1MyYBdLNgBLsSC\"\r\n"
    "\r\n"
    "------YvhIjyjTU8lfNqGe8Fyvxcmb4mleF6quxsMFpT2hOhrDfS3LLs1MyYBdLNgBLsSC\r\n"
    "Content-Type: multipart/mixed;boundary=\"----lRIGMC8E2Px6I2IODfk2rISgfWIirrOJwS3tY52HuxDP3pdTiFjsghJJWhvyRCEY\"\r\n"
    "Content-Length: 870\r\n"
    "Content-Disposition: attachment;handling=required\r\n"
    "\r\n"
    "------lRIGMC8E2Px6I2IODfk2rISgfWIirrOJwS3tY52HuxDP3pdTiFjsghJJWhvyRCEY\r\n"
    "Content-Type: application/sipfrag\r\n"
    "Content-Length: 320\r\n"
    "\r\n"
    "To: sip:fluffy@212.157.205.40\r\n"
    "From: sip:ntt2@h1.ntt2.sipit.net;tag=727823805122397238\r\n"
    "CSeq: 1 NOTIFY\r\n"
    "Call-ID: 28067261571992032320\r\n"
    "Contact: sip:ntt2@212.157.205.198:5060\r\n"
    "Event: presence\r\n"
    "Content-Length: 210\r\n"
    "Content-Type: application/xpidf+xml\r\n"
    "Subscription-State: active\r\n"
    "User-Agent: NTT SecureSession User-Agent\r\n"
    "\r\n"
    "------lRIGMC8E2Px6I2IODfk2rISgfWIirrOJwS3tY52HuxDP3pdTiFjsghJJWhvyRCEY\r\n"
    "Content-Type: application/xpidf+xml\r\n"
    "Content-Length: 210\r\n"
    "\r\n"
    "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\r\n"
    "<presence xmlns:impp=\"urn:ietf:params:xml:ns:pidf\" entity=\"pres:someone@example.com\">\r\n"
    "<tuple id=\"765\">\r\n"
    "<status>\r\n"
    "<basic>open</basic>\r\n"
    "</status>\r\n"
    "</tuple>\r\n"
    "</presence>\r\n"
    "\r\n"
    "------lRIGMC8E2Px6I2IODfk2rISgfWIirrOJwS3tY52HuxDP3pdTiFjsghJJWhvyRCEY--\r\n"
    "\r\n"
    "------YvhIjyjTU8lfNqGe8Fyvxcmb4mleF6quxsMFpT2hOhrDfS3LLs1MyYBdLNgBLsSC\r\n"
    "Content-Type: application/pkcs7-signature; name=\"smime.p7s\"\r\n"
    "Content-Transfer-Encoding: base64\r\n"
    "Content-Disposition: attachment; filename=\"smime.p7s\"; handling=required\r\n"
    "\r\n"
    "MIIBVgYJKoZIhvcNAQcCoIIBRzCCAUMCAQExCzAJBgUrDgMCGgUAMAsGCSqGSIb3\r\n"
    "DQEHATGCASIwggEeAgEBMHwwcDELMAkGA1UEBhMCVVMxEzARBgNVBAgTCkNhbGlm\r\n"
    "b3JuaWExETAPBgNVBAcTCFNhbiBKb3NlMQ4wDAYDVQQKEwVzaXBpdDEpMCcGA1UE\r\n"
    "CxMgU2lwaXQgVGVzdCBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkCCAIWABUCBgIVMAkG\r\n"
    "BSsOAwIaBQAwDQYJKoZIhvcNAQEBBQAEgYAer8TPSMtA3ZqweGnXLUYKR51bp52N\r\n"
    "oGBEqHZz7xR0Nhs6DsAOXiSFv19vTR//33u6Se3zpNNHP/zj7NRr+olimI2PeBNB\r\n"
    "tczNdqexoN0pjRW7l7mHZ0e39pqZmI5bhFl+z9CJJu5xW0aSarw84CZxbh5RQaYr\r\n"
    "zhSvTYdki20aiQ==\r\n"
    "\r\n"
    "------YvhIjyjTU8lfNqGe8Fyvxcmb4mleF6quxsMFpT2hOhrDfS3LLs1MyYBdLNgBLsSC--\r\n"
      );
   
   tassert_reset();
   try
   {
      auto_ptr<SipMessage> msg(TestSupport::makeMessage(txt));
      
   }
   catch (ParseException& e)
   {
   }
   tassert_verify(15);
}

Here is the call graph for this function:

void test2 ( )

Definition at line 142 of file SipTortureTests.cxx.

References CritLog, and resip::TestSupport::makeMessage().

Referenced by main().

   {
      CritLog( << "2.2 INVITE with Proxy-Require and Require");
       
      const char *txt = ("INVITE sip:called@called-company.com SIP/2.0\r\n"
                   "To: sip:called@called-company.com\r\n"
                   "From: sip:caller@caller-company.com;tag=242etr\r\n"
                   "Max-Forwards: 6\r\n"
                   "Call-ID: 0ha0isndaksdj@10.0.0.1\r\n"
                   "Require: newfeature1, newfeature2\r\n"
                   "Proxy-Require: newfeature3, newfeature4\r\n" 
                   "CSeq: 8 INVITE\r\n"
                   "Via: SIP/2.0/UDP 135.180.130.133;branch=z9hG4bKkdjuw\r\n\r\n");

      auto_ptr<SipMessage> message(TestSupport::makeMessage(txt));

      tassert_reset();
      
      tassert(message->isRequest());
      tassert(message->isResponse() == false);

      tassert(message->exists(h_To));
      tassert(message->header(h_To).uri().user() == "called");
      tassert(message->header(h_To).uri().host() == "called-company.com");
      tassert(!message->header(h_To).exists(p_tag));

      tassert(message->exists(h_From));
      tassert(message->header(h_From).uri().user() == "caller");
      tassert(message->header(h_From).uri().host() == "caller-company.com");
      tassert(message->header(h_From).exists(p_tag));
      tassert(message->header(h_From).param(p_tag) == "242etr");

      tassert(message->exists(h_MaxForwards));
      tassert(message->header(h_MaxForwards).value() == 6);
      tassert(message->header(h_MaxForwards).exists(p_tag) == false);

      tassert(message->exists(h_Contacts) == false);

      tassert(message->exists(h_CallId));
      tassert(message->header(h_CallId).value() == "0ha0isndaksdj@10.0.0.1");

      //TODO: Check Values
      CritLog(<<"TODO: Check values h_Requires");
      tassert(message->exists(h_Requires));

      //TODO: Check values
      CritLog(<<"TODO: Check values h_ProxyRequires");
      tassert(message->exists(h_ProxyRequires));

      tassert(message->exists(h_CSeq));
      tassert(message->header(h_CSeq).sequence() == 8);
      tassert(message->header(h_CSeq).method() == INVITE);

      tassert(message->exists(h_Vias));
      tassert(message->header(h_Vias).empty() == false);
      tassert(message->header(h_Vias).front().protocolName() == "SIP");
      tassert(message->header(h_Vias).front().protocolVersion() == "2.0");
      tassert(message->header(h_Vias).front().transport() == "UDP");
      tassert(message->header(h_Vias).front().sentHost() == "135.180.130.133");
      tassert(message->header(h_Vias).front().sentPort() == 0);
      tassert(message->header(h_Vias).front().exists(p_branch));

      // !ah! -- transaction id DOES NOT include the magic cookie
      // (removed z9hG4bK)

      tassert(message->header(h_Vias).front().param(p_branch).getTransactionId() == "kdjuw");
      tassert_verify(2);

   }

Here is the call graph for this function:

void test3 ( )

Definition at line 213 of file SipTortureTests.cxx.

References CritLog, and resip::TestSupport::makeMessage().

Referenced by main().

{
       CritLog( << "2.3 INVITE with Unknown Schemes in URIs");
       
      
      const char *txt = ("INVITE name:John_Smith SIP/2.0\r\n"
                   "To: isbn:2983792873\r\n"
                   "From: <sip:www.cs.columbia.edu>;tag=3234233\r\n" // was http//
                   "Call-ID: 0ha0isndaksdj@10.0.0.1\r\n"
                   "CSeq: 8 INVITE\r\n"
                   "Max-Forwards: 7\r\n"
                   "Via: SIP/2.0/UDP 135.180.130.133;branch=z9hG4bKkdjuw\r\n"
                   "Content-Type: application/sdp\r\n" 
                   "\r\n"
                   "v=0\r\n" 
                   "o=mhandley 29739 7272939 IN IP4 126.5.4.3 \r\n"
                   "s=- \r\n"
                   "c=IN IP4 135.180.130.88 \r\n"
                   "t=0 0\r\n"
                   "m=audio 492170 RTP/AVP 0 12 \r\n"
                   "m=video 3227 RTP/AVP 31 \r\n"
                   "a=rtpmap:31 LPC \r\n\r\n");

      auto_ptr<SipMessage> message(TestSupport::makeMessage(txt));

      
      tassert(message->isRequest());
      tassert(message->isResponse() == false);


      // !ah! this will assert(0) in Uri.cxx -- so let's skip this for now
      CritLog(<<"TODO: fix generic Uri handling.");
      tassert_push();
      tassert(message->header(h_RequestLine).getSipVersion() == "SIP/2.0");
      tassert_pop();

      
      tassert(message->exists(h_To));
      tassert(!message->header(h_To).exists(p_tag));

      tassert(message->exists(h_From));

      tassert(message->header(h_From).param(p_tag) == "3234233");


      tassert(message->exists(h_CallId));
      tassert(message->header(h_CallId).value() == "0ha0isndaksdj@10.0.0.1");

      tassert(message->exists(h_CSeq));
      tassert(message->header(h_CSeq).sequence() == 8);
      tassert(message->header(h_CSeq).method() == INVITE);

      tassert(message->exists(h_MaxForwards));
      tassert(message->header(h_MaxForwards).value() == 7);
      tassert(message->header(h_MaxForwards).exists(p_tag) == false);

      tassert(message->exists(h_Contacts) == false);

      tassert(message->exists(h_Vias));
      tassert(message->header(h_Vias).empty() == false);
      tassert(message->header(h_Vias).front().protocolName() == "SIP");
      tassert(message->header(h_Vias).front().protocolVersion() == "2.0");
      tassert(message->header(h_Vias).front().transport() == "UDP");
      tassert(message->header(h_Vias).front().sentHost() == "135.180.130.133");
      tassert(message->header(h_Vias).front().sentPort() == 0);
      tassert(message->header(h_Vias).front().exists(p_branch));
      tassert(message->header(h_Vias).front().param(p_branch).getTransactionId() == "kdjuw");

      //TODO: Check value 
      CritLog(<<"TODO: Check value of ContentType");
      tassert(message->exists(h_ContentType));
      tassert_verify(3);
      
   }

Here is the call graph for this function:

void test4 ( )

Definition at line 289 of file SipTortureTests.cxx.

References CritLog, and resip::TestSupport::makeMessage().

Referenced by main().

{
      CritLog( << "2.4 REGISTER with Y2038 Test (This tests for Absolute Time in Expires)");
       
      const char *txt = ("REGISTER sip:company.com SIP/2.0\r\n"
                   "To: sip:user@company.com\r\n"
                   "From: sip:user@company.com;tag=3411345\r\n"
                   "Max-Forwards: 8\r\n"
                   "Contact: sip:user@host.company.com\r\n"
                   "Call-ID: 0ha0isndaksdj@10.0.0.1\r\n"
                   "CSeq: 8 REGISTER\r\n"
                   "Via: SIP/2.0/UDP 135.180.130.133;branch=z9hG4bKkdjuw\r\n"
                   "Expires: Sat, 01 Dec 2040 16:00:00 GMT\r\n\r\n");

      auto_ptr<SipMessage> message(TestSupport::makeMessage(txt));

      tassert_reset();
      
      tassert(message->isRequest());
      tassert(message->isResponse() == false);

      tassert(message->header(h_RequestLine).getSipVersion() == "SIP/2.0");

      tassert(message->exists(h_To));
      tassert(message->header(h_To).uri().user() == "user");
      tassert(message->header(h_To).uri().host() == "company.com");
      tassert(!message->header(h_To).exists(p_tag));

      tassert(message->exists(h_From));
      tassert(message->header(h_From).uri().user() == "user");
      tassert(message->header(h_From).uri().host() == "company.com");
      tassert(message->header(h_From).exists(p_tag));
      tassert(message->header(h_From).param(p_tag) == "3411345");

      tassert(message->exists(h_MaxForwards));
      tassert(message->header(h_MaxForwards).value() == 8);
      tassert(message->header(h_MaxForwards).exists(p_tag) == false);

      tassert(message->exists(h_Contacts));
      tassert(message->header(h_Contacts).empty() == false);
      tassert(message->header(h_Contacts).front().uri().user() == "user");
      tassert(message->header(h_Contacts).front().uri().host() == "host.company.com");
      tassert(message->header(h_Contacts).front().uri().port() == 0);

      tassert(message->exists(h_CallId));
      tassert(message->header(h_CallId).value() == "0ha0isndaksdj@10.0.0.1");

      tassert(message->exists(h_CSeq));
      tassert(message->header(h_CSeq).sequence() == 8);
      tassert(message->header(h_CSeq).method() == REGISTER);

      tassert(message->exists(h_Vias));
      tassert(message->header(h_Vias).empty() == false);
      tassert(message->header(h_Vias).front().protocolName() == "SIP");
      tassert(message->header(h_Vias).front().protocolVersion() == "2.0");
      tassert(message->header(h_Vias).front().transport() == "UDP");
      tassert(message->header(h_Vias).front().sentHost() == "135.180.130.133");
      tassert(message->header(h_Vias).front().sentPort() == 0);
      tassert(message->header(h_Vias).front().exists(p_branch));
      tassert(message->header(h_Vias).front().param(p_branch).getTransactionId() == "kdjuw");

      tassert(message->exists(h_Expires));
      /* 
       * Quoted from RFC 3261 
       * The "expires" parameter of a Contact header field value indicates how
       * long the URI is valid.  The value of the parameter is a number
       * indicating seconds.  If this parameter is not provided, the value of
       * the Expires header field determines how long the URI is valid.
       * Malformed values SHOULD be treated as equivalent to 3600.
       * This provides a modest level of backwards compatibility with RFC
       * 2543, which allowed absolute times in this header field.  If an
       * absolute time is received, it will be treated as malformed, and
       * then default to 3600.
       */

      tassert(message->header(h_Expires).value() == 3600);
      // Asking for something when it doesnt exist
      tassert(message->exists(h_ContentLength) == false);
      
      message->header(h_ContentLength).value();

      tassert_verify(4);
   }

Here is the call graph for this function:

void test5 ( )

Definition at line 374 of file SipTortureTests.cxx.

References CritLog, and resip::TestSupport::makeMessage().

Referenced by main().

   {
      CritLog( << "2.5    INVITE with inconsistent Accept and message body");
      
      const char *txt = ("INVITE sip:user@company.com SIP/2.0 \r\n"
                   "To: sip:j_user@company.com \r\n"
                   "From: sip:caller@university.edu;tag=234 \r\n"
                   "Max-Forwards: 5 \r\n"
                   "Call-ID: 0ha0isndaksdj@10.0.0.1 \r\n"
                   "Accept: text/newformat \r\n"
                   "CSeq: 8 INVITE \r\n"
                   "Via: SIP/2.0/UDP 135.180.130.133;branch=z9hG4bKkdjuw \r\n"
                   "Content-Type: application/sdp \r\n"
                   "\r\n"
                   "v=0 \r\n"
                   "c=IN IP4 135.180.130.88 \r\n"
                   "m=audio 492170 RTP/AVP 0 12 \r\n"
                   "m=video 3227 RTP/AVP 31 \r\n"
                   "a=rtpmap:31 LPC "
                   "\r\n");

      auto_ptr<SipMessage> message(TestSupport::makeMessage(txt));

      tassert_reset();

      tassert(message->isRequest());
      tassert(!message->isResponse());

      tassert(message->header(h_RequestLine).getMethod() == INVITE);
      tassert(message->header(h_RequestLine).getSipVersion() == "SIP/2.0");

      tassert(message->header(h_RequestLine).uri().host() == "company.com");
      tassert(message->header(h_RequestLine).uri().user() == "user");
      tassert(message->header(h_RequestLine).uri().scheme() == "sip");
      tassert(message->header(h_RequestLine).uri().port() == 0);
      tassert(message->header(h_RequestLine).uri().password() == "");

      tassert(message->header(h_To).uri().host() == "company.com");
      tassert(message->header(h_To).uri().user() == "j_user");
      tassert(message->header(h_To).uri().scheme() == "sip");
      tassert(message->header(h_To).uri().port() == 0);
      tassert(message->header(h_To).uri().password() == "");

      tassert(message->header(h_From).uri().host() == "university.edu");
      tassert(message->header(h_From).uri().user() == "caller");
      tassert(message->header(h_From).uri().scheme() == "sip");
      tassert(message->header(h_From).uri().port() == 0);
      tassert(message->header(h_From).uri().password() == "");
      // The tag is a tag on From: not the uri...
      tassert(message->header(h_From).param(p_tag) == "234");

      tassert(message->header(h_MaxForwards).value() == 5);

      tassert(message->header(h_CallId).value() == "0ha0isndaksdj@10.0.0.1");

      tassert(message->header(h_Accepts).size() == 1);
      tassert(message->header(h_Accepts).front().type() == "text");
      tassert(message->header(h_Accepts).front().subType() == "newformat");

      tassert(message->header(h_CSeq).sequence() == 8);
      tassert(message->header(h_CSeq).method() == INVITE);

      tassert(message->header(h_Vias).size() == 1);
      tassert(message->header(h_Vias).front().protocolName() == "SIP");
      tassert(message->header(h_Vias).front().protocolVersion() == "2.0");
      tassert(message->header(h_Vias).front().transport() == "UDP");
      tassert(message->header(h_Vias).front().sentHost() == "135.180.130.133");
      tassert(message->header(h_Vias).front().sentPort() == 0);
      tassert(message->header(h_Vias).front().param(p_branch).hasMagicCookie());
      // !ah! this should go away when parser fixed.
      tassert(message->header(h_Vias).front().param(p_branch).getTransactionId() == "kdjuw");

      tassert(message->header(h_ContentType).type() == "application");
      tassert(message->header(h_ContentType).subType() == "sdp");

      tassert_verify(5);
      // .dlb. someday the body will gack on parse
   }

Here is the call graph for this function:

void test6 ( )

Definition at line 453 of file SipTortureTests.cxx.

References CritLog, and resip::TestSupport::makeMessage().

Referenced by main().

{
      CritLog( << "2.6    INVITE with non-SDP message body ");
      
      const char *txt = ("INVITE sip:user@company.com SIP/2.0\r\n"
                   "To: sip:j.user@company.com\r\n"
                   "From: sip:caller@university.edu;tag=8\r\n"
                   "Max-Forwards: 70 \r\n"
                   "Call-ID: 0ha0isndaksdj@10.0.0.1 \r\n"
                   "CSeq: 8 INVITE \r\n"
                   "Via: SIP/2.0/UDP 135.180.130.133;branch=z9hG4bKkdjuw \r\n"
                   "Content-Type: application/newformat \r\n"
                   "\r\n"
                   "<audio> <pcmu port=\"443\"/> </audio> \r\n"
                   "\r\n");

      auto_ptr<SipMessage> message(TestSupport::makeMessage(txt));

      tassert_reset();

      tassert(message->isRequest());
      tassert(!message->isResponse());

      tassert(message->header(h_RequestLine).getMethod() == INVITE);
      tassert(message->header(h_RequestLine).getSipVersion() == "SIP/2.0");

      tassert(message->header(h_RequestLine).uri().host() == "company.com");
      tassert(message->header(h_RequestLine).uri().user() == "user");
      tassert(message->header(h_RequestLine).uri().scheme() == "sip");
      tassert(message->header(h_RequestLine).uri().port() == 0);
      tassert(message->header(h_RequestLine).uri().password() == "");

      tassert(message->header(h_To).uri().host() == "company.com");
      tassert(message->header(h_To).uri().user() == "j.user");
      tassert(message->header(h_To).uri().scheme() == "sip");
      tassert(message->header(h_To).uri().port() == 0);

      tassert(message->header(h_From).uri().host() == "university.edu");
      tassert(message->header(h_From).uri().user() == "caller");
      tassert(message->header(h_From).uri().scheme() == "sip");
      tassert(message->header(h_From).uri().port() == 0);

      tassert(message->header(h_ContentType).type() == "application");
      tassert(message->header(h_ContentType).subType() == "newformat");

      // !jf! should send this to a UAS and it should be rejected (don't
      // understand why) - says because it is not SDP

      tassert_verify(6);
}

Here is the call graph for this function:

void test7 ( )

Definition at line 505 of file SipTortureTests.cxx.

References CritLog, DebugLog, resip::Contents::getContents(), resip::ContentsFactoryBase::getFactoryMap(), resip::Contents::getType(), resip::TestSupport::makeMessage(), and resip::SdpContents::session().

Referenced by main().

{
      CritLog( << "2.7    Unknown Method Message");
      
      const char *txt = ("NEWMETHOD sip:user@company.com SIP/2.0 \r\n"
                   "To: sip:j.user@company.com \r\n"
                   "From: sip:caller@university.edu;tag=34525 \r\n"
                   "Max-Forwards: 6 \r\n"
                   "Call-ID: 0ha0isndaksdj@10.0.0.1 \r\n"
                   "CSeq: 8 NEWMETHOD \r\n"
                   "Via: SIP/2.0/UDP 135.180.130.133;branch=z9hG4bKkdjuw \r\n"
                   "Content-Type: application/sdp \r\n"
                   "\r\n"
                   "v=0\r\n"
                   "o=mhandley 29739 7272939 IN IP4 126.5.4.3 \r\n"
                   "s=-\r\n"
                   "c=IN IP4 135.180.130.88\r\n"
                   "m=audio 492170 RTP/AVP 0 12\r\n"
                   "m=video 3227 RTP/AVP 31\r\n"
                   "a=rtpmap:31 LPC \r\n"
                   "\r\n");

      auto_ptr<SipMessage> message(TestSupport::makeMessage(txt));

      tassert_reset();

      tassert(message->isRequest());
      tassert(!message->isResponse());

      tassert(message->header(h_RequestLine).getMethod() == UNKNOWN);
      tassert(message->header(h_RequestLine).unknownMethodName() == "NEWMETHOD");
      tassert(message->header(h_RequestLine).getSipVersion() == "SIP/2.0");

      tassert(message->header(h_RequestLine).uri().host() == "company.com");
      tassert(message->header(h_RequestLine).uri().user() == "user");
      tassert(message->header(h_RequestLine).uri().scheme() == "sip");
      tassert(message->header(h_RequestLine).uri().port() == 0);
      tassert(message->header(h_RequestLine).uri().password() == "");

      tassert(message->header(h_To).uri().host() == "company.com");
      tassert(message->header(h_To).uri().user() == "j.user");
      tassert(message->header(h_To).uri().scheme() == "sip");
      tassert(message->header(h_To).uri().port() == 0);

      tassert(message->header(h_From).uri().host() == "university.edu");
      tassert(message->header(h_From).uri().user() == "caller");
      tassert(message->header(h_From).uri().scheme() == "sip");
      tassert(message->header(h_From).uri().port() == 0);

      tassert(message->header(h_ContentType).type() == "application");
      tassert(message->header(h_ContentType).subType() == "sdp");
      
      DebugLog( << "start map dump" );
      HashMap<Mime, ContentsFactoryBase*>& m = ContentsFactoryBase::getFactoryMap();
      HashMap<Mime, ContentsFactoryBase*>::iterator i;
      i = m.begin();
      while ( i != m.end() )
      {
         DebugLog( << "first=" << i->first );
         i++;
      }
      DebugLog( << "done map dump" );

      Contents* c = message->getContents();
        
      SdpContents* sdp = dynamic_cast<SdpContents*>(c);
      
      sdp->session();
      
      DebugLog( << "got contents of type" << c->getType() );
      
      // A proxy should forward this using the same retransmission rules as 
      // BYE. A UAS should reject it with an error, and list the available 
      // methods in the response. 

      tassert_verify(7);
}

Here is the call graph for this function:

void test8 ( )

Definition at line 584 of file SipTortureTests.cxx.

References CritLog, and resip::TestSupport::makeMessage().

Referenced by main().

{
   CritLog( << "2.8   Unknown Method with CSeq Error ");
   
   const char *txt = ("NEWMETHOD sip:user@comapny.com SIP/2.0\r\n"
                "To: sip:j.user@company.com\r\n"
                "From: sip:caller@university.edu;tag=23411413\r\n"
                "Max-Forwards: 3\r\n"
                "Call-ID: 0ha0isndaksdj@10.0.1.1\r\n"
                "CSeq: 8 INVITE\r\n"
                "Via: SIP/2.0/UDP 135.180.130.133;branch=z9hG4bKkdjuw\r\n"
                "Content-Type: application/sdp\r\n"
                "\r\n"
                "v=0\r\n"
                "o=mhandley 29739 7272939 IN IP4 126.5.4.3\r\n"
                "s=-\r\n"
                "c=IN IP4 135.180.130.88\r\n"
                "t=0 0\r\n"
                "m=audio 492170 RTP/AVP 0 12\r\n"
                "m=video 3227 RTP/AVP 31\r\n"
                "a=rtpmap:31 LPC\r\n");

   auto_ptr<SipMessage> message(TestSupport::makeMessage(txt));
   tassert_reset();
   tassert(message->isRequest());
   tassert(!message->isResponse());

   tassert(message->header(h_RequestLine).getMethod() == UNKNOWN);
   tassert(message->header(h_RequestLine).unknownMethodName() == "NEWMETHOD");
   tassert(message->header(h_CSeq).method() == INVITE);
   tassert(message->header(h_CSeq).method() != message->header(h_RequestLine).getMethod());
   tassert_verify(8);
}

Here is the call graph for this function:

void test9 ( )

Definition at line 618 of file SipTortureTests.cxx.

References CritLog, and resip::TestSupport::makeMessage().

Referenced by main().

{
   CritLog( << "2.9    REGISTER with Unknown Authorization Scheme" );
   
   const char* txt = ("REGISTER sip:company.com SIP/2.0\r\n"
                "To: sip:j.user@company.com\r\n"
                "From: sip:j.user@company.com;tag=87321hj23128\r\n"
                "Max-Forwards: 8\r\n"
                "Call-ID: 0ha0isndaksdj@10.0.1.1\r\n"
                "CSeq: 8 REGISTER\r\n"
                "Via: SIP/2.0/UDP 135.180.130.133;branch=z9hG4bKkdjuw\r\n"
                "Authorization: Super-PGP foo=ajsohdaosdh0asyhdaind08yasdknasd09asidhas0d8\r\n\r\n");
   auto_ptr<SipMessage> message(TestSupport::makeMessage(txt));
   tassert_reset();
   tassert(message->isRequest());
   tassert(!message->isResponse());
   
   tassert(message->header(h_RequestLine).getMethod() == REGISTER);
   tassert(message->header(h_Authorizations).front().scheme() == "Super-PGP");
   tassert_verify(9);
}

Here is the call graph for this function: