--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/commonappservices/alarmserver/Test/TAlarmLocaleChanges.cpp Tue Feb 02 10:12:00 2010 +0200
@@ -0,0 +1,1787 @@
+// 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:
+// Test effects of changing TLocale on clock alarms
+// Test alarms which are skipped over by advancing the time or revived by putting back the time.
+// Test for when time is advanced or put back by changes to the locale, i.e:
+// Turning daylight saving on and off and
+// Increasing and decreasing GMT offset.
+// The expected results for advancing or putting back the time are the same whether caused by changes
+// to daylight saving or GMT offset.
+// Test effects of altering workdays on workday repeated alarms
+//
+//
+
+#include "ASTstAlarmTest.h"
+#include "testserver.h"
+#include <tz.h>
+
+static TRequestStatus TheStatus;
+static TTime TheInitialAlarmTime;
+static TTime TheExtendedAlarmTime;
+static TTime TheOriginalTime;
+static TTime TheCurrentTime;
+static TAlarmId TheClockAlarmSlots[8] = { KNullAlarmId, KNullAlarmId, KNullAlarmId, KNullAlarmId, KNullAlarmId, KNullAlarmId, KNullAlarmId, KNullAlarmId };
+
+// Use the Time Zone Server if available.
+static RTz timezone;
+
+// This gets us a time which isn't close to a minute boundary:
+// It also sets the microseconds to 0, since alarms ignore it and comparison functions don't.
+static void SafeHomeTime(TTime& aTime)
+ {
+ TInt sec;
+ do
+ {
+ aTime.HomeTime();
+ TDateTime dt(aTime.DateTime());
+ sec = dt.Second();
+
+ if(sec > 55 || sec < 5)
+ {
+ // dont loop full speed, there's no point:
+ User::After(1000000);
+ }
+ else
+ {
+ dt.SetMicroSecond(0);
+ aTime = dt;
+ }
+ }
+ while(sec > 55 || sec < 5);
+ }
+
+static void CheckTimesAreEqual(const TTime& aExpectedTime, const TTime& aActualTime, TInt aLineNum)
+//
+// Compare times to required degree of precision
+//
+ {
+ // determine the difference, in seconds
+ TTimeIntervalSeconds timeDiffSeconds;
+ const TInt error = aExpectedTime.SecondsFrom(aActualTime, timeDiffSeconds);
+
+ TheAlarmTest(error == KErrNone, __LINE__);
+
+ // check the times are within 1min
+ // as alarms are rounded to the minute
+ const TTimeIntervalSeconds maxDiff(60);
+ const TTimeIntervalSeconds minDiff(-60);
+
+ if ((timeDiffSeconds > maxDiff) || (timeDiffSeconds < minDiff))
+ {
+ TheAlarmTest.Test().Printf(
+ _L("Compared times more than 1 minute different (%u) at line %u"),
+ timeDiffSeconds.Int(),
+ aLineNum);
+ TheAlarmTest(EFalse, __LINE__);
+ }
+ }
+
+/**
+Sets the system time of the device to the given local (wall-clock) time.
+
+@param aTime The time to set.
+@internalComponent
+*/
+static void SetHomeTime(const TTime& aTime)
+ {
+ TInt err = timezone.SetHomeTime(aTime);
+ TheAlarmTest(err == KErrNone, __LINE__);
+ }
+
+
+
+// If aDszOn is true, set to a time in BST.
+// If aDszOn is false, set to a time in GMT.
+static void EnableDaylightSavingL(TBool aDszOn)
+ {
+ // Using TLocale to set daylight saving mode no longer works, since this is controlled by
+ // the Time Zone Server. Instead the time must be set such that DST rules are in force in a
+ // locale where such rules apply, e.g. 01-06-2004 12:00 BST.
+
+ // Set the time zone to a known location.
+ _LIT8(KTZName, "Europe/London");
+ CTzId* zoneId = CTzId::NewL(KTZName);
+ CleanupStack::PushL(zoneId);
+ timezone.SetTimeZoneL(*zoneId);
+ CleanupStack::PopAndDestroy(zoneId);
+
+ // Set daylight saving time on/off. Note that when DST is set 'on' a DST change event occurs
+ // almost immediately - this tests that the Alarm Queue is updated correctly for DST events.
+
+ if (aDszOn)
+ {
+ // Set the system time to a time in the British Summer: 31-10-2004 01:59:58 BST = 00:59:00 UTC
+ const TInt KBstOffset = 3600;
+ _LIT(KTime, "20040930:005958.000000"); // Just before the DST change.
+ TInt err = User::SetUTCTimeAndOffset(TTime(KTime), KBstOffset);
+ TheAlarmTest(err == KErrNone, __LINE__);
+ }
+ else
+ {
+ // Set the system time to a time in the British Winter: 31-10-2004 01:00:00 GMT = 01:00:00 UTC
+ const TInt KGmtOffset = 0;
+ _LIT(KTime, "20040930:010000.000000"); // Just after the DST change.
+ TInt err = User::SetUTCTimeAndOffset(TTime(KTime), KGmtOffset);
+ TheAlarmTest(err == KErrNone, __LINE__);
+ }
+ }
+
+
+static TTime SetClockAlarms(const TTime& aBaseTime, const TTimeIntervalMinutes& aOffset)
+//
+// Set Alarms.
+// Extra alarm when putting clocks back to see what happen to
+// weekly alarm set for 6 days & 23 1/2 hours time
+//
+ {
+ TInt r;
+ TASShdAlarm alarm;
+ const TInt n = TheAlarmTest.Session().NumberOfAlarmsActiveInQueue();
+ TheAlarmTest(n == 0, __LINE__);
+ //
+ TTime timeForAlarms(aBaseTime);
+ timeForAlarms += aOffset;
+
+ // Once Only
+ alarm.Reset();
+ alarm.Message().Num(0);
+ alarm.NextDueTime() = timeForAlarms;
+ alarm.RepeatDefinition() = EAlarmRepeatDefintionRepeatOnce;
+ r = TheAlarmTest.Session().AlarmAdd(alarm);
+ TheAlarmTest(r == KErrNone, __LINE__);
+ TheClockAlarmSlots[0] = alarm.Id();
+
+ // Next 24 hours
+ alarm.Reset();
+ alarm.Message().Num(1);
+ alarm.NextDueTime() = timeForAlarms;
+ alarm.RepeatDefinition() = EAlarmRepeatDefintionRepeatNext24Hours;
+ r = TheAlarmTest.Session().AlarmAdd(alarm);
+ TheAlarmTest(r == KErrNone, __LINE__);
+ TheClockAlarmSlots[1] = alarm.Id();
+
+ // Clock daily
+ alarm.Reset();
+ alarm.Message().Num(2);
+ alarm.NextDueTime() = timeForAlarms;
+ alarm.RepeatDefinition() = EAlarmRepeatDefintionRepeatDaily;
+ r = TheAlarmTest.Session().AlarmAdd(alarm);
+ TheAlarmTest(r == KErrNone, __LINE__);
+ TheClockAlarmSlots[2] = alarm.Id();
+
+ // Clock weekly
+ alarm.Reset();
+ alarm.Message().Num(3);
+ alarm.NextDueTime() = timeForAlarms;
+ alarm.RepeatDefinition() = EAlarmRepeatDefintionRepeatWeekly;
+ r = TheAlarmTest.Session().AlarmAdd(alarm);
+ TheAlarmTest(r == KErrNone, __LINE__);
+ TheClockAlarmSlots[3] = alarm.Id();
+
+ if (aOffset.Int() < 0)
+ {
+ TheExtendedAlarmTime = timeForAlarms;
+ TheExtendedAlarmTime += TTimeIntervalDays(7);
+ alarm.Message().Num(4);
+ alarm.RepeatDefinition() = EAlarmRepeatDefintionRepeatWeekly;
+ alarm.NextDueTime() = TheExtendedAlarmTime;
+ r = TheAlarmTest.Session().AlarmAdd(alarm);
+ TheAlarmTest(r == KErrNone, __LINE__);
+ TheClockAlarmSlots[4] = alarm.Id();
+ }
+
+ return timeForAlarms;
+ }
+
+/**
+Checks that the alarms are correct.
+
+//
+// We expect and test that:
+//
+// 1) Once alarm to remain unchanged at initial alarm time
+// unless allowed time to complete.
+//
+// 2) Next24 to advance to the first 'initial alarm time'
+// falling due after the original time
+//
+// 3a) If before clocks go back, Weekly (set previously) to
+// advance to the 'initial alarm time' in the next week
+//
+// 3b) If after clocks go back, Weekly (set previously) to
+// return to the 'initial alarm time' in the current week
+//
+// 4a) If before clocks go back, Weekly (set for next week)
+// to remain at the 'extended alarm time' in the next week
+//
+// 4b) If after clocks go back, Weekly (set for next week) to
+// move back to 'initial alarm time' in the current week
+//
+
+@param aInterveningOffsetChange True when a change in the UTC offset occurs
+between setting the alarms and testing them.
+@param aOnceCompleted True if the "Repeat Once" alarm has completed.
+@internalComponent
+*/
+static void VerifyAlarmsAreCorrect(TBool aInterveningOffsetChange, TBool aOnceCompleted)
+ {
+ TInt ret;
+ TTime setTime;
+ TASShdAlarm alarm;
+ TAlarmId alarmId;
+ TTime time;
+ time.HomeTime();
+
+ // Check Once repeat if it has not completed.
+ if (!aOnceCompleted)
+ {
+ alarmId = TheClockAlarmSlots[0];
+ TheAlarmTest(alarmId != KNullAlarmId, __LINE__);
+ ret = TheAlarmTest.Session().GetAlarmDetails(alarmId, alarm);
+ TheAlarmTest(ret == KErrNone, __LINE__);
+ CheckTimesAreEqual(TheInitialAlarmTime, alarm.NextDueTime(), __LINE__);
+ }
+
+ // Check Next 24 hours repeat
+ alarmId = TheClockAlarmSlots[1];
+ TheAlarmTest(alarmId != KNullAlarmId, __LINE__);
+ ret = TheAlarmTest.Session().GetAlarmDetails(alarmId, alarm);
+ TheAlarmTest(ret == KErrNone, __LINE__);
+ setTime = TheInitialAlarmTime;
+
+ // The alarm was set in the past, so add repeat interval.
+ setTime += TTimeIntervalHours(+24);
+
+ CheckTimesAreEqual(setTime, alarm.NextDueTime(), __LINE__);
+
+ // Check daily repeat
+ alarmId = TheClockAlarmSlots[2];
+ TheAlarmTest(alarmId != KNullAlarmId, __LINE__);
+ ret = TheAlarmTest.Session().GetAlarmDetails(alarmId, alarm);
+ TheAlarmTest(ret == KErrNone, __LINE__);
+ setTime = TheInitialAlarmTime;
+
+ if (aInterveningOffsetChange)
+ {
+ // The alarm was set in the past, so add repeat interval.
+ setTime += TTimeIntervalHours(+24);
+ }
+
+ CheckTimesAreEqual(setTime, alarm.NextDueTime(), __LINE__);
+
+ // Check weekly repeat
+ alarmId = TheClockAlarmSlots[3];
+ TheAlarmTest(alarmId != KNullAlarmId, __LINE__);
+ ret = TheAlarmTest.Session().GetAlarmDetails(alarmId, alarm);
+ TheAlarmTest(ret == KErrNone, __LINE__);
+ setTime = TheInitialAlarmTime;
+
+ if (aInterveningOffsetChange)
+ {
+ // The alarm was set in the past, so add repeat interval.
+ setTime += TTimeIntervalDays(+7);
+ }
+
+ CheckTimesAreEqual(setTime, alarm.NextDueTime(), __LINE__);
+
+ // Check weekly repeat
+ alarmId = TheClockAlarmSlots[4];
+ TheAlarmTest(alarmId != KNullAlarmId, __LINE__);
+ ret = TheAlarmTest.Session().GetAlarmDetails(alarmId, alarm);
+ TheAlarmTest(ret == KErrNone, __LINE__);
+
+ if (aInterveningOffsetChange)
+ {
+ setTime = TheExtendedAlarmTime;
+ }
+ else
+ {
+ setTime = TheInitialAlarmTime;
+ }
+
+ CheckTimesAreEqual(setTime, alarm.NextDueTime(), __LINE__);
+ }
+
+static void testAlarmsOnForwardingClocks(TBool aAfterClocksGoForward, TBool aAlarmsSetInPast, TBool aAlarmsShouldAllBeQueued = ETrue)
+//
+// We expect and test that:
+// 1) Once alarm to remain unchanged at 'initial alarm time'
+// 2) Next24 to remain at the 'initial alarm time'
+// 3a) If before clocks go forward, Weekly to remain at the
+// 'initial alarm time'
+// 3b) If after clocks go forward, Weekly to advance to 'initial
+// alarm time' in the next week
+//
+ {
+ TInt ret;
+ TASShdAlarm alarm;
+ TAlarmId alarmId;
+ TTime setTime;
+
+ // Check Once repeat
+ alarmId = TheClockAlarmSlots[0];
+ ret = TheAlarmTest.Session().GetAlarmDetails(alarmId, alarm);
+ setTime = TheInitialAlarmTime;
+
+ // Note that the time of the expected alarm should be the same as when
+ // originally set. No adjustment for any UTC offset is required.
+ if (aAlarmsShouldAllBeQueued)
+ {
+ TheAlarmTest(ret == KErrNone, __LINE__);
+ }
+
+ if (ret == KErrNone && alarm.Status() == EAlarmStatusEnabled)
+ {
+ CheckTimesAreEqual(setTime, alarm.NextDueTime(), __LINE__);
+ }
+
+ // Check Next 24 hours repeat
+ alarmId = TheClockAlarmSlots[1];
+ ret = TheAlarmTest.Session().GetAlarmDetails(alarmId, alarm);
+ setTime = TheInitialAlarmTime;
+
+ if (aAlarmsShouldAllBeQueued)
+ {
+ TheAlarmTest(ret == KErrNone, __LINE__);
+ }
+
+ if (ret == KErrNone && alarm.Status() == EAlarmStatusEnabled)
+ {
+ CheckTimesAreEqual(setTime, alarm.NextDueTime(), __LINE__);
+ }
+
+ // Check daily repeat
+ alarmId = TheClockAlarmSlots[2];
+ TheAlarmTest(alarmId != KNullAlarmId, __LINE__);
+ ret = TheAlarmTest.Session().GetAlarmDetails(alarmId, alarm);
+ setTime = TheInitialAlarmTime;
+
+ if (aAlarmsShouldAllBeQueued)
+ {
+ TheAlarmTest(ret == KErrNone, __LINE__);
+ }
+
+ CheckTimesAreEqual(setTime, alarm.NextDueTime(), __LINE__);
+
+ // Check weekly repeat
+ alarmId = TheClockAlarmSlots[3];
+ TheAlarmTest(alarmId != KNullAlarmId, __LINE__);
+ ret = TheAlarmTest.Session().GetAlarmDetails(alarmId, alarm);
+
+ if (aAlarmsShouldAllBeQueued)
+ {
+ TheAlarmTest(ret == KErrNone, __LINE__);
+ }
+ //
+ setTime = TheInitialAlarmTime;
+
+#if defined(_DEBUG)
+ // In udeb the alarm goes from the state EAlarmStateQueued to the state EAlarmStateNotified
+ // (skipping the state ENotifying).In EAlarmStateNotified the nextTime for the alarm is
+ // recalculated and the expected value (called setTime here) needs adjustment to reflect this.
+ // In urel the EAlarmStateNotified state (where the NextTime for an alarm is recalculated)
+ // is never reached so the adjustement in the expected value (called setTime) is not necessary .
+
+ if (aAfterClocksGoForward && aAlarmsSetInPast)
+ {
+ setTime += TTimeIntervalDays(+7);
+ }
+#else
+ //Just to get rid of warning
+ (void)aAfterClocksGoForward;
+ (void)aAlarmsSetInPast;
+#endif
+
+ CheckTimesAreEqual(setTime, alarm.NextDueTime(), __LINE__);
+ }
+
+static void TestAlarmsWithDaylightSavingChange1L()
+//
+// Test effects of changing daylight saving on clock alarms1
+//
+ {
+ TheAlarmTest.Test().Next(_L("Initialise with daylight saving on"));
+ EnableDaylightSavingL(ETrue);
+ TheCurrentTime.HomeTime();
+ //
+ TheAlarmTest.Test().Next(_L("Setting alarms half an hour in the past"));
+ TheInitialAlarmTime = SetClockAlarms(TheCurrentTime, TTimeIntervalMinutes(-30));
+ //
+ TheAlarmTest.Test().Next(_L("Testing alarms when daylight saving is on"));
+
+ // Wait for DST to end.
+ User::After(3000000);
+ VerifyAlarmsAreCorrect(ETrue, EFalse);
+
+ //
+ TheAlarmTest.Test().Next(_L("Turning daylight saving off"));
+ EnableDaylightSavingL(EFalse);
+ //
+ TheAlarmTest.Test().Next(_L("Testing alarms when daylight saving is off"));
+
+ VerifyAlarmsAreCorrect(EFalse, ETrue);
+
+ //
+ TheAlarmTest.Test().Next(_L("Removing all alarms"));
+ TheAlarmTest.TestClearStoreL();
+ }
+
+static void TestAlarmsWithDaylightSavingChange2L()
+//
+// Test effects of changing daylight saving on clock alarms2
+//
+ {
+ TheAlarmTest.Test().Next(_L("Initialise with daylight saving off"));
+ EnableDaylightSavingL(EFalse);
+ TheCurrentTime.HomeTime();
+ //
+ TheAlarmTest.Test().Next(_L("Setting alarms an hour and a half in the future"));
+ // Used to set 30 minutes into future, but a defect in User::SetHomeTime() requires
+ // times not to be set between 31-10-2004 1.59 (BST) and 31-10-2004 1.59 (GMT).
+ TheInitialAlarmTime = SetClockAlarms(TheCurrentTime, TTimeIntervalMinutes(90));
+ //
+ TheAlarmTest.Test().Next(_L("Testing alarms with daylight saving off"));
+ testAlarmsOnForwardingClocks(EFalse, EFalse, ETrue);
+ //
+ TheAlarmTest.Test().Next(_L("Turning daylight saving on"));
+ EnableDaylightSavingL(ETrue);
+ //
+ TheAlarmTest.Test().Next(_L("Testing alarms with daylight saving on"));
+ testAlarmsOnForwardingClocks(ETrue, EFalse, EFalse);
+ //
+ TheAlarmTest.Test().Next(_L("Removing all alarms"));
+ TheAlarmTest.TestClearStoreL();
+ }
+
+//
+// Test changes in workdays
+//
+
+static void testSetWithNoWorkdays()
+//
+// Test what happens when setting a workday alarm with no workdays set
+//
+ {
+ TheAlarmTest.Test().Next(_L("Setting workday alarm with no workday set"));
+
+ // Set no workdays
+ TUint workdayMask = 0;
+ TLocale locale;
+ locale.SetWorkDays(workdayMask);
+ locale.Set();
+
+ // Have to wait a bit here because the kernel takes some time
+ // to notify client-side environment change objects and so
+ // we need to allow the alarm server to do its thing...
+ User::After(100000);
+ //
+ TInt ret = TheAlarmTest.Session().NumberOfAlarmsActiveInQueue();
+ TheAlarmTest(ret == 0, __LINE__);
+ //
+ TheOriginalTime.HomeTime();
+ TheInitialAlarmTime = TheOriginalTime;
+ TheInitialAlarmTime += TTimeIntervalHours(1);
+ //
+ TASShdAlarm alarm;
+ alarm.Message() = _L("Clock alarm in slot 0");
+ alarm.NextDueTime() = TheInitialAlarmTime;
+ alarm.RepeatDefinition() = EAlarmRepeatDefintionRepeatWorkday;
+ ret = TheAlarmTest.Session().AlarmAdd(alarm);
+ TheAlarmTest(ret == KErrNone, __LINE__);
+ TheAlarmTest(alarm.Id() != KNullAlarmId, __LINE__);
+ TheClockAlarmSlots[0] = alarm.Id();
+
+ // Test alarm state, should be disabled
+ TASShdAlarm alarm2;
+ ret = TheAlarmTest.Session().GetAlarmDetails(alarm.Id(), alarm2);
+ TheAlarmTest(ret == KErrNone, __LINE__);
+ TheAlarmTest(alarm2.Status() == EAlarmStatusDisabled, __LINE__);
+ }
+
+static void testDisabledAlarmWithWorkdays()
+//
+// Test before-disabled alarm when workdays set is changed.
+//
+ {
+ TheAlarmTest.Test().Next(_L("Testing disabled alarm when workdays set is changed"));
+
+ const TAlarmId id = TheClockAlarmSlots[0];
+ TheAlarmTest(id != KNullAlarmId, __LINE__);
+
+ //Set workdays on Monday
+ TLocale locale;
+ locale.SetWorkDays(0x1); //Monday
+ locale.Set();
+ User::After(100000);
+
+ //Make sure the status of alarm being changed to enabled automatically
+ TAlarmStatus alarmStatus;
+ TInt r = TheAlarmTest.Session().GetAlarmStatus(id, alarmStatus);
+ TheAlarmTest(r == KErrNone, __LINE__);
+ TheAlarmTest(alarmStatus == EAlarmStatusEnabled, __LINE__);
+
+ //Set the alarm manually disabled
+ alarmStatus = EAlarmStatusDisabled;
+ r = TheAlarmTest.Session().SetAlarmStatus(id, alarmStatus);
+ TheAlarmTest(r == KErrNone, __LINE__);
+ r = TheAlarmTest.Session().GetAlarmStatus(id, alarmStatus);
+ TheAlarmTest(r == KErrNone, __LINE__);
+ TheAlarmTest(alarmStatus == EAlarmStatusDisabled, __LINE__);
+
+ //Change the workday to check if it is still disabled(not be enabled automatically)
+ locale.SetWorkDays(0x2); //Tuesday
+ locale.Set();
+ User::After(100000);
+ r = TheAlarmTest.Session().GetAlarmStatus(id, alarmStatus);
+ TheAlarmTest(r == KErrNone, __LINE__);
+ TheAlarmTest(alarmStatus == EAlarmStatusDisabled, __LINE__);
+
+ //Set locale to be no workdays
+ locale.SetWorkDays(0);
+ locale.Set();
+ User::After(100000);
+ r = TheAlarmTest.Session().GetAlarmStatus(id, alarmStatus);
+ TheAlarmTest(r == KErrNone, __LINE__);
+ TheAlarmTest(alarmStatus == EAlarmStatusDisabled, __LINE__);
+
+ //Alarm should not be enabled in no workdays
+ alarmStatus = EAlarmStatusEnabled;
+ r = TheAlarmTest.Session().SetAlarmStatus(id, alarmStatus);
+ TheAlarmTest(r != KErrNone, __LINE__);
+ r = TheAlarmTest.Session().GetAlarmStatus(id, alarmStatus);
+ TheAlarmTest(r == KErrNone, __LINE__);
+ TheAlarmTest(alarmStatus == EAlarmStatusDisabled, __LINE__);
+
+ //Change the workday to check if it is still disabled(not be enabled automatically)
+ locale.SetWorkDays(0x2); //Tuesday
+ locale.Set();
+ User::After(100000);
+ r = TheAlarmTest.Session().GetAlarmStatus(id, alarmStatus);
+ TheAlarmTest(r == KErrNone, __LINE__);
+ TheAlarmTest(alarmStatus == EAlarmStatusDisabled, __LINE__);
+
+ //Alarm should not be enabled in no workdays
+ alarmStatus = EAlarmStatusEnabled;
+ r = TheAlarmTest.Session().SetAlarmStatus(id, alarmStatus);
+ TheAlarmTest(r == KErrNone, __LINE__);
+ r = TheAlarmTest.Session().GetAlarmStatus(id, alarmStatus);
+ TheAlarmTest(r == KErrNone, __LINE__);
+ TheAlarmTest(alarmStatus == EAlarmStatusEnabled, __LINE__);
+ }
+
+static void testSetWorkdays()
+//
+// Create workdays and test
+//
+ {
+ TheAlarmTest.Test().Next(_L("Creating and testing workdays"));
+ //
+ TInt todayMaskOffset = TheInitialAlarmTime.DayNoInWeek();
+ TUint workdayMask = 1;
+ //
+ for (TInt count = 0; count < 7; count++)
+ {
+ workdayMask = 1;
+ const TInt dayOfWeek = (todayMaskOffset + count) % 7;
+ workdayMask <<= dayOfWeek;
+ //
+ TLocale locale;
+ locale.SetWorkDays(workdayMask);
+ locale.Set();
+ User::After(100000);
+ //
+ const TAlarmId id = TheClockAlarmSlots[0];
+ TheAlarmTest(id != KNullAlarmId, __LINE__);
+ //
+ TASShdAlarm alarm;
+ const TInt r = TheAlarmTest.Session().GetAlarmDetails(id, alarm);
+ TheAlarmTest(r == KErrNone, __LINE__);
+ TheAlarmTest(alarm.Status() == EAlarmStatusEnabled, __LINE__);
+ //
+ TTime expectedTime = TheInitialAlarmTime;
+ expectedTime += TTimeIntervalDays(count);
+ CheckTimesAreEqual(expectedTime, alarm.NextDueTime(), __LINE__);
+ }
+ }
+
+static void testMakeAllWorkdaysL()
+//
+// Make all days workdays
+// Advance time a day at a time to test alarm for each day of the week
+//
+ {
+ TheAlarmTest.Test().Next(_L("Make all days workdays"));
+ //
+ TBuf<60> dateTimeStr;
+ _LIT(KTimeDateFormat,"%*E%*D%X%*N%*Y %1 %2 '%3 - %-B%:0%J%:1%T%:2%S%:3%+B");
+
+ const TUint workdayMask = 127;// Seven 1's
+ TLocale locale;
+ locale.SetWorkDays(workdayMask);
+ locale.Set();
+ User::After(100000);
+
+ for (TInt count = 0; count < 7; count++)
+ {
+ if (count)
+ {
+ // Advance time
+ TTime advTime(TheOriginalTime + TTimeIntervalDays(count));
+ User::SetUTCTime(advTime);
+ advTime.FormatL(dateTimeStr, KTimeDateFormat);
+ TheAlarmTest.Test().Printf(_L("Advance time : %S\n"), &dateTimeStr);
+ }
+
+ const TAlarmId id = TheClockAlarmSlots[0];
+ TheAlarmTest(id != KNullAlarmId, __LINE__);
+ //
+ TASShdAlarm alarm;
+ const TInt r = TheAlarmTest.Session().GetAlarmDetails(id, alarm);
+ TheAlarmTest(r == KErrNone, __LINE__);
+ TheAlarmTest(alarm.Status() == EAlarmStatusEnabled, __LINE__);
+ //
+ TTime expectedTime = TheInitialAlarmTime;
+ TheInitialAlarmTime.FormatL(dateTimeStr,KTimeDateFormat);
+ TheAlarmTest.Test().Printf(_L("TheInitialAlarmTime: %S\n"), &dateTimeStr);
+
+ expectedTime += TTimeIntervalDays(count);
+ //
+ const TInt days = expectedTime.DaysFrom(alarm.NextDueTime()).Int();
+
+ if (days != 0) //In that case, the next due time is within 24 hours in the past
+ {
+ expectedTime -= TTimeIntervalDays(1);
+ }
+ //
+ expectedTime.FormatL(dateTimeStr,KTimeDateFormat);
+ TheAlarmTest.Test().Printf(_L("expectedTime : %S\n"), &dateTimeStr);
+
+ alarm.NextDueTime().FormatL(dateTimeStr,KTimeDateFormat);
+ TheAlarmTest.Test().Printf(_L("NextDueTime(): %S\n"), &dateTimeStr);
+
+ CheckTimesAreEqual(expectedTime, alarm.NextDueTime(), __LINE__);
+ }
+ }
+
+static void testRemoveWorkdays()
+//
+// Remove all workdays and test
+//
+ {
+ const TAlarmId id = TheClockAlarmSlots[0];
+ TheAlarmTest(id != KNullAlarmId, __LINE__);
+ //
+ TLocale locale;
+ locale.SetWorkDays(0);
+ locale.Set();
+ User::After(100000);
+ //
+ TASShdAlarm alarm;
+ const TInt r = TheAlarmTest.Session().GetAlarmDetails(id, alarm);
+ //
+ TheAlarmTest(r == KErrNone, __LINE__);
+ TheAlarmTest(alarm.Status() == EAlarmStatusDisabled, __LINE__);
+ }
+
+static void testLocaleChangeWorkdaysL()
+//
+// Test effects of changing workdays on alarms
+//
+ {
+ TheAlarmTest.TestClearStoreL();
+ testSetWithNoWorkdays();
+ testDisabledAlarmWithWorkdays();
+ testSetWorkdays();
+ testMakeAllWorkdaysL();
+ testRemoveWorkdays();
+ TheAlarmTest.TestClearStoreL();
+ }
+
+static void test24HourToOnceOnlyAlarms()
+ {
+ TheAlarmTest.Test().Next(_L("Test update of 24 hour alarms to once only alarms"));
+
+ // Next 24 hour alarms which are more than 1 day in the future after a system time
+ // update should be updated to once only alarms
+
+ // Set 'next 24 hour' alarms due in 5, just under and over 18, and 21 hours time
+ TTime now;
+ now.HomeTime();
+ TTime alarmTime(now);
+
+ TASShdAlarm alarm;
+ alarm.RepeatDefinition() = EAlarmRepeatDefintionRepeatNext24Hours;
+
+ alarmTime += TTimeIntervalHours(5);
+ alarm.NextDueTime() = alarmTime;
+ TheAlarmTest(TheAlarmTest.Session().AlarmAdd(alarm) == KErrNone, __LINE__);
+ TAlarmId id1 = alarm.Id();
+ TheAlarmTest(id1 != KNullAlarmId, __LINE__);
+
+ alarmTime += TTimeIntervalHours(13);
+ alarmTime -= TTimeIntervalMinutes(1);
+ alarm.NextDueTime() = alarmTime;
+ TheAlarmTest(TheAlarmTest.Session().AlarmAdd(alarm) == KErrNone, __LINE__);
+ TAlarmId id2 = alarm.Id();
+ TheAlarmTest(id2 != KNullAlarmId, __LINE__);
+
+ alarmTime += TTimeIntervalMinutes(2);
+ alarm.NextDueTime() = alarmTime;
+ TheAlarmTest(TheAlarmTest.Session().AlarmAdd(alarm) == KErrNone, __LINE__);
+ TAlarmId id3 = alarm.Id();
+ TheAlarmTest(id3 != KNullAlarmId, __LINE__);
+
+ alarmTime += TTimeIntervalHours(3);
+ alarm.NextDueTime() = alarmTime;
+ TheAlarmTest(TheAlarmTest.Session().AlarmAdd(alarm) == KErrNone, __LINE__);
+ TAlarmId id4 = alarm.Id();
+ TheAlarmTest(id4 != KNullAlarmId, __LINE__);
+
+ // Set system time back 6 hours - alarms are now due in 11, just under and over 24, and 27 hours
+
+ SetHomeTime(now - TTimeIntervalHours(6));
+
+ User::After(KTimeToWait);
+
+ TheAlarmTest(TheAlarmTest.Session().GetAlarmDetails(id1,alarm) == KErrNone, __LINE__);
+ TheAlarmTest(alarm.RepeatDefinition() == EAlarmRepeatDefintionRepeatNext24Hours, __LINE__);
+ TheAlarmTest(TheAlarmTest.Session().GetAlarmDetails(id2,alarm) == KErrNone, __LINE__);
+ TheAlarmTest(alarm.RepeatDefinition() == EAlarmRepeatDefintionRepeatNext24Hours, __LINE__);
+ TheAlarmTest(TheAlarmTest.Session().GetAlarmDetails(id3,alarm) == KErrNone, __LINE__);
+ TheAlarmTest(alarm.RepeatDefinition() == EAlarmRepeatDefintionRepeatOnce, __LINE__);
+ TheAlarmTest(TheAlarmTest.Session().GetAlarmDetails(id4,alarm) == KErrNone, __LINE__);
+ TheAlarmTest(alarm.RepeatDefinition() == EAlarmRepeatDefintionRepeatOnce, __LINE__);
+ }
+
+static void testAlarmPersistenceAfterSystemTimeUpdateL()
+ {
+ // Following a system time update, queued alarms may or may not
+ // be removed, depending on the following conditions
+ //
+ // * EAlarmRepeatDefintionRepeatOnce
+ // * EAlarmRepeatDefintionRepeatNext24Hours
+ // Alarm is removed if more than 1 day in the past
+ //
+ // * EAlarmRepeatDefintionRepeatDaily
+ // * EAlarmRepeatDefintionRepeatWorkday
+ // * EAlarmRepeatDefintionRepeatWeekly
+ // All repeating alarms queue the next repeat of the alarm
+
+ TheAlarmTest.Test().Next(_L("update system time whilst alarm notifying"));
+
+#if defined(_DEBUG)
+ TheAlarmTest.Session().__DbgPreventUserNotify(ETrue);
+#define KAlarmStateNotify EAlarmStateNotified
+#else
+#define KAlarmStateNotify EAlarmStateNotifying
+#endif
+
+
+ for (TInt ii = 0; ii < 4; ++ii)
+ {
+ // Get current alarm counts
+ TInt previousQueued = TheAlarmTest.Session().AlarmCountByState(EAlarmStateQueued);
+ TInt previousNotifying = TheAlarmTest.Session().AlarmCountByState(KAlarmStateNotify) +
+ TheAlarmTest.Session().AlarmCountByState(EAlarmStateWaitingToNotify);
+
+ TTime time;
+ SafeHomeTime(time);
+ time += TTimeIntervalSeconds(2);
+
+ TTime systemTime(time);
+
+ switch (ii)
+ {
+ case 0:
+ TheAlarmTest.Test().Next(_L("set time back 1 hour"));
+ systemTime -= TTimeIntervalHours(1);
+ break;
+ case 1:
+ TheAlarmTest.Test().Next(_L("set time forward 1 hour"));
+ systemTime += TTimeIntervalHours(1);
+ break;
+ case 2:
+ TheAlarmTest.Test().Next(_L("set time back 2 days"));
+ systemTime -= TTimeIntervalDays(2);
+ break;
+ case 3:
+ TheAlarmTest.Test().Next(_L("set time forward 2 days"));
+ systemTime += TTimeIntervalDays(2);
+ break;
+ default:
+ TheAlarmTest(EFalse, __LINE__);
+ break;
+ }
+
+ // add an alarm of each repeat type due now
+ TASShdAlarm alarm;
+
+ alarm.NextDueTime() = time;
+ alarm.RepeatDefinition() = EAlarmRepeatDefintionRepeatOnce;
+ TheAlarmTest(TheAlarmTest.Session().AlarmAdd(alarm) == KErrNone, __LINE__);
+ TAlarmId idOnce = alarm.Id();
+ TheAlarmTest(idOnce != KNullAlarmId, __LINE__);
+
+ alarm.NextDueTime() = time;
+ alarm.RepeatDefinition() = EAlarmRepeatDefintionRepeatNext24Hours;
+ TheAlarmTest(TheAlarmTest.Session().AlarmAdd(alarm) == KErrNone, __LINE__);
+ TAlarmId id24hr = alarm.Id();
+ TheAlarmTest(id24hr != KNullAlarmId, __LINE__);
+
+ alarm.NextDueTime() = time;
+ alarm.RepeatDefinition() = EAlarmRepeatDefintionRepeatDaily;
+ TheAlarmTest(TheAlarmTest.Session().AlarmAdd(alarm) == KErrNone, __LINE__);
+ TAlarmId idDaily = alarm.Id();
+ TheAlarmTest(idDaily != KNullAlarmId, __LINE__);
+
+ alarm.NextDueTime() = time;
+ alarm.RepeatDefinition() = EAlarmRepeatDefintionRepeatWorkday;
+ TheAlarmTest(TheAlarmTest.Session().AlarmAdd(alarm) == KErrNone, __LINE__);
+ TAlarmId idWorkday = alarm.Id();
+ TheAlarmTest(idWorkday != KNullAlarmId, __LINE__);
+
+ alarm.NextDueTime() = time;
+ alarm.RepeatDefinition() = EAlarmRepeatDefintionRepeatWeekly;
+ TheAlarmTest(TheAlarmTest.Session().AlarmAdd(alarm) == KErrNone, __LINE__);
+ TAlarmId idWeekly = alarm.Id();
+ TheAlarmTest(idWeekly != KNullAlarmId, __LINE__);
+
+ TInt queued = TheAlarmTest.Session().AlarmCountByState(EAlarmStateQueued);
+ TInt notifying = TheAlarmTest.Session().AlarmCountByState(KAlarmStateNotify) +
+ TheAlarmTest.Session().AlarmCountByState(EAlarmStateWaitingToNotify);
+ TheAlarmTest(queued == previousQueued + 5, __LINE__);
+ TheAlarmTest(notifying == previousNotifying, __LINE__);
+
+ // wait for the alarms to go off
+ User::After(10 * KTimeToWait);
+ queued = TheAlarmTest.Session().AlarmCountByState(EAlarmStateQueued);
+ notifying = TheAlarmTest.Session().AlarmCountByState(KAlarmStateNotify) +
+ TheAlarmTest.Session().AlarmCountByState(EAlarmStateWaitingToNotify);
+ TheAlarmTest(queued == previousQueued + 4, __LINE__);
+ TheAlarmTest(notifying == previousNotifying + 1, __LINE__);
+
+ // update the system time
+
+ SetHomeTime(systemTime);
+
+ User::After(KTimeToWait);
+
+ // check the queue of alarms
+ queued = TheAlarmTest.Session().AlarmCountByState(EAlarmStateQueued);
+ notifying = TheAlarmTest.Session().AlarmCountByState(KAlarmStateNotify) +
+ TheAlarmTest.Session().AlarmCountByState(EAlarmStateWaitingToNotify);
+
+ switch (ii)
+ {
+ case 0: // set time back 1 hour
+ case 1: // set time forward 1 hour
+ case 2: // set time back 2 days
+ {
+ // No alarms should be removed
+ TheAlarmTest(queued == previousQueued + 4, __LINE__);
+ TheAlarmTest(notifying == previousNotifying + 1, __LINE__);
+ TheAlarmTest(TheAlarmTest.Session().GetAlarmDetails(idOnce,alarm) == KErrNone, __LINE__);
+ TheAlarmTest(alarm.State() == EAlarmStateQueued || alarm.State() == KAlarmStateNotify || alarm.State() == EAlarmStateWaitingToNotify, __LINE__);
+ TheAlarmTest(TheAlarmTest.Session().GetAlarmDetails(id24hr,alarm) == KErrNone, __LINE__);
+ TheAlarmTest(alarm.State() == EAlarmStateQueued || alarm.State() == KAlarmStateNotify || alarm.State() == EAlarmStateWaitingToNotify, __LINE__);
+ TheAlarmTest(TheAlarmTest.Session().GetAlarmDetails(idDaily,alarm) == KErrNone, __LINE__);
+ TheAlarmTest(alarm.State() == EAlarmStateQueued || alarm.State() == KAlarmStateNotify || alarm.State() == EAlarmStateWaitingToNotify, __LINE__);
+ TheAlarmTest(TheAlarmTest.Session().GetAlarmDetails(idWorkday,alarm) == KErrNone, __LINE__);
+ TheAlarmTest(alarm.State() == EAlarmStateQueued || alarm.State() == KAlarmStateNotify || alarm.State() == EAlarmStateWaitingToNotify, __LINE__);
+ TheAlarmTest(TheAlarmTest.Session().GetAlarmDetails(idWeekly,alarm) == KErrNone, __LINE__);
+ TheAlarmTest(alarm.State() == EAlarmStateQueued || alarm.State() == KAlarmStateNotify || alarm.State() == EAlarmStateWaitingToNotify, __LINE__);
+ break;
+ }
+ case 3: // set time forward 2 days
+ {
+ // once only and 24hr alarms should be removed
+ TheAlarmTest(queued + notifying == previousQueued + previousNotifying + 3, __LINE__);
+ TheAlarmTest(TheAlarmTest.Session().GetAlarmDetails(idOnce,alarm) == KErrNotFound, __LINE__);
+ TheAlarmTest(TheAlarmTest.Session().GetAlarmDetails(id24hr,alarm) == KErrNotFound, __LINE__);
+ TheAlarmTest(TheAlarmTest.Session().GetAlarmDetails(idDaily,alarm) == KErrNone, __LINE__);
+ TheAlarmTest(alarm.State() == EAlarmStateQueued || alarm.State() == KAlarmStateNotify || alarm.State() == EAlarmStateWaitingToNotify, __LINE__);
+ TheAlarmTest(TheAlarmTest.Session().GetAlarmDetails(idWorkday,alarm) == KErrNone, __LINE__);
+ TheAlarmTest(alarm.State() == EAlarmStateQueued || alarm.State() == KAlarmStateNotify || alarm.State() == EAlarmStateWaitingToNotify, __LINE__);
+ TheAlarmTest(TheAlarmTest.Session().GetAlarmDetails(idWeekly,alarm) == KErrNone, __LINE__);
+ TheAlarmTest(alarm.State() == EAlarmStateQueued || alarm.State() == KAlarmStateNotify || alarm.State() == EAlarmStateWaitingToNotify, __LINE__);
+ break;
+ }
+ default:
+ TheAlarmTest(EFalse, __LINE__);
+ break;
+ }
+
+ TheAlarmTest.Session().AlarmDelete(idOnce);
+ TheAlarmTest.Session().AlarmDelete(id24hr);
+ TheAlarmTest.Session().AlarmDelete(idDaily);
+ TheAlarmTest.Session().AlarmDelete(idWorkday);
+ TheAlarmTest.Session().AlarmDelete(idWeekly);
+ }
+ }
+
+static TTime SetUtcClockAlarms(const TTime& aBaseTime, const TTimeIntervalMinutes& aOffset)
+//
+// Set Alarms.
+// Extra alarm when putting clocks back to see what happen to
+// weekly alarm set for 6 days & 23 1/2 hours time
+//
+ {
+ TInt r;
+ TASShdAlarm alarm;
+ const TInt n = TheAlarmTest.Session().NumberOfAlarmsActiveInQueue();
+ TheAlarmTest(n == 0, __LINE__);
+ TBuf<KMaxAlarmMessageLength> message;
+ //
+ TTime timeForAlarms(aBaseTime);
+ timeForAlarms += aOffset;
+
+ // Once Only
+ alarm.Reset();
+ message.Num(0);
+ alarm.Message()=message;
+ alarm.SetUtcNextDueTime(timeForAlarms);
+ alarm.RepeatDefinition()=(EAlarmRepeatDefintionRepeatOnce);
+ r = TheAlarmTest.Session().AlarmAdd(alarm);
+ TheAlarmTest(r == KErrNone, __LINE__);
+ TheClockAlarmSlots[0] = alarm.Id();
+
+ // Next 24 hours
+ alarm.Reset();
+ message.Num(1);
+ alarm.Message()=(message);
+ alarm.SetUtcNextDueTime(timeForAlarms);
+ alarm.RepeatDefinition()=(EAlarmRepeatDefintionRepeatNext24Hours);
+ r = TheAlarmTest.Session().AlarmAdd(alarm);
+ TheAlarmTest(r == KErrNone, __LINE__);
+ TheClockAlarmSlots[1] = alarm.Id();
+
+ // Clock daily
+ alarm.Reset();
+ message.Num(2);
+ alarm.Message()=(message);
+ alarm.SetUtcNextDueTime(timeForAlarms);
+ alarm.RepeatDefinition()=(EAlarmRepeatDefintionRepeatDaily);
+ r = TheAlarmTest.Session().AlarmAdd(alarm);
+ TheAlarmTest(r == KErrNone, __LINE__);
+ TheClockAlarmSlots[2] = alarm.Id();
+
+ // Clock weekly
+ alarm.Reset();
+ message.Num(3);
+ alarm.Message()=message;
+ alarm.SetUtcNextDueTime(timeForAlarms);
+ alarm.RepeatDefinition()=EAlarmRepeatDefintionRepeatWeekly;
+ r = TheAlarmTest.Session().AlarmAdd(alarm);
+ TheAlarmTest(r == KErrNone, __LINE__);
+ TheClockAlarmSlots[3] = alarm.Id();
+
+ if (aOffset.Int() < 0)
+ {
+ TheExtendedAlarmTime = timeForAlarms;
+ TheExtendedAlarmTime += TTimeIntervalDays(7);
+ message.Num(4);
+ alarm.Message()=message;
+ alarm.RepeatDefinition()=EAlarmRepeatDefintionRepeatWeekly;
+ alarm.SetUtcNextDueTime(TheExtendedAlarmTime);
+ r = TheAlarmTest.Session().AlarmAdd(alarm);
+ TheAlarmTest(r == KErrNone, __LINE__);
+ TheClockAlarmSlots[4] = alarm.Id();
+ }
+ return timeForAlarms;
+ }
+
+/**
+Checks that the alarms are correct.
+
+//
+// We expect and test that:
+//
+// 1) Once alarm to remain unchanged at initial alarm time
+// unless allowed time to complete.
+//
+// 2) Next24 to advance to the first 'initial alarm time'
+// falling due after the original time
+//
+// 3a) If before clocks go back, Weekly (set previously) to
+// advance to the 'initial alarm time' in the next week
+//
+// 3b) If after clocks go back, Weekly (set previously) to
+// return to the 'initial alarm time' in the current week
+//
+// 4a) If before clocks go back, Weekly (set for next week)
+// to remain at the 'extended alarm time' in the next week
+//
+// 4b) If after clocks go back, Weekly (set for next week) to
+// move back to 'initial alarm time' in the current week
+//
+
+@param aInterveningOffsetChange True when a change in the UTC offset occurs
+between setting the alarms and testing them.
+@param aOnceCompleted True if the "Repeat Once" alarm has completed.
+@internalComponent
+*/
+static void VerifyUtcAlarmsAreCorrect(TBool aInterveningOffsetChange, TBool aOnceCompleted)
+ {
+ TInt ret;
+ TTime setTime;
+ TASShdAlarm alarm;
+ TAlarmId alarmId;
+ TTime time;
+ time.UniversalTime();
+
+ // Check Once repeat if it has not completed.
+ if (!aOnceCompleted)
+ {
+ alarmId = TheClockAlarmSlots[0];
+ TheAlarmTest(alarmId != KNullAlarmId, __LINE__);
+ ret = TheAlarmTest.Session().GetAlarmDetails(alarmId, alarm);
+ TheAlarmTest(ret == KErrNone, __LINE__);
+ CheckTimesAreEqual(TheInitialAlarmTime, alarm.NextDueTime(), __LINE__);
+ }
+
+ // Check Next 24 hours repeat
+ alarmId = TheClockAlarmSlots[1];
+ TheAlarmTest(alarmId != KNullAlarmId, __LINE__);
+ ret = TheAlarmTest.Session().GetAlarmDetails(alarmId, alarm);
+ TheAlarmTest(ret == KErrNone, __LINE__);
+ setTime = TheInitialAlarmTime;
+
+ if (aInterveningOffsetChange)
+ {
+ // The alarm was set in the past, so add repeat interval.
+ setTime += TTimeIntervalHours(+24);
+ }
+
+ CheckTimesAreEqual(setTime, alarm.NextDueTime(), __LINE__);
+
+ // Check daily repeat
+ alarmId = TheClockAlarmSlots[2];
+ TheAlarmTest(alarmId != KNullAlarmId, __LINE__);
+ ret = TheAlarmTest.Session().GetAlarmDetails(alarmId, alarm);
+ TheAlarmTest(ret == KErrNone, __LINE__);
+ setTime = TheInitialAlarmTime;
+
+ if (aInterveningOffsetChange)
+ {
+ // The alarm was set in the past, so add repeat interval.
+ setTime += TTimeIntervalHours(+24);
+ }
+
+ CheckTimesAreEqual(setTime, alarm.NextDueTime(), __LINE__);
+
+ // Check weekly repeat
+ alarmId = TheClockAlarmSlots[3];
+ TheAlarmTest(alarmId != KNullAlarmId, __LINE__);
+ ret = TheAlarmTest.Session().GetAlarmDetails(alarmId, alarm);
+ TheAlarmTest(ret == KErrNone, __LINE__);
+ setTime = TheInitialAlarmTime;
+
+ if (aInterveningOffsetChange)
+ {
+ // The alarm was set in the past, so add repeat interval.
+ setTime += TTimeIntervalDays(+7);
+ }
+
+ CheckTimesAreEqual(setTime, alarm.NextDueTime(), __LINE__);
+
+ // Check weekly repeat
+ alarmId = TheClockAlarmSlots[4];
+ TheAlarmTest(alarmId != KNullAlarmId, __LINE__);
+ ret = TheAlarmTest.Session().GetAlarmDetails(alarmId, alarm);
+ TheAlarmTest(ret == KErrNone, __LINE__);
+
+ if (aInterveningOffsetChange)
+ {
+ setTime = TheExtendedAlarmTime;
+ }
+ else
+ {
+ setTime = TheInitialAlarmTime;
+ }
+
+ CheckTimesAreEqual(setTime, alarm.NextDueTime(), __LINE__);
+ }
+
+static void testUtcAlarmsOnForwardingClocks(TBool aAfterClocksGoForward, TBool aAlarmsSetInPast, TBool aAlarmsShouldAllBeQueued = ETrue)
+//
+// We expect and test that:
+// 1) Once alarm to remain unchanged at 'initial alarm time'
+// 2) Next24 to remain at the 'initial alarm time'
+// 3a) If before clocks go forward, Weekly to remain at the
+// 'initial alarm time'
+// 3b) If after clocks go forward, Weekly to advance to 'initial
+// alarm time' in the next week
+//
+ {
+ TInt ret;
+ TASShdAlarm alarm;
+ TAlarmId alarmId;
+ TTime setTime;
+
+ // Check Once repeat
+ alarmId = TheClockAlarmSlots[0];
+ ret = TheAlarmTest.Session().GetAlarmDetails(alarmId, alarm);
+ setTime = TheInitialAlarmTime;
+
+ if (aAlarmsShouldAllBeQueued)
+ {
+ TheAlarmTest(ret == KErrNone, __LINE__);
+ }
+
+ if (ret == KErrNone && alarm.Status() == EAlarmStatusEnabled)
+ {
+ CheckTimesAreEqual(setTime, alarm.NextDueTime(), __LINE__);
+ }
+
+ // Check Next 24 hours repeat
+ alarmId = TheClockAlarmSlots[1];
+ ret = TheAlarmTest.Session().GetAlarmDetails(alarmId, alarm);
+ setTime = TheInitialAlarmTime;
+
+ if (aAlarmsShouldAllBeQueued)
+ {
+ TheAlarmTest(ret == KErrNone, __LINE__);
+ }
+
+ if (ret == KErrNone && alarm.Status() == EAlarmStatusEnabled)
+ {
+ CheckTimesAreEqual(setTime, alarm.NextDueTime(), __LINE__);
+ }
+
+ // Check daily repeat
+ alarmId = TheClockAlarmSlots[2];
+ TheAlarmTest(alarmId != KNullAlarmId, __LINE__);
+ ret = TheAlarmTest.Session().GetAlarmDetails(alarmId, alarm);
+ setTime = TheInitialAlarmTime;
+
+ if (aAlarmsShouldAllBeQueued)
+ {
+ TheAlarmTest(ret == KErrNone, __LINE__);
+ }
+
+ CheckTimesAreEqual(setTime, alarm.NextDueTime(), __LINE__);
+
+ // Check weekly repeat
+ alarmId = TheClockAlarmSlots[3];
+ TheAlarmTest(alarmId != KNullAlarmId, __LINE__);
+ ret = TheAlarmTest.Session().GetAlarmDetails(alarmId, alarm);
+
+ if (aAlarmsShouldAllBeQueued)
+ {
+ TheAlarmTest(ret == KErrNone, __LINE__);
+ }
+ //
+ setTime=TheInitialAlarmTime;
+
+#if defined(_DEBUG)
+ // In udeb the alarm goes from the state EAlarmStateQueued to the state EAlarmStateNotified
+ // (skipping the state ENotifying).In EAlarmStateNotified the nextTime for the alarm is
+ // recalculated and the expected value (called setTime here) needs adjustmentto reflect this.
+ // In urel the the EAlarmStateNotified state (where the NextTime for an alarm is recalculated)
+ // is never reached so the adjustement in the expected value (called setTime)is not necessary .
+ if (aAfterClocksGoForward && aAlarmsSetInPast)
+ {
+ setTime += TTimeIntervalDays(+7);
+ }
+#else
+ //Just to get rid of warning
+ (void)aAfterClocksGoForward;
+ (void)aAlarmsSetInPast;
+#endif
+
+ CheckTimesAreEqual(setTime, alarm.NextDueTime(), __LINE__);
+ }
+
+static void TestUtcAlarmsWithDaylightSavingChange1L()
+//
+// Test effects of changing daylight saving on clock alarms1
+//
+ {
+ TheAlarmTest.Test().Next(_L("Initialise with daylight saving on"));
+ EnableDaylightSavingL(ETrue);
+ TheCurrentTime.UniversalTime();
+ //
+ TheAlarmTest.Test().Next(_L("Setting UTC alarms half an hour in the past"));
+ TheInitialAlarmTime = SetUtcClockAlarms(TheCurrentTime, TTimeIntervalMinutes(-30));
+ //
+ TheAlarmTest.Test().Next(_L("Testing UTC alarms when daylight saving is on"));
+ VerifyUtcAlarmsAreCorrect(ETrue, EFalse);
+ //
+ TheAlarmTest.Test().Next(_L("Turning daylight saving off"));
+ EnableDaylightSavingL(EFalse);
+ //
+ TheAlarmTest.Test().Next(_L("Testing UTC alarms when daylight saving is off"));
+ VerifyUtcAlarmsAreCorrect(ETrue, ETrue);
+ //
+ TheAlarmTest.Test().Next(_L("Removing all alarms"));
+ TheAlarmTest.TestClearStoreL();
+ }
+
+static void TestUtcAlarmsWithDaylightSavingChange2L()
+//
+// Test effects of changing daylight saving on clock alarms2
+//
+ {
+ TheAlarmTest.Test().Next(_L("Initialise with daylight saving off"));
+ EnableDaylightSavingL(EFalse);
+ TheCurrentTime.UniversalTime();
+ //
+ TheAlarmTest.Test().Next(_L("Setting UTC alarms an hour and a half in the future"));
+ // Used to set 30 minutes into future, but a defect in User::SetHomeTime() requires times
+ // not to be set between 31-10-2004 1.59 (BST) and 31-10-2004 1.59 (GMT).
+ TheInitialAlarmTime = SetUtcClockAlarms(TheCurrentTime, TTimeIntervalMinutes(90));
+ //
+ TheAlarmTest.Test().Next(_L("Testing UTC alarms with daylight saving off"));
+ testUtcAlarmsOnForwardingClocks(EFalse, EFalse, ETrue);
+ //
+ TheAlarmTest.Test().Next(_L("Turning daylight saving on"));
+ EnableDaylightSavingL(ETrue);
+ //
+ TheAlarmTest.Test().Next(_L("Testing alarms with daylight saving on"));
+ testUtcAlarmsOnForwardingClocks(ETrue, EFalse, EFalse);
+ //
+ TheAlarmTest.Test().Next(_L("Removing all UTC alarms"));
+ TheAlarmTest.TestClearStoreL();
+ }
+
+//
+// Test changes in workdays
+//
+
+static void testSetWithNoWorkdaysUtc()
+//
+// Test what happens when setting a workday alarm with no workdays set
+//
+ {
+ TheAlarmTest.Test().Next(_L("Setting workday UTC alarm with no workday set"));
+
+ // Set no workdays
+ TUint workdayMask = 0;
+ TLocale locale;
+ locale.SetWorkDays(workdayMask);
+ locale.Set();
+
+ // Have to wait a bit here because the kernel takes some time
+ // to notify client-side environment change objects and so
+ // we need to allow the alarm server to do its thing...
+ User::After(100000);
+ //
+ TInt ret = TheAlarmTest.Session().NumberOfAlarmsActiveInQueue();
+ TheAlarmTest(ret == 0, __LINE__);
+ //
+ TheOriginalTime.UniversalTime();
+ TheInitialAlarmTime = TheOriginalTime;
+ TheInitialAlarmTime += TTimeIntervalHours(1);
+ //
+ TASShdAlarm alarm;
+ alarm.Message()=(_L("Clock alarm in slot 0"));
+ alarm.SetUtcNextDueTime(TheInitialAlarmTime);
+ alarm.RepeatDefinition()=EAlarmRepeatDefintionRepeatWorkday;
+ ret = TheAlarmTest.Session().AlarmAdd(alarm);
+ TheAlarmTest(ret == KErrNone, __LINE__);
+ TheAlarmTest(alarm.Id() != KNullAlarmId, __LINE__);
+ TheClockAlarmSlots[0] = alarm.Id();
+
+ // Test alarm state, should be disabled
+ TASShdAlarm alarm2;
+ ret = TheAlarmTest.Session().GetAlarmDetails(alarm.Id(), alarm2);
+ TheAlarmTest(ret == KErrNone, __LINE__);
+ TheAlarmTest(alarm2.Status() == EAlarmStatusDisabled, __LINE__);
+ }
+
+static void testSetWorkdaysUtc()
+//
+// Create workdays and test
+//
+ {
+ TheAlarmTest.Test().Next(_L("Creating and testing workdays"));
+ //
+ TInt todayMaskOffset = TheInitialAlarmTime.DayNoInWeek();
+ TUint workdayMask = 1;
+ //
+ for (TInt count = 0; count < 7; count++)
+ {
+ workdayMask = 1;
+ const TInt dayOfWeek = (todayMaskOffset+count)%7;
+ workdayMask <<= dayOfWeek;
+ //
+ TLocale locale;
+ locale.SetWorkDays(workdayMask);
+ locale.Set();
+ User::After(100000);
+ //
+ const TAlarmId id = TheClockAlarmSlots[0];
+ TheAlarmTest(id != KNullAlarmId, __LINE__);
+ //
+ TASShdAlarm alarm;
+ const TInt r = TheAlarmTest.Session().GetAlarmDetails(id, alarm);
+ TheAlarmTest(r == KErrNone, __LINE__);
+ TheAlarmTest(alarm.Status() == EAlarmStatusEnabled, __LINE__);
+ //
+ TTime expectedTime = TheInitialAlarmTime;
+ expectedTime += TTimeIntervalDays(count);
+ CheckTimesAreEqual(expectedTime, alarm.NextDueTime(), __LINE__);
+ }
+ }
+
+static void testMakeAllWorkdaysUtcL()
+//
+// Make all days workdays
+// Advance time a day at a time to test alarm for each day of the week
+//
+ {
+ TheAlarmTest.Test().Next(_L("Make all days workdays"));
+ //
+ TBuf<60> dateTimeStr;
+ _LIT(KTimeDateFormat,"%*E%*D%X%*N%*Y %1 %2 '%3 - %-B%:0%J%:1%T%:2%S%:3%+B");
+
+ const TUint workdayMask = 127;// Seven 1's
+ TLocale locale;
+ locale.SetWorkDays(workdayMask);
+ locale.Set();
+ User::After(100000);
+
+ for (TInt count = 0; count < 7; count++)
+ {
+ if (count)
+ {
+ // Advance time
+ TTime advTime(TheOriginalTime + TTimeIntervalDays(count));
+ User::SetUTCTime(advTime);
+ advTime.FormatL(dateTimeStr, KTimeDateFormat);
+ TheAlarmTest.Test().Printf(_L("Advance time : %S\n"), &dateTimeStr);
+ }
+
+ const TAlarmId id = TheClockAlarmSlots[0];
+ TheAlarmTest(id != KNullAlarmId, __LINE__);
+ //
+ TASShdAlarm alarm;
+ const TInt r = TheAlarmTest.Session().GetAlarmDetails(id, alarm);
+ TheAlarmTest(r == KErrNone, __LINE__);
+ TheAlarmTest(alarm.Status() == EAlarmStatusEnabled, __LINE__);
+ //
+ TTime expectedTime = TheInitialAlarmTime;
+ TheInitialAlarmTime.FormatL(dateTimeStr,KTimeDateFormat);
+ TheAlarmTest.Test().Printf(_L("TheInitialAlarmTime: %S\n"), &dateTimeStr);
+
+ expectedTime += TTimeIntervalDays(count);
+ //
+ const TInt days = expectedTime.DaysFrom(alarm.NextDueTime()).Int();
+
+ if (days != 0) //In that case, the next due time is within 24 hours in the past
+ {
+ expectedTime -= TTimeIntervalDays(1);
+ }
+
+ expectedTime.FormatL(dateTimeStr,KTimeDateFormat);
+ TheAlarmTest.Test().Printf(_L("expectedTime : %S\n"), &dateTimeStr);
+
+ alarm.NextDueTime().FormatL(dateTimeStr,KTimeDateFormat);
+ TheAlarmTest.Test().Printf(_L("NextDueTime(): %S\n"), &dateTimeStr);
+
+ CheckTimesAreEqual(expectedTime, alarm.NextDueTime(), __LINE__);
+ }
+ }
+
+static void testRemoveWorkdaysUtc()
+//
+// Remove all workdays and test
+//
+ {
+ const TAlarmId id = TheClockAlarmSlots[0];
+ TheAlarmTest(id != KNullAlarmId, __LINE__);
+ //
+ TLocale locale;
+ locale.SetWorkDays(0);
+ locale.Set();
+ User::After(100000);
+ //
+ TASShdAlarm alarm;
+ const TInt r = TheAlarmTest.Session().GetAlarmDetails(id, alarm);
+ //
+ TheAlarmTest(r == KErrNone, __LINE__);
+ TheAlarmTest(alarm.Status() == EAlarmStatusDisabled, __LINE__);
+ }
+
+static void testLocaleChangeWorkdaysUtcL()
+//
+// Test effects of changing workdays on alarms
+//
+ {
+ TheAlarmTest.TestClearStoreL();
+ testSetWithNoWorkdaysUtc();
+ testSetWorkdaysUtc();
+ testMakeAllWorkdaysUtcL();
+ testRemoveWorkdaysUtc();
+ TheAlarmTest.TestClearStoreL();
+ }
+
+static void test24HourToOnceOnlyUtcAlarms()
+ {
+ TheAlarmTest.Test().Next(_L("Test update of 24 hour alarms to once only alarms"));
+
+ // Next 24 hour alarms which are more than 1 day in the future after a system time
+ // update should be updated to once only alarms
+
+ // Set 'next 24 hour' alarms due in 5, just under and over 18, and 21 hours time
+ TTime now;
+ now.UniversalTime();
+ TTime alarmTime(now);
+
+ TASShdAlarm alarm;
+ alarm.RepeatDefinition()=EAlarmRepeatDefintionRepeatNext24Hours;
+
+ alarmTime += TTimeIntervalHours(5);
+ alarm.SetUtcNextDueTime(alarmTime);
+ TheAlarmTest(TheAlarmTest.Session().AlarmAdd(alarm) == KErrNone, __LINE__);
+ TAlarmId id1 = alarm.Id();
+ TheAlarmTest(id1 != KNullAlarmId, __LINE__);
+
+ alarmTime += TTimeIntervalHours(13);
+ alarmTime -= TTimeIntervalMinutes(1);
+ alarm.SetUtcNextDueTime(alarmTime);
+ TheAlarmTest(TheAlarmTest.Session().AlarmAdd(alarm) == KErrNone, __LINE__);
+ TAlarmId id2 = alarm.Id();
+ TheAlarmTest(id2 != KNullAlarmId, __LINE__);
+
+ alarmTime += TTimeIntervalMinutes(2);
+ alarm.SetUtcNextDueTime(alarmTime);
+ TheAlarmTest(TheAlarmTest.Session().AlarmAdd(alarm) == KErrNone, __LINE__);
+ TAlarmId id3 = alarm.Id();
+ TheAlarmTest(id3 != KNullAlarmId, __LINE__);
+
+ alarmTime += TTimeIntervalHours(3);
+ alarm.SetUtcNextDueTime(alarmTime);
+ TheAlarmTest(TheAlarmTest.Session().AlarmAdd(alarm) == KErrNone, __LINE__);
+ TAlarmId id4 = alarm.Id();
+ TheAlarmTest(id4 != KNullAlarmId, __LINE__);
+
+ // Set system time back 6 hours - alarms are now due in 11, just under and over 24, and 27 hours
+
+ now -= TTimeIntervalHours(6);
+ User::SetUTCTime(now);
+
+ User::After(KTimeToWait);
+
+ TheAlarmTest(TheAlarmTest.Session().GetAlarmDetails(id1,alarm) == KErrNone, __LINE__);
+ TheAlarmTest(alarm.RepeatDefinition() == EAlarmRepeatDefintionRepeatNext24Hours, __LINE__);
+ TheAlarmTest(TheAlarmTest.Session().GetAlarmDetails(id2,alarm) == KErrNone, __LINE__);
+ TheAlarmTest(alarm.RepeatDefinition() == EAlarmRepeatDefintionRepeatNext24Hours, __LINE__);
+ TheAlarmTest(TheAlarmTest.Session().GetAlarmDetails(id3,alarm) == KErrNone, __LINE__);
+ TheAlarmTest(alarm.RepeatDefinition() == EAlarmRepeatDefintionRepeatOnce, __LINE__);
+ TheAlarmTest(TheAlarmTest.Session().GetAlarmDetails(id4,alarm) == KErrNone, __LINE__);
+ TheAlarmTest(alarm.RepeatDefinition() == EAlarmRepeatDefintionRepeatOnce, __LINE__);
+ }
+
+static void testUtcAlarmPersistenceAfterSystemTimeUpdateL()
+ {
+ // Following a system time update, queued alarms may or may not
+ // be removed, depending on the following conditions
+ //
+ // * EAlarmRepeatDefintionRepeatOnce
+ // * EAlarmRepeatDefintionRepeatNext24Hours
+ // Alarm is removed if more than 1 day in the past
+ //
+ // * EAlarmRepeatDefintionRepeatDaily
+ // * EAlarmRepeatDefintionRepeatWorkday
+ // * EAlarmRepeatDefintionRepeatWeekly
+ // All repeating alarms queue the next repeat of the alarm
+
+ TheAlarmTest.Test().Next(_L("update system time whilst UTC alarm notifying"));
+
+#if defined(_DEBUG)
+ TheAlarmTest.Session().__DbgPreventUserNotify(ETrue);
+#define KAlarmStateNotify EAlarmStateNotified
+#else
+#define KAlarmStateNotify EAlarmStateNotifying
+#endif
+
+ for (TInt ii = 0; ii < 4; ++ii)
+ {
+ // Get current alarm counts
+ TInt previousQueued = TheAlarmTest.Session().AlarmCountByState(EAlarmStateQueued);
+ TInt previousNotifying = TheAlarmTest.Session().AlarmCountByState(KAlarmStateNotify) +
+ TheAlarmTest.Session().AlarmCountByState(EAlarmStateWaitingToNotify);
+
+ TTime time;
+ SafeHomeTime(time);
+ time -= User::UTCOffset();
+ time += TTimeIntervalSeconds(2);
+
+ TTime systemTime(time);
+
+ switch (ii)
+ {
+ case 0:
+ TheAlarmTest.Test().Next(_L("set time back 1 hour"));
+ systemTime -= TTimeIntervalHours(1);
+ break;
+ case 1:
+ TheAlarmTest.Test().Next(_L("set time forward 1 hour"));
+ systemTime += TTimeIntervalHours(1);
+ break;
+ case 2:
+ TheAlarmTest.Test().Next(_L("set time back 2 days"));
+ systemTime -= TTimeIntervalDays(2);
+ break;
+ case 3:
+ TheAlarmTest.Test().Next(_L("set time forward 2 days"));
+ systemTime += TTimeIntervalDays(2);
+ break;
+ default:
+ TheAlarmTest(EFalse, __LINE__);
+ break;
+ }
+
+ // add a UTC alarm of each repeat type due now
+ TASShdAlarm alarm;
+
+ alarm.SetUtcNextDueTime(time);
+ alarm.RepeatDefinition()=EAlarmRepeatDefintionRepeatOnce;
+ TheAlarmTest(TheAlarmTest.Session().AlarmAdd(alarm) == KErrNone, __LINE__);
+ TAlarmId idOnce = alarm.Id();
+ TheAlarmTest(idOnce != KNullAlarmId, __LINE__);
+
+ alarm.SetUtcNextDueTime(time);
+ alarm.RepeatDefinition()=EAlarmRepeatDefintionRepeatNext24Hours;
+ TheAlarmTest(TheAlarmTest.Session().AlarmAdd(alarm) == KErrNone, __LINE__);
+ TAlarmId id24hr = alarm.Id();
+ TheAlarmTest(id24hr != KNullAlarmId, __LINE__);
+
+ alarm.SetUtcNextDueTime(time);
+ alarm.RepeatDefinition()=EAlarmRepeatDefintionRepeatDaily;
+ TheAlarmTest(TheAlarmTest.Session().AlarmAdd(alarm) == KErrNone, __LINE__);
+ TAlarmId idDaily = alarm.Id();
+ TheAlarmTest(idDaily != KNullAlarmId, __LINE__);
+
+ alarm.SetUtcNextDueTime(time);
+ alarm.RepeatDefinition()=EAlarmRepeatDefintionRepeatWorkday;
+ TheAlarmTest(TheAlarmTest.Session().AlarmAdd(alarm) == KErrNone, __LINE__);
+ TAlarmId idWorkday = alarm.Id();
+ TheAlarmTest(idWorkday != KNullAlarmId, __LINE__);
+
+ alarm.SetUtcNextDueTime(time);
+ alarm.RepeatDefinition()=EAlarmRepeatDefintionRepeatWeekly;
+ TheAlarmTest(TheAlarmTest.Session().AlarmAdd(alarm) == KErrNone, __LINE__);
+ TAlarmId idWeekly = alarm.Id();
+ TheAlarmTest(idWeekly != KNullAlarmId, __LINE__);
+
+ TInt queued = TheAlarmTest.Session().AlarmCountByState(EAlarmStateQueued);
+ TInt notifying = TheAlarmTest.Session().AlarmCountByState(KAlarmStateNotify) +
+ TheAlarmTest.Session().AlarmCountByState(EAlarmStateWaitingToNotify);
+ TheAlarmTest(queued == previousQueued + 5, __LINE__);
+ TheAlarmTest(notifying == previousNotifying, __LINE__);
+
+ // wait for the alarms to go off
+ User::After(10 * KTimeToWait);
+ queued = TheAlarmTest.Session().AlarmCountByState(EAlarmStateQueued);
+ notifying = TheAlarmTest.Session().AlarmCountByState(KAlarmStateNotify) +
+ TheAlarmTest.Session().AlarmCountByState(EAlarmStateWaitingToNotify);
+ TheAlarmTest(queued == previousQueued + 4, __LINE__);
+ TheAlarmTest(notifying == previousNotifying + 1, __LINE__);
+
+ // update the system time
+
+ User::SetUTCTime(systemTime);
+
+ User::After(KTimeToWait);
+
+ // check the queue of alarms
+ queued = TheAlarmTest.Session().AlarmCountByState(EAlarmStateQueued);
+ notifying = TheAlarmTest.Session().AlarmCountByState(KAlarmStateNotify) +
+ TheAlarmTest.Session().AlarmCountByState(EAlarmStateWaitingToNotify);
+
+ switch (ii)
+ {
+ case 0: // set time back 1 hour
+ case 1: // set time forward 1 hour
+ case 2: // set time back 2 days
+ {
+ // No alarms should be removed
+ TheAlarmTest(queued == previousQueued + 4, __LINE__);
+ TheAlarmTest(notifying == previousNotifying + 1, __LINE__);
+ TheAlarmTest(TheAlarmTest.Session().GetAlarmDetails(idOnce,alarm) == KErrNone, __LINE__);
+ TheAlarmTest(alarm.State() == EAlarmStateQueued || alarm.State() == KAlarmStateNotify || alarm.State() == EAlarmStateWaitingToNotify, __LINE__);
+ TheAlarmTest(TheAlarmTest.Session().GetAlarmDetails(id24hr,alarm) == KErrNone, __LINE__);
+ TheAlarmTest(alarm.State() == EAlarmStateQueued || alarm.State() == KAlarmStateNotify || alarm.State() == EAlarmStateWaitingToNotify, __LINE__);
+ TheAlarmTest(TheAlarmTest.Session().GetAlarmDetails(idDaily,alarm) == KErrNone, __LINE__);
+ TheAlarmTest(alarm.State() == EAlarmStateQueued || alarm.State() == KAlarmStateNotify || alarm.State() == EAlarmStateWaitingToNotify, __LINE__);
+ TheAlarmTest(TheAlarmTest.Session().GetAlarmDetails(idWorkday,alarm) == KErrNone, __LINE__);
+ TheAlarmTest(alarm.State() == EAlarmStateQueued || alarm.State() == KAlarmStateNotify || alarm.State() == EAlarmStateWaitingToNotify, __LINE__);
+ TheAlarmTest(TheAlarmTest.Session().GetAlarmDetails(idWeekly,alarm) == KErrNone, __LINE__);
+ TheAlarmTest(alarm.State() == EAlarmStateQueued || alarm.State() == KAlarmStateNotify || alarm.State() == EAlarmStateWaitingToNotify, __LINE__);
+ break;
+ }
+ case 3: // set time forward 2 days
+ {
+ // once only and 24hr alarms should be removed
+ TheAlarmTest(queued + notifying == previousQueued + previousNotifying + 3, __LINE__);
+ TheAlarmTest(TheAlarmTest.Session().GetAlarmDetails(idOnce,alarm) == KErrNotFound, __LINE__);
+ TheAlarmTest(TheAlarmTest.Session().GetAlarmDetails(id24hr,alarm) == KErrNotFound, __LINE__);
+ TheAlarmTest(TheAlarmTest.Session().GetAlarmDetails(idDaily,alarm) == KErrNone, __LINE__);
+ TheAlarmTest(alarm.State() == EAlarmStateQueued || alarm.State() == KAlarmStateNotify || alarm.State() == EAlarmStateWaitingToNotify, __LINE__);
+ TheAlarmTest(TheAlarmTest.Session().GetAlarmDetails(idWorkday,alarm) == KErrNone, __LINE__);
+ TheAlarmTest(alarm.State() == EAlarmStateQueued || alarm.State() == KAlarmStateNotify || alarm.State() == EAlarmStateWaitingToNotify, __LINE__);
+ TheAlarmTest(TheAlarmTest.Session().GetAlarmDetails(idWeekly,alarm) == KErrNone, __LINE__);
+ TheAlarmTest(alarm.State() == EAlarmStateQueued || alarm.State() == KAlarmStateNotify || alarm.State() == EAlarmStateWaitingToNotify, __LINE__);
+ break;
+ }
+ default:
+ TheAlarmTest(EFalse, __LINE__);
+ break;
+ }
+
+ TheAlarmTest.Session().AlarmDelete(idOnce);
+ TheAlarmTest.Session().AlarmDelete(id24hr);
+ TheAlarmTest.Session().AlarmDelete(idDaily);
+ TheAlarmTest.Session().AlarmDelete(idWorkday);
+ TheAlarmTest.Session().AlarmDelete(idWeekly);
+ }
+ }
+
+
+static void doTestsL()
+ {
+ //get the initial time
+ TTime homeTime;
+ homeTime.HomeTime();
+
+ CActiveScheduler* scheduler = new (ELeave) CActiveScheduler;
+ CleanupStack::PushL(scheduler);
+ CActiveScheduler::Install(scheduler);
+
+ User::LeaveIfError(timezone.Connect());
+
+ // safeguard against leaving
+ CleanupClosePushL(timezone);
+
+ timezone.SetAutoUpdateBehaviorL(RTz::ETZAutoDSTUpdateOn);
+
+ TheAlarmTest.TestStartServers();
+ TheAlarmTest(TheAlarmTest.Session().Connect() == KErrNone, __LINE__);
+ TheAlarmTest.TestClearStoreL();
+
+#if defined(_DEBUG)
+ TheAlarmTest.Session().__DbgPreventUserNotify(ETrue);
+#endif
+
+
+ // Disable Daylight Saving
+ EnableDaylightSavingL(EFalse);
+
+ User::After(100000);
+
+ //
+ // Test the local API.
+
+ TheAlarmTest.Test().Printf(_L("Begin local API tests."));
+
+ TestAlarmsWithDaylightSavingChange1L();
+ TestAlarmsWithDaylightSavingChange2L();
+ /*
+ Changes to the UTC offset due to a DST change produce equivalent behaviour
+ to changes to the UTC offset due to a locale change, therefore, there is no
+ need to test DST and locale changes separately.
+ */
+
+ // Reset locale for workday testing
+ // Disable Daylight Saving
+ EnableDaylightSavingL(EFalse);
+ User::After(100000);
+ testLocaleChangeWorkdaysL();
+ test24HourToOnceOnlyAlarms();
+ //
+ // The workdays enabled.
+ TInt workdays = (1 << EMonday) | (1 << ETuesday) | (1 << EWednesday) | (1 << EThursday) | (1 << EFriday);
+
+ TLocale locale;
+ locale.SetWorkDays(workdays);
+ locale.Set();
+ User::After(100000);
+
+ // Update system time while alarm is notifying
+ testAlarmPersistenceAfterSystemTimeUpdateL();
+
+ // Clean up after the local API test if it was run.
+ TheAlarmTest.TestClearStoreL();
+
+ //
+ // Test the UTC API.
+
+ TheAlarmTest.Test().Printf(_L("Begin UTC API tests."));
+
+ TestUtcAlarmsWithDaylightSavingChange1L();
+ TestUtcAlarmsWithDaylightSavingChange2L();
+ /*
+ Changes to the UTC offset due to a DST change produce equivalent behaviour
+ to changes to the UTC offset due to a locale change, therefore, there is no
+ need to test DST and locale changes separately.
+ */
+
+ // Reset locale for workday testing
+ // Disable Daylight Saving
+ EnableDaylightSavingL(EFalse);
+ User::After(100000);
+ testLocaleChangeWorkdaysUtcL();
+ test24HourToOnceOnlyUtcAlarms();
+ //
+ workdays = (1 << EMonday) | (1 << ETuesday) | (1 << EWednesday) | (1 << EThursday) | (1 << EFriday);
+ locale.SetWorkDays(workdays);
+ locale.Set();
+ User::After(100000);
+
+ // Update system time while alarm is notifying
+ testUtcAlarmPersistenceAfterSystemTimeUpdateL();
+
+ CleanupStack::PopAndDestroy(&timezone);
+
+
+ //Set back the time to the initial time
+ RPIMTestServer testserver;
+ User::LeaveIfError(testserver.Connect());
+ testserver.SetHomeTime(homeTime);
+ testserver.Close();
+
+ CleanupStack::PopAndDestroy(scheduler);
+ }
+
+/**
+
+@SYMTestCaseID PIM-TALARMLOCALECHANGES-0001
+
+*/
+
+GLDEF_C TInt E32Main()
+//
+// Test the alarm server.
+//
+ {
+ TInt ret = KErrNone;
+ TheAlarmTest.Title();
+ TheAlarmTest.Start(_L("@SYMTestCaseID:PIM-TALARMLOCALECHANGES-0001 \"Clock\" alarms"));
+
+ __UHEAP_MARK;
+ CTrapCleanup* cleanup = CTrapCleanup::New();
+ TRAP_IGNORE(doTestsL());
+ delete cleanup;
+ __UHEAP_MARKEND;
+
+ TheAlarmTest.Session().Close();
+ TRAP(ret,TheAlarmTest.EndL());
+
+ TheAlarmTest.Test().Close();
+ ASTstAlarmTest::Close();
+ //
+ return ret;
+ }