Difference between revisions of "TestUnit TestScript Communication Http.lsl"

From Second Life Wiki
Jump to navigation Jump to search
(New page: <pre> /////////////////////////////////////////////////////////////////////////////////// /////// /////// /////// /////// TestUnit_TestScript /////// /////// ...)
 
Line 8: Line 8:
///////       
///////       
///////
///////
///////  This is the test script that should include the code you want to test.
///////  This is the test script for the HTTP communication function
///////       
///////       
///////               
///////               
Line 15: Line 15:
//TestUnit_TestScript    .1 -> initial framework  6.23.2007
//TestUnit_TestScript    .1 -> initial framework  6.23.2007
//TestUnit_TestScript    .2 -> tested with minor bug fixes  7.2.2007
//TestUnit_TestScript    .2 -> tested with minor bug fixes  7.2.2007
//Communication_Http    .1 -> modified from TestUnit_TestScript base to test http functions  7.6.2007




Line 61: Line 63:
// Global Variables
// Global Variables


integer toAllChannel = -255;           // general channel - linked message
integer toAllChannel = -255;                                     // general channel - linked message
integer passFailChannel = -355;       // test scripts channel for cummunicating pass/fail - linked message
integer passFailChannel = -355;                                   // test scripts channel for cummunicating pass/fail - linked message
 
integer debug = 0;                                                // level of debug message
integer debugChannel = DEBUG_CHANNEL;                            // output channel for debug messages
 
key HTTP_CONTROL;                                                // HTTP Handler
string HTTP_URL = "TODO: add your server url here";              // url for the HTTP test
 
string http_body;                                                // temp storage for the http response


integer debug = 0;                    // level of debug message
integer debugChannel = DEBUG_CHANNEL;  // output channel for debug messages




Line 88: Line 96:
          
          
     //reset all scripts  
     //reset all scripts  
     if(message == "Reset")
     if(message == "reset")
     {
     {
         //reset this script  
         //reset this script  
Line 142: Line 150:
RunTest()
RunTest()
{
{
    //initiate a http request
    HTTP_CONTROL = llHTTPRequest( HTTP_URL, [HTTP_METHOD,"PUT"],"");
      
      
    //
    //
    //  Put the scripts that you want to test here !!!!!!!!!
    //
    //
   
   
    //One of the following messages needs to be sent at the end of this function
    //each time that it is run
    //
    // llMessageLinked(LINK_SET, passFailChannel, "PASS", NULL_KEY);
    // llMessageLinked(LINK_SET, passFailChannel, "FAIL", NULL_KEY);
}
}


Line 180: Line 178:
     string reportString;
     string reportString;
      
      
   
    if(debug > 1)llSay(debugChannel, llGetScriptName()+ "->Report() type=" + reportType);
   
     //Normal - moderate level of reporting
     //Normal - moderate level of reporting
     if( reportType == "NORMAL" )
     if( reportType == "NORMAL" )
     {
     {
         reportString = ""; //add what you would like to report here !!!!!!
        //parse http response to useful list
        //format example -> ownername::objectname::objectkey::ownerkey::region::location
        list unitParameters = llParseString2List( http_body , ["::"], [""]);
       
        reportString += "http_ownername: " + llList2String( unitParameters, 0) + "\n";
         reportString += "http_objectname: " + llList2String( unitParameters, 1)+ "\n";
        reportString += "http_objectkey: " + llList2String( unitParameters, 2)+ "\n";
        reportString += "http_ownerkey: " + llList2String( unitParameters, 3)+ "\n";
        reportString += "http_region: " + llList2String( unitParameters, 4)+ "\n";
        reportString += "http_location: " + llList2String( unitParameters, 5)+ "\n";
       
     }
     }
      
      
Line 189: Line 200:
     if( reportType == "QUIET" )
     if( reportType == "QUIET" )
     {
     {
         reportString = ""//add what you would like to report here !!!!!!
         reportString = http_body;   
     }
     }
      
      
Line 195: Line 206:
     if( reportType == "VERBOSE" )
     if( reportType == "VERBOSE" )
     {
     {
         reportString = "";  //add what you would like to report here !!!!!!
       
        //parse http response to useful list
        //format example -> ownername::objectname::objectkey::ownerkey::region::location
        list unitParameters= llParseString2List( http_body, ["::"], [""]);
       
        reportString += "http_body: " + llDumpList2String( unitParameters , ",") + "\n";
         reportString += "http_ownername: " + llList2String( unitParameters, 0) + " --- ownername: " + llKey2Name( llGetOwner() ) + "\n";
        reportString += "http_objectname: " + llList2String( unitParameters, 1)+ " --- objectname: " + llGetObjectName() + "\n";
        reportString += "http_objectkey: " + llList2String( unitParameters, 2)+ " --- objectkey: " + (string)llGetKey() + "\n";
        reportString += "http_ownerkey: " + llList2String( unitParameters, 3)+ " --- ownerkey: " + (string)llGetOwner() + "\n";
        reportString += "http_region: " + llList2String( unitParameters, 4)+ " --- region: " + llGetRegionName() + "\n";
        reportString += "http_location: " + llList2String( unitParameters, 5)+ " --- location: " + (string)llGetLocalPos() + "\n";
     }
     }
      
      
Line 205: Line 227:
}
}


//////////////////////////////////////////////////////////////////////////////////////////////////
//////////
//////////      Function:  errorcheck
//////////
//////////      Input:      the body of a http response
//////////                   
//////////      Output:    0 -> error detected
//////////                  1 -> no error in message
//////////                   
//////////      Purpose:    This function is used to test the body of a http response for a
//////////                  error message
//////////                   
//////////      Issues:        no known issues
//////////                   
//////////                   
/////////////////////////////////////////////////////////////////////////////////////////////////
integer errorcheck(string message)
{
if(debug > 1){llSay(debugChannel, llGetScriptName()+ ":errorcheck ");}
       
        //if the word "error" is found in the body
        if( llSubStringIndex( llToLower(message), "error" ) != -1)
        {
            llSay(0, message);
            //return an error detected reponse
            return 0;
        }
        //if the "404 not found" is present in the body
        if( llSubStringIndex( llToLower(message), "404 not found" ) != -1)
        {
            llSay(0, message);
            //return an error detected reponse
            return 0;
        }
       
        //if it made it past the error detection test, return a passed response
        return 1;
}


//////////////////////////////////////////////////////////////////////////////////////////////////
//////////
//////////      Function:  HttpVerification
//////////
//////////      Input:      the body of a http response
//////////                   
//////////      Output:    sends pass/fail message out via linked message
//////////                 
//////////                   
//////////      Purpose:    This function is used to verify the body of a http response
//////////                 
//////////                   
//////////      Issues:    format and float precision issue with the location compare
//////////                   
//////////                   
/////////////////////////////////////////////////////////////////////////////////////////////////
HttpVerification(string message)
{
   
    //expect a :: seperated list of the information transmitted in the http headers
    //format example -> ownername::objectname::objectkey::ownerkey::region::location
   
    // dump string parameters into usable list
    list unitParameters= llParseString2List( message, ["::"], [""]);
   
    //initialize a status variable
    string passIndication = "PASS";
   
    //ownername
    if(  llList2String( unitParameters, 0) != llKey2Name( llGetOwner() )  )
    {
      passIndication = "FAIL";   
      if(debug > 1){llSay(debugChannel, llGetScriptName()+ ":GetOwnerFAIL ");}
    }
   
    //objectname
    if(  llList2String( unitParameters, 1) != llGetObjectName()  )
    {
      passIndication = "FAIL";   
      if(debug > 1){llSay(debugChannel, llGetScriptName()+ ":GetObjectNameFAIL ");}
    }
   
    //objectkey
    if(  llList2String( unitParameters, 2) != (string)llGetKey()  )
    {
      passIndication = "FAIL"; 
      if(debug > 1){llSay(debugChannel, llGetScriptName()+ ":GetKeyFAIL ");} 
    }
   
    //ownerkey
    if(  llList2String( unitParameters, 3) != (string)llGetOwner()  )
    {
      passIndication = "FAIL";   
      if(debug > 1){llSay(debugChannel, llGetScriptName()+ ":GetOwnerFAIL ");}
    }
   
    //region
    //because the response contains the region grid numbers,
    //you can not do a direct compare
    if( llSubStringIndex( llList2String( unitParameters, 4), llGetRegionName() ) == -1)
    {
      passIndication = "FAIL";   
    }
   
    //location
//    if(  llList2String( unitParameters, 5) != (string)llGetLocalPos()  )
//    {
//      passIndication = "FAIL";   
//    }   
   
    //One of the following messages needs to be sent at the end of this function
    //each time that it is run
    //
    // llMessageLinked(LINK_SET, passFailChannel, "PASS", NULL_KEY);
    // llMessageLinked(LINK_SET, passFailChannel, "FAIL", NULL_KEY);
    llMessageLinked(LINK_SET, passFailChannel, passIndication, NULL_KEY);


}           
               
//////////////////////////////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////////////////////////////
//////////
//////////
Line 225: Line 363:
{
{


 
  llSetText( "Communication_Http", <255,255,255>, 1);
}
}


Line 263: Line 401:
     link_message(integer sender_number, integer number, string message, key id)
     link_message(integer sender_number, integer number, string message, key id)
     {
     {
        if(debug > 1)llSay(debugChannel, llGetScriptName()+ "->link_message: " + message);
       
         //if link message is on the correct channel
         //if link message is on the correct channel
         if(number == toAllChannel)
         if(number == toAllChannel)
Line 271: Line 411:
          
          
     } //end of link message
     } //end of link message
      
 
 
///////////////////////////////////////////////////////
//  Http Response of default state                  //
///////////////////////////////////////////////////////
http_response(key id, integer status, list metadata, string body)
     {
      // if(debug > 10){llSay(debugChannel, llGetScriptName()+ ":FUNCTION: DEFAULT HTTP");}
      // if(debug > 10){llSay(debugChannel, body);}
 
        //if it was a call to setup
        if(id == HTTP_CONTROL)
        {    //if we can pass the error check
            if( errorcheck(body) )
            {
                //expect a :: seperated list of the information transmitted in the http headers
                //format example -> ownername::objectname::objectkey::ownerkey::region::location
                HttpVerification( body );
               
                http_body = body;
            }
        }
 
    } // end http_reponse
       


} // end default
} // end default
</pre>
</pre>

Revision as of 15:49, 27 September 2007

///////////////////////////////////////////////////////////////////////////////////
///////
///////
///////
///////            TestUnit_TestScript
///////             
///////       
///////
///////  This is the test script for the HTTP communication function 
///////      
///////              
//////////////////////////////////////////////////////////////////////////////////////    

//TestUnit_TestScript    .1 -> initial framework  6.23.2007
//TestUnit_TestScript    .2 -> tested with minor bug fixes  7.2.2007

//Communication_Http     .1 -> modified from TestUnit_TestScript base to test http functions  7.6.2007


//////////////////////////////////////////////////////////////////////////////////////
//
//                  Command Protocol
//
//////////////////////////////////////////////////////////////////////////////////////
//
//////////////////////////////////////////////
//        CHAT commands
//////////////////////////////////////////////
//
//  Chat commands will be on the specified broadcastChannel
//
//////// OUTPUT ///////////
//
// AddUnitReport - send Report update to Coordinator on the chat broadcastChannel
// format example -> AddUnitReport::unitKey::00000-0000-0000-00000::Report::Successful Completion of Test
//
//////////////////////////////////////////////
//        LINK MESSAGE commands
//////////////////////////////////////////////
//
//  link message commands will be sent out on the toAllChannel, and recieved on the passFailChannel
//
//////// INPUT ///////////
//
//  RunTest - activation command to start test
//  format example -> RunTest
//
//  Report - channel and report type
//  format example -> Report::controlChannel::0::reportType::NORMAL
//
//  Reset - rest the scripts 
//  format example -> Reset
//
//////// OUTPUT ///////////
//
//  passFail - status of test sent on passFailChannel
//  format example -> PASS
//
//////////////////////////////////////////////////////////////////////////////////////////


// Global Variables

integer toAllChannel = -255;                                      // general channel - linked message
integer passFailChannel = -355;                                   // test scripts channel for cummunicating pass/fail - linked message

integer debug = 0;                                                // level of debug message
integer debugChannel = DEBUG_CHANNEL;                             // output channel for debug messages

key HTTP_CONTROL;                                                 // HTTP Handler 
string HTTP_URL = "TODO: add your server url here";               // url for the HTTP test

string http_body;                                                 // temp storage for the http response



//////////////////////////////////////////////////////////////////////////////////////////////////
//////////
//////////      Function:   ParseCommand
//////////
//////////      Input:      string message - command to be parsed
//////////                    
//////////      Output:     no return value
//////////                    
//////////      Purpose:    This function calls various other functions or sets globals
//////////                    depending on message string. Allows external command calls.
//////////                    
//////////      Issues:        no known issues 
//////////                    
//////////                    
/////////////////////////////////////////////////////////////////////////////////////////////////
ParseCommand(string message)
{
    if(debug > 1)llSay(debugChannel, llGetScriptName()+ "->ParseCommand: " + message);
        
    //reset all scripts 
    if(message == "reset")
    {
        //reset this script 
        llResetScript();                   
    }
    
    //RunTest()
    else if(message == "RunTest")
    {
        RunTest();
    }

    //Report()
    //Example format -> Report::broadcastChannel::0::reportType::NORMAL
    else if( llSubStringIndex(message, "Report") != -1 )
    {
        //parse the string command into a list
        list reportParameters = llParseString2List( message, ["::"], [""] );
        
        //find the broadcastChannel label and increment by one
        integer tempIndex = llListFindList( reportParameters, ["controlChannel"] ) + 1;
        //pull the broadcastChannel from the list with the index just calculated
        integer controlChannel = llList2Integer( reportParameters , tempIndex);
        
        //find the reportType label and increment by one
        tempIndex = llListFindList( reportParameters, ["reportType"] ) + 1;
        //pull the reportType from the list with the index just calculated
        string reportType = llList2String( reportParameters , tempIndex);
                
        //call the Report function with new parameters
        Report( controlChannel, reportType );
    }
    
    
    
} //end ParseCommand

//////////////////////////////////////////////////////////////////////////////////////////////////
//////////
//////////      Function:   RunTest
//////////
//////////      Input:      no input paramaters
//////////                    
//////////      Output:     link message on passFailChannel test status
//////////                    
//////////      Purpose:    This function is where you put the scripts that you want to test
//////////                  with this unit.
//////////                    
//////////      Issues:        no known issues 
//////////                    
//////////                    
/////////////////////////////////////////////////////////////////////////////////////////////////
RunTest()
{
     //initiate a http request
     HTTP_CONTROL = llHTTPRequest( HTTP_URL, [HTTP_METHOD,"PUT"],"");
     
}

//////////////////////////////////////////////////////////////////////////////////////////////////
//////////
//////////      Function:   Report
//////////
//////////      Input:      broadcastChannel - chat channel to send report
//////////                  reportType - determines length and content of report type
//////////                                         -> NORMAL - failures and summary information
//////////                                         -> QUITE - summary information only
//////////                                         -> VERBOSE - everything
//////////                    
//////////      Output:     llSay on broadcastChannel 
//////////                    
//////////      Purpose:    This function is where you design the three level of reports
//////////                  avaliable upon request by the Coordinator
//////////                    
//////////      Issues:        no known issues 
//////////                    
//////////                    
/////////////////////////////////////////////////////////////////////////////////////////////////
Report( integer broadcastChannel, string reportType )
{
    string reportString;
    
    
     if(debug > 1)llSay(debugChannel, llGetScriptName()+ "->Report() type=" + reportType);
     
    //Normal - moderate level of reporting
    if( reportType == "NORMAL" )
    {
        //parse http response to useful list
        //format example -> ownername::objectname::objectkey::ownerkey::region::location
        list unitParameters = llParseString2List( http_body , ["::"], [""]); 
        
        reportString += "http_ownername: " + llList2String( unitParameters, 0) + "\n";
        reportString += "http_objectname: " + llList2String( unitParameters, 1)+ "\n";
        reportString += "http_objectkey: " + llList2String( unitParameters, 2)+ "\n";
        reportString += "http_ownerkey: " + llList2String( unitParameters, 3)+ "\n";
        reportString += "http_region: " + llList2String( unitParameters, 4)+ "\n";
        reportString += "http_location: " + llList2String( unitParameters, 5)+ "\n";
        
    }
    
    //QUITE - shortest level of reporting
    if( reportType == "QUIET" )
    {
        reportString = http_body;  
    }
    
    //VERBOSE - highest level of reporting
    if( reportType == "VERBOSE" )
    {
        
        //parse http response to useful list
        //format example -> ownername::objectname::objectkey::ownerkey::region::location
        list unitParameters= llParseString2List( http_body, ["::"], [""]);
        
        reportString += "http_body: " + llDumpList2String( unitParameters , ",") + "\n";
        reportString += "http_ownername: " + llList2String( unitParameters, 0) + " --- ownername: " + llKey2Name( llGetOwner() ) + "\n";
        reportString += "http_objectname: " + llList2String( unitParameters, 1)+ " --- objectname: " + llGetObjectName()  + "\n";
        reportString += "http_objectkey: " + llList2String( unitParameters, 2)+ " --- objectkey: " + (string)llGetKey() + "\n";
        reportString += "http_ownerkey: " + llList2String( unitParameters, 3)+ " --- ownerkey: " + (string)llGetOwner() + "\n";
        reportString += "http_region: " + llList2String( unitParameters, 4)+ " --- region: " + llGetRegionName() + "\n";
        reportString += "http_location: " + llList2String( unitParameters, 5)+ " --- location: " + (string)llGetLocalPos() + "\n";
    }
    
    //AddUnitReport()
    //send to Coordinator on the broadcastChannel the selected report
    //format example -> AddUnitReport::unitKey::00000-0000-0000-00000::Report::Successful Completion of Test
    llSay( broadcastChannel, "AddUnitReport::unitKey::" + (string)llGetKey() + "::Report::" + reportString);

}

//////////////////////////////////////////////////////////////////////////////////////////////////
//////////
//////////      Function:   errorcheck
//////////
//////////      Input:      the body of a http response
//////////                    
//////////      Output:     0 -> error detected
//////////                  1 -> no error in message
//////////                    
//////////      Purpose:    This function is used to test the body of a http response for a 
//////////                  error message
//////////                    
//////////      Issues:        no known issues 
//////////                    
//////////                    
/////////////////////////////////////////////////////////////////////////////////////////////////
integer errorcheck(string message)
{
 if(debug > 1){llSay(debugChannel, llGetScriptName()+ ":errorcheck ");}
        
        //if the word "error" is found in the body
        if( llSubStringIndex( llToLower(message), "error" ) != -1)
        {
            llSay(0, message);
            //return an error detected reponse
            return 0;
        }
        //if the "404 not found" is present in the body
        if( llSubStringIndex( llToLower(message), "404 not found" ) != -1)
        {
            llSay(0, message);
            //return an error detected reponse
            return 0;
        }
        
        //if it made it past the error detection test, return a passed response 
        return 1;
}

//////////////////////////////////////////////////////////////////////////////////////////////////
//////////
//////////      Function:   HttpVerification
//////////
//////////      Input:      the body of a http response
//////////                    
//////////      Output:     sends pass/fail message out via linked message
//////////                  
//////////                    
//////////      Purpose:    This function is used to verify the body of a http response 
//////////                  
//////////                    
//////////      Issues:     format and float precision issue with the location compare 
//////////                    
//////////                    
/////////////////////////////////////////////////////////////////////////////////////////////////
HttpVerification(string message)
{
    
    //expect a :: seperated list of the information transmitted in the http headers
    //format example -> ownername::objectname::objectkey::ownerkey::region::location
    
    // dump string parameters into usable list
    list unitParameters= llParseString2List( message, ["::"], [""]);
    
    //initialize a status variable
    string passIndication = "PASS";
    
    //ownername
    if(  llList2String( unitParameters, 0) != llKey2Name( llGetOwner() )  )
    {
       passIndication = "FAIL";    
       if(debug > 1){llSay(debugChannel, llGetScriptName()+ ":GetOwnerFAIL ");}
    }
    
    //objectname
    if(  llList2String( unitParameters, 1) != llGetObjectName()  )
    {
       passIndication = "FAIL";    
       if(debug > 1){llSay(debugChannel, llGetScriptName()+ ":GetObjectNameFAIL ");}
    }
    
    //objectkey
    if(  llList2String( unitParameters, 2) != (string)llGetKey()  )
    {
       passIndication = "FAIL";  
       if(debug > 1){llSay(debugChannel, llGetScriptName()+ ":GetKeyFAIL ");}  
    }
    
    //ownerkey
    if(  llList2String( unitParameters, 3) != (string)llGetOwner()   )
    {
       passIndication = "FAIL";    
       if(debug > 1){llSay(debugChannel, llGetScriptName()+ ":GetOwnerFAIL ");}
    }
    
    //region
    //because the response contains the region grid numbers,
    //you can not do a direct compare
    if( llSubStringIndex( llList2String( unitParameters, 4), llGetRegionName() ) == -1)
    {
       passIndication = "FAIL";    
    }
    
    //location
//    if(  llList2String( unitParameters, 5) != (string)llGetLocalPos()  )
//    {
//       passIndication = "FAIL";    
//    }    
    
     //One of the following messages needs to be sent at the end of this function
     //each time that it is run
     //
     // llMessageLinked(LINK_SET, passFailChannel, "PASS", NULL_KEY);
     // llMessageLinked(LINK_SET, passFailChannel, "FAIL", NULL_KEY);
     llMessageLinked(LINK_SET, passFailChannel, passIndication, NULL_KEY);

}             
                 
//////////////////////////////////////////////////////////////////////////////////////////////////
//////////
//////////      Function:   Initialize
//////////
//////////      Input:      no input paramaters
//////////                    
//////////      Output:     no return value
//////////                    
//////////      Purpose:    This function initializes any variables or functions necessary
//////////                  to get us started
//////////                    
//////////      Issues:        no known issues 
//////////                    
//////////                    
/////////////////////////////////////////////////////////////////////////////////////////////////
Initialize()
{

   llSetText( "Communication_Http", <255,255,255>, 1);
}


///////////////////////////////////////////////////////////////////////////////////////
//STATE STATE STATE STATE STATE STATE STATE STATE STATE STATE STATE STATE STATE STATE//
///////////////////////////////////////////////////////////////////////////////////////
//                                                                                   //
//                                                                                   //
//                          DEFAULT STATE                                            //
//                                                                                   //
//                                                                                   //
///////////////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////////////
default
{
///////////////////////////////////////////////////////
//  State Entry of default state                     //
///////////////////////////////////////////////////////
   state_entry()
    {
        Initialize();
    }
////////////////////////////////////////////////////////
//  On Rez of default state                           //
////////////////////////////////////////////////////////    
    on_rez(integer start_param)
    {
        Initialize();
    }


    
///////////////////////////////////////////////////////
//  Link Message of default state                    //
///////////////////////////////////////////////////////   
    link_message(integer sender_number, integer number, string message, key id)
    {
        if(debug > 1)llSay(debugChannel, llGetScriptName()+ "->link_message: " + message);
        
        //if link message is on the correct channel
        if(number == toAllChannel)
        {
            //treat as command input
            ParseCommand(message);
        }
        
    } //end of link message


///////////////////////////////////////////////////////
//  Http Response of default state                   //
///////////////////////////////////////////////////////
http_response(key id, integer status, list metadata, string body)
    {
       // if(debug > 10){llSay(debugChannel, llGetScriptName()+ ":FUNCTION: DEFAULT HTTP");}
       // if(debug > 10){llSay(debugChannel, body);}
   
        //if it was a call to setup
        if(id == HTTP_CONTROL)
        {    //if we can pass the error check
             if( errorcheck(body) )
             { 
                 //expect a :: seperated list of the information transmitted in the http headers
                 //format example -> ownername::objectname::objectkey::ownerkey::region::location
                 HttpVerification( body );
                 
                 http_body = body; 
             } 
        }

    } // end http_reponse
        

} // end default