blob: 8c8a846a0f3f230fa976607f490c59851db64ad7 [file] [log] [blame]
#include "AxisBench.hpp"
#include <iostream>
#include <time.h>
#ifndef WIN32
#include "sys/time.h"
#else
#include "sys/timeb.h"
#endif
#include <stdlib.h> // For malloc(), calloc(), strdup() and free()
#include <iostream>
// Bug in MS Visual C++ 6.0. Fixed in Visual C++ .Net version.
// Cannot print an __int64 number with cout without this overloading
std::ostream & operator << (std::ostream & os, __int64 i)
{
char buf[20];
sprintf( buf, "%I64d", i);
os << buf;
return os;
}
#define WSDL_DEFAULT_ENDPOINT "http://localhost:80/axis/bench"
static char * asciiToString( char * string);
static void usage( char * programName, char * defaultURL)
{
cout << "Usage:" << endl
<< programName << " [-? | service_url] " << endl
<< " -? Show this help." << endl
<< " service_url URL of the service." << endl
<< " Default service URL is assumed to be " << defaultURL << endl;
}
int main( int argc, char * argv[])
{
char endpoint[256];
int returnValue = 1; // Assume Failure
bool bSuccess = false;
int iRetryIterationCount = 3;
AxisBench * ws = NULL;
BenchDataType * input = NULL;
BenchDataType * output = NULL;
sprintf( endpoint, "%s", WSDL_DEFAULT_ENDPOINT);
if( argc > 1)
{
// Watch for special case help request
// Check for - only so that it works for
//-?, -h or --help; -anything
if( !strncmp( argv[1], "-", 1))
{
usage( argv[0], endpoint);
return 2;
}
sprintf( endpoint, argv[1]);
}
do
{
try
{
int request = 1;
input = new BenchDataType();
ws = new AxisBench( endpoint, APTHTTP1_1);
input->setcount( (xsd__int) 10);
BenchBasicDataType ** ppBBDT = new BenchBasicDataType* [input->getcount()];
BenchBasicDataType_Array arrayIn;
#ifdef WIN32
__int64 ll = 10000;
#else
long long ll = 10000;
#endif
time_t tim;
tim = 1100246323;
struct tm * temp = gmtime( &tim);
struct tm lt;
memcpy( &lt, temp, sizeof( struct tm));
xsd__unsignedByte * buffer = (xsd__unsignedByte *) calloc( 1, input->getcount() + 2);
strcpy( (char *) buffer, "A");
for( int i = 0; i < (int) input->getcount(); i++)
{
BenchBasicDataType * type = new BenchBasicDataType();
type->StringType = "StringType";
type->IntegerType = 10 * (i + 1);
type->DoubleType = 11.111 * (i + 1);
type->BooleanType = true_;
type->DateTimeType = lt;
type->TimeType = lt;
type->DateType = lt;
type->IntType = (i + 1);
type->ByteType = '1';
type->DecimalType = 10 * (i + 1);
type->FloatType = (float) ((float) (11 * (i + 1)) / (float) 2.0);
type->LongType = ll;
type->QNameType = "toto";
type->ShortType = (i + 1);
type->Base64BinaryType.set( (xsd__unsignedByte *) buffer, (xsd__int) i);
type->HexBinary.set( (xsd__unsignedByte *) buffer, (xsd__int) i);
*ppBBDT = type;
ppBBDT++;
if( ll == 0)
{
ll = 1;
}
else
{
ll += 10000;
}
strcat( (char *) buffer, "A");
}
arrayIn.set( ppBBDT, (int) input->getcount());
input->setinfos( &arrayIn);
int t1;
int t2;
#ifndef WIN32
struct timeval mstart;
struct timeval mstop;
gettimeofday( &mstart, NULL);
#else
struct timeb mstart;
struct timeb mstop;
ftime( &mstart);
#endif
ws->setTransportProperty ("SOAPAction", "AxisBench#doBenchRequest");
for( int ii = 0; ii < request; ii++)
{
if( output)
{ // Samisa: memory management BP
int outputSize = 0;
BenchBasicDataType ** outArray = output->infos->get( outputSize);
for( int i = 0; i < outputSize; i++)
{
delete outArray[i];
}
delete output;
output = NULL;
}
output = ws->doBenchRequest( input);
}
free( buffer);
#ifndef WIN32
gettimeofday( &mstop, NULL);
t1 = mstart.tv_sec * 1000 + mstart.tv_usec / 1000;
t2 = mstop.tv_sec * 1000 + mstop.tv_usec / 1000;
#else
ftime( &mstop);
t1 = mstart.time * 1000 + mstart.millitm;
t2 = mstop.time * 1000 + mstop.millitm;
#endif
int total = t2 - t1;
if( ws->getStatus () == AXIS_FAIL)
{
cout << "Failed" << endl;
}
else
{
char dateTime[50];
int i = 0;
bSuccess = true;
if (argc > 1)
{
i = output->count - 1;
}
cout << "Input Count : " << input->count << endl;
cout << "Count : " << output->count << endl;
for (; i < (int) output->getcount(); i++)
{
int outputSize = 0;
BenchBasicDataType ** outArray = output->infos->get( outputSize);
if( outArray[i] != NULL)
{
cout << " ----------------------------------------------" << endl;
cout << " StringType " << outArray[i]->StringType << endl;
cout << " IntType " << outArray[i]->IntType << endl;
// cout << " IntegerType " << outArray[i]->IntegerType << endl;
cout << " DoubleType " << outArray[i]->DoubleType << endl;
cout << " BooleanType " << outArray[i]->BooleanType << endl;
strftime(dateTime, 50, "%a %b %d %H:%M:%S %Y", &outArray[i]->DateTimeType);
cout << " DateTimeType " << dateTime << endl;
strftime(dateTime, 50, "%a %b %d %Y", &outArray[i]->DateType);
cout << " DateType " << dateTime << endl;
// This is being removed due to problem in some servers.
// See XSDTime or XSDTimeNil testcases for full validation of the xsd:time type
// strftime(dateTime, 50, "%H:%M:%S", &output->infos.m_Array[i]->TimeType);
// cout << " TimeType " << dateTime << endl;
// Following check for os/400 - the mock server will return ascii char which needs to be converted
#ifdef __OS400__
if( outArray[i]->ByteType == 0x31)
outArray[i]->ByteType = '1';
#endif
cout << " ByteType " << outArray[i]->ByteType << endl;
cout << " DecimalType " << outArray[i]->DecimalType << endl;
cout << " FloatType " << outArray[i]->FloatType << endl;
// cout << " LongType " << outArray[i]->LongType << endl;
cout << " QNameType " << outArray[i]->QNameType << endl;
cout << " ShortType " << outArray[i]->ShortType << endl;
int size = 0;
xsd__unsignedByte * base64BinaryData = outArray[i]->Base64BinaryType.get( size);
cout << " Base64BinaryType " << size << endl;
if( size > 0)
{
cout << " Base64BinaryType " << asciiToString( (char *)base64BinaryData) << endl;
}
size = 0;
xsd__unsignedByte * hexBinaryData = outArray[i]->HexBinary.get(size);
cout << " HexBinaryType " << size << endl;
if( size > 0)
{
cout << " HexBinaryType " << asciiToString( (char *) hexBinaryData) << endl;
}
}
}
returnValue = 0;
}
}
catch (AxisException & e)
{
bool bSilent = false;
if( e.getExceptionCode () == CLIENT_TRANSPORT_OPEN_CONNECTION_FAILED)
{
if( iRetryIterationCount > 1)
{
bSilent = true;
}
}
else
{
iRetryIterationCount = 0;
}
if( !bSilent)
{
cout << "Exception : " << e.what () << endl;
}
}
catch( ...)
{
cerr << "Unknown Exception occured." << endl;
}
// make sure we clean up memory allocated
try
{
delete ws;
delete input;
if( output)
{
delete output;
}
}
catch( AxisException & e)
{
cerr << e.what() << endl;
}
catch( exception & e)
{
cout << "Exception : " << e.what () << endl;
}
catch (...)
{
cout << "Unknown exception on clean up: " << endl;
}
iRetryIterationCount--;
}
while (iRetryIterationCount > 0 && !bSuccess);
cout <<
"---------------------- TEST COMPLETE -----------------------------"
<< endl;
printf ("successful \n");
return returnValue;
}
static char * asciiToString( char * string)
{
char * pch = string;
if( string == NULL)
{
return NULL;
}
/* while not EOL... */
while( *pch != '\0')
{
pch++;
}
return string;
}