reSIProcate/rutil  9694
Defines | Functions
testParseBuffer.cxx File Reference
#include "rutil/ParseBuffer.hxx"
#include <string.h>
#include <assert.h>
#include "rutil/Logger.hxx"
Include dependency graph for testParseBuffer.cxx:

Go to the source code of this file.

Defines

#define RESIPROCATE_SUBSYSTEM   Subsystem::TEST

Functions

int main (int argc, char **argv)

Define Documentation

#define RESIPROCATE_SUBSYSTEM   Subsystem::TEST

Definition at line 8 of file testParseBuffer.cxx.


Function Documentation

int main ( int  argc,
char **  argv 
)

Definition at line 11 of file testParseBuffer.cxx.

References resip::ParseBuffer::assertEof(), resip::ParseBuffer::bof(), resip::Log::Cout, resip::ParseBuffer::data(), resip::Data::data(), resip::ParseBuffer::dataUnescaped(), resip::Data::empty(), resip::ParseBuffer::end(), resip::ParseBuffer::eof(), resip::ParseBuffer::floatVal(), resip::Log::Info, resip::Log::initialize(), resip::ParseBuffer::integer(), resip::ParseBuffer::position(), resip::ParseBuffer::reset(), resip::ParseBuffer::skipBackChar(), resip::ParseBuffer::skipBackToChar(), resip::ParseBuffer::skipChar(), resip::ParseBuffer::skipChars(), resip::ParseBuffer::skipLWS(), resip::ParseBuffer::skipN(), resip::ParseBuffer::skipNonWhitespace(), resip::ParseBuffer::skipToChar(), resip::ParseBuffer::skipToChars(), resip::ParseBuffer::skipToEnd(), resip::ParseBuffer::skipToEndQuote(), resip::ParseBuffer::skipToOneOf(), resip::ParseBuffer::skipToTermCRLF(), resip::ParseBuffer::skipWhitespace(), resip::Log::toLevel(), and resip::ParseBuffer::uInt64().

{
   Log::initialize(Log::Cout, argc > 1 ? Log::toLevel(argv[1]) :  Log::Info, argv[0]);
   
   {
     const char buf[] = "/home/jason/test";
     ParseBuffer pb(buf);
     pb.skipToEnd();
     pb.skipBackToChar('/');
     assert(!pb.bof());
     Data result(pb.position());
     assert(result == "test");
   }

   {
     const char buf[] = "test";
     ParseBuffer pb(buf);
     pb.skipToEnd();
     pb.skipBackToChar('/');
     assert(pb.bof());
     Data result(pb.position());
     assert(result == "test");
   }

   {
     const char buf[] = "/test";
     ParseBuffer pb(buf);
     pb.skipToEnd();
     pb.skipBackToChar('/');
     Data result(pb.position());
     assert(result == "test");
   }

   {
      const char buf[] = "!^.*$!sip:user@example.com!";
      ParseBuffer pb(buf, strlen(buf));

      const char delim = buf[0];
      const char* start = pb.skipChar(delim);
      std::cerr << "start=" << start << std::endl;
      pb.skipToChar(delim);

      Data e1;
      pb.data(e1, start);
      std::cerr << "e1=" << e1 << std::endl;
      assert(e1 == "^.*$");
       
      start = pb.skipChar(delim);
      Data e2;
      pb.skipToChar(delim);
      pb.data(e2, start);
      std::cerr << "e2=" << e2 << std::endl;
      assert(e2 == "sip:user@example.com");
      
      start = pb.skipChar(delim);
      Data e3;
      pb.data(e3, start);
      std::cerr << "e3=" << e3 << std::endl;
      assert(e3.empty());
   }
   
   {
      const char buf[] = "Ducky%20%26";
      ParseBuffer pb(buf, strlen(buf));

      const char* start = pb.skipWhitespace();
      pb.skipToEnd();
      
      Data target;
      pb.dataUnescaped(target, start);
      
      assert(target == "Ducky &");
   }
   
   {
      const char buf[] = "  \r\t\r\n\t  !";
      ParseBuffer pb(buf, strlen(buf));
      
      pb.skipWhitespace();
      assert(*pb.position() == '!');
   }

   {
      const char buf[] = "asdfa1234123edfdf213ref@!\t  \r\t\r\n\t ";
      ParseBuffer pb(buf, strlen(buf));
      
      pb.skipNonWhitespace();
      assert(*pb.position() == '\t');
   }

   {
      std::cerr << "!! Test position" << std::endl;
      char buf[] = "Here is a buffer with some stuff.";
      ParseBuffer pb(buf, strlen(buf));
      
      pb.skipToChars("buff");
      *pb.position();

      pb.skipToEnd();

      do
      {
         try
         {
            *pb.position();
            assert(false);
         }
         catch (BaseException& e)
         {
            break;
         }
      } while (false);
   }

   {
      std::cerr << "!! Test fail one line" << std::endl;
      
      char buf[] = "Here is a \t buffer with some stuff.";
      ParseBuffer pb(buf, strlen(buf));

      do
      {
         try
         {
            pb.skipChars("Here isn't a");
         }
         catch (ParseException& e)
         {
             //std::cerr<< e << std::endl;
             break;
         }
         assert(0);
      } while (false);
   }

   {
      std::cerr << "!! Test fail multiline" << std::endl;
      
      const Data test("Test input");
      char buf[] = "Here is a \r\n buffer with \r\nsome stuff.";
      ParseBuffer pb(buf, strlen(buf), test);

      do
      {
         try
         {
            pb.skipToChars("buff");
            pb.skipChars("buff");
            pb.skipChar('g');
         }
         catch (ParseException& e)
         {
             //using namespace std;
             //cerr << e << endl;
             //cerr << '\'' << e.getMessage() << '\'' << endl;
             //cerr << '\'' << test << '\'' << endl;
            break;
         }
         assert(0);
      } while (false);
   }

   {
      char buf[] = "Content-Languages: English, \r\n French  , \r\n\t LISP   \r \n \n\r \r\n\r\n";
      ParseBuffer pb(buf, strlen(buf));
      pb.skipToTermCRLF();
      pb.skipChars("\r\n");
      pb.skipChars("\r\n");
      pb.assertEof();
   }

   {
      char buf[] = "Content-Languages: English, \r\n French  , \r\n\t LISP   \r \n \n\r \r\n\r\n";
      ParseBuffer pb(buf, strlen(buf));
      pb.skipToChars("French");
      pb.skipN(strlen("French"));
      pb.skipWhitespace();
      pb.skipChar(',');
      pb.skipLWS();
      std::cerr << pb.position();
      pb.skipChars("LISP");
   }

   {
      char buf[] = "123456789";
      ParseBuffer pb(buf, strlen(buf));
      pb.skipN(9);
      assert(pb.eof());
   }

   {
      char buf[] = "123456789";
      ParseBuffer pb(buf, strlen(buf));
      try
      {
         char foo = *pb.skipN(9);
         (void)foo;
         assert(0);
      }
      catch (ParseException& e)
      {}
   }

   {
      char buf[] = "Here is a \t buffer with some stuff.";
      ParseBuffer pb(buf, strlen(buf));
      pb.skipToChars("some");
      std::cerr << pb.position() << std::endl;
      pb.skipChars("some stu");
   }

   {
      char buf[] = "Here is asom \t buffer with some stuff.";
      ParseBuffer pb(buf, strlen(buf));
      pb.skipToChars("some");
      pb.skipChars("some stuf");
   }

   {
      char buf[] = "Here is asom \t buffer with som stuff.";
      ParseBuffer pb(buf, strlen(buf));
      pb.skipToChars("some");
      pb.assertEof();
   }

   {
      char buf[] = "Here is a \t buffer with some stuff.";
      ParseBuffer pb(buf, strlen(buf));
      pb.skipToChars(Data("some"));
      pb.skipChars("some stuf");
   }

   {
      char buf[] = "Here is asom \t buffer with some stuff.";
      ParseBuffer pb(buf, strlen(buf));
      pb.skipToChars(Data("some"));
      pb.skipChars("some stuf");
   }

   {
      char buf[] = "Here is asom \t buffer with som stuff.";
      ParseBuffer pb(buf, strlen(buf));
      pb.skipToChars(Data("some"));
      pb.assertEof();
   }

   {
      char buf[] = "Here is a \t buffer with some stuff.";
      ParseBuffer pb(buf, strlen(buf));

      pb.skipChars("Here is a");
   }

   {
      char buf[] = "Here is a \t buffer with some stuff.";
      ParseBuffer pb(buf, strlen(buf));

      do
      {
         try
         {
            pb.skipChars("Here isn't a");
         }
         catch (ParseException& e)
         {
            break;
         }
         assert(0);
      } while (false);
   }

   {
      char buf[] = "Here is a buf.";
      ParseBuffer pb(buf, strlen(buf));

      do
      {
         try
         {
            pb.skipChars("Here is a ");
            pb.skipChars("buffer");
         }
         catch (ParseException& e)
         {
            break;
         }
         assert(0);
      } while (false);
   }
   
   {
      const char* buf = "Here is a \t buffer with some stuff.";

      ParseBuffer pb(buf, strlen(buf));
   
      assert(!pb.eof());
      assert(pb.position() == buf);

      pb.skipWhitespace();
      assert(pb.position() == buf);

      pb.skipNonWhitespace();
      assert(*pb.position() == ' ');
   }

   {
      char buf[] = "    \t buffer with some stuff.";
      ParseBuffer pb(buf, strlen(buf));   

      pb.reset(pb.end());
      pb.skipBackToChar('s');
      pb.skipBackChar();
      pb.skipBackToChar('s');
      pb.skipBackChar('s');

      assert(Data(pb.position(), 4) == "some");
   }

   {
      char buf[] = "buffer with some stuff.";
      ParseBuffer pb(buf, strlen(buf));   

      pb.reset(pb.end());
      pb.skipBackToChar('q');
      assert(pb.bof());
      pb.skipChar('b');
   }
   
   {
      char buf[] = "    \t buffer with some stuff.";
      ParseBuffer pb(buf, strlen(buf));   

      pb.skipWhitespace();
      assert(*pb.position() == 'b');
      
      pb.skipToChar('s');
      assert(*pb.position() == 's');
      pb.skipNonWhitespace();
      pb.skipWhitespace();
      pb.skipNonWhitespace();
      assert(pb.eof());
   }

   {
      char buf[] = "jhsj:!hskd;|.";
      ParseBuffer pb(buf, strlen(buf));   

      pb.skipToOneOf(":@");
      assert(*pb.position() == ':');
   }

   {
      char buf[] = "user@host:port";
      ParseBuffer pb(buf, strlen(buf));   

      pb.skipToOneOf(":@");
      assert(*pb.position() == '@');
   }

   {
      char buf[] = "jhsjfhskd;|.";
      ParseBuffer pb(buf, strlen(buf));   

      pb.skipToOneOf(".|;");
      assert(*pb.position() == ';');
   }

   {
      char buf[] = "\"  \\\"Q \t buffer with some stuff.\"Z";
      ParseBuffer pb(buf, strlen(buf));   
      pb.skipWhitespace();
      pb.skipToChar('"');
      pb.skipChar();
      pb.skipToEndQuote();
      assert(*pb.position() == '"');
      pb.skipChar();
      assert(*pb.position() == 'Z');
   }
   
   {
      char buf[] = "17 ";
      ParseBuffer pb(buf, strlen(buf));   
      assert(pb.integer() == 17);
   }
   
   {
      char buf[] = "-17";
      ParseBuffer pb(buf, strlen(buf));   
      assert(pb.integer() == -17);
   }

   {
      char buf[] = "999999999999999999999999999 ";
      ParseBuffer pb(buf, strlen(buf));
      try
      {
         pb.integer();
         assert(0);
      }
      catch(ParseException& e)
      {}
   }
   
   {
      char buf[] = "-999999999999999999999999999 ";
      ParseBuffer pb(buf, strlen(buf));
      try
      {
         pb.integer();
         assert(0);
      }
      catch(ParseException& e)
      {}
   }

#ifndef WIN32
   {
      char buf[] = "2890844526";
      ParseBuffer pb(buf, strlen(buf));   
      assert(pb.uInt64() == 2890844526UL);
   }
#endif

#ifndef RESIP_FIXED_POINT
   {
      char buf[] = "17.71";
      ParseBuffer pb(buf, strlen(buf));   
      float val = pb.floatVal();
      assert(val > 17.70 && val < 17.72);
   }
#endif

   {
      char buf[] = "token another token";
      ParseBuffer pb(buf, strlen(buf));   
      const char *start = pb.position();
      pb.skipToChar(' ');
      pb.skipChar(' ');
      Data t;
      // make t share memry with buf
      pb.data(t, start);
      assert(t.data() == buf);
      // assign copies
      Data t1 = t;
      assert(t1.data() != buf);
      // assign copies
      t = t1;
      assert(t.data() != buf);

      start = pb.position();
      pb.skipToChar(' ');
      pb.skipChar(' ');
      Data t2;
      pb.data(t2, start);
      // should survive scope exit
   }

   std::cerr << "All OK" << std::endl;
   return 0;
}

Here is the call graph for this function: