mmlibs/mmfw/tsrc/mmfunittest/DevVideo/src/TestStepDevVideoAllocFailNew.cpp
changeset 0 40261b775718
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/mmlibs/mmfw/tsrc/mmfunittest/DevVideo/src/TestStepDevVideoAllocFailNew.cpp	Tue Feb 02 01:56:55 2010 +0200
@@ -0,0 +1,1773 @@
+// Copyright (c) 2003-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:
+// This file contains the implementation of the various 
+// ALLOC tests for DevVideo
+// 
+//
+
+// Test system includes
+#include <testframework.h>
+
+#include "TestDevVideoPlugins/decoder.h"
+#include "TestDevVideoPlugins/postproc.h"
+
+#include "TestDevVideoPlugins/encoder.h"
+#include "TestDevVideoPlugins/preproc.h"
+
+#include "TestStepDevVideoAllocFailNew.h"
+#include "TestDevVideoPlayTestData.h"
+
+
+// --------------------------------------------
+
+/**
+ *
+ * Test step constructor.
+ * Each test step initialises its own name.
+ *
+ */
+CTestStepDevVideoPlayAllocFail::CTestStepDevVideoPlayAllocFail(const TDesC& aTestName)
+	{
+	// store the name of this test case
+	// this is the name that is used by the script file
+	iTestStepName = aTestName;
+	}
+
+/**
+ *
+ * Test step destructor.
+ * 
+ */
+CTestStepDevVideoPlayAllocFail::~CTestStepDevVideoPlayAllocFail()
+	{
+	}
+
+// MMMFDevVideoPlayObserver
+void CTestStepDevVideoPlayAllocFail::MdvpoNewBuffers()
+	{
+	INFO_PRINTF1(_L("CTestStepDevVideoPlayAllocFail::MdvpoNewBuffers()"));
+	}
+
+void CTestStepDevVideoPlayAllocFail::MdvpoReturnPicture(TVideoPicture* /*aPicture*/)
+	{
+	INFO_PRINTF1(_L("CTestStepDevVideoPlayAllocFail::MdvpoReturnPicture()"));
+	}
+
+void CTestStepDevVideoPlayAllocFail::MdvpoSupplementalInformation(const TDesC8& /*aData*/, 
+								  const TTimeIntervalMicroSeconds& /*aTimestamp*/, 
+								  const TPictureId& /*aPictureId*/)
+	{
+	INFO_PRINTF1(_L("CTestStepDevVideoPlayAllocFail::MdvpoSupplementalInformation()"));
+	}
+
+void CTestStepDevVideoPlayAllocFail::MdvpoPictureLoss()
+	{
+	INFO_PRINTF1(_L("CTestStepDevVideoPlayAllocFail::MdvpoPictureLoss()"));
+	}
+
+void CTestStepDevVideoPlayAllocFail::MdvpoPictureLoss(const TArray<TPictureId>& /*aPictures*/)
+	{
+	INFO_PRINTF1(_L("CTestStepDevVideoPlayAllocFail::MdvpoPictureLoss(TArray)"));
+	}
+
+void CTestStepDevVideoPlayAllocFail::MdvpoSliceLoss(TUint /*aFirstMacroblock*/, TUint /*aNumMacroblocks*/, const TPictureId& /*aPicture*/)
+	{
+	INFO_PRINTF1(_L("CTestStepDevVideoPlayAllocFail::MdvpoSliceLoss()"));
+	}
+
+void CTestStepDevVideoPlayAllocFail::MdvpoReferencePictureSelection(const TDesC8& /*aSelectionData*/)
+	{
+	INFO_PRINTF1(_L("CTestStepDevVideoPlayAllocFail::MdvpoReferencePictureSelection()"));
+	}
+
+void CTestStepDevVideoPlayAllocFail::MdvpoTimedSnapshotComplete(TInt /*aError*/, 
+								TPictureData* /*aPictureData*/, 
+								const TTimeIntervalMicroSeconds& /*aPresentationTimestamp*/, 
+								const TPictureId& /*aPictureId*/)
+	{
+	INFO_PRINTF1(_L("CTestStepDevVideoPlayAllocFail::MdvpoTimedSnapshotComplete()"));
+	}
+
+void CTestStepDevVideoPlayAllocFail::MdvpoNewPictures()
+	{
+	INFO_PRINTF1(_L("CTestStepDevVideoPlayAllocFail::MdvpoNewPictures()"));
+	}
+
+void CTestStepDevVideoPlayAllocFail::MdvpoFatalError(TInt aError)
+	{
+	iError = aError;
+	INFO_PRINTF2(_L("CTestStepDevVideoPlayAllocFail::MdvpoFatalError()\nError = %d"), aError);
+	}
+
+void CTestStepDevVideoPlayAllocFail::MdvpoInitComplete(TInt aError)
+	{
+	iError = aError;
+	INFO_PRINTF2(_L("CTestStepDevVideoPlayAllocFail::MdvpoInitComplete():  Error = %d"), aError);
+	}
+
+void CTestStepDevVideoPlayAllocFail::MdvpoStreamEnd()
+	{
+	INFO_PRINTF1(_L("CTestStepDevVideoPlayAllocFail::MdvpoStreamEnd()"));
+	}
+
+/**
+ *
+ * Do the test step.
+ * Each test step must supply an implementation for DoTestStepL.
+ *
+ * @return	"TVerdict"
+ *			The result of the test step
+ *
+ */
+TVerdict CTestStepDevVideoPlayAllocFail::DoTestStepL()
+	{
+	TVerdict ret = EFail;
+
+	// do we want to do anything else in the base class?
+
+	// call alloc test step
+	ret = DoTestL();
+
+	return	ret;
+	}
+
+
+//----------------------------------------------------------------------------
+
+CTestStepDevVideoPlayAllocFailNew::CTestStepDevVideoPlayAllocFailNew(const TDesC& aTestName)
+	:CTestStepDevVideoPlayAllocFail(aTestName)
+	{
+	}
+
+CTestStepDevVideoPlayAllocFailNew* CTestStepDevVideoPlayAllocFailNew::NewL(const TDesC& aTestName)
+	{
+	CTestStepDevVideoPlayAllocFailNew* self = new(ELeave) CTestStepDevVideoPlayAllocFailNew(aTestName);
+	return self;
+	}
+
+CTestStepDevVideoPlayAllocFailNew::~CTestStepDevVideoPlayAllocFailNew()
+	{
+	}
+
+TVerdict CTestStepDevVideoPlayAllocFailNew::DoTestL()
+	{
+	iTestStepResult = EPass;
+    TInt err       = KErrNone;
+
+	// Printing to the console and log file
+	INFO_PRINTF1(_L("this is an Alloc Failure test of initialising CMMFDevVideoPlay with NewL()"));
+
+	__UHEAP_MARK;
+	TRAP( err, iDevVideoPlay = CMMFDevVideoPlay::NewL(*this) );
+	delete iDevVideoPlay;
+	iDevVideoPlay = NULL;
+	__UHEAP_MARKEND;
+
+	if (err != KErrNone)
+		return EFail;
+
+	TInt failCount = 1;
+	TBool completed = EFalse;
+	TBool reachedEnd = EFalse; // Note: declare outside loop to help with debugging
+	for(;;)	
+		{
+		__UHEAP_SETFAIL(RHeap::EFailNext ,failCount);
+		__MM_HEAP_MARK;
+
+		TRAP( err, iDevVideoPlay = CMMFDevVideoPlay::NewL(*this);
+				   iDevVideoPlay->SelectDecoderL(KUidDevVideoTestDecodeHwDevice);
+				   iDevVideoPlay->SelectPostProcessorL(KUidDevVideoTestPostProcHwDevice); );
+
+		completed = EFalse;
+		if (err == KErrNone)
+			{
+			TAny *testAlloc = User::Alloc(1); // when this fails, we passed through all allocs within test
+			if (testAlloc==NULL)
+				{
+				reachedEnd = ETrue;
+				failCount--; // -= 1;
+				}
+			else
+				User::Free(testAlloc);
+			
+			}
+		else if (err != KErrNoMemory) // bad error code
+			completed = ETrue;
+
+		// see if valid result and break if wrong - might be premature result
+		if (iDevVideoPlay)
+			{
+			delete iDevVideoPlay;
+			iDevVideoPlay = NULL;
+			}
+		completed = reachedEnd;
+		__MM_HEAP_MARKEND;
+		__UHEAP_SETFAIL(RHeap::ENone ,0);
+
+		if (completed)
+			break; // exit loop
+
+		failCount++;
+		}
+
+	if (err != KErrNone)
+		{
+		INFO_PRINTF3(_L("Error(%d) with %d memory allocations tested"), err, failCount);
+		iTestStepResult = EFail;
+		}
+	else 
+		{
+		INFO_PRINTF2(_L("Completed OK with %d memory allocations tested"), failCount);
+		iTestStepResult = EPass;
+		}
+
+	if (iDevVideoPlay)
+		{
+		delete iDevVideoPlay;
+		iDevVideoPlay = NULL;
+		}
+
+	INFO_PRINTF1(_L("finished with this test step"));
+	// test steps return a result
+	return iTestStepResult;
+	}
+
+//----------------------------------------------------------------------------
+
+
+CTestStepDevVideoPlayAllocFailFindPlugins::CTestStepDevVideoPlayAllocFailFindPlugins(const TDesC& aTestName)
+	:CTestStepDevVideoPlayAllocFail(aTestName)
+	{
+	}
+
+CTestStepDevVideoPlayAllocFailFindPlugins* CTestStepDevVideoPlayAllocFailFindPlugins::NewL(const TDesC& aTestName)
+	{
+	CTestStepDevVideoPlayAllocFailFindPlugins* self = new(ELeave) CTestStepDevVideoPlayAllocFailFindPlugins(aTestName);
+	return self;
+	}
+
+CTestStepDevVideoPlayAllocFailFindPlugins::~CTestStepDevVideoPlayAllocFailFindPlugins()
+	{
+	}
+
+TVerdict CTestStepDevVideoPlayAllocFailFindPlugins::DoTestL()
+	{
+	iTestStepResult = EPass;
+    TInt err       = KErrNone;
+
+	// Printing to the console and log file
+	INFO_PRINTF1(_L("this is an Alloc Failure test of finding decoder and post processor plugins"));
+
+
+	TInt failCount = 1;
+	TBool completed = EFalse;
+	TBool reachedEnd = EFalse; // Note: declare outside loop to help with debugging
+	for(;;)	
+		{
+		__UHEAP_SETFAIL(RHeap::EFailNext ,failCount);
+		__MM_HEAP_MARK;
+
+		err = KErrNone;
+
+		if (!err)
+			TRAP(err, iDevVideoPlay = CMMFDevVideoPlay::NewL(*this));
+		if (!err)
+			TRAP(err, GetDecodersL());
+		if (!err)
+			TRAP(err, GetPostProcessorsL());
+		if (!err)
+			TRAP(err, FindDecodersL());
+		if (!err)
+			TRAP(err, FindPostProcessorsL());
+
+		REComSession::FinalClose();
+
+		completed = EFalse;
+		if (err == KErrNone)
+			{
+			TAny *testAlloc = User::Alloc(1); // when this fails, we passed through all allocs within test
+			if (testAlloc==NULL)
+				{
+				reachedEnd = ETrue;
+				failCount--; // -= 1;
+				}
+			else
+				User::Free(testAlloc);
+			
+			}
+		else if (err != KErrNoMemory) // bad error code
+			completed = ETrue;
+
+		// see if valid result and break if wrong - might be premature result
+		delete iDevVideoPlay;
+		iDevVideoPlay = NULL;
+
+		__MM_HEAP_MARKEND;
+		__UHEAP_SETFAIL(RHeap::ENone ,0);
+
+		if (completed || reachedEnd)
+			break; // exit loop
+
+		failCount++;
+		}
+
+	if (err != KErrNone)
+		{
+		INFO_PRINTF3(_L("Error(%d) with %d memory allocations tested"), err, failCount);
+		iTestStepResult = EFail;
+		}
+	else 
+		{
+		INFO_PRINTF2(_L("Completed OK with %d memory allocations tested"), failCount);
+		iTestStepResult = EPass;
+		}
+
+	delete iDevVideoPlay;
+	iDevVideoPlay = NULL;
+
+	INFO_PRINTF1(_L("finished with this test step"));
+	// test steps return a result
+	return iTestStepResult;
+	}
+
+void CTestStepDevVideoPlayAllocFailFindPlugins::CheckPluginsL(const RArray<TUid>& aFoundPlugins, const RArray<TUid>& aExpectedPlugins, const RArray<TUid>& aUnExpectedPlugins)
+	{
+	TBool foundUnExpected = EFalse;
+	TInt numberToBeFoundInExpectedPlugins = aExpectedPlugins.Count();
+
+	for (TInt i=0; i<aFoundPlugins.Count(); i++)
+		{
+		TUid uidToLookFor = aFoundPlugins[i];
+		TInt j;
+		for (j=0; j<aExpectedPlugins.Count(); j++)
+			{
+			if (aExpectedPlugins[j] == uidToLookFor)
+				{
+				numberToBeFoundInExpectedPlugins--;
+				break;//j
+				}
+			}
+		for (j=0; j<aUnExpectedPlugins.Count(); j++)
+			{
+			if (aUnExpectedPlugins[j] == uidToLookFor)
+				{
+				foundUnExpected = ETrue;
+				break;//j
+				}
+			}
+		}
+
+	if ((foundUnExpected) || (numberToBeFoundInExpectedPlugins!=0))
+		User::Leave(KErrGeneral);
+
+	}
+
+
+void CTestStepDevVideoPlayAllocFailFindPlugins::FindDecodersL()
+	{
+	RArray<TUid> foundDecoders;
+	CleanupClosePushL(foundDecoders);
+	RArray<TUid> expectedDecoders;
+	CleanupClosePushL(expectedDecoders);
+	RArray<TUid> unExpectedDecoders;
+	CleanupClosePushL(unExpectedDecoders);
+
+	
+	// Supported mime type and post proc type (by exact match)
+	_LIT8(KMimeType5, "video/zippyvideo");
+	TUint32 requestedPostProcType = EPpMirror|EPpInputCrop;
+	foundDecoders.Reset();
+	expectedDecoders.Reset();
+	unExpectedDecoders.Reset();
+	User::LeaveIfError(expectedDecoders.Append(KUidDevVideoTestDecodeHwDevice1));
+	User::LeaveIfError(unExpectedDecoders.Append(KUidDevVideoTestDecodeHwDevice2));
+	User::LeaveIfError(unExpectedDecoders.Append(KUidDevVideoTestDecodeHwDevice3));
+	User::LeaveIfError(unExpectedDecoders.Append(KUidDevVideoTestDecodeHwDevice4));
+	User::LeaveIfError(unExpectedDecoders.Append(KUidDevVideoTestDecodeHwDevice5));
+
+	iDevVideoPlay->FindDecodersL(KMimeType5(), requestedPostProcType, foundDecoders, ETrue);
+	CheckPluginsL(foundDecoders, expectedDecoders, unExpectedDecoders);
+
+	CleanupStack::PopAndDestroy(3);
+	}
+
+void CTestStepDevVideoPlayAllocFailFindPlugins::FindPostProcessorsL()
+	{
+	RArray<TUid> foundPostProx;
+	CleanupClosePushL(foundPostProx);
+	RArray<TUid> expectedPostProx;
+	CleanupClosePushL(expectedPostProx);
+	RArray<TUid> unExpectedPostProx;
+	CleanupClosePushL(unExpectedPostProx);
+
+	TUint32	requestedPostProcType = EPpMirror|EPpInputCrop;
+	foundPostProx.Reset();
+	expectedPostProx.Reset();
+	User::LeaveIfError(expectedPostProx.Append(KUidDevVideoTestPostProcHwDevice1));
+	User::LeaveIfError(expectedPostProx.Append(KUidDevVideoTestPostProcHwDevice2));
+	User::LeaveIfError(unExpectedPostProx.Append(KUidDevVideoTestPostProcHwDevice3));
+	User::LeaveIfError(unExpectedPostProx.Append(KUidDevVideoTestPostProcHwDevice4));
+	User::LeaveIfError(unExpectedPostProx.Append(KUidDevVideoTestPostProcHwDevice5));
+
+	iDevVideoPlay->FindPostProcessorsL(requestedPostProcType, foundPostProx);
+	CheckPluginsL(foundPostProx, expectedPostProx, unExpectedPostProx);
+
+	CleanupStack::PopAndDestroy(3);
+	}
+
+void CTestStepDevVideoPlayAllocFailFindPlugins::GetDecodersL()
+	{
+	RArray<TUid> foundDecoders;
+	CleanupClosePushL(foundDecoders);
+	RArray<TUid> expectedDecoders;
+	CleanupClosePushL(expectedDecoders);
+	RArray<TUid> unExpectedDecoders;
+	CleanupClosePushL(unExpectedDecoders);
+
+	User::LeaveIfError(expectedDecoders.Append(KUidDevVideoTestDecodeHwDevice1));
+	User::LeaveIfError(expectedDecoders.Append(KUidDevVideoTestDecodeHwDevice2));
+	User::LeaveIfError(expectedDecoders.Append(KUidDevVideoTestDecodeHwDevice3));
+	User::LeaveIfError(expectedDecoders.Append(KUidDevVideoTestDecodeHwDevice4));
+	User::LeaveIfError(expectedDecoders.Append(KUidDevVideoTestDecodeHwDevice5));
+
+	iDevVideoPlay->GetDecoderListL(foundDecoders);
+
+	CheckPluginsL(foundDecoders, expectedDecoders, unExpectedDecoders);
+
+	CleanupStack::PopAndDestroy(3); //foundDecoders, expectedDecoders, unExpectedDecoders
+	}
+
+void CTestStepDevVideoPlayAllocFailFindPlugins::GetPostProcessorsL()
+	{
+	RArray<TUid> foundPostProx;
+	CleanupClosePushL(foundPostProx);
+	RArray<TUid> expectedPostProx;
+	CleanupClosePushL(expectedPostProx);
+	RArray<TUid> unExpectedPostProx;
+	CleanupClosePushL(unExpectedPostProx);
+
+	User::LeaveIfError(expectedPostProx.Append(KUidDevVideoTestPostProcHwDevice1));
+	User::LeaveIfError(expectedPostProx.Append(KUidDevVideoTestPostProcHwDevice2));
+	User::LeaveIfError(expectedPostProx.Append(KUidDevVideoTestPostProcHwDevice3));
+	User::LeaveIfError(expectedPostProx.Append(KUidDevVideoTestPostProcHwDevice4));
+	User::LeaveIfError(expectedPostProx.Append(KUidDevVideoTestPostProcHwDevice5));
+
+	iDevVideoPlay->GetPostProcessorListL(foundPostProx);
+
+	CheckPluginsL(foundPostProx, expectedPostProx, unExpectedPostProx);
+
+	CleanupStack::PopAndDestroy(3);//foundPostProx, expectedPostProx, unExpectedPostProx
+	}
+
+//----------------------------------------------------------------------------
+
+CTestStepDevVideoPlayAllocFailInfoDecoder::CTestStepDevVideoPlayAllocFailInfoDecoder(const TDesC& aTestName)
+	:CTestStepDevVideoPlayAllocFail(aTestName)
+	{
+	}
+
+CTestStepDevVideoPlayAllocFailInfoDecoder* CTestStepDevVideoPlayAllocFailInfoDecoder::NewL(const TDesC& aTestName)
+	{
+	CTestStepDevVideoPlayAllocFailInfoDecoder* self = new(ELeave) CTestStepDevVideoPlayAllocFailInfoDecoder(aTestName);
+	return self;
+	}
+
+CTestStepDevVideoPlayAllocFailInfoDecoder::~CTestStepDevVideoPlayAllocFailInfoDecoder()
+	{
+	}
+
+TVerdict CTestStepDevVideoPlayAllocFailInfoDecoder::DoTestL()
+	{
+	iTestStepResult = EPass;
+    TInt err       = KErrNone;
+
+	// Printing to the console and log file
+	INFO_PRINTF1(_L("this is an Alloc Failure test of VideoDecoderInfoLC()"));
+
+	// moved creation and destruction of iDevVideoPlay inside the heap marks.
+	// reason :- VideoDecoderInfoLC may allocate onto it
+	
+	TInt failCount = 1;
+	TBool completed = EFalse;
+	TBool reachedEnd = EFalse; // Note: declare outside loop to help with debugging
+	for(;;)	
+		{
+		__UHEAP_SETFAIL(RHeap::EFailNext ,failCount);
+		__MM_HEAP_MARK;
+
+		TRAP (err, iDevVideoPlay = CMMFDevVideoPlay::NewL(*this));
+		if (err == KErrNone)
+			{
+
+			CVideoDecoderInfo* vidInfo = NULL;
+
+			TRAP( err, vidInfo = iDevVideoPlay->VideoDecoderInfoLC(KUidDevVideoTestDecodeHwDevice);
+					   CleanupStack::Pop(vidInfo); );
+
+			completed = EFalse;
+			if (err == KErrNone)
+				{
+				TAny *testAlloc = User::Alloc(1); // when this fails, we passed through all allocs within test
+				if (testAlloc==NULL)
+					{
+					reachedEnd = ETrue;
+					failCount--; // -= 1;
+					}
+				else
+					User::Free(testAlloc);
+			
+				}
+			else if (err != KErrNoMemory) // bad error code
+				completed = ETrue;
+
+			// see if valid result and break if wrong - might be premature result
+		
+			if (vidInfo)
+				{
+				delete vidInfo;
+				vidInfo = NULL;
+				}
+			}
+		else if (err != KErrNoMemory) // bad error code
+			completed = ETrue;
+			
+		if (iDevVideoPlay)
+			{
+			delete iDevVideoPlay;
+			iDevVideoPlay = NULL;
+			}
+
+		completed = reachedEnd;
+
+		__MM_HEAP_MARKEND;
+		__UHEAP_SETFAIL(RHeap::ENone ,0);
+
+		if (completed)
+			break; // exit loop
+
+		failCount++;
+		}
+
+	if (err != KErrNone)
+		{
+		INFO_PRINTF3(_L("Error(%d) with %d memory allocations tested"), err, failCount);
+		iTestStepResult = EFail;
+		}
+	else 
+		{
+		INFO_PRINTF2(_L("Completed OK with %d memory allocations tested"), failCount);
+		iTestStepResult = EPass;
+		}
+
+	INFO_PRINTF1(_L("finished with this test step"));
+	// test steps return a result
+	return iTestStepResult;
+	}
+
+
+//----------------------------------------------------------------------------
+
+CTestStepDevVideoPlayAllocFailInfoPostProc::CTestStepDevVideoPlayAllocFailInfoPostProc(const TDesC& aTestName)
+	:CTestStepDevVideoPlayAllocFail(aTestName)
+	{
+	}
+
+CTestStepDevVideoPlayAllocFailInfoPostProc* CTestStepDevVideoPlayAllocFailInfoPostProc::NewL(const TDesC& aTestName)
+	{
+	CTestStepDevVideoPlayAllocFailInfoPostProc* self = new(ELeave) CTestStepDevVideoPlayAllocFailInfoPostProc(aTestName);
+	return self;
+	}
+
+CTestStepDevVideoPlayAllocFailInfoPostProc::~CTestStepDevVideoPlayAllocFailInfoPostProc()
+	{
+	}
+
+TVerdict CTestStepDevVideoPlayAllocFailInfoPostProc::DoTestL()
+	{
+	iTestStepResult = EPass;
+    TInt err       = KErrNone;
+
+	// Printing to the console and log file
+	INFO_PRINTF1(_L("this is an Alloc Failure test of PostProcessorInfoLC()"));
+
+	// will leave on error
+	TRAP (err, iDevVideoPlay = CMMFDevVideoPlay::NewL(*this));
+	
+	if (err != KErrNone)
+		{
+		ERR_PRINTF1(_L("Error - Couldn't construct CMMFDevVideoPlay!"));
+		return EInconclusive;
+		}
+
+	CPostProcessorInfo* postInfo = NULL;
+
+	TInt failCount = 1;
+	TBool completed = EFalse;
+	TBool reachedEnd = EFalse; // Note: declare outside loop to help with debugging
+	for(;;)	
+		{
+		__UHEAP_SETFAIL(RHeap::EFailNext ,failCount);
+		__MM_HEAP_MARK;
+
+		TRAP( err, postInfo = iDevVideoPlay->PostProcessorInfoLC(KUidDevVideoTestPostProcHwDevice);
+				   CleanupStack::Pop(postInfo); );
+
+		REComSession::FinalClose();
+
+		completed = EFalse;
+		if (err == KErrNone)
+			{
+			TAny *testAlloc = User::Alloc(1); // when this fails, we passed through all allocs within test
+			if (testAlloc==NULL)
+				{
+				reachedEnd = ETrue;
+				failCount--; // -= 1;
+				}
+			else
+				User::Free(testAlloc);
+			
+			}
+		else if (err != KErrNoMemory) // bad error code
+			completed = ETrue;
+
+		// see if valid result and break if wrong - might be premature result
+		
+		if (postInfo)
+			{
+			delete postInfo;
+			postInfo = NULL;
+			}
+
+		completed = reachedEnd;
+
+		__MM_HEAP_MARKEND;
+		__UHEAP_SETFAIL(RHeap::ENone ,0);
+
+		if (completed)
+			break; // exit loop
+
+		failCount++;
+		}
+
+	if (err != KErrNone)
+		{
+		INFO_PRINTF3(_L("Error(%d) with %d memory allocations tested"), err, failCount);
+		iTestStepResult = EFail;
+		}
+	else 
+		{
+		INFO_PRINTF2(_L("Completed OK with %d memory allocations tested"), failCount);
+		iTestStepResult = EPass;
+		}
+
+	if (iDevVideoPlay)
+		{
+		delete iDevVideoPlay;
+		iDevVideoPlay = NULL;
+		}
+
+	INFO_PRINTF1(_L("finished with this test step"));
+	// test steps return a result
+	return iTestStepResult;
+	}
+
+
+//----------------------------------------------------------------------------
+
+
+CTestStepDevVideoPlayAllocFailGetPictures::CTestStepDevVideoPlayAllocFailGetPictures(const TDesC& aTestName)
+	:CTestStepDevVideoPlayAllocFail(aTestName)
+	{
+	}
+
+CTestStepDevVideoPlayAllocFailGetPictures* CTestStepDevVideoPlayAllocFailGetPictures::NewL(const TDesC& aTestName)
+	{
+	CTestStepDevVideoPlayAllocFailGetPictures* self = new(ELeave) CTestStepDevVideoPlayAllocFailGetPictures(aTestName);
+	return self;
+	}
+
+CTestStepDevVideoPlayAllocFailGetPictures::~CTestStepDevVideoPlayAllocFailGetPictures()
+	{
+	}
+
+TVerdict CTestStepDevVideoPlayAllocFailGetPictures::DoTestL()
+	{
+	iTestStepResult = EPass;
+    TInt err       = KErrNone;
+
+	// Printing to the console and log file
+	INFO_PRINTF1(_L("this is an Alloc Failure test of retrieving and returning pictures to the plugin"));
+
+
+	TInt failCount = 1;
+	TBool completed = EFalse;
+	TBool reachedEnd = EFalse; // Note: declare outside loop to help with debugging
+	for(;;)	
+		{
+		__UHEAP_SETFAIL(RHeap::EFailNext ,failCount);
+		__MM_HEAP_MARK;
+
+		TRAP(err, iDevVideoPlay = CMMFDevVideoPlay::NewL(*this));
+		if (!err)
+			TRAP(err, PerformTestL());
+
+		REComSession::FinalClose();
+
+		completed = EFalse;
+		if (err == KErrNone)
+			{
+			TAny *testAlloc = User::Alloc(1); // when this fails, we passed through all allocs within test
+			if (testAlloc==NULL)
+				{
+				reachedEnd = ETrue;
+				failCount--; // -= 1;
+				}
+			else
+				User::Free(testAlloc);
+			
+			}
+		else if (err != KErrNoMemory) // bad error code
+			completed = ETrue;
+
+		// see if valid result and break if wrong - might be premature result
+		delete iDevVideoPlay;
+		iDevVideoPlay = NULL;
+
+		__MM_HEAP_MARKEND;
+		__UHEAP_SETFAIL(RHeap::ENone ,0);
+
+		if (completed || reachedEnd)
+			break; // exit loop
+
+		failCount++;
+		}
+
+	if (err != KErrNone)
+		{
+		INFO_PRINTF3(_L("Error(%d) with %d memory allocations tested"), err, failCount);
+		iTestStepResult = EFail;
+		}
+	else 
+		{
+		INFO_PRINTF2(_L("Completed OK with %d memory allocations tested"), failCount);
+		iTestStepResult = EPass;
+		}
+
+	delete iDevVideoPlay;
+	iDevVideoPlay = NULL;
+
+	INFO_PRINTF1(_L("finished with this test step"));
+	// test steps return a result
+	return iTestStepResult;
+	}
+
+
+void CTestStepDevVideoPlayAllocFailGetPictures::PerformTestL()
+	{
+	iTestError = KErrNone;
+
+	// select decoder
+	iDevVideoPlay->SelectDecoderL(KUidDevVideoTestDecodeHwDevice);
+
+	// select post-processor
+	iDevVideoPlay->SelectPostProcessorL(KUidDevVideoTestPostProcHwDevice);
+
+	//Tell plugin to start creating pictures.
+	iDevVideoPlay->SetVideoDestScreenL(EFalse);
+
+	// initialize CDevVideoPlay and wait for response
+	iDevVideoPlay->Initialize();
+
+	User::LeaveIfError(iTestError);
+
+	iDevVideoPlay->Start();//Tell plugin to start creating pictures.
+	// We should now get a series of NewPicture() callbacks.
+
+	User::LeaveIfError(iTestError);
+	}
+
+void CTestStepDevVideoPlayAllocFailGetPictures::MdvpoInitComplete(TInt aError)
+	{
+	iTestError = aError;
+	}
+
+void CTestStepDevVideoPlayAllocFailGetPictures::MdvpoNewPictures()
+	{
+	TRAP(iTestError, DoNewPicturesL());
+	}
+
+void CTestStepDevVideoPlayAllocFailGetPictures::CheckNewPictureInfoL(TUint aNumPictures, const TTimeIntervalMicroSeconds& aFirst, const TTimeIntervalMicroSeconds& aLast)
+	{
+	TUint numPictures = 0;
+	TTimeIntervalMicroSeconds first(0);
+	TTimeIntervalMicroSeconds last(0);
+	iDevVideoPlay->GetNewPictureInfo(numPictures, first, last);
+
+	if ((numPictures!=aNumPictures) || (first!=aFirst) || (last!=aLast))
+		{
+		User::Leave(KErrGeneral);
+		}
+	}
+
+void CTestStepDevVideoPlayAllocFailGetPictures::DoNewPicturesL()
+	{
+	User::LeaveIfError(iTestError);//Don't go any further if we have an error
+	switch (iCurrentPictureNumber)
+		{
+		case 0:
+			{
+			iCurrentPictureNumber++;
+			CheckNewPictureInfoL(1, TTimeIntervalMicroSeconds(0), TTimeIntervalMicroSeconds(0));
+			TVideoPicture* picture = iDevVideoPlay->NextPictureL();
+			CheckNewPictureInfoL(0, TTimeIntervalMicroSeconds(0), TTimeIntervalMicroSeconds(0));
+			iDevVideoPlay->ReturnPicture(picture);
+			break;
+			}
+		case 1:
+			{
+			iCurrentPictureNumber++;
+			CheckNewPictureInfoL(1, TTimeIntervalMicroSeconds(1), TTimeIntervalMicroSeconds(1));
+			TVideoPicture* picture = iDevVideoPlay->NextPictureL();
+			CheckNewPictureInfoL(0, TTimeIntervalMicroSeconds(0), TTimeIntervalMicroSeconds(0));
+			iDevVideoPlay->ReturnPicture(picture);
+			break;
+			}
+		case 2:
+			{
+			iCurrentPictureNumber++;
+			CheckNewPictureInfoL(1, TTimeIntervalMicroSeconds(2), TTimeIntervalMicroSeconds(2));
+			TVideoPicture* picture = iDevVideoPlay->NextPictureL();
+			CheckNewPictureInfoL(0, TTimeIntervalMicroSeconds(0), TTimeIntervalMicroSeconds(0));
+			iDevVideoPlay->ReturnPicture(picture);
+			break;
+			}
+		case 3:
+			{
+			iCurrentPictureNumber++;
+			CheckNewPictureInfoL(1, TTimeIntervalMicroSeconds(3), TTimeIntervalMicroSeconds(3));
+			TVideoPicture* picture = iDevVideoPlay->NextPictureL();
+			iDevVideoPlay->ReturnPicture(picture);
+			break;
+			}
+		case 4:
+			{
+			iCurrentPictureNumber++;
+			CheckNewPictureInfoL(1, TTimeIntervalMicroSeconds(4), TTimeIntervalMicroSeconds(4));
+			TVideoPicture* picture = iDevVideoPlay->NextPictureL();
+			iDevVideoPlay->ReturnPicture(picture);
+			break;
+			}
+		case 5:
+			{
+			iCurrentPictureNumber++;
+			CheckNewPictureInfoL(1, TTimeIntervalMicroSeconds(5), TTimeIntervalMicroSeconds(5));
+			TVideoPicture* picture = iDevVideoPlay->NextPictureL();
+			iDevVideoPlay->ReturnPicture(picture);
+			break;
+			}
+		case 6:
+			{
+			iCurrentPictureNumber++;
+			CheckNewPictureInfoL(1, TTimeIntervalMicroSeconds(6), TTimeIntervalMicroSeconds(6));
+			break;
+			}
+		case 7:
+			{
+			iCurrentPictureNumber++;
+			CheckNewPictureInfoL(2, TTimeIntervalMicroSeconds(6), TTimeIntervalMicroSeconds(7));
+			break;
+			}
+		case 8:
+			{
+			iCurrentPictureNumber++;
+			CheckNewPictureInfoL(3, TTimeIntervalMicroSeconds(6), TTimeIntervalMicroSeconds(8));
+			break;
+			}
+		case 9:
+			{
+			iCurrentPictureNumber++;
+			CheckNewPictureInfoL(4, TTimeIntervalMicroSeconds(6), TTimeIntervalMicroSeconds(9));
+			TVideoPicture* picture = iDevVideoPlay->NextPictureL();
+			iDevVideoPlay->ReturnPicture(picture);
+			CheckNewPictureInfoL(3, TTimeIntervalMicroSeconds(7), TTimeIntervalMicroSeconds(9));
+			picture = iDevVideoPlay->NextPictureL();
+			iDevVideoPlay->ReturnPicture(picture);
+			CheckNewPictureInfoL(2, TTimeIntervalMicroSeconds(8), TTimeIntervalMicroSeconds(9));
+			picture = iDevVideoPlay->NextPictureL();
+			iDevVideoPlay->ReturnPicture(picture);
+			CheckNewPictureInfoL(1, TTimeIntervalMicroSeconds(9), TTimeIntervalMicroSeconds(9));
+			picture = iDevVideoPlay->NextPictureL();
+			iDevVideoPlay->ReturnPicture(picture);
+			CheckNewPictureInfoL(0, TTimeIntervalMicroSeconds(0), TTimeIntervalMicroSeconds(0));
+			break;
+			}
+		default:
+			User::Leave(KErrGeneral);
+			break;
+		};
+	}
+
+
+//----------------------------------------------------------------------------
+
+// DEVVIDEORECORD //
+
+/**
+ *
+ * Test step constructor.
+ * Each test step initialises its own name.
+ *
+ * 
+ */
+CTestStepDevVideoRecordAllocFail::CTestStepDevVideoRecordAllocFail(const TDesC& aTestName)
+	{
+	// store the name of this test case
+	// this is the name that is used by the script file
+	iTestStepName = aTestName;
+	}
+
+/**
+ *
+ * Test step destructor.
+ *
+ * 
+ */
+CTestStepDevVideoRecordAllocFail::~CTestStepDevVideoRecordAllocFail()
+	{
+	}
+
+// MMMFDevVideoRecordObserver
+void CTestStepDevVideoRecordAllocFail::MdvroNewBuffers()
+	{
+	INFO_PRINTF1(_L("CTestStepDevVideoRecordAllocFail::MdvroNewBuffers()"));
+	}
+
+void CTestStepDevVideoRecordAllocFail::MdvroReturnPicture(TVideoPicture* /*aPicture*/)
+	{
+	INFO_PRINTF1(_L("CTestStepDevVideoRecordAllocFail::MdvroReturnPicture()"));
+	}
+
+void CTestStepDevVideoRecordAllocFail::MdvroSupplementalInfoSent()
+	{
+	INFO_PRINTF1(_L("CTestStepDevVideoRecordAllocFail::MdvroSupplementalInfoSent()"));
+	}
+
+void CTestStepDevVideoRecordAllocFail::MdvroFatalError(TInt aError)
+	{
+	iError = aError;
+	INFO_PRINTF2(_L("CTestStepDevVideoRecordAllocFail::MdvroFatalError()\nError = %d"), aError);
+	}
+
+void CTestStepDevVideoRecordAllocFail::MdvroInitializeComplete(TInt aError)
+	{
+	iError = aError;
+	INFO_PRINTF2(_L("CTestStepDevVideoRecordAllocFail::MdvroInitializeComplete():  Error = %d"), aError);
+	}
+
+void CTestStepDevVideoRecordAllocFail::MdvroStreamEnd()
+	{
+	INFO_PRINTF1(_L("CTestStepDevVideoRecordAllocFail::MdvroStreamEnd()"));
+	}
+
+/**
+ *
+ * Do the test step.
+ * Each test step must supply an implementation for DoTestStepL.
+ *
+ * @return	"TVerdict"
+ *			The result of the test step
+ *
+ */
+TVerdict CTestStepDevVideoRecordAllocFail::DoTestStepL()
+	{
+	TVerdict ret = EFail;
+
+	// call alloc test step
+	ret = DoTestL();
+
+	return	ret;
+	}
+
+//----------------------------------------------------------------------------
+
+CTestStepDevVideoRecordAllocFailNew::CTestStepDevVideoRecordAllocFailNew(const TDesC& aTestName)
+	:CTestStepDevVideoRecordAllocFail(aTestName)
+	{
+	}
+
+CTestStepDevVideoRecordAllocFailNew* CTestStepDevVideoRecordAllocFailNew::NewL(const TDesC& aTestName)
+	{
+	CTestStepDevVideoRecordAllocFailNew* self = new(ELeave) CTestStepDevVideoRecordAllocFailNew(aTestName);
+	return self;
+	}
+
+CTestStepDevVideoRecordAllocFailNew::~CTestStepDevVideoRecordAllocFailNew()
+	{
+	}
+
+TVerdict CTestStepDevVideoRecordAllocFailNew::DoTestL()
+	{
+	iTestStepResult = EPass;
+    TInt err       = KErrNone;
+
+	// Printing to the console and log file
+	INFO_PRINTF1(_L("this is an Alloc Failure test of initialising CMMFDevVideoRecord with NewL()"));
+
+	__MM_HEAP_MARK;
+	TRAP( err, iDevVideoRecord = CMMFDevVideoRecord::NewL(*this) );
+	delete iDevVideoRecord;
+	iDevVideoRecord = NULL;
+	__MM_HEAP_MARKEND;
+
+	if (err != KErrNone)
+		return EFail;
+
+	TInt failCount = 1;
+	TBool completed = EFalse;
+	TBool reachedEnd = EFalse; // Note: declare outside loop to help with debugging
+	for(;;)	
+		{
+		__UHEAP_SETFAIL(RHeap::EFailNext ,failCount);
+		__MM_HEAP_MARK;
+
+		TRAP( err, iDevVideoRecord = CMMFDevVideoRecord::NewL(*this);
+				   iDevVideoRecord->SelectEncoderL(KUidDevVideoTestEncodeHwDevice);
+				   iDevVideoRecord->SelectPreProcessorL(KUidDevVideoTestPreProcHwDevice); );
+
+		completed = EFalse;
+		if (err == KErrNone)
+			{
+			TAny *testAlloc = User::Alloc(1); // when this fails, we passed through all allocs within test
+			if (testAlloc==NULL)
+				{
+				reachedEnd = ETrue;
+				failCount--; // -= 1;
+				}
+			else
+				User::Free(testAlloc);
+			
+			}
+		else if (err != KErrNoMemory) // bad error code
+			completed = ETrue;
+
+		// see if valid result and break if wrong - might be premature result
+		if (iDevVideoRecord)
+			{
+			delete iDevVideoRecord;
+			iDevVideoRecord = NULL;
+			}
+		completed = reachedEnd;
+		__MM_HEAP_MARKEND;
+		__UHEAP_SETFAIL(RHeap::ENone ,0);
+
+		if (completed)
+			break; // exit loop
+
+		failCount++;
+		}
+
+	if (err != KErrNone)
+		{
+		INFO_PRINTF3(_L("Error(%d) with %d memory allocations tested"), err, failCount);
+		iTestStepResult = EFail;
+		}
+	else 
+		{
+		INFO_PRINTF2(_L("Completed OK with %d memory allocations tested"), failCount);
+		iTestStepResult = EPass;
+		}
+
+	if (iDevVideoRecord)
+		{
+		delete iDevVideoRecord;
+		iDevVideoRecord = NULL;
+		}
+
+	INFO_PRINTF1(_L("finished with this test step"));
+	// test steps return a result
+	return iTestStepResult;
+	}
+
+//----------------------------------------------------------------------------
+
+CTestStepDevVideoRecordAllocFailInfoEncoder::CTestStepDevVideoRecordAllocFailInfoEncoder(const TDesC& aTestName)
+	:CTestStepDevVideoRecordAllocFail(aTestName)
+	{
+	}
+
+CTestStepDevVideoRecordAllocFailInfoEncoder* CTestStepDevVideoRecordAllocFailInfoEncoder::NewL(const TDesC& aTestName)
+	{
+	CTestStepDevVideoRecordAllocFailInfoEncoder* self = new(ELeave) CTestStepDevVideoRecordAllocFailInfoEncoder(aTestName);
+	return self;
+	}
+
+CTestStepDevVideoRecordAllocFailInfoEncoder::~CTestStepDevVideoRecordAllocFailInfoEncoder()
+	{
+	}
+
+TVerdict CTestStepDevVideoRecordAllocFailInfoEncoder::DoTestL()
+	{
+	iTestStepResult = EPass;
+    TInt err       = KErrNone;
+
+	// Printing to the console and log file
+	INFO_PRINTF1(_L("this is an Alloc Failure test of VideoEncoderInfoLC()"));
+
+	// moved creation and destruction of iDevVideoRecord inside the heap marks.
+	// reason :- VideoEncoderInfoLC may allocate onto it
+	
+	TInt failCount = 1;
+	TBool completed = EFalse;
+	TBool reachedEnd = EFalse; // Note: declare outside loop to help with debugging
+	for(;;)	
+		{
+		__UHEAP_SETFAIL(RHeap::EFailNext ,failCount);
+		__MM_HEAP_MARK;
+
+		TRAP (err, iDevVideoRecord = CMMFDevVideoRecord::NewL(*this));
+	
+		if (err == KErrNone)
+			{
+			CVideoEncoderInfo* vidInfo = NULL;
+
+			TRAP( err, vidInfo = iDevVideoRecord->VideoEncoderInfoLC(KUidDevVideoTestEncodeHwDevice);
+					   CleanupStack::Pop(vidInfo); );
+
+			completed = EFalse;
+			if (err == KErrNone)
+				{
+				TAny *testAlloc = User::Alloc(1); // when this fails, we passed through all allocs within test
+				if (testAlloc==NULL)
+					{
+					reachedEnd = ETrue;
+					failCount--; // -= 1;
+					}
+				else
+					User::Free(testAlloc);
+			
+				}
+			else if (err != KErrNoMemory) // bad error code
+				completed = ETrue;
+
+			// see if valid result and break if wrong - might be premature result
+		
+			if (vidInfo)
+				{
+				delete vidInfo;
+				vidInfo = NULL;
+				}
+			}
+		else if (err != KErrNoMemory) // bad error code
+			completed = ETrue;
+			
+		if (iDevVideoRecord)
+			{
+			delete iDevVideoRecord;
+			iDevVideoRecord = NULL;
+			}
+
+		completed = reachedEnd;
+
+		__MM_HEAP_MARKEND;
+		__UHEAP_SETFAIL(RHeap::ENone ,0);
+
+		if (completed)
+			break; // exit loop
+
+		failCount++;
+		}
+
+	if (err != KErrNone)
+		{
+		INFO_PRINTF3(_L("Error(%d) with %d memory allocations tested"), err, failCount);
+		iTestStepResult = EFail;
+		}
+	else 
+		{
+		INFO_PRINTF2(_L("Completed OK with %d memory allocations tested"), failCount);
+		iTestStepResult = EPass;
+		}
+
+	INFO_PRINTF1(_L("finished with this test step"));
+	// test steps return a result
+	return iTestStepResult;
+	}
+
+//----------------------------------------------------------------------------
+
+CTestStepDevVideoRecordAllocFailInfoPreProc::CTestStepDevVideoRecordAllocFailInfoPreProc(const TDesC& aTestName)
+	:CTestStepDevVideoRecordAllocFail(aTestName)
+	{
+	}
+
+CTestStepDevVideoRecordAllocFailInfoPreProc* CTestStepDevVideoRecordAllocFailInfoPreProc::NewL(const TDesC& aTestName)
+	{
+	CTestStepDevVideoRecordAllocFailInfoPreProc* self = new(ELeave) CTestStepDevVideoRecordAllocFailInfoPreProc(aTestName);
+	return self;
+	}
+
+CTestStepDevVideoRecordAllocFailInfoPreProc::~CTestStepDevVideoRecordAllocFailInfoPreProc()
+	{
+	}
+
+TVerdict CTestStepDevVideoRecordAllocFailInfoPreProc::DoTestL()
+	{
+	iTestStepResult = EPass;
+    TInt err       = KErrNone;
+
+	// Printing to the console and log file
+	INFO_PRINTF1(_L("this is an Alloc Failure test of PreProcessorInfoLC()"));
+
+	// will leave on error
+	TRAP (err, iDevVideoRecord = CMMFDevVideoRecord::NewL(*this));
+	
+	if (err != KErrNone)
+		{
+		ERR_PRINTF1(_L("Error - Couldn't construct CMMFDevVideoRecord!"));
+		return EInconclusive;
+		}
+
+	CPreProcessorInfo* preInfo = NULL;
+
+	TInt failCount = 1;
+	TBool completed = EFalse;
+	TBool reachedEnd = EFalse; // Note: declare outside loop to help with debugging
+	for(;;)	
+		{
+		__UHEAP_SETFAIL(RHeap::EFailNext ,failCount);
+		__MM_HEAP_MARK;
+
+		TRAP( err, preInfo = iDevVideoRecord->PreProcessorInfoLC(KUidDevVideoTestPreProcHwDevice);
+				   CleanupStack::Pop(preInfo); );
+
+		REComSession::FinalClose();
+
+		completed = EFalse;
+		if (err == KErrNone)
+			{
+			TAny *testAlloc = User::Alloc(1); // when this fails, we passed through all allocs within test
+			if (testAlloc==NULL)
+				{
+				reachedEnd = ETrue;
+				failCount--; // -= 1;
+				}
+			else
+				User::Free(testAlloc);
+			
+			}
+		else if (err != KErrNoMemory) // bad error code
+			completed = ETrue;
+
+		// see if valid result and break if wrong - might be premature result
+		
+		if (preInfo)
+			{
+			delete preInfo;
+			preInfo = NULL;
+			}
+
+		completed = reachedEnd;
+
+		__MM_HEAP_MARKEND;
+		__UHEAP_SETFAIL(RHeap::ENone ,0);
+
+		if (completed)
+			break; // exit loop
+
+		failCount++;
+		}
+
+	if (err != KErrNone)
+		{
+		INFO_PRINTF3(_L("Error(%d) with %d memory allocations tested"), err, failCount);
+		iTestStepResult = EFail;
+		}
+	else 
+		{
+		INFO_PRINTF2(_L("Completed OK with %d memory allocations tested"), failCount);
+		iTestStepResult = EPass;
+		}
+
+	if (iDevVideoRecord)
+		{
+		delete iDevVideoRecord;
+		iDevVideoRecord = NULL;
+		}
+
+	INFO_PRINTF1(_L("finished with this test step"));
+	// test steps return a result
+	return iTestStepResult;
+	}
+
+//----------------------------------------------------------------------------
+
+
+CTestStepDevVideoRecordAllocFailFindPlugins::CTestStepDevVideoRecordAllocFailFindPlugins(const TDesC& aTestName)
+	:CTestStepDevVideoRecordAllocFail(aTestName)
+	{
+	}
+
+CTestStepDevVideoRecordAllocFailFindPlugins* CTestStepDevVideoRecordAllocFailFindPlugins::NewL(const TDesC& aTestName)
+	{
+	CTestStepDevVideoRecordAllocFailFindPlugins* self = new(ELeave) CTestStepDevVideoRecordAllocFailFindPlugins(aTestName);
+	return self;
+	}
+
+CTestStepDevVideoRecordAllocFailFindPlugins::~CTestStepDevVideoRecordAllocFailFindPlugins()
+	{
+	}
+
+TVerdict CTestStepDevVideoRecordAllocFailFindPlugins::DoTestL()
+	{
+	iTestStepResult = EPass;
+    TInt err       = KErrNone;
+
+	// Printing to the console and log file
+	INFO_PRINTF1(_L("this is an Alloc Failure test of finding Encoder and Pre processor plugins"));
+
+
+	TInt failCount = 1;
+	TBool completed = EFalse;
+	TBool reachedEnd = EFalse; // Note: declare outside loop to help with debugging
+	for(;;)	
+		{
+		__UHEAP_SETFAIL(RHeap::EFailNext ,failCount);
+		__MM_HEAP_MARK;
+
+		err = KErrNone;
+
+		if (!err)
+			TRAP(err, iDevVideoRecord = CMMFDevVideoRecord::NewL(*this));
+		if (!err)
+			TRAP(err, GetEncodersL());
+		if (!err)
+			TRAP(err, GetPreProcessorsL());
+		if (!err)
+			TRAP(err, FindEncodersL());
+		if (!err)
+			TRAP(err, FindPreProcessorsL());
+
+		REComSession::FinalClose();
+
+		completed = EFalse;
+		if (err == KErrNone)
+			{
+			TAny *testAlloc = User::Alloc(1); // when this fails, we passed through all allocs within test
+			if (testAlloc==NULL)
+				{
+				reachedEnd = ETrue;
+				failCount--; // -= 1;
+				}
+			else
+				User::Free(testAlloc);
+			
+			}
+		else if (err != KErrNoMemory) // bad error code
+			completed = ETrue;
+
+		// see if valid result and break if wrong - might be premature result
+		delete iDevVideoRecord;
+		iDevVideoRecord = NULL;
+
+		__MM_HEAP_MARKEND;
+		__UHEAP_SETFAIL(RHeap::ENone ,0);
+
+		if (completed || reachedEnd)
+			break; // exit loop
+
+		failCount++;
+		}
+
+	if (err != KErrNone)
+		{
+		INFO_PRINTF3(_L("Error(%d) with %d memory allocations tested"), err, failCount);
+		iTestStepResult = EFail;
+		}
+	else 
+		{
+		INFO_PRINTF2(_L("Completed OK with %d memory allocations tested"), failCount);
+		iTestStepResult = EPass;
+		}
+
+	delete iDevVideoRecord;
+	iDevVideoRecord = NULL;
+
+	INFO_PRINTF1(_L("finished with this test step"));
+	// test steps return a result
+	return iTestStepResult;
+	}
+
+void CTestStepDevVideoRecordAllocFailFindPlugins::CheckPluginsL(const RArray<TUid>& aFoundPlugins, const RArray<TUid>& aExpectedPlugins, const RArray<TUid>& aUnExpectedPlugins)
+	{
+	TBool foundUnExpected = EFalse;
+	TInt numberToBeFoundInExpectedPlugins = aExpectedPlugins.Count();
+
+	for (TInt i=0; i<aFoundPlugins.Count(); i++)
+		{
+		TUid uidToLookFor = aFoundPlugins[i];
+		TInt j;
+		for (j=0; j<aExpectedPlugins.Count(); j++)
+			{
+			if (aExpectedPlugins[j] == uidToLookFor)
+				{
+				numberToBeFoundInExpectedPlugins--;
+				break;//j
+				}
+			}
+		for (j=0; j<aUnExpectedPlugins.Count(); j++)
+			{
+			if (aUnExpectedPlugins[j] == uidToLookFor)
+				{
+				foundUnExpected = ETrue;
+				break;//j
+				}
+			}
+		}
+
+	if ((foundUnExpected) || (numberToBeFoundInExpectedPlugins!=0))
+		User::Leave(KErrGeneral);
+
+	}
+
+
+void CTestStepDevVideoRecordAllocFailFindPlugins::FindEncodersL()
+	{
+	RArray<TUid> foundEncoders;
+	CleanupClosePushL(foundEncoders);
+	RArray<TUid> expectedEncoders;
+	CleanupClosePushL(expectedEncoders);
+	RArray<TUid> unExpectedEncoders;
+	CleanupClosePushL(unExpectedEncoders);
+
+	
+	// Supported mime type and Pre proc type (by exact match)
+	_LIT8(KMimeType5, "video/zippyvideo");
+	TUint32 requestedPreProcType = EPpMirror|EPpInputCrop;
+	foundEncoders.Reset();
+	expectedEncoders.Reset();
+	unExpectedEncoders.Reset();
+	User::LeaveIfError(expectedEncoders.Append(KUidDevVideoTestEncodeHwDevice1));
+	User::LeaveIfError(unExpectedEncoders.Append(KUidDevVideoTestEncodeHwDevice2));
+	User::LeaveIfError(unExpectedEncoders.Append(KUidDevVideoTestEncodeHwDevice3));
+	User::LeaveIfError(unExpectedEncoders.Append(KUidDevVideoTestEncodeHwDevice4));
+	User::LeaveIfError(unExpectedEncoders.Append(KUidDevVideoTestEncodeHwDevice5));
+
+	iDevVideoRecord->FindEncodersL(KMimeType5(), requestedPreProcType, foundEncoders, ETrue);
+	CheckPluginsL(foundEncoders, expectedEncoders, unExpectedEncoders);
+
+	CleanupStack::PopAndDestroy(3);
+	}
+
+void CTestStepDevVideoRecordAllocFailFindPlugins::FindPreProcessorsL()
+	{
+	RArray<TUid> foundPreProx;
+	CleanupClosePushL(foundPreProx);
+	RArray<TUid> expectedPreProx;
+	CleanupClosePushL(expectedPreProx);
+	RArray<TUid> unExpectedPreProx;
+	CleanupClosePushL(unExpectedPreProx);
+
+	TUint32	requestedPreProcType = EPpMirror|EPpInputCrop;
+	foundPreProx.Reset();
+	expectedPreProx.Reset();
+	User::LeaveIfError(expectedPreProx.Append(KUidDevVideoTestPreProcHwDevice1));
+	User::LeaveIfError(expectedPreProx.Append(KUidDevVideoTestPreProcHwDevice2));
+	User::LeaveIfError(unExpectedPreProx.Append(KUidDevVideoTestPreProcHwDevice3));
+	User::LeaveIfError(unExpectedPreProx.Append(KUidDevVideoTestPreProcHwDevice4));
+	User::LeaveIfError(unExpectedPreProx.Append(KUidDevVideoTestPreProcHwDevice5));
+
+	iDevVideoRecord->FindPreProcessorsL(requestedPreProcType, foundPreProx);
+	CheckPluginsL(foundPreProx, expectedPreProx, unExpectedPreProx);
+
+	CleanupStack::PopAndDestroy(3);
+	}
+
+void CTestStepDevVideoRecordAllocFailFindPlugins::GetEncodersL()
+	{
+	RArray<TUid> foundEncoders;
+	CleanupClosePushL(foundEncoders);
+	RArray<TUid> expectedEncoders;
+	CleanupClosePushL(expectedEncoders);
+	RArray<TUid> unExpectedEncoders;
+	CleanupClosePushL(unExpectedEncoders);
+
+	User::LeaveIfError(expectedEncoders.Append(KUidDevVideoTestEncodeHwDevice1));
+	User::LeaveIfError(expectedEncoders.Append(KUidDevVideoTestEncodeHwDevice2));
+	User::LeaveIfError(expectedEncoders.Append(KUidDevVideoTestEncodeHwDevice3));
+	User::LeaveIfError(expectedEncoders.Append(KUidDevVideoTestEncodeHwDevice4));
+	User::LeaveIfError(expectedEncoders.Append(KUidDevVideoTestEncodeHwDevice5));
+
+	iDevVideoRecord->GetEncoderListL(foundEncoders);
+
+	CheckPluginsL(foundEncoders, expectedEncoders, unExpectedEncoders);
+
+	CleanupStack::PopAndDestroy(3); //foundEncoders, expectedEncoders, unExpectedEncoders
+	}
+
+void CTestStepDevVideoRecordAllocFailFindPlugins::GetPreProcessorsL()
+	{
+	RArray<TUid> foundPreProx;
+	CleanupClosePushL(foundPreProx);
+	RArray<TUid> expectedPreProx;
+	CleanupClosePushL(expectedPreProx);
+	RArray<TUid> unExpectedPreProx;
+	CleanupClosePushL(unExpectedPreProx);
+
+	User::LeaveIfError(expectedPreProx.Append(KUidDevVideoTestPreProcHwDevice1));
+	User::LeaveIfError(expectedPreProx.Append(KUidDevVideoTestPreProcHwDevice2));
+	User::LeaveIfError(expectedPreProx.Append(KUidDevVideoTestPreProcHwDevice3));
+	User::LeaveIfError(expectedPreProx.Append(KUidDevVideoTestPreProcHwDevice4));
+	User::LeaveIfError(expectedPreProx.Append(KUidDevVideoTestPreProcHwDevice5));
+
+	iDevVideoRecord->GetPreProcessorListL(foundPreProx);
+
+	CheckPluginsL(foundPreProx, expectedPreProx, unExpectedPreProx);
+
+	CleanupStack::PopAndDestroy(3);//foundPreProx, expectedPreProx, unExpectedPreProx
+	}
+
+//----------------------------------------------------------------------------
+
+
+CTestStepDevVideoRecordAllocFailGetBuffers::CTestStepDevVideoRecordAllocFailGetBuffers(const TDesC& aTestName)
+	:CTestStepDevVideoRecordAllocFail(aTestName)
+	{
+	}
+
+CTestStepDevVideoRecordAllocFailGetBuffers* CTestStepDevVideoRecordAllocFailGetBuffers::NewL(const TDesC& aTestName)
+	{
+	CTestStepDevVideoRecordAllocFailGetBuffers* self = new(ELeave) CTestStepDevVideoRecordAllocFailGetBuffers(aTestName);
+	return self;
+	}
+
+CTestStepDevVideoRecordAllocFailGetBuffers::~CTestStepDevVideoRecordAllocFailGetBuffers()
+	{
+	}
+
+TVerdict CTestStepDevVideoRecordAllocFailGetBuffers::DoTestL()
+	{
+	iTestStepResult = EPass;
+    TInt err       = KErrNone;
+
+	// Printing to the console and log file
+	INFO_PRINTF1(_L("this is an Alloc Failure test of retrieving and returning Buffers to the plugin"));
+
+
+	TInt failCount = 1;
+	TBool completed = EFalse;
+	TBool reachedEnd = EFalse; // Note: declare outside loop to help with debugging
+	for(;;)	
+		{
+		__UHEAP_SETFAIL(RHeap::EFailNext ,failCount);
+		__MM_HEAP_MARK;
+
+		TRAP(err, iDevVideoRecord = CMMFDevVideoRecord::NewL(*this));
+		if (!err)
+			TRAP(err, PerformTestL());
+
+		REComSession::FinalClose();
+
+		completed = EFalse;
+		if (err == KErrNone)
+			{
+			TAny *testAlloc = User::Alloc(1); // when this fails, we passed through all allocs within test
+			if (testAlloc==NULL)
+				{
+				reachedEnd = ETrue;
+				failCount--; // -= 1;
+				}
+			else
+				User::Free(testAlloc);
+			
+			}
+		else if (err != KErrNoMemory) // bad error code
+			completed = ETrue;
+
+		// see if valid result and break if wrong - might be premature result
+		delete iDevVideoRecord;
+		iDevVideoRecord = NULL;
+
+		__MM_HEAP_MARKEND;
+		__UHEAP_SETFAIL(RHeap::ENone ,0);
+
+		if (completed || reachedEnd)
+			break; // exit loop
+
+		failCount++;
+		}
+
+	if (err != KErrNone)
+		{
+		INFO_PRINTF3(_L("Error(%d) with %d memory allocations tested"), err, failCount);
+		iTestStepResult = EFail;
+		}
+	else 
+		{
+		INFO_PRINTF2(_L("Completed OK with %d memory allocations tested"), failCount);
+		iTestStepResult = EPass;
+		}
+
+	delete iDevVideoRecord;
+	iDevVideoRecord = NULL;
+
+	INFO_PRINTF1(_L("finished with this test step"));
+	// test steps return a result
+	return iTestStepResult;
+	}
+
+
+void CTestStepDevVideoRecordAllocFailGetBuffers::PerformTestL()
+	{
+	iTestError = KErrNone;
+
+	// select Encoder
+	iDevVideoRecord->SelectEncoderL(KUidDevVideoTestEncodeHwDevice);
+
+	// select Pre-processor
+	iDevVideoRecord->SelectPreProcessorL(KUidDevVideoTestPreProcHwDevice);
+
+	//Tell plugin to start creating Buffers.
+	iDevVideoRecord->SetImplementationSpecificEncoderOptionsL(KTestISEncBuffers);
+
+	// initialize CDevVideoRecord and wait for response
+	iDevVideoRecord->Initialize();
+
+	User::LeaveIfError(iTestError);
+
+	iDevVideoRecord->Start();//Tell plugin to start creating Buffers.
+	// We should now get a series of NewBuffer() callbacks.
+
+	User::LeaveIfError(iTestError);
+	}
+
+void CTestStepDevVideoRecordAllocFailGetBuffers::MdvpoInitComplete(TInt aError)
+	{
+	iTestError = aError;
+	}
+
+void CTestStepDevVideoRecordAllocFailGetBuffers::MdvpoNewBuffers()
+	{
+	TRAP(iTestError, DoNewBuffersL());
+	}
+
+void CTestStepDevVideoRecordAllocFailGetBuffers::CheckNewBufferInfoL(TUint aNumBuffers)
+	{
+	TUint numBuffers = 0;
+	numBuffers = iDevVideoRecord->NumDataBuffers();
+
+	if (numBuffers != aNumBuffers)
+		{
+		User::Leave(KErrGeneral);
+		}
+	}
+
+void CTestStepDevVideoRecordAllocFailGetBuffers::DoNewBuffersL()
+	{
+	User::LeaveIfError(iTestError);//Don't go any further if we have an error
+	switch (iCurrentBufferNumber)
+		{
+		case 0:
+			{
+			iCurrentBufferNumber++;
+			CheckNewBufferInfoL(1);
+			TVideoOutputBuffer* buffer = iDevVideoRecord->NextBufferL();
+			CheckNewBufferInfoL(0);
+			iDevVideoRecord->ReturnBuffer(buffer);
+			break;
+			}
+		case 1:
+			{
+			iCurrentBufferNumber++;
+			CheckNewBufferInfoL(1);
+			TVideoOutputBuffer* buffer = iDevVideoRecord->NextBufferL();
+			CheckNewBufferInfoL(0);
+			iDevVideoRecord->ReturnBuffer(buffer);
+			break;
+			}
+		case 2:
+			{
+			iCurrentBufferNumber++;
+			CheckNewBufferInfoL(1);
+			TVideoOutputBuffer* buffer = iDevVideoRecord->NextBufferL();
+			CheckNewBufferInfoL(0);
+			iDevVideoRecord->ReturnBuffer(buffer);
+			break;
+			}
+		case 3:
+			{
+			iCurrentBufferNumber++;
+			CheckNewBufferInfoL(1);
+			TVideoOutputBuffer* buffer = iDevVideoRecord->NextBufferL();
+			iDevVideoRecord->ReturnBuffer(buffer);
+			break;
+			}
+		case 4:
+			{
+			iCurrentBufferNumber++;
+			CheckNewBufferInfoL(1);
+			TVideoOutputBuffer* buffer = iDevVideoRecord->NextBufferL();
+			iDevVideoRecord->ReturnBuffer(buffer);
+			break;
+			}
+		case 5:
+			{
+			iCurrentBufferNumber++;
+			CheckNewBufferInfoL(1);
+			TVideoOutputBuffer* buffer = iDevVideoRecord->NextBufferL();
+			iDevVideoRecord->ReturnBuffer(buffer);
+			break;
+			}
+		case 6:
+			{
+			iCurrentBufferNumber++;
+			CheckNewBufferInfoL(1);
+			break;
+			}
+		case 7:
+			{
+			iCurrentBufferNumber++;
+			CheckNewBufferInfoL(2);
+			break;
+			}
+		case 8:
+			{
+			iCurrentBufferNumber++;
+			CheckNewBufferInfoL(3);
+			break;
+			}
+		case 9:
+			{
+			iCurrentBufferNumber++;
+			CheckNewBufferInfoL(4);
+			TVideoOutputBuffer* buffer = iDevVideoRecord->NextBufferL();
+			iDevVideoRecord->ReturnBuffer(buffer);
+			CheckNewBufferInfoL(3);
+			buffer = iDevVideoRecord->NextBufferL();
+			iDevVideoRecord->ReturnBuffer(buffer);
+			CheckNewBufferInfoL(2);
+			buffer = iDevVideoRecord->NextBufferL();
+			iDevVideoRecord->ReturnBuffer(buffer);
+			CheckNewBufferInfoL(1);
+			buffer = iDevVideoRecord->NextBufferL();
+			iDevVideoRecord->ReturnBuffer(buffer);
+			CheckNewBufferInfoL(0);
+			break;
+			}
+		default:
+			User::Leave(KErrGeneral);
+			break;
+		};
+	}
+	
+