kerneltest/e32test/device/d_newldd.cpp
changeset 0 a41df078684a
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/kerneltest/e32test/device/d_newldd.cpp	Mon Oct 19 15:55:17 2009 +0100
@@ -0,0 +1,328 @@
+// Copyright (c) 2008-2009 Nokia Corporation and/or its subsidiary(-ies).
+// All rights reserved.
+// This component and the accompanying materials are made available
+// under the terms of the License "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 <kernel/kern_priv.h>
+#include "d_newldd.h"
+#include "t_newldd.h"
+
+TInt DOperatorNewTest::Request(TInt aReqNo, TAny* /*a1*/, TAny* /*a2*/)
+	{
+	switch(aReqNo)
+		{
+		//new
+		case RNewLddTest::ENew:
+			{
+			return TestNew();
+			}
+		//placement new
+		case RNewLddTest::EPlacementVectorNew:
+			{
+			return TestPlacementVectorNew();
+			}
+		//vector new
+		case RNewLddTest::EVectorNew:
+			{
+			return TestVectorNew();
+			}
+		case RNewLddTest::EPlacementNew:
+			{
+			return TestPlacementNew();
+			}
+		default:
+			break;
+		}
+	return KErrNone;
+	}
+
+TInt DOperatorNewTest::TestNew()
+	{
+	Kern::Printf("::TestNew()");
+	NKern::ThreadEnterCS();
+
+	#define TEST_KERN_NEW_OOM(CLASS)\
+		{\
+		Kern::Printf("new " #CLASS);\
+		CLASS* p##CLASS=NULL;\
+		XTRAPD(r,XT_DEFAULT, p##CLASS = new CLASS);\
+		if(r!=KErrNone)\
+			{\
+			NKern::ThreadLeaveCS();\
+			return r;\
+			}\
+		if(p##CLASS)\
+			{\
+			delete p##CLASS;\
+			NKern::ThreadLeaveCS();\
+			return KErrGeneral;\
+			}\
+		}
+
+	//OOM tests: should(must) not throw
+	Kern::Printf("OOM Tests;");
+
+	TEST_KERN_NEW_OOM(XVeryLargeClassCtorAndDtor);
+	TEST_KERN_NEW_OOM(XVeryLargeClassCtorOnly);
+	TEST_KERN_NEW_OOM(XVeryLargeClassDtorOnly);
+	TEST_KERN_NEW_OOM(XVeryLargeClassNoTors);
+
+	Kern::Printf("non-OOM Tests;");
+	//Non-OOM:
+	
+	#define TEST_KERN_NEW(CLASS, TEST_CTOR)\
+		{\
+		Kern::Printf("new " #CLASS);\
+		CLASS* p##CLASS=NULL;\
+		XTRAPD(r,XT_DEFAULT, p##CLASS = new CLASS);\
+		if(r!=KErrNone)\
+			{\
+			NKern::ThreadLeaveCS();\
+			return r;\
+			}\
+		if(p##CLASS==NULL)\
+			{\
+			NKern::ThreadLeaveCS();\
+			return KErrGeneral;\
+			}\
+		volatile TBool testCtor=(TEST_CTOR);\
+		if(testCtor && (p##CLASS->iState!=EConstructed) )\
+			{\
+			r=KErrGeneral;\
+			}\
+		delete p##CLASS;\
+		p##CLASS=NULL;\
+		if(r!=KErrNone)\
+			return r;\
+		}
+
+	TEST_KERN_NEW(XCtorAndDtor, ETrue);
+	TEST_KERN_NEW(XCtorOnly, ETrue);
+	TEST_KERN_NEW(XDtorOnly, EFalse);
+	TEST_KERN_NEW(XNoTors, EFalse);
+	
+	NKern::ThreadLeaveCS();
+	return KErrNone;
+	}
+
+TInt DOperatorNewTest::TestPlacementNew()
+	{
+	Kern::Printf("::TestPlacementNew");
+
+	#define TEST_KERN_PLACEMENT_NEW(CLASS, POST_CTOR, POST_DTOR) \
+		{\
+		Kern::Printf("new(someram) " #CLASS);\
+		NKern::ThreadEnterCS();\
+		void* someram = Kern::AllocZ(sizeof(CLASS));\
+		NKern::ThreadLeaveCS();\
+		if(!someram)\
+			return KErrNoMemory;\
+		\
+		CLASS* p##CLASS = new (someram) CLASS;\
+		TInt r=KErrNone;\
+		if(p##CLASS->iState != POST_CTOR)\
+			{\
+			r=KErrGeneral;\
+			}\
+		if(r==KErrNone)\
+			{\
+			p##CLASS->~CLASS();\
+			if(p##CLASS->iState != POST_DTOR)\
+				{\
+				r=KErrGeneral;\
+				}\
+			}\
+		NKern::ThreadEnterCS();\
+		Kern::Free(someram);\
+		NKern::ThreadLeaveCS();\
+		if(r != KErrNone)\
+			return r;\
+		}
+
+	TEST_KERN_PLACEMENT_NEW(XCtorAndDtor, EConstructed, EDeconstructed);
+	TEST_KERN_PLACEMENT_NEW(XCtorOnly, EConstructed, EConstructed);
+	TEST_KERN_PLACEMENT_NEW(XDtorOnly, ENull, EDeconstructed);
+	TEST_KERN_PLACEMENT_NEW(XNoTors, ENull, ENull);
+	
+	return KErrNone;
+	}
+
+TInt DOperatorNewTest::TestPlacementVectorNew()
+	{
+	
+	Kern::Printf("::TestPlacementVectorNew");
+	
+	//for vector placement new, emulator compilers 
+	//allocate a cookie at start of buffer.
+	//this seems wrong since the cookie is an internal compiller
+	//detail which the user should not need to know about
+	#if defined(__WINSCW__) || defined(__VC32__)
+	Kern::Printf("Not running on emulator. WINSCW and Visual studio\n insert a cookie for placement vector new"); 
+
+	#else
+
+	#define TEST_KERN_PLACEMENT_VECTOR_NEW(CLASS, ARRAY_LENGTH, POST_CTOR, POST_DTOR) \
+		{\
+		NKern::ThreadEnterCS();\
+		void* someram = Kern::AllocZ(sizeof(CLASS) * (ARRAY_LENGTH));\
+		NKern::ThreadLeaveCS();\
+		if(someram==NULL)\
+			return KErrNoMemory;\
+		\
+		TInt r = KErrNone;\
+		Kern::Printf("new (someram) " #CLASS "[%d]", ARRAY_LENGTH);\
+		\
+		CLASS* p##CLASS = new (someram) CLASS[ARRAY_LENGTH];\
+		for(TInt i=0; i<(ARRAY_LENGTH); ++i)\
+			{\
+			if(p##CLASS[i].iState != POST_CTOR)\
+				{\
+				r=KErrGeneral;\
+				break;\
+				}\
+			p##CLASS[i].~CLASS();\
+			if(p##CLASS[i].iState != POST_DTOR)\
+				{\
+				r=KErrGeneral;\
+				break;\
+				}\
+			}\
+		NKern::ThreadEnterCS();\
+		Kern::Free(someram);\
+		NKern::ThreadLeaveCS();\
+		if(r!=KErrNone)\
+			return r;\
+		}\
+	
+	TEST_KERN_PLACEMENT_VECTOR_NEW(XCtorAndDtor, KTestArrayLength, EConstructed, EDeconstructed);
+	TEST_KERN_PLACEMENT_VECTOR_NEW(XCtorOnly, KTestArrayLength, EConstructed, EConstructed);
+	TEST_KERN_PLACEMENT_VECTOR_NEW(XDtorOnly, KTestArrayLength, ENull, EDeconstructed);
+	TEST_KERN_PLACEMENT_VECTOR_NEW(XNoTors, KTestArrayLength, ENull, ENull);
+
+	#endif
+
+	return KErrNone;
+	}
+TInt DOperatorNewTest::TestVectorNew()
+	{
+	//OOM testing
+	Kern::Printf("::TestVectorNew()");
+	Kern::Printf("OOM test");
+	
+	TInt r=KErrNone;
+
+	#define TEST_KERN_VECTOR_NEW_OOM(CLASS, ARRAY_LENGTH)\
+	{\
+		Kern::Printf("new " #CLASS "[%d]", ARRAY_LENGTH);\
+		CLASS* p##CLASS = NULL;\
+		NKern::ThreadEnterCS();\
+		XTRAP(r,XT_DEFAULT,p##CLASS = new CLASS[ARRAY_LENGTH]; );\
+		if(p##CLASS)\
+			{\
+			r=KErrGeneral;\
+			delete p##CLASS;\
+			}\
+		NKern::ThreadLeaveCS();\
+		if(r!=KErrNone)\
+			{\
+			return r;\
+			}\
+	}\
+
+	TEST_KERN_VECTOR_NEW_OOM(XCtorAndDtor, KOOMArraySize);
+	TEST_KERN_VECTOR_NEW_OOM(XCtorOnly, KOOMArraySize);
+	TEST_KERN_VECTOR_NEW_OOM(XDtorOnly, KOOMArraySize);
+	TEST_KERN_VECTOR_NEW_OOM(XNoTors, KOOMArraySize);
+
+	
+	//non-OOM:
+	Kern::Printf("non-OOM test");
+
+	#define TEST_KERN_VECTOR_NEW(CLASS, ARRAY_LENGTH, TEST_CTOR)\
+	{\
+		Kern::Printf("new " #CLASS "[%d]", ARRAY_LENGTH);\
+		CLASS* p##CLASS = NULL;\
+		NKern::ThreadEnterCS();\
+		XTRAP(r,XT_DEFAULT,p##CLASS = new CLASS[ARRAY_LENGTH]; );\
+		NKern::ThreadLeaveCS();\
+		if(p##CLASS == NULL)\
+			{\
+			return KErrNoMemory;\
+			}\
+		\
+		TBool testCtor=(TEST_CTOR);\
+		if(testCtor)\
+			{\
+			for(TInt i=0; i<(ARRAY_LENGTH); ++i)\
+				{\
+				if(p##CLASS[i].iState!=	EConstructed)\
+					{\
+					r=KErrGeneral;\
+					break;\
+					}\
+				}\
+			}\
+		\
+		NKern::ThreadEnterCS();\
+		delete[] p##CLASS;\
+		NKern::ThreadLeaveCS();\
+		p##CLASS=NULL;\
+		if(r!=KErrNone)\
+			{\
+			return r;\
+			}\
+	}\
+
+	TEST_KERN_VECTOR_NEW(XCtorAndDtor, KTestArrayLength, ETrue);
+	TEST_KERN_VECTOR_NEW(XCtorOnly, KTestArrayLength, ETrue);
+	TEST_KERN_VECTOR_NEW(XDtorOnly, KTestArrayLength, EFalse);
+	TEST_KERN_VECTOR_NEW(XNoTors, KTestArrayLength, EFalse);
+
+	return KErrNone;
+	}
+
+TInt DOperatorNewTestFactory::Create(DLogicalChannelBase*& aChannel)
+//
+// Create a new DTest on this logical device
+//
+	{
+	aChannel=new DOperatorNewTest();
+	return aChannel?KErrNone:KErrNoMemory;
+	}
+
+TInt DOperatorNewTestFactory::Install()
+//
+// Install the LDD - overriding pure virtual
+//
+	{
+	iVersion = TVersion(0,1,1);
+	return SetName(&KLddName);
+	}
+
+void DOperatorNewTestFactory::GetCaps(TDes8& /*aDes*/) const
+//
+// Get capabilities - overriding pure virtual
+//
+	{
+	//not supported
+	}
+
+
+
+DECLARE_STANDARD_LDD()
+	{
+	//create factory here.
+	return new DOperatorNewTestFactory;
+	}
+
+