diff -r 000000000000 -r 3553901f7fa8 smsprotocols/smsstack/smsprot/Test/TE_SMSPRTSTRESS/TE_smsprtstressbase.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/smsprotocols/smsstack/smsprot/Test/TE_SMSPRTSTRESS/TE_smsprtstressbase.cpp Tue Feb 02 01:41:59 2010 +0200 @@ -0,0 +1,327 @@ +// Copyright (c) 2003-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: +// + +/** + @file +*/ + +#include "TE_smsprtstressbase.h" +#include +#include +#include + +#include +using namespace conn; + +TVerdict CSmsPrtStressTestStep::doTestStepPreambleL( void ) + { + __UHEAP_MARK; + + iScheduler = new(ELeave) CActiveScheduler; + CActiveScheduler::Install(iScheduler); + + iSecureBackupEngine = CSBEClient::NewL(); + iSecureBackupEngine->SetBURModeL(TDriveList(_L8("C")), + EBURNormal, ENoBackup); + + User::LeaveIfError(iFs.Connect()); + + iSmsStackTestUtils = CSmsStackTestUtils::NewL(this, iFs); + + return TestStepResult() ; + } + +TVerdict CSmsPrtStressTestStep::doTestStepPostambleL( void ) + { + delete iSmsStackTestUtils; + iSmsStackTestUtils = NULL; + + iFs.Close(); + + delete iSecureBackupEngine; + iSecureBackupEngine = NULL; + + delete iScheduler; + iScheduler = NULL; + + __UHEAP_MARKEND; + + DoESockMemoryLeakTestL(); + + return TestStepResult() ; + } + + +void CSmsPrtStressTestStep::InitGlobalsL() +/** + * Initialise global variables. + */ + { + TRAPD( ret, ParseSettingsFromFileL()); + + if (ret != KErrNone) + INFO_PRINTF2(_L("ParseSettingsFromFileL [err=%d]"), ret); + + GetCmdLineArguments(); + + INFO_PRINTF2(_L("TelNo: [%S]"), &iTelephoneNumber); + INFO_PRINTF2(_L("ScNo: [%S]"), &iServiceCenterNumber); + + CommInit(); + + iSmsStackTestUtils->CopyConfigFileL(KTSmsPrtStressConfigFileName); + } + + +void CSmsPrtStressTestStep::PrepareRegTestLC(RSocketServ& aSocketServer, TInt aTestNumber) +/** + * Run a specified test. + * The test number is passed via property KUidPSSimTsyCategory. This will notify the SIM tsy + * SIM tsy uses test number to parse correct script from config.txt + * @param aTestNumber The test number corresponding the test case + */ + { + RProperty testNumberProperty; + User::LeaveIfError(testNumberProperty.Attach(KUidPSSimTsyCategory, KPSSimTsyTestNumber)); + CleanupClosePushL(testNumberProperty); + + TRequestStatus status; + testNumberProperty.Subscribe(status); + User::LeaveIfError(testNumberProperty.Set(KUidPSSimTsyCategory,KPSSimTsyTestNumber,aTestNumber)); + User::WaitForRequest(status); + TEST(status.Int() == KErrNone); + TInt testNumberCheck; + User::LeaveIfError(testNumberProperty.Get(testNumberCheck)); + if (aTestNumber != testNumberCheck) + User::Leave(KErrNotFound); + + CleanupStack::PopAndDestroy(&testNumberProperty); + + INFO_PRINTF1(_L("Connecting to SocketServer ...")); + TInt ret=aSocketServer.Connect(KSocketMessageSlots); + TEST(ret == KErrNone); + CleanupClosePushL(aSocketServer); + + INFO_PRINTF1(_L("Deleting segmentation and reassembly stores...")); + + // delete segmentation and reassembly store files before the test + _LIT(KReassemblyStoreName,"C:\\Private\\101F7989\\sms\\smsreast.dat"); + _LIT(KSegmentationStoreName,"C:\\Private\\101F7989\\sms\\smssegst.dat"); + + iFs.Delete(KReassemblyStoreName); + iFs.Delete(KSegmentationStoreName); + } + + +TBool CSmsPrtStressTestStep::DoGetCmdLineArguments(TDes& aCmdarg, const TDesC& aToFind, TDes& aCmd) + { + if(( aCmdarg.FindF(aToFind)) != KErrNotFound ) + { + TLex myLex( aCmdarg ); + myLex.Inc(aCmdarg.FindF(_L("="))+1); + myLex.SkipSpace(); + myLex.Mark(); // remember where we are + myLex.SkipCharacters(); // move to end of character token + if (myLex.TokenLength() != 0) // if valid potential token + { + aCmd.Copy(myLex.MarkedToken()); // extract token + return ETrue; + } + } + return EFalse; + } + +void CSmsPrtStressTestStep::GetCmdLineArguments() + { + CCommandLineArguments *cmdLine = NULL; + TRAPD(err, cmdLine = CCommandLineArguments::NewL()); + if (err==KErrNone) + { + TInt numCmds = cmdLine->Count(); + TInt i=0; + while (++i < numCmds) + { + TBuf<256> arg = cmdLine->Arg(i); + + // Reading the Service Centre Number + _LIT( KSCno, "sc="); + _LIT( KSCNO, "SC="); + if( DoGetCmdLineArguments( arg, KSCno, iServiceCenterNumber ) + || DoGetCmdLineArguments( arg, KSCNO, iServiceCenterNumber )) + continue; + + // Reading the Recipient Telephone Number + _LIT( KTELno, "tel="); + _LIT( KTELNO, "TEL="); + if( DoGetCmdLineArguments( arg, KTELno, iTelephoneNumber ) + || DoGetCmdLineArguments( arg, KTELNO, iTelephoneNumber )) + continue; + } + } + delete cmdLine; + cmdLine = NULL; + } + +void CSmsPrtStressTestStep::ParseSettingsFromFileL() + { + CTestConfig* configFile = CTestConfig::NewLC(iFs,KGmsSmsConfigFileDir,KGmsSmsConfigFileName); + const CTestConfigSection* cfgFile = configFile->Section(KSetupTelNumbers); + if (cfgFile == NULL) + User::Leave(KErrNotFound); + + const CTestConfigItem* item = cfgFile->Item(KServiceCenter,0); + if (item == NULL) + User::Leave(KErrNotFound); + + iServiceCenterNumber.Copy(item->Value()); + + item = cfgFile->Item(KTelefoneNumber,0); + if (item == NULL) + User::Leave(KErrNotFound); + + iTelephoneNumber.Copy(item->Value()); + + // beginning of the destruction + CleanupStack::PopAndDestroy(configFile);//configFile + } + +void CSmsPrtStressTestStep::EndRegTest() +/** + * Closes objects used at test harness + */ + { + INFO_PRINTF1(_L("Closing Reg Test")); + User::After(2000000); //Wait a couple of seconds to avoid closing the SMS stack too early + CleanupStack::PopAndDestroy(); //socketServer + User::After(2000000); //Wait a couple of seconds to avoid closing the SMS stack too early + } + + +#if defined (__WINS__) +#define PDD_NAME _L("ECDRV") +#define PDD_NAME2 _L("ECDRV") +#define LDD_NAME _L("ECOMM") +#else +#define PDD_NAME _L("EUART1") +#define LDD_NAME _L("ECOMM") +#endif + + +TInt CSmsPrtStressTestStep::CommInit() + { + RFs fs; + TInt err=fs.Connect(); // make sure the FileServer is alive (only needed for WINS test code) + fs.Close(); + + INFO_PRINTF1(_L("CommInit: Loading PDD ") ); + INFO_PRINTF1(PDD_NAME); + INFO_PRINTF1(_L("")); + err=User::LoadPhysicalDevice(PDD_NAME); + if (err!=KErrNone && err!=KErrAlreadyExists) + return(err); + + INFO_PRINTF1(_L("CommInit: Loading LDD ") ); + INFO_PRINTF1(LDD_NAME); + INFO_PRINTF1(_L("")); + err=User::LoadLogicalDevice(LDD_NAME ); + if (err!=KErrNone && err!=KErrAlreadyExists) + return(err); + + INFO_PRINTF1(_L("CommInit: Starting C32 ") ); + + err = StartC32(); + return (err == KErrNone || err == KErrAlreadyExists) ? KErrNone : err; + } + + +void CSmsPrtStressTestStep::DoESockMemoryLeakTestL() + { + // + // Find the current number of leaked cells in ESock... + // + TInt ret, startLeakCounter; + + ret = RProperty::Get(KUidCommsProcess, KUidCommsModuleLeakCounter, startLeakCounter); + if (ret == KErrNotFound) + { + // No variable to monitor, ESock is probably not in debug mode. + return; + } + else + { + TESTL(ret == KErrNone); + } + + // + // Connect to Rootserver... + // + RRootServ rootserver; + + User::LeaveIfError(rootserver.Connect()); + CleanupClosePushL(rootserver); + + // + // Shutdown all the ESock CPMs gracefully... + // + TRSIter iter; + TCFModuleName modName; + TRSModuleInfo modInfo; + TRequestStatus statusArray[16]; + TInt statusCount = 0; + + while (rootserver.EnumerateModules(iter, modName) == KErrNone) + { + if (rootserver.GetModuleInfo(modName, modInfo) == KErrNone && + modInfo.iParams.iDll.MatchF(_L("*ESOCKSVR.DLL")) >= 0) + { + rootserver.UnloadCpm(statusArray[statusCount++], modInfo.iParams.iName, + EGraceful); + } + } + + while (statusCount > 0) + { + statusCount--; + User::WaitForRequest(statusArray[statusCount]); + TEST(statusArray[statusCount] == KErrNone); + } + + // + // Close Rootserver session... + // + CleanupStack::PopAndDestroy(1, &rootserver); + + // + // Get the latest number of leaked cells in ESock... + // + TInt finalLeakCounter; + + ret = RProperty::Get(KUidCommsProcess, KUidCommsModuleLeakCounter, finalLeakCounter); + TESTL(ret == KErrNone); + + if (finalLeakCounter > startLeakCounter) + { + INFO_PRINTF1(_L("A memory leak has been detected inside ESock - Check SMS Stack!")); + TEST(finalLeakCounter == startLeakCounter); + } + + // + // Restart C32... + // + _LIT(KDummyCMI, ""); + WarmBootC32(KDummyCMI); + } // CSmsPrtStressTestStep::DoESockMemoryLeakTestL + +