// 
//
// Copyright (C) 2004 SIPfoundry Inc.
// Licensed by SIPfoundry under the LGPL license.
//
// Copyright (C) 2004 Pingtel Corp.
// Licensed to SIPfoundry under a Contributor Agreement.
//
// $$
//////////////////////////////////////////////////////////////////////////////

#include <cppunit/extensions/HelperMacros.h>
#include <cppunit/TestCase.h>
#include <sipxunit/TestUtilities.h>

#include "net/Url.h"
#include "net/XmlRpcRequest.h"
#include "xmlparser/tinyxml.h"
#include "sipdb/ResultSet.h"

typedef struct
{
   const char* uri;
   const char* callid;
   const char* contact;
   const char* expires;
   const char* cseq;
   const char* qvalue;
   const char* instance_id;
   const char* gruu;
} RegistrationRow;

RegistrationRow regdata[] =
{
   {
      "sip:user1@example.com",
      "6745637808245563@TmVhbC1sYXB0b3Ay",
      "sip:181@192.168.0.2:6012",
      "1133218054",
      "3",
      "",
      "1111",
      "sip:181@example.com;gruu"
   },
   {
      "sip:user@example.com",
      "8d2d9c70405f4e66@TmVhbC1sYXB0b3Ay",
      "sip:181@66.30.139.170:24907",
      "1133221655",
      "2",
      "0.8",
      "2222",
      "sip:182@example.com;gruu"
   },
   {
      "sip:user3@example.com",
      "fa294244984e0c3f@TmVhbC1sYXB0b3Ay",
      "sip:181@192.168.0.2:6000",
      "1133221680",
      "1",
      "0.2",
      "3333",
      "sip:183@example.com;gruu"
   }
};
   
class ResultSetRpcTest : public CppUnit::TestCase
{
   CPPUNIT_TEST_SUITE(ResultSetRpcTest);
   CPPUNIT_TEST(testRegistrationSet);
   CPPUNIT_TEST_SUITE_END();

public:

   void testRegistrationSet()
      {
         ResultSet registrations;

         size_t row;
         for (row = 0; row < sizeof(regdata)/sizeof(RegistrationRow); row++)
         {
            UtlHashMap regRow;

            UtlString* uriKey = new UtlString("uri");
            UtlString* uriValue = new UtlString(regdata[row].uri);
            regRow.insertKeyAndValue(uriKey, uriValue);
            
            UtlString* callidKey = new UtlString("callid");
            UtlString* callidValue = new UtlString(regdata[row].callid);
            regRow.insertKeyAndValue(callidKey, callidValue);

            UtlString* contactKey = new UtlString("contact");
            UtlString* contactValue = new UtlString(regdata[row].contact);
            regRow.insertKeyAndValue(contactKey, contactValue);

            UtlString* expiresKey = new UtlString("expires");
            UtlString* expiresValue = new UtlString(regdata[row].expires);
            regRow.insertKeyAndValue(expiresKey, expiresValue);

            UtlString* cseqKey = new UtlString("cseq");
            UtlString* cseqValue = new UtlString(regdata[row].cseq);
            regRow.insertKeyAndValue(cseqKey, cseqValue);

            UtlString* qvalueKey = new UtlString("qvalue");
            UtlString* qvalueValue = new UtlString(regdata[row].qvalue);
            regRow.insertKeyAndValue(qvalueKey, qvalueValue);

            UtlString* instanceIdKey = new UtlString("instance_id");
            UtlString* instanceIdValue = new UtlString(regdata[row].instance_id);
            regRow.insertKeyAndValue(instanceIdKey, instanceIdValue);

            UtlString* gruuKey = new UtlString("gruu");
            UtlString* gruuValue = new UtlString(regdata[row].gruu);
            regRow.insertKeyAndValue(gruuKey, gruuValue);
            
            registrations.addValue(regRow);
         }

         Url target("http://server.exmple.com");
         
         XmlRpcRequest request(target,"RPC.METHOD");

         request.addParam(&registrations);

         UtlString requestBody;
         int bodyLength;
         request.mpRequestBody->getBytes(&requestBody, &bodyLength);

         const char* correctRequestBody =
            "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n"
            "<methodCall>\n"
            "<methodName>RPC.METHOD</methodName>\n"
            "<params>\n"
            "<param>\n"
            "<value><array><data>\n"
            "<value><struct>\n"
            "<member>\n"
            "<name>gruu</name><value><string>sip:181@example.com;gruu</string></value>\n"
            "</member>\n"
            "<member>\n"
            "<name>uri</name><value><string>sip:user1@example.com</string></value>\n"
            "</member>\n"
            "<member>\n"
            "<name>contact</name><value><string>sip:181@192.168.0.2:6012</string></value>\n"
            "</member>\n"
            "<member>\n"
            "<name>qvalue</name><value><string></string></value>\n"
            "</member>\n"
            "<member>\n"
            "<name>cseq</name><value><string>3</string></value>\n"
            "</member>\n"
            "<member>\n"
            "<name>expires</name><value><string>1133218054</string></value>\n"
            "</member>\n"
            "<member>\n"
            "<name>instance_id</name><value><string>1111</string></value>\n"
            "</member>\n"
            "<member>\n"
            "<name>callid</name><value><string>6745637808245563@TmVhbC1sYXB0b3Ay</string></value>\n"
            "</member>\n"
            "</struct></value>\n"
            "<value><struct>\n"
            "<member>\n"
            "<name>gruu</name><value><string>sip:182@example.com;gruu</string></value>\n"
            "</member>\n"
            "<member>\n"
            "<name>uri</name><value><string>sip:user@example.com</string></value>\n"
            "</member>\n"
            "<member>\n"
            "<name>contact</name><value><string>sip:181@66.30.139.170:24907</string></value>\n"
            "</member>\n"
            "<member>\n"
            "<name>qvalue</name><value><string>0.8</string></value>\n"
            "</member>\n"
            "<member>\n"
            "<name>cseq</name><value><string>2</string></value>\n"
            "</member>\n"
            "<member>\n"
            "<name>expires</name><value><string>1133221655</string></value>\n"
            "</member>\n"
            "<member>\n"
            "<name>instance_id</name><value><string>2222</string></value>\n"
            "</member>\n"
            "<member>\n"
            "<name>callid</name><value><string>8d2d9c70405f4e66@TmVhbC1sYXB0b3Ay</string></value>\n"
            "</member>\n"
            "</struct></value>\n"
            "<value><struct>\n"
            "<member>\n"
            "<name>gruu</name><value><string>sip:183@example.com;gruu</string></value>\n"
            "</member>\n"
            "<member>\n"
            "<name>uri</name><value><string>sip:user3@example.com</string></value>\n"
            "</member>\n"
            "<member>\n"
            "<name>contact</name><value><string>sip:181@192.168.0.2:6000</string></value>\n"
            "</member>\n"
            "<member>\n"
            "<name>qvalue</name><value><string>0.2</string></value>\n"
            "</member>\n"
            "<member>\n"
            "<name>cseq</name><value><string>1</string></value>\n"
            "</member>\n"
            "<member>\n"
            "<name>expires</name><value><string>1133221680</string></value>\n"
            "</member>\n"
            "<member>\n"
            "<name>instance_id</name><value><string>3333</string></value>\n"
            "</member>\n"
            "<member>\n"
            "<name>callid</name><value><string>fa294244984e0c3f@TmVhbC1sYXB0b3Ay</string></value>\n"
            "</member>\n"
            "</struct></value>\n"
            "</data></array></value>\n"
            "</param>\n"
            ;
         
         ASSERT_STR_EQUAL(correctRequestBody, requestBody.data());
         CPPUNIT_ASSERT_EQUAL(strlen(correctRequestBody), requestBody.length());
            
      };
};

CPPUNIT_TEST_SUITE_REGISTRATION(ResultSetRpcTest);



syntax highlighted by Code2HTML, v. 0.9.1