diff -r 000000000000 -r bde4ae8d615e os/ossrv/lowlevellibsandfws/pluginfw/Test_Bed/test_bed/Transition.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/os/ossrv/lowlevellibsandfws/pluginfw/Test_Bed/test_bed/Transition.cpp Fri Jun 15 03:10:57 2012 +0200 @@ -0,0 +1,175 @@ +// Copyright (c) 1997-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: +// + +#include <ecom/test_bed/transition.h> +#include <ecom/test_bed/datalogger.h> +#include <ecom/test_bed/testbeddefinitions.h> + +EXPORT_C CTransition::CTransition(const TDesC& aTransitionId, + CUnitTestContext& aUTContext, + TTransitionValidator& aValidator) +: CActive(CActive::EPriorityStandard), +iTransitionId(aTransitionId), +iUTContext(aUTContext), +iValidator(aValidator), +iTransitionInfo(iTransitionId, iUTContext.DataLogger()) + { + CActiveScheduler::Add(this); + } + + +EXPORT_C CTransition::~CTransition() + { + Cancel(); + } + + +EXPORT_C void CTransition::SetStartStateL() + { + // Do nothing here + } + + +EXPORT_C const TDesC& CTransition::TransitionId() const + { + return iTransitionId; + } + +EXPORT_C void CTransition::DoCancel() + { + // Complete the unit test so that this test will now finish + // if the transition has not finished then we haven't even had to chance + // to run yet so complete the UnitTest with a Cancel message + // If the transition has finished then we must have an outstanding async + // transition so Complete the observer to ensure it gets removed from the list + // of outstanding transitions + if(!iTransitionFinished) + User::RequestComplete(iUnitTestStatus, KTestBedTestCancel); + else + iUTContext.TransitionObserver().Complete(*this, KTestBedTestCancel); + } + + +EXPORT_C void CTransition::RunTransition(TRequestStatus* aUnitTestStatus) + { + iUnitTestStatus = aUnitTestStatus; + iTransitionFinished = EFalse; + + // Reset the iRepeat flag - if this transition should be repeated it will be + // set during the execution of TransitMethodL(). + iRepeatThis = EFalse; + + if(!iValidator.ValidatePreConditions()) + { + User::RequestComplete(iUnitTestStatus, KTestBedFailedPreConditions); + } + else + { + SetActive(); + TRequestStatus* status = &iStatus; + User::RequestComplete(status, KErrNone); + } + } + +EXPORT_C void CTransition::RunL() + { + iUTContext.TransitionObserver().SetCurrentTransition(*this); + if(!iTransitionFinished) + { + ++iTransitionInfo.iIteration; + TransitMethodL(); + iTransitionFinished = ETrue; + PostTransitionCleanup(); // Allow the derived transition class to do something before + // PostCondition validation. + + // If the user called an asynchronous function then SetActive so that we run again + // when the async function completes + iAsyncTransition = iStatus == KRequestPending; + if(iAsyncTransition) + { + SetActive(); + } + + TTestBedAsyncState asyncState = iAsyncTransition ? EAsyncCalled : EAsyncCompleted; + if(!iValidator.ValidatePostConditions(asyncState)) + { + if(iAsyncTransition) + { + //Cancel the request + Cancel(); + } + User::RequestComplete(iUnitTestStatus, KTestBedFailedPostConditions); + } + else if(iAsyncTransition) + User::RequestComplete(iUnitTestStatus, KTestBedAsynchronousTransition); + else if(iRepeatThis) + User::RequestComplete(iUnitTestStatus, KTestBedRepeatTest); + else + User::RequestComplete(iUnitTestStatus, KErrNone); + } + else + { + if(iAsyncTransition && !iValidator.ValidatePostConditions(EAsyncCompleted)) + iUTContext.TransitionObserver().Complete(*this, KTestBedFailedPostConditions); + else + iUTContext.TransitionObserver().Complete(*this, KErrNone); + } + } + +EXPORT_C const TTransitionInfo& CTransition::TransitionInfo() const + { + return iTransitionInfo; + } + +EXPORT_C void CTransition::RepeatOnce() + { + iRepeatThis = ETrue; + } + +EXPORT_C TInt CTransition::RunError(TInt aErrorCode) + { + // Record the leave and signal completed with a leave code + _LIT(KTransitionRunError, "CTransition::TransitMethodL() leaving error %d."); + iUTContext.DataLogger().LogInformationWithParameters(KTransitionRunError, aErrorCode); + + iLeaveError = aErrorCode; + // Check if the leave is associated with a repeat request + // I.e. it was an execution path test from a stub. + if(iLeaveError == KTestBedRepeatTest && iRepeatThis) + User::RequestComplete(iUnitTestStatus, KTestBedRepeatTest); + else + User::RequestComplete(iUnitTestStatus, KTestBedTestLeft); + return KErrNone; + } + +EXPORT_C TBool CTransition::IsBlockingTransition() const + { + return iBlockingTransition; + } + +EXPORT_C void CTransition::SetBlockingTransition(TBool aBlocking) + { + iBlockingTransition = aBlocking; + } + +EXPORT_C TInt CTransition::GetErrorCode() const + { + return iLeaveError; + } + +EXPORT_C void CTransition::PostTransitionCleanup() + { + // Default behaviour is to do nothing + }