diff -r 000000000000 -r 8e480a14352b messagingfw/wappushfw/tpushscriptbased/t_utils/httptestutils.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/messagingfw/wappushfw/tpushscriptbased/t_utils/httptestutils.cpp Mon Jan 18 20:36:02 2010 +0200 @@ -0,0 +1,874 @@ +// Copyright (c) 2007-2009 Nokia Corporation and/or its subsidiary(-ies). +// All rights reserved. +// This component and the accompanying materials are made available +// under the terms of "Eclipse Public License v1.0" +// which accompanies this distribution, and is available +// at the URL "http://www.eclipse.org/legal/epl-v10.html". +// +// Initial Contributors: +// Nokia Corporation - initial contribution. +// +// Contributors: +// +// Description: +// + +#include "httptestutils.h" +#include "httptestcore.h" + +#if !defined __E32BASE_H__ +#include +#endif + +// for StartC32() +#if !defined __C32COMM_H__ +#include +#endif +#if !defined __IN_SOCK_H__ +#include +#endif + + +// +// Constants +_LIT(KTestPanic, "HttpTestUtils"); +const TInt KFailedTestsGranularity = 10; +const TInt KMaxLogEntrySize = 256; +#if defined (__WINS__) +#define PDD_NAME _L("ECDRV") +#else +#define PDD_NAME _L("EUART1") +#define PDD2_NAME _L("EUART2") +#define PDD3_NAME _L("EUART3") +#define PDD4_NAME _L("EUART4") +#endif +#define LDD_NAME _L("ECOMM") + +const TInt KMaxTempBuffize = 256; + +_LIT(KTestFileInputBase, "HttpTest"); +_LIT(KPathSep,"\\"); + +// +// CHTTPTestUtils +// +CHTTPTestUtils::CHTTPTestUtils(const TDesC& aTitle) + : iTest(aTitle) +// +// Default c'tor + { + iTest.Title(); + iCanStartTest = ETrue; + } + +CHTTPTestUtils::~CHTTPTestUtils() +// +// D'tor + { + TTime endtime; + endtime.UniversalTime(); + + // Do resource handle leak test? + if (iDoResourceLeakTest) + ResourceLeakTest(); + + // End of tests - see if failed or ok + if (iFailedTests->Count()) + { + TestHarnessFailed(); + } + else + { + TestHarnessComplete(); + } + // Log finish time + TDateTime t = endtime.DateTime(); + LogIt(_L("Ended @ %d:%d:%d:%d"),t.Hour(),t.Minute(),t.Second(),t.MicroSecond()); + TTime difftime(endtime.Int64() - iStartTime.Int64()); + t = difftime.DateTime(); + LogIt(_L("Execution time %d:%d:%d:%d"),t.Hour(),t.Minute(),t.Second(),t.MicroSecond()); + + // Close test harness + iTest.Close(); + + // Cleanup + iFailedTests->ResetAndDestroy(); + delete iFailedTests; + + // Close fileserver connection + iFs.Close(); + } + +EXPORT_C CHTTPTestUtils* CHTTPTestUtils::NewLC(const TDesC& aTitle) +// +// Static factory c'tor + { + CHTTPTestUtils* self = new (ELeave) CHTTPTestUtils(aTitle); + CleanupStack::PushL(self); + self->ConstructL(aTitle); + return self; + } + +EXPORT_C CHTTPTestUtils* CHTTPTestUtils::NewL(const TDesC& aTitle) +// +// Static factiry c'tor + { + CHTTPTestUtils* self = CHTTPTestUtils::NewLC(aTitle); + CleanupStack::Pop(); + return self; + } + + +void CHTTPTestUtils::CreateLogFiles(const TDesC& aTestName) + { + TBuf<128> logName(aTestName); + DefaultLogFileName(logName); + __OPEN_LOG2(logName); + logName.Append(_L(".SUMMARY")); + + TInt error = iTestSummaryLogger.Connect(); + if(error == KErrNone) + { + TParse p; + p.Set(logName, NULL, NULL); + iTestSummaryLogger.CreateLog(KHttpLogsDirName, p.NameAndExt(), EFileLoggingModeOverwrite); + iTestSummaryLogger.SetDateAndTime(ETrue, ETrue); + iTestSummaryLogger.Write(KTestHeader); + } + else + User::InfoPrint(_L("Log file create failed")); + } + +void CHTTPTestUtils::ConstructL(const TDesC& aTitle) +// +// Non-trivial c'tor + { + iCurrentTest=NULL; + // Create iFailedTests + iFailedTests = new (ELeave) CArrayPtrFlat (KFailedTestsGranularity); + + // Start up logging server connection + CreateLogFiles(aTitle); + + iStartTime.UniversalTime(); + TDateTime t = iStartTime.DateTime(); + LogIt(_L("Started @ %d:%d:%d:%d"),t.Hour(),t.Minute(),t.Second(),t.MicroSecond()); + + // Find number of open resource handles + TInt processHandleCount=0; + RThread().HandleCount(processHandleCount,iStartHandleCount); + + // Connect to file server for test scripts, ini-files etc. + User::LeaveIfError(iFs.Connect()); + } + +EXPORT_C void CHTTPTestUtils::JustStartTestL(const TDesC& aName) + { + if (iCanStartTest) + { + iCurrentTest= CTestInfo::NewL(aName, iTestCount, 0); + // Stop new test being started until this one has ended + iCanStartTest = EFalse; + } + else + { + // Panic client - bad usage - not allowed to nest tests + Panic(EBadStartTest); + } + + } +EXPORT_C void CHTTPTestUtils::StartTestL(const TDesC& aName) +// +// Logs start of test aName + { + if (iCanStartTest) + { + // Add this test to failed test list - set errorcode to zero + CTestInfo* temp = CTestInfo::NewLC(aName, iTestCount + 1, 0); + iFailedTests->AppendL(temp); + CleanupStack::Pop(); // temp + iCurrentTest= temp; + + // Increase RTest's test depth by Start-ing - increment test count + iTest.Start(aName); + ++iTestCount; + + // Stop new test being started until this one has ended + iCanStartTest = EFalse; + + TBuf buf; + buf.Format(KTestStartingWithDesc, iTestCount, &aName); + WriteComment(buf); + + // Reset iStepNumber - start at 1 + iStepNumber = 1; + } + else + { + // Panic client - bad usage - not allowed to nest tests + Panic(EBadStartTest); + } + } + +EXPORT_C void CHTTPTestUtils::NextStep(const TDesC& aStepName) +// +// Logs the next step in a test - for informative use. + { + if (!iCanStartTest) + { + TBuf buf; + buf.Format(KNextTestStepWithDesc, iTestCount, iStepNumber, &aStepName); + WriteComment(buf); + iTest.Next(aStepName); + ++iStepNumber; + } + else + { + // Panic client - bad usage - test not started + Panic(EBadStartTest); + } + } + +EXPORT_C void CHTTPTestUtils::JustEndTest() + { + // Allow new test to start + iCurrentTest = NULL; + iCanStartTest = ETrue; + } + +EXPORT_C void CHTTPTestUtils::EndTest(TInt aErrorCode) +// +// Logs end of test + { + if (!iCanStartTest) + { + // Get ptr to this test's entry in failed list - will be the last entry + TBuf buf; + TInt index = iFailedTests->Count(); + CTestInfo* ptr = iFailedTests->At(--index); + if (aErrorCode) + { + // Set the error code + ptr->SetErrorCode(aErrorCode); + buf.Format(KTestFailed, iTestCount, aErrorCode); + iTest.Printf(KRTestFailed, aErrorCode); + } + else + { + // Remove entry from list of failed tests + delete ptr; + iFailedTests->Delete(index); + buf.Format(KTestPassed, iTestCount); + } + WriteComment(buf); + + // Decrease RTest's test depth by End-ing + iTest.End(); + + // Allow new test to start. There's no iCurrentTest until StartTestL is invoked again + iCurrentTest = NULL; + iCanStartTest = ETrue; + } + else + { + // Panic client - bad usage - test not started + Panic(EBadEndTest); + } + } + +EXPORT_C void CHTTPTestUtils::LogIt(TRefByValue aFmt, ...) + +// Messages to the front end emulator and to the WAP log + { + VA_LIST list; + VA_START(list,aFmt); + TBuf<2*KMaxFileName> buf; + buf.Zero(); + if(iCurrentTest) + buf.Append(iCurrentTest->Name()); + buf.Append(_L("> ")); + buf.AppendFormatList(aFmt,list,this); + VA_END(list); + //write to the console and file, if not silent + if (!iSilent) + WriteComment(buf); + else // otherwise log to the file only + __LOG(buf); + } + +EXPORT_C void CHTTPTestUtils::Overflow(TDes& aDes) + { + _LIT(KErrOverflowMsg, "..."); + if( aDes.MaxLength() >= KErrOverflowMsg().Length() + aDes.Length() ) + aDes.Append(KErrOverflowMsg); + } + +EXPORT_C void CHTTPTestUtils::operator()(TInt aResult,TInt aLineNum) +// +// Overload operator () + { + iTest(aResult, aLineNum); + } + +EXPORT_C void CHTTPTestUtils::operator()(TInt aResult) +// +// Overload operator () + { + iTest(aResult); + } + +EXPORT_C void CHTTPTestUtils::PressAnyKey() +// +// Request a key press from user and wait - unless we are running a script or we are being silent + { + if (!iScriptRunning && !iSilent) + { + iTest.Printf(TRefByValue_L("\nPress a key")); + iTest.Getch(); + } + } + +EXPORT_C void CHTTPTestUtils::DumpData(const TDesC8& aData, TBool logIt) +// +// Do a formatted dump of binary data, optionally logging it + { + // Iterate the supplied block of data in blocks of 16 bytes + TInt pos = 0; + TBuf logLine; + TBuf anEntry; + while (pos < aData.Length()) + { + anEntry.Format(TRefByValue_L("%04x : "), pos); + logLine.Append(anEntry); + + // Hex output + TInt offset; + for (offset = 0; offset < 16; offset++) + { + if (pos + offset < aData.Length()) + { + TInt nextByte = aData[pos + offset]; + anEntry.Format(TRefByValue_L("%02x "), nextByte); + logLine.Append(anEntry); + } + else + { + anEntry.Format(TRefByValue_L(" ")); + logLine.Append(anEntry); + } + } + anEntry.Format(TRefByValue_L(": ")); + logLine.Append(anEntry); + + // Char output + for (offset = 0; offset < 16; offset++) + { + if (pos + offset < aData.Length()) + { + TInt nextByte = aData[pos + offset]; + if ((nextByte >= 32) && (nextByte <= 127)) + { + anEntry.Format(TRefByValue_L("%c"), nextByte); + logLine.Append(anEntry); + } + else + { + anEntry.Format(TRefByValue_L(".")); + logLine.Append(anEntry); + } + } + else + { + anEntry.Format(TRefByValue_L(" ")); + logLine.Append(anEntry); + } + } + if (logIt) + { + LogIt(TRefByValue_L("%S"), &logLine); + } + else if (!iSilent) + { + iTest.Printf(TRefByValue_L("%S\n"), &logLine); + } + logLine.Zero(); + + // Advance to next 16 byte segment + pos += 16; + } + } + +EXPORT_C void CHTTPTestUtils::GetAnEntry(const TDesC& ourPrompt, TDes& currentstring) +// +// Get an input string from the user, displaying a supplied prompt and default string value + { + // If we're scripting, try reading from script first + TInt readScriptErr = KErrNotFound; + if (iScriptRunning) + { + readScriptErr = ReadLineFromScript(currentstring); + } + if (!readScriptErr) + return; + + // Either not scripting, or hit end of script - continue with user input + TBuf16 ourLine; + TBuf tempstring; //tempstring is a unicode descriptor + //create a temporary buffer where the + //unicode strings are stored in order to + //be displayed + ourLine.Zero (); + tempstring.Copy(currentstring); //Copy current string to Unicode buffer + TKeyCode key = EKeyNull; //current string buffer is 8 bits wide. + //Unicode string bufffer (tempstring) is 16 bits wide. + for (;;) + { + if (ourLine.Length () == 0) + { + iTest.Console()->SetPos (0, iTest.Console()->WhereY ()); + iTest.Console()->Printf (_L ("%S"), &ourPrompt); + if (tempstring.Length () != 0) //get tempstring's number of items + iTest.Console()->Printf (_L (" = %S"), &tempstring); //if not zero print them to iTest.Console() + iTest.Console()->Printf (_L (" : ")); + iTest.Console()->ClearToEndOfLine (); + } + key = iTest.Getch(); + + if (key == EKeyBackspace) + { + if (ourLine.Length() !=0) + { + ourLine.SetLength(ourLine.Length()-1); + iTest.Console()->Printf (_L ("%c"), key); + iTest.Console()->SetPos(iTest.Console()->WhereX(),iTest.Console()->WhereY()); + iTest.Console()->ClearToEndOfLine(); + } // end if (ourLine.Length() !=0) + } // end if (key == KeyBackSpace) + + + if (key == EKeyDelete) + { + ourLine.Zero(); + iTest.Console()->SetPos (0, iTest.Console()->WhereY ()); + iTest.Console()->ClearToEndOfLine (); + tempstring.Copy(ourLine); + break; + } + + if (key == EKeyEnter) + break; + + if (key < 32) + { + continue; + } + + ourLine.Append (key); + iTest.Console()->Printf (_L ("%c"), key); + iTest.Console()->SetPos(iTest.Console()->WhereX(),iTest.Console()->WhereY()); + iTest.Console()->ClearToEndOfLine(); + if (ourLine.Length () == ourLine.MaxLength ()) + break; + } // end of for statement + + if ((key == EKeyEnter) && (ourLine.Length () == 0)) + tempstring.Copy (currentstring); //copy contents of 8 bit "ourLine" descriptor + + iTest.Console()->SetPos (0, iTest.Console()->WhereY ()); + iTest.Console()->ClearToEndOfLine (); + iTest.Console()->Printf (_L ("%S"), &ourPrompt); + + if ((key == EKeyEnter) && (ourLine.Length() !=0)) + tempstring.Copy(ourLine); + if (tempstring.Length () != 0) //if temstring length is not zero + { + iTest.Console()->Printf (_L (" = %S\n"), &tempstring); //print the contents to iTest.Console() + LogIt(_L ("%S = %S\n"), &ourPrompt, &tempstring); + } + + else + //iTest.Console()->Printf (_L (" is empty")); + iTest.Console()->Printf (_L ("\n")); + currentstring.Copy(tempstring); //copy 16 bit tempstring descriptor back + } + + +EXPORT_C TInt CHTTPTestUtils::GetSelection(const TDesC& ourPrompt, const TDesC& validChoices) +// +// Present the user with a list of options, and get their selection + { + // If we're scripting, try reading from script first + TInt readScriptErr = KErrNotFound; + if (iScriptRunning) + { + TBuf<1> oneCharBuf; + readScriptErr = ReadLineFromScript(oneCharBuf); + if (!readScriptErr) + { + return validChoices.Locate((TChar)oneCharBuf[0]); + } + } + + // Either not scripting, or hit end of script - continue with user input + TKeyCode key = EKeyNull; + iTest.Console()->SetPos (0, iTest.Console()->WhereY ()); + Print(ourPrompt); + iTest.Console()->Printf(_L("[%S] :"), &validChoices); + TInt retVal = KErrNotFound; + while (retVal == KErrNotFound) + { + key = iTest.Getch(); + + // Check that key is in the list of valid choices + retVal = validChoices.Locate((TChar)key); + } + iTest.Console()->Printf(_L("%c\n\n"), key); + return retVal; + } + + +EXPORT_C void CHTTPTestUtils::SetScript(RFile& scriptFile) +// +// Sets the file to be used for a test script - ie. a file that contains commands used by +// GetEntry() and GetSelection() + { + iScriptFile = &scriptFile; + iScriptRunning = ETrue; + LogIt(_L("***SCRIPT STARTING***\n")); + } + +EXPORT_C void CHTTPTestUtils::InitCommsL() + { + TInt ret = User::LoadPhysicalDevice(PDD_NAME); + User::LeaveIfError(ret == KErrAlreadyExists?KErrNone:ret); + +#ifndef __WINS__ + ret = User::LoadPhysicalDevice(PDD2_NAME); + ret = User::LoadPhysicalDevice(PDD3_NAME); + ret = User::LoadPhysicalDevice(PDD4_NAME); +#endif + + ret = User::LoadLogicalDevice(LDD_NAME); + User::LeaveIfError(ret == KErrAlreadyExists?KErrNone:ret); + ret = StartC32(); + User::LeaveIfError(ret == KErrAlreadyExists?KErrNone:ret); + } + +EXPORT_C void CHTTPTestUtils::HoldOpenConnectionL() + { + RSocketServ sockSrvHnd; + TInt err = sockSrvHnd.Connect(); + if (err != KErrNone) + { + User::Leave(err); + } + + // Start UDP protocol stack + TProtocolDesc desc; + _LIT(KUdp, "udp"); + err = sockSrvHnd.FindProtocol(KUdp(), desc); + User::LeaveIfError(err); + TRequestStatus stat; + sockSrvHnd.StartProtocol(desc.iAddrFamily, desc.iSockType, desc.iProtocol, stat); + User::WaitForRequest(stat); + } + +EXPORT_C void CHTTPTestUtils::ReleaseConnectionL() + { + RSocketServ sockSrvHnd; + TInt err = sockSrvHnd.Connect(); + if (err != KErrNone) + { + User::Leave(err); + } + + // Stop UDP protocol stack + TProtocolDesc desc; + _LIT(KUdp, "udp"); + err = sockSrvHnd.FindProtocol(KUdp(), desc); + User::LeaveIfError(err); + TRequestStatus stat; + sockSrvHnd.StopProtocol(desc.iAddrFamily, desc.iSockType, desc.iProtocol, stat); + User::WaitForRequest(stat); + } + +TInt CHTTPTestUtils::ReadLineFromScript(TDes& aBuffer) +// +// Reads the next line from the script file, and sets the passed-in descriptor with its contents. +// Returns KErrNone if reading succeeded; KErrNotFound if the EOF was reached. When EOF is reached, +// the file is closed. + { + // ********************************* + // Assume script is 8-bit text file + // ********************************* + TBool isAComment = ETrue; + TInt err = KErrNone; + TBuf<512> line; + while (isAComment && !err) + { + TFileText text; + text.Set(*iScriptFile); + line.SetLength(0); + for(;;) + { + TBuf8<2> c; + err = iScriptFile->Read(c,1); + if (err && err != KErrEof) + { + iTest.Printf(_L("Error reading file: %d\n"), err); + break; + } + if (c.Length() == 0) + { + err = KErrEof; + break; + } + else + { + if (c[0] == '\n') // break out if it is CR + break; + else if (c[0] != 0x0d) // otherwise append the char, _unless_ it is a LF + line.Append(c[0]); + } + } + if (err == KErrNone && line.Locate('/') != 0) // comment (only works if it's the first character) + { + isAComment = EFalse; + } + } + + // The line read is not a comment, or have hit end of file + if (!err) + { + // copy to passed in descriptor, but do not allow an overflow + aBuffer.Copy(line.Left(aBuffer.MaxLength())); + LogIt(_L("***SCRIPT : read command '%S' ***\n"), &aBuffer); + } + else + { + iScriptFile->Close(); + err = KErrNotFound; + iScriptRunning = EFalse; + LogIt(_L("***SCRIPT ENDED***\n")); + } + return err; + } + +void CHTTPTestUtils::Panic(TInt aPanic) +// +// Panic the client program. + { + User::Panic(KTestPanic,aPanic); + } + +void CHTTPTestUtils::TestHarnessComplete() +// +// Test harness completed without failures + { + WriteComment(KTestHarnessCompleted); + } + +void CHTTPTestUtils::TestHarnessFailed() +// +// Test harness has a failure - log information + { + TBuf buf; + buf.Format(KTestHarnessFailed, iFailedTests->Count()); + WriteComment(buf); + // Log fialed tests' information + for (TInt ii=0; iiCount(); ++ii) + { + CTestInfo* failed = iFailedTests->At(ii); + TPtrC name = failed->Name(); + LogIt(KTestFailInfo, failed->Number(), &name, failed->ErrorCode()); + } + } + +void CHTTPTestUtils::ResourceLeakTest() +// +// Creates a new test that fails if any there are any leaked resource handles + { + // Start new test + _LIT(KResourceTestName, "Resource Handle Leak Test"); + TRAPD(error,StartTestL(KResourceTestName)); + + if (error !=KErrNone) + Panic(EBadStartTest); + + // Find number of opened handles + TInt processHandleCount=0; + TInt threadHandleCount=0; + RThread().HandleCount(processHandleCount,threadHandleCount); + TInt err = KErrNone; + TInt openHandleCount = iStartHandleCount-threadHandleCount; + if ( openHandleCount !=0) + { + err = KErrGeneral; + LogIt(_L("Number leaked handles is %D"), openHandleCount); + } + EndTest(err); + } + + +EXPORT_C +TInt CHTTPTestUtils::ResolveFile(const TDesC& aComponent, const TDesC& aFileName, TParse& aParseOut) + { + TFileName* savedPath = new TFileName; + TFileName* fileName = new TFileName; + if ((savedPath == NULL) || (fileName == NULL)) + return KErrNoMemory; + + fileName->Append(KPathSep); + fileName->Append(KTestFileInputBase); + fileName->Append(KPathSep); + fileName->Append(aComponent); + fileName->Append(KPathSep); + fileName->Append(aFileName); + + // file finder will look in the session drive first, then Y->A,Z + // so set session drive to Y (save old and restore it afterwards) + iFs.SessionPath(*savedPath); + _LIT(KTopDrive,"Y:\\"); + iFs.SetSessionPath(KTopDrive); + TFindFile file_finder(iFs); + TInt err = file_finder.FindByDir(*fileName,KNullDesC); + if(err==KErrNone) + aParseOut.Set(file_finder.File(),NULL,NULL); + iFs.SetSessionPath(*savedPath); + delete savedPath; + delete fileName; + return(err); + } + +EXPORT_C +HBufC8* CHTTPTestUtils::ReadFileLC(const TDesC& aFile) + { + //Returns a HBufC8 with the contents of aFile + RFile file; + User::LeaveIfError(file.Open(iFs, aFile, EFileShareAny | EFileRead)); + CleanupClosePushL(file); + + TInt size = 0; + TInt err = file.Size(size); + + if (err) + { + iTest.Printf(_L("ReadFileLC(%S) leaving with %d. Unable to size file\n"), &aFile, err); + User::Leave(err); + } + + HBufC8* contents = HBufC8::NewLC(size + 4); + TPtr8 contentsPtr(contents->Des()); + err = file.Read(0, contentsPtr); + + if (err) + { + iTest.Printf(_L("ReadFileLC(%S) leaving with %d. Unable to read file\n"), &aFile, err); + User::Leave(err); + } + + CleanupStack::Pop(); //contents + CleanupStack::PopAndDestroy(); //file + CleanupStack::PushL(contents); + + return contents; + } + + + + +// +// CTestInfo +// +CHTTPTestUtils::CTestInfo::CTestInfo() +// +// Default c'tor + { + } + +CHTTPTestUtils::CTestInfo::~CTestInfo() +// +// D'tor + { + delete iName; + } + +CHTTPTestUtils::CTestInfo* CHTTPTestUtils::CTestInfo::NewLC(const TDesC& aName, TInt aNumber, TInt aErrorCode) +// +// Static factory c'tor + { + CTestInfo* self = new (ELeave) CTestInfo(); + CleanupStack::PushL(self); + self->ConstructL(aName, aNumber, aErrorCode); + return self; + } + +CHTTPTestUtils::CTestInfo* CHTTPTestUtils::CTestInfo::NewL(const TDesC& aName, TInt aNumber, TInt aErrorCode) +// +// Static factory c'tor + { + CTestInfo* self = NewLC(aName, aNumber, aErrorCode); + CleanupStack::Pop(); // self + return self; + } + +void CHTTPTestUtils::CTestInfo::ConstructL(const TDesC& aName, TInt aNumber, TInt aErrorCode) +// +// Non-trivial c'tor + { + iName = aName.AllocLC(); + CleanupStack::Pop(); // iName + + iNumber = aNumber; + iErrorCode = aErrorCode; + } + +void CHTTPTestUtils::CTestInfo::SetNameL(const TDesC& aName) +// +// Sets iName + { + HBufC* temp = aName.AllocLC(); + CleanupStack::Pop(); // temp + delete iName; + iName = temp; + } + +void CHTTPTestUtils::CTestInfo::SetNumber(TInt aNumber) +// +// Sets iNumber + { + iNumber = aNumber; + } + +void CHTTPTestUtils::CTestInfo::SetErrorCode(TInt aErrorCode) +// +// Sets iErrorCode + { + iErrorCode = aErrorCode; + } + +#ifndef EKA2 +GLDEF_C TInt E32Dll(TDllReason /*aReason*/) +// +// Main Dll entry point + { + return(KErrNone); + } +#endif // EKA2 + +void CHTTPTestUtils::Print(const TDesC& aDescriptor) + { + TBuf chunkOfPrompt; + TInt length = aDescriptor.Length(); + TInt num=length/KMaxTempBuffize; + TInt rest=length%KMaxTempBuffize; + TInt iter; + if(num>0) + for(iter=0;iterPrintf(_L("%S "), & chunkOfPrompt); + } + chunkOfPrompt.Copy(aDescriptor.Mid(length-rest,rest)); + iTest.Console()->Printf(_L("%S "), & chunkOfPrompt); + }