commsfwutils/commsbufs/TS_mbufmgr/Test15Concurrency.cpp
changeset 0 dfb7c4ff071f
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/commsfwutils/commsbufs/TS_mbufmgr/Test15Concurrency.cpp	Thu Dec 17 09:22:25 2009 +0200
@@ -0,0 +1,261 @@
+// Copyright (c) 2002-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:
+// Contains IPC Test 15
+// 
+//
+
+// EPOC includes
+#include <e32base.h>
+#include <ss_std.h>
+// Test system includes
+#ifdef SYMBIAN_OLD_EXPORT_LOCATION
+#include "networking/log.h"
+#include "networking/teststep.h"
+#else
+#include <networking/log.h>
+#include <networking/teststep.h>
+#endif
+#include "TestStepCTMbufmgr.h"
+#include "TestSuiteCTMbufmgr.h"
+
+#include "Test15Concurrency.h"
+#include <comms-infras/commsbufpond.h>
+
+// constructor
+CTest15Concurrency::CTest15Concurrency()
+	{
+	iTestStepName = _L("MBufMgrTest15");// Store the name of this test case
+	iMainThreadTries = 0;
+	iMainThreadFails = 0;
+	iHighThreadTries = 0;
+	iHighThreadFails = 0;
+	}
+
+// destructor
+CTest15Concurrency::~CTest15Concurrency()
+	{
+	}
+
+//
+TInt CTest15Concurrency::fHighPriorityThread(TAny* aInput)
+	{
+	CTest15Concurrency* pTestObject = (CTest15Concurrency*)aInput;
+	// We need to introduce this new client thread to the MBufMgr
+	TCommsBufPondTLSOp tls(pTestObject->iBufPond);
+	tls.Set();
+	
+	CTrapCleanup* aCleanup = CTrapCleanup::New();
+
+	//Install active scheduler
+    CActiveScheduler* aActSch = new CActiveScheduler;
+	if(aActSch==NULL)
+		{
+		return KErrNoMemory;
+		}
+	CActiveScheduler::Install(aActSch);
+
+	RTimer aTimer;
+	TRequestStatus aTimerStatus;	// Request status associated with timer
+	aTimer.CreateLocal();			// Create timer for this thread
+	//-------------- substep 1 --------------------
+
+	// Allocate two 500-bytes long descriptors (Des1 & Des2):"));
+	TBuf8<500> *aDes1 = NULL;
+	TBuf8<500> *aDes2 = NULL;
+
+    TRAPD(ret, aDes1 = new(ELeave) TBuf8<500>);
+	if(ret!=KErrNone)
+		{
+		return ret;
+		}
+
+    TRAP(ret, aDes2 = new(ELeave) TBuf8<500>);
+	if(ret!=KErrNone)
+		{
+		delete aDes1;
+		return ret;
+		}
+
+	aDes1->SetLength(500);
+	aDes2->SetLength(500);
+
+	//Fill in the Des1 with a pattern
+	pTestObject->StripeDes(*aDes1, 0, 500, 'a', 'z');
+
+	#ifdef __CFLOG_ACTIVE
+	__CFLOG_DECLARATION_VARIABLE;
+	TRAP(ret, __CFLOG_CREATEL);
+	if(ret!=KErrNone)
+		{
+		delete aDes1;
+		delete aDes2;
+		return ret;
+		}
+	__CFLOG_OPEN;
+#endif
+	
+	for (TInt i = 0 ; i<1000;i++)
+		{
+		//Allocate 500-bytes long RMBufChain
+		RMBufChain aChain;
+		TRAP(ret,aChain.AllocL(500));
+		if (ret != KErrNone)
+			{
+			break;
+			}
+		//Copy in Des1 into Chain
+		aChain.CopyIn(*aDes1);
+		//Fill in Des2 with zeros
+		pTestObject->StripeDes(*aDes2, 0, 500, 0, 0);
+		//Copy out Chain into Des2;
+		aChain.CopyOut(*aDes2);
+		//Compare the contents of Des1 & Des2
+		if(aDes1->Compare(*aDes2))
+			pTestObject->iHighThreadFails++;
+		pTestObject->iHighThreadTries++;
+		//Free chain
+		aChain.Free();
+		//Sleep for 5ms
+		aTimer.After(aTimerStatus,5000);
+		User::WaitForRequest(aTimerStatus);
+		}
+	delete aDes1;
+	delete aDes2;
+	CActiveScheduler::Install(NULL);
+	delete aActSch;
+	delete aCleanup;
+
+#ifdef __CFLOG_ACTIVE
+	__CFLOG_CLOSE;
+	__CFLOG_DELETE;
+#endif
+	return ret;
+}
+
+
+
+enum TVerdict CTest15Concurrency::doTestStepL(void)
+	{
+	__UHEAP_MARK;
+	
+#ifdef __CFLOG_ACTIVE
+	__CFLOG_CREATEL;
+	__CFLOG_OPEN;
+#endif
+	
+	volatile TExitType aExit;
+
+	//-------------- substep 1 --------------------
+	Log(_L("  01 Create CMBufManager and install active scheduler:"));
+    CleanupStack::PushL( iActSch = new(ELeave) CActiveScheduler );
+	CActiveScheduler::Install(iActSch);
+	CreateInstanceMBufMgrL(KMBufDefaultHeapSize);
+	CleanupClosePushL(iBufPond);
+
+	//-------------------substep 01-----------------------------
+	Log(_L("  02 Create high priority thread and resume it:"));
+	RThread aThread;
+	
+	TInt err=aThread.Create(_L("testThreadRec"),
+		                       fHighPriorityThread,
+ 							   KDefaultStackSize,
+							   KDefaultHeapSize,
+							   KMaxHeapSize,
+							   (TAny*)this,
+							   EOwnerProcess);
+	if (err!=KErrNone)
+		{
+		_LIT(aLog,"Error:Could not create the thread. err = %d"); Log(aLog,err);
+
+#ifdef __CFLOG_ACTIVE
+	__CFLOG_CLOSE;
+	__CFLOG_DELETE;
+#endif
+	
+		User::Leave(EFail);
+		}
+	aThread.SetPriority(EPriorityAbsoluteHigh);
+	aThread.Resume();
+
+	//-------------------substep 03-----------------------------
+	Log(_L("  02 Do tests in loop end stop when the other finishes"));
+	Log(_L("     ...It will take a while (about 10 sec.):"));
+
+	// Allocate two 5000-bytes long descriptors (Des1 & Des2):"));
+	TBuf8<5000> *aDes1, *aDes2;
+    CleanupStack::PushL( aDes1 = new(ELeave) TBuf8<5000> );
+    CleanupStack::PushL( aDes2 = new(ELeave) TBuf8<5000> );
+	aDes1->SetLength(5000);
+	aDes2->SetLength(5000);
+	//Fill in the Des1 with a pattern:"));
+	StripeDes(*aDes1, 0, 5000, '@', 'Z');
+
+	do {
+		//Allocate 5000-bytes long RMBufChain
+		RMBufChain aChain;
+		TRAPD(ret,aChain.AllocL(5000));
+		if (ret != KErrNone)
+			{
+			Log(_L("Error: Couldn't allocate RMBuf:"));
+
+#ifdef __CFLOG_ACTIVE
+	__CFLOG_CLOSE;
+	__CFLOG_DELETE;
+#endif
+			User::Leave(EFail);
+			}
+		//Copy in Des1 into Chain
+		aChain.CopyIn(*aDes1);
+		//Fill in Des2 with zeros:"));
+		StripeDes(*aDes2, 0, 5000, 0, 0);
+		//Copy out Chain into Des2:"));
+		aChain.CopyOut(*aDes2);
+		//Compare the contents of Des1 & Des2:
+		if(aDes1->Compare(*aDes2))	iMainThreadFails++;
+		iMainThreadTries++;
+		//Free chain
+		aChain.Free();
+
+		//Check whether the other task has finished
+		aExit = aThread.ExitType();
+		}
+	while (aExit == EExitPending);
+
+	//Clean up stack
+	CleanupStack::PopAndDestroy(aDes2);
+    CleanupStack::PopAndDestroy(aDes1);
+    CleanupStack::PopAndDestroy();
+	CActiveScheduler::Install(NULL);
+	CleanupStack::PopAndDestroy(iActSch);
+
+#ifdef __CFLOG_ACTIVE
+	__CFLOG_CLOSE;
+	__CFLOG_DELETE;
+#endif
+
+	//-------------------substep 02-----------------------------
+	Log(_L("     Info: Number of main thread checkings: %d with %d fails"),iMainThreadTries,iMainThreadFails);
+	Log(_L("     Info: Number of high priority thread checkings: %d with %d fails"),iHighThreadTries,iHighThreadFails);
+	aThread.Close();
+	if (iHighThreadTries <1000)
+		{
+		Log(_L("   Error: High priority thread ended before 1000 loops are finished"));
+		return EFail;
+		}
+	if ( iHighThreadFails || iMainThreadFails)
+		return EFail;
+
+	__UHEAP_MARKEND;
+	return EPass;
+  }