sysstatemgmt/systemstatemgr/test/tss/src/tss_startandcancel.cpp
changeset 0 4e1aa6a622a0
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/sysstatemgmt/systemstatemgr/test/tss/src/tss_startandcancel.cpp	Tue Feb 02 00:53:00 2010 +0200
@@ -0,0 +1,252 @@
+// 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:
+// Old Test CaseID 		APPFWK-SSS-0007
+// New Test CaseID 		DEVSRVS-SSMA-STARTSAFE-0007
+// 
+//
+
+/**
+ @file
+ @test
+ @internalComponent - Internal Symbian test code
+*/
+
+
+#include "tss_startandcancel.h"
+
+
+const TInt KSsDeletionTimeout = 300000; // us
+const TInt KStartAndCancelNominalTimeout = 3000; // ms...Generous
+
+
+
+TVerdict CSsTestStepStartAndCancel::doTestStepL()
+	{
+	__UHEAP_MARK;
+	
+	TRAPD(err, DoTestStartProcessAndCancelL());
+	TEST(err == KErrNone);
+	INFO_PRINTF2(_L("DoTestStartProcessAndCancelL completed with err = %d"), err);
+
+	TRAP(err, DoTestStartAppAndCancelL());
+	TEST(err == KErrNone);
+	INFO_PRINTF2(_L("DoTestStartAppAndCancelL completed with err = %d"), err);
+
+	TRAP(err, DoTestMultiStartAndDeleteL());
+	TEST(err == KErrNone);
+	INFO_PRINTF2(_L("DoTestMultiStartAndDeleteL completed with err = %d"), err);
+
+	__UHEAP_MARKEND;
+	return TestStepResult();	
+	}
+
+
+/**
+ Start an instance of ssmtestappslow.exe asynchronously, as a process, specifying wait-for-start,
+ but setting the timeout to zero which means that startsafe would wait indefinitely if need be.
+ After a short period, StartCancel() is called on SsmStartSafe and the value of the TRS reported and tested
+ via the mixin CSsTestStepStartAndCancel::SsTestNotify( TInt aNotify )
+*/
+void CSsTestStepStartAndCancel::DoTestStartProcessAndCancelL()
+	{	
+	INFO_PRINTF1( _L("\n\nPerforming async process start-and-cancel test") );
+	
+	CSsmStartupProperties* startupProperties = CSsmStartupProperties::NewL();
+	CleanupStack::PushL( startupProperties );
+	
+	// Zero timeout specified, therefore RvObserver will wait indefinitely
+	startupProperties->SetFileParamsL( KTestAppSlow, KNullDesC );
+	startupProperties->SetCommandTypeL( ESsmCmdStartProcess );
+	startupProperties->SetExecutionBehaviour( ESsmWaitForSignal );
+	startupProperties->SetTimeout( KSsmStartSafeNoTimeout );
+	
+	CSsmStartSafe* ss  = CSsmStartSafe::NewLC();
+	RProcess process;
+	CleanupClosePushL( process );
+	
+	CTestAndCanceler* canceler = new(ELeave) CTestAndCanceler( *ss, *startupProperties, process, KSsTestTimeToCancel, this );
+	CleanupStack::PushL( canceler );
+	
+	CActiveScheduler::Start();
+
+	CleanupStack::PopAndDestroy( 4, startupProperties );
+
+	FindAndKill( KTestAppSlow );
+	}
+
+
+
+/**
+ Start an instance of ssmtestappslow.exe asynchronously, as an app, specifying wait-for-start,
+ but setting the timeout to zero which means that startsafe would wait indefinitely if need be.
+ After a short period, StartCancel() is called on SsmStartSafe and the value of the TRS reported and tested
+ via the mixin CSsTestStepStartAndCancel::SsTestNotify( TInt aNotify )
+*/
+void CSsTestStepStartAndCancel::DoTestStartAppAndCancelL()
+	{
+	INFO_PRINTF1( _L("\n\nPerforming async app. start-and-cancel test") );
+	
+	CSsmStartupProperties* startupProperties = CSsmStartupProperties::NewL();
+	CleanupStack::PushL( startupProperties );
+	
+	// Zero timeout specified, therefore RvObserver will wait indefinitely
+	startupProperties->SetFileParamsL( KTestAppSlow, KNullDesC );
+	startupProperties->SetCommandTypeL( ESsmCmdStartApp );
+	startupProperties->SetExecutionBehaviour( ESsmWaitForSignal );
+	startupProperties->SetTimeout( KSsmStartSafeNoTimeout );
+	
+	CSsmStartSafe* ss  = CSsmStartSafe::NewLC();
+	RProcess process;
+	CleanupClosePushL( process );
+	
+	CTestAndCanceler* canceler = new(ELeave) CTestAndCanceler( *ss, *startupProperties, process, KSsTestTimeToCancel, this );
+	CleanupStack::PushL( canceler );
+	
+	CActiveScheduler::Start();
+
+	CleanupStack::PopAndDestroy( 4, startupProperties );
+
+	FindAndKill( KTestAppSlow );
+	}
+
+
+
+/**
+ Start four instances of ssmtestappnorv.exe (which never rendezvous), although supplying a timeout
+ so that the timeoutwaiter is instantiated for each of them. Then delete CSsmStartSafe and check the completion code of their TRSs.
+ Start two as apps and two as processes.
+*/
+void CSsTestStepStartAndCancel::DoTestMultiStartAndDeleteL()
+	{
+	INFO_PRINTF1( _L("\n\nPerforming Multi-Start and delete SS test") );
+	
+	CSsmStartupProperties* startupProperties_0 = CSsmStartupProperties::NewL();
+	CleanupStack::PushL( startupProperties_0 );
+
+	CSsmStartupProperties* startupProperties_1 = CSsmStartupProperties::NewL();
+	CleanupStack::PushL( startupProperties_1 );
+	
+	// Define a startup properties as EStartProcess
+	startupProperties_0->SetFileParamsL( KTestAppNoRv, KNullDesC );
+	startupProperties_0->SetCommandTypeL( ESsmCmdStartProcess );
+	startupProperties_0->SetExecutionBehaviour( ESsmWaitForSignal );
+	startupProperties_0->SetTimeout( KStartAndCancelNominalTimeout );
+	// Define a startup properties as EStartApp
+	startupProperties_1->SetFileParamsL( KTestAppNoRv, KNullDesC );
+	startupProperties_1->SetCommandTypeL( ESsmCmdStartApp );
+	startupProperties_1->SetExecutionBehaviour( ESsmWaitForSignal );
+	startupProperties_1->SetTimeout( KStartAndCancelNominalTimeout );
+	
+	RProcess process_0;
+	CleanupClosePushL( process_0 );
+	RProcess process_1;
+	CleanupClosePushL( process_1 );
+	RProcess process_2;
+	CleanupClosePushL( process_2 );
+	RProcess process_3;
+	CleanupClosePushL( process_3 );
+	
+	TInt id_0 = 0;
+	TInt id_1 = 0;
+	TInt id_2 = 0;
+	TInt id_3 = 0;
+	
+	CStartAcknowledge* ack_0 = new(ELeave) CStartAcknowledge( this );
+	CleanupStack::PushL( ack_0 );
+	CStartAcknowledge* ack_1 = new(ELeave) CStartAcknowledge( this );
+	CleanupStack::PushL( ack_1 );
+	CStartAcknowledge* ack_2 = new(ELeave) CStartAcknowledge( this );
+	CleanupStack::PushL( ack_2 );
+	CStartAcknowledge* ack_3 = new(ELeave) CStartAcknowledge( this );
+	CleanupStack::PushL( ack_3 );	
+	
+	CSsmStartSafe* ss  = CSsmStartSafe::NewLC();
+	ss->Start(*startupProperties_0, process_0, ack_0->iStatus, id_0);
+	ss->Start(*startupProperties_1, process_1, ack_1->iStatus, id_1);
+	ss->Start(*startupProperties_0, process_2, ack_2->iStatus, id_2);
+	ss->Start(*startupProperties_1, process_3, ack_3->iStatus, id_3);
+	CleanupStack::Pop( ss );
+	
+	// Ao to timeout and delete the SS
+	CSsPauseDeleter* pauseDeleter = new(ELeave) CSsPauseDeleter( KSsDeletionTimeout, ss );
+	CleanupStack::PushL( pauseDeleter );
+	
+	// Times-out and stops the sched.
+	CAsPauseStopper* pauseStopper = new(ELeave) CAsPauseStopper( KSsAsStopperNominalTimeout * 5 ); // 10s
+	CleanupStack::PushL( pauseStopper );
+	
+	//Process are started using Wait for start execution behaviour, 
+	//Start method always sets TRequestStatus to KRequestPending.	
+	if( (KRequestPending == ack_0->iStatus.Int()) && (KRequestPending == ack_1->iStatus.Int()) && (KRequestPending == ack_2->iStatus.Int()) && (KRequestPending == ack_3->iStatus.Int()) )
+		{		
+		CActiveScheduler::Start();
+		
+		INFO_PRINTF5( _L("Test apps rv'd with the values  %d %d %d %d "), ack_0->iStatus.Int(), ack_1->iStatus.Int(), ack_2->iStatus.Int(), ack_3->iStatus.Int() );
+		INFO_PRINTF5( _L("Expected values                 %d %d %d %d "), KErrCancel, KErrCancel, KErrCancel, KErrCancel );
+		
+		TEST( ack_0->iStatus == KErrCancel );
+		TEST( ack_1->iStatus == KErrCancel );
+		TEST( ack_2->iStatus == KErrCancel );
+		TEST( ack_3->iStatus == KErrCancel );
+		}
+	
+
+	CleanupStack::PopAndDestroy( 12, startupProperties_0 );
+
+	TEST( 4 == FindAndKill(KTestAppNoRv) );
+	}
+
+
+
+TVerdict CSsTestStepStartAndCancel::doTestStepPreambleL()
+	{
+	iActiveScheduler = new(ELeave) CActiveScheduler;
+	CActiveScheduler::Install( iActiveScheduler );
+
+	return CTestStep::doTestStepPreambleL();
+	}
+
+
+
+/** */
+TVerdict CSsTestStepStartAndCancel::doTestStepPostambleL()
+	{
+	return CTestStep::doTestStepPostambleL();
+	}
+
+
+/**
+ From MSsTestAsyncNotifier
+*/
+void CSsTestStepStartAndCancel::SsTestNotify( TInt aNotify )
+	{
+	TEST( KErrCancel == aNotify );
+
+	INFO_PRINTF3( _L("Expected completion code %d. Supplied completion code %d"), KErrCancel, aNotify );
+	}
+
+
+
+CSsTestStepStartAndCancel::CSsTestStepStartAndCancel()
+	{
+	SetTestStepName( KCTestCaseStartAndCancel );
+	}
+
+
+
+CSsTestStepStartAndCancel::~CSsTestStepStartAndCancel()
+	{
+	delete iActiveScheduler;
+	}
+