diff -r 2b433474f2ba -r 957c583b417b kerneltest/e32test/domainmgr/t_domain_cmn.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/kerneltest/e32test/domainmgr/t_domain_cmn.cpp Mon Oct 04 12:03:52 2010 +0100 @@ -0,0 +1,349 @@ +// Copyright (c) 2010 Nokia Corporation and/or its subsidiary(-ies). +// All rights reserved. +// This component and the accompanying materials are made available +// under the terms of the License "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: +// Framework code for Domain Manager tests. +// + +#include +#define __E32TEST_EXTENSION__ +#include + +#include "domainpolicytest.h" +#include "t_domain.h" + + +extern RTest test; + +// get the least significant domain id character (for debugging purposes) +TBool GetDomainChar(TDmDomainId aDomainId, TChar& aChar) + { + TBool found = ETrue; + switch(aDomainId) + { + case KDmIdTestA: aChar = 'A'; break; + case KDmIdTestB: aChar = 'B'; break; + case KDmIdTestC: aChar = 'C'; break; + case KDmIdTestAA: aChar = 'A'; break; + case KDmIdTestAB: aChar = 'B'; break; + case KDmIdTestBA: aChar = 'A'; break; + case KDmIdTestCA: aChar = 'A'; break; + case KDmIdTestABA: aChar = 'A'; break; + case KDmIdTestABB: aChar = 'B'; break; + case KDmIdTestCAA: aChar = 'A'; break; + // domain char not found + case KDmIdNone: + case KDmIdRoot: + default: + found = EFalse; + } + return found; + } + + +// prints the 4-character domain string into the passed descriptor (for debugging purposes) +// e.g. "CAA" for KDmIdTestCAA +void GetDomainDesc(TUint32 aOrdinal, TDes& aDes) + { + if (aOrdinal == KDmIdRoot) + { + aDes.Append(_L("root")); + return; + } + + TUint32 val = aOrdinal; + + for (TInt n=0; n<4; n++) + { + TDmDomainId domainId = (TDmDomainId) (val >> 24); + TChar ch; + TBool found = GetDomainChar(domainId, ch); + if (found) + aDes.Append(ch); + val = val << 8; + } + } + + +CDmTestMember::CDmTestMember(TDmHierarchyId aHierarchy, TDmDomainId aId, + TUint32 aOrdinal, MDmTest* aTest) + : CActive(CActive::EPriorityStandard), + iHierarchy(aHierarchy), iId(aId), iOrdinal(aOrdinal), iTest(aTest) + { + TInt r; + + if (iHierarchy == KDmHierarchyIdPower) + r = iDomain.Connect(iId); + else + r = iDomain.Connect(iHierarchy, iId); + + test(r == KErrNone); + + CActiveScheduler::Add(this); + + iDomain.RequestTransitionNotification(CActive::iStatus); + CActive::SetActive(); + } + +CDmTestMember::~CDmTestMember() + { + CActive::Cancel(); + iDomain.Close(); + } + +void CDmTestMember::Acknowledge() + { + iDomain.AcknowledgeLastState(); + } + +void CDmTestMember::RunL() + { + RDebug::Printf("CDmTestMember::RunL(): %d", iStatus.Int()); + iNotifications++; + + if (iHierarchy == KDmHierarchyIdPower) + { + iState = (TDmDomainState) iDomain.GetPowerState(); + } + else + { + iState = iDomain.GetState(); + } + + TInt ackError = iTest->TransitionNotification(*this); + if (ackError == KErrNone) + { + iDomain.AcknowledgeLastState(); + } + else if (ackError == KErrAbort) + { + ; // don't acknowledge + } + else + { + iDomain.AcknowledgeLastState(ackError); + } + // request another notification (even if we didn't acknowledge the last one) + iDomain.RequestTransitionNotification(CActive::iStatus); + CActive::SetActive(); + } + +void CDmTestMember::DoCancel() + { + iDomain.CancelTransitionNotification(); + } + + +CDomainMemberAo* CDomainMemberAo::NewL(TDmHierarchyId aHierarchy, TDmDomainId aId, + TUint32 aOrdinal, MDmTest* aTest) + { + CDomainMemberAo* self=new (ELeave) CDomainMemberAo(aHierarchy, aId, aOrdinal, aTest); + CleanupStack::PushL(self); + self->ConstructL(); + + self->RequestTransitionNotification(); + + CleanupStack::Pop(); + return self; + } + +CDomainMemberAo::CDomainMemberAo(TDmHierarchyId aHierarchy, TDmDomainId aId, TUint32 aOrdinal, + MDmTest* aTest) + : CDmDomain(aHierarchy, aId), + iHierarchy(aHierarchy), iId(aId), iOrdinal(aOrdinal), iTest(aTest) + { + } + +CDomainMemberAo::~CDomainMemberAo() + { + Cancel(); + } + +void CDomainMemberAo::RunL() + { + RDebug::Printf("CDomainMemberAo::RunL(): %d", iStatus.Int()); + iNotifications++; + + iState = GetState(); + + TInt ackError = iTest->TransitionNotification(*this); + if (ackError == KErrNone) + AcknowledgeLastState(ackError); + else if (ackError == KErrAbort) // don't acknowledge + ; + else + AcknowledgeLastState(ackError); + if (ackError != KErrAbort) + AcknowledgeLastState(ackError); + + // request another notification (even if we didn't acknowledge the last one) + RequestTransitionNotification(); + } + + +CDomainManagerAo* CDomainManagerAo::NewL(TDmHierarchyId aHierarchy, MDmTest& aTest) + { + CDomainManagerAo* self=new (ELeave) CDomainManagerAo(aHierarchy, aTest); + CleanupStack::PushL(self); + + self->ConstructL(); + CleanupStack::Pop(); + return self; + } + +CDomainManagerAo::CDomainManagerAo(TDmHierarchyId aHierarchy, MDmTest& aTest) : + CDmDomainManager(aHierarchy), iTest(aTest) + { + } + +CDomainManagerAo::~CDomainManagerAo() + { + } + +void CDomainManagerAo::RunL() + { + RDebug::Printf("CDomainManagerAo::RunL(): %d", iStatus.Int()); + iTest.TransitionRequestComplete(); + } + + +// +// Deferral Test code +// + +// +// CDmDeferralTest +// + +CDmDeferralTest::CDmDeferralTest(TDmHierarchyId aId, TDmDomainState aState) + : CActive(CActive::EPriorityStandard), iHierarchyId(aId), iState(aState) + { + CActiveScheduler::Add(this); + } + +CDmDeferralTest::~CDmDeferralTest() + { + iManager.Close(); + delete iMember; + } + +/** +Basic test setup : load and connect to appropriate hierarchy +*/ +void CDmDeferralTest::Perform() + { + TInt r = RDmDomainManager::AddDomainHierarchy(iHierarchyId); + test_KErrNone(r); + + r = iManager.Connect(iHierarchyId); + test_KErrNone(r); + + DoPerform(); + + CActive::SetActive(); + CActiveScheduler::Start(); + } + +void CDmDeferralTest::Release() + { + delete this; + } + +/** +aDomainMember has recieved a transition notification +*/ +TInt CDmDeferralTest::TransitionNotification(MDmDomainMember& aDomainMember) + { + test.Printf(_L("MDmDomainMember notified of transition, Domain ID=%d"), + aDomainMember.DomainId()); + return KErrNone; + } + +/** +A transition has completed +*/ +void CDmDeferralTest::TransitionRequestComplete() + {} + +void CDmDeferralTest::RunL() + { + RDebug::Printf("CDmDeferralTest::RunL(): %d", iStatus.Int()); + TransitionRequestComplete(); + CActiveScheduler::Stop(); + } + +void CDmDeferralTest::DoCancel() + { + test(0); + } + +// +// +// CTestKeepAlive +// + + +CTestKeepAlive::CTestKeepAlive(RDmDomain& aDomain) + : CActive(CActive::EPriorityHigh), iDomain(aDomain), iCount(0) + { + CActiveScheduler::Add(this); + } + +CTestKeepAlive::~CTestKeepAlive() + { + Cancel(); + } + +/** +Begin deferrals + +@param aMember The object to notify when deferrals cease +@param aDeferralCount Number of times to defer +*/ +void CTestKeepAlive::BeginDeferrals(MDeferringMember* aMember, TInt aDeferralCount) + { + iDeferringMember = aMember; + iCount = aDeferralCount; + + if(iCount > 0) + DeferAcknowledgement(); + } + +void CTestKeepAlive::DeferAcknowledgement() + { + test.Printf(_L("DeferAcknowledgement() iCount %d\n"), iCount); + iDomain.DeferAcknowledgement(iStatus); + SetActive(); + } + +void CTestKeepAlive::RunL() + { + RDebug::Printf("CTestKeepAlive::RunL(): %d", iStatus.Int()); + test(iCount>0); + --iCount; + TInt err = iStatus.Int(); + + if((iCount == 0) || (KErrNone != err)) + { + iDeferringMember->HandleEndOfDeferrals(err); + iDeferringMember = NULL; + } + else + { + DeferAcknowledgement(); + } + } + +void CTestKeepAlive::DoCancel() + { + iDomain.CancelDeferral(); + }