--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/pimappservices/calendar/tsrc/tcal_multiplefiles.cpp Tue Feb 02 10:12:19 2010 +0200
@@ -0,0 +1,1324 @@
+// Copyright (c) 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 "caltestlib.h"
+#include <calentry.h>
+#include <calentryview.h>
+#include <calsession.h>
+#include <e32test.h>
+#include <caliterator.h>
+#include <calrrule.h>
+#include <s32file.h>
+#include <calinstance.h>
+#include <calinstanceview.h>
+#include <e32base.h>
+#include <calinstanceiterator.h>
+#include <calattachment.h>
+#include <calattachmentmanager.h>
+
+_LIT(KTestName,"TCal_MultipleFiles");
+_LIT(KWorkCalendar,"Work_Calendar");
+_LIT(KPersonalCalendar,"Personal_Calendar");
+_LIT(KSportsCalendar, "Sports_Calendar");
+_LIT(KWorkCalendarIndexFile, "c:\\private\\10003a5b\\work_calendarIdx");
+
+RTest test(KTestName);
+const TInt KShortFileId1 = 1;
+const TInt KShortFileId2 = 2;
+_LIT8(KUid, "MFTUid");
+_LIT8(KUid1, "MFTUid1");
+
+
+class CTestFileObservers : public CBase, MCalChangeCallBack2
+ {
+public:
+ static CTestFileObservers* NewL(const TDesC& aFileName);
+ // from MCalChangeCallBack2
+ void CalChangeNotification(RArray<TCalChangeEntry>& aChangeItems);
+ ~CTestFileObservers();
+
+private:
+ void ConstructL(const TDesC& aFileName);
+private:
+ CCalSession* iNotificationSession;
+ };
+
+class CTestMultipleCalendar : public CBase, MCalProgressCallBack
+ {
+public:
+ static CTestMultipleCalendar* NewL();
+ void RunAllTestsL();
+ ~CTestMultipleCalendar();
+
+private:
+ void ConstructL();
+ CTestMultipleCalendar();
+
+ // Test cases
+ void TestEntryViewAndFileConsistencyL(TBool aAddingSameEntry);
+ void TestInstanceViewL();
+ void TestFindInstanceL(TBool aSessionToFindInstanceFrom, TInt aExpectedValue);
+ void TestFindInstanceWithInstanceIdL();
+ void TestUpdateDeleteFunctionalityL();
+ void TestShortFileIdL();
+ void TestSwitchInstanceViewsL();
+ void TestNegativeForSecondSessionL();
+ void TestNegativeForCollectionIdL();
+ void TestCopyEntryBetweenCalendarsL();
+
+ // Data creation and check functions
+ TCalInstanceId AddAndCheckEntryL(CCalEntryView& aEntryView, CCalSession& aSession, TBool aSameEntry = ETrue);
+ void AddLargeNumberOfEntriesL(CCalEntryView& aEntryView);
+ void CreateNotificationSessionL();
+ void CreateSecondSessionL();
+ void CreateAndTestInstanceIteratorL(CCalInstanceView& aInstanceView, TInt aExpectedCount);
+ TInt CheckIteratorL(CCalInstanceIterator& aIterator, RPointerArray<CCalInstance>& aInstances);
+ TBool CheckInstanceIdL(TCalInstanceId aId1, TCalInstanceId aId2);
+ void CheckInstanceDetailsL(CCalInstance* aInstance, TCalInstanceId aInstanceId);
+ void CheckInstanceViewL(CCalInstanceView& aInstanceView, TInt aNumInstance);
+ void DeleteSecondCalendarFileL();
+ void ClearStoredDataL();
+
+ void Progress(TInt aPercentageCompleted);
+ void Completed(TInt aError);
+ TBool NotifyProgress();
+
+private:
+ CCalTestLibrary* iTestLib;
+ TInt iProgress;
+ CCalSession* iSecondSession;
+ TCalTime iStartTime;
+ TCalTime iEndTime;
+ CTestFileObservers* iObserverForWorkCalendar;
+ CTestFileObservers* iObserverForPersonalCalendar;
+ };
+
+CTestFileObservers* CTestFileObservers::NewL(const TDesC& aFileName)
+ {
+ CTestFileObservers* self = new (ELeave) CTestFileObservers();
+ CleanupStack::PushL(self);
+ self->ConstructL(aFileName);
+ CleanupStack::Pop(self);
+ return self;
+ }
+
+void CTestFileObservers::ConstructL(const TDesC& aFileName)
+ {
+ iNotificationSession = CCalSession::NewL();
+ iNotificationSession->OpenL(aFileName);
+ TCalTime minTime;
+ minTime.SetTimeUtcL(TCalTime::MinTime());
+ TCalTime maxTime;
+ maxTime.SetTimeUtcL(TCalTime::MaxTime());
+ CalCommon::TCalTimeRange timeRange(minTime, maxTime);
+ CCalChangeNotificationFilter* filter = CCalChangeNotificationFilter::NewL(MCalChangeCallBack2::EChangeEntryAll, ETrue, timeRange);
+ CleanupStack::PushL(filter);
+ iNotificationSession->StartChangeNotification(*this, *filter);
+ CleanupStack::PopAndDestroy(filter);
+ }
+
+CTestFileObservers::~CTestFileObservers()
+ {
+ delete iNotificationSession;
+ }
+
+void CTestFileObservers::CalChangeNotification(RArray<TCalChangeEntry>& aChangeItems)
+ {
+ test.Printf(_L("MCalChangeCallBack2 notification happened\n") );
+ test(aChangeItems.Count() == 1);
+ TCalChangeEntry change = aChangeItems[0];
+ switch(change.iChangeType)
+ {
+ case MCalChangeCallBack2::EChangeAdd:
+ {
+ test.Printf(_L("Calendar entry has been added"));
+ break;
+ }
+ case MCalChangeCallBack2::EChangeDelete:
+ {
+ test.Printf(_L("Calendar entry has been deleted"));
+ break;
+ }
+ case MCalChangeCallBack2::EChangeModify:
+ {
+ test.Printf(_L("Calendar entry has been modified"));
+ break;
+ }
+ case MCalChangeCallBack2::EChangeUndefined:
+ {
+ test.Printf(_L("Undefined calendar entry change"));
+ break;
+ }
+ case MCalChangeCallBack2::EChangeTzRules:
+ {
+ test.Printf(_L("Calendar entry's time zone rules have been changed"));
+ break;
+ }
+ }
+ CActiveScheduler::Stop();
+ }
+
+CTestMultipleCalendar::CTestMultipleCalendar() : iProgress(0)
+ {
+ }
+
+CTestMultipleCalendar* CTestMultipleCalendar::NewL()
+ {
+ CTestMultipleCalendar* self = new (ELeave) CTestMultipleCalendar();
+ CleanupStack::PushL(self);
+ self->ConstructL();
+ CleanupStack::Pop(self);
+ return self;
+ }
+
+void CTestMultipleCalendar::ConstructL()
+ {
+ iStartTime.SetTimeLocalL(TDateTime(2007, EMarch, 20, 5, 0, 0, 0));
+ iEndTime.SetTimeLocalL(TDateTime(2007, EMarch, 20, 6, 0, 0, 0));
+ iTestLib = CCalTestLibrary::NewL();
+ iTestLib->ReplaceFileL(KWorkCalendar);
+ iTestLib->OpenFileL(KWorkCalendar);
+ }
+
+CTestMultipleCalendar::~CTestMultipleCalendar()
+ {
+ TRAP_IGNORE(DeleteSecondCalendarFileL());
+ delete iObserverForWorkCalendar;
+ delete iObserverForPersonalCalendar;
+ delete iTestLib;
+ delete iSecondSession;
+ }
+
+TCalInstanceId CTestMultipleCalendar::AddAndCheckEntryL(CCalEntryView& aEntryView, CCalSession& aSession, TBool aSameEntry)
+ {
+ RPointerArray<CCalEntry> entries;
+ CleanupResetAndDestroyPushL(entries);
+
+ // create an appt
+ test.Printf(_L("Create an appointment \n"));
+ HBufC8* guid;
+ CCalEntry* entry;
+ if(aSameEntry)
+ {
+ guid = KUid().AllocLC();
+ entry = iTestLib->CreateCalEntryL(CCalEntry::EAppt, guid);
+ }
+ else
+ {
+ guid = KUid1().AllocLC();
+ entry = iTestLib->CreateCalEntryL(CCalEntry::EEvent, guid);
+ }
+ CleanupStack::Pop(guid);
+ CleanupStack::PushL(entry);
+
+ test.Printf(_L("Set the start and end time for the entry \n"));
+ entry->SetStartAndEndTimeL(iStartTime, iEndTime);
+
+ test.Printf(_L("Set the repeat definition \n"));
+ TCalRRule repeat;
+ repeat.SetType(TCalRRule::EDaily);
+ repeat.SetDtStart(iStartTime);
+ repeat.SetInterval(1);
+ repeat.SetCount(10);
+ entry->SetRRuleL(repeat);
+ entries.AppendL(entry);
+ CleanupStack::Pop(entry);
+
+ // Store the entry
+ test.Printf(_L("Store the entry in the session"));
+ TInt entriesStored(0);
+ aEntryView.StoreL(entries, entriesStored);
+ test(entriesStored == 1);
+ entries.ResetAndDestroy();
+
+ //Fetch entry
+ test.Printf(_L("Fetch the entry and verify it \n"));
+
+ if(aSameEntry)
+ {
+ aEntryView.FetchL(KUid, entries);
+ }
+ else
+ {
+ aEntryView.FetchL(KUid1, entries);
+ }
+ test(entries.Count()==1);
+ entry = entries[0];
+
+ test.Printf(_L("Get the instance id \n"));
+ TCalInstanceId instanceId;
+ instanceId.iEntryLocalId = entry->LocalUidL();
+ instanceId.iCollectionId = aSession.CollectionIdL();
+ instanceId.iInstanceTime = iStartTime;
+
+ CleanupStack::PopAndDestroy(&entries);
+ return instanceId;
+ }
+
+void CTestMultipleCalendar::AddLargeNumberOfEntriesL(CCalEntryView& aEntryView)
+ {
+ RPointerArray<CCalEntry> entries;
+ CleanupResetAndDestroyPushL(entries);
+
+ // create an appt
+ test.Printf(_L("Create an appointment \n"));
+
+ CCalEntry* entry;
+ TBuf8<64> uid;
+
+ HBufC8* guid;
+ for(TInt k = 0; k < 50; k++)
+ {
+ uid.Copy(KUid());
+ uid.AppendNum(k);
+ guid = uid.AllocLC();
+ entry = iTestLib->CreateCalEntryL(CCalEntry::EAppt, guid);
+ CleanupStack::Pop(guid);
+ CleanupStack::PushL(entry);
+
+ test.Printf(_L("Set the start and end time for the entry \n"));
+ entry->SetStartAndEndTimeL(iStartTime, iEndTime);
+
+ test.Printf(_L("Set the repeat definition \n"));
+ TCalRRule repeat;
+ repeat.SetType(TCalRRule::EDaily);
+ repeat.SetDtStart(iStartTime);
+ repeat.SetInterval(1);
+ repeat.SetCount(10);
+ entry->SetRRuleL(repeat);
+ entries.AppendL(entry);
+ CleanupStack::Pop(entry);
+
+ // Store the entry
+ test.Printf(_L("Store the entry in the session"));
+ TInt entriesStored(0);
+ aEntryView.StoreL(entries, entriesStored);
+ test(entriesStored == 1);
+ entries.ResetAndDestroy();
+ }
+ CleanupStack::PopAndDestroy(&entries);
+ }
+
+
+void CTestMultipleCalendar::Progress(TInt aPercentageCompleted)
+ {
+ iProgress++;
+ test(aPercentageCompleted >= 0);
+ test(aPercentageCompleted <=100);
+ test.Printf(_L("MCalProgressCallBack::Progress is %d complete\n"), aPercentageCompleted);
+ }
+
+void CTestMultipleCalendar::Completed(TInt aError)
+ {
+ test(aError == KErrNone);
+ test.Printf(_L("MCalProgressCallBack::Completed\n") );
+ CActiveScheduler::Stop();
+ }
+
+TBool CTestMultipleCalendar::NotifyProgress()
+ {
+ return ETrue;
+ }
+
+void CTestMultipleCalendar::CreateSecondSessionL()
+ {
+ test.Printf(_L("Create and open the second calendar file \n"));
+ iSecondSession = CCalSession::NewL(iTestLib->GetSession());
+ iSecondSession->CreateCalFileL(KPersonalCalendar);
+ iSecondSession->OpenL(KPersonalCalendar);
+ }
+
+void CTestMultipleCalendar::DeleteSecondCalendarFileL()
+ {
+ test.Printf(_L("Delete the calendar file"));
+
+ if(!iSecondSession)
+ {
+ iSecondSession = CCalSession::NewL(iTestLib->GetSession());
+ }
+ TRAPD(err, iSecondSession->DeleteCalFileL(KPersonalCalendar));
+ test(err == KErrNone || err == KErrNotFound);
+ }
+
+void CTestMultipleCalendar::ClearStoredDataL()
+ {
+ // Clear data
+ DeleteSecondCalendarFileL();
+ delete iSecondSession;
+ iSecondSession = NULL;
+ iTestLib->ReplaceFileL(KWorkCalendar);
+ iTestLib->OpenFileL(KWorkCalendar);
+ }
+
+void CTestMultipleCalendar::CreateAndTestInstanceIteratorL(CCalInstanceView& aInstanceView, TInt aExpectedCount)
+ {
+ test.Printf(_L("Create the instance iterator to iterate through all the instances \n"));
+
+ RPointerArray<CCalInstance> instances;
+ CleanupResetAndDestroyPushL(instances);
+
+ TCalTime start;
+ start.SetTimeUtcL(TCalTime::MinTime());
+ TCalTime end;
+ end.SetTimeUtcL(TCalTime::MaxTime());
+ CalCommon::TCalTimeRange timeRange(start, end);
+ aInstanceView.FindInstanceL(instances, CalCommon::EIncludeAll, timeRange);
+ test(instances.Count() == aExpectedCount);
+ instances.ResetAndDestroy();
+
+ // Instance iterator
+ CCalFindInstanceSettings* findSetting = CCalFindInstanceSettings::NewL(CalCommon::EIncludeAll, timeRange);
+ CleanupStack::PushL(findSetting);
+ CCalInstanceIterator* iterator = aInstanceView.FindInstanceL(*findSetting);
+ CleanupStack::PopAndDestroy(findSetting);
+ CleanupStack::PushL(iterator);
+
+ test.Printf(_L("Created iterator, now check the previous and next instances \n"));
+ TInt count = CheckIteratorL(*iterator, instances);
+ test(count == aExpectedCount);
+
+ test.Printf(_L("Finished iterating \n"));
+ test.Printf(_L("Deleting the instances \n"));
+ CleanupStack::PopAndDestroy(2, &instances); //instances, iterator
+ }
+
+TInt CTestMultipleCalendar::CheckIteratorL(CCalInstanceIterator& aIterator, RPointerArray<CCalInstance>& aInstances)
+ {
+ test.Printf(_L("Iterate through the instances and verify the start and end time"));
+
+ TTime previousInstanceTime = Time::NullTTime();
+ TInt count = 0;
+ while(CCalInstance* nextInstance = aIterator.NextL())
+ {
+ CleanupStack::PushL(nextInstance);
+
+ if(count > 0)
+ {
+ CCalInstance* preInstance = aIterator.PreviousL();
+ CleanupStack::PushL(preInstance);
+ test(preInstance!=NULL);
+ test(nextInstance->Time().TimeLocalL() >= preInstance->Time().TimeLocalL());
+ CleanupStack::PopAndDestroy(preInstance);
+
+ CleanupStack::PopAndDestroy(nextInstance);
+ nextInstance = aIterator.NextL();
+ CleanupStack::PushL(nextInstance);
+ }
+
+ test(nextInstance->Time().TimeLocalL() >= previousInstanceTime);
+ previousInstanceTime = nextInstance->Time().TimeLocalL();
+ aInstances.AppendL(nextInstance);
+ CleanupStack::Pop(nextInstance);
+ ++count;
+
+ test.Printf(_L("Instance count = %d"), count);
+ }
+ return count;
+ }
+
+void CTestMultipleCalendar::CheckInstanceViewL(CCalInstanceView& aInstanceView, TInt aNumInstance)
+ {
+ test.Printf(_L("Find the instances and verify the count \n"));
+
+ RPointerArray<CCalInstance> calInstances;
+ CleanupResetAndDestroyPushL(calInstances);
+
+ TCalTime startCalTime;
+ startCalTime.SetTimeUtcL(TCalTime::MinTime());
+ TCalTime endCalTime;
+ endCalTime.SetTimeUtcL(TCalTime::MaxTime());
+
+ CalCommon::TCalTimeRange timeRange(startCalTime, endCalTime);
+ aInstanceView.FindInstanceL(calInstances, CalCommon::EIncludeAll, timeRange);
+ test(calInstances.Count() == aNumInstance);
+ CleanupStack::PopAndDestroy(&calInstances);
+ }
+
+void CTestMultipleCalendar::CheckInstanceDetailsL(CCalInstance* aInstance, TCalInstanceId aInstanceId)
+ {
+ test.Printf(_L("test the instance time"));
+ test(aInstance->Time().TimeLocalL() == iStartTime.TimeLocalL());
+
+ test.Printf(_L("test the entry start and end times"));
+ test(aInstance->Entry().StartTimeL().TimeLocalL() == iStartTime.TimeLocalL());
+ test(aInstance->Entry().EndTimeL().TimeLocalL() == iEndTime.TimeLocalL());
+
+ test.Printf(_L("test short file id"));
+ test(aInstance->InstanceIdL().iCollectionId == aInstanceId.iCollectionId);
+ }
+
+TBool CTestMultipleCalendar::CheckInstanceIdL(TCalInstanceId aId1, TCalInstanceId aId2)
+ {
+ TBool aReturn = ETrue;
+ if(aId1.iEntryLocalId != aId2.iEntryLocalId)
+ {
+ aReturn = EFalse;
+ }
+ if(aId1.iInstanceTime.TimeMode() != aId2.iInstanceTime.TimeMode())
+ {
+ aReturn = EFalse;
+ }
+ if(aId1.iInstanceTime.TimeLocalL() != aId2.iInstanceTime.TimeLocalL())
+ {
+ aReturn = EFalse;
+ }
+ if(aId1.iCollectionId != aId2.iCollectionId)
+ {
+ aReturn = EFalse;
+ }
+ return aReturn;
+ }
+
+/*
+@SYMTestCaseID PIM-TCAL-MULTIPLE-FILES-0001
+@SYMPreq PREQ2554
+@SYMTestCaseDesc Make sure a session is closed when the last CCalSession referencing it is closed.
+@SYMTestPriority 1
+@SYMTestType CIT
+@SYMTestStatus Implemented
+@SYMTestActions 1. Open a CCalSession object
+ 2. Open a second CCalSession object, sharing the connection from the first
+ 3. Destroy both CCalSession objects
+@SYMTestExpectedResults There should be no memory leaks and the calendar server process should close
+ after destroying both CCalSession objects.
+**/
+
+void CTestMultipleCalendar::TestEntryViewAndFileConsistencyL(TBool aAddingSameEntry)
+ {
+ iTestLib->ReplaceFileL(KWorkCalendar);
+ iTestLib->OpenFileL(KWorkCalendar);
+ // Clear the previously stored files
+ ClearStoredDataL();
+
+ // Create the second session
+ CreateSecondSessionL();
+ CCalEntryView* secondView =CCalEntryView::NewL(*iSecondSession);
+ CleanupStack::PushL(secondView);
+
+ test.Printf(_L("Add one entry in each file \n"));
+ if(aAddingSameEntry)
+ {
+ // Add an entry to the first calendar file
+ AddAndCheckEntryL(iTestLib->SynCGetEntryViewL(), iTestLib->GetSession());
+ // Add an entry to the second calendar file
+ AddAndCheckEntryL(*secondView, *iSecondSession);
+ }
+ else
+ {
+ // Add an entry to the first calendar file
+ AddAndCheckEntryL(iTestLib->SynCGetEntryViewL(), iTestLib->GetSession());
+ // Add an entry to the second calendar file
+ AddAndCheckEntryL(*secondView, *iSecondSession, EFalse);
+ }
+
+ CleanupStack::PopAndDestroy(secondView);
+
+ test.Printf(_L("Server is shuting down \n") );
+ iTestLib->CloseAgendaServer();// Should shut the server
+ delete iSecondSession;
+ iSecondSession = NULL;
+
+ test.Printf(_L("Open the two files again to check for file consistency \n"));
+ // Open the two files and get the entries - check for file consistency
+ iTestLib->OpenFileL(KWorkCalendar);
+ iSecondSession = CCalSession::NewL(iTestLib->GetSession());
+ iSecondSession->OpenL(KPersonalCalendar);
+ secondView =CCalEntryView::NewL(*iSecondSession);
+ CleanupStack::PushL(secondView);
+ RPointerArray<CCalEntry> entries;
+ CleanupResetAndDestroyPushL(entries);
+ if(aAddingSameEntry)
+ {
+ secondView->FetchL(KUid, entries);
+ }
+ else
+ {
+ secondView->FetchL(KUid1, entries);
+ }
+ test(entries.Count()==1);
+ iTestLib->SynCGetEntryViewL().FetchL(KUid, entries);
+ test(entries.Count()==2);
+
+ // Compare the two entries
+ if(aAddingSameEntry)
+ {
+ test(entries[0]->CompareL(*entries[1]));
+ }
+ else
+ {
+ test(!entries[0]->CompareL(*entries[1]));
+ }
+
+ CleanupStack::PopAndDestroy(&entries);
+ CleanupStack::PopAndDestroy(secondView);
+
+ test.Printf(_L("Server is shuting down \n") );
+ iTestLib->CloseAgendaServer(); // Should shut the server
+ iSecondSession->DeleteCalFileL(KPersonalCalendar);
+ delete iSecondSession;
+ iSecondSession = NULL;
+ iTestLib->OpenFileL(KWorkCalendar);
+ }
+
+/**
+@SYMTestCaseID PIM-TCAL-MULTIPLE-FILES-0002
+@SYMPreq PREQ2554
+@SYMTestCaseDesc Make sure we can find instances in different calendar collections from one instance view.
+@SYMTestPriority 1
+@SYMTestType CIT
+@SYMTestStatus Implemented
+@SYMTestActions 1. Store a single entry in one file
+ 2. Store a single entry in a second file
+ 3. Open an instance view on both files
+ 4. Fetch all instance in both files
+ 5. Make sure we get the two expected instance
+@SYMTestExpectedResults We should get the two instances that we were expecting
+*/
+
+void CTestMultipleCalendar::TestInstanceViewL()
+ {
+ // Clear the previously stored files
+ ClearStoredDataL();
+
+ // Create the second session
+ CreateSecondSessionL();
+ CCalEntryView* secondView =CCalEntryView::NewL(*iSecondSession);
+ CleanupStack::PushL(secondView);
+
+ test.Printf(_L("Add one entry in each file \n"));
+ // Add an entry to the first calendar file
+ AddLargeNumberOfEntriesL(iTestLib->SynCGetEntryViewL());
+ // Add an entry to the second calendar file
+ AddLargeNumberOfEntriesL(*secondView);
+ CleanupStack::PopAndDestroy(secondView);
+
+ test.Printf(_L("Server is shuting down \n") );
+ iTestLib->CloseAgendaServer();// Should shut the server
+ delete iSecondSession;
+ iSecondSession = NULL;
+
+ test.Printf(_L("Open the calendar files \n"));
+ iTestLib->OpenFileL(KWorkCalendar);
+ iSecondSession = CCalSession::NewL(iTestLib->GetSession());
+ iSecondSession->OpenL(KPersonalCalendar);
+
+ // Get instances from two files. - instances from different files.
+ RPointerArray<CCalSession> sessions;
+ CleanupClosePushL(sessions);
+ sessions.AppendL(&iTestLib->GetSession());
+ sessions.AppendL(iSecondSession);
+
+ // Deleting the file so that index is build and progress is tracked
+ iTestLib->DeleteFileL(KWorkCalendarIndexFile, EFalse);
+
+ CCalInstanceView* instanceView = CCalInstanceView::NewL(sessions, *this);
+ CleanupStack::PushL(instanceView);
+ CActiveScheduler::Start();
+ test(iProgress > 0);
+ CreateAndTestInstanceIteratorL(*instanceView, 1000);
+
+ // Cleanup
+ CleanupStack::PopAndDestroy(instanceView);
+ CleanupStack::PopAndDestroy(&sessions);
+ iSecondSession->DeleteCalFileL(KPersonalCalendar);
+ delete iSecondSession;
+ iSecondSession = NULL;
+ }
+
+/*
+@SYMTestCaseID PIM-TCAL-MULTIPLE-FILES-0003
+@SYMPreq Preq2554
+@SYMTestCaseDesc Make sure we can update/delete in different calendar collections.
+@SYMTestPriority 1
+@SYMTestType CIT
+@SYMTestStatus Implemented
+@SYMTestActions 1. Store a single entry in one file
+ 2. Store a single entry in a second file
+ 3. Open entry views and update an entry
+ 4. Delete entry and check the entry ids modified
+ 5. Make sure we get the expected result
+@SYMTestExpectedResults We should get the correct number of modified entries
+**/
+
+void CTestMultipleCalendar::TestUpdateDeleteFunctionalityL()
+ {
+ test.Next(_L("Test the update/delete functionality "));
+
+ // Clear the previously stored files
+ ClearStoredDataL();
+
+ CreateSecondSessionL();
+ CCalEntryView* secondView =CCalEntryView::NewL(*iSecondSession);
+ CleanupStack::PushL(secondView);
+
+ // Get instances from two different files
+ RPointerArray<CCalSession> sessions;
+ CleanupClosePushL(sessions);
+ sessions.AppendL(&(iTestLib->GetSession()));
+ sessions.AppendL(iSecondSession);
+ CCalInstanceView* instanceView = CCalInstanceView::NewL(sessions);
+ CleanupStack::PushL(instanceView);
+
+ test.Printf(_L("Add entries to both the files \n"));
+ TCalInstanceId instanceId1 = AddAndCheckEntryL(iTestLib->SynCGetEntryViewL(), iTestLib->GetSession());
+ TCalInstanceId instanceId2 = AddAndCheckEntryL(*secondView, *iSecondSession);
+ TDateTime startTime(2003, EMarch, 27, 1, 0, 0, 0);
+ TCalTime startCalTime;
+ startCalTime.SetTimeLocalL(startTime);
+
+ test.Printf(_L("Fetch the entry \n"));
+
+ RPointerArray<CCalEntry> entries;
+ CleanupResetAndDestroyPushL(entries);
+ secondView->FetchL(KUid, entries);
+ test(entries.Count()==1);
+ iTestLib->SynCGetEntryViewL().FetchL(KUid, entries);
+ test(entries.Count()==2);
+
+ TDateTime startTimeNew(2004, EMarch, 27, 1, 0, 0, 0);
+ startCalTime.SetTimeLocalL(startTimeNew);
+ entries[0]->SetStartAndEndTimeL(startCalTime, startCalTime);
+ entries[1]->SetStartAndEndTimeL(startCalTime, startCalTime);
+
+ test.Printf(_L("Update the entry \n"));
+ TInt numEntries;
+
+ secondView->UpdateL(entries, numEntries);
+ test(numEntries == 2); // Only one entry is updated
+ iTestLib->SynCGetEntryViewL().UpdateL(entries, numEntries);
+ test(numEntries == 2); // Only one entry is updated
+
+ //Delete the entry
+ RArray<TCalLocalUid> entriesLocalUids;
+ CleanupClosePushL(entriesLocalUids);
+ entriesLocalUids.AppendL(instanceId1.iEntryLocalId);
+
+ test.Printf(_L("Delete the entries \n"));
+ TCalTime calTime;
+ TTime time;
+ time.HomeTime();
+ calTime.SetTimeLocalL(time);
+ TInt success;
+ iTestLib->SynCGetEntryViewL().DeleteL(entriesLocalUids, success);
+ test(success == 1);
+ entriesLocalUids.Reset();
+
+ iTestLib->SynCGetEntryViewL().GetIdsModifiedSinceDateL(calTime, entriesLocalUids);
+ test.Printf(_L("Number of returned entries from GetIdsModifiedSinceDateL = %d\n"), entriesLocalUids.Count());
+ test(entriesLocalUids.Count() == 0);
+ entriesLocalUids.Reset();
+
+ entriesLocalUids.AppendL(instanceId2.iEntryLocalId);
+ secondView->DeleteL(entriesLocalUids, success);
+ test(success == 1);
+ secondView->GetIdsModifiedSinceDateL(calTime, entriesLocalUids);
+ test.Printf(_L("Number of returned entries from GetIdsModifiedSinceDateL = %d\n"), entriesLocalUids.Count());
+ test(entriesLocalUids.Count() == 1);
+
+ //Test instance view
+ CheckInstanceViewL(*instanceView, 0);
+
+ CleanupStack::PopAndDestroy(&entriesLocalUids);
+ CleanupStack::PopAndDestroy(&entries);
+ CleanupStack::PopAndDestroy(instanceView);
+ CleanupStack::PopAndDestroy(&sessions);
+ CleanupStack::PopAndDestroy(secondView);
+ iSecondSession->DeleteCalFileL(KPersonalCalendar);
+ delete iSecondSession;
+ iSecondSession = NULL;
+ }
+
+/*
+@SYMTestCaseID PIM-TCAL-MULTIPLE-FILES-0004
+@SYMPreq Preq2554
+@SYMTestCaseDesc Make sure we can find instances in different calendar collections using the same instance view.
+@SYMTestPriority 1
+@SYMTestType CIT
+@SYMTestStatus Implemented
+@SYMTestActions 1. Store a single entry in one file
+ 2. Store a single entry in a second file
+ 3. Open an instance view on both files
+ 4. Fetch instance from both files
+ 5. Make sure we get the two expected instance
+
+@SYMTestExpectedResults We should get the two instances that we were expecting
+**/
+
+void CTestMultipleCalendar::TestFindInstanceL(TBool aSessionToFindInstanceFrom, TInt aExpectedValue)
+ {
+ test.Next(_L("Test finding instances using instance id for each session \n"));
+
+ // Clear the previously stored files
+ ClearStoredDataL();
+
+ CreateSecondSessionL();
+ CCalEntryView* secondView =CCalEntryView::NewL(*iSecondSession);
+ CleanupStack::PushL(secondView);
+ //Observer for work calendar
+ iObserverForWorkCalendar = CTestFileObservers::NewL(KWorkCalendar);
+ test.Printf(_L("Add entries to both the files \n"));
+ TCalInstanceId instanceIdForFirstSession = AddAndCheckEntryL(iTestLib->SynCGetEntryViewL(), iTestLib->GetSession());
+ CActiveScheduler::Start();
+ //Observer for personal calendar
+ iObserverForPersonalCalendar = CTestFileObservers::NewL(KPersonalCalendar);
+ TCalInstanceId instanceIdForSecondSession = AddAndCheckEntryL(*secondView, *iSecondSession);
+ CActiveScheduler::Start();
+
+ // Get instances from two different files
+ RPointerArray<CCalSession> sessions;
+ CleanupClosePushL(sessions);
+ sessions.AppendL(&iTestLib->GetSession());
+ sessions.AppendL(iSecondSession);
+ CCalInstanceView* instanceView = CCalInstanceView::NewL(sessions);
+ CleanupStack::PushL(instanceView);
+
+ RPointerArray<CCalInstance> instances;
+ CleanupResetAndDestroyPushL(instances);
+
+ TCalTime start;
+ start.SetTimeLocalL(TCalTime::MinTime());
+ TCalTime end;
+ end.SetTimeLocalL(TCalTime::MaxTime());
+ CalCommon::TCalTimeRange timeRange(start, end);
+ instanceView->FindInstanceL(instances, CalCommon::EIncludeAll, timeRange);
+ test(instances.Count()==20);
+ instances.ResetAndDestroy();
+
+ test.Printf(_L("Create instance iterator \n"));
+ // Instance iterator
+ CCalFindInstanceSettings* findSetting = CCalFindInstanceSettings::NewL(CalCommon::EIncludeAll, timeRange);
+ CleanupStack::PushL(findSetting);
+ CCalInstanceIterator* iterator;
+ if(aSessionToFindInstanceFrom)
+ {
+ iterator = instanceView->FindInstanceL(*findSetting, instanceIdForSecondSession);
+ }
+ else
+ {
+ iterator = instanceView->FindInstanceL(*findSetting, instanceIdForFirstSession);
+ }
+ CleanupStack::PopAndDestroy(findSetting);
+ CleanupStack::PushL(iterator);
+
+ test.Printf(_L("Created iterator \n"));
+ TInt count = CheckIteratorL(*iterator, instances);
+ test(count == aExpectedValue);
+
+ test.Printf(_L("Finished iterating \n"));
+ test.Printf(_L("Deleting the instances \n"));
+ instances.ResetAndDestroy();
+ CleanupStack::PopAndDestroy(2, &instances);//instances, iterator
+ CleanupStack::PopAndDestroy(instanceView);
+ CleanupStack::PopAndDestroy(&sessions);
+ CleanupStack::PopAndDestroy(secondView);
+ delete iObserverForWorkCalendar;
+ iObserverForWorkCalendar = NULL;
+ delete iObserverForPersonalCalendar;
+ iObserverForPersonalCalendar = NULL;
+ iSecondSession->DeleteCalFileL(KPersonalCalendar);
+ delete iSecondSession;
+ iSecondSession = NULL;
+ }
+
+/*
+@SYMTestCaseID PIM-TCAL-MULTIPLE-FILES-0005
+@SYMPreq Preq2554
+@SYMTestCaseDesc Make sure we can find instances in different calendar collections using TCalInstanceId.
+@SYMTestPriority 1
+@SYMTestType CIT
+@SYMTestStatus Implemented
+@SYMTestActions 1. Store a single entry in one file
+ 2. Store a single entry in a second file
+ 3. Open an instance view on both files
+ 4. Fetch instance from both files using their respective TCalInstanceId
+ 5. Make sure we get the two expected instance
+
+@SYMTestExpectedResults We should get the two instances that we were expecting
+**/
+
+void CTestMultipleCalendar::TestFindInstanceWithInstanceIdL()
+ {
+ test.Next(_L("Test find instance with instance id \n"));
+
+ // Clear the previously stored files
+ ClearStoredDataL();
+
+ CreateSecondSessionL();
+ CCalEntryView* secondView =CCalEntryView::NewL(*iSecondSession);
+ CleanupStack::PushL(secondView);
+
+ test.Printf(_L("Add two entries to the calendar files \n"));
+ TCalInstanceId instanceIdForFirstSession = AddAndCheckEntryL(iTestLib->SynCGetEntryViewL(), iTestLib->GetSession());
+ TCalInstanceId instanceIdForSecondSession = AddAndCheckEntryL(*secondView, *iSecondSession);
+
+ RPointerArray<CCalSession> sessions;
+ CleanupClosePushL(sessions);
+ sessions.AppendL(&iTestLib->GetSession());
+ sessions.AppendL(iSecondSession);
+
+ CCalInstanceView* instanceView = CCalInstanceView::NewL(sessions);
+ CleanupStack::PushL(instanceView);
+
+ CCalInstance* instance = instanceView->FindInstanceL(instanceIdForFirstSession);
+ CleanupStack::PushL(instance);
+ CheckInstanceDetailsL(instance, instanceIdForFirstSession);
+ CleanupStack::PopAndDestroy(instance);
+ instance = instanceView->FindInstanceL(instanceIdForSecondSession);
+ CleanupStack::PushL(instance);
+ CheckInstanceDetailsL(instance, instanceIdForSecondSession);
+
+ CleanupStack::PopAndDestroy(instance);
+ CleanupStack::PopAndDestroy(instanceView);
+ CleanupStack::PopAndDestroy(&sessions);
+ CleanupStack::PopAndDestroy(secondView);
+ iSecondSession->DeleteCalFileL(KPersonalCalendar);
+ delete iSecondSession;
+ iSecondSession = NULL;
+ }
+
+/*
+@SYMTestCaseID PIM-TCAL-MULTIPLE-FILES-0006
+@SYMPreq Preq2554
+@SYMTestCaseDesc Make sure we can find TCalCollectionId and TCalInstanceId for the files stored.
+@SYMTestPriority 1
+@SYMTestType CIT
+@SYMTestStatus Implemented
+@SYMTestActions 1. Create second session from first one
+ 2. Get the TCalCollectionId for both session
+ 3. Store a single entry in one file
+ 4. Store a single entry in a second file
+ 5. Get TCalInstanceId for both files
+ 6. Make sure we get the expected results
+
+@SYMTestExpectedResults We should get the two TCalCollectionId and TCalInstanceId that we were expecting
+**/
+
+void CTestMultipleCalendar::TestShortFileIdL()
+ {
+ // Clear the previously stored files
+ ClearStoredDataL();
+
+ CreateSecondSessionL();
+ CCalEntryView* secondView =CCalEntryView::NewL(*iSecondSession);
+ CleanupStack::PushL(secondView);
+
+ TCalCollectionId firstSessionFileId = iTestLib->GetSession().CollectionIdL();
+ test(firstSessionFileId == KShortFileId1);
+ TCalCollectionId secondSessionFileId = iSecondSession->CollectionIdL();
+ test(secondSessionFileId == KShortFileId2);
+
+ TCalInstanceId instanceIdForFirstSession = AddAndCheckEntryL(iTestLib->SynCGetEntryViewL(), iTestLib->GetSession());
+ TCalInstanceId instanceIdForSecondSession = AddAndCheckEntryL(*secondView, *iSecondSession);
+
+ RPointerArray<CCalEntry> entries;
+ CleanupResetAndDestroyPushL(entries);
+ secondView->FetchL(KUid, entries);
+ test(entries.Count()==1);
+ iTestLib->SynCGetEntryViewL().FetchL(KUid, entries);
+ test(entries.Count()==2);
+ //Compare two entries - they should be the same
+ test(entries[0]->CompareL(*entries[1]));
+ CleanupStack::PopAndDestroy(&entries);
+
+ RPointerArray<CCalSession> sessions;
+ CleanupClosePushL(sessions);
+ CCalSession& firstsession = iTestLib->GetSession();
+ sessions.AppendL(&firstsession);
+ sessions.AppendL(iSecondSession);
+ CCalInstanceView* instanceView = CCalInstanceView::NewL(sessions);
+ CleanupStack::PushL(instanceView);
+
+ RPointerArray<CCalInstance> instances;
+ CleanupResetAndDestroyPushL(instances);
+
+ TCalTime start;
+ start.SetTimeUtcL(TCalTime::MinTime());
+ TCalTime end;
+ end.SetTimeUtcL(TCalTime::MaxTime());
+ CalCommon::TCalTimeRange timeRange(start, end);
+ instanceView->FindInstanceL(instances, CalCommon::EIncludeAll, timeRange);
+ TInt count = instances.Count();
+ test(count == 20);
+ TCalInstanceId calId1 = instances[0]->InstanceIdL();
+ test(CheckInstanceIdL(calId1, instanceIdForFirstSession));
+ TCalInstanceId calId2 = instances[1]->InstanceIdL();
+ test(CheckInstanceIdL(calId2, instanceIdForSecondSession));
+ CleanupStack::PopAndDestroy(&instances);
+ CleanupStack::PopAndDestroy(instanceView);
+ CleanupStack::PopAndDestroy(&sessions);
+ CleanupStack::PopAndDestroy(secondView);
+ iSecondSession->DeleteCalFileL(KPersonalCalendar);
+ delete iSecondSession;
+ iSecondSession = NULL;
+ }
+
+/*
+@SYMTestCaseID PIM-TCAL-MULTIPLE-FILES-0007
+@SYMPreq Preq2554
+@SYMTestCaseDesc Make sure we can switch instance views
+@SYMTestPriority 1
+@SYMTestType CIT
+@SYMTestStatus Implemented
+@SYMTestActions 1. Create and open a file with each session and get the collection id
+ 2. Store a single entry in one file
+ 3. Store a single entry in a second file
+ 4. Open an instance view on both files
+ 5. Fetch instance from both files
+ 6. Destroy the first session
+ 7. Create another session, create and open a calendar file
+ 8. Fetch instances from second and third file
+ 9. Make sure we get the expected results
+
+@SYMTestExpectedResults We should get the instances that we were expecting
+**/
+
+void CTestMultipleCalendar::TestSwitchInstanceViewsL()
+ {
+ // Clear the previously stored files
+ ClearStoredDataL();
+
+ CCalSession& session1 = iTestLib->GetSession();
+ TCalCollectionId shortFileId1 = session1.CollectionIdL();
+ test(shortFileId1 != 0);
+ CCalSession* session2 = CCalSession::NewL(session1);
+ CleanupStack::PushL(session2);
+ session2->CreateCalFileL(KPersonalCalendar);
+ session2->OpenL(KPersonalCalendar);
+ TCalCollectionId shortFileId2 = session2->CollectionIdL();
+ test(shortFileId2 != 0);
+
+ CCalEntryView* secondView = CCalEntryView::NewL(*session2);
+ CleanupStack::PushL(secondView);
+
+ TCalInstanceId instanceId1 = AddAndCheckEntryL(iTestLib->SynCGetEntryViewL(), iTestLib->GetSession());
+ TCalInstanceId instanceId2 = AddAndCheckEntryL(*secondView, *session2);
+
+ RPointerArray<CCalSession> calSessions;
+ CleanupClosePushL(calSessions);
+ calSessions.AppendL(&session1);
+ calSessions.AppendL(session2);
+
+ RPointerArray<CCalInstance> instances;
+ CleanupResetAndDestroyPushL(instances);
+
+ CCalInstanceView* instanceView = CCalInstanceView::NewL(calSessions);
+ CleanupStack::PushL(instanceView);
+
+ TCalTime start;
+ start.SetTimeUtcL(TCalTime::MinTime());
+ TCalTime end;
+ end.SetTimeUtcL(TCalTime::MaxTime());
+ CalCommon::TCalTimeRange timeRange(start, end);
+ instanceView->FindInstanceL(instances, CalCommon::EIncludeAll, timeRange);
+ test(instances.Count() == 20);
+
+ CleanupStack::PopAndDestroy(instanceView);
+ instances.ResetAndDestroy();
+ calSessions.Reset();
+ delete iTestLib;
+ iTestLib = NULL;
+
+ CCalSession* session3 = CCalSession::NewL(*session2);
+ CleanupStack::PushL(session3);
+ session3->CreateCalFileL(KSportsCalendar);
+ session3->OpenL(KSportsCalendar);
+
+ calSessions.AppendL(session2);
+ calSessions.AppendL(session3);
+
+ instanceView = CCalInstanceView::NewL(calSessions);
+ CleanupStack::PushL(instanceView);
+
+ instanceView->FindInstanceL(instances, CalCommon::EIncludeAll, timeRange);//It will only return instances from file2 and file3
+ test(instances.Count() == 10);
+
+ CleanupStack::PopAndDestroy(instanceView);
+ session3->DeleteCalFileL(KSportsCalendar);
+ CleanupStack::PopAndDestroy(session3);
+ CleanupStack::PopAndDestroy(&instances);
+ CleanupStack::PopAndDestroy(&calSessions);
+ CleanupStack::PopAndDestroy(secondView);
+ session2->DeleteCalFileL(KPersonalCalendar);
+ CleanupStack::PopAndDestroy(session2);
+
+ iTestLib = CCalTestLibrary::NewL();
+ iTestLib->ReplaceFileL(KWorkCalendar);
+ iTestLib->OpenFileL(KWorkCalendar);
+ }
+
+/*
+@SYMTestCaseID PIM-TCAL-MULTIPLE-FILES-0008
+@SYMPreq Preq2554
+@SYMTestCaseDesc Make sure we cannot open same file by two sessions.
+@SYMTestPriority 1
+@SYMTestType CIT
+@SYMTestStatus Implemented
+@SYMTestActions 1. Create two sessions
+ 2. Open KWorkCalendar with the first session
+ 3. Open KWorkCalendar with the second session
+ 4. Test the return code for OpenL()
+
+@SYMTestExpectedResults We should get KErrArgument while opening KWorkCalendar using second session
+**/
+
+void CTestMultipleCalendar::TestNegativeForSecondSessionL()
+ {
+ test.Printf(_L("Test that the second session cannot open the file already opened by the first session"));
+
+ // Clear the previously stored files
+ ClearStoredDataL();
+ delete iSecondSession;
+ iSecondSession = NULL;
+
+ iSecondSession = CCalSession::NewL(iTestLib->GetSession());
+ // KCalendarFilename1 refers to the file opened by the first session
+ TRAPD(err, iSecondSession->OpenL(KWorkCalendar));
+ // Test that the error returned is KErrArgument
+ test.Printf(_L("Test whether opening the file results in KErrArgument"));
+ test(err == KErrArgument);
+
+ delete iSecondSession;
+ iSecondSession = NULL;
+ }
+
+/*
+@SYMTestCaseID PIM-TCAL-MULTIPLE-FILES-0009
+@SYMPreq Preq2554
+@SYMTestCaseDesc Make sure TCalCollectionId overflows beyond KMaxTUint8.
+@SYMTestPriority 1
+@SYMTestType CIT
+@SYMTestStatus Implemented
+@SYMTestActions 1. Ensure there are two sessions with the server
+ 2. For a session, create and open calendar files
+ 3. Check the error code while opening the file
+
+@SYMTestExpectedResults We should get KErrOverflow after KMaxTUint8 files have been added
+**/
+
+void CTestMultipleCalendar::TestNegativeForCollectionIdL()
+ {
+ // Clear the previously stored files
+ ClearStoredDataL();
+
+ test.Printf(_L("Test whether short file id overflows beyond KMaxTUint8"));
+ TFileName* fileName;
+ iSecondSession = CCalSession::NewL(iTestLib->GetSession());
+
+ TInt err(0);
+ TInt j=0;
+ while(err == KErrNone)
+ {
+ fileName = new(ELeave) TFileName;
+ CleanupStack::PushL(fileName);
+ fileName->Format(KPersonalCalendar);
+ fileName->AppendNum(j+1);
+ iSecondSession->CreateCalFileL(*fileName);
+ TRAP(err, iSecondSession->OpenL(*fileName));
+ fileName->Format(KPersonalCalendar);
+ fileName->AppendNum(j);
+ if(j != 0)
+ {
+ iSecondSession->DeleteCalFileL(*fileName);
+ }
+ CleanupStack::PopAndDestroy(fileName);
+ ++j;
+ }
+
+ if(err != KErrNone)
+ {
+ test(err == KErrOverflow);
+ }
+
+ fileName = new(ELeave) TFileName;
+ CleanupStack::PushL(fileName);
+ fileName->Format(KPersonalCalendar);
+ fileName->AppendNum(KMaxTUint8);
+ iSecondSession->DeleteCalFileL(*fileName);
+ CleanupStack::PopAndDestroy(fileName);
+ }
+
+/* Test the defect fix DEF141396 "Attachments are not shown in the attachment list view after calendar name is c..."
+ Test action:
+ 1. Create Calendar file "Work_Calendar"
+ 2. Add and entry with file attachment
+ 3. Create another Calenda file "Personal_Calender"
+ 3. Fetch the attachment from "Work_Calendar" and Copied the entry
+ 4. Store the copied entry to "Personal_Calendar"
+ 5. Delete the Calendar file "Work_Calendar"
+ 6. Fetched the copied entry from "Personal_Calendar"
+ 7. Test that the attachment in copied entry has the expected attachment.
+*/
+void CTestMultipleCalendar::TestCopyEntryBetweenCalendarsL()
+ {
+ TInt success;
+ iTestLib->ReplaceFileL(KWorkCalendar);
+ iTestLib->OpenFileL(KWorkCalendar);
+ // Clear the previously stored files
+ ClearStoredDataL();
+ // Create the second session
+ CreateSecondSessionL();
+ CCalEntryView* personalView =CCalEntryView::NewL(*iSecondSession);
+ CleanupStack::PushL(personalView);
+ test.Printf(_L("Add one entry in each file \n"));
+ _LIT8(KBinaryData1, "zzzzzzzzzzzzzzzzzz");
+ test.Printf(_L("Store an entry with a binary data attachment\n"));
+ // set up attachment properties
+ HBufC8* data = KBinaryData1().AllocLC();
+ CCalAttachment* attachment = CCalAttachment::NewFileL(data);
+ CleanupStack::Pop(data);
+
+ RPointerArray<CCalEntry> entries;
+ CleanupResetAndDestroyPushL(entries);
+
+ // create an appt
+ test.Printf(_L("Create an appointment \n"));
+ HBufC8* guid;
+ CCalEntry* entry;
+ guid = KUid().AllocLC();
+ entry = iTestLib->CreateCalEntryL(CCalEntry::EAppt, guid);
+ CleanupStack::Pop(guid);
+ CleanupStack::PushL(entry);
+
+ test.Printf(_L("Set the start and end time for the entry \n"));
+ entry->SetStartAndEndTimeL(iStartTime, iEndTime);
+ entry->AddAttachmentL(*attachment);
+ test.Printf(_L("Set the repeat definition \n"));
+ entries.AppendL(entry);
+ CleanupStack::Pop(entry);
+ // Store the entry
+ test.Printf(_L("Store the entry in the session"));
+ TInt entriesStored(0);
+ iTestLib->SynCGetEntryViewL().StoreL(entries, entriesStored);
+ test(entriesStored == 1);
+ entries.ResetAndDestroy();
+
+ //Fetch entry
+ test.Printf(_L("Fetch the entry and verify it \n"));
+
+ iTestLib->SynCGetEntryViewL().FetchL(KUid, entries);
+ test(entries.Count()==1);
+ CCalAttachment* originalAttachment = entries[0]->AttachmentL(0);
+ test(originalAttachment->FileAttachment() != NULL);
+ _LIT8(KUid2,"AttachTest2");
+ HBufC8* guid2 = KUid2().AllocLC();
+ entry = iTestLib->CreateCalEntryL(CCalEntry::EAppt, guid2);
+ CleanupStack::Pop(guid2);
+ CleanupStack::PushL(entry);
+ entry->CopyFromL(*entries[0], CCalEntry::EDontCopyId);
+ entries.ResetAndDestroy();
+ entries.AppendL(entry);
+ CleanupStack::Pop(entry);
+ personalView->StoreL(entries, success);
+
+ entries.ResetAndDestroy();
+ iTestLib->DeleteFileL(KWorkCalendar,ETrue);
+ personalView->FetchL(KUid2, entries);
+ TInt count = entries.Count();
+ entries[0]->AttachmentL(0)->FileAttachment()->LoadBinaryDataL();
+ test(entries[0]->AttachmentL(0)->Value().Length() == KBinaryData1().Length());
+ CleanupStack::PopAndDestroy(&entries);
+
+ CCalSession& session = iTestLib->GetSession();
+ CCalAttachmentManager* attachmentManager = CCalAttachmentManager::NewL(*iSecondSession, *iTestLib);
+ CleanupStack::PushL(attachmentManager);
+ CActiveScheduler::Start();
+ CCalAttachmentIterator* attachments = attachmentManager->FetchAttachmentsL(CCalAttachmentManager::ESortBySizeLargestFirst);
+ CleanupStack::PushL(attachments);
+ test(attachments->Count() == 1);
+ CCalAttachment* att = attachments->NextL();
+ test(att != NULL);
+ CleanupStack::PushL(att);
+ att->FileAttachment()->LoadBinaryDataL();
+ test(att->Value().Length() == KBinaryData1().Length());
+
+ CleanupStack::PopAndDestroy(att);
+ CleanupStack::PopAndDestroy(attachments);
+ CleanupStack::PopAndDestroy(attachmentManager);
+ CleanupStack::PopAndDestroy(personalView);
+
+ iSecondSession->DeleteCalFileL(KPersonalCalendar);
+ delete iSecondSession;
+ iSecondSession = NULL;
+ iTestLib->ReplaceFileL(KWorkCalendar);
+ iTestLib->OpenFileL(KWorkCalendar);
+ }
+
+void CTestMultipleCalendar::RunAllTestsL()
+ {
+ // Test performing basic operations
+ test.Next(_L("Test creating instance view and fetch instances"));
+ TestInstanceViewL();
+
+ test.Next(_L("Test creating entry view and basic sync/async operations"));
+ TestEntryViewAndFileConsistencyL(ETrue);
+ TestEntryViewAndFileConsistencyL(EFalse);
+
+ test.Next(_L("Test update/delete functionality"));
+ TestUpdateDeleteFunctionalityL();
+
+ // New API for FindInstanceL() test
+ test.Next(_L("Test find instances using first session instance id"));
+ TestFindInstanceL(ETrue, 18);
+ test.Next(_L("Test find instances using second session instance id"));
+ TestFindInstanceL(EFalse, 19);
+ test.Next(_L("Test find instance with TCalInstanceId"));
+ TestFindInstanceWithInstanceIdL();
+
+ // Short file ID and instance ID test
+ test.Next(_L("Test short file id"));
+ TestShortFileIdL();
+
+ // Testing switching instance views
+ test.Next(_L("Test switching instance views"));
+ TestSwitchInstanceViewsL();
+
+ // Testing copying entry with file attachment between different Calendar files
+ test.Next(_L("Test copying entry with attachment file"));
+ TestCopyEntryBetweenCalendarsL();
+
+ // Negative tests
+ test.Next(_L("Negative test for second session"));
+ TestNegativeForSecondSessionL();
+ test.Next(_L("Negative test for collection id"));
+ TestNegativeForCollectionIdL();
+ }
+
+LOCAL_C void doMainL()
+ {
+ CTestMultipleCalendar* testManager = CTestMultipleCalendar::NewL();
+ TRAPD(ret, testManager->RunAllTestsL());
+ test(ret == KErrNone);
+ delete testManager;
+ }
+
+GLDEF_C TInt E32Main()
+ {
+ __UHEAP_MARK;
+ test.Start(KTestName);
+ test.Title();
+ CTrapCleanup* theCleanup = CTrapCleanup::New();
+ CActiveScheduler* scheduler = new CActiveScheduler;
+ CActiveScheduler::Install(scheduler);
+ TRAPD(ret, doMainL());
+ RDebug::Print(_L("DoMainL returned: %d"), ret);
+ delete scheduler;
+ test(ret == KErrNone);
+ delete theCleanup;
+ test.End();
+ test.Close();
+ __UHEAP_MARKEND;
+ return(KErrNone);
+ }
+