commsfwutils/commsbufs/version1/mbufmgr/TS_mbufmgr/Test20Alloc.cpp
changeset 0 dfb7c4ff071f
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/commsfwutils/commsbufs/version1/mbufmgr/TS_mbufmgr/Test20Alloc.cpp	Thu Dec 17 09:22:25 2009 +0200
@@ -0,0 +1,170 @@
+// Copyright (c) 2001-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 definition of CTestStepCTMbufmgr which is the base class
+// for all the Mbufmgr Test Step classes
+//
+
+#include <e32base.h>
+
+// Test system includes
+#include <networking/log.h>
+#include <networking/teststep.h>
+#include "TestStepCTMbufmgr.h"
+#include "TestSuiteCTMbufmgr.h"
+
+#include "Test20Alloc.h"
+
+// constructor
+CTest20Alloc::CTest20Alloc()
+	{
+	iTestStepName = _L("MBufMgrTest20");// Store the name of this test case
+	}
+
+// destructor
+CTest20Alloc::~CTest20Alloc()
+	{
+	}
+
+struct AllocTestStruct
+{
+	TInt min;
+	TInt max;
+	TInt allocSize;
+	TInt expectedSize;
+	TInt expectedBufCount;
+	TInt expectedBufSizes[4];
+};
+
+const AllocTestStruct allocTests[] =
+{
+	{   64,   96,   96,    0, 0, {} },  // lower min nax range than pool range
+	{ 1800, 2000,   96,    0, 0, {} },  // higher min nax range than pool range
+	{ 1400, 1400,   96,    0, 0, {} },	// mid max range that doesn't match contain any pools
+	{ 1600, 1600,   96,   96, 1, {1600} },  // highest size, allocate smaller
+	{  128,  128,   96,   96, 1, {128} },  // lowest size, allocate smaller
+	{  400,  400,   96,   96, 1, {400} },  // mid size, allocate smaller
+	{ 1600, 1600, 3200, 3200, 2, {1600,1600} },  // highest size, allocate slightly higher
+	{ 1600, 1600, 1604, 1604, 2, {1600,1600} },  // highest size, allocate slightly higher
+	{  128,  128,  132,  132, 2, {128,128} },  // lowest size, allocate slightly higher
+	{  400,  400,  260,  260, 1, {400} },  // mid size, allocate slightly higher
+	{  128, 1600, 1604, 1604, 2, {1600,128} },  //
+	{  128, 1600, 1728, 1728, 2, {1600,128} },  //
+	{  128, 1600, 1856, 1856, 2, {1600,400} },  //
+	{  128, 1600, 2000, 2000, 2, {1600,400} },  //
+	{  128, 1600, 2128, 2128, 2, {1600,1600} },  //
+	{  128, 1600, 2130, 2130, 2, {1600,1600} },  //
+	{  128, 1600, 2398, 2398, 2, {1600,1600}, },  //
+	{  128,  128,  300,  300, 3, {128,128,128} },  //
+	{  128, 1600, 3208, 3208, 3, {1600,1600,128} },  // Edge case spotted in old algorithm by SMP work
+    { 1600, 1600, 3208, 3208, 3, {1600,1600,1600} },  // Edge case spotted in old algorithm by SMP work
+
+	{    0,    0,    0,    0,-1, {} }   // -1 indicates end of list
+};
+
+//
+enum TVerdict CTest20Alloc::doTestStepL(void)
+	{
+	__UHEAP_MARK;
+
+#ifdef __CFLOG_ACTIVE
+	__CFLOG_CREATEL;
+	__CFLOG_OPEN;
+#endif
+
+	//-------------- substep 1 --------------------
+	Log(_L("  01 Create CMBufManager and install active scheduler:"));
+    CleanupStack::PushL( iActSch = new(ELeave) CActiveScheduler );
+	CActiveScheduler::Install(iActSch);
+
+	MMBufSizeAllocator* MBufSizeAllocator;
+	CleanupStack::PushL(CreateInstanceMBufMgrL(KMBufDefaultHeapSize / 2, MBufSizeAllocator));
+
+	// Create some initial pools
+	MBufSizeAllocator->AddL(128,  128, 64, 48);
+	MBufSizeAllocator->AddL(400,  32,  16, 12);
+	MBufSizeAllocator->AddL(1600, 32,  16, 12);
+
+	TBool accumulatedFail = EFalse;
+
+	//-------------- substep 2 --------------------
+	Log(_L("  02 Alloc Tests"));
+	const AllocTestStruct* test = allocTests;
+	while(test->expectedBufCount != -1)
+	    {
+		TBool fail = EFalse;
+		RMBufChain chain;
+
+		//-------------- substep 2 --------------------
+		_LIT(aLog1, "  Min %d Max %d Alloc %d");
+		Log(aLog1,test->min,test->max,test->allocSize);
+		chain.Alloc(test->allocSize,test->min,test->max);
+
+		if(chain.Length() != test->expectedSize)
+			{
+		    _LIT(aLog2, "Error: Wrong number of bytes allocated: received %d expected %d");
+			Log(aLog2,chain.Length(),test->expectedSize);
+			fail = ETrue;
+			}
+		if( (!chain.IsEmpty() && chain.NumBufs() != test->expectedBufCount)
+		 || ( chain.IsEmpty() &&               0 != test->expectedBufCount)
+		  )
+			{
+		    _LIT(aLog3, "Error: Wrong number of buffers allocated: received %d expected %d");
+			Log(aLog3,chain.IsEmpty()?0:chain.NumBufs(),test->expectedBufCount);
+			fail = ETrue;
+		    }
+
+        if(!chain.IsEmpty())
+            {
+			RMBuf* buf = chain.First();
+			int count=0;
+			while(count<chain.NumBufs() && buf)
+				{
+				if(buf->Size() != test->expectedBufSizes[count])
+				   {
+					_LIT(aLog4, "Error: Expected buffer %d in the chain to be %d rather than %d");
+					Log(aLog4,count,test->expectedBufSizes[count],buf->Size());
+				   fail = ETrue;
+			       }
+
+				buf = buf->Next();
+				count++;
+				}
+			}
+
+        accumulatedFail |= fail;
+		chain.Free();
+
+		++test;
+    	}
+
+	//-------------- substep 7 --------------------
+	Log(_L("  03 Clean up stack:"));
+    CleanupStack::PopAndDestroy(iMBMngr);
+	CActiveScheduler::Install(NULL);
+	CleanupStack::PopAndDestroy(iActSch);
+
+#ifdef __CFLOG_ACTIVE
+	__CFLOG_CLOSE;
+	__CFLOG_DELETE;
+#endif
+    __UHEAP_MARKEND;
+
+    if (accumulatedFail)
+    	{
+    	return EFail;
+    	}
+
+	return EPass;
+	}