mmlibs/mmfw/tsrc/mmfunittest/aclnt/TSU_MMF_ACLNT_01/TestStepAudioPlayerDRM.cpp
changeset 0 b8ed18f6c07b
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/mmlibs/mmfw/tsrc/mmfunittest/aclnt/TSU_MMF_ACLNT_01/TestStepAudioPlayerDRM.cpp	Thu Oct 07 22:34:12 2010 +0100
@@ -0,0 +1,1328 @@
+// Copyright (c) 2004-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:
+// Unit tests. The client is opened with DRM intent and played.
+// 
+//
+
+#include "TestStepAudioPlayerDRM.h"
+
+
+// Unique Id of the content
+_LIT(KRightsPlayerUniqueId001, "AudioTestmainTstId001");
+_LIT(KRightsPlayerUniqueId002, "\\Container001\\AudioTestmainTst2Id002");
+_LIT(KRightsPlayerUniqueId003, "AudioTestmainTst3Id003");
+
+_LIT(KRightsPlayerUniqueId004, "AudioTestNoRightsId001");
+_LIT(KRightsPlayerInvalidUniqueId, "AudioTestInvalidUniqueId");
+
+#define INFO_PRINTF1_IF_LOGS_ENABLED( a ) if(iEnableLogs) 		\
+											{					\
+											INFO_PRINTF1( a );	\
+											}											
+											
+#define INFO_PRINTF2_IF_LOGS_ENABLED( a, b ) if(iEnableLogs)					\
+												{								\
+												INFO_PRINTF2( ( a ), ( b ) );	\
+												}
+											
+#define INFO_PRINTF3_IF_LOGS_ENABLED( a, b, c ) if(iEnableLogs)								\
+													{										\
+													INFO_PRINTF3( ( a ), ( b ), ( c ) );	\
+													}
+											
+#define ERR_PRINTF1_IF_LOGS_ENABLED( a ) if(iEnableLogs)		\
+											{					\
+											ERR_PRINTF1( a );	\
+											}											
+											
+#define ERR_PRINTF2_IF_LOGS_ENABLED( a, b ) if(iEnableLogs)						\
+												{								\
+												ERR_PRINTF2( ( a ), ( b ) );	\
+												}
+											
+#define ERR_PRINTF3_IF_LOGS_ENABLED( a, b, c ) if(iEnableLogs)							\
+													{									\
+													ERR_PRINTF3( ( a ), ( b ), ( c ) );	\
+													}									
+													
+// Used in a time out function, 1 second (in microSeconds)
+const TInt KOneSecond = 1000000;
+
+// CTestMmfDRMAudioPlayerBase implementation
+/**
+*
+* CTestMmfDRMAudioPlayerBase constructor.
+*
+*/
+CTestMmfDRMAudioPlayerBase::CTestMmfDRMAudioPlayerBase()
+	{
+	iEnableLogs = ETrue;//By deafult log the messages    
+	}
+/**
+*
+* FsmL()
+*
+* @param TMmfAudioPlayerEvents aEvent
+*
+*/
+void CTestMmfDRMAudioPlayerBase::FsmL(TMmfAudioPlayerEvents aEvent)
+    {
+    iTestStepResult = EFail;
+    switch (aEvent)
+        {
+        case EAudioOpen:
+        	INFO_PRINTF2_IF_LOGS_ENABLED(_L("Opening the file for PLAY intent: %S"), &iFileName);
+            if (iTestStepName == _L("MM-MMF-ACLNT-U-0905-HP"))
+                {
+                iAudioPlayer->OpenFileL(TMMFileSource(iFileName, KRightsPlayerUniqueId002, ContentAccess::EPlay));
+                }
+            else if (iTestStepName == _L("MM-MMF-ACLNT-U-0923-HP"))
+                {
+                iAudioPlayer->OpenFileL(TMMFileSource(iFileName, KRightsPlayerUniqueId003, ContentAccess::EPlay));
+                }
+            else
+                {
+                iAudioPlayer->OpenFileL(TMMFileSource(iFileName, KRightsPlayerUniqueId001, ContentAccess::EPlay));
+                }
+            break;
+
+        case EAudioPlay:
+            if (iTestStepName == _L("MM-MMF-ACLNT-U-0903-HP"))
+                {
+                INFO_PRINTF1_IF_LOGS_ENABLED(_L("Playing the audio file...for 2 seconds."));
+                iAudioPlayer->Play();
+                User::After(2000000);
+
+				INFO_PRINTF1_IF_LOGS_ENABLED(_L("Pausing the audio file...for 1 second."));
+                User::LeaveIfError(iAudioPlayer->Pause());
+                User::After(1000000);
+
+				INFO_PRINTF1_IF_LOGS_ENABLED(_L("Continuing the play of the audio file...for 2 seconds."));
+               	iAudioPlayer->Play();
+                User::After(2000000);
+             
+                }
+            else if (iTestStepName == _L("MM-MMF-ACLNT-U-0907-HP"))
+            	{
+            	INFO_PRINTF1_IF_LOGS_ENABLED(_L("Playing of the audio file...for 2 seconds."));
+               	iAudioPlayer->Play();
+                User::After(2000000);
+                
+                INFO_PRINTF1_IF_LOGS_ENABLED(_L("Stop the play of the audio file...."));
+             	iAudioPlayer->Stop();                         	
+            	}
+            else if (iTestStepName == _L("MM-MMF-ACLNT-U-0909-HP"))
+            	{
+            	for(TInt i=0; i<=50; i++)
+                	{
+                	INFO_PRINTF1(_L("Playing the audio file...for 0.05 second."));
+                	iAudioPlayer->Play();
+                	User::After(50000);
+
+                	INFO_PRINTF1(_L("Pausing the audio file...for 0.05 second."));
+                	User::LeaveIfError(iAudioPlayer->Pause());
+                	User::After(50000);
+                	}                        	
+            	}
+
+            else
+                {
+                INFO_PRINTF1_IF_LOGS_ENABLED(_L("Playing the audio file..."));
+                iAudioPlayer->Play();
+                }
+            break;
+
+        case EAudioPlayEnd:
+        	INFO_PRINTF1_IF_LOGS_ENABLED(_L("Audio file opened and played."));
+            iTestStepResult = EPass;
+			iAudioPlayer->Close();
+            CActiveScheduler::Stop();
+            break;
+
+        default:        	
+            INFO_PRINTF1(_L("Invalid Audio event!"));
+        }
+        
+      };
+/**
+*
+* FsmHandleL()
+*
+* @param TMmfAudioPlayerEvents aEvent
+*
+*/
+void CTestMmfDRMAudioPlayerBase::FsmHandleL(TMmfAudioPlayerEvents aEvent)
+    {
+    iTestStepResult = EFail;
+    switch (aEvent)
+        {
+        case EAudioOpen:
+        	INFO_PRINTF2_IF_LOGS_ENABLED(_L("Opening the file for PLAY intent: %S"), &iFileName);
+            iAudioPlayer->OpenFileL(TMMFileHandleSource(iFile, KRightsPlayerUniqueId001, ContentAccess::EPlay));
+            break;
+
+        case EAudioPlay:
+        	INFO_PRINTF1_IF_LOGS_ENABLED(_L("Playing the audio file..."));
+            iAudioPlayer->Play();
+            break;
+
+        case EAudioPlayEnd:
+        	INFO_PRINTF1_IF_LOGS_ENABLED(_L("Audio file opened and played."));
+            iTestStepResult = EPass;
+     		iAudioPlayer->Close();
+            CActiveScheduler::Stop();
+            break;
+
+        default:
+            INFO_PRINTF1(_L("Invalid Audio event!"));
+        }
+    };
+/**
+*
+* EnableLogs()
+*
+* @param TBool aEnable
+*
+*/
+inline void CTestMmfDRMAudioPlayerBase::EnableLogs(TBool aEnable)
+{
+	iEnableLogs = aEnable;	
+}
+/**
+*
+* Test step Preamble.
+*
+* @return enum TVerdict: The result of the test step.
+* 
+*/
+enum TVerdict CTestMmfDRMAudioPlayerBase::DoTestStepPreambleL()
+    {
+    // Install the scheduler
+    enum TVerdict verdict = CTestStepUnitMMFAudClient::DoTestStepPreambleL();
+
+    iError = KErrNone;
+
+    // Get the filename
+    // iFileName will be the content file, containing audio files
+    if (!GetStringFromConfig(_L("SectionDRM"), _L("AudioContent"), iFileName))
+        {
+        return EInconclusive;
+        }
+
+    // Create an audio player
+    iAudioPlayer = CMdaAudioPlayerUtility::NewL(*this);
+    if (iAudioPlayer == NULL)
+        {
+        return EInconclusive;
+        }
+
+    return verdict;
+    }
+
+/**
+*
+* Test step Postamble.
+*
+* @return enum TVerdict: The result of the test step.
+* 
+*/
+enum TVerdict CTestMmfDRMAudioPlayerBase::DoTestStepPostambleL()
+    {
+  	delete iAudioPlayer;
+    iAudioPlayer = NULL;
+    User::After(KOneSecond); // wait for deletion to shut down devsound
+    return CTestStepUnitMMFAudClient::DoTestStepPostambleL(); // Destroy the scheduler
+    }
+
+/**
+*
+* Implementation of the MMdaAudioPlayerCallback interface function.
+*
+* @param TInt aError
+*
+*/
+void CTestMmfDRMAudioPlayerBase::MapcInitComplete(TInt aError, 
+    const TTimeIntervalMicroSeconds& /*aDuration*/)
+    {
+    INFO_PRINTF2_IF_LOGS_ENABLED(_L("MMdaAudioPlayerCallback Init Complete. Error = %d"), aError);
+    iError = aError;
+    if (iError != KErrNone)
+    	{
+    	ERR_PRINTF1_IF_LOGS_ENABLED(_L("Opening the audio file failed."));
+    	iAudioPlayer->Close();
+    	CActiveScheduler::Stop();
+    	}
+    else
+    	{
+    	TRAP(iError, FsmL(EAudioPlay)); // Call to play audio
+    	if (iError != KErrNone)
+    		{
+    		ERR_PRINTF2_IF_LOGS_ENABLED(_L("Got an error from the FsmL(EAudioPlay) %d."), iError);
+    		iAudioPlayer->Close();
+    		CActiveScheduler::Stop();    		
+    		}
+	    else
+    		{
+    		TRAP(iError, FsmL(EAudioPlayEnd)); 
+    		if (iError != KErrNone)
+   		 		{
+   		 		ERR_PRINTF2_IF_LOGS_ENABLED(_L("Got an error from the FsmL(EAudioPlayEnd) %d."), iError);
+    			}  	
+    		}
+    	}
+    }
+
+/**
+*
+* Implementation of the MMdaAudioPlayerCallback interface function.
+*
+* @param TInt aError
+*
+*/
+void CTestMmfDRMAudioPlayerBase::MapcPlayComplete(TInt aError)
+    {
+    INFO_PRINTF2_IF_LOGS_ENABLED(_L("MMdaAudioPlayerCallback Play Complete. Error = %d"), aError);
+    iError = aError;
+    if (iError != KErrNone)
+    	{
+    	ERR_PRINTF2_IF_LOGS_ENABLED(_L("Playing the audio file failed, unexpected error %d."), aError);
+    	iAudioPlayer->Close();
+    	CActiveScheduler::Stop();
+    	}
+    else
+    	{
+    	TRAP(iError, FsmL(EAudioPlayEnd)); 
+    	if (iError != KErrNone)
+    		{
+    		ERR_PRINTF2_IF_LOGS_ENABLED(_L("Got an error from the FsmL(EAudioPlayEnd) %d."), iError);
+    		}    	
+    	}
+    }
+
+// Positive Tests
+
+/**
+*
+* Ctor for CTestMmfDRMAudioPlayFileSource
+*
+* @return CTestMmfDRMAudioPlayFileSource*: 
+*                           constructed CTestMmfDRMAudioPlayFileSource object
+*
+*/
+CTestMmfDRMAudioPlayFileSource* CTestMmfDRMAudioPlayFileSource::NewL()
+    {
+    return new (ELeave) CTestMmfDRMAudioPlayFileSource;
+    }
+
+/**
+*
+* Test step constructor.
+* Each test step initialises its own name.
+*
+*/
+CTestMmfDRMAudioPlayFileSource::CTestMmfDRMAudioPlayFileSource()
+    {
+    // Store the name of this test case
+    // This is the name that is used by the script file
+    iTestStepName = _L("MM-MMF-ACLNT-U-0901-HP");
+    }
+
+/**
+*
+* Do the test step.
+* Each test step must supply an implementation for DoTestStepL.
+*
+* @return TVerdict: The result of the test step.
+*
+*/
+TVerdict CTestMmfDRMAudioPlayFileSource::DoTestStepL()
+    {
+    INFO_PRINTF1(_L("Open and play a protected audio clip from a file for PLAY intent. (TMMFileSource)."));
+    iTestStepResult = EFail;
+    TRAPD(err, FsmL(EAudioOpen)); // Call to open the audio file
+    if (err == KErrNone)
+    	{
+    	CActiveScheduler::Start(); // ActiveScheduler started ONLY once
+    	}
+    return iTestStepResult;
+    }
+
+
+
+/**
+*
+* Ctor for CTestMmfDRMAudioPlayFileHandleSource
+*
+* @return CTestMmfDRMAudioPlayFileHandleSource*: 
+*                         constructed CTestMmfDRMAudioPlayFileHandleSource object
+*
+*/
+CTestMmfDRMAudioPlayFileHandleSource* CTestMmfDRMAudioPlayFileHandleSource::NewL()
+    {
+    return new (ELeave) CTestMmfDRMAudioPlayFileHandleSource;
+    }
+
+/**
+*
+* Test step constructor.
+* Each test step initialises its own name.
+*
+*/
+CTestMmfDRMAudioPlayFileHandleSource::CTestMmfDRMAudioPlayFileHandleSource()
+    {
+    iTestStepName = _L("MM-MMF-ACLNT-U-0902-HP");
+    }
+
+/**
+*
+* Implementation of the MMdaAudioPlayerCallback interface function.
+*
+* @param TInt aError
+*
+*/
+void CTestMmfDRMAudioPlayFileHandleSource::MapcInitComplete(TInt aError, 
+    const TTimeIntervalMicroSeconds& /*aDuration*/)
+    {
+    INFO_PRINTF2(_L("MMdaAudioPlayerCallback Init Complete. Error = %d"), aError);
+    iError = aError;
+	if (iError != KErrNone)
+    	{
+    	ERR_PRINTF2(_L("Opening the audio file failed, unexpected error %d."), aError);
+    	iAudioPlayer->Close();
+    	CActiveScheduler::Stop();
+    	}
+    else
+    	{
+    	TRAP(iError, FsmHandleL(EAudioPlay)); // Call to play audio
+    	}
+
+    }
+
+/**
+*
+* Implementation of the MMdaAudioPlayerCallback interface function.
+*
+* @param TInt aError
+*
+*/
+void CTestMmfDRMAudioPlayFileHandleSource::MapcPlayComplete(TInt aError)
+    {
+    INFO_PRINTF2(_L("MMdaAudioPlayerCallback Play Complete. Error = %d"), aError);
+    iError = aError;
+    if (iError != KErrNone)
+    	{
+    	ERR_PRINTF2(_L("Play complete returned unexpected error %d."), aError);
+    	iAudioPlayer->Close();
+    	CActiveScheduler::Stop();
+    	}
+    else
+    	{
+    	TRAP(iError, FsmHandleL(EAudioPlayEnd)); 
+    	}
+
+    }
+
+/**
+*
+* Do the test step.
+* Each test step must supply an implementation for DoTestStepL.
+*
+* @return TVerdict: The result of the test step.
+*
+*/
+TVerdict CTestMmfDRMAudioPlayFileHandleSource::DoTestStepL()
+    {
+    INFO_PRINTF1(_L("Open and play a protected audio clip from a file for PLAY intent. (TMMFileHandleSource)."));
+	iTestStepResult = EFail;
+    User::LeaveIfError(iFs.Connect());
+    User::LeaveIfError(iFs.ShareProtected());
+    User::LeaveIfError(iFile.Open(iFs, iFileName, EFileRead));
+
+    TRAPD(err, FsmHandleL(EAudioOpen)); // Call to open the audio file thru file handle
+    if (err == KErrNone)
+    	{
+    	CActiveScheduler::Start(); // ActiveScheduler started ONLY once
+    	}
+        
+    iFile.Close();
+    iFs.Close();
+
+    return iTestStepResult;
+    }
+
+
+
+/**
+*
+* Ctor for CTestMmfDRMAudioPPCSFileSource
+*
+* @return CTestMmfDRMAudioPPCSFileSource*: constructed CTestMmfDRMAudioPPCSFileSource object
+*
+*/
+CTestMmfDRMAudioPPCSFileSource* CTestMmfDRMAudioPPCSFileSource::NewL()
+    {
+    return new (ELeave) CTestMmfDRMAudioPPCSFileSource;
+    }
+
+/**
+*
+* Test step constructor.
+* Each test step initialises its own name.
+*
+*/
+CTestMmfDRMAudioPPCSFileSource::CTestMmfDRMAudioPPCSFileSource()
+    {
+    iTestStepName = _L("MM-MMF-ACLNT-U-0903-HP");
+    }
+
+/**
+*
+* Do the test step.
+* Each test step must supply an implementation for DoTestStepL.
+*
+* @return TVerdict: The result of the test step.
+*
+*/
+TVerdict CTestMmfDRMAudioPPCSFileSource::DoTestStepL()
+    {
+    INFO_PRINTF1(_L("Open, play, pause, continue and stop the play of the protected audio clip from a file for PLAY/PAUSE/CONTINUE/STOP intents. (TMMFileSource)."));
+	iTestStepResult = EFail;
+    TRAPD(err,FsmL(EAudioOpen)); // Call to open the audio file
+  	if (err == KErrNone)
+    	{
+    	CActiveScheduler::Start(); // ActiveScheduler started ONLY once
+    	}
+    else
+    	{
+    	iError = err;
+    	CActiveScheduler::Stop();
+    	}
+       
+    return iTestStepResult;
+    }
+
+
+
+/**
+*
+* Ctor for CTestMmfDRMAudioPlayAllocFileSource
+*
+* @return CTestMmfDRMAudioPlayAllocFileSource*: 
+*                       constructed CTestMmfDRMAudioPlayAllocFileSource object
+*
+*/
+CTestMmfDRMAudioPlayAllocFileSource* CTestMmfDRMAudioPlayAllocFileSource::NewL()
+    {
+    return new (ELeave) CTestMmfDRMAudioPlayAllocFileSource;
+    }
+
+/**
+*
+* Test step constructor.
+* Each test step initialises its own name.
+*
+*/
+CTestMmfDRMAudioPlayAllocFileSource::CTestMmfDRMAudioPlayAllocFileSource()
+    {
+    iTestStepName = _L("MM-MMF-ACLNT-U-0904-HP");
+    }
+
+/**
+*
+* Play audio by marking heap.
+*
+*/
+void CTestMmfDRMAudioPlayAllocFileSource::AudioPlayAllocL()
+    {
+    __MM_HEAP_MARK;
+
+    TRAPD(err, FsmL(EAudioOpen)); // Call to open the audio file
+    if (err == KErrNone)
+    	{
+    	CActiveScheduler::Start(); // ActiveScheduler started ONLY once{
+    	}
+    	
+	iAudioPlayer->Close();
+		
+    __MM_HEAP_MARKEND;
+    }
+
+/**
+*
+* Do the test step.
+* Each test step must supply an implementation for DoTestStepL.
+*
+* @return TVerdict: The result of the test step.
+*
+*/
+TVerdict CTestMmfDRMAudioPlayAllocFileSource::DoTestStepL()
+    {
+    INFO_PRINTF1(_L("Alloc test to open and play a protected audio clip from a file for PLAY intent. (TMMFileSource)."));
+	iTestStepResult = EFail;
+    TRAP(iError, AudioPlayAllocL());
+    if (iError != KErrNone)
+        {
+        INFO_PRINTF2(_L("Opening/playing the audio file failed, unexpected error %d."), iError);
+        return EFail;
+        }
+
+    iTestStepResult  = EPass;
+
+    TInt failCount   = 1;
+    TBool completed  = EFalse;
+    TBool badResult  = EFalse;
+    TBool reachedEnd = EFalse;
+
+	EnableLogs(EFalse);
+    for(;;)
+        {
+        __UHEAP_SETFAIL(RHeap::EFailNext, failCount);
+        __MM_HEAP_MARK;
+
+		TInt error = KErrNone;
+        TRAP(error, AudioPlayAllocL());
+
+		if (error != KErrNone)
+			{
+			iError = error;
+			}
+			
+        completed = EFalse;
+        if (iError == KErrNone)
+            {
+            TAny *testAlloc = User::Alloc(1); // when this fails, we passed through all allocs within test
+            if (testAlloc == NULL)
+                {
+                reachedEnd = ETrue;
+                failCount--;
+                }
+            else
+                {
+                User::Free(testAlloc);
+                testAlloc = NULL;
+                }
+
+            if (iTestStepResult != EPass)
+                {
+                badResult = ETrue;
+                }
+
+            completed = reachedEnd || badResult;
+            }
+        else if (iError != KErrNoMemory)
+            {
+            __UHEAP_SETFAIL(RHeap::ENone, 0);
+            ERR_PRINTF2(_L("Bad error code %d"), iError);
+            completed = ETrue;
+            badResult = EFail;
+            }
+
+        __MM_HEAP_MARKEND;
+        __UHEAP_SETFAIL(RHeap::ENone, 0);
+
+        if (completed)
+            {
+            break;
+            }
+
+        failCount++;
+        }
+
+    if (iError != KErrNone || badResult)
+        {
+        if (badResult)
+            {
+            INFO_PRINTF3(_L("Bad result with %d memory allocations tested. The Error returned is %d."), failCount, iError);
+            }
+        else
+            {
+            INFO_PRINTF3(_L("Error(%d) with %d memory allocations tested."), failCount, iError);
+            }
+
+        iTestStepResult = EFail;
+        }
+    else
+        {
+        INFO_PRINTF2(_L("Completed OK with %d memory allocations tested.\n"), failCount);
+        iTestStepResult = EPass;
+        }
+
+    return iTestStepResult;
+    }
+
+
+
+/**
+*
+* Ctor for CTestMmfDRMAudioPlayUniqueIdFileSource
+*
+* @return CTestMmfDRMAudioPlayUniqueIdFileSource*: 
+*                          constructed CTestMmfDRMAudioPlayUniqueIdFileSource object
+*
+*/
+CTestMmfDRMAudioPlayUniqueIdFileSource* CTestMmfDRMAudioPlayUniqueIdFileSource::NewL()
+    {
+    return new (ELeave) CTestMmfDRMAudioPlayUniqueIdFileSource;
+    }
+
+/**
+*
+* Test step constructor.
+* Each test step initialises its own name.
+*
+*/
+CTestMmfDRMAudioPlayUniqueIdFileSource::CTestMmfDRMAudioPlayUniqueIdFileSource()
+    {
+    iTestStepName = _L("MM-MMF-ACLNT-U-0905-HP");
+    }
+
+/**
+*
+* Do the test step.
+* Each test step must supply an implementation for DoTestStepL.
+*
+* @return TVerdict: The result of the test step.
+*
+*/
+TVerdict CTestMmfDRMAudioPlayUniqueIdFileSource::DoTestStepL()
+    {
+    INFO_PRINTF1(_L("Open and play a protected audio clip from a file for PLAY intent with Unique Id. (TMMFileSource)."));
+	iTestStepResult = EFail;
+    TRAPD(err, FsmL(EAudioOpen)); // Call to open the audio file
+    if (err == KErrNone)
+    	{
+    	CActiveScheduler::Start(); // ActiveScheduler started ONLY once
+    	}
+    
+    return iTestStepResult;
+    }
+
+
+
+/**
+*
+* Ctor for CTestMmfDRMAudioPlayAllocFileHandleSource
+*
+* @return CTestMmfDRMAudioPlayAllocFileHandleSource*: 
+*                           constructed CTestMmfDRMAudioPlayAllocFileHandleSource object
+*
+*/
+CTestMmfDRMAudioPlayAllocFileHandleSource* CTestMmfDRMAudioPlayAllocFileHandleSource::NewL()
+    {
+    return new (ELeave) CTestMmfDRMAudioPlayAllocFileHandleSource;
+    }
+
+/**
+*
+* Test step constructor.
+* Each test step initialises its own name.
+*
+*/
+CTestMmfDRMAudioPlayAllocFileHandleSource::CTestMmfDRMAudioPlayAllocFileHandleSource()
+    {
+    iTestStepName = _L("MM-MMF-ACLNT-U-0906-HP");
+    }
+
+/**
+*
+* Implementation of the MMdaAudioPlayerCallback interface function.
+*
+* @param TInt aError
+*
+*/
+void CTestMmfDRMAudioPlayAllocFileHandleSource::MapcInitComplete(TInt aError, 
+    const TTimeIntervalMicroSeconds& /*aDuration*/)
+    {
+    INFO_PRINTF2_IF_LOGS_ENABLED(_L("MMdaAudioPlayerCallback Init Complete. Error = %d"), aError);
+    iError = aError;
+    if (iError != KErrNone)
+    	{
+    	ERR_PRINTF1_IF_LOGS_ENABLED(_L("Opening the audio file failed."));
+    	iAudioPlayer->Close();
+       	CActiveScheduler::Stop();
+    	}
+    else
+    	{
+    	TRAP(iError, FsmHandleL(EAudioPlay)); // Call to play audio
+    	}
+	}
+
+/**
+*
+* Implementation of the MMdaAudioPlayerCallback interface function.
+*
+* @param TInt aError
+*
+*/
+void CTestMmfDRMAudioPlayAllocFileHandleSource::MapcPlayComplete(TInt aError)
+    {
+    INFO_PRINTF2_IF_LOGS_ENABLED(_L("MMdaAudioPlayerCallback Play Complete. Error = %d"), aError);
+    iError = aError;
+    if (iError != KErrNone)
+    	{
+    	ERR_PRINTF2_IF_LOGS_ENABLED(_L("Audio playback failed with unexpected error %d."), aError);
+    	iAudioPlayer->Close();
+      	CActiveScheduler::Stop();
+    	}
+    else
+    	{
+    	TRAP(iError, FsmHandleL(EAudioPlayEnd)); // end audio playback
+    	}
+	
+    }
+
+/**
+*
+* Play audio by marking heap.
+*
+*/
+void CTestMmfDRMAudioPlayAllocFileHandleSource::AudioPlayAllocL()
+    {
+    __MM_HEAP_MARK;
+
+    User::LeaveIfError(iFs.Connect());
+    User::LeaveIfError(iFs.ShareProtected());
+    User::LeaveIfError(iFile.Open(iFs, iFileName, EFileRead | EFileShareReadersOnly));
+
+    TRAPD(err, FsmHandleL(EAudioOpen)); // Call to open the audio file thru file handle
+    if (err == KErrNone)
+    	{
+    	CActiveScheduler::Start(); 
+    	}
+    
+    iAudioPlayer->Close();
+ 
+	iFile.Close();
+    iFs.Close();
+    
+    __MM_HEAP_MARKEND;
+    }
+
+/**
+*
+* Do the test step.
+* Each test step must supply an implementation for DoTestStepL.
+*
+* @return TVerdict: The result of the test step.
+*
+*/
+TVerdict CTestMmfDRMAudioPlayAllocFileHandleSource::DoTestStepL()
+    {
+    INFO_PRINTF1(_L("Alloc test to open and play a protected audio clip from a file for PLAY intent. (TMMFileHandleSource)."));
+#ifndef SYMBIAN_MULTIMEDIA_A3FDEVSOUND
+	// As a part of DEF123331, this test has been disabled for non-A3F build.
+	INFO_PRINTF1(_L("As a part of DEF123331, this test has been disabled for non-A3F build."));
+	return EPass;
+#else
+	TRAPD(err, AudioPlayAllocL());
+    if(err != KErrNone)
+    	{
+    	iError = err;
+    	}
+    	
+    if (iError != KErrNone)
+        {
+        INFO_PRINTF2(_L("Opening/playing the audio file failed, unexpected error %d."), iError);
+        return EFail;
+        }
+
+    iTestStepResult  = EPass;
+
+    TInt failCount   = 1;
+    TBool completed  = EFalse;
+    TBool badResult  = EFalse;
+    TBool reachedEnd = EFalse;
+    TInt error = KErrNone;
+
+	EnableLogs(EFalse);
+    for(;;)
+        {
+        __UHEAP_SETFAIL(RHeap::EFailNext, failCount);
+        __MM_HEAP_MARK;
+
+	    TRAP(error, AudioPlayAllocL());
+        if (error != KErrNone)
+        	{
+        	iError = error;
+        	iFile.Close();
+        	iFs.Close();
+           	}
+        
+        	
+        completed = EFalse;
+        if (iError == KErrNone)
+            {
+            TAny *testAlloc = User::Alloc(1); // when this fails, we passed through all allocs within test
+            if (testAlloc == NULL)
+                {
+                reachedEnd = ETrue;
+                failCount--;
+                }
+            else
+                {
+                User::Free(testAlloc);
+                testAlloc = NULL;
+                }
+
+            if (iTestStepResult != EPass)
+                {
+                badResult = ETrue;
+                }
+
+            completed = reachedEnd || badResult;
+            }
+        else if (iError != KErrNoMemory)
+            {
+            __UHEAP_SETFAIL(RHeap::ENone, 0);
+            ERR_PRINTF2(_L("Bad error code %d"), iError);
+            completed = ETrue;
+            badResult = EFail;
+            }
+
+        __MM_HEAP_MARKEND;
+        __UHEAP_SETFAIL(RHeap::ENone, 0);
+
+        if (completed)
+            {
+            break;
+            }
+
+        failCount++;
+        }
+
+    if (iError != KErrNone || badResult)
+        {
+        if (badResult)
+            {
+            INFO_PRINTF3(_L("Bad result with %d memory allocations tested. The Error returned is %d."), failCount, iError);
+            }
+        else
+            {
+            INFO_PRINTF3(_L("Error(%d) with %d memory allocations tested."), failCount, iError);
+            }
+
+        iTestStepResult = EFail;
+        }
+    else
+        {
+        INFO_PRINTF2(_L("Completed OK with %d memory allocations tested.\n"), failCount);
+        iTestStepResult = EPass;
+        }
+
+    return iTestStepResult;
+#endif    
+    }
+
+
+
+// Negative Tests
+
+/**
+*
+* Ctor for CTestMmfDRMAudioOpenUnknownFileSource
+*
+* @return CTestMmfDRMAudioOpenUnknownFileSource*: 
+*                           constructed CTestMmfDRMAudioOpenUnknownFileSource object
+*
+*/
+CTestMmfDRMAudioOpenUnknownFileSource* CTestMmfDRMAudioOpenUnknownFileSource::NewL()
+    {
+    return new (ELeave) CTestMmfDRMAudioOpenUnknownFileSource;
+    }
+
+/**
+*
+* Test step constructor.
+* Each test step initialises its own name.
+*
+*/
+CTestMmfDRMAudioOpenUnknownFileSource::CTestMmfDRMAudioOpenUnknownFileSource()
+    {
+    iTestStepName = _L("MM-MMF-ACLNT-U-0921-HP");
+    }
+
+/**
+*
+* Implementation of the MMdaAudioPlayerCallback interface function.
+*
+* @param TInt aError
+*
+*/
+void CTestMmfDRMAudioOpenUnknownFileSource::MapcInitComplete(TInt aError, 
+    const TTimeIntervalMicroSeconds& /*aDuration*/)
+    {
+    INFO_PRINTF2(_L("MMdaAudioPlayerCallback Init Complete. Error = %d"), aError);
+    iError = aError;
+    CActiveScheduler::Stop();
+    }
+
+void CTestMmfDRMAudioOpenUnknownFileSource::MapcPlayComplete(TInt /*aError*/)
+    {
+    // Not used in this test.
+    }
+
+/**
+*
+* Do the test step.
+* Each test step must supply an implementation for DoTestStepL.
+*
+* @return TVerdict: The result of the test step.
+*
+*/
+TVerdict CTestMmfDRMAudioOpenUnknownFileSource::DoTestStepL()
+    {
+    INFO_PRINTF1(_L("Open a protected audio clip from a file with rights for UNKNOWN intent. (TMMFileSource)."));
+
+    iTestStepResult = EFail;
+
+    INFO_PRINTF2(_L("Opening the file for PLAY intent: %S"), &iFileName);
+    iAudioPlayer->OpenFileL(TMMFileSource(iFileName, KRightsPlayerUniqueId001, ContentAccess::EUnknown));
+	
+	
+    CActiveScheduler::Start();
+
+    if (iError == KErrCANoPermission)
+        {
+        INFO_PRINTF1(_L("No Permission to open the audio file for Unknown intent!"));
+        iTestStepResult = EPass;
+        }
+    else
+        {
+        INFO_PRINTF3(_L("Unexpected error %d, expected %d."), iError, KErrCANoPermission);
+        }
+
+    return iTestStepResult;
+    }
+
+
+
+/**
+*
+* Ctor for CTestMmfDRMAudioPlayNoRightsFileSource
+*
+* @return CTestMmfDRMAudioPlayNoRightsFileSource*: 
+*                           constructed CTestMmfDRMAudioPlayNoRightsFileSource object
+*
+*/
+CTestMmfDRMAudioPlayNoRightsFileSource* CTestMmfDRMAudioPlayNoRightsFileSource::NewL()
+    {
+    return new (ELeave) CTestMmfDRMAudioPlayNoRightsFileSource;
+    }
+
+/**
+*
+* Test step constructor.
+* Each test step initialises its own name.
+*
+*/
+CTestMmfDRMAudioPlayNoRightsFileSource::CTestMmfDRMAudioPlayNoRightsFileSource()
+    {
+    iTestStepName = _L("MM-MMF-ACLNT-U-0922-HP");
+    }
+
+/**
+*
+* Implementation of the MMdaAudioPlayerCallback interface function.
+*
+* @param TInt aError
+*
+*/
+void CTestMmfDRMAudioPlayNoRightsFileSource::MapcInitComplete(TInt aError, 
+    const TTimeIntervalMicroSeconds& /*aDuration*/)
+    {
+    INFO_PRINTF2(_L("MMdaAudioPlayerCallback Init Complete. Error = %d"), aError);
+    iError = aError;
+    CActiveScheduler::Stop();
+    }
+
+void CTestMmfDRMAudioPlayNoRightsFileSource::MapcPlayComplete(TInt /*aError*/)
+    {
+    // Not used in this test.
+    }
+
+/**
+*
+* Do the test step.
+* Each test step must supply an implementation for DoTestStepL.
+*
+* @return TVerdict: The result of the test step.
+*
+*/
+TVerdict CTestMmfDRMAudioPlayNoRightsFileSource::DoTestStepL()
+    {
+    INFO_PRINTF1(_L("Open a protected audio clip from a file for PLAY intent with NO rights. (TMMFileSource)."));
+
+    iTestStepResult = EFail;
+
+    // Get the filename
+    // iFileName will be the content file, containing audio files
+    if (!GetStringFromConfig(_L("SectionDRM"), _L("AudioContentNoRights"), iFileName))
+        {
+        return EInconclusive;
+        }
+
+    INFO_PRINTF2(_L("Opening the file for PLAY intent: %S"), &iFileName);
+    iAudioPlayer->OpenFileL(TMMFileSource(iFileName, KRightsPlayerUniqueId004, ContentAccess::EPlay));
+
+    CActiveScheduler::Start();
+
+    if (iError == KErrCANoRights)
+        {
+        INFO_PRINTF1(_L("Expected failure: No rights."));
+        iTestStepResult = EPass;
+        }
+    else
+        {
+        INFO_PRINTF3(_L("Unexpected error %d, expected %d."), iError, KErrCANoRights);
+        }
+
+    return iTestStepResult;
+    }
+
+
+
+/**
+*
+* Ctor for CTestMmfDRMAudioPlayRightsCountFileSource
+*
+* @return CTestMmfDRMAudioPlayRightsCountFileSource*: 
+*                           constructed CTestMmfDRMAudioPlayRightsCountFileSource object
+*
+*/
+CTestMmfDRMAudioPlayRightsCountFileSource* CTestMmfDRMAudioPlayRightsCountFileSource::NewL()
+    {
+    return new (ELeave) CTestMmfDRMAudioPlayRightsCountFileSource;
+    }
+
+/**
+*
+* Test step constructor.
+* Each test step initialises its own name.
+*
+*/
+CTestMmfDRMAudioPlayRightsCountFileSource::CTestMmfDRMAudioPlayRightsCountFileSource()
+    {
+    iTestStepName = _L("MM-MMF-ACLNT-U-0923-HP");
+    }
+
+/**
+*
+* Do the test step.
+* Each test step must supply an implementation for DoTestStepL.
+*
+* @return TVerdict: The result of the test step.
+*
+*/
+TVerdict CTestMmfDRMAudioPlayRightsCountFileSource::DoTestStepL()
+    {
+    INFO_PRINTF1(_L("Open and play a protected audio clip from a file for PLAY intent 4 times with rights count set to 3. (TMMFileSource)."));
+
+    // Open and play the audio file for three times
+    // The rights count for this protected audio file is set to 3.
+    // Hence looped four times to check failure while opening for the fourth time.
+    for (TInt rightscount = 1; rightscount <= 4; rightscount++)
+        {
+        iTestStepResult = EFail;
+        INFO_PRINTF2(_L("Rights count = %d "), rightscount);
+
+        TRAPD(err, FsmL(EAudioOpen)); // Call to open the audio file
+        if (err == KErrNone)
+    		{
+    		CActiveScheduler::Start(); // ActiveScheduler started ONLY once 
+    		} 
+
+        if ((iError == KErrCANoPermission) && (rightscount == 4))
+            {
+            INFO_PRINTF1(_L("No Permission to open the audio file!"));
+            iTestStepResult = EPass;
+            }
+        else if (iError != KErrNone)
+            {
+            ERR_PRINTF2(_L("Opening the audio file failed, unexpected error %d."), iError);
+            return iTestStepResult;
+            }
+        }
+
+    return iTestStepResult;
+    }
+
+
+
+/**
+*
+* Ctor for CTestMmfDRMAudioPlayInvalidIdFileSource
+*
+* @return CTestMmfDRMAudioPlayInvalidIdFileSource*: 
+*                           constructed CTestMmfDRMAudioPlayInvalidIdFileSource object
+*
+*/
+CTestMmfDRMAudioPlayInvalidIdFileSource* CTestMmfDRMAudioPlayInvalidIdFileSource::NewL()
+    {
+    return new (ELeave) CTestMmfDRMAudioPlayInvalidIdFileSource;
+    }
+
+/**
+*
+* Test step constructor.
+* Each test step initialises its own name.
+*
+*/
+CTestMmfDRMAudioPlayInvalidIdFileSource::CTestMmfDRMAudioPlayInvalidIdFileSource()
+    {
+    iTestStepName = _L("MM-MMF-ACLNT-U-0924-HP");
+    }
+
+/**
+*
+* Implementation of the MMdaAudioPlayerCallback interface function.
+*
+* @param TInt aError
+*
+*/
+void CTestMmfDRMAudioPlayInvalidIdFileSource::MapcInitComplete(TInt aError, 
+    const TTimeIntervalMicroSeconds& /*aDuration*/)
+    {
+    INFO_PRINTF2(_L("MMdaAudioPlayerCallback Init Complete. Error = %d"), aError);
+    iError = aError;
+    CActiveScheduler::Stop();
+    }
+
+void CTestMmfDRMAudioPlayInvalidIdFileSource::MapcPlayComplete(TInt /*aError*/)
+    {
+    // Not used in this test.
+    }
+
+/**
+*
+* Do the test step.
+* Each test step must supply an implementation for DoTestStepL.
+*
+* @return TVerdict: The result of the test step.
+*
+*/
+TVerdict CTestMmfDRMAudioPlayInvalidIdFileSource::DoTestStepL()
+    {
+    INFO_PRINTF1(_L("Open a protected audio clip from a file for PLAY intent with INVALID Unique Id. (TMMFileSource)."));
+
+    iTestStepResult = EFail;
+
+    INFO_PRINTF2(_L("Opening the file for PLAY intent: %S"), &iFileName);
+    iAudioPlayer->OpenFileL(TMMFileSource(iFileName, KRightsPlayerInvalidUniqueId, ContentAccess::EPlay));
+
+    CActiveScheduler::Start();
+
+    if (iError == KErrNotFound)
+        {
+        INFO_PRINTF1(_L("Expected failure: Audio file not found!"));
+        iTestStepResult = EPass;
+        }
+    else
+        {
+        INFO_PRINTF3(_L("Unexpected error %d, expected %d."), iError, KErrNotFound);
+        }
+
+    return iTestStepResult;
+    }
+/**
+*
+* Ctor for CTestMmfDRMAudioPlayAndStopFileSource
+*
+* @return CTestMmfDRMAudioPlayAndStopFileSource*: constructed CTestMmfDRMAudioPlayAndStopFileSource object
+*
+*/
+CTestMmfDRMAudioPlayAndStopFileSource* CTestMmfDRMAudioPlayAndStopFileSource::NewL()
+    {
+    return new (ELeave) CTestMmfDRMAudioPlayAndStopFileSource;
+    }
+
+/**
+*
+* Test step constructor.
+* Each test step initialises its own name.
+*
+*/
+CTestMmfDRMAudioPlayAndStopFileSource::CTestMmfDRMAudioPlayAndStopFileSource()
+    {
+    iTestStepName = _L("MM-MMF-ACLNT-U-0907-HP");
+    }
+
+/**
+*
+* Do the test step.
+* Each test step must supply an implementation for DoTestStepL.
+*
+* @return TVerdict: The result of the test step.
+*
+*/
+TVerdict CTestMmfDRMAudioPlayAndStopFileSource::DoTestStepL()
+    {
+    INFO_PRINTF1(_L("Open, play, and stop the play of the protected audio clip from a file for PLAY/STOP intents. (TMMFileSource)."));
+	iTestStepResult = EFail;
+    TRAPD(err,FsmL(EAudioOpen)); // Call to open the audio file
+  	if (err == KErrNone)
+    	{
+    	CActiveScheduler::Start(); // ActiveScheduler started ONLY once
+    	}
+    else
+    	{
+    	iError = err;
+    	CActiveScheduler::Stop();
+    	}
+       
+    return iTestStepResult;
+    }
+CTestMmfDRMAudioPPCFFileSource* CTestMmfDRMAudioPPCFFileSource::NewL()
+{
+return new (ELeave) CTestMmfDRMAudioPPCFFileSource;
+}
+
+/**
+*
+* Test step constructor.
+* Each test step initialises its own name.
+*
+*/
+CTestMmfDRMAudioPPCFFileSource::CTestMmfDRMAudioPPCFFileSource()
+{
+iTestStepName = _L("MM-MMF-ACLNT-U-0909-HP");
+}
+
+/**
+*
+* Do the test step.
+* Each test step must supply an implementation for DoTestStepL.
+*
+* @return TVerdict: The result of the test step.
+*
+*/
+TVerdict CTestMmfDRMAudioPPCFFileSource::DoTestStepL()
+{
+INFO_PRINTF1(_L("Open a protected audio clip, switch the state between play and pause very quickly (0.05 second each) for PLAY/PAUSE/CONTINUE/STOP intents to test INC115501. (TMMFileSource)."));
+ iTestStepResult = EFail;
+TRAPD(err,FsmL(EAudioOpen)); // Call to open the audio file
+
+     
+if (err == KErrNone)
+	{
+	CActiveScheduler::Start(); // ActiveScheduler started ONLY once
+	}
+else
+	{
+	iError = err;
+	CActiveScheduler::Stop();
+	}
+   
+return iTestStepResult;
+}
+