genericservices/taskscheduler/Test/Testexecute/TEF_SSA_ScheduleSuite/src/INC072424_step.cpp
changeset 0 e4d67989cc36
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/genericservices/taskscheduler/Test/Testexecute/TEF_SSA_ScheduleSuite/src/INC072424_step.cpp	Tue Feb 02 02:01:42 2010 +0200
@@ -0,0 +1,543 @@
+// Copyright (c) 2005-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 <schinfo.h>
+#include <schinfointernal.h>
+
+#include "Thelpers.h"  // KDefaultTimeout
+#include "INC072424_step.h"
+
+_LIT(KLaunch, "Launch");
+_LIT(KNotLaunch, "NotLaunch");
+_LIT(KStartupState, "StartupState");
+_LIT(KExpectedResult, "ExpectedResult");
+
+_LIT(KMissingInputParam, "Missing input parameter");
+_LIT(KBadInput, "Fail to parse %S");
+
+// This TEF test has to wait for MinimalTaskHandler to signal a semaphore.
+// The 2 minutes wait time is chosen to minimize possibility of early
+// timeout. The kernel will terminate the wait when the semaphore is 
+// signaled. Thus in reality the test will only wait for a few seconds.
+const TInt KSuccessfulTaskLaunchTimeout = KDefaultTimeout;
+
+// In the case where task is not expected to launch, a shorter timeout
+// is needed because the test has to wait the full amount of the
+// timeout value.
+const TInt KNoTaskLaunchTimeout = 10000000;
+
+CSSA_StateTransitionStep::CSSA_StateTransitionStep()
+	{
+	SetTestStepName(KSSA_StateTransitionStep);
+	}
+
+CSSA_StateTransitionStep::~CSSA_StateTransitionStep()
+	{
+	}
+
+TVerdict CSSA_StateTransitionStep::doTestStepL()
+	{
+	TStartupStateIdentifier nextState;
+	TBool expectingTaskToLaunch;
+	GetParametersL(nextState, expectingTaskToLaunch);
+
+	INFO_PRINTF3(_L("SS Transition test, next state 0x%X, expect launch %d"), nextState, expectingTaskToLaunch);
+
+	// Start Schsvr in critical dynamic state. Set current time
+	// to 9:55 am
+	BeginTestSetupL();
+
+	// Creates a time based schedule    
+    TSchedulerItemRef ref;
+    // This is the time when we want the time-based schedule to fire
+    TDateTime datetime1(2000, EJanuary, 1, 10, 0, 0, 0);
+    TTsTime dueTime(datetime1, EFalse);
+
+	_LIT(KSchTestName, "SSA Transition Test");
+	AddTransientScheduleL(KSchTestName, dueTime, ref);
+
+	INFO_PRINTF2(_L("Set clock to 4 s before task due and change SS to 0x%X"), nextState);
+    SchSvrHelpers::SetHomeTimeL(TTime(TDateTime(2000, EJanuary, 1, 9, 59, 56, 0))); // 9:59.56 am
+
+    User::LeaveIfError(iScheduler.EnableSchedule(ref.iHandle));
+	TInt ret = RequestDomainStateTransition(nextState);
+
+	// If next state is EStartupStateUndefined, then badhandle is returened.
+    TEST(ret == KErrNone || ret == KErrBadHandle);
+
+    TInt timeOutMicroSeconds = (expectingTaskToLaunch) ? KSuccessfulTaskLaunchTimeout : KNoTaskLaunchTimeout;
+
+    ret = STaskSemaphore::WaitL(timeOutMicroSeconds);
+
+    INFO_PRINTF2(_L("Sema wait return code is %d"), ret);
+	TBool pass = (expectingTaskToLaunch && (ret == KErrNone)) ||
+		         (!expectingTaskToLaunch && (ret == KErrTimedOut));
+    TEST(pass);
+	return TestStepResult();
+	}
+
+void CSSA_StateTransitionStep::GetParametersL(TStartupStateIdentifier& aState, TBool& aLaunch)
+	{
+	_LIT(KUndefinedState, "Undefined");
+	_LIT(KBeforeCSState, "BeforeCS");
+	_LIT(KCSState, "CS");
+	_LIT(KCDState, "CD");
+	_LIT(KNCState, "NC");
+	_LIT(KNCPlusState, "NCPlus");
+
+	TPtrC data;
+	if (!GetStringFromConfig(ConfigSection(), KStartupState, data))
+		{
+		ERR_PRINTF1(KMissingInputParam);
+		SetTestStepResult(EFail);
+		User::Leave(KErrCorrupt);
+		}
+
+	if (data == KUndefinedState)
+		{
+		aState = EStartupStateUndefined;
+		}
+	else if (data == KBeforeCSState)
+		{
+		aState = EReservedStartUpState1;
+		}
+	else if (data == KCSState)
+		{
+		aState = EStartupStateCriticalStatic;
+		}
+	else if (data == KCDState)
+		{
+		aState = EStartupStateCriticalDynamic;
+		}
+	else if (data == KNCState)
+		{
+		aState = EStartupStateNonCritical;
+		}
+	else if (data == KNCPlusState)
+		{
+		aState = EReservedStartUpState4;
+		}
+	else
+		{
+		ERR_PRINTF2(KBadInput, &data);
+		SetTestStepResult(EFail);
+		User::Leave(KErrCorrupt);
+		}
+
+	// Next parameter
+	if (!GetStringFromConfig(ConfigSection(), KExpectedResult, data))
+		{
+		ERR_PRINTF1(KMissingInputParam);
+		SetTestStepResult(EFail);
+		User::Leave(KErrCorrupt);
+		}
+
+	if (data == KLaunch)
+		{
+		aLaunch = ETrue;
+		}
+	else if (data == KNotLaunch)
+		{
+		aLaunch = EFalse;
+		}
+	else
+		{
+		ERR_PRINTF2(KBadInput, &data);
+		SetTestStepResult(EFail);
+		User::Leave(KErrCorrupt);
+		}
+	}
+
+//--------------------------------------------------------
+CSSA_PersistentScheduleStep::CSSA_PersistentScheduleStep()
+	{
+	SetTestStepName(KSSA_PersistentScheduleStep);
+	}
+
+CSSA_PersistentScheduleStep::~CSSA_PersistentScheduleStep()
+	{
+	}
+
+TVerdict CSSA_PersistentScheduleStep::doTestStepL()
+	{
+	TInt goToNonCritical;
+	TBool expectingTaskToLaunch;
+	GetParametersL(goToNonCritical, expectingTaskToLaunch);
+
+	INFO_PRINTF1(_L("Persistent schedule test"));
+	// Start Schsvr in critical dynamic state. Set current time
+	// to 9:55 am
+	BeginTestSetupL();
+
+	// Creates a time based schedule    
+    TSchedulerItemRef ref;
+    // This is the time when we want the time-based schedule to fire
+    TDateTime datetime1(2000, EJanuary, 1, 10, 0, 0, 0);
+    TTsTime dueTime(datetime1, EFalse);
+
+	_LIT(KSchTestName, "Persistent Schedule Test");
+	AddPersistentScheduleL(KSchTestName, dueTime, ref);
+
+	// Set startup state to critical dynamic before re-starting server
+	User::LeaveIfError(RequestDomainStateTransition(EStartupStateCriticalDynamic));
+
+	INFO_PRINTF1(_L("Set clock to 4 s before task due"));
+    SchSvrHelpers::SetHomeTimeL(TTime(TDateTime(2000, EJanuary, 1, 9, 59, 56, 0))); // 9:59.56 am
+
+    User::LeaveIfError(iScheduler.EnableSchedule(ref.iHandle));
+
+	// Setup complete. Re-start schsvr and observe outcome.
+	RestartSchedulerL();
+
+	if (goToNonCritical)
+		{
+		User::LeaveIfError(RequestDomainStateTransition(EStartupStateNonCritical));
+		}
+
+    TInt timeOutMicroSeconds = (expectingTaskToLaunch) ? KSuccessfulTaskLaunchTimeout : KNoTaskLaunchTimeout;
+
+    TInt ret = STaskSemaphore::WaitL(timeOutMicroSeconds);
+
+    INFO_PRINTF2(_L("Sema wait return code is %d"), ret);
+	TBool pass = (expectingTaskToLaunch && (ret == KErrNone)) ||
+		         (!expectingTaskToLaunch && (ret == KErrTimedOut));
+    TEST(pass);
+	return TestStepResult();
+	}
+
+void CSSA_PersistentScheduleStep::GetParametersL(TInt& aDoNCTransition, TBool& aLaunch)
+	{
+	_LIT(KGoToNC, "GoToNC");
+	TPtrC strdata;
+	TInt intdata, r1, r2;
+
+	r1 = GetIntFromConfig(ConfigSection(), KGoToNC, intdata);
+	r2 = GetStringFromConfig(ConfigSection(), KExpectedResult, strdata);
+	if (!r1 || !r2)
+		{
+		ERR_PRINTF1(KMissingInputParam);
+		SetTestStepResult(EFail);
+		User::Leave(KErrCorrupt);
+		}
+	aDoNCTransition = intdata;
+	aLaunch = (strdata == KLaunch);
+	}
+
+//--------------------------------------------------------
+CSSA_ConditionScheduleStep::CSSA_ConditionScheduleStep()
+	{
+	SetTestStepName(KSSA_ConditionScheduleStep);
+	}
+
+CSSA_ConditionScheduleStep::~CSSA_ConditionScheduleStep()
+	{
+	// Reset the value so as not to affect next test
+	RProperty::Set(KTestUid, KTestKey1, 0);
+	}
+
+TVerdict CSSA_ConditionScheduleStep::doTestStepL()
+	{
+	TInt matchCondFirst, useTransient;
+	GetParametersL(matchCondFirst, useTransient);
+
+	INFO_PRINTF1(_L("Condition schedule test"));
+	// Start Schsvr in critical dynamic state. Set current time
+	// to 9:55 am
+	BeginTestSetupL();
+
+	// Creates a condition based schedule    
+    TSchedulerItemRef ref;
+    // If condition not met, task is run one year from now.
+    TDateTime datetime1(2001, EJanuary, 1, 10, 0, 0, 0);
+    TTsTime dueTime(datetime1, EFalse);
+
+	_LIT(KSchTestName, "Condition Schedule Test");
+	AddConditionScheduleL(KSchTestName, dueTime, ref, KTestKey1, useTransient);
+    User::LeaveIfError(iScheduler.EnableSchedule(ref.iHandle));
+
+	if (matchCondFirst)
+		{
+		User::LeaveIfError(RProperty::Set(KTestUid, KTestKey1, KKeyValue));
+		}
+	else
+		{
+		User::LeaveIfError(RequestDomainStateTransition(EStartupStateNonCritical));
+		}
+
+    SchSvrHelpers::SetHomeTimeL(TTime(TDateTime(2000, EJanuary, 1, 9, 59, 56, 0))); // 9:59.56 am
+
+    TInt ret = STaskSemaphore::WaitL(KNoTaskLaunchTimeout);
+    INFO_PRINTF2(_L("Expecting timeout, return code is %d"), ret);
+	TESTL(ret == KErrTimedOut);
+
+	if (matchCondFirst)
+		{
+		User::LeaveIfError(RequestDomainStateTransition(EStartupStateNonCritical));
+		}
+	else
+		{
+		User::LeaveIfError(RProperty::Set(KTestUid, KTestKey1, KKeyValue));
+		}
+
+    ret = STaskSemaphore::WaitL(KSuccessfulTaskLaunchTimeout);
+    INFO_PRINTF2(_L("Expecting ok, return code is %d"), ret);
+	TESTL(ret == KErrNone);
+
+	return TestStepResult();
+	}
+
+void CSSA_ConditionScheduleStep::GetParametersL(TInt& aMatchCondFirst,
+												TInt& aUseTransient)
+	{
+	_LIT(KMatchCondBeforeNC, "MatchCondBeforeNC");
+	_LIT(KUseTransient, "UseTransient");
+	TInt r1, r2;
+
+	r1 = GetIntFromConfig(ConfigSection(), KMatchCondBeforeNC, aMatchCondFirst);
+	r2 = GetIntFromConfig(ConfigSection(), KUseTransient, aUseTransient);
+	if (!r1 || !r2)
+		{
+		ERR_PRINTF1(KMissingInputParam);
+		SetTestStepResult(EFail);
+		User::Leave(KErrCorrupt);
+		}
+	}
+
+//---------------------------------------------------------------------
+CSSA_EnvironmentChangeStep::CSSA_EnvironmentChangeStep()
+	{
+	SetTestStepName(KSSA_EnvironmentChangeStep);
+	}
+
+CSSA_EnvironmentChangeStep::~CSSA_EnvironmentChangeStep()
+	{
+	}
+
+TVerdict CSSA_EnvironmentChangeStep::doTestStepL()
+	{
+	INFO_PRINTF1(_L("Transient schedule with System time rewind backward"));
+
+	// Start Schsvr in critical dynamic state. Set current time
+	// to 9:55 am
+	BeginTestSetupL();
+
+	// Creates a time based schedule    
+    TSchedulerItemRef ref;
+    // This is the time when we want the time-based schedule to fire
+    TDateTime datetime1(2000, EJanuary, 1, 10, 0, 0, 0);
+    TTsTime dueTime(datetime1, EFalse);
+
+	_LIT(KSchTestName, "Environment Change Test");
+	AddTransientScheduleL(KSchTestName, dueTime, ref);
+    User::LeaveIfError(iScheduler.EnableSchedule(ref.iHandle));
+
+	INFO_PRINTF1(_L("Set clock to 4 s before task due"));
+    SchSvrHelpers::SetHomeTimeL(TTime(TDateTime(2000, EJanuary, 1, 9, 59, 56, 0))); // 9:59.56 am
+
+    TInt ret = STaskSemaphore::WaitL(KNoTaskLaunchTimeout);
+    INFO_PRINTF2(_L("Expecting timeout, return code is %d"), ret);
+	TESTL(ret == KErrTimedOut);
+
+	INFO_PRINTF1(_L("Rewind clock back to 4 s before task due and set SS to NC"));
+    SchSvrHelpers::SetHomeTimeL(TTime(TDateTime(2000, EJanuary, 1, 9, 59, 56, 0))); // 9:59.56 am
+	User::LeaveIfError(RequestDomainStateTransition(EStartupStateNonCritical));
+
+    ret = STaskSemaphore::WaitL(KSuccessfulTaskLaunchTimeout);
+    INFO_PRINTF2(_L("Sema wait return code is %d"), ret);
+    TEST(ret == KErrNone);
+	return TestStepResult();
+	}
+
+//---------------------------------------------------------------------
+CSSA_EditTransientStep::CSSA_EditTransientStep()
+	{
+	SetTestStepName(KSSA_EditTransientStep);
+	}
+
+CSSA_EditTransientStep::~CSSA_EditTransientStep()
+	{
+	}
+
+TVerdict CSSA_EditTransientStep::doTestStepL()
+	{
+	INFO_PRINTF1(_L("Edit Transient schedule"));
+
+	// Start Schsvr in critical dynamic state. Set current time
+	// to 9:55 am
+	BeginTestSetupL();
+
+	// Creates a time based schedule    
+    TSchedulerItemRef ref;
+    // This is the time when we want the time-based schedule to fire
+    TDateTime datetime1(2000, EJanuary, 1, 10, 0, 0, 0);
+    TTsTime dueTime(datetime1, EFalse);
+
+	_LIT(KSchTestName, "Edit Transient Schedule Test");
+	AddTransientScheduleL(KSchTestName, dueTime, ref);
+    User::LeaveIfError(iScheduler.EnableSchedule(ref.iHandle));
+
+    TDateTime datetime2(2000, EJanuary, 1, 10, 2, 0, 0); // 10:02.00 am
+    TTsTime newduetime(datetime2, EFalse);
+    CScheduleEntryInfoArray* entryList = new (ELeave) CScheduleEntryInfoArray(1);
+    CleanupStack::PushL(entryList);
+
+    TScheduleEntryInfo2 entry (newduetime, EDaily, 1, 30);
+    entryList->AppendL(entry);
+
+    User::LeaveIfError(iScheduler.EditSchedule(ref.iHandle, *entryList));
+    CleanupStack::PopAndDestroy(entryList);
+
+	INFO_PRINTF1(_L("Set clock to 4 s before old due time and set SS = NC"));
+    SchSvrHelpers::SetHomeTimeL(TTime(TDateTime(2000, EJanuary, 1, 9, 59, 56, 0))); // 9:59.56 am
+
+	User::LeaveIfError(RequestDomainStateTransition(EStartupStateNonCritical));
+
+    TInt ret = STaskSemaphore::WaitL(KNoTaskLaunchTimeout);
+    INFO_PRINTF2(_L("Expecting timeout, return code is %d"), ret);
+	TESTL(ret == KErrTimedOut);
+
+
+	INFO_PRINTF1(_L("Set clock to 4 s before new due time."));
+    SchSvrHelpers::SetHomeTimeL(TTime(TDateTime(2000, EJanuary, 1, 10, 1, 56, 0))); // 10:01.56 am
+
+    ret = STaskSemaphore::WaitL(KSuccessfulTaskLaunchTimeout);
+    INFO_PRINTF2(_L("Sema wait return code is %d"), ret);
+    TEST(ret == KErrNone);
+	return TestStepResult();
+	}
+
+//---------------------------------------------------------------------
+CSSA_EditPersistentStep::CSSA_EditPersistentStep()
+	{
+	SetTestStepName(KSSA_EditPersistentStep);
+	}
+
+CSSA_EditPersistentStep::~CSSA_EditPersistentStep()
+	{
+	}
+
+TVerdict CSSA_EditPersistentStep::doTestStepL()
+	{
+	INFO_PRINTF1(_L("Edit Persistent schedule"));
+
+	// Start Schsvr in critical dynamic state. Set current time
+	// to 9:55 am
+	BeginTestSetupL();
+
+	// Creates a time based schedule    
+    TSchedulerItemRef ref;
+    // This is the time when we want the time-based schedule to fire
+    TDateTime datetime1(2000, EJanuary, 1, 10, 0, 0, 0);
+    TTsTime dueTime(datetime1, EFalse);
+
+	_LIT(KSchTestName, "Edit Persistent Schedule Test");
+	AddPersistentScheduleL(KSchTestName, dueTime, ref);
+    User::LeaveIfError(iScheduler.EnableSchedule(ref.iHandle));
+
+    TDateTime datetime2(2000, EJanuary, 1, 10, 2, 0, 0); // 10:02.00 am
+    TTsTime newduetime(datetime2, EFalse);
+    CScheduleEntryInfoArray* entryList = new (ELeave) CScheduleEntryInfoArray(1);
+    CleanupStack::PushL(entryList);
+
+    TScheduleEntryInfo2 entry (newduetime, EDaily, 1, 30);
+    entryList->AppendL(entry);
+
+    User::LeaveIfError(iScheduler.EditSchedule(ref.iHandle, *entryList));
+    CleanupStack::PopAndDestroy(entryList);
+
+	User::LeaveIfError(RequestDomainStateTransition(EStartupStateNonCritical));
+	RestartSchedulerL();
+
+
+	INFO_PRINTF1(_L("Schsvr re-started. Set clock to 4 s before old due time and set SS = NC"));
+    SchSvrHelpers::SetHomeTimeL(TTime(TDateTime(2000, EJanuary, 1, 9, 59, 56, 0))); // 9:59.56 am
+
+    TInt ret = STaskSemaphore::WaitL(KNoTaskLaunchTimeout);
+    INFO_PRINTF2(_L("Expecting timeout, return code is %d"), ret);
+	TESTL(ret == KErrTimedOut);
+
+
+	INFO_PRINTF1(_L("Set clock to 4 s before new due time."));
+    SchSvrHelpers::SetHomeTimeL(TTime(TDateTime(2000, EJanuary, 1, 10, 1, 56, 0))); // 10:01.56 am
+
+    ret = STaskSemaphore::WaitL(KSuccessfulTaskLaunchTimeout);
+    INFO_PRINTF2(_L("Sema wait return code is %d"), ret);
+    TEST(ret == KErrNone);
+	return TestStepResult();
+	}
+
+//---------------------------------------------------------------------
+CSSA_EditConditionStep::CSSA_EditConditionStep()
+	{
+	SetTestStepName(KSSA_EditConditionStep);
+	}
+
+CSSA_EditConditionStep::~CSSA_EditConditionStep()
+	{
+ 	// reset RProperty value
+	RProperty::Set(KTestUid, KTestKey1, 0);
+	RProperty::Set(KTestUid, KTestKey2, 0);
+	}
+
+TVerdict CSSA_EditConditionStep::doTestStepL()
+	{
+	INFO_PRINTF1(_L("Edit Condition schedule"));
+
+	// Start Schsvr in critical dynamic state. Set current time
+	// to 9:55 am
+	BeginTestSetupL();
+
+	// Creates a condition based schedule    
+    TSchedulerItemRef ref;
+    // If condition not met, task is run one year from now.
+    TDateTime datetime1(2001, EJanuary, 1, 10, 0, 0, 0);
+    TTsTime dueTime(datetime1, EFalse);
+
+	_LIT(KSchTestName, "Edit Persistent Condition Schedule Test");
+	AddConditionScheduleL(KSchTestName, dueTime, ref, KTestKey1, EFalse);
+    User::LeaveIfError(iScheduler.EnableSchedule(ref.iHandle));
+
+	CreatePSKeyL(KTestKey2);
+
+    CSchConditionArray* conditionList = new (ELeave) CSchConditionArray(1);
+    CleanupStack::PushL(conditionList);
+    TTaskSchedulerCondition condition1;
+    condition1.iCategory = KTestUid;
+    condition1.iKey        = KTestKey2;
+    condition1.iState    = KKeyValue;
+    condition1.iType    = TTaskSchedulerCondition::EEquals;
+    conditionList->AppendL(condition1);
+
+    User::LeaveIfError(iScheduler.EditSchedule(ref.iHandle, *conditionList, dueTime));
+    CleanupStack::PopAndDestroy(conditionList);
+
+	User::LeaveIfError(RequestDomainStateTransition(EStartupStateNonCritical));
+	RestartSchedulerL();
+
+
+	INFO_PRINTF1(_L("Schsvr re-started in NC. Set old property to cond met."));
+	User::LeaveIfError(RProperty::Set(KTestUid, KTestKey1, KKeyValue));
+
+    TInt ret = STaskSemaphore::WaitL(KNoTaskLaunchTimeout);
+    INFO_PRINTF2(_L("Expecting timeout, return code is %d"), ret);
+	TESTL(ret == KErrTimedOut);
+
+	INFO_PRINTF1(_L("Set new property to cond met."));
+	User::LeaveIfError(RProperty::Set(KTestUid, KTestKey2, KKeyValue));
+
+    ret = STaskSemaphore::WaitL(KSuccessfulTaskLaunchTimeout);
+    INFO_PRINTF2(_L("Sema wait return code is %d"), ret);
+    TEST(ret == KErrNone);
+	return TestStepResult();
+	}