sl@0: // Copyright (c) 2005-2009 Nokia Corporation and/or its subsidiary(-ies). sl@0: // All rights reserved. sl@0: // This component and the accompanying materials are made available sl@0: // under the terms of "Eclipse Public License v1.0" sl@0: // which accompanies this distribution, and is available sl@0: // at the URL "http://www.eclipse.org/legal/epl-v10.html". sl@0: // sl@0: // Initial Contributors: sl@0: // Nokia Corporation - initial contribution. sl@0: // sl@0: // Contributors: sl@0: // sl@0: // Description: sl@0: // sl@0: sl@0: #include sl@0: #include sl@0: #include sl@0: #include sl@0: #include sl@0: #include sl@0: #include "Thelpers.h" sl@0: sl@0: _LIT(KHBufTest, "This is a CScheduledTask test"); sl@0: _LIT(KTestName, "Scheduled Task"); sl@0: RTest TheTest(KTestName); sl@0: sl@0: // persistent file for externalize and internalize test sl@0: _LIT(KFileName,"_:\\CSheduledTask.dat"); sl@0: static TBuf<32> fileName; sl@0: sl@0: LOCAL_D RFs TheFsSession; sl@0: sl@0: //Test macroses and functions sl@0: static void Check(TInt aValue, TInt aLine) sl@0: { sl@0: if(!aValue) sl@0: { sl@0: (void)TheFsSession.Delete(fileName); sl@0: TheTest(EFalse, aLine); sl@0: } sl@0: } sl@0: static void Check(TInt aValue, TInt aExpected, TInt aLine) sl@0: { sl@0: if(aValue != aExpected) sl@0: { sl@0: RDebug::Print(_L("*** Expected error: %d, got: %d\r\n"), aExpected, aValue); sl@0: (void)TheFsSession.Delete(fileName); sl@0: TheTest(EFalse, aLine); sl@0: } sl@0: } sl@0: #define TEST(arg) ::Check((arg), __LINE__) sl@0: #define TEST2(aValue, aExpected) ::Check(aValue, aExpected, __LINE__) sl@0: sl@0: sl@0: sl@0: /** sl@0: @file sl@0: @SYMTestCaseID SYSLIB-SCHSVR-CT-0202 sl@0: @SYMTestCaseDesc Check that externalize executes correctly for tasks with local based times sl@0: @SYMTestPriority low sl@0: @SYMTestActions Create a local time based instance of CSheduledTask and externalize sl@0: @SYMTestExpectedResults The test must not fail. sl@0: @SYMPREQ PREQ234 sl@0: */ sl@0: LOCAL_D void doLocalTimeExternalizeTestL() sl@0: { sl@0: TheTest.Next(_L(" @SYMTestCaseID:SYSLIB-SCHSVR-CT-0202 CScheduledTask Externalize Test (local time) ")); sl@0: sl@0: TheTest.Printf(_L("Tests with timezone set to Europe, London")); sl@0: RTz tz; sl@0: tz.Connect(); sl@0: CTzId* tzId = CTzId::NewL(2592); //set the timezone to Europe/London sl@0: CleanupStack::PushL(tzId); sl@0: tz.SetTimeZoneL(*tzId); sl@0: sl@0: TheTest.Printf(_L("Tests with DST on")); sl@0: //set the current utc time to 8.55am, 15 May 2005 -Daylight savings apply on this date sl@0: TDateTime date(2005, EMay, 15, 8, 55, 0, 0); sl@0: TTime time(date); sl@0: TInt err = SchSvrHelpers::SetUTCTimeL(time); sl@0: TEST(err == 0); sl@0: User::After(KOneSecond * 3); sl@0: // set data for CScheduledTask construction sl@0: TTaskInfo taskInfo; sl@0: sl@0: HBufC* taskdata = HBufC::NewLC(KHBufTest().Length()); sl@0: TPtr pData(taskdata->Des()); sl@0: pData.Append(KHBufTest); sl@0: sl@0: TSecurityInfo securityInfo; sl@0: sl@0: CScheduledTask* extTask = new(ELeave) CScheduledTask(taskInfo, sl@0: taskdata, sl@0: ETimeSchedule, sl@0: securityInfo); sl@0: CleanupStack::Pop(taskdata); //taskdata now owned by newTask sl@0: CleanupStack::PushL(extTask); sl@0: sl@0: // set due time, 63284489700000000 microseconds since 1st Jan 0 AD sl@0: // This is local time sl@0: TDateTime extDate(2005, EMay, 15, 8, 55, 0, 0); sl@0: TTime extTime(extDate); sl@0: TTime extDueTime(extTime); sl@0: extTask->OnDue(TTsTime(extDueTime,EFalse)); sl@0: sl@0: // externalize sl@0: RFile extFile; sl@0: TFileName extFileName(fileName); sl@0: TEST2(extFile.Replace(TheFsSession,extFileName,EFileWrite), KErrNone); sl@0: RFileBuf extBuf; sl@0: CleanupClosePushL(extBuf); sl@0: extBuf.Attach(extFile); sl@0: RWriteStream extStream(&extBuf); sl@0: sl@0: TRAP(err, extTask->ExternalizeL(extStream)); sl@0: TEST(err == KErrNone); sl@0: sl@0: CleanupStack::PopAndDestroy(3, tzId); sl@0: } sl@0: sl@0: /** sl@0: @file sl@0: @SYMTestCaseID SYSLIB-SCHSVR-CT-0203 sl@0: @SYMTestCaseDesc Check that internalize executes correctly for tasks with local based times sl@0: @SYMTestPriority low sl@0: @SYMTestActions Create a local time based instance of CSheduledTask which does an internalize sl@0: @SYMTestExpectedResults The test must not fail. sl@0: @SYMPREQ PREQ234 sl@0: */ sl@0: LOCAL_D void doLocalTimeInternalizeTestL() sl@0: { sl@0: TheTest.Next(_L(" @SYMTestCaseID:SYSLIB-SCHSVR-CT-0203 CScheduledTask Internalize Test (local time) ")); sl@0: sl@0: // internalize sl@0: RFile intFile; sl@0: TFileName intFileName(fileName); sl@0: TEST2(intFile.Open(TheFsSession,intFileName,EFileRead), KErrNone); sl@0: RFileBuf intBuf; sl@0: CleanupClosePushL(intBuf); sl@0: intBuf.Attach(intFile); sl@0: RReadStream intStream(&intBuf); sl@0: sl@0: CScheduledTask* intTask = CScheduledTask::NewLC(intStream); sl@0: sl@0: // due date/time is 8.55am, 15 May 2005 -Daylight savings apply on this date sl@0: TTsTime ttime = intTask->ValidUntil(); sl@0: TTime time = ttime.GetLocalTime(); sl@0: TDateTime dtime = time.DateTime(); sl@0: sl@0: TEST(dtime.Year() == 2005); sl@0: TEST(dtime.Month() == EMay); sl@0: TEST(dtime.Day() == 15); sl@0: TEST(dtime.Hour() == 8); sl@0: TEST(dtime.Minute() == 55); sl@0: TEST(dtime.Second() == 0); sl@0: TEST(dtime.MicroSecond() == 0); sl@0: sl@0: // test offset - 3600 seconds (1 hour) because time of device is in BST sl@0: TTimeIntervalSeconds offset(3600); sl@0: TEST(ttime.GetOffset() == offset); sl@0: sl@0: // test difference between returned values sl@0: TTime utcTime = intTask->ValidUntil().GetUtcTime(); sl@0: TTime localTime = intTask->ValidUntil().GetLocalTime(); sl@0: Int64 t = localTime.Int64() - utcTime.Int64(); sl@0: TTimeIntervalSeconds diff((localTime.Int64() - utcTime.Int64())/1000000); sl@0: TEST(diff == offset); sl@0: sl@0: // test that this instance is home time and not UTC sl@0: TEST(ttime.IsUtc() == EFalse); sl@0: sl@0: // test data sl@0: HBufC* data = const_cast(&(intTask->Data())); sl@0: TEST(data->Compare(KHBufTest) == 0); sl@0: sl@0: CleanupStack::PopAndDestroy(2, &intBuf); sl@0: } sl@0: sl@0: /** sl@0: @file sl@0: @SYMTestCaseID SYSLIB-SCHSVR-CT-0239 sl@0: @SYMTestCaseDesc Check that externalize executes correctly for tasks with UTC based times sl@0: @SYMTestPriority low sl@0: @SYMTestActions Create a UTC time based instance of CSheduledTask and externalize sl@0: @SYMTestExpectedResults The test must not fail. sl@0: @SYMPREQ PREQ234 sl@0: */ sl@0: LOCAL_D void doUtcExternalizeTestL() sl@0: { sl@0: TheTest.Next(_L(" @SYMTestCaseID:SYSLIB-SCHSVR-CT-0239 CScheduledTask Externalize Test (UTC) ")); sl@0: sl@0: TheTest.Printf(_L("Tests with timezone set to Europe, London")); sl@0: RTz tz; sl@0: tz.Connect(); sl@0: CTzId* tzId = CTzId::NewL(2592); //set the timezone to Europe/London sl@0: CleanupStack::PushL(tzId); sl@0: tz.SetTimeZoneL(*tzId); sl@0: sl@0: TheTest.Printf(_L("Tests with DST on")); sl@0: //set the current utc time to 8.55am, 15 May 2005 -Daylight savings apply on this date sl@0: TDateTime date(2005, EMay, 15, 8, 55, 0, 0); sl@0: TTime time(date); sl@0: TInt err = SchSvrHelpers::SetUTCTimeL(time); sl@0: TEST(err == 0); sl@0: User::After(KOneSecond * 3); sl@0: // set data for CScheduledTask construction sl@0: TTaskInfo taskInfo; sl@0: sl@0: HBufC* taskdata = HBufC::NewLC(KHBufTest().Length()); sl@0: TPtr pData(taskdata->Des()); sl@0: pData.Append(KHBufTest); sl@0: sl@0: TSecurityInfo securityInfo; sl@0: sl@0: CScheduledTask* extTask = new(ELeave) CScheduledTask(taskInfo, sl@0: taskdata, sl@0: ETimeSchedule, sl@0: securityInfo); sl@0: CleanupStack::Pop(taskdata); //taskdata now owned by newTask sl@0: CleanupStack::PushL(extTask); sl@0: sl@0: // set due time, 63284489700000000 microseconds since 1st Jan 0 AD sl@0: // This is UTC time sl@0: TDateTime extDate(2005, EMay, 15, 8, 55, 0, 0); sl@0: TTime extTime(extDate); sl@0: TTime extDueTime(extTime); sl@0: extTask->OnDue(TTsTime(extDueTime,ETrue)); sl@0: sl@0: // externalize sl@0: RFile extFile; sl@0: TFileName extFileName(fileName); sl@0: TEST2(extFile.Replace(TheFsSession,extFileName,EFileWrite), KErrNone); sl@0: RFileBuf extBuf; sl@0: CleanupClosePushL(extBuf); sl@0: extBuf.Attach(extFile); sl@0: RWriteStream extStream(&extBuf); sl@0: sl@0: TRAP(err, extTask->ExternalizeL(extStream)); sl@0: TEST(err == KErrNone); sl@0: sl@0: CleanupStack::PopAndDestroy(3, tzId); sl@0: } sl@0: sl@0: /** sl@0: @file sl@0: @SYMTestCaseID SYSLIB-SCHSVR-CT-0240 sl@0: @SYMTestCaseDesc Check that internalize executes correctly for tasks with UTC times sl@0: @SYMTestPriority low sl@0: @SYMTestActions Create a UTC based instance of CSheduledTask which does an internalize sl@0: @SYMTestExpectedResults The test must not fail. sl@0: @SYMPREQ PREQ234 sl@0: */ sl@0: LOCAL_D void doUtcInternalizeTestL() sl@0: { sl@0: TheTest.Next(_L(" @SYMTestCaseID:SYSLIB-SCHSVR-CT-0240 CScheduledTask Internalize Test (UTC) ")); sl@0: sl@0: // internalize sl@0: RFile intFile; sl@0: TFileName intFileName(fileName); sl@0: TEST2(intFile.Open(TheFsSession,intFileName,EFileRead), KErrNone); sl@0: RFileBuf intBuf; sl@0: CleanupClosePushL(intBuf); sl@0: intBuf.Attach(intFile); sl@0: RReadStream intStream(&intBuf); sl@0: sl@0: CScheduledTask* intTask = CScheduledTask::NewLC(intStream); sl@0: sl@0: // due date/time is 8.55am, 15 May 2005 -Daylight savings apply on this date sl@0: TTsTime ttime = intTask->ValidUntil(); sl@0: TTime time = ttime.GetUtcTime(); sl@0: TDateTime dtime = time.DateTime(); sl@0: sl@0: TEST(dtime.Year() == 2005); sl@0: TEST(dtime.Month() == EMay); sl@0: TEST(dtime.Day() == 15); sl@0: TEST(dtime.Hour() == 8); sl@0: TEST(dtime.Minute() == 55); sl@0: TEST(dtime.Second() == 0); sl@0: TEST(dtime.MicroSecond() == 0); sl@0: sl@0: // test offset - should be zero because the object is UTC based sl@0: TTimeIntervalSeconds offset(0); sl@0: TEST(ttime.GetOffset() == offset); sl@0: sl@0: // test difference between returned values sl@0: TTime utcTime = intTask->ValidUntil().GetUtcTime(); sl@0: TTime localTime = intTask->ValidUntil().GetLocalTime(); sl@0: Int64 t = localTime.Int64() - utcTime.Int64(); sl@0: TTimeIntervalSeconds diff((localTime.Int64() - utcTime.Int64())/1000000); sl@0: // difference should be the kernel offset from UTC sl@0: offset = User::UTCOffset(); sl@0: TEST(diff == offset); sl@0: sl@0: // test that this instance is UTC and not local time based sl@0: TEST(ttime.IsUtc()); sl@0: sl@0: // test data sl@0: HBufC* data = const_cast(&(intTask->Data())); sl@0: TEST(data->Compare(KHBufTest) == 0); sl@0: sl@0: CleanupStack::PopAndDestroy(2, &intBuf); sl@0: } sl@0: sl@0: sl@0: static void RunTestsL() sl@0: { sl@0: doLocalTimeExternalizeTestL(); sl@0: doLocalTimeInternalizeTestL(); sl@0: doUtcExternalizeTestL(); sl@0: doUtcInternalizeTestL(); sl@0: } sl@0: sl@0: //*********************************************************************************** sl@0: GLDEF_C TInt E32Main() sl@0: { sl@0: CTrapCleanup* tc = CTrapCleanup::New(); sl@0: TEST(tc != NULL); sl@0: sl@0: __UHEAP_MARK; sl@0: sl@0: fileName.Copy(KFileName); sl@0: fileName[0] = RFs::GetSystemDriveChar(); sl@0: sl@0: TInt err = TheFsSession.Connect(); sl@0: TEST(err == KErrNone); sl@0: sl@0: TheTest.Title(); sl@0: TheTest.Start(_L("Unit tests for CScheduledTask")); sl@0: TRAP(err, ::RunTestsL()) sl@0: TEST(err == KErrNone); sl@0: sl@0: (void)TheFsSession.Delete(fileName); sl@0: TheFsSession.Close(); sl@0: TheTest.End(); sl@0: TheTest.Close(); sl@0: sl@0: __UHEAP_MARKEND; sl@0: sl@0: delete tc; sl@0: sl@0: return(KErrNone); sl@0: }