diff -r 000000000000 -r 2e3d3ce01487 commonappservices/alarmservertest/TestMultipleAlarmsSuite/src/TestAssociatedDataStep.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/commonappservices/alarmservertest/TestMultipleAlarmsSuite/src/TestAssociatedDataStep.cpp Tue Feb 02 10:12:00 2010 +0200 @@ -0,0 +1,362 @@ +// 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: +// Contains implementation of CTestAssociatedDataStep class +// +// + +/** + @file + @internalTechnology +*/ + +// User Include +#include "TestAssociatedDataStep.h" +#include "DummyAlarmControl.h" + +// Syatem Includes +#include +#include + +/** +Constructor. Sets the test step name. Testserver reference passed to make use +of TEF's method of sharing data between test steps +@internalTechnology +@test +*/ +CTestAssociatedDataStep::CTestAssociatedDataStep(CTestMultipleAlarmsServer& aTestServer) +: CTestBaseStep(aTestServer) + { + //Call base class method to set human readable name for test step + SetTestStepName(KTestAssociatedDataStep); + } + +/** +Destructor +@internalTechnology +@test +*/ +CTestAssociatedDataStep::~CTestAssociatedDataStep() + { + delete iActiveScheduler; + } + +/** +Base class virtual. Installs the active scheduler +@return EPass or EFail indicating the result of the test step. +@internalTechnology +@test +*/ +TVerdict CTestAssociatedDataStep::doTestStepPreambleL() + { + iActiveScheduler = new (ELeave) CActiveScheduler; + CActiveScheduler::Install(iActiveScheduler); + return TestStepResult(); + } + +/** +Base class pure virtual. +@return EPass or EFail indicating the result of the test step. +@internalTechnology +@test +*/ +TVerdict CTestAssociatedDataStep::doTestStepL() + { + TPtrC alarmMessage; + if(!ReadStringsFromConfig(ConfigSection(), &KIniAlarmMessage(), &alarmMessage, NULL)) + { + IniProblem(); + } + else + { + TPtrC typeOfAD; + TRAPD(error, TestAlarmSoundNameL(alarmMessage)); + PrintIfError(error); + if(!ReadStringsFromConfig(ConfigSection(), &KIniTypeOfAD(), &typeOfAD, NULL)) + { + INFO_PRINTF2(_L("%S field not found in ini. Assuming there is no associated data for the entry"), &KIniTypeOfAD); + } + else + { + TRAP(error, TestAssociatedDataL(alarmMessage, typeOfAD)); + PrintIfError(error); + } + } + return TestStepResult(); + } + +/** +Retreives the alarm control object and tests the associated data of the alarm +whose message is the one that is passed as parameter +@param aAlarmMessage Message to identify the alarm control object +@param aTypeOfAD The type of Associated Data, i.e. url or mime +@internalTechnology +@test +*/ +void CTestAssociatedDataStep::TestAssociatedDataL(const TPtrC& aAlarmMessage, const TPtrC& aTypeOfAD) + { + CCalEntryId* entryId = NULL; + if(!GetEntryIdL(aAlarmMessage, entryId)) + { + ERR_PRINTF2(_L("No associated data attached with the alarm %S ... Failing the test"), &aAlarmMessage); + SetTestStepResult(EFail); + } + else + { + CCalEntry* calEntry = NULL; + CleanupStack::PushL(entryId); + + TestStoreFileNameL(entryId); + + CCalSession* calSession = CreateAndInitializeCalSessionL(EFalse); + CleanupStack::PushL(calSession); + + if(!GetCalEntryL(entryId, calEntry, calSession)) + { + ERR_PRINTF2(_L("The calendar entry was not found for %S. Failing the test..."), &aAlarmMessage); + SetTestStepResult(EFail); + } + else + { + CleanupStack::PushL(calEntry); + CCalAlarm* alarm = calEntry->AlarmL(); + if(!alarm->AlarmAction()) + { + ERR_PRINTF2(_L("Alarm content is NULL for %S. Failing the test..."), &aAlarmMessage); + SetTestStepResult(EFail); + } + else + { + CleanupStack::PushL(alarm); + DoTestAssociatedDataL(alarm->AlarmAction(), aTypeOfAD); + CleanupStack::PopAndDestroy(alarm); + } + CleanupStack::PopAndDestroy(calEntry); + } + CleanupStack::PopAndDestroy(2, entryId); // calSession and entryId + } + } + +/** +Retreives the raw data from the alert server and constructs the CCalEntryId +that contains the details about the entry, which owns the alarm corresponding +to the message passed as parameter. +@param aAlarmMessage The message associated with the alarm +@param aEntryId Pointer to the object that will hold the data describing the +entry +@return The sucess or failure. EFalse if entry does not have associated data +@internalTechnology +@test +*/ +TBool CTestAssociatedDataStep::GetEntryIdL(const TPtrC& aAlarmMessage, CCalEntryId*& aEntryId) + { + CDummyAlarmControl* alarmControl = dynamic_cast(TestServer()->AlarmControlsManager()->GetAlarmControlObjectL(aAlarmMessage)); + if(alarmControl->AlarmObject().HasAssociatedData()) + { + // Get the data from the supervisor + HBufC8* data = HBufC8::NewL(alarmControl->Supervisor()->AlarmData().Length()); + *data = alarmControl->Supervisor()->AlarmData(); + CleanupStack::PushL(data); + + aEntryId = CCalEntryId::NewL(data); + + // CCalEntryId takes ownership + CleanupStack::Pop(data); + return ETrue; + } + + return EFalse; + } + +/** +Retreives the calendar entry corresponding to the data contained in the +CCalEntryId passed as parameter +@param aEntryId The pointer to the object that contains the id details +of the entry +@param aCalEntry The pointer to hold the cal-entry if found +@return The sucess or failure of the find operation +@internalTechnology +@test +*/ +TBool CTestAssociatedDataStep::GetCalEntryL(CCalEntryId* aEntryId, CCalEntry*& aCalEntry, CCalSession* aCalSession) + { + // Get the calendar entry. + RPointerArray entryList; + + CCalEntryView* calEntryView = CreateEntryViewL(aCalSession); + CleanupStack::PushL(calEntryView); + + calEntryView->FetchL(aEntryId->IdL(), entryList); + + TBool found = FindCalEntryL(entryList, aEntryId->RecurrenceIdL(), aCalEntry); + + CleanupStack::PopAndDestroy(calEntryView); + return found; + } + +/** +Not used, to be removed +Retreives the data associated with the entry passed as paraemeter +@param aCalEntry The pointer to the cal-entry. +@return A pointer to the CCalAlarmContent +@internalTechnology +@test +*/ +CCalContent* CTestAssociatedDataStep::GetAlarmContentL(const CCalEntry* aCalEntry) + { + // Get the rich data + return aCalEntry->AlarmL()->AlarmAction(); + } + +/** +Retreives the data associated with the entry passed as paraemeter and checks it +@param aAlarmContent The pointer to the rich data. +@param aTypeOfAD The type of Associated Data, i.e. url or mime +@internalTechnology +@test +*/ +void CTestAssociatedDataStep::DoTestAssociatedDataL(CCalContent* aAlarmContent , const TPtrC& aTypeOfAD) + { + TPtrC mimeType; + if(ReadStringsFromConfig(ConfigSection(), &KIniContentType(), &mimeType, NULL) == EFalse) + { + IniProblem(); + return; + }; + + HBufC8* content8 = NULL; + CCalContent::TDisposition disposition = CCalContent::EDispositionUnknown; + if(aTypeOfAD.Compare(KIniUrl) == 0) + { + TPtrC url; + if(ReadStringsFromConfig(ConfigSection(), &KIniUrl(), &url, NULL) == EFalse) + { + IniProblem(); + return; + }; + // Convert read url from unicode to 8-bit data. + content8 = HBufC8::NewL(url.Length()); + content8->Des().Copy(url); + disposition = CCalContent::EDispositionUrl; + } + else if(aTypeOfAD.Compare(KIniMime) == KErrNone) + { + TPtrC fileName; + if(ReadStringsFromConfig(ConfigSection(), &KIniFileName(), &fileName, NULL) == EFalse) + { + IniProblem(); + return; + }; + GetAlarmContentFromFileL(fileName, content8); + disposition = CCalContent::EDispositionInline; + } + CleanupStack::PushL(content8); + + CheckAlarmContentValuesL(aAlarmContent, disposition, mimeType, *content8); + CleanupStack::PopAndDestroy(content8); + } + +/** +Checks data associated with the entry passed as paraemeter against a set of +expected values +@param aAlarmContent The reference to a pointer to the rich data +@param aExpectedValueType Expected content-value type +@param aExpectedContentType Expected content type +@param aExpectedDataContent8 Expected data content in an 8-bit descriptor +@internalTechnology +@test +*/ +void CTestAssociatedDataStep::CheckAlarmContentValuesL(CCalContent*& aAlarmContent, CCalContent::TDisposition aExpectedDisposition, const TDesC& aExpectedMimeType, const TDesC8& aExpectedContent) + { + INFO_PRINTF3(_L("Testing content disposition. Expected = %D, Actual = %D."), aExpectedDisposition, aAlarmContent->Disposition()); + TEST1(aAlarmContent->Disposition() == aExpectedDisposition, ETrue); + + // Convert 8-bit MIME type to unicode for logging... + HBufC* mimeType = HBufC::NewLC(aAlarmContent->MimeType().Length()); + mimeType->Des().Copy(aAlarmContent->MimeType()); + INFO_PRINTF3(_L("Testing MIME type. Expected = %S, Actual = %S."), &aExpectedMimeType, mimeType); + TEST1(mimeType->Compare(aExpectedMimeType) == KErrNone, ETrue); + CleanupStack::PopAndDestroy(mimeType); + + INFO_PRINTF1(_L("Testing data content")); + TEST1(aAlarmContent->Content().Compare(aExpectedContent) == KErrNone, ETrue); + } + +/** +Finds the calendar entry checking for the sequence no. and recurrence ids +@param aEntryList The list of entries to be checked +@param aRecurrenceId The recurrence id of the entry +@param aFoundEntry The reference to a pointer to the entry which will +be set to point to the found entry +@internalTechnology +@return Success status +@test +*/ +TBool CTestAssociatedDataStep::FindCalEntryL(RPointerArray aEntryList, const TCalTime& aRecurrenceId, CCalEntry*& aFoundEntry) + { + TInt index = 0; + while(aEntryList.Count() > 0) + { + aFoundEntry = aEntryList[index]; + aEntryList.Remove(index); + TCalTime calTime = aFoundEntry->RecurrenceIdL(); + if (calTime.TimeUtcL() == aRecurrenceId.TimeUtcL()) + { + ++index; + } + else + { + delete aFoundEntry; + aFoundEntry = NULL; + } + } + aEntryList.Reset(); + return (aFoundEntry ? ETrue : EFalse); + } + +/** +Tests whether the Store File Name of the calendar entry is as expected +@param aEntryId Pointer to the object that has the entry details +@internalTechnology +@test +*/ +void CTestAssociatedDataStep::TestStoreFileNameL(CCalEntryId* aEntryId) + { + TPtrC storeFileName(aEntryId->StoreFileNameL()); + INFO_PRINTF3(_L("Testing store file name. Expected = %S, Actual = %S."), &KTestCalFile, &storeFileName); + TEST1(storeFileName.Compare(KTestCalFile) == KErrNone, ETrue); + } + +/** +Tests whether the Alarm Sound Name of the alarm is as expected +@param aAlarmMessage The message associated with the alarm +@internalTechnology +@test +*/ +void CTestAssociatedDataStep::TestAlarmSoundNameL(const TPtrC& aAlarmMessage) + { + TPtrC alarmSoundName; + CDummyAlarmControl* alarmControl = dynamic_cast(TestServer()->AlarmControlsManager()->GetAlarmControlObjectL(aAlarmMessage)); + + if(ReadStringsFromConfig(ConfigSection(), &KIniAlarmSoundName(), &alarmSoundName, NULL)) + { + INFO_PRINTF3(_L("Testing alarm sound name. Expected = %S, Actual = %S."), &alarmSoundName, &(alarmControl->AlarmSoundName())); + TEST1(alarmSoundName.Compare(alarmControl->AlarmSoundName()) == KErrNone, ETrue); + } + else + { + INFO_PRINTF1(_L("Testing alarm sound name to be NULL descriptor")); + TEST1(KNullDesC().Compare(alarmControl->AlarmSoundName()) == KErrNone, ETrue); + } + } +