Wednesday, 26 March 2014

What is 90 percentile?

What is 90 percentile?

90 percentile is average of 90% of the response times, here arrange the 100 response times from good to bad then eliminate the worst 10% of the response times. Then calculate the average for 90% of the response times.

Example: The response times for an application for 10 users is
2,4,3,8,9,16,6,8,3,10 then arrange them from Good to bad 

2,3,3,4,6,8,8,9,10,16 

Then take the average for 90% of the response times 2,3,3,4,6,8,8,9,10 (eliminate the 16) is 5.88.
Overall (100%) response time is 10.94 

Why 90 percentile required:-
End users need to satisfy with the application response time / speed. Then users should increase other wise users won't use that application. For satisfaction calculation purpose Performance testers uses the 90 percentile. Means 90% of the users satisfying with that response time, remaining 10% users not satisfying with that response times.

What is concurrent users and simultaneous users ?

What is concurrent users and simultaneous users ?

For example,  bank application has below transactions     
                      1. Login                          
                      2. Account summary                      
 ---------------------------Transfer money Action ---------                          
                      3. Click Transfer funds                         
                      4. Select "Beneficiary"                          
                       5. Enter "Amount"                          
                       6. Transfer                           
                       7. Enter "User id" and  Password and click "Confirm"--------------------------------------Transfer Money Action end--------                           
                         8.Log out

So we have 8 transaction for this application and we have one Action (Transfer Money is one action but in that action you can have 5 transaction).

Concurrency : Performing same activity at a time by all users.Mean 100 users are login into the application at a time. But simultaneous users are login into the application one by one. Concurrency has various levels

           1.Transaction concurrency          
           2.Business Process Concurrency           
           3.Application Concurrency 

Transaction concurrency :

We need to test the application with 100 concurrent users, Means "All users(100 users) should perform the same transaction (login or   Account summary .... or  Logout) at a time" this is called transaction level concurrency.

Business Process Concurrency:

We need to test the application with 100 concurrent users for Transfer money Business action, means  "All users(100 users) should perform the same Transfer money action (here may be 30 users are clicking "transfer funds, 20 users are on selecting "Beneficiary", 20 users are in enter "Amount" page,10 users are in "Transfer" page  and 20 users are Enter "User id" and  Password and click "Confirm" ). 
Overall 100 users should be in transfer money action.

Application Concurrency :

All 100 users should perform different transaction or same transaction but at any time 100 user should be accessing the application.

Simultaneous users All 100 users are login into the application one by one.

Web_find and web_image_check function example and Usage

Web_find and Web_Image_check function are used to find the specified text in the response of the HTML page. This function is only support in HTTP/HTML protocol based script. You should need to make sure that do the following changes in the run time settings before you use these two functions.

Go to Vuser -> Run-time Settings
Go to internet Protocol -> Preferences
Select the “Enable Image and Text Check” check box.
Web_find and web_image_check  will throw an error if the text or image does not found in the response.
For example if you want to set error when some text found. Then use the following example.

Example:
web_reg_find("Text=404", "Fail=Found", LAST);

If you do not want to throw an error regardless of the condition then use web_reg_save_param function with "Notfound=warning" option.

Example:

web_reg_save_param("NameCheck", "LB=Hi", "RB=Welcome to Loadrunner","Notfound=warning", LAST);

Web_find and web_image_check do not give the number of occurrences of the text/image. To find this we can use web_reg_find function. In web_reg_find we have “Save Count” option with this we can find out the totoal number of occurrences of text/image. web_find and web_image_check is only for  HTTP/HTML scripts. web_reg_find can be used with both  HTTP/HTML and URL based scripts.

Example:

web_reg_find("Text=loadrunner", "SaveCount=loadrunner_count", LAST);

lr_continue_on_error function and its usage in Loadrunner


In Vugen if an error is detected the vugen automatically stops the execution. But sometimes the script need to be continued even if the script fails. This can be achieved in the following way.

By using  Run-Tiime Settings:

Go to Vuser -> Run Time Settings -> Miscellaneous.

In Miscellaneous go to Error Handling and select Continue on Error. These setting applies to all the script including vuser_init and vuser_end.

By Using  lr_continue_on_error:

By using lr_continue_on_error function we can include a portion of the script instead of whole script. We need to enclose the requests that we are getting error in between lr_continue_on_error(1) and lr_continue_on_error(0)
lr_continue_on_error(1); web_url("Google", "URL=http://www.google.com/", "TargetFrame=", "TargetBrowser=Google ", "Resource=0", "RecContentType=text/html", "Snapshot=t1.inf", "Mode=HTML", LAST ); lr_continue_on_error(0);
Controller Settings:

The way in which Loadrunner executes continue on error is different from protocol to protocol. For web protocol when the error comes it jumps to the next iteration when continue on error is turned off and for other protocols like DBA and ORACLE_NCA the vuser jumps to the vuser_end section and terminates the execution and it will not continue to the next iteration.

There are situation where we need to maintain constant load on the server. In this situation when the vuser terminates because of some error in the controller. We have two options.
  1. Select the goal oriented scenario and select the number of vusers to be maintained as scenario goal. This will make sure that a vuser is added to the scenario as soon as the vuser is terminated because of some error.
  2. If vuser is failed in manual scenario. The failed Vusers can be restarted from the vuser window in the controller.

Tuesday, 25 March 2014

How to find out Memory Leak in an application?

How to find out Memory Leak in an application?

There are many reasons for memory leak and being a tester its tough to find exact reason. The basic thing we need to understand what is memory leak? How it occurs?
Memory leak can be defined as the un-allocated space in a system which was used by a program and after  use it was never returned to the operating system. This un-allocated (unused memory) can cause shortage of memory and may crash the entire system.

There are few steps which may help to find out memory leak in  a system:
  1. We can monitor the memory graph by using perfmon and check if the memory utilization is keep on increasing and remain at peak even without any load, it shows the memory that was used while executing the program is still in use even the program doesn't needs it. The un-managed code is not efficient enough to release the memory and free it after use, which may cause out of memory issue.
  2. You can check the throughput graph while load testing and if there is sudden spike in it then it can be one of the reason for memory leak. But we can't assure the spike in graph is because of memory leak, the other reason could be due to network traffic, data base connectivity issue etc.
  3. We have GC to collect all the un-allocated space and return it to system, it has some limitations:
  • In a manually managed memory environment: Memory is dynamically allocated and referenced by a pointer. The pointer is erased before the memory is freed. After the pointer is erased, the memory can no longer be accessed and therefore cannot be freed.
  • In a dynamically managed memory environment: Memory is disposed of but never collected, because a reference to the object is still active. Because a reference to the object is still active, the garbage collector never collects that memory. This can occur with a reference that is set by the system or the program.
  • In a dynamically managed memory environment: The garbage collector can collect and free the memory but never returns it to the operating system. This occurs when the garbage collector cannot move the objects that are still in use to one portion of the memory and free the rest.
  • In any memory environment: Poor memory management can result when many large objects are declared and never permitted to leave scope. As a result, memory is used and never freed.

Monitor Tomcat with user data

Monitor Tomcat with user data:-

lr_start_transaction("monitor tomcat");
 
/*
<h1>JVM</h1><p> Free memory: 130.99 MB Total memory: 254.18 MB Max memory: 1016.12 MB</p>
*/
 
web_reg_save_param("JVMFreeMemory",
 "LB=Free memory: ",
 "RB= MB",
 "Ord=1",
 LAST);
 
web_reg_save_param("JVMTotalMemory",
 "LB=Total memory: ",
 "RB= MB",
 "Ord=1",
 LAST);
 
web_reg_save_param("JVMMaxMemory",
 "LB=Max memory: ",
 "RB= MB",
 "Ord=1",
 LAST);
 
web_reg_find("Text=/manager", 
 LAST);
 
web_url("status", 
 "URL=http://{ServerName}/manager/status", 
 "Resource=0", 
 "RecContentType=text/html", 
 "Referer=", 
 "Snapshot=t1.inf", 
 "Mode=HTTP", 
 LAST);
 
lr_end_transaction("monitor tomcat", LR_AUTO);
 
// Tomcat JVM metrics
lr_user_data_point("Tomcat JVM Free memory", atof(lr_eval_string("{JVMFreeMemory}")));
lr_user_data_point("Tomcat JVM Total memory", atof(lr_eval_string("{JVMTotalMemory}")));
lr_user_data_point("Tomcat JVM Max memory", atof(lr_eval_string("{JVMMaxMemory}")));

LR - Script - Choose Val in Popup choice

LR - Script - Choose Val in Popup choice:-

choose_val(char* buf, char* LB, char* RB, char* val)
{
    int i, idx, lg_lb;
    char* p;
    char* pe;
    char* tab[500];

    p = buf;
    i=0;

    lg_lb = strlen(LB);

    while( i<500 && (p=(char*)strstr(p, LB)) != NULL ){
        p += lg_lb;
        tab[i] = p;
        i++;
    }
    if( i > 0 ){
        idx = (rand() % i);
      
        p = tab[idx];
        pe = (char*) strstr(p, RB);
      
//        lr_error_message("i=%d idx=%d", i, idx);
        if( pe != NULL ){
            strncpy(val, p, pe-p);
            val[pe-p] = '\0';
            return 1;
        }else{
            return 0;
        }
    }
    else{
            return 0;
    }
}


===============================================================
Exemple d'utilisation
    web_reg_save_param( "applicants", "Notfound=warning", "LB/ic=<select name=\"cboApplicant\"", "RB/ic=</select>", "Ord=1", "Search=body", LAST );

    web_reg_save_param( "VIEWSTATE_1", "LB=__VIEWSTATE\" value=\"", "RB=\"", "Ord=1", "Search=Body", "RelFrameId=1", LAST );

    web_url("order_search.aspx",
        "URL={url_ecom}/OrderStatus/order_search.aspx",
        "TargetFrame=",
        "Resource=0",
        "RecContentType=text/html",
        "Referer={url_ecom}/Navigation/NavigMenu.htm",
        "Snapshot=t6.inf",
        "Mode=HTML",
        LAST);

    if( checkerr("Ebuy_OrdersManage") ) return rs;   

    lr_end_transaction("Ebuy_OrdersManage", LR_AUTO);

    rc_appli=choose_val(lr_eval_string("{applicants}"), "value=\"","\"",applicant);

    if( rc_appli ){   

        lr_save_string(applicant,"applicant");
    ...
    } 

Analasys: If the scenario crashed or ended prematuerly then set "FullData=1" in the lrr file of the result folder:

First, try the Collate option: Controller -> Results -> Collate Results. If this fails, then,

1. On the controller machine, go to Result -> Results setting to verify the result location.
2. Navigate to the result directory on the controller.3. Locate the file named remote_results.txt and open it in any word editor4. On remote_results.txt, you will see the location of the .eve file on remote host. For example
   MyHost=c:\temp\brr1\netdir\test\myhost_1.eve5. Go to that specific host, and copy of the .eve file to the controller machine's result directory.6. Reopen the Analysis result.

If the scenario crashed, or ended prematuerly then set "FullData=1" in the lrr file of the result folder:

1. Open the Result file ( .lrr) in notepad2. Search for the [Data Collection] section3. Create/modify the value or FullData to 1    Example:    [Data Collection]    FullData=1

This will help in cases that the result files ( *.eve) contains useful data but the Controller did not manage to write to the lrr that it has the data. FullData will be zero in this case. Setting it to 1 will enable you to view what data was saved.

If the result still failed to come up, it is very likely that the _t_rep.eve file in the controller is not completely generated. 

In order to save what can be saved, run the scenario again, for a short interval(5 mins) saving the results in a folder

 different than the old results folder. The _t_rep.eve file and the .lrr file in the new result directory need to be edited.

In the _t_rep.eve file there is a line (first one) which maybe something like this:

"28 11 1018300521 2 4627103 22735576 5481115"

# The 11 is the event code for start scenario.# The 1018300521 is the start time and it needs to be moved backward to match the beginning of the first load test.

The same must be done for the scenario start time specified in the .lrr file. For e*xample,[Scenario]Start_time=1018300521Put here the same number.After this replace the binary eve files(.eve or .gzl) from the new load test result with the ones collected from the Load Generators resulted from old scenario run. Now the results can be analyzed.

If the exact time of start of the first load test is not known. Select any start time that will definitely fall before the estimated start time of the original scenario. 

For eg; say 10000 seconds less than the one in the new load test. Make a few iteration until you find out what exactly was the first event's time.

Note:# The duration of scenario in the new result will not be accurate.# It is advised not to overwrite the old result directory in these cases since it consists of the summary data and the monitoring data created even before collation.

Flex Functions in Loadrunner Download

Flex Functions in Loadrunner Download

Function NameDescription
flex_loginLogs on to a password-protected Flex application.
flex_logoutLogs off of a password-protected Flex application.
flex_pingChecks if a Flex application is available.
flex_remoting_callInvokes one or more methods of server-side Remote objects (RPC).
flex_web_requestAllows you to create a custom HTTP request with any method supported by HTTP.
flex_rtmp_connectConnects a client to an RTMP server and sets connection options.
flex_rtmp_disconnectDisconnects a client from an RTMP server.
flex_rtmp_sendSends messages to an RTMP server.
flex_rtmp_receiveReceives responses from an RTMP server.
flex_rtmp_receive_streamReceives streaming data from an RTMP server.
flex_amf_callSends a Flex AMF request.
flex_amf_define_envelope_header_setDefines a set of Flex AMF envelope headers.
flex_amf_define_header_setDefines a set of Flex AMF headers.

LR Functions in Load runner with Examples.

LR Functions in Loadrunner with Examples.

lr_abortStops the script execution.
lr_advance_paramIt will take the next value in the parameter list.
lr_continue_on_errorContinue on error even if the request is failed.
lr_convert_string_encodingConverts a string to a UTF 8 or Unicode.
lr_db_dataset_actionValidates database contents by setting checkpoints.
lr_db_connectConnects to a database.
lr_db_dataset_actionPerforms an action on a dataset.
lr_db_disconnectDisconnects from a database.
lr_db_executeSQLStatementSubmits an SQL statement to a database.
lr_checkpointValidates the value of a parameter against an expected value (checkpoint).
lr_db_getValueRetrieves a value from a dataset.
lr_debug_messageSends a debug message to the LoadRunner output or Application Management agent log file.
lr_decryptDecrypts an encoded string.
lr_disable_ip_spoofingDisables IP Spoofing.
lr_enable_ip_spoofingEnables IP Spoofing.
lr_end_sub_transactionMarks the end of a sub-transaction.
lr_end_transactionMarks the end of a LoadRunner transaction.
lr_end_transaction_instanceMarks the end of a transaction instance.
lr_end_timerMarks the end of a sub-transaction.
lr_error_messageSends an error message to theLoadRunner output or Application Management agent log file..
lr_eval_stringReplaces a parameter with its current value.
lr_eval_string_extCreates a buffer and assigns it the input string after evaluating embedded parameters.
lr_eval_string_ext_freeFrees the buffer allocated by lr_eval_string_ext.
lr_exitExits from the script, action, or iteration.
lr_fail_trans_with_errorSets the status of open transactions to LR_FAIL and sends an error message.
lr_get_attrib_doubleReturns the value of a double type command line parameter.
lr_get_attrib_longReturns the value of a long integer type command line parameter.
lr_get_attrib_stringReturns a command line parameter string.
lr_get_debug_messageReturns the current message logging settings.
lr_get_host_nameReturns the name of the host executing the script.
lr_get_master_host_nameReturns the name of the machine running the LoadRunner Controller.
lr_get_transaction_durationGets the duration of a transaction by its name.
lr_get_transaction_statusGets the current status of a transaction.
lr_get_trans_instance_durationReturns the duration of a transaction by its name.
lr_get_trans_instance_statusReturns the current status of a transaction instance.
lr_get_trans_instance_think_timeGets the think time of a transaction instance specified by its handle.
lr_get_trans_instance_wasted_timeGets the wasted time of a transaction instance by its handle.
lr_get_transaction_think_timeGets the think time of a transaction by its name.
lr_get_transaction_wasted_timeGets the wasted time of a LaoadRunner transaction by its name.
lr_get_vuser_ipReturns the IP address of the current Vuser. Not applicable for products that do not run Vusers.
lr_load_dllLoads an external DLL.
lr_log_messageSends a message to the Vuser log file.
lr_messageSends a message to the output and log file.
lr_output_messageSends a message to the output and log file with location information.
lr_next_rowAdvances to the next row in the parameter data file.
lr_param_incrementIncrements the value of a numerical parameter
lr_param_sprintfWrites formatted output to a parameter.
lr_param_uniqueGenerates a unique string and assigns it to a parameter.
lr_paramarr_idxReturns the value of the parameter at a specified location in a parameter array.
lr_paramarr_lenReturns the number of elements in a parameter array.
lr_paramarr_randomReturns the value of the parameter at a random location in a parameter array
lr_peek_eventsChecks for events.
lr_rendezvousCreates a rendezvous point in the Vuser script.
lr_rendezvous_exSets a rendezvous point in a Vuser script.
lr_resume_transactionResumes the collection of transaction data.
lr_resume_transaction_instanceResumes collecting transaction instance data.
lr_save_datetimeSaves the date and time into a parameter.
lr_save_intSaves an integer to a parameter.
lr_save_searched_stringSearches for an occurrence of a string in a buffer and saves a portion of the buffer after that string to a parameter
lr_save_stringSaves a null-terminated string as a parameter.
lr_save_varSaves a variable length string as a parameter.
lr_set_debug_messageSets a message class for output messages.
lr_set_transactionCreate a transaction manually.
lr_set_transaction_instance_statusSets the status of a transaction instance.
lr_set_transaction_instance_statusSets the status of a transaction instance.
lr_set_transaction_statusSets the status of open transactions.
lr_set_transaction_status_by_nameSets the status of a transaction by its name.
lr_start_transactionMarks the start of a transaction and measures the response time of a transaction
lr_start_transaction_instanceMarks the beginning of a transaction instance
lr_start_sub_transactionMarks the beginning of a sub-transaction.
lr_stop_transactionHalts the collection of transaction data.
lr_stop_transaction_instanceStops collecting data for a transaction instance specified by its handle.
lr_think_timePauses execution between commands in a script.
lr_user_data_pointRecords a user-defined data sample.
lr_user_data_point_exRecords a user-defined data sample.
lr_user_data_point_instanceRecords a user-defined data sample and correlates it to a transaction instance.
lr_user_data_point_instance_exRecords a user-defined data sample and correlates it to a transaction instance.
lr_vuser_status_messageSends a message to the Vuser status area in the Controller.
lr_wasted_timeRemoves wasted time from all open transactions.
lr_whoamiReturns information about a Vuser executing the script

Web Functions in Loadrunner with Examples - Web Protocol in Loadrunner

Web Functions in Loadrunner with Examples - Web Protocol in Loadrunner

Function NameDescription
web_add_auto_filterSets criteria to include or exclude URLs when downloading
web_add_auto_headerAdds a customized header to all subsequent HTTP requests.
web_add_cookieAdds a new cookie or modifies an existing one.
web_add_cookie_exAdds a cookie with specified add behavior.
web_add_filterSets criteria to include or exclude URLs when downloading.
web_add_headerAdds a customized header to the next HTTP request.
web_cache_cleanupCleans the content of the cache simulator.
web_cleanup_auto_headersRemoves all previous customized headers from HTTP requests.
web_cleanup_cookiesRemoves all cookies currently stored by the Vuser.
web_concurrent_endMarks the end of a concurrent group.
web_concurrent_startMarks the beginning of a concurrent group.
web_convert_date_paramConverts a date string stored in a parameter to a different format.
web_convert_from_formattedConverts a string created with one or more data format extensions back to the source format.
web_convert_paramConverts an HTML parameter to a URL or text.
web_convert_to_formattedFormats data using one or more data format extensions.
web_custom_requestAllows you to create a custom HTTP request with any method supported by HTTP.
web_disable_keep_aliveDisables Keep-Alive HTTP connections.
web_dump_cacheSave the Vuser cache to a file.
web_enable_keep_aliveEnables Keep-Alive HTTP connections.
web_findSearches inside an HTML page for a specified text string.
web_get_int_propertyReturns specific information about the previous HTTP request.
web_global_verificationSearches for text string in all subsequent requests.
web_global_verification_pauseSuspends the specified checks set by web_global_verification.
web_global_verification_resumeResumes the specified checks suspended by web_global_pause.
web_imageEmulates a mouse click on the image defined by the attributes.
web_image_checkVerifies the presence of a specified image inside an HTML page.
web_load_cacheLoad the Vuser cache from a file.
web_linkEmulates a mouse click on the link that is defined by the attributes.
web_reg_add_cookieRegisters a search for a text string and adds a cookie if the text is found.
web_reg_cross_step_downloadRegisters a request to continue processing script steps without waiting for the server to terminate the response.
web_reg_findRegisters a search for a text string for the next Action function.
web_reg_save_paramDeprecated: Use web_reg_save_param_ex orweb_reg_save_param_xpath.Saves dynamic data from an HTML page to a parameter.
web_reg_save_param_exRegisters a request to save dynamic data located between specified boundaries to a parameter.
web_reg_save_param_regexpRegisters a request to save dynamic data that matches a regular expression to a parameter..
web_reg_save_param_xpathRegisters a request to find dynamic data in an HTML buffer that has been formatted as XML and save the data to a parameter.
web_remove_auto_filterRemoves a filter on download content.
web_remove_auto_headerStops adding a specific header to subsequent HTTP requests.
web_remove_cookieRemoves the specified cookie.
web_report_data_pointSpecifies a data point and adds it to the test results.
web_revert_auto_headerStops adding a specific header to subsequent HTTP requests, but generates Implicit headers.
web_save_headerSaves request and response headers to a variable.
web_save_param_lengthSaves the length of a parameter.
web_save_timestamp_paramSaves the current timestamp.
web_set_certificateCauses a script to use a specific certificate that is listed in the Internet Explorer registry.
web_set_certificate_exSpecifies location and format information of a certificate and key file.
web_set_max_html_param_lenSets the maximum length of retrieved dynamic HTML information.
web_set_max_retriesSets the maximum number of retries for an Action step.
web_set_optionSets a Web option.
web_set_proxySpecifies that all subsequent HTTP requests be directed to the specified proxy server.
web_set_proxy_bypassSpecifies the list of URLs that scripts access directly, i.e., not via the specified proxy server.
web_set_proxy_bypass_localSpecifies whether or not the proxy server should bypass local addresses.
web_set_secure_proxySpecifies that all secure HTTP requests be directed to the specified secure proxy server.
web_sjis_to_euc_paramConverts an SJIS string to EUC and assigns it to a parameter.
web_set_sockets_optionSets an option for secure sockets.
web_set_timeoutSpecifies the maximum amount of time that a script waits for a specified operation to be performed.
web_set_userSpecifies a login string for a Web server.
web_submit_dataPerforms an "unconditional" or "contextless" form submission.
web_submit_formPerforms a POST request; submits forms.
web_switch_net_layerSpecifies a network layer for replay. (WAP only)
web_urlPerforms a GET request; receives pages or images.

Sunday, 23 March 2014

lr advance param Function in Loadrunner with Example

This function is not recorded during recording. We manually insert this function whenever there is a need of it. lr_advance_param works depends upon the settings we give in parameter list (ctrl+L). lr_advance_param is like update value on each occurrence. Whenever we want to update a parameter value in the same iteration we use lr_advance_param.

For example when we want to use two parameters Google and Bing in one Iteration. Usually the Vugen takes the first value google and if we want to use the second value in the same iteration we use update value on each occurrence in the parameter settings. We can do the same using lr_advance_param function.
Example:

I have set following settings in Parameter

Select Next Row: Sequential
Update value on: Each Iteration

If we want to take the next value in the pramater list we use lr_advance_param as shown below.

Parameter Name: DomainName
Google
Bing
Yahoo
Ask

Vugen Script:

Action()
{
web_url("Google Home Page",
"URL=http://www.{DomainName}.com",            Here the parameter value is google.
"Resource=0",
"RecContentType=text/html",
"Mode=HTML",
LAST );

web_url("Google Home Page",
"URL=http://www.{DomainName}.com",          Here also the parameter value is google.
"Resource=0",
"RecContentType=text/html",
"Mode=HTML",
LAST );

lr_advance_param("DomainName");               We are using lr_advance_param here. so it will take bing now.

web_url("Bing Home Page",
"URL=http://www.{DomainName}.com",        So Here the parameter value is Bing.
"Resource=0",
"RecContentType=text/html",
"Mode=HTML",
LAST );

return 0;
}

Output:

Starting iteration 1.
Starting action Action.
web_url("Google Home Page") started                 [MsgId: MMSG-26355]
Redirecting "http://www.google.com" (redirection depth is 0)  [MsgId: MMSG-26694]
To location "http://www.google.co.in/?gws_rd=cr&ei=xnNKUq3RNYqKrgeGioCQAQ"    Found resource "http://www.google.co.in/images/icons/product/chrome-48.png" in HTML "http://www.google.co.in/?gws_rd=cr&ei=xnNKUq3RNYqKrgeGioCQAQ"
web_url("Google Home Page") was successful, 12754 body bytes, 1993 header bytes

web_url("Google Home Page") started                 [MsgId: MMSG-26355]
Redirecting "http://www.google.com" (redirection depth is 0)  [MsgId: MMSG-26694]
To location "http://www.google.co.in/?gws_rd=cr&ei=x3NKUresGoKVrAehnoDIAw"
Resource "http://www.google.co.in/images/icons/product/chrome-48.png" is in the cache already and will not be downloaded again
web_url("Google Home Page") was successful, 10928 body bytes, 1324 header bytes

Action.c(19): web_url("Bing Home Page") started            [MsgId: MMSG-26355]
Action.c(19): web_url("Bing Home Page") was successful, 13968 body bytes, 1130 header bytes
Ending action Action.
Ending iteration 1.