lowlevellibsandfws/pluginfw/Test_Bed/test_bed/Transition.cpp
author Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
Wed, 15 Sep 2010 14:02:55 +0300
branchRCL_3
changeset 64 c44f36bb61a3
parent 0 e4d67989cc36
permissions -rw-r--r--
Revision: 201021 Kit: 201036

// 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
	}