SdpTest.cxx
上传用户:sy_wanhua
上传日期:2013-07-25
资源大小:3048k
文件大小:18k
源码类别:

流媒体/Mpeg4/MP4

开发平台:

C/C++

  1. /* ====================================================================
  2.  * The Vovida Software License, Version 1.0 
  3.  * 
  4.  * Copyright (c) 2000 Vovida Networks, Inc.  All rights reserved.
  5.  * 
  6.  * Redistribution and use in source and binary forms, with or without
  7.  * modification, are permitted provided that the following conditions
  8.  * are met:
  9.  * 
  10.  * 1. Redistributions of source code must retain the above copyright
  11.  *    notice, this list of conditions and the following disclaimer.
  12.  * 
  13.  * 2. Redistributions in binary form must reproduce the above copyright
  14.  *    notice, this list of conditions and the following disclaimer in
  15.  *    the documentation and/or other materials provided with the
  16.  *    distribution.
  17.  * 
  18.  * 3. The names "VOCAL", "Vovida Open Communication Application Library",
  19.  *    and "Vovida Open Communication Application Library (VOCAL)" must
  20.  *    not be used to endorse or promote products derived from this
  21.  *    software without prior written permission. For written
  22.  *    permission, please contact vocal@vovida.org.
  23.  *
  24.  * 4. Products derived from this software may not be called "VOCAL", nor
  25.  *    may "VOCAL" appear in their name, without prior written
  26.  *    permission of Vovida Networks, Inc.
  27.  * 
  28.  * THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESSED OR IMPLIED
  29.  * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
  30.  * OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, TITLE AND
  31.  * NON-INFRINGEMENT ARE DISCLAIMED.  IN NO EVENT SHALL VOVIDA
  32.  * NETWORKS, INC. OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT DAMAGES
  33.  * IN EXCESS OF $1,000, NOR FOR ANY INDIRECT, INCIDENTAL, SPECIAL,
  34.  * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
  35.  * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
  36.  * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
  37.  * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
  38.  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE
  39.  * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH
  40.  * DAMAGE.
  41.  * 
  42.  * ====================================================================
  43.  * 
  44.  * This software consists of voluntary contributions made by Vovida
  45.  * Networks, Inc. and many individuals on behalf of Vovida Networks,
  46.  * Inc.  For more information on Vovida Networks, Inc., please see
  47.  * <http://www.vovida.org/>.
  48.  *
  49.  */
  50. #include "SdpSession.hxx"
  51. #include <string>
  52. #include <fstream.h>
  53. #include <VTest.hxx>
  54. #include <unistd.h>
  55. #define OPTIONS "f:l:v"
  56. bool
  57. testEncode (SdpSession& sd)
  58. {
  59.     cpLog (LOG_DEBUG, "------- Test encode() begin -------");
  60.     // Session Description
  61.     // v=0 by default - no other value as of now
  62.     // o= owner/creator and session identifier
  63.     // s= session name
  64.     // i=* session information
  65.     // u=* URI of description
  66.     // e=* email address
  67.     // p=* phone number
  68.     // c=* connection information (not required if included in all media
  69.     // b=* bandwidth information
  70.         // Time Description
  71.         // t= time the session is active
  72.         // r=* zero or more repeated times
  73.     // z=* time zone adjustment
  74.     // k=* encryption key
  75.     // Verify
  76.     cout << sd.encode();
  77.     cpLog (LOG_DEBUG, "------- Test encode() end -------");
  78.     return true;
  79. }    // testEncode
  80. bool
  81. testDump(split_t& tc_files, bool verbose)
  82. {
  83.     cpLog (LOG_DEBUG, "------- Test Dump() begin -------");
  84.     split_t::iterator linecount = tc_files.begin();
  85.     while (linecount != tc_files.end())
  86.     {
  87.         // Get test case file name and throw away the description
  88.         string tc_in;
  89.         string record;
  90.         record = (*linecount);
  91.         split_t lines(split(record, ":"));    
  92.         split_t::iterator filename;
  93.         filename = lines.begin();
  94.         // Generate test case input & outp file names
  95.         tc_in = (*filename) + ".in";
  96.         // Open and read the test case input file
  97.         ifstream ifs(tc_in.c_str(), ios::in);
  98.         char buffer[4096];
  99.         string sdp;
  100.         sdp.erase();
  101.         if (!ifs)
  102.         {
  103.             cpLog(LOG_ERR, "Cannot open input file: %s ", tc_in.c_str());
  104.             return false;
  105.         }
  106.     
  107.         // Read in the SDP packet from file
  108.         while (!ifs.eof())
  109.         {
  110.                ifs.getline(buffer, sizeof(buffer), 'n');
  111.                sdp += buffer;
  112.                sdp += "n";
  113.            }
  114.         if (verbose)
  115.             cpLog(LOG_DEBUG, "String constructed from input file:n[%s]",
  116.                 sdp.c_str());
  117.         // Decode input file into SDP object 
  118.            SdpSession sdpDesc;
  119.            sdpDesc.decode(sdp);
  120. /*
  121.            if (!sdpDesc.dump(sdpDesc))
  122.             return false;
  123. */
  124.         ++linecount;
  125.     }
  126.     cpLog (LOG_DEBUG, "------- Test Dump() end -------");
  127.     return true;
  128. }    // testDump
  129. bool
  130. testDecode(split_t& tc_files, bool verbose)
  131. {
  132.     cpLog (LOG_DEBUG, "------- Test decode() begin -------");
  133.     bool same = true;
  134.     split_t::iterator linecount = tc_files.begin();
  135.     while (linecount != tc_files.end())
  136.     {
  137.         string tc_in, tc_out;
  138.         string record;
  139.         // Get test case file name and throw away the description
  140.         record = (*linecount);
  141.         split_t lines(split(record, ":"));    
  142.         split_t::iterator filename;
  143.         filename = lines.begin();
  144.         // Generate test case input & outp file names
  145.         tc_in = (*filename) + ".in";
  146.         tc_out = (*filename) + "_encode" + ".out";
  147.         // Open and read the test case input file
  148.         ifstream ifs(tc_in.c_str(), ios::in);
  149.         fstream ofs(tc_out.c_str(), ios::in | ios::out);
  150.         char buffer[4096];
  151.         string sdp;
  152.         sdp.erase();
  153.         if (!ifs)
  154.         {
  155.             cpLog(LOG_ERR, "Cannot open input file: %s ", tc_in.c_str());
  156.             return false;
  157.         }
  158.         if (!ofs)
  159.         {
  160.             cpLog(LOG_ERR, "Cannot open out file: %s ", tc_out.c_str());
  161.             return false;
  162.         }
  163.     
  164.         // Read in the SDP packet from file
  165.         while (!ifs.eof())
  166.         {
  167.                ifs.getline(buffer, sizeof(buffer), 'n');
  168.                sdp += buffer;
  169.                sdp += "n";
  170.            }
  171.         if (verbose)
  172.             cpLog(LOG_DEBUG, "String constructed from input file:n[%s]",
  173.                 sdp.c_str());
  174.         // Decode input file into SDP object 
  175.            SdpSession sdpDesc;
  176.            sdpDesc.decode(sdp);
  177.         // Encode the object into SDP string and write it to output file 
  178.         // for verification
  179.            ofs << sdpDesc.encode();
  180.     
  181.         // Compare the input and output files
  182.         // Reset stream pointers
  183.         ifs.clear();
  184.         ofs.clear();
  185.         char in_char, out_char;
  186.            while (ifs.get(in_char))
  187.            {
  188.                ofs.get(out_char);
  189.                if (out_char == 'r')
  190.                {
  191.                 // throw waay the 'r' character
  192.                    ofs.get(out_char);
  193.                }
  194.                if (in_char != out_char)
  195.                {
  196.                    same = false;
  197.                    cpLog(LOG_ERR, "In & out are different: in="%c", out="%c"", in_char, out_char);
  198.                    break;
  199.                }
  200.            }
  201.            if (same)
  202.                cpLog(LOG_DEBUG, "In & out are identical");
  203.            else
  204.                cpLog(LOG_DEBUG, "In & out are different");
  205.         ++linecount;
  206.     }
  207.     cpLog (LOG_DEBUG, "------- Test decode() end -------");
  208.     return same;
  209. }    // testDecode
  210. bool
  211. testAssignOperator(split_t& tc_files, bool verbose)
  212. {
  213.     cpLog (LOG_DEBUG, "------- Test operator= begin -------");
  214.     bool same = true;
  215.     split_t::iterator linecount = tc_files.begin();
  216.     while (linecount != tc_files.end())
  217.     {
  218.         string tc_in, tc_out;
  219.         string record;
  220.         // Get test case file name and throw away the description
  221.         record = (*linecount);
  222.         split_t lines(split(record, ":"));    
  223.         split_t::iterator filename;
  224.         filename = lines.begin();
  225.         // Generate test case input & outp file names
  226.         tc_in = (*filename) + ".in";
  227.         tc_out = (*filename) +"_assign" + ".out";
  228.         // Open and read the test case input file
  229.         ifstream ifs(tc_in.c_str(), ios::in);
  230.         fstream ofs(tc_out.c_str(), ios::in | ios::out);
  231.         char buffer[4096];
  232.         string sdp;
  233.         sdp.erase();
  234.         if (!ifs)
  235.         {
  236.             cpLog(LOG_ERR, "Cannot open input file: %s ", tc_in.c_str());
  237.             return false;
  238.         }
  239.         if (!ofs)
  240.         {
  241.             cpLog(LOG_ERR, "Cannot open out file: %s ", tc_out.c_str());
  242.             return false;
  243.         }
  244.     
  245.         // Read in the SDP packet from file
  246.         while (!ifs.eof())
  247.         {
  248.                ifs.getline(buffer, sizeof(buffer), 'n');
  249.                sdp += buffer;
  250.                sdp += "n";
  251.            }
  252.         if (verbose)
  253.             cpLog(LOG_DEBUG, "String constructed from input file:n[%s]",
  254.                 sdp.c_str());
  255.         // Decode input file into SDP object 
  256.            SdpSession sdpDesc, sdpAssign;
  257.            sdpDesc.decode(sdp);
  258.         sdpAssign = sdpDesc;
  259.         // Encode the assign object into SDP string and write 
  260.         // it to output file for verification
  261.            ofs << sdpAssign.encode();
  262.     
  263.         // Compare the input and output files
  264.         // Reset stream pointers
  265.         ifs.clear();
  266.         ofs.clear();
  267.         char in_char, out_char;
  268.            while (ifs.get(in_char))
  269.            {
  270.                ofs.get(out_char);
  271.                if (out_char == 'r')
  272.                {
  273.                 // throw waay the 'r' character
  274.                    ofs.get(out_char);
  275.                }
  276.                if (in_char != out_char)
  277.                {
  278.                    same = false;
  279.                    cpLog(LOG_ERR, "In & out are different: in="%c", out="%c"", in_char, out_char);
  280.                    break;
  281.                }
  282.            }
  283.            if (same)
  284.                cpLog(LOG_DEBUG, "In & out are identical");
  285.            else
  286.                cpLog(LOG_DEBUG, "In & out are different");
  287.         ++linecount;
  288.     }
  289.     cpLog (LOG_DEBUG, "------- Test operator= end -------");
  290.     return same;
  291. }    // testAssignOperator
  292. bool
  293. testCopyConstructor(split_t& tc_files, bool verbose)
  294. {
  295.     cpLog (LOG_DEBUG, "------- Test copy constructor begin -------");
  296.     bool same = true;
  297.     split_t::iterator linecount = tc_files.begin();
  298.     while (linecount != tc_files.end())
  299.     {
  300.         string tc_in, tc_out;
  301.         string record;
  302.         // Get test case file name and throw away the description
  303.         record = (*linecount);
  304.         split_t lines(split(record, ":"));    
  305.         split_t::iterator filename;
  306.         filename = lines.begin();
  307.         // Generate test case input & outp file names
  308.         tc_in = (*filename) + ".in";
  309.         tc_out = (*filename) +"_copy" + ".out";
  310.         // Open and read the test case input file
  311.         ifstream ifs(tc_in.c_str(), ios::in);
  312.         fstream ofs(tc_out.c_str(), ios::in | ios::out);
  313.         char buffer[4096];
  314.         string sdp;
  315.         sdp.erase();
  316.         if (!ifs)
  317.         {
  318.             cpLog(LOG_ERR, "Cannot open input file: %s ", tc_in.c_str());
  319.             return false;
  320.         }
  321.         if (!ofs)
  322.         {
  323.             cpLog(LOG_ERR, "Cannot open out file: %s ", tc_out.c_str());
  324.             return false;
  325.         }
  326.     
  327.         // Read in the SDP packet from file
  328.         while (!ifs.eof())
  329.         {
  330.                ifs.getline(buffer, sizeof(buffer), 'n');
  331.                sdp += buffer;
  332.                sdp += "n";
  333.            }
  334.         if (verbose)
  335.             cpLog(LOG_DEBUG, "String constructed from input file:n[%s]",
  336.                 sdp.c_str());
  337.            SdpSession sdpDesc;
  338.            sdpDesc.decode(sdp);
  339.            SdpSession sdpCopy(sdpDesc);
  340.         // Encode the object into SDP string and write it to output file 
  341.         // for verification
  342.            ofs << sdpCopy.encode();
  343.         // Compare the input and output files
  344.         // Reset stream pointers
  345.         ifs.clear();
  346.         ofs.clear();
  347.         char in_char, out_char;
  348.            while (ifs.get(in_char))
  349.            {
  350.                ofs.get(out_char);
  351.                if (out_char == 'r')
  352.                {
  353.                 // throw waay the 'r' character
  354.                    ofs.get(out_char);
  355.                }
  356.                if (in_char != out_char)
  357.                {
  358.                    same = false;
  359.                    cpLog(LOG_ERR, "In & out are different: in="%c", out="%c"", in_char, out_char);
  360.                    break;
  361.                }
  362.            }
  363.            if (same)
  364.                cpLog(LOG_DEBUG, "In & out are identical");
  365.            else
  366.                cpLog(LOG_DEBUG, "In & out are different");
  367.         ++linecount;
  368.     }
  369.     cpLog (LOG_DEBUG, "------- Test copy constructor end -------");
  370.     return same;
  371. }    // testCopyConstructor
  372. bool
  373. testNcsSdp ()
  374. {
  375.     cpLog (LOG_DEBUG, "------- Test NCS SDP begin -------");
  376.     try
  377.     {
  378.         SdpSession ncs;
  379.         cpLog (LOG_DEBUG, "Check NCS conformance from default constructor");
  380.         cpLog (LOG_DEBUG, "The verdict should be FAILED");
  381.         if (ncs.verify (SdpProtocolTypeNCS))
  382.         {
  383.             cpLog (LOG_ERR, "Results: PASSED");
  384.         }
  385.         cpLog (LOG_DEBUG, "Check NCS conformance after setting Protocol Type to NCS");
  386.         ncs.setProtocolType (SdpProtocolTypeNCS);
  387.         if (ncs.verify (SdpProtocolTypeNCS))
  388.         {
  389.             cpLog (LOG_DEBUG, "Results: PASSED");
  390.         }
  391.         else
  392.             return false;
  393.         ncs.setAddress ("gauss.private.vovida.com");
  394.         (ncs.getConnection())->setUnicast ("192.168.5.2");
  395.         (ncs.getMediaList())[0]->setPort (28888);
  396.         cpLog (LOG_DEBUG, "Check NCS conformance filling in the rest");
  397.         if (ncs.verify (SdpProtocolTypeNCS))
  398.         {
  399.             cpLog (LOG_DEBUG, "Results: PASSED");
  400.         }
  401.         else
  402.             return false;
  403.     }
  404.     catch (SdpExceptions& err)
  405.     {
  406.         cpLog (LOG_ERR, "Got Exception: %d", err.value);
  407.         return false;
  408.     }
  409.     cpLog (LOG_DEBUG, "------- Test NCS SDP end -------");
  410.     return true;
  411. }    // testNcsSdp
  412. int
  413. main(int argc, char *argv[])
  414. {
  415.     string tc_file = "../testCases/SDP_tc";    // Default test case file name
  416.     string log_file = "SdpTest.log";    // Default log file name
  417.     bool verbose = false;
  418.     if (argc > 1)
  419.     {
  420.         char c;
  421.         while ((c = getopt(argc, argv, OPTIONS)) != -1)
  422.         {
  423.             switch (c)
  424.             {
  425.                 case 'f':
  426.                     tc_file = optarg;
  427.                     break;
  428.                 case 'l':
  429.                     log_file = optarg ;
  430.                     log_file += ".log";
  431.                     break;
  432.                 case 'v':
  433.                     verbose = true;
  434.                     break;
  435.                 default:
  436.                     cerr << "Unknow option: "" << c << """ << endl;
  437.             }
  438.         }    
  439.     }
  440.     ifstream ifs(tc_file.c_str(), ios::in);
  441.     char buffer[256];
  442.     string s;
  443.     s.erase();
  444.     if (!ifs)
  445.     {
  446.         cpLog(LOG_ERR, "Cannot open input file: %s ", tc_file.c_str());
  447.         return false;
  448.     }
  449.     while (!ifs.eof())
  450.     {
  451.         ifs.getline(buffer, sizeof(buffer), 'n');
  452.         s += buffer;
  453.         s += "n";
  454.     }
  455.     // read in all test case file names & store by sections
  456.     split_t lines(split(s, "n"));
  457.     split_t tc_decode;
  458.     split_t tc_assign_op;
  459.     split_t tc_copy_const;
  460.     split_t tc_NCS;
  461.     split_t tc_dump;
  462.     split_t::iterator linecount = lines.begin();
  463.     while (linecount != lines.end())
  464.     {
  465.         if ((*linecount)[0] == '/')
  466.         {
  467.             /// Throw away comment lines    
  468.             ++linecount;
  469.             continue;
  470.         }
  471.         string line = (*linecount);
  472.         int pos = line.find(']');
  473.         string sec_label = line.substr(0,pos+1);
  474.         if (sec_label == "[DECODE]")
  475.         {
  476.             ++linecount;
  477.             while ((linecount != lines.end()) && ((*linecount)[0] != '['))
  478.             {
  479.                 if ((*linecount)[0] == '/')
  480.                 {
  481.                     ++linecount;
  482.                     continue;
  483.                 }    
  484.                 (tc_decode).push_back(*linecount);    
  485.                 ++linecount;
  486.             }
  487.         }    
  488.         else if (sec_label == "[ASSIGN_OP]")
  489.         {
  490.             ++linecount;
  491.             while ((linecount != lines.end()) && ((*linecount)[0] != '['))
  492.             {
  493.                 if ((*linecount)[0] == '/')
  494.                 {
  495.                     ++linecount;
  496.                     continue;
  497.                 }    
  498.                 (tc_assign_op).push_back(*linecount);    
  499.                 ++linecount;
  500.             }
  501.         }
  502.         else if (sec_label == "[COPY_CONST]")
  503.         {
  504.             ++linecount;
  505.             while ((linecount != lines.end()) && ((*linecount)[0] != '['))
  506.             {
  507.                 if ((*linecount)[0] == '/')
  508.                 {
  509.                     ++linecount;
  510.                     continue;
  511.                 }    
  512.                 (tc_copy_const).push_back(*linecount);    
  513.                 ++linecount;
  514.             }
  515.         }
  516.         else if (sec_label == "[NCS]")
  517.         {
  518.             ++linecount;
  519.             while ((linecount != lines.end()) && ((*linecount)[0] != '['))
  520.             {
  521.                 if ((*linecount)[0] == '/')
  522.                 {
  523.                     ++linecount;
  524.                     continue;
  525.                 }    
  526.                 (tc_NCS).push_back(*linecount);    
  527.                 ++linecount;
  528.             }
  529.         }
  530.         else if (sec_label == "[DUMP]")
  531.         {
  532.             ++linecount;
  533.             while ((linecount != lines.end()) && ((*linecount)[0] != '['))
  534.             {
  535.                 if ((*linecount)[0] == '/')
  536.                 {
  537.                     ++linecount;
  538.                     continue;
  539.                 }    
  540.                 (tc_dump).push_back(*linecount);    
  541.                 ++linecount;
  542.             }
  543.         }
  544.         else
  545.         {
  546.             cpLog(LOG_ERR, "Unknown section label: %s ", (*linecount).c_str());
  547.             return false;
  548.         }
  549.     }
  550.     VTest sdpTest(__FILE__);
  551.     cpLogOpen(log_file.c_str());
  552.     cpLogSetLabel ("SdpTest");
  553.     cpLogSetPriority (LOG_DEBUG_STACK);
  554.     if (verbose)
  555.     {
  556.         cpLog(LOG_DEBUG, "Test Case File = "%s"", tc_file.c_str());
  557.         cpLog(LOG_DEBUG, "Log File = "%s"", tc_file.c_str());
  558.         cpLog(LOG_DEBUG, "Verbose = "%s"", verbose ? "ON" : "OFF");
  559.     }    
  560.     sdpTest.test(1, testDecode(tc_decode, verbose), "Testing encode functionality");
  561.     sdpTest.test(2, testAssignOperator(tc_assign_op, verbose), "Testing assign opertor");
  562.     sdpTest.test(3, testCopyConstructor(tc_copy_const, verbose), "Testing copy constructor");
  563.     sdpTest.test(4, testNcsSdp(), "Testing NCS conformance");
  564. //    sdpTest.test(5, testDump(tc_dump, verbose), "Testing dump functionality");
  565.     return true;
  566. }