diff -r 000000000000 -r 2e3d3ce01487 commonappservices/alarmservertest/TestMultipleAlarmsSuite/src/TestStartAlertServerStep.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/commonappservices/alarmservertest/TestMultipleAlarmsSuite/src/TestStartAlertServerStep.cpp Tue Feb 02 10:12:00 2010 +0200 @@ -0,0 +1,202 @@ +// 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: +// Contains implementation of CTestStartAlertServerStep class +// +// + +/** + @file + @internalTechnology +*/ + +// User Include +#include "TestStartAlertServerStep.h" +#include "AlarmControlsManager.h" + +// System Include +#include + +/** +Constructor. Sets the test step name. Testserver reference passed to make use +of TEF's method of sharing data between test steps +Max alarms defaults to 1 if not mentioned in ini +@internalTechnology +@test +*/ +CTestStartAlertServerStep::CTestStartAlertServerStep(CTestMultipleAlarmsServer& aTestServer) +: CTestBaseStep(aTestServer) + { + //Call base class method to set human readable name for test step + SetTestStepName(KTestStartAlertServerStep); + } + +/** +Base class pure virtual. +@return EPass or EFail indicating the result of the test step. +@internalTechnology +@test +*/ +TVerdict CTestStartAlertServerStep::doTestStepL() + { + TInt maxAlarms; + if(!ReadIntsFromConfig(ConfigSection(), &KIniMaxAlarms(), &maxAlarms, NULL)) + { + INFO_PRINTF1(_L("maxalarms value not found in ini. maxalarms will hence default to 1")); + maxAlarms = 1; + } + + // Let the test server record the current maxalarms value, to share it + // with other test steps + TestServer()->CurrentMaxAlarms() = maxAlarms; + + PrintIfError(CreateThreadAndStartAltSrv()); + return TestStepResult(); + } + +/** +Starts the alarm alert server +@param aTestStep Pointer to the CTestStartAlertServerStep. +@internalTechnology +@test +*/ +LOCAL_C void StartAlarmAlertServer(CTestMultipleAlarmsServer* aTestServer) + { + const TInt KMaxAttempts = 5; + TInt error = KErrNone; + CEikServAlarmAlertServer* alertServer = NULL; + CAlarmControlsManager *manager = NULL; + + TRAP(error, manager = CAlarmControlsManager::NewL(*aTestServer)); + + if(error == KErrNone) + { + aTestServer->AlarmControlsManager() = manager; + for(TInt attempt = 0; attempt < KMaxAttempts; ++attempt) + { + if(aTestServer->CurrentMaxAlarms() == 1) + {// Calling the single alarm notification version. Can still call the multiple alarm + // version with 1 as maxalarms value, but still just to cover the existing API too. + TRAP(error, alertServer = CEikServAlarmAlertServer::NewL(manager)); + } + else + {// Multiple alarm version + TRAP(error, alertServer = CEikServAlarmAlertServer::NewL(manager, aTestServer->CurrentMaxAlarms())); + } + + if(error != KErrAlreadyExists) + {// Although the thread is shown as dead, EPOC seems to do some + // background closing operations, and does not allow us to create a + // thread with the same name till then. So we try a few more times + // only if it is KErrAlreadyExists + break; + } + } + } + // Tell the test step thread about the status + RThread::Rendezvous(error); + + if(error == KErrNone) + { + aTestServer->AlertServer() = alertServer; + + // enter the active scheduler if everything is ok + CActiveScheduler::Start(); + + // When thread exits, clean up + delete (aTestServer->AlertServer()); + delete (aTestServer->AlarmControlsManager()); + } + } + +/** +Thread entry point +@return Error code of the operation performed +@internalTechnology +@test +*/ +static TInt ThreadStartFn(TAny* aPtr) + { + __UHEAP_MARK; + CActiveScheduler* sched = new(ELeave) CActiveScheduler; + CActiveScheduler::Install(sched); + CTrapCleanup* cleanup = CTrapCleanup::New(); + if(cleanup == NULL) + { + delete sched; + return KErrNoMemory; + } + CTestMultipleAlarmsServer* testServer = (static_cast(aPtr))->TestServer(); + StartAlarmAlertServer(testServer); + delete sched; + delete cleanup; + __UHEAP_MARKEND; + return KErrNone; + } + + +/** +Starts the alarm alert server +@param aMaxAlarms Maximum number of alarms for which we want the alert server +to notify at a time +@return The error code +@internalTechnology +@test +*/ +TInt CTestStartAlertServerStep::CreateThreadAndStartAltSrv() + { + _LIT(KChildThreadName, "ChildThreadThatStartsAlarmAlertServerInAlarmAlertServerTests"); + TBuf<65> childThreadName(KChildThreadName); + RThread childThread; + + const TInt KMaxTestThreadHeapSize = 0x10000; + + TInt err = childThread.Create( + childThreadName, + ThreadStartFn, + KDefaultStackSize, + KMinHeapSize, + KMaxTestThreadHeapSize, + this, + EOwnerProcess); + + if(err == KErrNone) + { + TRequestStatus status; + childThread.Rendezvous(status); + if(status != KRequestPending) + { + childThread.Kill(0); + } + else + { + childThread.Resume(); + + // Cache the thread handle, so as to examine its death later + TestServer()->AltSrvThread() = childThread; + + INFO_PRINTF2(_L("Alert Server thread has started, Max alarms = %D"), TestServer()->CurrentMaxAlarms()); + } + User::WaitForRequest(status); + + // Examine the child thread's exit type and reason. + // If it is a panic, it can be KErrNone too, and if so, make it KErrGeneral, + // so that the Test Step does not wrongly EPass seeing KErrNone in err. + // The Kern-Exec Panic 0 information will not be lost either, as each test + // step checks and displays this in its Postamble. + err = (childThread.ExitType()==EExitPanic && childThread.ExitReason() == KErrNone + ) ? KErrGeneral : status.Int(); + } + return err; + } +