commonappservices/alarmserver/Test/TStartupExpire.cpp
author William Roberts <williamr@symbian.org>
Fri, 23 Apr 2010 14:37:17 +0100
branchRCL_3
changeset 22 c82a39b81a38
parent 0 2e3d3ce01487
permissions -rw-r--r--
Rework addition of Symbian splash screen to reduce the source impact (uses SVG from Bug 2414) Notes: by using the OPTION SOURCEDIR parameter in the mifconv extension instructions, I can arrange to use the same source file name in sfimage, without having to export over the original Nokia file. This means that the name inside splashscreen.mbg is the same, which removes the need for the conditional compilation in SplashScreen.cpp, and gets rid of sf_splashscreen.mmp.

// 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 "testserver.h"

#if defined(__WINS__)
#include "consoleantestclient.h" //for RASAltClientSession
// Globals
static RANTestClient TheAlertSrv;
#endif
TLocale locale;
//
// Test setting an alarm, closing down the alarm server,
// re-starting the server and seeing the alarm expire if the
// re-start is within 59 seconds of the intended expiry
//

// Literal constants
_LIT(KFormatTime,"%H:%T:%S.   ");
_LIT(KSeparator,": ");
_LIT(KCarriageReturn,"\n\r");

#if defined(_DEBUG) && defined(__WINS__)
static TBool IsNotifying()
	{
	User::After(1000000);
	return TheAlertSrv.IsNotifying();
	}
#endif

static void closeServers()
	{
	const TInt r = TheAlarmTest.Session().Connect();
	TheAlarmTest(r==KErrNone, __LINE__);
	TheAlarmTest.Test().Printf(_L("Server shut down\r\n"));
#if !defined(_DEBUG)
	TheAlarmTest.Test().Printf(_L("THIS TEST IS A DEBUG TEST ONLY\r\n"));
#else
#ifdef __WINS__
	TheAlarmTest.Test().Printf(_L("now closing server...\r\n"));
	TheAlarmTest.Session().__DbgShutDownServer();
    TheAlarmTest.Session().Close();
#endif
#endif
	}

static void logTimeL(const TDesC& aText,const TTime& aTime)
	{
	TBuf<128> timeTxt;
	aTime.FormatL(timeTxt,KFormatTime);
	TheAlarmTest.Test().Printf(aText);
	TheAlarmTest.Test().Printf(KSeparator);
	TheAlarmTest.Test().Printf(timeTxt);
	TheAlarmTest.Test().Printf(KCarriageReturn);
	}

static void logTimeSameLineL(const TDesC& aText,const TTime& aTime)
	{
	TPoint cursor=TheAlarmTest.Test().Console()->CursorPos();
	cursor.iX=0;
	TheAlarmTest.Test().Console()->SetCursorPosAbs(cursor);
	TheAlarmTest.Test().Console()->ClearToEndOfLine();
	TBuf<128> timeTxt;
	aTime.FormatL(timeTxt,KFormatTime);
	TheAlarmTest.Test().Printf(aText);
	TheAlarmTest.Test().Printf(KSeparator);
	TheAlarmTest.Test().Printf(timeTxt);
	}

void JumpJustBeforeL(const TTime& aDueTime)
	{
	TTime jumpTo = aDueTime - TTimeIntervalSeconds(5);

    RPIMTestServer serv;
    User::LeaveIfError(serv.Connect());
    serv.SetHomeTime(jumpTo);
    // wait for time change notifications to occur.
    User::After(10000);
    // set again to ensure time value is correct when update occurs.
    serv.SetHomeTime(jumpTo);
    serv.Close();

	logTimeSameLineL(_L("System time is set to: "), jumpTo);
	TheAlarmTest.Test().Printf(KCarriageReturn);

	jumpTo.HomeTime();
	}

static void tickUntilTimeL(const TTime& aStopTime)
	{
	TheAlarmTest.Test().Printf(_L("Entering tickUntilTime\n"));
	RTimer tickTimer;
	tickTimer.CreateLocal();
	TTime now;
	now.HomeTime();
	TInt loop=0;
	TheAlarmTest.Test().Printf(_L("Begin Loop\n"));
	while (now<aStopTime)
		{
		TTime nowx(now.Int64());
		TTime stopx(aStopTime.Int64());
		TheAlarmTest.Test().Printf(_L("\nStart of Loop %d\n"),++loop);
		TheAlarmTest.Test().Printf(_L("now<aStopTime %d\n"),now<aStopTime);
		TheAlarmTest.Test().Printf(_L("now>aStopTime %d\n"),now>aStopTime);
		TheAlarmTest.Test().Printf(_L("now<=aStopTime %d\n"),now<=aStopTime);
		TheAlarmTest.Test().Printf(_L("now>=aStopTime %d\n"),now>=aStopTime);
		logTimeL(_L("---Nowx at"),nowx);
		logTimeL(_L("---Stopx at"),stopx);
		TheAlarmTest.Test().Printf(_L("nowx<stopx %d\n"),nowx<stopx);

		TheAlarmTest.Test().Printf(_L("\nNow1 TInt64 %d\n"),now.Int64());
		TheAlarmTest.Test().Printf(_L("Stop1 TInt64 %d\n\n"),aStopTime.Int64());
		logTimeSameLineL(_L("Time is"),now);
		//TheAlarmTest.Test().Printf(_L("Now2 TInt64 %d\n"),now.Int64());
		//TheAlarmTest.Test().Printf(_L("Stop2 TInt64 %d\n"),aStopTime.Int64());
		TRequestStatus status;
		tickTimer.After(status,1000000);
		User::WaitForRequest(status);
		//TheAlarmTest.Test().Printf(_L("Now3 TInt64 %d\n"),now.Int64());
		//TheAlarmTest.Test().Printf(_L("Stop3 TInt64 %d\n"),aStopTime.Int64());
		now.HomeTime();
		//TheAlarmTest.Test().Printf(_L("Now4 TInt64 %d\n"),now.Int64());
		//TheAlarmTest.Test().Printf(_L("Stop4 TInt64 %d\n"),aStopTime.Int64());
		logTimeL(_L("\nDebug now      :"),now);
		logTimeL(_L("Debug aStopTime:"),aStopTime);
		TheAlarmTest.Test().Printf(_L("Now5 TInt64 %d\n"),now.Int64());
		TheAlarmTest.Test().Printf(_L("Stop5 TInt64 %d\n"),aStopTime.Int64());

		nowx=now;
		stopx=aStopTime;

		TheAlarmTest.Test().Printf(_L("\nnow<aStopTime %d\n"),now<aStopTime);
		TheAlarmTest.Test().Printf(_L("now>aStopTime %d\n"),now>aStopTime);
		TheAlarmTest.Test().Printf(_L("now<=aStopTime %d\n"),now<=aStopTime);
		TheAlarmTest.Test().Printf(_L("now>=aStopTime %d\n"),now>=aStopTime);
		TheAlarmTest.Test().Printf(_L("Nowx TInt64 %d\n"),nowx.Int64());
		TheAlarmTest.Test().Printf(_L("Stopx TInt64 %d\n"),stopx.Int64());
		TheAlarmTest.Test().Printf(_L("nowx<stopx %d\n"),nowx<stopx);
		TheAlarmTest.Test().Printf(_L("End of Loop %d\n\n"),loop);
		}
	TheAlarmTest.Test().Printf(_L("leaving tickUntilTime\n"));
	}

static void finishTestL(TTime& aExpireTime, const TBool aStartServerWithinMinute)
	{
	closeServers();
	//
	if	(aStartServerWithinMinute)
		aExpireTime += TTimeIntervalSeconds(5);
	else
		{
		aExpireTime += TTimeIntervalSeconds(60);
		JumpJustBeforeL(aExpireTime);
		}
	//
	logTimeL(_L("Starting servers at"),aExpireTime);
	tickUntilTimeL(aExpireTime);
	//
	TheAlarmTest.TestStartServers();
	//
	if	(aStartServerWithinMinute)
		{
		TheAlarmTest.Test().Printf(_L("You SHOULD see an Alert!\n\r"));
#if defined(_DEBUG) && defined(__WINS__)
		TheAlarmTest(IsNotifying());
#endif
		}
	else
		{
		TheAlarmTest.Test().Printf(_L("You SHOULD NOT see an Alert!\n\r"));
#if defined(_DEBUG) && defined(__WINS__)
		TheAlarmTest(!IsNotifying());
#endif
		}
	//

	TheAlarmTest.TestClearStoreL();
	closeServers();
	}


static void startTestUtcL(TASShdAlarm& aAlarm, TAlarmMessage& aMessage, TInt aTestNumber)
	{
	TheAlarmTest.Test().Console()->ClearScreen();
	TheAlarmTest.Test().Printf(_L("Starting test [%2d/14]\n\r"), aTestNumber);

	TheAlarmTest.TestStartServers();
	//
	TInt r=TheAlarmTest.Session().Connect();
	TheAlarmTest(r==KErrNone, __LINE__);
	TheAlarmTest.TestClearStoreL();
	//
	TTime expireTime;
	expireTime.UniversalTime();
	TDateTime expireDateTime=expireTime.DateTime();
	logTimeL(_L("UTC Time now is"), expireTime);
	//
	expireTime.RoundUpToNextMinute();
	if	(expireDateTime.Second() > 40)
		expireTime += TTimeIntervalMinutes(1);
	//
	expireTime.FormatL(aMessage, _L("expire time %H:%T:%S.%C:"));
    // Note, JumpJustBefore takes a Floating Time and not a Universal Time.
	JumpJustBeforeL(expireTime + User::UTCOffset());
	aAlarm.SetUtcNextDueTime(expireTime);
	}

static void startTestL(TTime& aExpireTime, TAlarmMessage& aMessage, TInt aTestNumber)
	{
	TheAlarmTest.Test().Console()->ClearScreen();
	TheAlarmTest.Test().Printf(_L("Starting test [%2d/14]\n\r"), aTestNumber);

	TheAlarmTest.TestStartServers();
	//
	TInt r=TheAlarmTest.Session().Connect();
	TheAlarmTest(r==KErrNone, __LINE__);
	TheAlarmTest.TestClearStoreL();
	//
	aExpireTime.HomeTime();
	TDateTime expireDateTime=aExpireTime.DateTime();
	logTimeL(_L("Time now is"), aExpireTime);
	//
	aExpireTime.RoundUpToNextMinute();
	if	(expireDateTime.Second() > 40)
		aExpireTime += TTimeIntervalMinutes(1);
	//
	aExpireTime.FormatL(aMessage, _L("expire time %H:%T:%S.%C:"));

	JumpJustBeforeL(aExpireTime);
	}

static void clockAlarmTestL(TAlarmRepeatDefinition aRepeatType, TBool aStartServerWithinMinute, TInt aNumber)
// aRepeatType - standard repeat choice, allows testing of different style clock alarms
// aStartServerWithinMinute - whether to start the servers within the minute after expiry of the TheAlarmTest.Test() alarm
	{
	TASShdAlarm alarm;
	startTestL(alarm.NextDueTime(), alarm.Message(), aNumber);
	alarm.RepeatDefinition() = aRepeatType;
	TheAlarmTest.Test().Printf(_L("Setting clock alarm, type:%d\n\r"), aRepeatType);
	TheAlarmTest(TheAlarmTest.Session().AlarmAdd(alarm) == KErrNone, __LINE__);

	logTimeL(_L("Set clock alarm to expire at"),alarm.NextDueTime());
	finishTestL(alarm.NextDueTime(),aStartServerWithinMinute);
	}

static void agendaAlarmTestL(TBool aStartServerWithinMinute, TInt aNumber)
// aSessionType - standard session choice, allows testing of different style agenda alarms
// aStartServerWithinMinute - whether to start the servers within the minute after expiry of the TheAlarmTest.Test() alarm
	{
	TASShdAlarm alarm;
	startTestL(alarm.NextDueTime(), alarm.Message(), aNumber);
	TheAlarmTest.Test().Printf(_L("Setting agenda alarm\n\r"));
	TheAlarmTest(TheAlarmTest.Session().AlarmAdd(alarm) == KErrNone, __LINE__);

	logTimeL(_L("Set agenda alarm to expire at"),alarm.NextDueTime());

	finishTestL(alarm.NextDueTime(),aStartServerWithinMinute);
	}

static void orphanAlarmTestL(TBool aStartServerWithinMinute, TInt aNumber)
// aSessionType - standard session choice, allows testing of different style orphan alarms
// aStartServerWithinMinute - whether to start the servers within the minute after expiry of the TheAlarmTest.Test() alarm
	{
	TASShdAlarm alarm;
	alarm.Characteristics().Set(EAlarmCharacteristicsSessionSpecific);
	startTestL(alarm.NextDueTime(), alarm.Message(), aNumber);

	TheAlarmTest.Test().Printf(_L("Setting session alarm\n\r"));

	// Set the session alarm
	TRequestStatus status;
	TheAlarmTest.Session().AlarmAddWithNotification(status, alarm);

	// Now orphan it
	TheAlarmTest.Test().Printf(_L("Session alarm set, now orphaning\n\r"));
	TheAlarmTest.Session().SetAlarmCharacteristics(alarm.Id(), 0); // clear session specific flag

	// Get the abort
	User::WaitForRequest(status);
	TheAlarmTest(status.Int() == KErrCancel, __LINE__);

	logTimeL(_L("Created orphan alarm to expire at"),alarm.NextDueTime());

	finishTestL(alarm.NextDueTime(),aStartServerWithinMinute);
	}

void serverRestartWithNotifyingAlarmTestL()
	{
#if defined(_DEBUG) && defined(__WINS__)
	TheAlarmTest.TestStartServers();
	TheAlarmTest.TestClearStoreL();
	TheAlarmTest(TheAlertSrv.Connect() == KErrNone);
	// Add an alarm due immediately
	TASShdAlarm alarm;
	TTime time;
	time.HomeTime();
	alarm.NextDueTime() = time;
	TheAlarmTest(TheAlarmTest.Session().AlarmAdd(alarm) == KErrNone);
	TAlarmId id = alarm.Id();
	// Check that the alarm is notifying
	TheAlarmTest(IsNotifying());
	// Shut down and restart the server
	closeServers();
	TheAlarmTest.TestStartServers();
	TheAlarmTest(TheAlarmTest.Session().Connect() == KErrNone);
	// Check that the alarm is still notifying
	TheAlarmTest.Test().Printf(_L("Check alarm still notifying after shutdown and restart\n"));
	TheAlarmTest(IsNotifying());
	// Snooze the alarm, and restart the server
	TTime timeToSnoozeUntil = time + TTimeIntervalMinutes(1);
	TheAlarmTest(TheAlarmTest.Session().__DbgSnoozeAlarm(id, timeToSnoozeUntil - User::UTCOffset()) == KErrNone);
	TheAlarmTest(!IsNotifying());
	closeServers();
	TheAlarmTest.TestStartServers();
	TheAlarmTest(TheAlarmTest.Session().Connect() == KErrNone);
	// Check that the alarm is still snoozed
	TheAlarmTest(!IsNotifying());
	// Check the alarm notifies again after the snooze period
	User::At(timeToSnoozeUntil);
	TheAlarmTest.Test().Printf(_L("Check snoozed alarm notifies after shutdown and restart\n"));
	TheAlarmTest(IsNotifying());
	// Snooze the alarm again and shut down the server -
	// Restart the server 3 months in the future
	timeToSnoozeUntil.HomeTime();
	timeToSnoozeUntil += TTimeIntervalMinutes(1);
	TheAlarmTest(TheAlarmTest.Session().__DbgSnoozeAlarm(id, timeToSnoozeUntil - User::UTCOffset()) == KErrNone);
	TheAlarmTest(!IsNotifying());
	closeServers();

    RPIMTestServer serv;
    User::LeaveIfError(serv.Connect());
    serv.SetHomeTime(timeToSnoozeUntil + TTimeIntervalMonths(3));
    serv.Close();

	TheAlarmTest.TestStartServers();
	TheAlarmTest(TheAlarmTest.Session().Connect() == KErrNone);
	// Check the alarm is notifying
	TheAlarmTest.Test().Printf(_L("Check snoozed alarm notifies again after shutdown and restart\n"));
	TheAlarmTest(IsNotifying());

	TheAlertSrv.Close();
#else
	TheAlarmTest.Test().Printf(_L("THIS TEST IS A DEBUG, WINS TEST ONLY\r\n"));
#endif
	}

// UTC tests


static void clockUtcAlarmTestL(TAlarmRepeatDefinition aRepeatType, TBool aStartServerWithinMinute, TInt aNumber)
// aRepeatType - standard repeat choice, allows testing of different style clock alarms
// aStartServerWithinMinute - whether to start the servers within the minute after expiry of the TheAlarmTest.Test() alarm
	{
	TASShdAlarm alarm;
	TBuf<KMaxAlarmMessageLength> message = alarm.Message();
	startTestUtcL(alarm, message, aNumber);
	alarm.RepeatDefinition()=aRepeatType;
	TheAlarmTest.Test().Printf(_L("Setting clock alarm, type:%d\n\r"), aRepeatType);
	TheAlarmTest(TheAlarmTest.Session().AlarmAdd(alarm) == KErrNone, __LINE__);

	TTime time = alarm.NextDueTime() + User::UTCOffset();
	logTimeL(_L("Set clock alarm to expire at"), time);

	finishTestL(time, aStartServerWithinMinute);
	}

static void agendaUtcAlarmTestL(TBool aStartServerWithinMinute, TInt aNumber)
// aSessionType - standard session choice, allows testing of different style agenda alarms
// aStartServerWithinMinute - whether to start the servers within the minute after expiry of the TheAlarmTest.Test() alarm
	{
	TASShdAlarm alarm;
	TBuf<KMaxAlarmMessageLength> message = alarm.Message();
	startTestUtcL(alarm, message, aNumber);
	TheAlarmTest.Test().Printf(_L("Setting agenda alarm\n\r"));
	TheAlarmTest(TheAlarmTest.Session().AlarmAdd(alarm) == KErrNone, __LINE__);

	TTime time = alarm.NextDueTime() + User::UTCOffset();
	logTimeL(_L("Set agenda alarm to expire at"), time);

	finishTestL(time, aStartServerWithinMinute);
	}

static void orphanUtcAlarmTestL(TBool aStartServerWithinMinute, TInt aNumber)
// aSessionType - standard session choice, allows testing of different style orphan alarms
// aStartServerWithinMinute - whether to start the servers within the minute after expiry of the TheAlarmTest.Test() alarm
	{
	TASShdAlarm alarm;
	alarm.Characteristics().Set(EAlarmCharacteristicsSessionSpecific);
	TBuf<KMaxAlarmMessageLength> message = alarm.Message();
	startTestUtcL(alarm, message, aNumber);

	TheAlarmTest.Test().Printf(_L("Setting session alarm\n\r"));

	// Set the session alarm
	TRequestStatus status;
	TheAlarmTest.Session().AlarmAddWithNotification(status, alarm);

	// Now orphan it
	TheAlarmTest.Test().Printf(_L("Session alarm set, now orphaning\n\r"));
	TheAlarmTest.Session().SetAlarmCharacteristics(alarm.Id(), 0); // clear session specific flag

	// Get the abort
	User::WaitForRequest(status);
	TheAlarmTest(status.Int() == KErrCancel, __LINE__);

	TTime time = alarm.NextDueTime() + User::UTCOffset();
	logTimeL(_L("Created orphan alarm to expire at"), time);

	finishTestL(time, aStartServerWithinMinute);
	}

void serverRestartWithNotifyingUtcAlarmTestL()
	{
#if defined(_DEBUG) && defined(__WINS__)
	TheAlarmTest.TestStartServers();
	TheAlarmTest.TestClearStoreL();
	TheAlarmTest(TheAlertSrv.Connect() == KErrNone);
	// Add an alarm due immediately
	TASShdAlarm alarm;
	TTime time;
	time.UniversalTime();
	alarm.SetUtcNextDueTime(time);
	TheAlarmTest(TheAlarmTest.Session().AlarmAdd(alarm) == KErrNone);
	TAlarmId id = alarm.Id();
	// Check that the alarm is notifying
	TheAlarmTest(IsNotifying());
	// Shut down and restart the server
	closeServers();
	TheAlarmTest.TestStartServers();
	TheAlarmTest(TheAlarmTest.Session().Connect() == KErrNone);
	// Check that the alarm is still notifying
	TheAlarmTest.Test().Printf(_L("Check alarm still notifying after shutdown and restart\n"));
	TheAlarmTest(IsNotifying());
	// Snooze the alarm, and restart the server
	TTime timeToSnoozeUntil = time + TTimeIntervalMinutes(1);
	TheAlarmTest(TheAlarmTest.Session().__DbgSnoozeAlarm(id, timeToSnoozeUntil) == KErrNone);
	TheAlarmTest(!IsNotifying());
	closeServers();
	TheAlarmTest.TestStartServers();
	TheAlarmTest(TheAlarmTest.Session().Connect() == KErrNone);
	// Check that the alarm is still snoozed
	TheAlarmTest(!IsNotifying());
	// Check the alarm notifies again after the snooze period
	// Note, User::At takes a Floating Time (wall-time) and not a Universal Time
	User::At(timeToSnoozeUntil+User::UTCOffset());
	TheAlarmTest.Test().Printf(_L("Check snoozed alarm notifies after shutdown and restart\n"));
	TheAlarmTest(IsNotifying());
	// Snooze the alarm again and shut down the server -
	// Restart the server 3 months in the future
	timeToSnoozeUntil.UniversalTime();
	timeToSnoozeUntil += TTimeIntervalMinutes(1);
	TheAlarmTest(TheAlarmTest.Session().__DbgSnoozeAlarm(id, timeToSnoozeUntil) == KErrNone);
	TheAlarmTest(!IsNotifying());
	closeServers();

    User::SetUTCTime(timeToSnoozeUntil + TTimeIntervalMonths(3));

	TheAlarmTest.TestStartServers();
	TheAlarmTest(TheAlarmTest.Session().Connect() == KErrNone);
	// Check the alarm is notifying
	TheAlarmTest.Test().Printf(_L("Check snoozed alarm notifies again after shutdown and restart\n"));
	TheAlarmTest(IsNotifying());

	TheAlertSrv.Close();
#else
	TheAlarmTest.Test().Printf(_L("THIS TEST IS A DEBUG, WINS TEST ONLY\r\n"));
#endif
	}

	
void serverRestartWithNotifiedUtcAlarmTestL()
	{
#if defined(_DEBUG) && defined(__WINS__)
    TheAlarmTest.Next(_L("Acknowledge repeating alarm after restart in less then 1 minute) does not notify"));	

    TheAlarmTest.TestStartServers();
    TheAlarmTest.TestClearStoreL();
    TheAlarmTest(TheAlertSrv.Connect() == KErrNone);

    // Add an alarm due in the future
    TheAlarmTest.Test().Printf(_L("Add a repeating alarm to expire in the future\n"));
    TASShdAlarm alarm;
    alarm.RepeatDefinition() = EAlarmRepeatDefintionRepeatDaily;	

    TTime alarmTime;
    alarmTime.UniversalTime();
    alarmTime.RoundUpToNextMinute();
    alarmTime += TTimeIntervalMinutes(1);

    alarm.SetUtcNextDueTime(alarmTime);

    TheAlarmTest(TheAlarmTest.Session().AlarmAdd(alarm) == KErrNone);
    TAlarmId id = alarm.Id();

    // wait until that time has occurred before checking
    TheAlarmTest.Test().Printf(_L("Wait for alarm time to expire\n"));
     
	User::At(alarmTime + User::UTCOffset());

	TheAlarmTest.Test().Printf(_L("Check that alarm is notifying\n"));
    TheAlarmTest(IsNotifying());
    TheAlarmTest.Test().Printf(_L("Acknowledge alarm\n"));
    TheAlertSrv.AcknowledgeAlarm();
    TheAlarmTest.Test().Printf(_L("Check that alarm is cleared\n"));
    TheAlarmTest(!IsNotifying());

    TheAlarmTest.Test().Printf(_L("Shutdown servers\n"));
    // Shut down and restart the server
    TheAlertSrv.Close();
    closeServers();

    TheAlarmTest.TestStartServers();
    TheAlarmTest(TheAlarmTest.Session().Connect() == KErrNone);
    TheAlarmTest(TheAlertSrv.Connect() == KErrNone);

    TheAlarmTest.Test().Printf(_L("Servers restarted\n"));

    // Make sure that server was restarted in the same minute as the alarm
    TTime currentTime;
    currentTime.UniversalTime();
    TTimeIntervalHours hours;
    TTimeIntervalMinutes minutes;

    TheAlarmTest.Test().Printf(_L("Check servers restarted in 1 minute\n"));
    TheAlarmTest(currentTime.HoursFrom(alarmTime, hours) == KErrNone);
    TheAlarmTest(currentTime.MinutesFrom(alarmTime, minutes) == KErrNone);
    TheAlarmTest((hours == TTimeIntervalHours(0)) && (minutes == TTimeIntervalMinutes(0)));


    // Check that the alarm is not notifying
    TheAlarmTest.Test().Printf(_L("Check alarm still not notifying after shutdown and restart\n"));
    TheAlarmTest(!IsNotifying());

    closeServers();
    TheAlertSrv.Close();
#else
    TheAlarmTest.Test().Printf(_L("THIS TEST IS A DEBUG, WINS TEST ONLY\r\n"));
#endif
	}

static void doTestsL()
	{
#if defined(_DEBUG) && defined(__WINS__)
	TheAlarmTest(TheAlertSrv.Connect() == KErrNone);
#endif

#if defined(_DEBUG)
// The alarm should only be allowed to display notification in WINS builds.
#if defined(__WINSCW__)
	TheAlarmTest.Session().__DbgPreventUserNotify(EFalse);
#else
	TheAlarmTest.Session().__DbgPreventUserNotify(ETrue);
#endif
#endif

	// Set all days to workdays.
	TLocale previous;
	locale.SetWorkDays(127);
	locale.Set(); 
	orphanAlarmTestL(ETrue, 1);
	orphanAlarmTestL(EFalse, 2);

	agendaAlarmTestL(ETrue, 3);
	agendaAlarmTestL(EFalse, 4);


	clockAlarmTestL(EAlarmRepeatDefintionRepeatWorkday,ETrue, 5);
	clockAlarmTestL(EAlarmRepeatDefintionRepeatWorkday,EFalse, 6);

	clockAlarmTestL(EAlarmRepeatDefintionRepeatWeekly,ETrue, 7);
	clockAlarmTestL(EAlarmRepeatDefintionRepeatWeekly,EFalse, 8);

	clockAlarmTestL(EAlarmRepeatDefintionRepeatDaily,ETrue, 9);
	clockAlarmTestL(EAlarmRepeatDefintionRepeatDaily,EFalse, 10);

	clockAlarmTestL(EAlarmRepeatDefintionRepeatNext24Hours,ETrue, 11);
	clockAlarmTestL(EAlarmRepeatDefintionRepeatNext24Hours,EFalse, 12);

	clockAlarmTestL(EAlarmRepeatDefintionRepeatOnce,ETrue, 13);
	clockAlarmTestL(EAlarmRepeatDefintionRepeatOnce,EFalse, 14);

#if defined(_DEBUG) && defined(__WINS__)
	TheAlertSrv.Close();
#endif

	serverRestartWithNotifyingAlarmTestL();

#if defined(_DEBUG) && defined(__WINS__)
	TheAlarmTest(TheAlertSrv.Connect() == KErrNone);
#endif 
	
	orphanUtcAlarmTestL(ETrue, 1);
	orphanUtcAlarmTestL(EFalse, 2);

	agendaUtcAlarmTestL(ETrue, 3);
	agendaUtcAlarmTestL(EFalse, 4);

	clockUtcAlarmTestL(EAlarmRepeatDefintionRepeatWorkday,ETrue, 5);
	clockUtcAlarmTestL(EAlarmRepeatDefintionRepeatWorkday,EFalse, 6);

	clockUtcAlarmTestL(EAlarmRepeatDefintionRepeatWeekly,ETrue, 7);
	clockUtcAlarmTestL(EAlarmRepeatDefintionRepeatWeekly,EFalse, 8);

	clockUtcAlarmTestL(EAlarmRepeatDefintionRepeatDaily,ETrue, 9);
	clockUtcAlarmTestL(EAlarmRepeatDefintionRepeatDaily,EFalse, 10);

	clockUtcAlarmTestL(EAlarmRepeatDefintionRepeatNext24Hours,ETrue, 11);
	clockUtcAlarmTestL(EAlarmRepeatDefintionRepeatNext24Hours,EFalse, 12);

	clockUtcAlarmTestL(EAlarmRepeatDefintionRepeatOnce,ETrue, 13);
	clockUtcAlarmTestL(EAlarmRepeatDefintionRepeatOnce,EFalse, 14);

#if defined(_DEBUG) && defined(__WINS__)
	TheAlertSrv.Close();
#endif

	serverRestartWithNotifyingUtcAlarmTestL();
	serverRestartWithNotifiedUtcAlarmTestL();

	// Reset the previous locale.
	previous.Set();
	}

/**
@SYMTestCaseID PIM-TSTARTUPEXPIRE-0001
*/	
GLDEF_C TInt E32Main()
    {
	__UHEAP_MARK;
	TInt ret = KErrNone;
	CTrapCleanup* cleanup = CTrapCleanup::New();
	if	(!cleanup)
		return KErrNoMemory;

	TheAlarmTest.Title();
	TheAlarmTest.Start(_L("@SYMTestCaseID PIM-TSTARTUPEXPIRE-0001"));
	TheAlarmTest.TestStartServers();
	//
	TRAPD(error, doTestsL());
	TheAlarmTest(error == KErrNone, __LINE__);
	//
    TRAP(ret,TheAlarmTest.EndL());
	TheAlarmTest.Test().Close();
	ASTstAlarmTest::Close();

	delete cleanup;
	__UHEAP_MARKEND;
	return ret;
    }