diff -r 000000000000 -r 4e1aa6a622a0 sysstatemgmt/systemstatemgr/test/tss/src/tss_startandcancel.cpp --- /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; + } +