mmlibs/mmfw/tsrc/mmfunittest/MidiClnt/TestStepMidiDRM.cpp
changeset 0 b8ed18f6c07b
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/mmlibs/mmfw/tsrc/mmfunittest/MidiClnt/TestStepMidiDRM.cpp	Thu Oct 07 22:34:12 2010 +0100
@@ -0,0 +1,512 @@
+// Copyright (c) 2005-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 <testframework.h>
+
+#include "TSU_MMFMIDICLNT.h"
+#include "TS_MMFMIDICLNTsuite.h"
+
+#include "TestMidiClientUtility.h"
+
+_LIT(KDrmSectName, "SectionDRM");
+_LIT(KDrmFileKey, "MidiDrmContent");
+
+const TInt K1Second		=1000000;
+const TInt K5Seconds	= 5 * K1Second;
+const TInt K30Seconds	=30 * K1Second;
+
+class CCallbackTimer : public CTimer
+   	{
+public:
+   	static CCallbackTimer* NewL();
+   	~CCallbackTimer();
+   	void SetCb(TCallBack aCallback)
+   		{
+   		iCallback = aCallback;
+   		}
+	void After(TTimeIntervalMicroSeconds32 aCancelDelay)
+		{
+		CTimer::After(aCancelDelay);
+		}
+	void After(TTimeIntervalMicroSeconds32 aCancelDelay, TCallBack aCallback);
+
+private:
+   CCallbackTimer();
+   // from CActive
+    void RunL();
+
+private:
+    TCallBack iCallback; 
+    };
+    
+CCallbackTimer* CCallbackTimer::NewL()
+    {
+	CCallbackTimer* self=new (ELeave) CCallbackTimer();
+   	CleanupStack::PushL(self);
+   	self->ConstructL();
+   	CleanupStack::Pop();
+    return self;
+    }
+    
+CCallbackTimer::CCallbackTimer():CTimer(EPriorityHigh)
+	{
+	CActiveScheduler::Add(this);
+	}
+
+CCallbackTimer::~CCallbackTimer()
+    {
+    Cancel();
+    }
+
+
+void CCallbackTimer::After(TTimeIntervalMicroSeconds32 aCancelDelay, TCallBack aCallback)
+    {
+   	iCallback = aCallback;   
+   	CTimer::After(aCancelDelay);
+    }
+
+/**
+*
+* RunL
+*
+**/
+void CCallbackTimer::RunL()
+    {
+    iCallback.CallBack();
+    }
+
+
+
+CTestStepDrm::CTestStepDrm(const TDesC& aTestName, const TTestStepType aTestType, const TDrmTestParams& aDrmParams):
+								CTestMmfMidiClntStep(aTestName, aTestType),
+								iDrmParams(aDrmParams)
+	{
+	}
+
+TVerdict CTestStepDrm::DoTestStepPreambleL()
+	{
+	if (EPass==CTestMmfMidiClntStep::DoTestStepPreambleL())
+		{
+		iTimer = CCallbackTimer::NewL();
+		iTimer->SetCb(TCallBack(TimerGate, this));
+		User::LeaveIfError( iFs.Connect() );
+		return EPass;
+		}
+	return EFail;
+	}
+
+TVerdict CTestStepDrm::DoTestStepPostambleL()
+	{
+	delete iTimer;
+	iTimer = NULL;
+	
+	iFile.Close();
+	iFs.Close();
+	return CTestMmfMidiClntStep::DoTestStepPostambleL();
+	}
+
+TVerdict CTestStepDrm::DoTestStepL()
+	{
+	if (iDrmParams.iTestMode != TDrmTestParams::EAlloc)
+		{
+		return CTestMmfMidiClntStep::DoTestStepL();
+		}
+	TVerdict result=EPass;
+	TInt failCount = 1;
+	TBool completed = EFalse;
+	CMidiClientUtility* midiClnt = NULL;
+	TInt err;
+	while(!completed)	
+		{
+		iError = KErrNone;
+		__UHEAP_SETFAIL(RHeap::EFailNext ,failCount);
+		__MM_HEAP_MARK;
+
+		TRAP( err, 
+				midiClnt = CMidiClientUtility::NewL(*this);
+				result=DoTestL(midiClnt);
+			);
+		iTimer->Cancel();
+		
+ 		completed = EFalse;
+		if (err == KErrNone)
+			{
+			TAny *testAlloc = User::Alloc(1); // when this fails, we passed through all allocs within test
+			if (testAlloc==NULL)
+				{
+				completed = ETrue;
+				}
+			else
+				{
+				completed = ETrue;
+				User::Free(testAlloc);
+				}
+			}
+		else if (err != KErrNoMemory) // bad error code
+			{
+			completed 	= ETrue;
+			result		= EFail;
+			}
+		else
+			{
+			++failCount;
+			}
+			
+		delete midiClnt;
+		midiClnt = NULL;
+					
+		__UHEAP_RESET;
+		__MM_HEAP_MARKEND;
+		}
+	return result;
+	}
+
+/*static*/
+TInt CTestStepDrm::TimerGate(TAny* aPtr)
+	{
+	reinterpret_cast<CTestStepDrm*>(aPtr)->OnTimer();
+	return KErrNone;
+	}
+	
+void CTestStepDrm::OnTimer()
+	{
+	iTimer->Cancel();
+	CActiveScheduler::Stop();
+	iError = KErrTimedOut;	
+	}
+
+TVerdict CTestStepDrm::OpenFileL(CMidiClientUtility* aMidi)
+	{
+	TPtrC fileName;
+	if (iDrmParams.iFileNameKey==NULL)
+		{
+		if(!GetStringFromConfig(KDrmSectName,KDrmFileKey,fileName))
+			{
+			return EInconclusive;
+			}		
+		}
+	else
+		{
+		if(!GetStringFromConfig(KDrmSectName,TPtrC(iDrmParams.iFileNameKey), fileName))
+			{
+			return EInconclusive;
+			}				
+		}
+	if (iDrmParams.iSourceType==TDrmTestParams::EFileName)
+		{
+		TPtrC uniqueId(ContentAccess::KDefaultContentObject);
+		if (iDrmParams.iUniqueId)
+			{
+			uniqueId.Set(TPtrC(iDrmParams.iUniqueId));
+			}
+		if (iDrmParams.iUniqueId==NULL && iDrmParams.iIntent==TDrmTestParams::KNoIntent)
+			{
+			aMidi->OpenFile(TMMFileSource(fileName));
+			}
+		else if (iDrmParams.iIntent==TDrmTestParams::KNoIntent)
+			{
+			aMidi->OpenFile(TMMFileSource(fileName, uniqueId));
+			}
+		else
+			{
+			aMidi->OpenFile(TMMFileSource(fileName, uniqueId, iDrmParams.iIntent));
+			}		
+		}
+	else
+		{
+		iFile.Close();
+		User::LeaveIfError( iFs.ShareProtected() );
+		User::LeaveIfError( iFile.Open(iFs, fileName, EFileRead | EFileShareExclusive) );
+		
+		TPtrC uniqueId(ContentAccess::KDefaultContentObject);
+		if (iDrmParams.iUniqueId)
+			{
+			uniqueId.Set(TPtrC(iDrmParams.iUniqueId));
+			}
+		if (iDrmParams.iUniqueId==NULL && iDrmParams.iIntent==TDrmTestParams::KNoIntent)
+			{
+			aMidi->OpenFile(TMMFileHandleSource(iFile));
+			}
+		else if (iDrmParams.iIntent==TDrmTestParams::KNoIntent)
+			{
+			aMidi->OpenFile(TMMFileHandleSource(iFile, uniqueId));
+			}
+		else
+			{
+			aMidi->OpenFile(TMMFileHandleSource(iFile, uniqueId, iDrmParams.iIntent));
+			}				
+		}
+
+	return EPass;	
+	}
+
+
+/*static*/
+CTestDrmNegative* CTestDrmNegative::NewL(const TDesC& aTestName, const TTestStepType aTestType, const TDrmTestParams& aDrmParams)
+	{
+	return new (ELeave) CTestDrmNegative(aTestName, aTestType, aDrmParams);
+	}
+
+CTestDrmNegative::CTestDrmNegative(const TDesC& aTestName, const TTestStepType aTestType, const TDrmTestParams& aDrmParams):
+						CTestStepDrm(aTestName, aTestType, aDrmParams)
+	{
+	}
+
+void CTestDrmNegative::MmcuoStateChanged(TMidiState /*aOldState*/,TMidiState /*aNewState*/, const TTimeIntervalMicroSeconds& /*aTime*/,TInt aError)
+	{
+	iError = aError;
+	CActiveScheduler::Stop();
+	}
+
+TVerdict CTestDrmNegative::DoTestL(CMidiClientUtility* aMidi)
+	{
+	iTimer->After( TTimeIntervalMicroSeconds32(K5Seconds) );
+	TVerdict result=OpenFileL(aMidi);
+	if (result!=EPass)
+		{
+		iTimer->Cancel();
+		return result; 
+		}
+	CActiveScheduler::Start();
+
+	if (iError!=iDrmParams.iExpectedError)
+		{
+		result=EFail;
+		ERR_PRINTF3(_L("Open() gave error %d (expected %d)"),iError, iDrmParams.iExpectedError);
+		}
+	iTimer->Cancel();
+	return result;
+	}
+
+
+/*static*/
+CTestDrmPlay* CTestDrmPlay::NewL(const TDesC& aTestName, const TTestStepType aTestType, const TDrmTestParams& aDrmParams)
+	{
+	return new (ELeave) CTestDrmPlay(aTestName, aTestType, aDrmParams);
+	}
+
+CTestDrmPlay::CTestDrmPlay(const TDesC& aTestName, const TTestStepType aTestType, const TDrmTestParams& aDrmParams):
+						CTestStepDrm(aTestName, aTestType, aDrmParams)
+	{
+	}
+
+void CTestDrmPlay::MmcuoStateChanged(TMidiState /*aOldState*/,TMidiState aNewState, const TTimeIntervalMicroSeconds& /*aTime*/,TInt aError)
+	{
+	iError 		= aError;
+	iLatestState= aNewState;
+	CActiveScheduler::Stop();
+	}
+
+TVerdict CTestDrmPlay::PlayL(CMidiClientUtility* aMidi, TTimeIntervalMicroSeconds32 aStopAfter)
+	{
+	iTimer->Cancel();
+	iTimer->After(aStopAfter);
+	
+	TVerdict result=OpenFileL(aMidi);
+	if (result!=EPass)
+		{
+		iTimer->Cancel();
+		return result; 
+		}
+	CActiveScheduler::Start();
+	User::LeaveIfError(iError);
+	
+	aMidi->Play();
+	CActiveScheduler::Start();
+	User::LeaveIfError(iError);
+	if (iLatestState != EMidiStateOpenPlaying)
+		{
+		iTimer->Cancel();
+		ERR_PRINTF3(_L("Play() got state %d (expected %d)"),iLatestState, EMidiStateOpenPlaying);	
+		return EFail;
+		}
+	
+	CActiveScheduler::Start();
+	
+	iTimer->Cancel();
+	if (iError==KErrNoMemory && iDrmParams.iTestMode==TDrmTestParams::EAlloc)
+		{
+		User::Leave(iError);
+		}
+		
+	return result;
+	}
+
+TVerdict CTestDrmPlay::DoTestL(CMidiClientUtility* aMidi)
+	{
+	TVerdict res=EPass;
+	TInt i=iDrmParams.iNumPlayLoops > 0 ? iDrmParams.iNumPlayLoops : 1;
+	for (; i && res==EPass && iError==KErrNone; --i)
+		{
+		TRAP( iError,
+				res=PlayL(aMidi, TTimeIntervalMicroSeconds32(K30Seconds));
+			);
+		}
+	if (iError==KErrNoMemory && iDrmParams.iTestMode==TDrmTestParams::EAlloc)
+		{
+		User::Leave(iError);
+		}		
+	if (res==EPass)
+		{
+		res=(i==0 && iDrmParams.iExpectedError==iError)? EPass : EFail;
+		}
+		
+	if (iError!=iDrmParams.iExpectedError)
+		{
+		ERR_PRINTF4(_L("Play() gave error %d (expected %d) loops left=%d"),iError, iDrmParams.iExpectedError, i);
+		}		
+	return res;		
+	}
+
+/*
+***** Play() -> Stop()
+*/
+CTestDrmPlayStop* CTestDrmPlayStop::NewL(const TDesC& aTestName, const TTestStepType aTestType, const TDrmTestParams& aDrmParams)
+	{
+	return new (ELeave) CTestDrmPlayStop(aTestName, aTestType, aDrmParams);
+	}
+
+
+CTestDrmPlayStop::CTestDrmPlayStop(const TDesC& aTestName, const TTestStepType aTestType, const TDrmTestParams& aDrmParams):
+					CTestDrmPlay(aTestName, aTestType, aDrmParams)
+	{
+	}
+	
+void CTestDrmPlayStop::OnTimer()
+	{
+	if (iLatestState != EMidiStateOpenPlaying || iStopping)
+		{
+		iError = KErrGeneral;
+		CActiveScheduler::Stop();
+		ERR_PRINTF3(_L("CTestDrmPlayStop::OnTimer() got err %d stopping %d"),iError, iStopping);	
+		}
+	else
+		{
+		iMidi->Stop(TTimeIntervalMicroSeconds(100000));
+		iStopping=ETrue;
+		iTimer->After(K5Seconds);
+		}
+	}
+	
+TVerdict CTestDrmPlayStop::DoTestL(CMidiClientUtility* aMidi)
+	{
+	iMidi = aMidi;
+	TVerdict res=PlayL(aMidi, TTimeIntervalMicroSeconds32(K5Seconds));
+	iTimer->Cancel();
+	if (res!=EPass)
+		{
+		return res;
+		}
+	return iError==iDrmParams.iExpectedError ? EPass : EFail;
+	}
+
+/*
+***** Play() -> Stop()
+*/
+
+/*static*/
+CTestDrmPlayWithUI* CTestDrmPlayWithUI::NewL(const TDesC& aTestName, const TTestStepType aTestType, const TDrmTestParams& aDrmParams)
+	{
+	return new (ELeave) CTestDrmPlayWithUI(aTestName, aTestType, aDrmParams);
+	}
+
+CTestDrmPlayWithUI::CTestDrmPlayWithUI(const TDesC& aTestName, const TTestStepType aTestType, const TDrmTestParams& aDrmParams):
+						CTestStepDrm(aTestName, aTestType, aDrmParams)
+	{
+	}
+
+void CTestDrmPlayWithUI::MmcuoStateChanged(TMidiState /*aOldState*/,TMidiState aNewState, const TTimeIntervalMicroSeconds& /*aTime*/,TInt aError)
+	{
+	iError 		= aError;
+	iLatestState= aNewState;
+	CActiveScheduler::Stop();
+	}
+
+TVerdict CTestDrmPlayWithUI::PlayL(CMidiClientUtility* aMidi, TTimeIntervalMicroSeconds32 aStopAfter)
+	{
+	iTimer->Cancel();
+	iTimer->After(aStopAfter);
+	
+	TVerdict result=OpenFileL(aMidi);
+	if (result!=EPass)
+		{
+		iTimer->Cancel();
+		return result; 
+		}
+	CActiveScheduler::Start();
+	User::LeaveIfError(iError);
+	
+	MMMFDRMCustomCommand* cmd=aMidi->GetDRMCustomCommand();
+	if (cmd==NULL)
+		{
+		ERR_PRINTF1(_L("GetDRMCustomCommand() returned NULL"));
+		return EFail;		
+		}
+	iError=cmd->SetAgentProperty(ContentAccess::EAgentPropertyAgentUI, ETrue);
+	// The test agent should return KErrCANotSupported...
+	if (iError != KErrCANotSupported)
+		{
+		ERR_PRINTF2(_L("SetAgentProperty() Error=%d"),iError);
+		return EFail;		
+		}
+	else
+		{
+		// ..it has, so flag that there's no error!
+		iError = KErrNone;
+		}
+	User::LeaveIfError(iError);
+	
+	aMidi->Play();
+	CActiveScheduler::Start();
+	User::LeaveIfError(iError);
+	
+	if (iLatestState != EMidiStateOpenPlaying)
+		{
+		iTimer->Cancel();
+		ERR_PRINTF3(_L("Play() got state %d (expected %d)"),iLatestState, EMidiStateOpenPlaying);	
+		return EFail;
+		}	
+	
+	CActiveScheduler::Start();
+	
+	iTimer->Cancel();
+	if (iError==KErrNoMemory && iDrmParams.iTestMode==TDrmTestParams::EAlloc)
+		{
+		User::Leave(iError);
+		}
+		
+	return EPass;
+	}
+
+TVerdict CTestDrmPlayWithUI::DoTestL(CMidiClientUtility* aMidi)
+	{
+	TVerdict res=EPass;
+	TInt i=iDrmParams.iNumPlayLoops > 0 ? iDrmParams.iNumPlayLoops : 1;
+	for (; i && res==EPass; --i)
+		{
+		res=PlayL(aMidi, TTimeIntervalMicroSeconds32(K30Seconds));
+		}
+	if (res==EFail)
+		{
+		return res;
+		}
+	if (iError!=iDrmParams.iExpectedError)
+		{
+		res=EFail;
+		ERR_PRINTF3(_L("Play() gave error %d (expected %d)"),iError, iDrmParams.iExpectedError);
+		}				
+	return res;
+	}
+