smsprotocols/smsstack/smsprot/Test/TE_SMSPRTSTRESS/TE_smsprtstressbase.cpp
changeset 0 3553901f7fa8
child 14 7ef16719d8cb
--- /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 <sacls.h>
+#include <cfshared.h>
+#include <c32root.h>
+
+#include <connect/sbdefs.h>
+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("<font size=2 color=FF0000><B>A memory leak has been detected inside ESock - Check SMS Stack!</B></font>"));
+		TEST(finalLeakCounter == startLeakCounter);
+		}
+
+	//
+	// Restart C32...
+	//
+	_LIT(KDummyCMI, "");
+	WarmBootC32(KDummyCMI);
+	} // CSmsPrtStressTestStep::DoESockMemoryLeakTestL
+
+