diff -r 000000000000 -r 2e3d3ce01487 commonappservices/alarmserver/Test/TBackupAlarms.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/commonappservices/alarmserver/Test/TBackupAlarms.cpp Tue Feb 02 10:12:00 2010 +0200 @@ -0,0 +1,2353 @@ +// Copyright (c) 1997-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 "ASTstAlarmTest.h" +#include "ASSrvDefs.h" + +#include +#include +#include + +#include +#include +// Type definitions +typedef CArrayFixFlat CPlayIntervalArray; + + +// Literal constants +_LIT(KAlarmServerTestBackupFile, "C:\\AlarmServer.bak"); +_LIT8(KSomeAlarmData, "This is some 8-bit data"); + +//Temp fix for wk37, main updates for wk40 +_LIT(KAlarmServerBackupFileFullPath, "C:\\private\\101F5027\\AlarmServer.ini"); + +static const TTimeIntervalMicroSeconds32 KTenSeconds = 10000000; + +#define KNewAlarmCycleStartOffsetMinutes {0,10,20,30,50,100,200,300,450,600,900,1200,1800,2400, 3000, 4000, 5000, 10000,KErrNotFound}; + +static RFs FsSession; +static conn::CSBEClient* BackupClient; +static TDriveList DriveList; + + +// +/* Try to give a fairly thorough test of the Alarm Server + * during Startup Internalize, backup and restore + */ + + +// +// building block test Helper functions +// + +static void Helper_StartBackupL() + { + // Use the Secure Backup Engine API to "start" a backup. Ultimate effect + // is to cause CASSrvAlarmQueue::StartAlarmStoreOperation() to be called. + // This happens indirectly through CASSrvAlarmStore::BackupBeginningL()/ + // BackupCompletedL()/RestoreBeginningL()/RestoreCompletedL() methods. + // These methods are implementations for MBackupRestoreNotificatioObserver + // which monitors changes in the P&S property conn::KUidBackupRestoreKey. + // This P&S property is changed by calling the Secure Backup Engine API + // below. + BackupClient->SetBURModeL(DriveList, conn::EBURBackupFull, conn::EBackupBase); + } + + +static void Helper_EndBackupL() + { + // Use the Secure Backup Engine API to "end" a backup. Ultimate effect + // is to cause CASSrvAlarmQueue::StartAlarmStoreOperation() to be called. + // This happens indirectly through CASSrvAlarmStore::BackupBeginningL()/ + // BackupCompletedL()/RestoreBeginningL()/RestoreCompletedL() methods. + // These methods are implementations for MBackupRestoreNotificatioObserver + // which monitors changes in the P&S property conn::KUidBackupRestoreKey. + // This P&S property is changed by calling the Secure Backup Engine API + // below. + BackupClient->SetBURModeL(DriveList, conn::EBURNormal, conn::ENoBackup); + + // allow Alarm Server observers to be notified + User::After(1000); + } + + +static void Helper_StartRestoreL() + { + // Use the Secure Backup Engine API to "start" a restore. Ultimate effect + // is to cause CASSrvAlarmQueue::StartAlarmStoreOperation() to be called. + // This happens indirectly through CASSrvAlarmStore::BackupBeginningL()/ + // BackupCompletedL()/RestoreBeginningL()/RestoreCompletedL() methods. + // These methods are implementations for MBackupRestoreNotificatioObserver + // which monitors changes in the P&S property conn::KUidBackupRestoreKey. + // This P&S property is changed by calling the Secure Backup Engine API + // below. + BackupClient->SetBURModeL(DriveList, conn::EBURRestoreFull, conn::EBackupBase); + + // allow Alarm Server observers to be notified + User::After(100000); + } + + +static void Helper_EndRestoreL(TBool aSuccess) + { + // Use the Secure Backup Engine API to "end" a restore. Ultimate effect + // is to cause CASSrvAlarmQueue::StartAlarmStoreOperation() to be called. + // This happens indirectly through CASSrvAlarmStore::BackupBeginningL()/ + // BackupCompletedL()/RestoreBeginningL()/RestoreCompletedL() methods. + // These methods are implementations for MBackupRestoreNotificatioObserver + // which monitors changes in the P&S property conn::KUidBackupRestoreKey. + // This P&S property is changed by calling the Secure Backup Engine API + // below. + if (aSuccess) + { + BackupClient->SetBURModeL(DriveList, conn::EBURNormal, conn::ENoBackup); + } + else + { + // starting a backup before a restore has completed. + BackupClient->SetBURModeL(DriveList, conn::EBURBackupFull, conn::EBackupBase); + } + + // allow Alarm Server observers to be notified + User::After(1000000); + } + + +static CDirectFileStore* Helper_StartRestoreAndOpenL() + { + Helper_StartRestoreL(); + + TheAlarmTest.Test().Printf(_L("- Open and Lock Exclusive AlarmServer.Ini file\r\n")); + // actually lock the file C:\System\Data\AlarmServer.ini - + CDirectFileStore* store = NULL; + for(TUint i=0; i < 10; i++) + { + TRAPD(err, store = CDirectFileStore::OpenL(FsSession, + KAlarmServerBackupFileFullPath, EFileRead | EFileShareExclusive)); + // success? + if (err == KErrNone) + break; + if (err != KErrInUse) + User::Leave(err); + // wait a little (10ms) & try again + User::After(10000); + } + + return store; + } + + +static CDirectFileStore* Helper_StartBackupAndOpenL() + { + Helper_StartBackupL(); + + TheAlarmTest.Test().Printf(_L("- Open and Lock Share Readers AlarmServer.Ini file\r\n")); + // actually lock the file C:\System\Data\AlarmServer.ini - + CDirectFileStore* store = NULL; + for(TUint i=0; i < 10; i++) + { + TRAPD(err, store = CDirectFileStore::OpenL(FsSession, + KAlarmServerBackupFileFullPath, EFileRead | EFileShareReadersOnly)); + // success? + if (err == KErrNone) + break; + if (err != KErrInUse) + User::Leave(err); + // wait a little (10ms) & try again + User::After(10000); + } + + return store; + } + + +// + +// +// Backup & Restore support functions + +/* + * Makes a Backup of the Alarm Server ini file: + * 1. Asks for Read Only lock for the AlarmServer.ini file + * 2. Copies AlarmServer.ini to c:\AlarmServer.bak + * 3. Hands back the file lock + */ +static void BackupAlarmServerIniFileL() + { + TheAlarmTest.Test().Printf(_L("- Backup AlarmServer Ini file\r\n")); + Helper_StartBackupL(); // make Backup + + CFileMan* fm=CFileMan::NewL(FsSession); + FsSession.Delete(KAlarmServerTestBackupFile); // no old file + + // keep on trying to copy AlarmServer.ini file, until it will be released by alarm server + const TInt maxNumOfAttempts = 50; + TInt numOfAttempts = 0; + for (;numOfAttempts < maxNumOfAttempts; ++numOfAttempts) + { + if (KErrNone == fm->Copy(KAlarmServerBackupFileFullPath,KAlarmServerTestBackupFile)) + break; + + User::After(200000); //Wait for file to be released + } + TheAlarmTest(numOfAttempts < maxNumOfAttempts, __LINE__); //File was not locked after 50 attempts + + delete fm; + Helper_EndBackupL(); + } + + +/* + * Restores from a Backup of the Alarm Server ini file: + * 1. Asks for full access file lock for the AlarmServer.ini file + * 2. Copies c:\AlarmServer.bak to the AlarmServer.ini file + * 3. Hands back the file lock + */ +static void RestoreAlarmServerIniFileL() + { + TheAlarmTest.Test().Printf(_L("- Restore AlarmServer Ini file\r\n")); + + // variables used to check Alarm Server notifications of Restore + TAlarmId alarmId; + TRequestStatus status; + TheAlarmTest.WaitForNotificationBufferToBeEmptied(status, alarmId); + + Helper_StartRestoreL(); + TheAlarmTest.TestEventBuffer(EAlarmChangeEventRestoreStarted, status, alarmId); + + CFileMan* fm=CFileMan::NewL(FsSession); + // didn't leave yet so: + FsSession.Delete(KAlarmServerBackupFileFullPath); // zap current file + fm->Copy(KAlarmServerTestBackupFile,KAlarmServerBackupFileFullPath); + delete fm; + + Helper_EndRestoreL(ETrue); + } + + +/* + * Pretends to start to make a Backup of the Alarm Server ini file: + * 1. Asks for Read Only lock for the AlarmServer.ini file + * Must delete store object and call SimulateBackupServerBackup_CompleteL() + * after calling this! + */ +static CStreamStore* SimulateBackupServerBackup_StartL() + { + TheAlarmTest.Test().Printf(_L("- Claim AlarmServer Ini file for Backup\r\n")); + + // want to start a Backup and open the AlarmServer Ini file + return Helper_StartBackupAndOpenL(); + } + + +/* + * Ends pretend Backup of the Alarm Server ini file: + * 1. Hands back the file lock + * Must be preceded by a call to SimulateBackupServerBackup_StartL + * and delete of the store object. + */ +static void SimulateBackupServerBackup_CompleteL() + { + TheAlarmTest.Test().Printf(_L("- ... Backup finished, return AlarmServer file lock\r\n")); + + Helper_EndBackupL(); + } + +/* + * Pretends to Restore the Alarm Server ini file: + * 1. Asks for full access file lock for the AlarmServer.ini file + * 2. Pauses briefly. + * 3. Hands back the file lock + * Alarm Server should re-Internalize existing alarms; + * Session alarms should become orphaned. + */ +static void SimulateBackupServerRestorationL() + { + TheAlarmTest.Test().Printf(_L("- 'Restore' AlarmServer Ini file, (open and release)\r\n")); + + // want to start a Restore and open AlarmServer Ini file + CDirectFileStore* store = Helper_StartRestoreAndOpenL(); + + // take a little time for the Restore (.5s) + User::After(500000); + + // now release file lock - + TheAlarmTest.Test().Printf(_L("- Unlock AlarmServer.Ini file\r\n")); + delete store; + + // restore success + Helper_EndRestoreL(ETrue); + } + +/* + * Pretends to start to Restore the Alarm Server ini file: + * 1. Asks for full access file lock for the AlarmServer.ini file + * Must be followed by a call to SimulateBackupServerRestore_Complete! + */ +static CStreamStore* SimulateBackupServerRestore_StartL() + { + CStreamStore* store = NULL; + TInt err = KErrNone; + + TheAlarmTest.Test().Printf(_L("- Access AlarmServer Ini file, as if Restoring\r\n")); + + // Use this Secure Backup Engine API to "start" a restore. Ultimate effect + // is to cause CASSrvAlarmQueue::StartAlarmStoreOperation() to be called. + // This happens indirectly through CASSrvAlarmStore::BackupBeginningL()/ + // BackupCompletedL()/RestoreBeginningL()/RestoreCompletedL() methods. + // These methods are implementations for MBackupRestoreNotificatioObserver + // which monitors changes in the P&S property conn::KUidBackupRestoreKey. + // This P&S property is changed by calling the Secure Backup Engine API + // below. + BackupClient->SetBURModeL(DriveList, conn::EBURRestoreFull, conn::EBackupBase); + + // actually lock the file C:\System\Data\AlarmServer.ini + const TInt maxNumOfAttempts = 50; + TInt numOfAttempts = 0; + for (;numOfAttempts < maxNumOfAttempts; ++numOfAttempts) + { + TRAP(err,store = CDirectFileStore::OpenL(FsSession, KAlarmServerBackupFileFullPath, + EFileRead | EFileShareExclusive)); + RDebug::Print(_L("CDirectFileStore::OpenL %S, err: %d"), &KAlarmServerBackupFileFullPath, err); + if (err == KErrNone) + break; + + User::After(200000); //Wait for file to be released + } + TheAlarmTest(numOfAttempts < maxNumOfAttempts, __LINE__); //File was not locked after 50 attempts + + return store; + } + +/* + * Ends pretend Restore of the Alarm Server ini file: + * 1. Hands back the file lock + * Alarm Server should re-Initernalize existing alarms; + * Session alarms should become orphaned. + * Must be preceded by acall to SimulateBackupServerRestore_StartLC + */ +static void SimulateBackupServerRestore_CompleteL() + { + TheAlarmTest.Test().Printf(_L("- Restore finished, release AlarmServer Ini file\r\n")); + + Helper_EndRestoreL(ETrue); + } + +/* + * Ends pretend Restore of the Alarm Server ini file: + * 1. Hands back the file lock + * Alarm Server should re-Initernalize existing alarms; + * Session alarms should become orphaned. + * Must be preceded by a call to SimulateBackupServerRestore_StartL + * and delete of the store object. + */ +// +// Shutdown & Restart of Alarm Server only possibly in Windows Udeb builds + +#if defined(_DEBUG) && defined (__WINSCW__) +static void closeServers() + { + TInt r=TheAlarmTest.Session().Connect(); + TheAlarmTest(r==KErrNone, __LINE__); + TheAlarmTest.Test().Printf(_L("Server shut down\r\n")); + TheAlarmTest.Test().Printf(_L("now closing server...\r\n")); + TheAlarmTest.Session().__DbgShutDownServer(); + TheAlarmTest.Session().Close(); + } + +static void shutDownAndStartUpServers() + { + closeServers(); + User::After(5000000); + TheAlarmTest.Test().Printf(_L("now restarting server...\r\n")); + TheAlarmTest.TestStartServers(); + } +#endif + +static TAlarmId addUtcAlarm(TInt aMinutesFromNow, TAlarmRepeatDefinition aRepeatDefinition = EAlarmRepeatDefintionRepeatOnce) + { + TBuf<200> testTitle; + testTitle.Format(_L("- Adding alarm set with UTC time to expire in %d minutes"), aMinutesFromNow); + TheAlarmTest.Test().Next(testTitle); + // + TASShdAlarm alarm; + alarm.Category()=KASCliCategoryClock; + alarm.RepeatDefinition()=aRepeatDefinition; + TTime time; + time.UniversalTime(); + time += TTimeIntervalMinutes(aMinutesFromNow); + alarm.SetUtcNextDueTime(time); + // + TheAlarmTest(TheAlarmTest.Session().AlarmAdd(alarm) == KErrNone, __LINE__); + const TAlarmId id = alarm.Id(); + TheAlarmTest(id != KNullAlarmId, __LINE__); + // allow servers to catch up + User::After(1000000); + return id; + } + +static TAlarmId addAlarm(TInt aMinutesFromNow, TAlarmRepeatDefinition aRepeatDefinition = EAlarmRepeatDefintionRepeatOnce) + { + TBuf<200> testTitle; + testTitle.Format(_L("- Adding alarm set with local wall-clock time to expire in %d minutes"), aMinutesFromNow); + TheAlarmTest.Test().Next(testTitle); + // + TASShdAlarm alarm; + alarm.Category() = KASCliCategoryClock; + alarm.RepeatDefinition() = aRepeatDefinition; + alarm.NextDueTime().HomeTime(); + alarm.NextDueTime() += TTimeIntervalMinutes(aMinutesFromNow); + + // + TDateTime date=alarm.NextDueTime().DateTime(); + TheAlarmTest(TheAlarmTest.Session().AlarmAdd(alarm) == KErrNone, __LINE__); + const TAlarmId id = alarm.Id(); + TheAlarmTest(id != KNullAlarmId, __LINE__); + TheAlarmTest.Test().Printf(_L("alarm %d due time is : hours: %d, minutes: %d, seconds: %d.\r\n"), + id,date.Hour(), date.Minute(), date.Second()); + // allow servers to catch up + User::After(1000000); + return id; + } + +// +// +// + + +/***************************************************************************** + */ + +static void doTestAlarmQueueOrderShutdownStartupL() + { + TheAlarmTest.Test().Next(_L("* Test alarms set using local wall-clock time order stable over server shutdown/startup")); + +#if !defined(_DEBUG) || !defined(__WINSCW__) + // Can't shutdown Alarm Server on UREL or target builds + TheAlarmTest.Test().Printf(_L("THIS TEST IS A WINS - DEBUG TEST ONLY\r\n")); +#else + TheAlarmTest.TestClearStoreL(); + + //add alarms + TheAlarmTest.Test().Next(_L("add 5 alarms")); + RArray alarmIds; + for (TInt ii=2; ii<=6; ii++) + { + TAlarmId id = addAlarm(ii); + alarmIds.Append(id); + } + + TheAlarmTest.Test().Next(_L("shutdown then restart Alarm Server")); + shutDownAndStartUpServers(); + + //get server alarms + RArray serverAlarmIds; + TheAlarmTest.Session().GetAlarmIdListForCategoryL(KASCliCategoryClock, serverAlarmIds); + alarmIds.Sort(); + serverAlarmIds.Sort(); + TInt count = alarmIds.Count(); + TheAlarmTest(count == serverAlarmIds.Count(), __LINE__); + for (TInt jj=0; jj alarmIds; + for (TInt ii=2; ii<=6; ii++) + { + TAlarmId id = addAlarm(ii); + alarmIds.AppendL(id); + } + + // brief pause before backup (.5s) + User::After(500000); + + TheAlarmTest.Test().Next(_L("make real backup of alarmserver ini file")); + TRAPD(err, BackupAlarmServerIniFileL()); + TheAlarmTest(err==KErrNone, __LINE__); + + // delete alarms + TheAlarmTest.Test().Next(_L("delete alarms")); + TInt jj; + for (jj=0; jj<5; jj++) + { + TheAlarmTest(TheAlarmTest.Session().AlarmDelete(alarmIds[jj]) == KErrNone, __LINE__); + } + + // pause before restore (5s) + User::After(5000000); + TheAlarmTest.Test().Next(_L("restore alarmserver ini file")); + TRAP(err, RestoreAlarmServerIniFileL()); + TheAlarmTest(err==KErrNone, __LINE__); + + TheAlarmTest.Test().Next(_L("check restored alarms")); + //get server alarms + RArray serverAlarmIds; + TheAlarmTest.Session().GetAlarmIdListForCategoryL(KASCliCategoryClock, serverAlarmIds); + alarmIds.Sort(); + serverAlarmIds.Sort(); + TInt count = alarmIds.Count(); + TInt serverCount = serverAlarmIds.Count(); + TheAlarmTest.Test().Printf(_L("[Added Alarms count = %i, server Count = %i]\r\n"), count, serverCount); + TheAlarmTest(count == serverCount, __LINE__); + for (jj=0; jjAppendL(item); + offset = minuteCycle[++i]; + } + + // Try setting the sound details + TheAlarmTest.Session().SetAlarmPlayIntervalsL(*newSoundArray); + + // brief pause before backup (.5s) + User::After(500000); + + TheAlarmTest.Test().Next(_L("make real backup of alarmserver ini file")); + TRAPD(err, BackupAlarmServerIniFileL()); + TheAlarmTest(err==KErrNone, __LINE__); + + TheAlarmTest.Test().Next(_L("reset default sound intervals")); + TheAlarmTest.Session().SetAlarmPlayIntervalsL(*originalSoundArray); + + // pause briefly before restore (2s) + User::After(2000000); + TheAlarmTest.Test().Next(_L("restore alarmserver ini file")); + TRAP(err, RestoreAlarmServerIniFileL()); + TheAlarmTest(err==KErrNone, __LINE__); + + TheAlarmTest.Test().Next(_L("check correct sound intervals after restore")); + + // Fetch the details back again. + CPlayIntervalArray* restoreSoundArray = new(ELeave) CPlayIntervalArray(20); + CleanupStack::PushL(restoreSoundArray); + TheAlarmTest.Session().GetAlarmPlayIntervalsL(*restoreSoundArray); + + // Test that there are the same number of entries + TheAlarmTest(newSoundArray->Count() == restoreSoundArray->Count(), __LINE__); + + // Test entries are the same + TInt count = newSoundArray->Count(); + for(TInt j=0; jAt(j); + const TASCliSoundPlayDefinition& item2 = restoreSoundArray->At(j); + TheAlarmTest(item.Offset().Int() == item2.Offset().Int(), __LINE__); + TheAlarmTest(item.Duration().Int() == item2.Duration().Int(), __LINE__); + } + + TheAlarmTest.Test().Next(_L("reset default sound intervals")); + TheAlarmTest.Session().SetAlarmPlayIntervalsL(*originalSoundArray); + + CleanupStack::PopAndDestroy(3);// originalSoundArray, newSoundArray, restoreSoundArray + } + +/***************************************************************************** + */ + +static void doTestAlarmAddDuringBackupL() + { + TheAlarmTest.Test().Next(_L("* Test alarm changes during backup")); + + TheAlarmTest.TestClearStoreL(); + + // Attempt to add an alarm while the backup server is backing up the alarms + CStreamStore* store = NULL; + TRAPD(err, store = SimulateBackupServerBackup_StartL()); + TheAlarmTest(err==KErrNone, __LINE__); + + CleanupStack::PushL(store); + + TheAlarmTest.Test().Next(_L("adding alarm should work")); + + TASShdAlarm alm; + TheAlarmTest(addAlarm(0, alm.RepeatDefinition()) != KNullAlarmId, __LINE__); + + TheAlarmTest.Test().Next(_L("changing time forces Alarm Store class to queue Externalize")); + // Locale change (time) x2 (INC038240 regression) + // Exercise CASSrvAlarmStore queue an Externalize + TTime time; + time.UniversalTime(); + time += TTimeIntervalSeconds(10); + User::SetUTCTime(time); + User::After(1000000); + time -= TTimeIntervalSeconds(10); + User::SetUTCTime(time); + User::After(1000000); + + // release file lock - + CleanupStack::PopAndDestroy(store); // store + // backup complete + TRAP(err, SimulateBackupServerBackup_CompleteL()); + TheAlarmTest(err==KErrNone, __LINE__); + + // wait for AlarmServer to catch-up + User::After(1000000); + + TheAlarmTest.Test().Next(_L("check we can now add alarm")); + + // re-try alarm add after backup complete - should be successful + TAlarmId id = addAlarm(0); + TheAlarmTest(id != KNullAlarmId, __LINE__); + + // wait for AlarmServer to catch-up + User::After(1000000); + + // make Alarm Server re-Internalize + TheAlarmTest.Test().Next(_L("now simulating restore...")); + TRAP(err, SimulateBackupServerRestorationL()); + TheAlarmTest(err==KErrNone, __LINE__); + + // check absence of alarm + TheAlarmTest.Test().Next(_L("check alarm has gone")); + TASShdAlarm alarm; + TheAlarmTest(TheAlarmTest.Session().GetAlarmDetails(id, alarm) == KErrNotFound, __LINE__); + } + +/***************************************************************************** + */ + +static void doTestAlarmAddDuringRestoreL() + { + // variables used to check Alarm Server notifications of Restore + TAlarmId alarmId; + TRequestStatus status; + + TheAlarmTest.Test().Next(_L("* Test alarm changes during restore")); + + TheAlarmTest.TestClearStoreL(); + + // Attempt to add an alarm while the backup server is restoring up the alarms + TheAlarmTest.WaitForNotificationBufferToBeEmptied(status, alarmId); + CStreamStore* store = NULL; + TRAPD(err, store = SimulateBackupServerRestore_StartL()); + CleanupStack::PushL(store); + TheAlarmTest(err==KErrNone, __LINE__); + + // check Restore Start notification received + TheAlarmTest.Test().Next(_L("check for Alarm Restore Start notification")); + User::After(1000000); + TheAlarmTest(status == EAlarmChangeEventRestoreStarted, __LINE__); + TheAlarmTest.WaitForNotificationBufferToBeEmptied(status, alarmId); + + TheAlarmTest(alarmId==KNullAlarmId, __LINE__); + + TheAlarmTest.Test().Next(_L("adding alarm should fail")); + + TASShdAlarm alm; + alm.NextDueTime().HomeTime(); + TheAlarmTest(TheAlarmTest.Session().AlarmAdd(alm) == KErrLocked, __LINE__); + + // allow servers to catch up + User::After(1000000); + + TheAlarmTest.Test().Next(_L("changing time forces Alarm Store class to queue Externalize")); + // Locale change (time) x2 (INC038240 regression) + // Exercise CASSrvAlarmStore + + TTime time; + time.UniversalTime(); + time += TTimeIntervalSeconds(10); + User::SetUTCTime(time); + User::After(1000000); + time -= TTimeIntervalSeconds(10); + User::SetUTCTime(time); + User::After(1000000); + + CleanupStack::PopAndDestroy(store); + + // restore complete + TRAP(err, SimulateBackupServerRestore_CompleteL()); + TheAlarmTest(err==KErrNone, __LINE__); + + // check Restore Complete notification received + TheAlarmTest.Test().Next(_L("check for Alarm Restore Complete notification")); + TheAlarmTest.TestEventBuffer(EAlarmChangeEventRestoreCompleted, status, alarmId); + TheAlarmTest(alarmId==KNullAlarmId, __LINE__); + + + // wait for AlarmServer to catch-up + User::After(1000000); + + TheAlarmTest.Test().Next(_L("check we can now add alarm")); + + // re-try alarm add after restore complete - should be successful + TAlarmId id = addAlarm(0); + TheAlarmTest(id != KNullAlarmId, __LINE__); + + // wait for Alarm Server to externalize + User::After(3000000); + } + +/***************************************************************************** + */ + + + + +/***************************************************************************** + */ + +static void doTestNotifyingAlarmShutdownStartupL() + { + TheAlarmTest.Test().Next(_L("* Test Notifying alarm across shutdown / startup")); + + TheAlarmTest.TestClearStoreL(); + + TheAlarmTest.Test().Next(_L("add an alarm")); + // add an alarm to expire in 15 minutes + TAlarmId id = addAlarm(15); + + // get alarm expiry time + TASShdAlarm alarm; + TheAlarmTest(TheAlarmTest.Session().GetAlarmDetails(id, alarm) == KErrNone, __LINE__); + TTime time = alarm.NextDueTime(); + +#if !defined(_DEBUG) || !defined(__WINSCW__) + // Can't shutdown Alarm Server on UREL or target builds + TheAlarmTest.Test().Printf(_L("THIS TEST IS A WINS - DEBUG TEST ONLY\r\n")); + + TheAlarmTest.Test().Printf(_L("Waiting for Alarm to expire\r\n")); + // target Alternative: wait until after alarm due time + User::SetHomeTime(time - TTimeIntervalSeconds(3)); + User::After(KTenSeconds); +#else + // UDEB: + // shut down the server + closeServers(); + + // re-start server after alarm expires + User::SetHomeTime(time - TTimeIntervalSeconds(3)); + User::After(KTenSeconds); + TheAlarmTest.Test().Next(_L("now restarting server...\r\n")); + TheAlarmTest.TestStartServers(); + User::After(1000000); +#endif + + // Internalise on startup has a 59s window for recent alarms + TheAlarmTest.Test().Next(_L("check that alarm is now set and notifying")); + //check status of alarm + TheAlarmTest(TheAlarmTest.Session().GetAlarmDetails(id, alarm) == KErrNone, __LINE__); + TheAlarmTest(alarm.State() == EAlarmStateNotifying, __LINE__); + + TheAlarmTest(TheAlarmTest.Session().AlarmDelete(id) == KErrNone, __LINE__); + } + +/***************************************************************************** + */ + +static void doTestNotifyingAlarmBackupRestoreL() + { + TheAlarmTest.Test().Next(_L("* Test Notifying alarm removed by backup / restore")); + + TheAlarmTest.TestClearStoreL(); + + TheAlarmTest.Test().Next(_L("add an alarm")); + // add an alarm to expire in 15 minutes + TAlarmId id = addAlarm(15); + + TheAlarmTest.Test().Next(_L("make real backup of alarmserver ini file")); + TRAPD(err, BackupAlarmServerIniFileL()); + TheAlarmTest(err==KErrNone, __LINE__); + + // get alarm expiry time + TASShdAlarm alarm; + TheAlarmTest(TheAlarmTest.Session().GetAlarmDetails(id, alarm) == KErrNone, __LINE__); + TTime time = alarm.NextDueTime(); + + TheAlarmTest.Test().Printf(_L("Waiting for Alarm to expire\r\n")); + + // wait until after alarm due time + User::SetHomeTime(time - TTimeIntervalSeconds(3)); + User::After(KTenSeconds); + + // Internalise on startup has a 59s window for recent alarms + TheAlarmTest.Test().Next(_L("check that alarm is now set and notifying")); + //check status of alarm + TheAlarmTest(TheAlarmTest.Session().GetAlarmDetails(id, alarm) == KErrNone, __LINE__); + + TheAlarmTest(alarm.State() == EAlarmStateNotifying, __LINE__); + + + TheAlarmTest.Test().Next(_L("restore alarmserver ini file")); + TRAP(err, RestoreAlarmServerIniFileL()); + TheAlarmTest(err==KErrNone, __LINE__); + + // allow Alarm server to notice file lock has been released + User::After(1000000); + + // Internalise after Restore has a 0s window for recent alarms + // check absence of alarm + TheAlarmTest.Test().Next(_L("check alarm has gone\r\n")); + TheAlarmTest(TheAlarmTest.Session().GetAlarmDetails(id, alarm) == KErrNotFound, __LINE__); + } + +/***************************************************************************** + */ + +static void doTestSessionAlarmShutdownRestartL() + { + TheAlarmTest.Test().Next(_L("* Test that Session alarm is removed by shutdown")); + +#if !defined(_DEBUG) || !defined(__WINSCW__) + // Can't shutdown Alarm Server on UREL or target builds + TheAlarmTest.Test().Printf(_L("THIS TEST IS A WINS - DEBUG TEST ONLY\r\n")); +#else + TheAlarmTest.TestClearStoreL(); + + // Set the session alarm + TheAlarmTest.Test().Next(_L("set session alarm in 2 minutes")); + TASShdAlarm alarm; + alarm.Category() = KASCliCategoryClock; + alarm.RepeatDefinition() = EAlarmRepeatDefintionRepeatOnce; + alarm.NextDueTime().HomeTime(); + alarm.NextDueTime() += TTimeIntervalMinutes(2); + // session specific alarm (has a TRequestStatus to complete) + alarm.Characteristics().Set(EAlarmCharacteristicsSessionSpecific); + TRequestStatus status; + TheAlarmTest.Session().AlarmAddWithNotification(status, alarm); + const TAlarmId id = alarm.Id(); + TheAlarmTest(id != KNullAlarmId, __LINE__); + + // status should be pending + TheAlarmTest.Test().Next(_L("checking request is pending")); + TheAlarmTest(status == KRequestPending, __LINE__); + + TheAlarmTest.Test().Next(_L("Shutdown Alarm Server")); + closeServers(); + + User::After(10000000); + + // check absence of alarm + TheAlarmTest.Test().Next(_L("check alarm notification has been aborted")); + + TheAlarmTest(status != KRequestPending, __LINE__); + + // Get the abort + // (Probably KErrDied though KErrServerTerminated should be okay too) + User::WaitForRequest(status); + TInt stat = status.Int(); + TheAlarmTest((stat == KErrDied) || (stat == KErrServerTerminated), __LINE__); + + // now restart Alarm Server + TheAlarmTest.Test().Next(_L("restart Alarm Server")); + TheAlarmTest.TestStartServers(); + + // check presence of alarm + TheAlarmTest.Test().Next(_L("check shutdown deleted alarm")); + TheAlarmTest(TheAlarmTest.Session().GetAlarmDetails(id, alarm) == KErrNotFound, __LINE__); +#endif + } + +/***************************************************************************** + */ + +static void doTestSessionAlarmBackupRestoreL() + { + TheAlarmTest.Test().Next(_L("* Test that Session alarm is orphaned by restore")); + + TheAlarmTest.TestClearStoreL(); + + // Set the session alarm + TheAlarmTest.Test().Next(_L("set session alarm in 20 minutes")); + TASShdAlarm alarmWrite; + alarmWrite.Category() = KASCliCategoryClock; + alarmWrite.RepeatDefinition() = EAlarmRepeatDefintionRepeatOnce; + alarmWrite.NextDueTime().HomeTime(); + alarmWrite.NextDueTime() += TTimeIntervalMinutes(20); + // session specific alarm (has a TRequestStatus to complete) + alarmWrite.Characteristics().Set(EAlarmCharacteristicsSessionSpecific); + TRequestStatus status; + TheAlarmTest.Session().AlarmAddWithNotification(status, alarmWrite); + // check that alarm was set okay + const TAlarmId id = alarmWrite.Id(); + TheAlarmTest(id != KNullAlarmId, __LINE__); + + // status should be pending + TheAlarmTest.Test().Next(_L("checking request is pending")); + TheAlarmTest(status == KRequestPending, __LINE__); + + // remember the alarm time + TTime alarmTime = alarmWrite.NextDueTime(); + + // make the Alarm server re-internlize .... + TheAlarmTest.Test().Next(_L("now simulating restore...")); + TRAPD(err, SimulateBackupServerRestorationL()); + TheAlarmTest(err==KErrNone, __LINE__); + + + // allow Alarm server to Internalize... + User::After(1000000); // 1s + + + // check old alarm queue has been cleared + TheAlarmTest.Test().Next(_L("check alarm notification has been aborted")); + TheAlarmTest(status != KRequestPending, __LINE__); + + // Get the abort result + User::WaitForRequest(status); + TheAlarmTest(status.Int() == KErrCancel, __LINE__); + + // check presence of alarm + TASShdAlarm alarmRead; + TheAlarmTest.Test().Next(_L("check alarm is no longer a session alarm")); + TheAlarmTest(TheAlarmTest.Session().GetAlarmDetails(id, alarmRead) == KErrNone, __LINE__); + + TheAlarmTest(!alarmRead.HasOwningSession(), __LINE__); + TheAlarmTest(alarmRead.HasBecomeOrphaned(), __LINE__); + + // advance clock, wait for alarm + User::SetHomeTime(alarmWrite.NextDueTime() - TTimeIntervalSeconds(3)); + TheAlarmTest.Test().Next(_L("waiting for alarm to notify")); + // wait until after alarm due time + User::After(KTenSeconds); + + // alarm should be notifying + // if Alarm Server server tries to access the TRequestStatus + // there will be an Access Violation + TheAlarmTest(TheAlarmTest.Session().GetAlarmDetails(id, alarmRead) == KErrNone, __LINE__); + + //TheAlarmTest(alarm.State() == EAlarmStateNotifying, __LINE__); + + const TAlarmState alarmState = alarmRead.State(); + TheAlarmTest(alarmState == EAlarmStateNotifying, __LINE__); + } + + +/***************************************************************************** + * Test adapted from TAlarmData, checks alarm data across Backup & Restore. + * (Original tested across Alarm Server shutdown & re-start.) + */ + +static void doTestRestoreValidAlarmDataL() + { + TheAlarmTest.Test().Next(_L("Data API test")); + TheAlarmTest.TestClearStoreL(); + TInt r; + TAlarmId alarmId; + TASShdAlarm alarm; + TRequestStatus status; + // + alarm.Message() = _L("Alarm with data"); + alarm.NextDueTime().HomeTime(); + alarm.NextDueTime() += TTimeIntervalMinutes(2); + // + r = TheAlarmTest.Session().AlarmAdd(alarm); + TheAlarmTest(r==KErrNone, __LINE__); + // + r = TheAlarmTest.Session().AlarmDataSize(alarm.Id()); + TheAlarmTest(r == KErrNotFound, __LINE__); + // + r = TheAlarmTest.Session().AlarmDataDetach(alarm.Id()); + TheAlarmTest(r == KErrNotFound, __LINE__); + // + TheAlarmTest.WaitForNotificationBufferToBeEmptied(status, alarmId); + r = TheAlarmTest.Session().AlarmDataAttachL(alarm.Id(), KSomeAlarmData); + TheAlarmTest(r == KErrNone, __LINE__); + TheAlarmTest(status == EAlarmChangeEventAlarmData, __LINE__); + TheAlarmTest(alarmId = alarm.Id(), __LINE__); + User::WaitForRequest(status); + // + TheAlarmTest.WaitForNotificationBufferToBeEmptied(status, alarmId); + r = TheAlarmTest.Session().AlarmDataAttachL(alarm.Id(), KSomeAlarmData); + TheAlarmTest(r == KErrInUse, __LINE__); + TheAlarmTest(status == KRequestPending, __LINE__); + // + r = TheAlarmTest.Session().AlarmDataSize(alarm.Id()); + TheAlarmTest(r == KSomeAlarmData().Size()); + // + TheAlarmTest.WaitForNotificationBufferToBeEmptied(status, alarmId); + r = TheAlarmTest.Session().AlarmDelete(alarm.Id()); + TheAlarmTest(r == KErrNone, __LINE__); + TheAlarmTest.TestEventBuffer(EAlarmChangeEventAlarmData, status, alarmId); + // + r = TheAlarmTest.Session().AlarmDataSize(alarm.Id()); + TheAlarmTest(r == KErrNotFound, __LINE__); + // + r = TheAlarmTest.Session().AlarmDataDetach(alarm.Id()); + TheAlarmTest(r == KErrNotFound, __LINE__); + // + alarm.NextDueTime().HomeTime(); + alarm.NextDueTime() += TTimeIntervalMinutes(2); + r = TheAlarmTest.Session().AlarmAdd(alarm); + TheAlarmTest(r==KErrNone, __LINE__); + // + TheAlarmTest.WaitForNotificationBufferToBeEmptied(status, alarmId); + r = TheAlarmTest.Session().AlarmDataAttachL(alarm.Id(), KSomeAlarmData); + TheAlarmTest(r == KErrNone, __LINE__); + TheAlarmTest(status == EAlarmChangeEventAlarmData, __LINE__); + TheAlarmTest(alarmId = alarm.Id(), __LINE__); + User::WaitForRequest(status); + // + TheAlarmTest.WaitForNotificationBufferToBeEmptied(status, alarmId); + r = TheAlarmTest.Session().AlarmDataDetach(alarm.Id()); + TheAlarmTest(r == KErrNone, __LINE__); + TheAlarmTest.TestEventBuffer(EAlarmChangeEventAlarmData, status, alarmId); + // + r = TheAlarmTest.Session().AlarmDataDetach(alarm.Id()); + TheAlarmTest(r == KErrNotFound, __LINE__); + // + r = TheAlarmTest.Session().AlarmDataSize(alarm.Id()); + TheAlarmTest(r == KErrNotFound, __LINE__); + // + TheAlarmTest.WaitForNotificationBufferToBeEmptied(status, alarmId); + r = TheAlarmTest.Session().AlarmDataAttachL(alarm.Id(), KSomeAlarmData); + TheAlarmTest(r == KErrNone, __LINE__); + TheAlarmTest(status == EAlarmChangeEventAlarmData, __LINE__); + TheAlarmTest(alarmId = alarm.Id(), __LINE__); + User::WaitForRequest(status); + // + HBufC8* buf = HBufC8::NewLC(KSomeAlarmData().Size()); + TPtr8 pBuf(buf->Des()); + r = TheAlarmTest.Session().GetAlarmData(alarm.Id(), pBuf); + TheAlarmTest(r == KErrNone, __LINE__); + TheAlarmTest(*buf == KSomeAlarmData, __LINE__); + // + TheAlarmTest.Test().Next(_L("Waiting for alarm to expire")); + // advance clock to 3s before alarm due + User::SetHomeTime(alarm.NextDueTime() - TTimeIntervalSeconds(3)); + TheAlarmTest.WaitForEvent(EAlarmChangeEventTimerExpired, status, alarmId); + TheAlarmTest(alarmId == alarm.Id(), __LINE__); + // + r = TheAlarmTest.Session().AlarmDataAttachL(alarm.Id(), KSomeAlarmData); + TheAlarmTest(r == KErrInUse, __LINE__); + // + r = TheAlarmTest.Session().AlarmDataSize(alarm.Id()); + TheAlarmTest(r == KSomeAlarmData().Size(), __LINE__); + // + r = TheAlarmTest.Session().AlarmDelete(alarm.Id()); + TheAlarmTest(r == KErrNone, __LINE__); + // + + TheAlarmTest.Session().AlarmAddWithNotification(status, alarm, KSomeAlarmData); + TheAlarmTest(alarmId = alarm.Id(), __LINE__); + HBufC8* alarmdata = HBufC8::NewLC(KSomeAlarmData().Size()); + TPtr8 pAlarmdata(alarmdata->Des()); + r = TheAlarmTest.Session().GetAlarmData(alarm.Id(), pAlarmdata); + TheAlarmTest(r == KErrNone, __LINE__); + TheAlarmTest(*alarmdata == KSomeAlarmData, __LINE__); + TheAlarmTest.Session().AlarmNotificationCancelAndDequeue(alarmId); + CleanupStack::PopAndDestroy(alarmdata); + // + alarm.Reset(); + alarm.Message() = _L("Alarm with data"); + alarm.NextDueTime().HomeTime(); + alarm.NextDueTime() += TTimeIntervalMinutes(2); + // + r = TheAlarmTest.Session().AlarmAdd(alarm, KSomeAlarmData); + TheAlarmTest(alarmId = alarm.Id(), __LINE__); + HBufC8* alarmdata1 = HBufC8::NewLC(KSomeAlarmData().Size()); + TPtr8 pAlarmdata1(alarmdata1->Des()); + r = TheAlarmTest.Session().GetAlarmData(alarm.Id(), pAlarmdata1); + TheAlarmTest(r == KErrNone, __LINE__); + TheAlarmTest(*alarmdata1 == KSomeAlarmData, __LINE__); + CleanupStack::PopAndDestroy(alarmdata1); + + TheAlarmTest.Test().Next(_L("make real backup of alarmserver ini file")); + User::After(1000000); // 1s + BackupAlarmServerIniFileL(); + User::After(1000000); // 1s + + TheAlarmTest.Test().Next(_L("Delete Alarm")); + TheAlarmTest(TheAlarmTest.Session().AlarmDelete(alarmId) == KErrNone, __LINE__); + + User::After(1000000); // 1s + + TheAlarmTest.Test().Next(_L("restore alarmserver ini file")); + RestoreAlarmServerIniFileL(); + + User::After(1000000); // 1s + + // + TheAlarmTest.Test().Next(_L("testing data restoration")); + // + r = TheAlarmTest.Session().AlarmDataAttachL(alarm.Id(), KSomeAlarmData); + TheAlarmTest(r == KErrInUse, __LINE__); + // + r = TheAlarmTest.Session().AlarmDataSize(alarm.Id()); + TheAlarmTest(r == KSomeAlarmData().Size(), __LINE__); + // + r = TheAlarmTest.Session().AlarmDelete(alarm.Id()); + TheAlarmTest(r == KErrNone, __LINE__); + // + r = TheAlarmTest.Session().AlarmDataSize(alarm.Id()); + TheAlarmTest(r == KErrNotFound, __LINE__); + // + r = TheAlarmTest.Session().AlarmDataDetach(alarm.Id()); + TheAlarmTest(r == KErrNotFound, __LINE__); + // + r = TheAlarmTest.Session().AlarmAdd(alarm); + TheAlarmTest(r==KErrNone, __LINE__); + // + r = TheAlarmTest.Session().AlarmDataAttachL(alarm.Id(), KSomeAlarmData); + TheAlarmTest(r == KErrNone, __LINE__); + // + r = TheAlarmTest.Session().AlarmDataDetach(alarm.Id()); + TheAlarmTest(r == KErrNone, __LINE__); + // + r = TheAlarmTest.Session().AlarmDataSize(alarm.Id()); + TheAlarmTest(r == KErrNotFound, __LINE__); + + CleanupStack::PopAndDestroy(buf); + } + + +// +// +// + + +static void doTestUtcAlarmQueueOrderShutdownStartupL() + { + TheAlarmTest.Test().Next(_L("* Test alarms set with UTC time order stable over server shutdown/startup")); + +#if !defined(_DEBUG) || !defined(__WINSCW__) + // Can't shutdown Alarm Server on UREL or target builds + TheAlarmTest.Test().Printf(_L("THIS TEST IS A WINS - DEBUG TEST ONLY\r\n")); +#else + TheAlarmTest.TestClearStoreL(); + + //add alarms + TheAlarmTest.Test().Next(_L("add 5 alarms")); + RArray alarmIds; + for (TInt ii=2; ii<=6; ii++) + { + TAlarmId id = addUtcAlarm(ii); + alarmIds.Append(id); + } + + TheAlarmTest.Test().Next(_L("shutdown then restart Alarm Server")); + shutDownAndStartUpServers(); + + //get server alarms + RArray serverAlarmIds; + TheAlarmTest.Session().GetAlarmIdListForCategoryL(KASCliCategoryClock, serverAlarmIds); + alarmIds.Sort(); + serverAlarmIds.Sort(); + TInt count = alarmIds.Count(); + TheAlarmTest(count == serverAlarmIds.Count(), __LINE__); + for (TInt jj=0; jj alarmIds; + //Create an alarm at 5.00 am + TAlarmId id = addAlarm(242); + alarmIds.Append(id); + //Create an alarm at 6.00 am + id = addAlarm(302); + alarmIds.Append(id); + + //Get the due time of the returned back alarms + RArray dueTimes; + TASShdAlarm orginalAlarm; + TheAlarmTest.Session().GetAlarmDetails(alarmIds[0], orginalAlarm); + dueTimes.Append(orginalAlarm.NextDueTime()); + TheAlarmTest.Session().GetAlarmDetails(alarmIds[1], orginalAlarm); + dueTimes.Append(orginalAlarm.NextDueTime()); + + TTime curTime; + curTime.HomeTime(); + TDateTime date=curTime.DateTime(); + TBool onDST=tz.IsDaylightSavingOnL(*zoneId); + + TheAlarmTest.Test().Printf(_L("system time is now: hours: %d, minutes: %d, seconds: %d.\r\n"), date.Hour(), date.Minute(), date.Second()); + if (onDST) + { + TheAlarmTest.Test().Printf(KDSTON); + } + else + { + TheAlarmTest.Test().Printf(KDSTOFF); + } + + TheAlarmTest.Test().Next(_L("shutdown then restart Alarm Server")); + closeServers(); + User::After(1000000*60*3); //wait three minutes + TheAlarmTest.Test().Printf(_L("now restarting server...\r\n")); + TheAlarmTest.TestStartServers(); + + curTime.HomeTime(); + date=curTime.DateTime(); + onDST=tz.IsDaylightSavingOnL(*zoneId); + CleanupStack::PopAndDestroy(zoneId); + + TheAlarmTest.Test().Printf(_L("system time is now: hours: %d, minutes: %d, seconds: %d.\r\n"), date.Hour(), date.Minute(), date.Second()); + if (onDST) + { + TheAlarmTest.Test().Printf(KDSTON); + } + else + { + TheAlarmTest.Test().Printf(KDSTOFF); + } + + //get server alarms + RArray serverAlarmIds; + TheAlarmTest.Session().GetAlarmIdListForCategoryL(KASCliCategoryClock, serverAlarmIds); + alarmIds.Sort(); + serverAlarmIds.Sort(); + TInt count = alarmIds.Count(); + TheAlarmTest(count == serverAlarmIds.Count(), __LINE__); + TASShdAlarm alarm; + for (TInt jj=0; jj alarmIds; + //Create an alarm at 4.02 am + TAlarmId id = addAlarm(4); + alarmIds.Append(id); + + id = addAlarm(7); + alarmIds.Append(id); + + id = addAlarm(10); + alarmIds.Append(id); + + //Get the due time of the returned back alarms + RArray dueTimes; + TASShdAlarm floatingAlarm; + TheAlarmTest.Session().GetAlarmDetails(alarmIds[0], floatingAlarm); + dueTimes.Append(floatingAlarm.NextDueTime()); + + TheAlarmTest.Session().GetAlarmDetails(alarmIds[1], floatingAlarm); + dueTimes.Append(floatingAlarm.NextDueTime()); + + TheAlarmTest.Session().GetAlarmDetails(alarmIds[2], floatingAlarm); + dueTimes.Append(floatingAlarm.NextDueTime()); + + TTime curTime; + curTime.HomeTime(); + TDateTime date=curTime.DateTime(); + TBool onDST=tz.IsDaylightSavingOnL(*zoneId); + + TheAlarmTest.Test().Printf(_L("system time is now: hours: %d, minutes: %d, seconds: %d.\r\n"), date.Hour(), date.Minute(), date.Second()); + if (onDST) + { + TheAlarmTest.Test().Printf(KDSTON); + } + else + { + TheAlarmTest.Test().Printf(KDSTOFF); + } + + TheAlarmTest.Test().Next(_L("shutdown then restart Alarm Server")); + closeServers(); + User::After(1000000*60*4); //wait for 4 mins + + tz.SetHomeTime(TDateTime(currYear, EOctober, 27, 04, 02, 0, 0)); + TheAlarmTest.Test().Printf(_L("now restarting server...\r\n")); + TheAlarmTest.TestStartServers(); + + curTime.HomeTime(); + date=curTime.DateTime(); + onDST=tz.IsDaylightSavingOnL(*zoneId); + CleanupStack::PopAndDestroy(zoneId); + + TheAlarmTest.Test().Printf(_L("system time is now: hours: %d, minutes: %d, seconds: %d.\r\n"), date.Hour(), date.Minute(), date.Second()); + if (onDST) + { + TheAlarmTest.Test().Printf(KDSTON); + } + else + { + TheAlarmTest.Test().Printf(KDSTOFF); + } + + //get server alarms + RArray serverAlarmIds; + TheAlarmTest.Session().GetAlarmIdListForCategoryL(KASCliCategoryClock, serverAlarmIds); + alarmIds.Sort(); + serverAlarmIds.Sort(); + TInt count = alarmIds.Count(); + if(count != serverAlarmIds.Count()) + { + TheAlarmTest.Test().Printf(_L("No alarms found after DST change \r\n")); + } + else + { + TASShdAlarm alarm; + for (TInt jj=0; jj alarmIds; + for (TInt ii=2; ii<=6; ii++) + { + TAlarmId id = addUtcAlarm(ii); + alarmIds.AppendL(id); + } + + // brief pause before backup (1s) + User::After(1000000); + + TheAlarmTest.Test().Next(_L("make real backup of alarmserver ini file")); + TRAPD(err, BackupAlarmServerIniFileL()); + TheAlarmTest(err==KErrNone, __LINE__); + + // delete alarms + TheAlarmTest.Test().Next(_L("delete alarms")); + TInt jj; + for (jj=0; jj<5; jj++) + { + TheAlarmTest(TheAlarmTest.Session().AlarmDelete(alarmIds[jj]) == KErrNone, __LINE__); + } + + // pause before restore (10s) + User::After(10000000); + TheAlarmTest.Test().Next(_L("restore alarmserver ini file")); + TRAP(err, RestoreAlarmServerIniFileL()); + TheAlarmTest(err==KErrNone, __LINE__); + + TheAlarmTest.Test().Next(_L("check restored alarms")); + //get server alarms + RArray serverAlarmIds; + TheAlarmTest.Session().GetAlarmIdListForCategoryL(KASCliCategoryClock, serverAlarmIds); + alarmIds.Sort(); + serverAlarmIds.Sort(); + TInt count = alarmIds.Count(); + TInt serverCount = serverAlarmIds.Count(); + TheAlarmTest.Test().Printf(_L("[Added Alarms count = %i, server Count = %i]\r\n"), count, serverCount); + TheAlarmTest(count == serverCount, __LINE__); + for (jj=0; jjDes()); + r = TheAlarmTest.Session().GetAlarmData(alarm.Id(), pBuf); + TheAlarmTest(r == KErrNone, __LINE__); + TheAlarmTest(*buf == KSomeAlarmData, __LINE__); + // + TheAlarmTest.Test().Next(_L("Waiting for alarm to expire")); + // advance clock to 3s before alarm due + User::SetUTCTime(alarm.NextDueTime() - TTimeIntervalSeconds(3)); + TheAlarmTest.WaitForEvent(EAlarmChangeEventTimerExpired, status, alarmId); + TheAlarmTest(alarmId == alarm.Id(), __LINE__); + // + r = TheAlarmTest.Session().AlarmDataAttachL(alarm.Id(), KSomeAlarmData); + TheAlarmTest(r == KErrInUse, __LINE__); + // + r = TheAlarmTest.Session().AlarmDataSize(alarm.Id()); + TheAlarmTest(r == KSomeAlarmData().Size(), __LINE__); + // + r = TheAlarmTest.Session().AlarmDelete(alarm.Id()); + TheAlarmTest(r == KErrNone, __LINE__); + // + + TheAlarmTest.Session().AlarmAddWithNotification(status, alarm, KSomeAlarmData); + TheAlarmTest(alarmId = alarm.Id(), __LINE__); + HBufC8* alarmdata = HBufC8::NewLC(KSomeAlarmData().Size()); + TPtr8 pAlarmdata(alarmdata->Des()); + r = TheAlarmTest.Session().GetAlarmData(alarm.Id(), pAlarmdata); + TheAlarmTest(r == KErrNone, __LINE__); + TheAlarmTest(*alarmdata == KSomeAlarmData, __LINE__); + TheAlarmTest.Session().AlarmNotificationCancelAndDequeue(alarmId); + CleanupStack::PopAndDestroy(alarmdata); + // + alarm.Reset(); + alarm.Message()=(_L("Alarm with data")); + time.UniversalTime(); + time += TTimeIntervalMinutes(2); + alarm.SetUtcNextDueTime(time); + // + r = TheAlarmTest.Session().AlarmAdd(alarm, KSomeAlarmData); + TheAlarmTest(alarmId = alarm.Id(), __LINE__); + HBufC8* alarmdata1 = HBufC8::NewLC(KSomeAlarmData().Size()); + TPtr8 pAlarmdata1(alarmdata1->Des()); + r = TheAlarmTest.Session().GetAlarmData(alarm.Id(), pAlarmdata1); + TheAlarmTest(r == KErrNone, __LINE__); + TheAlarmTest(*alarmdata1 == KSomeAlarmData, __LINE__); + CleanupStack::PopAndDestroy(alarmdata1); + + TheAlarmTest.Test().Next(_L("make real backup of alarmserver ini file")); + User::After(1000000); // 1s + BackupAlarmServerIniFileL(); + User::After(1000000); // 1s + + TheAlarmTest.Test().Next(_L("Delete Alarm")); + TheAlarmTest(TheAlarmTest.Session().AlarmDelete(alarmId) == KErrNone, __LINE__); + + User::After(1000000); // 1s + + TheAlarmTest.Test().Next(_L("restore alarmserver ini file")); + RestoreAlarmServerIniFileL(); + + User::After(1000000); // 1s + + // + TheAlarmTest.Test().Next(_L("testing data restoration")); + // + r = TheAlarmTest.Session().AlarmDataAttachL(alarm.Id(), KSomeAlarmData); + TheAlarmTest(r == KErrInUse, __LINE__); + // + r = TheAlarmTest.Session().AlarmDataSize(alarm.Id()); + TheAlarmTest(r == KSomeAlarmData().Size(), __LINE__); + // + r = TheAlarmTest.Session().AlarmDelete(alarm.Id()); + TheAlarmTest(r == KErrNone, __LINE__); + // + r = TheAlarmTest.Session().AlarmDataSize(alarm.Id()); + TheAlarmTest(r == KErrNotFound, __LINE__); + // + r = TheAlarmTest.Session().AlarmDataDetach(alarm.Id()); + TheAlarmTest(r == KErrNotFound, __LINE__); + // + r = TheAlarmTest.Session().AlarmAdd(alarm); + TheAlarmTest(r==KErrNone, __LINE__); + // + r = TheAlarmTest.Session().AlarmDataAttachL(alarm.Id(), KSomeAlarmData); + TheAlarmTest(r == KErrNone, __LINE__); + // + r = TheAlarmTest.Session().AlarmDataDetach(alarm.Id()); + TheAlarmTest(r == KErrNone, __LINE__); + // + r = TheAlarmTest.Session().AlarmDataSize(alarm.Id()); + TheAlarmTest(r == KErrNotFound, __LINE__); + + CleanupStack::PopAndDestroy(buf); + } + + +// + +static void doTestsL() + { + // Initialise the drive list to empty and then get drive list data from + // File Server. + DriveList.FillZ(); + User::LeaveIfError(FsSession.DriveList(DriveList)); + + BackupClient = conn::CSBEClient::NewL(); + CleanupStack::PushL(BackupClient); + + CActiveScheduler* scheduler = new (ELeave) CActiveScheduler; + CleanupStack::PushL(scheduler); + CActiveScheduler::Install(scheduler); + + TheAlarmTest.TestStartServers(); + TheAlarmTest(TheAlarmTest.Session().Connect() == KErrNone, __LINE__); + TheAlarmTest.TestClearStoreL(); + + User::After(100000); + + // delete AlarmServer.ini file + FsSession.Delete(KAlarmServerBackupFileFullPath); + User::After(1000000); + + + // 1. + // Baseline for Internalize behaviour + // [add alarms, shutdown, re-start alarm server, check alarms still queued] + doTestAlarmQueueOrderShutdownStartupL(); + + // 2. + // Backup, Restore Internalize behaviour + // [add alarms, pretend backup/restore, check alarms queued again] + doTestAlarmQueueOrderBackupRestoreL(); + + + // 3. + // Correct Alarms are Backed up and Restored + // [add alarms, backup, delete alarms, add different alarms, restore, check queued alarms] + doTestAlarmQueueBackupRestoreL(); + + // 4. + // Alarm Sound Intervals are Backed up and Restored. + doTestAlarmSoundIntervalsBackupRestoreL(); + + /* 5. + * Should be able to add alarm or change Locale during Backup + */ + doTestAlarmAddDuringBackupL(); + + /* 6. + * Testing Restore behaviour + * a) Should not be able to add alarm during Restore + * b) Should get Notifications at Start & End of Restore + * c) Locale (time) changes during Restore should be processed, + * (but Externalize happens when Restore ends). + */ + doTestAlarmAddDuringRestoreL(); + + /* 7. + * Testing Failed Restore behaviour + * a) Should get Notifications at Start & End of Restore + * b) Alarm Queue should not change + * c) Alarm Server should perform a new Externalize + */ + /* 8, 9. + * Handling of Notifying alarm across Shutdown/Startup and Backup/Restore + */ + doTestNotifyingAlarmShutdownStartupL(); + doTestNotifyingAlarmBackupRestoreL(); + + /* 10, 11. + * Handling of Session alarm + */ + doTestSessionAlarmShutdownRestartL(); + doTestSessionAlarmBackupRestoreL(); + + /* 12. + * Test restore of alarm with attached data + * [create alarm with data, backup, delete alarm, restore, check alarm & data] + * (Based on test case in TAlarmData.) + */ + doTestRestoreValidAlarmDataL(); + + // UTC Tests + + // 13. + // Baseline for Internalize behaviour + // [add alarms, shutdown, re-start alarm server, check alarms still queued] + doTestUtcAlarmQueueOrderShutdownStartupL(); + + // 14. + // Backup, Restore Internalize behaviour + // [add utc alarms, pretend backup/restore, check alarms queued again] + doTestUtcAlarmQueueOrderBackupRestoreL(); + + + // 15. + // Correct UTC Alarms are Backed up and Restored + // [add utc alarms, backup, delete alarms, add different alarms, restore, check queued alarms] + doTestUtcAlarmQueueBackupRestoreL(); + + /* 16. + * Should be able to add utc alarm or change Locale during Backup + */ + doTestUtcAlarmAddDuringBackupL(); + + /* 17. + * Testing Restore behaviour + * a) Should not be able to add utc alarm during Restore + * b) Should get Notifications at Start & End of Restore + * c) Locale (time) changes during Restore should be processed, + * (but Externalize happens when Restore ends). + */ + doTestUtcAlarmAddDuringRestoreL(); + + /* 18. + * Testing Failed Restore behaviour + * a) Should get Notifications at Start & End of Restore + * b) Alarm Queue should not change + * c) Alarm Server should perform a new Externalize + */ + /* 19, 20. + * Handling of Notifying UTC alarm across Shutdown/Startup and Backup/Restore + */ + doTestNotifyingUtcAlarmShutdownStartupL(); + doTestNotifyingUtcAlarmBackupRestoreL(); + + /* 21, 22. + * Handling of Session UTC alarm + */ + doTestSessionUtcAlarmShutdownRestartL(); + doTestSessionUtcAlarmBackupRestoreL(); + + /* 23. + * Test restore of alarm with attached data + * [create utc alarm with data, backup, delete alarm, restore, check alarm & data] + * (Based on test case in TAlarmData.) + */ + doTestRestoreValidUtcAlarmDataL(); + + /* 24. + * Baseline for Internalize behaviour + * [add alarms, shutdown, re-start alarm server, check local due time is unchanged] + */ + doTestUtcAlarmDSTShutdownStartupL(); + doTestFloatingAlarmDSTShutdownStartupHelsinkiL(); + + // cleanup + CleanupStack::PopAndDestroy(scheduler); + CleanupStack::PopAndDestroy(BackupClient); + TheAlarmTest.TestClearStoreL(); + } + +// + +/** + +@SYMTestCaseID PIM-TBACKUPALARMS-0001 + +*/ + +GLDEF_C TInt E32Main() + { + __UHEAP_MARK; + CTrapCleanup* cleanup = CTrapCleanup::New(); + if (!cleanup) + return KErrNoMemory; + + TheAlarmTest.Test().Title(); + TheAlarmTest.Test().Start(_L("@SYMTestCaseID:PIM-TBACKUPALARMS-0001 Backup Alarms")); + // initialise globals + FsSession.Connect(); + + TheAlarmTest.Test().Next(_L("SECURE_DATA mode")); + + // actually do tests + TRAPD(error, doTestsL()); + + // Cleanup files + // delete test file + FsSession.Delete(KAlarmServerTestBackupFile); + // delete AlarmServer.ini file + FsSession.Delete(KAlarmServerBackupFileFullPath); + FsSession.Close(); + + // did any test Leave? + TheAlarmTest(error == KErrNone, __LINE__); + + // + TheAlarmTest.Test().End(); + TheAlarmTest.Test().Close(); + ASTstAlarmTest::Close(); + delete cleanup; + __UHEAP_MARKEND; + return KErrNone; + }