commonappservices/alarmservertest/TestMultipleAlarmsSuite/src/TestStartAlertServerStep.cpp
changeset 0 2e3d3ce01487
--- /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 <uikon/eikalsrv.h>
+
+/**
+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<CTestStartAlertServerStep*>(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("<B>Alert Server thread has started, Max alarms = %D</B>"), 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;	
+	}
+