commsfwutils/commsbufs/TS_mbufmgr/test20poolceilingfull.cpp
changeset 0 dfb7c4ff071f
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/commsfwutils/commsbufs/TS_mbufmgr/test20poolceilingfull.cpp	Thu Dec 17 09:22:25 2009 +0200
@@ -0,0 +1,221 @@
+/*
+* Copyright (c) 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 <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 "test20poolceilingfull.h"
+
+
+CTest20PoolCeilingFull::CTest20PoolCeilingFull()
+	{
+	iTestStepName = _L("MBufMgrTest20");// Store the name of this test case
+	}
+
+CTest20PoolCeilingFull::~CTest20PoolCeilingFull()
+	{
+	iChain.Free();
+	}
+
+TVerdict CTest20PoolCeilingFull::doTestStepL()
+	{
+	__UHEAP_MARK;
+	//-------------- substep 1 --------------------
+	Log(_L("  01 Create CMBufManager and install active scheduler:"));
+	CleanupStack::PushL( iActSch = new(ELeave) CActiveScheduler );
+	CActiveScheduler::Install(iActSch);
+
+	RArray<TCommsBufPoolCreateInfo> createInfoArray;
+	
+	TCommsBufPoolCreateInfo createInfo;
+	createInfo.iBufSize = 256;
+	createInfo.iInitialBufs = 50;
+	createInfo.iGrowByBufs = 20;
+	createInfo.iMinFreeBufs = 4;
+	createInfo.iCeiling = 100; 
+	createInfoArray.Append(createInfo);
+
+	CreateInstanceMBufMgrL(createInfoArray);
+	CleanupClosePushL(iBufPond);
+	createInfoArray.Close ();
+
+	Log(_L("  02 Create and install active object that will do the test:"));
+
+	CMBufAsyncPoolCeilingFull* poolCeilingFull;
+	CleanupStack::PushL(poolCeilingFull = new(ELeave) CMBufAsyncPoolCeilingFull(*this));
+
+	Log(_L("  03 Start the test:"));
+	if(poolCeilingFull->DoStartTest() != KErrNone)
+		{
+		Log(_L("Error: Async Alloc's failing in test run:"));
+		User::Leave(EFail);
+		}
+	//Clean up stack
+	CleanupStack::PopAndDestroy(); // poolCeilingFull
+	CleanupStack::PopAndDestroy(); // bufpond
+	CActiveScheduler::Install(NULL);
+	CleanupStack::PopAndDestroy(iActSch);
+
+	__UHEAP_MARKEND;
+	return EPass;
+	}
+
+RCommsBufPond& CTest20PoolCeilingFull::BufPond()
+	{
+	return iBufPond;
+	}
+
+CMBufAsyncPoolCeilingFull::CMBufAsyncPoolCeilingFull(CTest20PoolCeilingFull& aTestObject)
+: CActive(EPriorityStandard),
+	iTestObject(aTestObject)
+	{
+	CActiveScheduler::Add(this);
+	}
+
+
+CMBufAsyncPoolCeilingFull::~CMBufAsyncPoolCeilingFull()
+	{
+	Cancel();
+	iAsyncChain.Free();	
+	}
+
+void CMBufAsyncPoolCeilingFull::CompleteSelf()
+	{
+	TRequestStatus* pStat = &iStatus;
+	User::RequestComplete(pStat, KErrNone);
+	SetActive();
+	}
+
+void CMBufAsyncPoolCeilingFull::RunL()
+	{
+	User::LeaveIfError(iStatus.Int());
+	
+	if((iThread1.ExitType() != EExitPending))
+		{
+		CActiveScheduler::Stop();
+		return;		
+		}
+	if(iAsyncChain.IsEmpty())
+		{
+		iAsyncRequest.Alloc(iAsyncChain, 256 * 8, iStatus);	
+		SetActive();							
+		}
+	else
+		{
+		iAsyncChain.Free();			
+		CompleteSelf();		
+		}	
+	}
+
+void CMBufAsyncPoolCeilingFull::DoCancel()
+	{
+	iAsyncRequest.Cancel();
+	}
+
+
+TInt CMBufAsyncPoolCeilingFull::DoStartTest()
+	{
+	
+	TInt err=iThread1.Create(_L("testThread1Rec"),
+		                       fThread1,
+ 							   KDefaultStackSize,
+							   KDefaultHeapSize,
+							   KMaxHeapSize,
+							   (TAny*)&iTestObject,
+							   EOwnerProcess);
+	if (err!=KErrNone)
+		{
+		User::Leave(EFail);
+		}
+	iThread1.SetPriority(EPriorityAbsoluteHigh);
+	iThread1.Resume();
+	iAsyncRequest.Alloc(iAsyncChain, 256, iStatus);	
+	SetActive();
+	CActiveScheduler::Start();
+
+	iThread1.Close();
+	iThread2.Close();
+	iThread3.Close();
+
+	return iError;
+	}
+
+
+TInt CMBufAsyncPoolCeilingFull::fThread1(TAny* aInput)
+	{
+	TInt totalAllocation = 100;
+	CTest20PoolCeilingFull* pTestObject = (CTest20PoolCeilingFull*)aInput;
+	// We need to introduce this new client thread to the MBufMgr
+	TCommsBufPondTLSOp tls(pTestObject->BufPond());
+	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
+	TBool freeMem = EFalse;
+	for(TInt i=0; i < 1000; ++i)
+		{
+		RMBufChain chain;
+		chain.Alloc(512, 256, 256);
+		if(freeMem)
+			{
+			chain.Free();
+			freeMem = EFalse;	
+			}
+		else
+			{
+			pTestObject->iChain.Append(chain);
+			freeMem = ETrue;
+			}
+		if(pTestObject->iChain.NumBufs() == totalAllocation)
+			{
+			// Free all. Will trigger the AO.
+			pTestObject->iChain.Free();
+			break;
+			}	
+		//Sleep for 5ms
+		aTimer.After(aTimerStatus,5000);
+		User::WaitForRequest(aTimerStatus);
+		}	
+	CActiveScheduler::Install(NULL);
+	delete aActSch;
+	delete aCleanup;
+	return KErrNone;
+	}
+
+
+