sysstatemgmt/systemstateplugins/test/tcmncustomcmd/src/tcmncustomcmd_step_cancelmonitoring.cpp
changeset 0 4e1aa6a622a0
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/sysstatemgmt/systemstateplugins/test/tcmncustomcmd/src/tcmncustomcmd_step_cancelmonitoring.cpp	Tue Feb 02 00:53:00 2010 +0200
@@ -0,0 +1,200 @@
+// Copyright (c) 2008-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 "tcmncustomcmd_step_cancelmonitoring.h"
+#include "ssmcmncustomcmdfactory.h"
+#include "cmdcancelmonitoring.h"
+#include "gtestapps.h"
+#include "gsatestprocgoodsession.h"
+#include <ssm/ssmcustomcommand.h>
+#include <ssm/ssmstartupproperties.h>
+
+CCustomCmdTestCancelMonitoring::~CCustomCmdTestCancelMonitoring()
+	{
+    iProcStartSignalSem.Close();
+	}
+
+CCustomCmdTestCancelMonitoring::CCustomCmdTestCancelMonitoring()
+	{
+	SetTestStepName(KTCCustomCmdTestCancelMonitoring);
+	}
+
+/**
+Old Test CaseID 		APPFWK-CUSTCMD-0001
+New Test CaseID 		DEVSRVS-SSPLUGINS-CUSTCMD-0001
+ */
+
+void CCustomCmdTestCancelMonitoring::TestCustomCmdCancelMonitoringL()
+	{
+	INFO_PRINTF1(_L("TestCustomCmdPersistRebootsL"));
+
+	//Create Persist Reboots custom command
+	MSsmCustomCommand* customCmdCancelMonitoring = SsmCmnCustomCmdFactory::CmdCancelMonitoringL();
+	RFs aFs;
+	aFs.Connect();
+	CSsmCustomCommandEnv* cmdEnv = CSsmCustomCommandEnv::NewL(aFs);
+	CleanupStack::PushL(cmdEnv);
+	
+	//Initialise the command.
+	customCmdCancelMonitoring->Initialize(cmdEnv);
+
+	// Creates two processes and sets up monitoring for them
+    RProcess process;
+    CleanupClosePushL(process);
+    CreateProcessAndMonitorL(process, KTestProcGood, KLaunchServerCommandLineOption);
+
+    RProcess process1;
+    CleanupClosePushL(process1);
+    CreateProcessAndMonitorL(process1, KTestAppGood, KLaunchProcessAndWait);
+	
+	TRequestStatus status;
+	customCmdCancelMonitoring->Execute(KNullDesC8, status);
+	User::WaitForRequest(status);
+	TEST(KErrNone == status.Int());
+	INFO_PRINTF2(_L("Execute completed with %d"), status.Int());
+	
+	customCmdCancelMonitoring->Execute(KNullDesC8, status);
+    customCmdCancelMonitoring->ExecuteCancel();
+    
+    //Reference plugins doesnt have Cancel implementation and also by the time ExecuteCancel()
+    //is called it might have completed executing Execute() function. Thats is the reason for 
+    //checking the status to KErrNone instead of KErrCancel.
+    User::WaitForRequest(status);
+    TEST(KErrNone == status.Int());
+	
+    // Tests whether the monitoring the both the processes is cancelled
+    DoTestCancelMonitoringL(process, process1);
+
+	customCmdCancelMonitoring->Close();
+	customCmdCancelMonitoring->Release();
+	CleanupStack::PopAndDestroy(3, cmdEnv);
+	INFO_PRINTF1(_L("Ending the CCustomCmdTestCancelMonitoring tests "));
+
+	}
+
+void CCustomCmdTestCancelMonitoring::CreateProcessAndMonitorL(RProcess& aProcess, const TDesC& aProcName, const TDesC& aArgs)
+    {
+    INFO_PRINTF2(_L("Going to start %S process"), &aProcName);
+    User::LeaveIfError(aProcess.Create(aProcName, aArgs));
+    TRequestStatus status;
+    aProcess.Rendezvous(status);
+    if (status == KRequestPending)
+        {
+        aProcess.Resume();
+        
+        User::WaitForRequest(status);
+        TEST(KErrNone == status.Int());
+        INFO_PRINTF3(_L("Process %S Rendezvoused with %d"), &aProcName, status.Int());
+        
+        INFO_PRINTF2(_L("Waiting for %S to be started"), &aProcName);
+        iProcStartSignalSem.Wait();
+        
+        INFO_PRINTF1(_L("Open session with Sysmon Server"));
+        RSysMonSession sysmonSess;
+        CleanupClosePushL(sysmonSess);
+        sysmonSess.OpenL();
+     
+        //Setup monitoring  
+        INFO_PRINTF1(_L("Going to request process monitoring"));
+        CSsmStartupProperties* prop = CSsmStartupProperties::NewLC(aProcName, aArgs);
+        prop->SetExecutionBehaviour(static_cast <TSsmExecutionBehaviour> (ESsmWaitForSignal));
+        TSsmMonitorInfo monitorInfo;
+        monitorInfo.iRestartPolicy = ESsmIgnoreOnFailure;
+        monitorInfo.iRestartMode = 0;
+        monitorInfo.iTimeout = 0;
+        monitorInfo.iRetries = 1;
+        prop->SetMonitorInfoL(monitorInfo);
+        TRAPD(err, sysmonSess.MonitorL(*prop, aProcess));
+        INFO_PRINTF2(_L("Process monitoring set up with %d"), err);
+        TEST(err == KErrNone); 
+        CleanupStack::PopAndDestroy(2, &sysmonSess);
+        }
+    else
+        {
+        aProcess.Kill(KErrGeneral);
+        TESTEL(EFalse, status.Int());
+        }
+    }
+
+void CCustomCmdTestCancelMonitoring::DoTestCancelMonitoringL(RProcess& aProcess1, RProcess& aProcess2)
+    {
+    TEST(Exists(KTestProcGood) && Exists(KTestAppGood));
+    aProcess1.Kill(KErrNone);
+    aProcess2.Kill(KErrNone);
+    TEST(EFalse == Exists(KTestProcGood) && EFalse == Exists(KTestAppGood));
+
+    INFO_PRINTF1(_L("Killed monitored process."));
+
+    // If the process is running with SSM SID then the monitoring is cancelled and processes will not be
+    // restarted
+    INFO_PRINTF1(_L("Going to sleep for 16 seconds."));     
+    User::After(1600000);
+
+    INFO_PRINTF1(_L("Check that the process wasn't restarted"));
+    TEST(EFalse == Exists(KTestProcGood) && EFalse == Exists(KTestAppGood));
+    }
+
+/**
+Asserts that at least one process starting with the name aProcessName is running.
+*/
+TBool CCustomCmdTestCancelMonitoring::Exists(const TDesC& aProcessName)
+    {   
+    TPtrC ptr(aProcessName);
+    ptr.Set( ptr.Ptr(), ptr.Find(_L(".")) );
+    TFullName procSerchTerm( ptr );
+    procSerchTerm += _L("*");
+
+    TFindProcess find(procSerchTerm);
+    TFullName name;
+    TBool found = EFalse;
+    while(find.Next(name)==KErrNone)
+        {
+        RProcess process;
+        const TInt err = process.Open(find);
+        if (err == KErrNone)
+            {
+            if (process.ExitType() == EExitPending)
+                {
+                found = ETrue;
+                process.Close(); 
+                break;
+                }
+            process.Close(); 
+            }
+        }
+    return found;
+    }
+
+TVerdict CCustomCmdTestCancelMonitoring::doTestStepL()
+	{
+	__UHEAP_MARK;
+	
+    INFO_PRINTF1(_L("Starting doTestStepL"));
+    
+    TInt err = iProcStartSignalSem.CreateGlobal(KStartTestProcGoodSem,0);
+    INFO_PRINTF2(_L("Semaphore for process created with err %d"), err);
+    TEST(KErrNone == err);
+    
+ 	TRAP(err, TestCustomCmdCancelMonitoringL());
+	TEST(KErrNone == err);
+	__UHEAP_MARKEND;
+	return TestStepResult();
+	}