persistentstorage/sql/SRC/Client/SqlResourceTest.cpp
changeset 0 08ec8eefde2f
child 11 211563e4b919
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/persistentstorage/sql/SRC/Client/SqlResourceTest.cpp	Fri Jan 22 11:06:30 2010 +0200
@@ -0,0 +1,276 @@
+// Copyright (c) 2006-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 <sqldb.h>				//TSqlResourceTester
+#include "SqlResourceTest.h"	//TSqlResourceTestData
+#include "SqlPanic.h"			//__SQLASSERT, ESqlPanicInternalError
+#include "SqlDbSession.h"		//RSqlDbSession
+#include "SqlResourceTester.h"		//TSqlResourceTester
+
+///////////////////////////////////////////////////////////////////////////////////////////////////////
+////////////////////////             TSqlResourceTestData                 /////////////////////////////
+///////////////////////////////////////////////////////////////////////////////////////////////////////
+
+#ifdef _DEBUG
+
+/**
+Ensures that TSqlResourceTestData singleton is created and returns a pointer to the object.
+
+The function has a meaningfull implementation only in _DEBUG mode.
+
+@return A pointer to TSqlResourceTestData singleton. The return result might be NULL.
+*/
+TSqlResourceTestData* TSqlResourceTestData::Instance()
+	{
+	TSqlResourceTestData* instance = static_cast <TSqlResourceTestData*> (Dll::Tls());
+	if(!instance)
+		{
+		instance = new TSqlResourceTestData;
+		if(instance)
+			{
+			if(Dll::SetTls(instance) != KErrNone)
+				{
+				delete instance;	
+				instance = NULL;
+				}
+			}
+		}
+	return instance;
+	}
+
+/**
+Destroys TSqlResourceTestData singleton.
+
+The function has a meaningfull implementation only in _DEBUG mode.
+*/
+void TSqlResourceTestData::Release()
+	{
+	TSqlResourceTestData* instance = static_cast <TSqlResourceTestData*> (Dll::Tls());
+	delete instance;
+	(void)Dll::SetTls(NULL);
+	}
+		
+/**
+Initializes TSqlResourceTestData singleton with a reference to RSqlDbSession instance.
+If a test data has been previously set by calling TSqlResourceTestData::Set(), then
+the test data will be sent now to the SQL server.
+
+The function has a meaningfull implementation only in _DEBUG mode.
+
+@param aDbSession A reference to RDbSession instance.
+
+@return KErrNone The call completed successfully, system-wide error code otherwise.
+*/
+TInt TSqlResourceTestData::Init(RSqlDbSession& aDbSession)
+	{
+	iDbSession = &aDbSession;
+	TInt rc = KErrNone;
+	if(iRqPending)
+		{
+		rc = iDbSession->SendReceive(iFunction, TIpcArgs(iAllocFailType, iRate));
+		}
+	iRqPending = EFalse;
+	return rc;
+	}
+	
+/**
+If the TSqlResourceTestData singleton is already initialized (TSqlResourceTestData::Init() call),
+then the test command and data will be sent directly to the SQL server. Othwerwise the test command
+and data will be stored and sent later when the TSqlResourceTestData singleton gets initialized.
+
+The function has a meaningfull implementation only in _DEBUG mode.
+
+@param aFunction Test command to be sent to the SQL server
+@param aAllocFailType Heap failure allocation type
+@param arate Heap failure rate
+
+@return KErrNone The call completed successfully, system-wide error code otherwise.
+*/
+TInt TSqlResourceTestData::Set(TSqlSrvFunction aFunction, TInt aAllocFailType, TInt aRate)
+	{
+	__SQLASSERT(!iRqPending, ESqlPanicMisuse);
+	if(iDbSession)	
+		{
+		return iDbSession->SendReceive(aFunction, TIpcArgs(aAllocFailType, aRate));
+		}
+	else
+		{
+		iFunction = aFunction;
+		iAllocFailType = aAllocFailType;
+		iRate = aRate;
+		iRqPending = ETrue;
+		return KErrNone;
+		}
+	}
+
+/**
+The function has a meaningfull implementation only in _DEBUG mode.
+*/
+TSqlResourceTestData::TSqlResourceTestData() :
+	iRqPending(EFalse),
+	iDbSession(NULL),
+	iFunction(ESqlSrvTestBase),
+	iAllocFailType(RHeap::ENone),
+	iRate(0)
+	{
+	}
+
+///////////////////////////////////////////////////////////////////////////////////////////////////////
+////////////////////////             TSqlResourceTester                 ///////////////////////////////
+///////////////////////////////////////////////////////////////////////////////////////////////////////
+
+//Sends a test command to the SQL server.
+//aFunction parameter is the test command code to be sent, 
+//aAllocFailType is the heap failure type, aRate is the heap failure rate.
+//
+//The function will get a pointer to the TSqlResourceTestData instance and call its Set() method to
+//send the test command and data.
+static TInt SendCommand(TSqlSrvFunction aFunction, TInt aAllocFailType, TInt aRate)
+	{
+	TInt rc = KErrNoMemory;
+	TSqlResourceTestData* instance = TSqlResourceTestData::Instance();
+	if(instance)
+		{
+		rc = instance->Set(aFunction, aAllocFailType, aRate);
+		}
+	return rc;
+	}
+
+//Sends a test command to the SQL server.
+//aFunction parameter is the test command code to be sent, 
+//
+//The function will get a pointer to the TSqlResourceTestData instance and call its Set() method to
+//send the test command and data.
+static TInt SendCommand(TSqlSrvFunction aFunction)
+	{
+	return SendCommand(aFunction, RHeap::ENone, 0);
+	}
+
+/**
+Sends a request to the SQL server to mark the allocated resources.
+
+The function has a meaningfull implementation only in _DEBUG mode.
+*/
+EXPORT_C void TSqlResourceTester::Mark()
+	{
+	(void)::SendCommand(ESqlSrvResourceMark);
+	}
+	
+/**
+Sends a request to the SQL server to check the allocated resources.
+(to compare their count with the marked resource count, made by the 
+ TSqlResourceTester::Mark() call)
+
+The function has a meaningfull implementation only in _DEBUG mode.
+*/
+EXPORT_C void TSqlResourceTester::Check()
+	{
+	(void)::SendCommand(ESqlSrvResourceCheck);
+	}
+	
+/**
+@return Count of the allocated SQL server resources.
+
+The function has a meaningfull implementation only in _DEBUG mode.
+*/
+EXPORT_C TInt TSqlResourceTester::Count()
+	{
+	return ::SendCommand(ESqlSrvResourceCount);
+	}
+
+/**
+Sends a request to the SQL server to simulate out of memory failure.
+This call can be used to test the server side of RSqlDatabase class.
+
+The function has a meaningfull implementation only in _DEBUG mode.
+
+@param aAllocFailType Heap failure allocation type
+	   	If bit 12 of aAllocFailType is set, then the SQL server will delay
+	   	the heap failure simulation until the database is opened.
+@param arate Heap failure rate
+*/
+EXPORT_C void TSqlResourceTester::SetDbHeapFailure(TInt aAllocFailType, TInt aRate)
+	{
+	if(static_cast <RHeap::TAllocFail> (aAllocFailType) == RHeap::ENone)
+		{
+		//This is a command to reset the memory allocation failure simulation.
+		//Execute it only if there is a valid TSqlResourceTestData instance.
+		//Otherwise this function will try to allocate memory for TSqlResourceTestData instance
+		//and this happens at the moment when the request is for stopping the simulation (so the OOM test).
+		//The test application will find one more memory cell is allocated and will fail.
+		TSqlResourceTestData* instance = static_cast <TSqlResourceTestData*> (Dll::Tls());
+		if(!instance)
+			{
+			return;	
+			}
+		}
+	(void)::SendCommand(ESqlSrvSetDbHeapFailure, aAllocFailType, aRate);
+	}
+	
+/**
+Sends a request to the SQL server to simulate out of memory failure.
+This call can be used to test the server side of RSqlStatement class.
+
+The function has a meaningfull implementation only in _DEBUG mode.
+
+@param aAllocFailType Heap failure allocation type
+@param arate Heap failure rate
+*/
+EXPORT_C void TSqlResourceTester::SetHeapFailure(TInt aAllocFailType, TInt aRate)
+	{
+	if(static_cast <RHeap::TAllocFail> (aAllocFailType) == RHeap::ENone)
+		{
+		//This is a command to reset the memory allocation failure simulation.
+		//Execute it only if there is a valid TSqlResourceTestData instance.
+		//Otherwise this function will try to allocate memory for TSqlResourceTestData instance
+		//and this happens at the moment when the request is for stopping the simulation (so the OOM test).
+		//The test application will find one more memory cell is allocated and will fail.
+		TSqlResourceTestData* instance = static_cast <TSqlResourceTestData*> (Dll::Tls());
+		if(!instance)
+			{
+			return;	
+			}
+		}
+	(void)::SendCommand(ESqlSrvSetHeapFailure, aAllocFailType, aRate);
+	}
+
+#else //_DEBUG
+
+void TSqlResourceTestData::Release()
+	{
+	}
+
+EXPORT_C void TSqlResourceTester::Mark()
+	{
+	}
+
+EXPORT_C void TSqlResourceTester::Check()
+	{
+	}
+
+EXPORT_C TInt TSqlResourceTester::Count()
+	{
+	return 0;
+	}
+
+EXPORT_C void TSqlResourceTester::SetDbHeapFailure(TInt, TInt)
+	{
+	}
+
+EXPORT_C void TSqlResourceTester::SetHeapFailure(TInt, TInt)
+	{
+	}
+
+#endif//_DEBUG