systemhealthmanagement/systemhealthmgr/test/tsysmon/src/testapp_loadsysmon.cpp
author Pat Downey <patd@symbian.org>
Thu, 24 Jun 2010 11:22:10 +0100
changeset 39 a003130def4e
parent 0 4e1aa6a622a0
permissions -rw-r--r--
Merge workaround for bug 2630.

// Copyright (c) 2007-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:
//

/**
 @file
 @test
 @internalComponent - Internal Symbian test code   
*/

#include "testapp_loadsysmon.h"
#include "testapps.h"

_LIT(KTestAppLoadSysmon, "testapp_loadsysmon.exe");
_LIT(KLoadSysMonDLL, "loadsysmon.dll");
typedef MSsmLoadSysMon* (*TFuncNewL)(void);

void TestLoadSysMonDllL()
	{
	CTLoadSysMon* loadSysMon = CTLoadSysMon::NewLC();
	
	//Tests Sysmon functionlities using SsmStartupProperties
	CSsmStartupProperties *ssmPropForSelfMon = CSsmStartupProperties::NewLC(KTestAppLoadSysmon, KNullDesC);
	ssmPropForSelfMon->SetExecutionBehaviour(ESsmWaitForSignal);	
	TSsmMonitorInfo monitorInfo;
	monitorInfo.iRestartPolicy = ESsmIgnoreOnFailure;
	monitorInfo.iRestartMode = 0;
	monitorInfo.iTimeout = 0;
	monitorInfo.iRetries = 0;
	ssmPropForSelfMon->SetMonitorInfoL(monitorInfo);// SysMon will not do any restart attempts

	CSsmStartupProperties *ssmForOtherProcMon = CSsmStartupProperties::NewLC(KTestProcGood, KNullDesC);
	ssmForOtherProcMon->SetExecutionBehaviour(ESsmWaitForSignal);	
	ssmForOtherProcMon->SetMonitorInfoL(monitorInfo);// SysMon will not do any restart attempts

	loadSysMon->TestForSysMonFuncUsingSsmStartupPropL(*ssmPropForSelfMon, *ssmForOtherProcMon);
	
	CleanupStack::PopAndDestroy(ssmForOtherProcMon);
	CleanupStack::PopAndDestroy(ssmPropForSelfMon);

	//Tests Sysmon functionlities using StartupProperties
	CStartupProperties *propForSelfMon = CStartupProperties::NewLC(KTestAppLoadSysmon, KNullDesC);
	propForSelfMon->SetMonitored(ETrue);
	propForSelfMon->SetNoOfRetries(0); // SysMon will not do any restart attempts

	CStartupProperties *propForOtherProcMon = CStartupProperties::NewLC(KTestProcGood, KNullDesC);
	propForOtherProcMon->SetMonitored(ETrue);
	propForOtherProcMon->SetNoOfRetries(0); // SysMon will not do any restart attempts

	loadSysMon->TestForSysMonFuncUsingStartupPropL(*propForSelfMon, *propForOtherProcMon);
	
	CleanupStack::PopAndDestroy(propForOtherProcMon);
	CleanupStack::PopAndDestroy(propForSelfMon);
	CleanupStack::PopAndDestroy(loadSysMon);
	}

CTLoadSysMon* CTLoadSysMon::NewLC()
	{
	CTLoadSysMon* self = new (ELeave) CTLoadSysMon();
	CleanupStack::PushL(self);
	self->ConstructL();
	return self;
	}

CTLoadSysMon::CTLoadSysMon()
	{
	}

void CTLoadSysMon::ConstructL()
	{
	User::LeaveIfError(iMonitorProxyLib.Load(KLoadSysMonDLL)); 
		 
	TFuncNewL sysMonNewL = reinterpret_cast<TFuncNewL>(iMonitorProxyLib.Lookup(1));
	iSysMonCli = sysMonNewL();
	}

CTLoadSysMon::~CTLoadSysMon()
	{
	delete iSysMonCli;
	iMonitorProxyLib.Close();
	}

void CTLoadSysMon::TestForSysMonFuncUsingSsmStartupPropL(const CSsmStartupProperties& aSsmStartupPropForSelfMonitor, const CSsmStartupProperties& aSsmStartupPropForOtherProcMonitor)
	{
	// Opens session with sysmoncli through loadsysmon interface
	iSysMonCli->OpenL();

	// Sets up monitor for self
	iSysMonCli->MonitorSelfL(aSsmStartupPropForSelfMonitor);
	// Cancel the Monitor
	iSysMonCli->CancelMonitorSelfL();

	RProcess process;
	CleanupClosePushL(process);
	User::LeaveIfError(process.Create(KTestProcGood, KNullDesC));
	ResumeL(process);

	// Sets up monitor for KTestProcGood
	iSysMonCli->MonitorL(aSsmStartupPropForOtherProcMonitor, process);
	// Cancel the Monitor
	iSysMonCli->CancelMonitorSelfL();

	//Killing the process
	process.Kill(KErrNone);
	CleanupStack::PopAndDestroy(&process);

	// Closes the session with sysmoncli
	iSysMonCli->Close();
	}

void CTLoadSysMon::TestForSysMonFuncUsingStartupPropL(const CStartupProperties& aStartupPropForSelfMonitor, const CStartupProperties& aStartupPropForOtherProcMonitor)
	{
	// Opens session with sysmoncli through loadsysmon interface
	iSysMonCli->OpenL();

	// Sets up monitor for self
	iSysMonCli->MonitorSelfL(aStartupPropForSelfMonitor);
	// Cancel the Monitor
	iSysMonCli->CancelMonitorSelfL();

	RProcess process;
	CleanupClosePushL(process);
	User::LeaveIfError(process.Create(KTestProcGood, KNullDesC));
	ResumeL(process);

	// Sets up monitor for KTestProcGood
	iSysMonCli->MonitorL(aStartupPropForOtherProcMonitor, process);
	// Cancel the Monitor
	iSysMonCli->CancelMonitorSelfL();

	//Killing the process
	process.Kill(KErrNone);
	CleanupStack::PopAndDestroy(&process);

	// Closes the session with sysmoncli
	iSysMonCli->Close();
	}

/** 
Waits for the process to rendevouz, then resumes it.
*/
void CTLoadSysMon::ResumeL(RProcess& aProcess)
	{
	TRequestStatus status;
	aProcess.Rendezvous(status);
	if (status == KRequestPending)
		{
		aProcess.Resume();
		}
	else
		{
		aProcess.Kill(KErrGeneral);
		User::Leave(status.Int());
		}
	
	User::WaitForRequest(status);
	}

//  Global Functions
TInt E32Main()
	{
	// Create cleanup stack
	__UHEAP_MARK;
	CTrapCleanup* cleanup = CTrapCleanup::New();
	
	if (!cleanup)
		{
		RProcess().Terminate(KErrNoMemory);
		}

	// Run application code inside TRAP harness
	TRAPD(testError, TestLoadSysMonDllL());
	if (testError)
		{
		RProcess().Terminate(testError);
		}

	delete cleanup;
	__UHEAP_MARKEND;
	return KErrNone;
	} //lint -e714 Suppress 'not referenced'