--- /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 <f32file.h>
+#include <s32file.h>
+#include <asclisoundplay.h>
+
+#include <connect/sbeclient.h>
+#include <tz.h>
+// Type definitions
+typedef CArrayFixFlat<TASCliSoundPlayDefinition> 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<TAlarmId> 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<TAlarmId> serverAlarmIds;
+ TheAlarmTest.Session().GetAlarmIdListForCategoryL(KASCliCategoryClock, serverAlarmIds);
+ alarmIds.Sort();
+ serverAlarmIds.Sort();
+ TInt count = alarmIds.Count();
+ TheAlarmTest(count == serverAlarmIds.Count(), __LINE__);
+ for (TInt jj=0; jj<count; jj++)
+ {
+ TheAlarmTest(alarmIds[jj] == serverAlarmIds[jj], __LINE__);
+ }
+ serverAlarmIds.Close();
+ alarmIds.Close();
+#endif
+ }
+
+/*****************************************************************************
+ */
+
+static void doTestAlarmQueueOrderBackupRestoreL()
+ {
+ TheAlarmTest.Test().Next(_L("* Test alarm order across Backup and Restore"));
+
+ TheAlarmTest.TestClearStoreL();
+
+ //add alarms
+ TheAlarmTest.Test().Next(_L("add 5 alarms"));
+ RArray<TAlarmId> 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<TAlarmId> 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; jj<count; jj++)
+ {
+ TheAlarmTest(alarmIds[jj] == serverAlarmIds[jj], __LINE__);
+ }
+ serverAlarmIds.Close();
+ alarmIds.Close();
+ }
+
+/*****************************************************************************
+ */
+
+static void doTestAlarmQueueBackupRestoreL()
+ {
+ TheAlarmTest.Test().Next(_L("* Test correct alarms in queue after backup and restore"));
+
+ TheAlarmTest.TestClearStoreL();
+
+ // add an alarm to expire in 2 minutes
+ TAlarmId id2 = addAlarm(2);
+ // add an alarm to expire in 3 minutes
+ TAlarmId id3 = addAlarm(3);
+
+ // 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
+ User::After(1000000);
+ TheAlarmTest.Test().Next(_L("delete alarms"));
+ TheAlarmTest(TheAlarmTest.Session().AlarmDelete(id2) == KErrNone, __LINE__);
+ TheAlarmTest(TheAlarmTest.Session().AlarmDelete(id3) == KErrNone, __LINE__);
+ User::After(1000000);
+
+ // add alarms
+ TheAlarmTest.Test().Next(_L("add alarms"));
+ // add alarms to expire now
+ TAlarmId id0 = addAlarm(0);
+ TAlarmId id1 = addAlarm(1);
+ TASShdAlarm alarm;
+ TheAlarmTest(TheAlarmTest.Session().GetAlarmDetails(id0, alarm) == KErrNone, __LINE__);
+
+ // first alarm (id0) should be notifying
+ TheAlarmTest(alarm.State() == EAlarmStateNotifying, __LINE__);
+
+
+
+ // 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 alarms after restore"));
+
+ // alarms should now be gone
+ TheAlarmTest(TheAlarmTest.Session().GetAlarmDetails(id0, alarm) == KErrNotFound, __LINE__);
+ TheAlarmTest(TheAlarmTest.Session().GetAlarmDetails(id1, alarm) == KErrNotFound, __LINE__);
+
+ // alarms should be restored
+ TheAlarmTest(TheAlarmTest.Session().GetAlarmDetails(id2, alarm) == KErrNone, __LINE__);
+ TheAlarmTest(TheAlarmTest.Session().GetAlarmDetails(id3, alarm) == KErrNone, __LINE__);
+ }
+
+/*****************************************************************************
+ */
+
+static void doTestAlarmSoundIntervalsBackupRestoreL()
+ {
+ TheAlarmTest.Test().Next(_L("* Test correct Sound Intervals after backup and restore"));
+
+ TheAlarmTest.TestClearStoreL();
+
+ // Fetch the Alarm Sound Intervals
+ CPlayIntervalArray* originalSoundArray = new(ELeave) CPlayIntervalArray(20);
+ CleanupStack::PushL(originalSoundArray);
+ TheAlarmTest.Session().GetAlarmPlayIntervalsL(*originalSoundArray);
+
+ TheAlarmTest.Test().Next(_L("set non-default sound intervals"));
+
+ // Initialise sound array with default values
+ CPlayIntervalArray* newSoundArray = new(ELeave) CPlayIntervalArray(20);
+ CleanupStack::PushL(newSoundArray);
+
+ // Populate the new array to replace the default
+ const TInt minuteCycle[]=KNewAlarmCycleStartOffsetMinutes;
+ TInt i = 0;
+ TInt offset = minuteCycle[i];
+ while (offset != KErrNotFound)
+ {
+ const TASCliSoundPlayDefinition item(offset, KDefaultSoundPlayDurationInSeconds);
+ newSoundArray->AppendL(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; j<count; j++)
+ {
+ const TASCliSoundPlayDefinition& item = newSoundArray->At(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<TAlarmId> 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<TAlarmId> serverAlarmIds;
+ TheAlarmTest.Session().GetAlarmIdListForCategoryL(KASCliCategoryClock, serverAlarmIds);
+ alarmIds.Sort();
+ serverAlarmIds.Sort();
+ TInt count = alarmIds.Count();
+ TheAlarmTest(count == serverAlarmIds.Count(), __LINE__);
+ for (TInt jj=0; jj<count; jj++)
+ {
+ TheAlarmTest(alarmIds[jj] == serverAlarmIds[jj], __LINE__);
+ }
+ serverAlarmIds.Close();
+ alarmIds.Close();
+#endif
+ }
+
+static void doTestUtcAlarmDSTShutdownStartupL()
+ {
+ TheAlarmTest.Test().Next(_L("* Test alarms set stable over server shutdown in DST off/startup in DST on"));
+#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
+ _LIT(KDSTON,"DST is on\r\n");
+ _LIT(KDSTOFF,"DST is off\r\n");
+ _LIT8(KTzEuropeLondon, "Europe/London");
+
+ TheAlarmTest.TestClearStoreL();
+
+ //Set time zone and system time at first
+ const TInt currYear = 2007;
+
+ TTime oldTime;
+ oldTime.HomeTime();
+
+ RTz tz;
+ User::LeaveIfError(tz.Connect());
+ CleanupClosePushL(tz);
+ CTzId* oldTz=tz.GetTimeZoneIdL();
+ CleanupStack::PushL(oldTz);
+ CTzId* zoneId = CTzId::NewL(KTzEuropeLondon);
+ CleanupStack::PushL(zoneId);
+ tz.SetTimeZoneL(*zoneId);
+ tz.SetHomeTime(TDateTime(currYear, EMarch, 24, 00, 58, 0, 0));
+ tz.SetAutoUpdateBehaviorL(RTz::ETZAutoDSTUpdateOn);
+
+ //add alarms
+ TheAlarmTest.Test().Next(_L("add 2 alarms"));
+ RArray<TAlarmId> 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<TTime> 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<TAlarmId> 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<count; jj++)
+ {
+ TheAlarmTest(alarmIds[jj] == serverAlarmIds[jj], __LINE__);
+ TheAlarmTest.Session().GetAlarmDetails(alarmIds[jj], alarm);
+ TheAlarmTest(alarm.NextDueTime() == dueTimes[jj], __LINE__);
+ date = alarm.NextDueTime().DateTime();
+ TheAlarmTest.Test().Printf(_L("alarm %d due time is : hours: %d, minutes: %d, seconds: %d.\r\n"),
+ alarmIds[jj],date.Hour(), date.Minute(), date.Second());
+ }
+
+
+ serverAlarmIds.Close();
+ alarmIds.Close();
+ dueTimes.Close();
+
+ tz.SetTimeZoneL(*oldTz);
+ CleanupStack::PopAndDestroy(oldTz);
+ tz.SetHomeTime(oldTime);
+ CleanupStack::PopAndDestroy(&tz);
+#endif
+ }
+
+static void doTestFloatingAlarmDSTShutdownStartupHelsinkiL()
+ {
+ TheAlarmTest.Test().Next(_L("* Test alarms set stable over server shutdown in DST on/startup in DST off"));
+
+#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
+ _LIT8(KTzEuropeHelsinki, "Europe/Helsinki");
+ _LIT(KDSTON,"DST is on\r\n");
+ _LIT(KDSTOFF,"DST is off\r\n");
+
+ TheAlarmTest.TestClearStoreL();
+
+ //Set time zone and system time at first
+ const TInt currYear = 2007;
+
+ TTime oldTime;
+ oldTime.HomeTime();
+
+ RTz tz;
+ User::LeaveIfError(tz.Connect());
+ CleanupClosePushL(tz);
+ CTzId* oldTz=tz.GetTimeZoneIdL();
+ CleanupStack::PushL(oldTz);
+ CTzId* zoneId = CTzId::NewL(KTzEuropeHelsinki);
+ CleanupStack::PushL(zoneId);
+ tz.SetTimeZoneL(*zoneId);
+ tz.SetHomeTime(TDateTime(currYear, EOctober, 27, 03, 58, 0, 0));
+ tz.SetAutoUpdateBehaviorL(RTz::ETZAutoDSTUpdateOn);
+
+ //add alarms
+ TheAlarmTest.Test().Next(_L("add alarms"));
+ RArray<TAlarmId> 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<TTime> 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<TAlarmId> 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<count; jj++)
+ {
+ TheAlarmTest(alarmIds[jj] == serverAlarmIds[jj], __LINE__);
+ TheAlarmTest.Session().GetAlarmDetails(alarmIds[jj], alarm);
+ TheAlarmTest(alarm.NextDueTime() == dueTimes[jj], __LINE__);
+ date = alarm.NextDueTime().DateTime();
+ TheAlarmTest.Test().Printf(_L("alarm %d due time is : hours: %d, minutes: %d, seconds: %d.\r\n"),
+ alarmIds[jj],date.Hour(), date.Minute(), date.Second());
+ }
+
+ }
+ serverAlarmIds.Close();
+ alarmIds.Close();
+ dueTimes.Close();
+
+ tz.SetTimeZoneL(*oldTz);
+ CleanupStack::PopAndDestroy(oldTz);
+ tz.SetHomeTime(oldTime);
+ CleanupStack::PopAndDestroy(&tz);
+#endif
+ }
+
+
+static void doTestUtcAlarmQueueOrderBackupRestoreL()
+ {
+ TheAlarmTest.Test().Next(_L("* Test alarm set with UTC time order across Backup and Restore"));
+
+ TheAlarmTest.TestClearStoreL();
+
+ //add alarms
+ TheAlarmTest.Test().Next(_L("add 5 alarms"));
+ RArray<TAlarmId> 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<TAlarmId> 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; jj<count; jj++)
+ {
+ TheAlarmTest(alarmIds[jj] == serverAlarmIds[jj], __LINE__);
+ }
+ serverAlarmIds.Close();
+ alarmIds.Close();
+ }
+
+
+static void doTestUtcAlarmQueueBackupRestoreL()
+ {
+ TheAlarmTest.Test().Next(_L("* Test correct alarms set with UTC time in queue after backup and restore"));
+
+ TheAlarmTest.TestClearStoreL();
+
+ // add an alarm to expire in 2 minutes
+ TAlarmId id2 = addUtcAlarm(2);
+ // add an alarm to expire in 3 minutes
+ TAlarmId id3 = addUtcAlarm(3);
+
+ // 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"));
+ TheAlarmTest(TheAlarmTest.Session().AlarmDelete(id2) == KErrNone, __LINE__);
+ TheAlarmTest(TheAlarmTest.Session().AlarmDelete(id3) == KErrNone, __LINE__);
+
+ // add alarms
+ TheAlarmTest.Test().Next(_L("add alarms"));
+ // add alarms to expire now
+ TAlarmId id0 = addUtcAlarm(0);
+ TAlarmId id1 = addUtcAlarm(1);
+
+ // first alarm (id0) should be notifying
+ TASShdAlarm alarm;
+ TheAlarmTest(TheAlarmTest.Session().GetAlarmDetails(id0, alarm) == KErrNone, __LINE__);
+ TheAlarmTest(alarm.State() == EAlarmStateNotifying, __LINE__);
+
+
+ // 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 alarms after restore"));
+
+ // alarms should now be gone
+ TheAlarmTest(TheAlarmTest.Session().GetAlarmDetails(id0, alarm) == KErrNotFound, __LINE__);
+ TheAlarmTest(TheAlarmTest.Session().GetAlarmDetails(id1, alarm) == KErrNotFound, __LINE__);
+
+ // alarms should be restored
+ TheAlarmTest(TheAlarmTest.Session().GetAlarmDetails(id2, alarm) == KErrNone, __LINE__);
+ TheAlarmTest(TheAlarmTest.Session().GetAlarmDetails(id3, alarm) == KErrNone, __LINE__);
+ }
+
+
+static void doTestUtcAlarmAddDuringBackupL()
+ {
+ 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;
+ TTime time;
+ time.UniversalTime();
+ alm.SetUtcNextDueTime(time);
+ TheAlarmTest(TheAlarmTest.Session().AlarmAdd(alm) == KErrNone, __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
+ 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 = addUtcAlarm(0);
+ TheAlarmTest(id != KNullAlarmId, __LINE__);
+
+ // make Alarm Server re-Internalize
+ User::After(1000000);
+ TheAlarmTest.Test().Next(_L("now simulating restore..."));
+ TRAP(err, SimulateBackupServerRestorationL());
+ TheAlarmTest(err==KErrNone, __LINE__);
+ TASShdAlarm alarm;
+
+
+ // check absence of alarm
+ TheAlarmTest.Test().Next(_L("check alarm has gone"));
+ TheAlarmTest(TheAlarmTest.Session().GetAlarmDetails(id, alarm) == KErrNotFound, __LINE__);
+
+ }
+
+
+static void doTestUtcAlarmAddDuringRestoreL()
+ {
+ // 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;
+ TTime time;
+ time.UniversalTime();
+ alm.SetUtcNextDueTime(time);
+ TheAlarmTest(TheAlarmTest.Session().AlarmAdd(alm) == KErrLocked, __LINE__);
+
+ TheAlarmTest.Test().Next(_L("changing time forces Alarm Store class to queue Externalize"));
+ // Locale change (time) x2 (INC038240 regression)
+ // Exercise CASSrvAlarmStore
+
+ 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 = addUtcAlarm(0);
+ TheAlarmTest(id != KNullAlarmId, __LINE__);
+
+ // wait for Alarm Server to externalize
+ User::After(3000000);
+ }
+
+
+
+
+
+static void doTestNotifyingUtcAlarmShutdownStartupL()
+ {
+ 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 = addUtcAlarm(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"));
+#if defined(_DEBUG)
+ // UREL Alternative: wait until after alarm due time
+ User::SetUTCTime(time - TTimeIntervalSeconds(3));
+ User::After(KTenSeconds);
+#endif
+#else
+ // UDEB:
+ // shut down the server
+ closeServers();
+
+ // re-start server after alarm expires
+ User::SetUTCTime(time - TTimeIntervalSeconds(3));
+ User::After(KTenSeconds);
+ TheAlarmTest.Test().Next(_L("now restarting server...\r\n"));
+ TheAlarmTest.TestStartServers();
+ User::After(1000000);
+#endif
+ TheAlarmTest(TheAlarmTest.Session().GetAlarmDetails(id, alarm) == KErrNone, __LINE__);
+
+#if defined(_DEBUG)
+ //check status of alarm
+ // Internalise on startup has a 59s window for recent alarms
+ TheAlarmTest.Test().Next(_L("check that alarm is now set and notifying"));
+ TheAlarmTest(alarm.State() == EAlarmStateNotifying, __LINE__);
+#else
+ // Test only possible if in _DEBUG build.
+ TheAlarmTest.Test().Printf(_L("THIS TEST IS A DEBUG TEST ONLY\r\n"));
+#endif
+ TheAlarmTest(TheAlarmTest.Session().AlarmDelete(id) == KErrNone, __LINE__);
+ }
+
+
+static void doTestNotifyingUtcAlarmBackupRestoreL()
+ {
+ 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 = addUtcAlarm(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"));
+ TheAlarmTest.Test().Printf(_L("Alarm set to expire at: hours: %d, minutes: %d, seconds: %d.\r\n"), time.DateTime().Hour(), time.DateTime().Minute(), time.DateTime().Second());
+
+
+ // wait until after alarm due time
+ User::SetUTCTime(time - TTimeIntervalSeconds(3));
+ TTime now;
+ now.UniversalTime();
+ TheAlarmTest.Test().Printf(_L("System UTC time is now: hours: %d, minutes: %d, seconds: %d.\r\n"), now.DateTime().Hour(), now.DateTime().Minute(), now.DateTime().Second());
+ TheAlarmTest.Test().Printf(_L("Wait for approximately 10 seconds for alarm to expire...\r\n"));
+ User::After(KTenSeconds);
+ now.UniversalTime();
+ TheAlarmTest.Test().Printf(_L("System UTC time is now: hours: %d, minutes: %d, seconds: %d.\r\n"), now.DateTime().Hour(), now.DateTime().Minute(), now.DateTime().Second());
+
+ // Internalise on startup has a 59s window for recent alarms
+ TheAlarmTest.Test().Next(_L("check that alarm is now set and notifying"));
+
+ TheAlarmTest(TheAlarmTest.Session().GetAlarmDetails(id, alarm) == KErrNone, __LINE__);
+ TheAlarmTest.Test().Printf(_L("Alarm state: %d.\r\n"), alarm.State());
+ 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 doTestSessionUtcAlarmShutdownRestartL()
+ {
+ 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);
+ TTime time;
+ time.UniversalTime();
+ time += TTimeIntervalMinutes(2);
+ alarm.SetUtcNextDueTime(time);
+ // 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 doTestSessionUtcAlarmBackupRestoreL()
+ {
+ 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;
+ TTime time;
+ time.UniversalTime();
+ time += TTimeIntervalMinutes(20);
+ alarmWrite.SetUtcNextDueTime(time);
+ // 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::SetUTCTime(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__);
+ }
+
+
+static void doTestRestoreValidUtcAlarmDataL()
+ {
+ TheAlarmTest.Test().Next(_L("Data API test"));
+ TheAlarmTest.TestClearStoreL();
+ TInt r;
+ TAlarmId alarmId;
+ TASShdAlarm alarm;
+ TRequestStatus status;
+ //
+ alarm.Message()=(_L("Alarm with data"));
+ TTime time;
+ time.UniversalTime();
+ time += TTimeIntervalMinutes(2);
+ alarm.SetUtcNextDueTime(time);
+ //
+ 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__);
+ //
+ time.UniversalTime();
+ time += TTimeIntervalMinutes(2);
+ alarm.SetUtcNextDueTime(time);
+ 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::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;
+ }