kerneltest/e32test/domainmgr/t_domain.cpp
changeset 245 647ab20fee2e
child 269 d57b86b1867a
equal deleted inserted replaced
244:a77889bee936 245:647ab20fee2e
       
     1 // Copyright (c) 2002-2009 Nokia Corporation and/or its subsidiary(-ies).
       
     2 // All rights reserved.
       
     3 // This component and the accompanying materials are made available
       
     4 // under the terms of the License "Eclipse Public License v1.0"
       
     5 // which accompanies this distribution, and is available
       
     6 // at the URL "http://www.eclipse.org/legal/epl-v10.html".
       
     7 //
       
     8 // Initial Contributors:
       
     9 // Nokia Corporation - initial contribution.
       
    10 //
       
    11 // Contributors:
       
    12 //
       
    13 // Description:
       
    14 // e32test\power\t_domain.cpp
       
    15 // Overview:
       
    16 // Domain manager tests
       
    17 // API Information:
       
    18 // RDmDomain, RDmDomainManager CDmDomain, CDmDomainManager
       
    19 // Details:
       
    20 // - Test a variety of domain transitions, check the expected number of
       
    21 // notifications and the first expected ordinal. Verify results are
       
    22 // as expected.
       
    23 // - Test system standby, check the expected number of notifications and 
       
    24 // the first expected ordinal. Use a timer to request a wakeup event.
       
    25 // Verify results are as expected.
       
    26 // - Test domain related simple error situations, verify results are
       
    27 // as expected.
       
    28 // - Perform platform security tests: launch a separate process with no 
       
    29 // capabilities, verify that results are as expected.
       
    30 // - Test domain transitions by connecting to two domain hierarchies 
       
    31 // simultaneously, add some test and power hierarchy members, verify
       
    32 // the expected target state, notifications and leaf nodes. Verify results.
       
    33 // - Verify that the same hierarchy can not be connected to more than once.
       
    34 // - Request a positive transition and request that the test domain use 
       
    35 // ETraverseParentsFirst. Verify results are as expected and verify 
       
    36 // domains are in the correct state.
       
    37 // - Request a negative transition and request that the test domain use 
       
    38 // ETraverseChildrenFirst. Verify results are as expected.
       
    39 // - Request a positive transition with zero acknowledgements. Verify 
       
    40 // results are as expected.
       
    41 // - Request a positive transition with error acknowledgements. Verify 
       
    42 // results are as expected.
       
    43 // - Perform a variety of negative tests and verify results are as expected.
       
    44 // - Perform various tests on domain transitions with activated observer.
       
    45 // Verify results are as expected.
       
    46 // Platforms/Drives/Compatibility:
       
    47 // All.
       
    48 // Assumptions/Requirement/Pre-requisites:
       
    49 // Failures and causes:
       
    50 // Base Port information:
       
    51 // 
       
    52 //
       
    53 
       
    54 #include <e32test.h>
       
    55 #include <domainmember.h>
       
    56 #include <domainmanager.h>
       
    57 #include <domainobserver.h>
       
    58 #include "domainpolicytest.h"
       
    59 #include <e32debug.h>
       
    60 #include <f32file.h>
       
    61 #include <e32ldr.h>
       
    62 #include <e32ldr_private.h>
       
    63 
       
    64 LOCAL_D RTest test(_L(" T_DOMAIN "));
       
    65 _LIT(KThreadName, "t_domain_panic_thread");
       
    66 
       
    67 #ifdef _DEBUG
       
    68 #define __PRINT(x) {RDebug::Print x;}
       
    69 #else
       
    70 #define __PRINT(x) 
       
    71 #endif
       
    72 
       
    73 class CDmTestMember;
       
    74 
       
    75 // interface for test domain memebers.
       
    76 // Any test memeber should derive from this interface 
       
    77 class MDmDomainMember
       
    78 	{
       
    79 public:
       
    80 	virtual TDmHierarchyId HierarchyId() = 0;
       
    81 	virtual TDmDomainId	DomainId() = 0;
       
    82 	virtual TDmDomainState State() = 0;
       
    83 	virtual TInt Status() = 0;
       
    84 	virtual TUint32 Ordinal() = 0;
       
    85 	virtual TInt Notifications() = 0;
       
    86 	};
       
    87 
       
    88 class MDmTest
       
    89 	{
       
    90 public:
       
    91 	virtual void Perform() = 0;
       
    92 	virtual void Release() = 0;
       
    93 	virtual TInt TransitionNotification(MDmDomainMember& aDomainMember) = 0;
       
    94 	virtual void TransitionRequestComplete() = 0;
       
    95 	};
       
    96 
       
    97 // for the test hierarchy, we generate an ordinal for each domain
       
    98 // each byte of which describes the exact location of the domain in the hierarchy
       
    99 #define ORDINAL_FROM_DOMAINID0(id) (id)
       
   100 #define ORDINAL_FROM_DOMAINID1(parent, id) ((parent << 8) | (id))
       
   101 #define ORDINAL_FROM_DOMAINID2(grandparent, parent, id) ((grandparent << 16) | (parent << 8) | id)
       
   102 #define ORDINAL_FROM_DOMAINID3(greatgrandparent, grandparent, parent, id) ((greatgrandparent << 24) | (grandparent << 16) | (parent << 8) | id)
       
   103 #define PARENT_ORDINAL(id) (id >> 8)
       
   104 
       
   105 #define ORDINAL_LEVEL(ordinal)			\
       
   106 	((ordinal & 0xFF00) == 0) ? 1 :			\
       
   107 	((ordinal & 0xFF0000) == 0) ? 2 :		\
       
   108 	((ordinal & 0xFF000000) == 0) ? 3 : 4;
       
   109 
       
   110 
       
   111 // get the least significant domain id character (for debugging purposes)
       
   112 TBool GetDomainChar(TDmDomainId aDomainId, TChar& aChar)
       
   113 	{
       
   114 	TBool found = ETrue;
       
   115 	switch(aDomainId)
       
   116 		{
       
   117 		
       
   118 		case KDmIdTestA:	aChar = 'A'; break;
       
   119 		case KDmIdTestB:	aChar = 'B'; break;
       
   120 		case KDmIdTestC:	aChar = 'C'; break;
       
   121 		case KDmIdTestAA:	aChar = 'A'; break;
       
   122 		case KDmIdTestAB:	aChar = 'B'; break;
       
   123 		case KDmIdTestBA:	aChar = 'A'; break;
       
   124 		case KDmIdTestCA:	aChar = 'A'; break;
       
   125 		case KDmIdTestABA:	aChar = 'A'; break;
       
   126 		case KDmIdTestABB:	aChar = 'B'; break;
       
   127 		case KDmIdTestCAA:	aChar = 'A'; break;
       
   128 		// domain char not found 
       
   129 		case KDmIdNone:
       
   130 		case KDmIdRoot:		
       
   131 		default:			
       
   132 			found = EFalse;
       
   133 		}
       
   134 	return found;
       
   135 	}
       
   136 
       
   137 // prints the 4-character domain string into the passed descriptor (for debugging purposes)
       
   138 // e.g. "CAA" for KDmIdTestCAA
       
   139 void GetDomainDesc(TUint32 aOrdinal, TDes& aDes)
       
   140 	{
       
   141 	if (aOrdinal == KDmIdRoot)
       
   142 		{
       
   143 		aDes.Append(_L("root"));
       
   144 		return;
       
   145 		}
       
   146 
       
   147 	TUint32 val =  aOrdinal;
       
   148 
       
   149 	for (TInt n=0; n<4; n++)
       
   150 		{
       
   151 		TDmDomainId domainId = (TDmDomainId) (val >> 24);
       
   152 		TChar ch;
       
   153 		TBool found = GetDomainChar(domainId, ch);
       
   154 		if (found)
       
   155 			aDes.Append(ch);
       
   156 		val = val << 8;
       
   157 		}
       
   158 
       
   159 	}
       
   160 
       
   161 
       
   162 class CDmTestMember : public CActive, public MDmDomainMember
       
   163 	{
       
   164 public:	
       
   165 	// from CActive
       
   166 	void RunL();
       
   167 	// from MDmDomainMember
       
   168 	inline TDmHierarchyId HierarchyId() {return iHierarchy;};
       
   169 	inline TDmDomainId	DomainId() {return iId;};
       
   170 	inline TDmDomainState State() {return iState;};
       
   171 	inline TInt Status() {return iStatus.Int();};
       
   172 	inline TUint32 Ordinal() {return iOrdinal;};
       
   173 	inline TInt Notifications() {return iNotifications;};
       
   174 
       
   175 	CDmTestMember(TDmHierarchyId aHierarchy, TDmDomainId aId, TUint32 aOrdinal, MDmTest*);
       
   176 	~CDmTestMember();
       
   177 	void Acknowledge();
       
   178 
       
   179 protected:
       
   180 	// from CActive
       
   181 	virtual void DoCancel();
       
   182 
       
   183 
       
   184 public:
       
   185 	TDmHierarchyId iHierarchy;
       
   186 	TDmDomainId	iId;
       
   187 	TDmDomainState iState;
       
   188 	TUint32		iOrdinal;
       
   189 	MDmTest*	iTest;	
       
   190 	TInt		iNotifications;
       
   191 	RDmDomain	iDomain;
       
   192 	};
       
   193 
       
   194 
       
   195 
       
   196 CDmTestMember::CDmTestMember(TDmHierarchyId aHierarchy, TDmDomainId aId, TUint32 aOrdinal, MDmTest* aTest) : CActive(CActive::EPriorityStandard), 
       
   197 	iHierarchy(aHierarchy), iId(aId), iOrdinal(aOrdinal), iTest(aTest)
       
   198 	{
       
   199 	TInt r;
       
   200 
       
   201 	if (iHierarchy == KDmHierarchyIdPower)
       
   202 		 r = iDomain.Connect(iId);
       
   203 	else
       
   204 		 r = iDomain.Connect(iHierarchy, iId);
       
   205 
       
   206 	test(r == KErrNone);
       
   207 
       
   208 	CActiveScheduler::Add(this);
       
   209 
       
   210 	iDomain.RequestTransitionNotification(CActive::iStatus);
       
   211 	CActive::SetActive();
       
   212 	}
       
   213 
       
   214 CDmTestMember::~CDmTestMember()
       
   215 	{
       
   216 	CActive::Cancel();
       
   217 	iDomain.Close();
       
   218 	}
       
   219 
       
   220 void CDmTestMember::Acknowledge()
       
   221 	{
       
   222 	iDomain.AcknowledgeLastState();
       
   223 	}
       
   224 
       
   225 void CDmTestMember::RunL()
       
   226 	{
       
   227 
       
   228 	iNotifications++;
       
   229 
       
   230 	iState = iDomain.GetState();
       
   231 
       
   232 	TInt ackError = iTest->TransitionNotification(*this);
       
   233 	if (ackError == KErrNone)
       
   234 		iDomain.AcknowledgeLastState();
       
   235 	else if (ackError == KErrAbort)	// don't acknowledge
       
   236 		;
       
   237 	else
       
   238 		iDomain.AcknowledgeLastState(ackError);
       
   239 
       
   240 	
       
   241 	// request another notification (even if we didn't acknowledge the last one)
       
   242 	iDomain.RequestTransitionNotification(CActive::iStatus);
       
   243 	CActive::SetActive();
       
   244 	}
       
   245 
       
   246 void CDmTestMember::DoCancel()
       
   247 	{
       
   248 	iDomain.CancelTransitionNotification();
       
   249 	}
       
   250 
       
   251 
       
   252 // CDomainMemberAo
       
   253 class CDomainMemberAo : public CDmDomain, public MDmDomainMember
       
   254 	{
       
   255 public:	
       
   256 	static CDomainMemberAo* NewL(TDmHierarchyId aHierarchy, TDmDomainId aId, TUint32 aOrdinal, MDmTest*);
       
   257 	~CDomainMemberAo();
       
   258 
       
   259 	// from CActive
       
   260 	void RunL();
       
   261 
       
   262 	// from MDmDomainMember
       
   263 	inline TDmHierarchyId HierarchyId() {return iHierarchy;};
       
   264 	inline TDmDomainId	DomainId() {return iId;};
       
   265 	inline TDmDomainState State() {return iState;};
       
   266 	inline TInt Status() {return iStatus.Int();};
       
   267 	inline TUint32 Ordinal() {return iOrdinal;};
       
   268 	inline TInt Notifications() {return iNotifications;};
       
   269 
       
   270 private:
       
   271 	CDomainMemberAo(TDmHierarchyId aHierarchy, TDmDomainId aId, TUint32 aOrdinal, MDmTest*);
       
   272 
       
   273 public:
       
   274 	TDmHierarchyId iHierarchy;
       
   275 	TDmDomainId	iId;
       
   276 	TDmDomainState iState;
       
   277 	TUint32		iOrdinal;
       
   278 	MDmTest*	iTest;	
       
   279 	TInt		iNotifications;
       
   280 	};
       
   281 
       
   282 CDomainMemberAo* CDomainMemberAo::NewL(TDmHierarchyId aHierarchy, TDmDomainId aId, TUint32 aOrdinal, MDmTest* aTest)
       
   283 	{
       
   284 	CDomainMemberAo* self=new (ELeave) CDomainMemberAo(aHierarchy, aId, aOrdinal, aTest);
       
   285 	CleanupStack::PushL(self);
       
   286 	self->ConstructL();
       
   287 
       
   288 	self->RequestTransitionNotification();
       
   289 
       
   290 	CleanupStack::Pop();
       
   291 	return self;
       
   292 	}
       
   293 
       
   294 CDomainMemberAo::CDomainMemberAo(TDmHierarchyId aHierarchy, TDmDomainId aId, TUint32 aOrdinal, MDmTest* aTest) : 
       
   295 	CDmDomain(aHierarchy, aId), 
       
   296 	iHierarchy(aHierarchy), iId(aId), iOrdinal(aOrdinal), iTest(aTest)
       
   297 	{
       
   298 	}
       
   299 
       
   300 CDomainMemberAo::~CDomainMemberAo()
       
   301 	{
       
   302 	Cancel();
       
   303 	}
       
   304 
       
   305 void CDomainMemberAo::RunL()
       
   306 	{
       
   307 	iNotifications++;
       
   308 
       
   309 	iState = GetState();
       
   310 
       
   311 	TInt ackError = iTest->TransitionNotification(*this);
       
   312 	if (ackError == KErrNone)
       
   313 		AcknowledgeLastState(ackError);
       
   314 	else if (ackError == KErrAbort)	// don't acknowledge
       
   315 		;
       
   316 	else
       
   317 		AcknowledgeLastState(ackError); 
       
   318 	if (ackError != KErrAbort)	
       
   319 		AcknowledgeLastState(ackError);
       
   320 
       
   321 	
       
   322 	// request another notification (even if we didn't acknowledge the last one)
       
   323 	RequestTransitionNotification();
       
   324 	}
       
   325 
       
   326 
       
   327 // CDomainManagerAo
       
   328 class CDomainManagerAo : public CDmDomainManager
       
   329 	{
       
   330 public:	
       
   331 	~CDomainManagerAo();
       
   332 	static CDomainManagerAo* NewL(TDmHierarchyId aHierarchy, MDmTest& aTest);
       
   333 
       
   334 	// from CActive
       
   335 	void RunL();
       
   336 
       
   337 private:
       
   338 	CDomainManagerAo(TDmHierarchyId aHierarchy, MDmTest& aTest);
       
   339 
       
   340 private:
       
   341 	MDmTest& iTest;
       
   342 	};
       
   343 
       
   344 
       
   345 CDomainManagerAo* CDomainManagerAo::NewL(TDmHierarchyId aHierarchy, MDmTest& aTest)
       
   346 	{
       
   347 	CDomainManagerAo* self=new (ELeave) CDomainManagerAo(aHierarchy, aTest);
       
   348 	CleanupStack::PushL(self);
       
   349 
       
   350 	self->ConstructL();
       
   351 	CleanupStack::Pop();
       
   352 	return self;
       
   353 	}
       
   354 
       
   355 CDomainManagerAo::CDomainManagerAo(TDmHierarchyId aHierarchy, MDmTest& aTest) : 
       
   356 	CDmDomainManager(aHierarchy), iTest(aTest)
       
   357 	{
       
   358 	}
       
   359 
       
   360 CDomainManagerAo::~CDomainManagerAo()
       
   361 	{
       
   362 	}
       
   363 
       
   364 void CDomainManagerAo::RunL()
       
   365 	{
       
   366 	iTest.TransitionRequestComplete();
       
   367 	}
       
   368 
       
   369 
       
   370 class CDmTest1 : public CActive, public MDmTest
       
   371 	{
       
   372 public: // from CActive
       
   373 	void RunL();
       
   374 
       
   375 	// from MDmTest
       
   376 	void Perform();
       
   377 	void Release();
       
   378 	TInt TransitionNotification(MDmDomainMember& aDomainMember);
       
   379 	void TransitionRequestComplete() {};
       
   380 
       
   381 	CDmTest1 (TDmDomainId aId, TDmDomainState aState) : CActive(CActive::EPriorityStandard), iDomainId(aId), iState((TPowerState) aState) {}
       
   382 
       
   383 protected:
       
   384 	// from CActive
       
   385 	virtual void DoCancel();
       
   386 
       
   387 private:
       
   388 	enum { KMembersMax = 16 };
       
   389 	CDmTestMember*		iMembers[KMembersMax]; 
       
   390 	RDmDomainManager	iManager;
       
   391 	TDmDomainId			iDomainId;
       
   392 	TPowerState			iState;
       
   393 	TBool				iAcknowledge;
       
   394 	TInt				iMembersCount;
       
   395 	TInt				iCount;
       
   396 	TUint32				iOrdinal;
       
   397 	};
       
   398 
       
   399 void CDmTest1::Perform()
       
   400 	{
       
   401 	//
       
   402 	// Test domain transitions
       
   403 	//
       
   404 
       
   405 	test.Next(_L("Test 1"));
       
   406 	test.Printf(_L("Domain id = 0x%x Target State = 0x%x\n"), iDomainId, iState);
       
   407 	iMembers[0] = new CDmTestMember(KDmHierarchyIdPower, KDmIdRoot, 0, this);
       
   408 	test(iMembers[0] != NULL);
       
   409 	iMembers[1] = new CDmTestMember(KDmHierarchyIdPower, KDmIdRoot, 0, this);
       
   410 	test(iMembers[1] != NULL);
       
   411 	iMembers[2] = new CDmTestMember(KDmHierarchyIdPower, KDmIdApps, 1, this);
       
   412 	test(iMembers[2] != NULL);
       
   413 	iMembers[3] = new CDmTestMember(KDmHierarchyIdPower, KDmIdApps, 1, this);
       
   414 	test(iMembers[3] != NULL);
       
   415 	iMembers[4] = new CDmTestMember(KDmHierarchyIdPower, KDmIdUiApps, 1, this);
       
   416 	test(iMembers[4] != NULL);
       
   417 	iMembers[5] = new CDmTestMember(KDmHierarchyIdPower, KDmIdUiApps, 1, this);
       
   418 	test(iMembers[5] != NULL);
       
   419 	
       
   420 	// expected number of notifications
       
   421 	iMembersCount = (iDomainId == KDmIdRoot) ? 6 : 2;
       
   422 	// first expected ordinal
       
   423 	iOrdinal = (iState == EPwActive) ? 0 : 1;
       
   424 
       
   425 	TInt r = iManager.Connect();
       
   426 	test(r == KErrNone);
       
   427 
       
   428 	CActiveScheduler::Add(this);
       
   429 
       
   430 	iManager.RequestDomainTransition(iDomainId, iState, CActive::iStatus);
       
   431 	CActive::SetActive();
       
   432 
       
   433 	CActiveScheduler::Start();
       
   434 	}
       
   435 
       
   436 TInt CDmTest1::TransitionNotification(MDmDomainMember& aDomainMember)
       
   437 	{
       
   438 	++iCount;
       
   439 	if (aDomainMember.State() == EPwActive)
       
   440 		{
       
   441 		if(aDomainMember.Ordinal() < iOrdinal)
       
   442 			{
       
   443 			// Making the test to fail in RunL function inorder to complete the cleanup from domain manager.
       
   444 			test.Printf(_L("Making test to fail as Ordinal Mismatch Expected : %d, Returned : %d"), aDomainMember.Ordinal(), iOrdinal);
       
   445 			iCount--;
       
   446 			}
       
   447 		}
       
   448 	else
       
   449 		{
       
   450 		if(aDomainMember.Ordinal() > iOrdinal)
       
   451 			{
       
   452 			//Making the test to fail in RunL function inorder to complete the cleanup from domain manager.
       
   453 			test.Printf(_L("Making test to fail as Ordinal Mismatch Expected : %d, Returned : %d"), aDomainMember.Ordinal(), iOrdinal);
       
   454 			iCount--;
       
   455 			}
       
   456 		}
       
   457 	iOrdinal = aDomainMember.Ordinal();
       
   458 
       
   459 	// acknowledge one from two
       
   460 	iAcknowledge = !iAcknowledge;
       
   461 	return iAcknowledge?KErrNone:KErrGeneral;
       
   462 	}
       
   463 
       
   464 void CDmTest1::RunL()
       
   465 	{
       
   466 	CActiveScheduler::Stop();
       
   467 
       
   468 	iManager.Close();
       
   469 
       
   470 	CDmTestMember** mp;
       
   471 	for (mp = iMembers; *mp; ++mp)
       
   472 		delete *mp;
       
   473 	test(iCount == iMembersCount);
       
   474 	}
       
   475 
       
   476 void CDmTest1::DoCancel()
       
   477 	{
       
   478 	test(0);
       
   479 	}
       
   480 
       
   481 void CDmTest1::Release()
       
   482 	{
       
   483 	delete this;
       
   484 	}
       
   485 
       
   486 class CDmTest2Timer : public CTimer
       
   487 	{
       
   488 public: // fomr CTimer
       
   489    void RunL();
       
   490 public:
       
   491 	CDmTest2Timer() : CTimer(0) 
       
   492 		{
       
   493 		TRAPD(r,
       
   494 			ConstructL());
       
   495 		test(r == KErrNone);
       
   496 		CActiveScheduler::Add(this);
       
   497 		}
       
   498 	};
       
   499 
       
   500 void CDmTest2Timer::RunL()
       
   501 	{
       
   502 	test.Printf(_L("Tick count after CDmTest2Timer::RunL() = %d\n"), User::NTickCount());
       
   503 
       
   504 	// kick the timer again in case power down hasn't happened yet
       
   505 	TTime wakeup;
       
   506 	wakeup.HomeTime();
       
   507 	wakeup += TTimeIntervalSeconds(3);
       
   508 	At(wakeup);
       
   509 	}
       
   510 
       
   511 class CDmTest2 : public CActive, public MDmTest
       
   512 	{
       
   513 public: // from CActive
       
   514 	void RunL();
       
   515 
       
   516 	// from MDmTest
       
   517 	void Perform();
       
   518 	void Release();
       
   519 	TInt TransitionNotification(MDmDomainMember& aDomainMember);
       
   520 	void TransitionRequestComplete() {};
       
   521 	CDmTest2 (TDmDomainState aState) : CActive(CActive::EPriorityStandard), iState((TPowerState) aState) {}
       
   522 
       
   523 protected:
       
   524 	// from CActive
       
   525 	virtual void DoCancel();
       
   526 
       
   527 private:
       
   528 	enum { KMembersMax = 16 };
       
   529 	CDmTestMember*		iMembers[KMembersMax]; 
       
   530 	RDmDomainManager	iManager;
       
   531 	TPowerState			iState;
       
   532 	TBool				iAcknowledge;
       
   533 	TInt				iMembersCount;
       
   534 	TInt				iCount;
       
   535 	TUint32				iOrdinal;
       
   536 	CDmTest2Timer*		iTimer;
       
   537 	};
       
   538 
       
   539 
       
   540 void CDmTest2::Perform()
       
   541 	{
       
   542 	//
       
   543 	// Test system standby
       
   544 	//
       
   545 
       
   546 	test.Next(_L("Test 2"));
       
   547 	test.Printf(_L("Target State = 0x%x\n"), iState);
       
   548 	iMembers[0] = new CDmTestMember(KDmHierarchyIdPower, KDmIdRoot, 0, this);
       
   549 	test(iMembers[0] != NULL);
       
   550 	iMembers[1] = new CDmTestMember(KDmHierarchyIdPower, KDmIdRoot, 0, this);
       
   551 	test(iMembers[1] != NULL);
       
   552 	iMembers[2] = new CDmTestMember(KDmHierarchyIdPower, KDmIdApps, 1, this);
       
   553 	test(iMembers[2] != NULL);
       
   554 	iMembers[3] = new CDmTestMember(KDmHierarchyIdPower, KDmIdApps, 1, this);
       
   555 	test(iMembers[3] != NULL);
       
   556 	iMembers[4] = new CDmTestMember(KDmHierarchyIdPower, KDmIdUiApps, 1, this);
       
   557 	test(iMembers[4] != NULL);
       
   558 	iMembers[5] = new CDmTestMember(KDmHierarchyIdPower, KDmIdUiApps, 1, this);
       
   559 	test(iMembers[5] != NULL);
       
   560 	
       
   561 	// expected number of notifications
       
   562 	iMembersCount = 12;
       
   563 	// first expected ordinal
       
   564 	iOrdinal = (iState == EPwActive) ? 0 : 1;
       
   565 
       
   566 	TInt r = iManager.Connect();
       
   567 	test(r == KErrNone);
       
   568 
       
   569 	CActiveScheduler::Add(this);
       
   570 
       
   571 	// Use an absolute timer to request a wakeup event
       
   572 	iTimer = new CDmTest2Timer();
       
   573 	TTime wakeup;
       
   574 	wakeup.HomeTime();
       
   575 	wakeup += TTimeIntervalSeconds(5);
       
   576 	test.Printf(_L("Tick count before timer = %d\n"), User::NTickCount());
       
   577 	iTimer->At(wakeup);
       
   578 	
       
   579 	iManager.RequestSystemTransition(iState, CActive::iStatus);
       
   580 	CActive::SetActive();
       
   581 
       
   582 	CActiveScheduler::Start();
       
   583 	}
       
   584 
       
   585 TInt CDmTest2::TransitionNotification(MDmDomainMember& aDomainMember)
       
   586 	{
       
   587 	++iCount;
       
   588 	if (aDomainMember.State() == EPwActive)
       
   589 		{
       
   590 		if(aDomainMember.Ordinal() < iOrdinal)
       
   591 			{
       
   592 			// Making the test to fail in RunL function inorder to complete the cleanup from domain manager.
       
   593 			test.Printf(_L("Making test to fail as Ordinal Mismatch Expected : %d, Returned : %d, State : %d"), 
       
   594 																		aDomainMember.Ordinal(), iOrdinal, aDomainMember.State());
       
   595 			iCount--;
       
   596 			}
       
   597 		}
       
   598 	else
       
   599 		{
       
   600 		if(aDomainMember.Ordinal() > iOrdinal)
       
   601 			{
       
   602 			// Making the test to fail in RunL function inorder to complete the cleanup from domain manager.
       
   603 			test.Printf(_L("Making test to fail as Ordinal Mismatch Expected : %d, Returned : %d, State: %d"), 
       
   604 																		aDomainMember.Ordinal(), iOrdinal, aDomainMember.State());
       
   605 			iCount--;
       
   606 			}
       
   607 		}
       
   608 	iOrdinal = aDomainMember.Ordinal();
       
   609 
       
   610 	// acknowledge one from two
       
   611 	iAcknowledge = !iAcknowledge;
       
   612 	return iAcknowledge?KErrNone:KErrAbort;
       
   613 	}
       
   614 
       
   615 void CDmTest2::RunL()
       
   616 	{
       
   617 	test.Printf(_L("Tick count after CDmTest2::RunL() = %d\n"), User::NTickCount());
       
   618 
       
   619 	iTimer->Cancel();	
       
   620 	CActiveScheduler::Stop();
       
   621 
       
   622 	iManager.Close();
       
   623 
       
   624 	CDmTestMember** mp;
       
   625 	for (mp = iMembers; *mp; ++mp)
       
   626 		delete *mp;
       
   627 	test(CActive::iStatus == KErrTimedOut);
       
   628 	test(iCount == iMembersCount);
       
   629 	}
       
   630 
       
   631 void CDmTest2::DoCancel()
       
   632 	{
       
   633 	test(0);
       
   634 	}
       
   635 
       
   636 void CDmTest2::Release()
       
   637 	{
       
   638 	if (iTimer)
       
   639 		{
       
   640 		iTimer->Cancel();
       
   641 		delete iTimer;
       
   642 		}
       
   643 	delete this;
       
   644 	}
       
   645 
       
   646 class CDmTest3 : public MDmTest
       
   647 	{
       
   648 public: 
       
   649 	// from MDmTest
       
   650 	void Perform();
       
   651 	void Release();
       
   652 	TInt TransitionNotification(MDmDomainMember& aDomainMember);
       
   653 	void TransitionRequestComplete() {};
       
   654 	};
       
   655 
       
   656 void CDmTest3::Perform()
       
   657 	{
       
   658 	//
       
   659 	// Test simple error situation
       
   660 	//
       
   661 	RDmDomainManager manager;
       
   662 	TInt r = manager.Connect();
       
   663 	test(r == KErrNone);
       
   664 
       
   665 	RDmDomainManager manager1;
       
   666 	r = manager1.Connect();
       
   667 	test(r == KErrInUse);
       
   668 
       
   669 	RDmDomain domain;
       
   670 	r = domain.Connect(KDmIdNone);
       
   671 	test(r == KDmErrBadDomainId);
       
   672 	CDmTestMember*		testMember;
       
   673 	testMember = new CDmTestMember(KDmHierarchyIdPower, KDmIdApps, 1, this);
       
   674 	test (testMember != NULL);
       
   675 
       
   676 	TRequestStatus status;
       
   677 	manager.RequestDomainTransition(KDmIdApps, EPwStandby, status);
       
   678 	test(status.Int() == KRequestPending);
       
   679 
       
   680 	TRequestStatus status1;
       
   681 	manager.RequestDomainTransition(KDmIdApps, EPwActive, status1);
       
   682 	User::WaitForRequest(status1);
       
   683 	test(status1.Int() == KDmErrBadSequence);
       
   684 	User::WaitForRequest(status);
       
   685 	test(status.Int() == KErrTimedOut);
       
   686 
       
   687 	// Since this test doesn't start the active scheduler, a domain member's RunL() will 
       
   688 	// not get called so we need to re-request a domain transition notification manually
       
   689 	User::WaitForRequest(testMember->iStatus);
       
   690 	test(testMember->iStatus.Int() == KErrNone);
       
   691 	testMember->iDomain.RequestTransitionNotification(testMember->iStatus);
       
   692 
       
   693 	manager.RequestDomainTransition(KDmIdApps, EPwActive, status);
       
   694 	test(status.Int() == KRequestPending);
       
   695 	manager.CancelTransition();
       
   696 	test(status.Int() == KErrCancel);
       
   697 	manager.CancelTransition();
       
   698 	User::WaitForRequest(status);
       
   699 	test(status.Int() == KErrCancel);
       
   700 
       
   701 	testMember->iDomain.CancelTransitionNotification();
       
   702 
       
   703 	delete testMember;
       
   704 	
       
   705 	domain.Close();
       
   706 	manager.Close();
       
   707 	}
       
   708 
       
   709 TInt CDmTest3::TransitionNotification(MDmDomainMember& /*aDomainMember*/)
       
   710 	{
       
   711 	test(0);
       
   712 	return KErrAbort;	// don't acknowledge
       
   713 	}
       
   714 
       
   715 void CDmTest3::Release()
       
   716 	{
       
   717 	delete this;
       
   718 	}
       
   719 
       
   720 class CDmTest4 : public MDmTest
       
   721 	{
       
   722 public: 
       
   723 	// from MDmTest
       
   724 	void Perform();
       
   725 	void Release();
       
   726 	TInt TransitionNotification(MDmDomainMember& aDomainMember);
       
   727 	void TransitionRequestComplete() {};
       
   728 private:
       
   729 	void ExecSlave(TUint arg);
       
   730 	};
       
   731 
       
   732 _LIT(KSecuritySlavePath, "t_domain_slave.exe");
       
   733 
       
   734 void CDmTest4::ExecSlave(TUint aArg)
       
   735 	{
       
   736 	RProcess proc;
       
   737 	TInt r = proc.Create(KSecuritySlavePath, TPtrC((TUint16*) &aArg, sizeof(aArg)/sizeof(TUint16)));
       
   738 	test(r == KErrNone);
       
   739 	TRequestStatus status;
       
   740 	proc.Logon(status);
       
   741 	proc.Resume();
       
   742 	User::WaitForRequest(status);
       
   743 
       
   744     RDebug::Printf("CDmTest4::ExecSlave(%d) ExitType %d", aArg, proc.ExitType() );
       
   745     RDebug::Printf("CDmTest4::ExecSlave(%d) ExitReason %d", aArg, proc.ExitReason() );
       
   746 	test(proc.ExitType() == EExitKill);
       
   747 //	test(proc.ExitReason() == KErrPermissionDenied);
       
   748 
       
   749 	CLOSE_AND_WAIT(proc);
       
   750 	}
       
   751 
       
   752 //! @SYMTestCaseID PBASE-T_DOMAIN-4
       
   753 //! @SYMTestType CT
       
   754 //! @SYMTestCaseDesc Dmain manager security tests
       
   755 //! @SYMREQ 3722
       
   756 //! @SYMTestActions Launches a separate process with no capabilities
       
   757 //! @SYMTestExpectedResults  DM APIs should fail with KErrPermissionDenied
       
   758 //! @SYMTestPriority High
       
   759 //! @SYMTestStatus Defined
       
   760 void CDmTest4::Perform()
       
   761 	{
       
   762 	//
       
   763 	// Security tests
       
   764 	//
       
   765 
       
   766 	ExecSlave(0);
       
   767 
       
   768     ExecSlave(1);
       
   769 
       
   770 	}
       
   771 
       
   772 TInt CDmTest4::TransitionNotification(MDmDomainMember& /*aDomainMember*/)
       
   773 	{
       
   774 	test(0);
       
   775 	return KErrNone;
       
   776 	}
       
   777 
       
   778 void CDmTest4::Release()
       
   779 	{
       
   780 	delete this;
       
   781 	}
       
   782 
       
   783 // Test hierarchy tests
       
   784 class CDmTestStartupMember : public CDmTestMember
       
   785 	{
       
   786 public:
       
   787 	CDmTestStartupMember(TDmHierarchyId aHierarchy, TDmDomainId aId, TUint32 aOrdinal, MDmTest*);
       
   788 
       
   789 public:
       
   790 private:
       
   791 	};
       
   792 
       
   793 CDmTestStartupMember::CDmTestStartupMember(TDmHierarchyId aHierarchy, TDmDomainId aId, TUint32 aOrdinal, MDmTest* aTest) 
       
   794 	: CDmTestMember(aHierarchy, aId, aOrdinal, aTest)
       
   795 	{
       
   796 	}
       
   797 
       
   798 // Simultaneously testing of test domain defined in DomainPolicy99.dll
       
   799 // and the power domain defined in DomainPolicy.dll
       
   800 class CDmTest5 : public CActive, public MDmTest
       
   801 	{
       
   802 public: 
       
   803 	// from CActive
       
   804 	void RunL();
       
   805 	// from MDmTest
       
   806 	void Perform();
       
   807 	void Release();
       
   808 	TInt TransitionNotification(MDmDomainMember& aDomainMember);
       
   809 	void TransitionRequestComplete();
       
   810 	CDmTest5(TDmDomainId aPowerId, TDmDomainId aTestId, TDmDomainState aPowerState, TDmDomainState aTestState) : 
       
   811 		CActive(CActive::EPriorityStandard), 
       
   812 		iPowerDomainId(aPowerId), iTestDomainId(aTestId), iPowerState(aPowerState), iTestState(aTestState) {}
       
   813 protected:
       
   814 	// from CActive
       
   815 	virtual void DoCancel();
       
   816 
       
   817 private:
       
   818 	enum { KMembersMax = 16 };
       
   819 	enum TAckMode{ KAckAlways, KAckNever, KAckError, KAckOddDomainsOnly };
       
   820 
       
   821 	CDmTestMember*		iTestMembers[KMembersMax]; 
       
   822 	CDomainMemberAo*	iPowerMembers[KMembersMax]; 
       
   823 
       
   824 	RDmDomainManager	iTestDomainManager;
       
   825 	
       
   826 	TDmDomainId			iPowerDomainId;
       
   827 	TDmDomainId			iTestDomainId;
       
   828 
       
   829 	TDmDomainState		iPowerState;
       
   830 	TDmDomainState		iTestState;
       
   831 
       
   832 	// level number for iTestDomainId. E.g 1 for KDmIdRoot, 2 for KDmIdTestA, etc.
       
   833 	TInt				iTestDomainLevel;	
       
   834 
       
   835 	TDmTraverseDirection iTraverseDirection;
       
   836 
       
   837 	TAckMode			iAckMode;
       
   838 
       
   839 public:
       
   840 	TInt				iTestNotifications;
       
   841 	TInt				iPowerNotifications;
       
   842 	TInt				iTestNotificationsExpected;
       
   843 	TInt				iPowerNotificationsExpected;
       
   844 
       
   845 	TInt				iTransitionsCompleted;
       
   846 	TInt				iTransitionsExpected;
       
   847 	};
       
   848 
       
   849 
       
   850 
       
   851 //! @SYMTestCaseID PBASE-T_DOMAIN-5
       
   852 //! @SYMTestType CT
       
   853 //! @SYMTestCaseDesc Connects to two domain hierarchies simulteneously and perform various tests
       
   854 //! @SYMREQ 3704,3705,3706,3707,3708,3709,3710,3711,3720,3721,3724,3725,3726,3727
       
   855 //! @SYMTestActions Open two hiearchies simultaneously and perform various actions.
       
   856 //! @SYMTestExpectedResults  All tests should pass
       
   857 //! @SYMTestPriority High
       
   858 //! @SYMTestStatus Defined
       
   859 void CDmTest5::Perform()
       
   860 	{
       
   861 
       
   862  	__UHEAP_MARK;
       
   863 
       
   864 	//
       
   865 	// Test domain transitions
       
   866 	//
       
   867 	CActiveScheduler::Add(this);
       
   868 
       
   869 	TInt r = RDmDomainManager::AddDomainHierarchy(KDmHierarchyIdTest);
       
   870 
       
   871     RDebug::Printf("RDmDomainManager::AddDomainHierarchy returns %d", r );
       
   872 
       
   873 	test(r == KErrNone);
       
   874 
       
   875 	CDomainManagerAo* powerDomainManager = NULL;
       
   876 	TRAP(r, powerDomainManager = CDomainManagerAo::NewL(KDmHierarchyIdPower, *this));
       
   877 	test (powerDomainManager != NULL);
       
   878 
       
   879 	r = CDomainManagerAo::AddDomainHierarchy(KDmHierarchyIdPower);
       
   880 	test(r == KErrNone);
       
   881 
       
   882 	//*************************************************
       
   883 	//	Test 5a - connect to two domain hierarchies simultaneously
       
   884 	//*************************************************
       
   885 	test.Next(_L("Test 5a - connect to two domain hierarchies simultaneously"));
       
   886 
       
   887 	test.Printf(_L("Domain id = 0x%x, Target State = 0x%x\n"), iTestDomainId, iTestState);
       
   888 
       
   889 	TInt testMemberCount = 0;
       
   890 
       
   891 	// Add some test hierarchy members - these use the RDmDomain API
       
   892 	iTestMembers[testMemberCount] = new CDmTestMember(KDmHierarchyIdTest, KDmIdRoot, ORDINAL_FROM_DOMAINID0(KDmIdRoot), this);
       
   893 	test(iTestMembers[testMemberCount++] != NULL);
       
   894 	iTestMembers[testMemberCount] = new CDmTestMember(KDmHierarchyIdTest, KDmIdRoot, ORDINAL_FROM_DOMAINID0(KDmIdRoot), this);
       
   895 	test(iTestMembers[testMemberCount++] != NULL);
       
   896 	
       
   897 	// row 1
       
   898 	iTestMembers[testMemberCount] = new CDmTestMember(KDmHierarchyIdTest, KDmIdTestA, ORDINAL_FROM_DOMAINID1(KDmIdRoot, KDmIdTestA), this);
       
   899 	test(iTestMembers[testMemberCount++] != NULL);
       
   900 	iTestMembers[testMemberCount] = new CDmTestMember(KDmHierarchyIdTest, KDmIdTestB, ORDINAL_FROM_DOMAINID1(KDmIdRoot, KDmIdTestB), this);
       
   901 	test(iTestMembers[testMemberCount++] != NULL);
       
   902 	iTestMembers[testMemberCount] = new CDmTestMember(KDmHierarchyIdTest, KDmIdTestC, ORDINAL_FROM_DOMAINID1(KDmIdRoot, KDmIdTestC), this);
       
   903 	test(iTestMembers[testMemberCount++] != NULL);
       
   904 	
       
   905 	// row2
       
   906 	iTestMembers[testMemberCount] = new CDmTestMember(KDmHierarchyIdTest, KDmIdTestAA, ORDINAL_FROM_DOMAINID2(KDmIdRoot, KDmIdTestA, KDmIdTestAA), this);
       
   907 	test(iTestMembers[testMemberCount++] != NULL);
       
   908 	iTestMembers[testMemberCount] = new CDmTestMember(KDmHierarchyIdTest, KDmIdTestAB, ORDINAL_FROM_DOMAINID2(KDmIdRoot, KDmIdTestA, KDmIdTestAB), this);
       
   909 	test(iTestMembers[testMemberCount++] != NULL);
       
   910 	iTestMembers[testMemberCount] = new CDmTestMember(KDmHierarchyIdTest, KDmIdTestBA, ORDINAL_FROM_DOMAINID2(KDmIdRoot, KDmIdTestB, KDmIdTestBA), this);
       
   911 	test(iTestMembers[testMemberCount++] != NULL);
       
   912 	iTestMembers[testMemberCount] = new CDmTestMember(KDmHierarchyIdTest, KDmIdTestCA, ORDINAL_FROM_DOMAINID2(KDmIdRoot, KDmIdTestC, KDmIdTestCA), this);
       
   913 	test(iTestMembers[testMemberCount++] != NULL);
       
   914 	
       
   915 	// row 3
       
   916 	iTestMembers[testMemberCount] = new CDmTestMember(KDmHierarchyIdTest, KDmIdTestABA, ORDINAL_FROM_DOMAINID3(KDmIdRoot, KDmIdTestA, KDmIdTestAB, KDmIdTestABA), this);
       
   917 	test(iTestMembers[testMemberCount++] != NULL);
       
   918 	iTestMembers[testMemberCount] = new CDmTestMember(KDmHierarchyIdTest, KDmIdTestABB, ORDINAL_FROM_DOMAINID3(KDmIdRoot, KDmIdTestA, KDmIdTestAB, KDmIdTestABB), this);
       
   919 	test(iTestMembers[testMemberCount++] != NULL);
       
   920 	iTestMembers[testMemberCount] = new CDmTestMember(KDmHierarchyIdTest, KDmIdTestCAA, ORDINAL_FROM_DOMAINID3(KDmIdRoot, KDmIdTestC, KDmIdTestCA, KDmIdTestCAA), this);
       
   921 	test(iTestMembers[testMemberCount++] != NULL);
       
   922 
       
   923 	// add some power hierarchy members - these use the CDmDomain AO API
       
   924 	TInt powerMemberCount = 0;
       
   925 	TRAP(r, iPowerMembers[powerMemberCount] = CDomainMemberAo::NewL(KDmHierarchyIdPower, KDmIdRoot, KDmIdRoot, this));
       
   926 	test(iTestMembers[powerMemberCount++] != NULL);
       
   927 	TRAP(r, iPowerMembers[powerMemberCount] = CDomainMemberAo::NewL(KDmHierarchyIdPower, KDmIdApps, KDmIdApps, this));
       
   928 	test(iTestMembers[powerMemberCount++] != NULL);
       
   929 	TRAP(r, iPowerMembers[powerMemberCount] = CDomainMemberAo::NewL(KDmHierarchyIdPower, KDmIdUiApps, KDmIdUiApps, this));
       
   930 	test(iTestMembers[powerMemberCount++] != NULL);
       
   931 
       
   932 
       
   933 	RArray<const TTransitionFailure> testFailures;
       
   934 	TInt testFailureCount;
       
   935 	RArray<const TTransitionFailure> powerFailures;
       
   936 	TInt powerFailureCount;
       
   937 
       
   938 
       
   939 
       
   940 	// calculate the expected number of notifications
       
   941 	TInt expectedTestNotifications = 0;
       
   942 	TInt leafNodes = 0;
       
   943 	
       
   944 
       
   945 	// work out the domain level, the number of leaf nodes and the expected number of 
       
   946 	// notifications for the domain that is being transitioned
       
   947 	switch(iTestDomainId)
       
   948 		{
       
   949 		case KDmIdRoot		:	iTestDomainLevel = 1; leafNodes = 5; expectedTestNotifications = testMemberCount; break;
       
   950 		case KDmIdTestA		:	iTestDomainLevel = 2; leafNodes = 3; expectedTestNotifications = 5; break;
       
   951 		case KDmIdTestB		:	iTestDomainLevel = 2; leafNodes = 1; expectedTestNotifications = 2; break;
       
   952 		case KDmIdTestC		:	iTestDomainLevel = 2; leafNodes = 1; expectedTestNotifications = 3; break;
       
   953 
       
   954 		case KDmIdTestAA	:	iTestDomainLevel = 3; leafNodes = 1; expectedTestNotifications = 1; break;
       
   955 		case KDmIdTestAB	:	iTestDomainLevel = 3; leafNodes = 2; expectedTestNotifications = 3; break;
       
   956 		case KDmIdTestBA	:	iTestDomainLevel = 3; leafNodes = 1; expectedTestNotifications = 1; break;
       
   957 		case KDmIdTestCA	:	iTestDomainLevel = 3; leafNodes = 1; expectedTestNotifications = 2; break;
       
   958 
       
   959 		case KDmIdTestABA	:	iTestDomainLevel = 4; leafNodes = 1; expectedTestNotifications = 1; break;
       
   960 		case KDmIdTestABB	:	iTestDomainLevel = 4; leafNodes = 1; expectedTestNotifications = 1; break;
       
   961 		case KDmIdTestCAA	:	iTestDomainLevel = 4; leafNodes = 1; expectedTestNotifications = 1; break;
       
   962 		default:
       
   963 			test(0);
       
   964 		}
       
   965 	test.Printf(_L("Test Domain id = 0x%x, Level = %d, Target State = 0x%x, expected notifications = %d, leafNodes = %d\n"), 
       
   966 		iTestDomainId, iTestDomainLevel, iTestState, expectedTestNotifications, leafNodes);
       
   967 
       
   968 	TInt expectedPowerNotifications = 0;
       
   969 	switch(iPowerDomainId)
       
   970 		{
       
   971 		case KDmIdRoot		:	expectedPowerNotifications = powerMemberCount; break;
       
   972 		case KDmIdApps		:	expectedPowerNotifications = 1; break;
       
   973 		case KDmIdUiApps	:	expectedPowerNotifications = 1; break;
       
   974 		default:
       
   975 			test(0);
       
   976 		}
       
   977 
       
   978 
       
   979 
       
   980 	// connect to the test hierarchy
       
   981 	r = iTestDomainManager.Connect(KDmHierarchyIdTest);
       
   982 	test(r == KErrNone);
       
   983 
       
   984 	// verify that we can't connect to the same hierarchy more than once
       
   985 	RDmDomainManager	domainManager;
       
   986 	r = domainManager.Connect(KDmHierarchyIdTest);
       
   987 	test(r == KErrInUse);
       
   988 
       
   989 
       
   990 
       
   991 	//*************************************************
       
   992 	// Test 5b - request a positive transition
       
   993 	// issue a positive  transition (i.e. transition state increases)
       
   994 	// and request that the test domain use ETraverseParentsFirst
       
   995 	//*************************************************
       
   996 	test.Next(_L("Test 5b - request a positive transition"));
       
   997 	iAckMode = KAckAlways;
       
   998 
       
   999 	iTransitionsCompleted = iTestNotifications = iPowerNotifications = 0;
       
  1000 	iPowerNotificationsExpected = 0;
       
  1001 	iTestNotificationsExpected = expectedTestNotifications;
       
  1002 	iTransitionsExpected = 1;
       
  1003 
       
  1004 	// DON'T request any domain transition on the power hierarchy
       
  1005 	// powerDomainManager->RequestDomainTransition(iPowerDomainId, EPwActive);
       
  1006 	// request a domain transition on the test hierarchy
       
  1007 	iTraverseDirection = ETraverseParentsFirst;
       
  1008 	if (iTestDomainId == KDmIdRoot)
       
  1009 		iTestDomainManager.RequestSystemTransition(iTestState, ETraverseDefault, CActive::iStatus);
       
  1010 	else
       
  1011 		iTestDomainManager.RequestDomainTransition(iTestDomainId, iTestState, ETraverseDefault, CActive::iStatus);
       
  1012 	CActive::SetActive();
       
  1013 
       
  1014 	CActiveScheduler::Start();
       
  1015 	test(powerDomainManager->iStatus == KErrNone);
       
  1016 	test(iStatus == KErrNone);
       
  1017 	test(iTestNotifications == iTestNotificationsExpected);
       
  1018 	test(iPowerNotifications == iPowerNotificationsExpected);
       
  1019 
       
  1020 	//*************************************************
       
  1021 	// Test 5c- verify domains are in correct state
       
  1022 	//*************************************************
       
  1023 	test.Next(_L("Test 5c- verify domains are in correct state"));
       
  1024 	RDmDomain domainMember;
       
  1025 	r = domainMember.Connect(KDmHierarchyIdTest, iTestDomainId);
       
  1026 	test (r == KErrNone);
       
  1027 	TDmDomainState state = domainMember.GetState();
       
  1028 	domainMember.Close();
       
  1029 	test (state == iTestState);
       
  1030 
       
  1031 	// if the transition request is not on the root, verify that that 
       
  1032 	// the root domain and the transition domain are in different states
       
  1033 	if (iTestDomainId != KDmIdRoot && iTestState != EStartupCriticalStatic)
       
  1034 		{
       
  1035 		r = domainMember.Connect(KDmHierarchyIdTest, KDmIdRoot);
       
  1036 		test (r == KErrNone);
       
  1037 		TDmDomainState state = domainMember.GetState();
       
  1038 		domainMember.Close();
       
  1039 		test (state != iTestState);
       
  1040 		}
       
  1041 
       
  1042 
       
  1043 	//*************************************************
       
  1044 	// Test 5d- request a negative transition
       
  1045 	// issue a negative transition (i.e. transition state decreases)
       
  1046 	// and request that the test domain use ETraverseChildrenFirst
       
  1047 	//*************************************************
       
  1048 	test.Next(_L("Test 5d- request a negative transition"));
       
  1049 	iAckMode = KAckAlways;
       
  1050 	iTestState--;	// EStartupCriticalStatic;
       
  1051 	iPowerState--;	// EPwStandby
       
  1052 
       
  1053 	iTransitionsCompleted = iTestNotifications = iPowerNotifications = 0;
       
  1054 	iPowerNotificationsExpected = expectedPowerNotifications;
       
  1055 	iTestNotificationsExpected = expectedTestNotifications;
       
  1056 	iTransitionsExpected = 2;
       
  1057 
       
  1058 	// DO request a domain transition on the power hierarchy
       
  1059 	powerDomainManager->RequestDomainTransition(iPowerDomainId, iPowerState, ETraverseDefault);
       
  1060 
       
  1061 	// request a domain transition on the test hierarchy
       
  1062 	iTraverseDirection = ETraverseChildrenFirst;
       
  1063 	iTestDomainManager.RequestDomainTransition(iTestDomainId, iTestState, iTraverseDirection, CActive::iStatus);
       
  1064 	CActive::SetActive();
       
  1065 
       
  1066 	// wait for all test & power transitions to complete
       
  1067 	CActiveScheduler::Start();
       
  1068 	test(powerDomainManager->iStatus == KErrNone);
       
  1069 	test(iStatus == KErrNone);
       
  1070 	test(iTestNotifications == iTestNotificationsExpected);
       
  1071 	test(iPowerNotifications == iPowerNotificationsExpected);
       
  1072 	
       
  1073 
       
  1074 	//*************************************************
       
  1075 	// Test 5e- request a positive transition, with zero acknowledgements
       
  1076 	// issue a positive transition with no members acknowledging the transition
       
  1077 	//*************************************************
       
  1078 	test.Next(_L("Test 5e- request a positive transition, with zero acknowledgements"));
       
  1079 	iAckMode = KAckNever;
       
  1080 	iTestState++;		// EStartupCriticalDynamic;
       
  1081 	iPowerState++;		// EPwActive
       
  1082 
       
  1083 	// power hierarchy should continue on failure, so we all power domains should transition
       
  1084 	// test hierarchy should stop on failure, so should get notifications from all leaf nodes
       
  1085 	iTransitionsCompleted = iTestNotifications = iPowerNotifications = 0;
       
  1086 	iPowerNotificationsExpected = expectedPowerNotifications;
       
  1087 	iTestNotificationsExpected = leafNodes;	// 5 leaf nodes for root domain
       
  1088 	iTransitionsExpected = 2;
       
  1089 
       
  1090 	// DO request a domain transition on the power hierarchy
       
  1091 	powerDomainManager->RequestDomainTransition(iPowerDomainId, iPowerState, ETraverseDefault);
       
  1092 
       
  1093 	// request a domain transition on the test hierarchy
       
  1094 	iTraverseDirection = ETraverseChildrenFirst;
       
  1095 	iTestDomainManager.RequestDomainTransition(iTestDomainId, iTestState, iTraverseDirection, CActive::iStatus);
       
  1096 	CActive::SetActive();
       
  1097 
       
  1098 	// wait for all test & power transitions to complete
       
  1099 	CActiveScheduler::Start();
       
  1100 	test(powerDomainManager->iStatus == KErrTimedOut);
       
  1101 	test(iStatus == KErrTimedOut);
       
  1102 	test(iTestNotifications == iTestNotificationsExpected);
       
  1103 	test(iPowerNotifications == iPowerNotificationsExpected);
       
  1104 	
       
  1105 	// get the failures on the test hierarchy
       
  1106 	testFailureCount = iTestDomainManager.GetTransitionFailureCount();
       
  1107 	test (testFailureCount == 1);
       
  1108 
       
  1109 	r = iTestDomainManager.GetTransitionFailures(testFailures);
       
  1110 	test(r == KErrNone);
       
  1111 	test(testFailureCount == testFailures.Count());
       
  1112 
       
  1113 	test.Printf(_L("Test failures = %d\n"), testFailureCount);
       
  1114 	TInt i;
       
  1115 	for (i=0; i<testFailureCount; i++)
       
  1116 		{
       
  1117 		test.Printf(_L("%d: iDomainId %d, iError %d\n"), 
       
  1118 			i, testFailures[i].iDomainId, testFailures[i].iError);
       
  1119 		test(testFailures[i].iError == KErrTimedOut);
       
  1120 		}
       
  1121 
       
  1122 	// get the failures on the power hierarchy
       
  1123 	powerFailureCount = powerDomainManager->GetTransitionFailureCount();
       
  1124 	test (powerFailureCount == expectedPowerNotifications);
       
  1125 
       
  1126 	r = powerDomainManager->GetTransitionFailures(powerFailures);
       
  1127 	test(r == KErrNone);
       
  1128 	test(powerFailureCount == powerFailures.Count());
       
  1129 
       
  1130 	test.Printf(_L("Power failures = %d\n"), powerFailureCount);
       
  1131 	for (i=0; i<powerFailureCount; i++)
       
  1132 		{
       
  1133 		test.Printf(_L("%d: iDomainId %d, iError %d\n"), 
       
  1134 			i, powerFailures[i].iDomainId, powerFailures[i].iError);
       
  1135 		test(powerFailures[i].iError == KErrTimedOut);
       
  1136 		}
       
  1137 
       
  1138 	
       
  1139 	//*************************************************
       
  1140 	// Test 5f- request a positive transition, with error acknowledgements
       
  1141 	// issue a positive transition with all members nack'ing the transition
       
  1142 	//*************************************************
       
  1143 	test.Next(_L("Test 5f- request a positive transition, with error acknowledgements"));
       
  1144 	iAckMode = KAckError;
       
  1145 	iTestState++;		
       
  1146 	iPowerState++;		
       
  1147 
       
  1148 	// power hierarchy should continue on failure, so all power domains should transition
       
  1149 	// test hierarchy should stop on failure, so should get notifications from 
       
  1150 	// anything from 1 to all the leaf nodes
       
  1151 	iTransitionsCompleted = iTestNotifications = iPowerNotifications = 0;
       
  1152 	iPowerNotificationsExpected = expectedPowerNotifications;
       
  1153 	iTestNotificationsExpected = leafNodes;	// 5 leaf nodes for root domain
       
  1154 	iTransitionsExpected = 2;
       
  1155 
       
  1156 	// DO request a domain transition on the power hierarchy
       
  1157 	powerDomainManager->RequestDomainTransition(iPowerDomainId, iPowerState, ETraverseDefault);
       
  1158 
       
  1159 	// request a domain transition on the test hierarchy
       
  1160 	iTraverseDirection = ETraverseChildrenFirst;
       
  1161 	iTestDomainManager.RequestDomainTransition(iTestDomainId, iTestState, iTraverseDirection, CActive::iStatus);
       
  1162 	CActive::SetActive();
       
  1163 
       
  1164 	// wait for all test & power transitions to complete
       
  1165 	CActiveScheduler::Start();
       
  1166 	test(powerDomainManager->iStatus == KErrGeneral);
       
  1167 	test(iStatus == KErrGeneral);
       
  1168 	test(iTestNotifications <= iTestNotificationsExpected);
       
  1169 	test(iPowerNotifications == iPowerNotificationsExpected);
       
  1170 	
       
  1171 	// get the failures on the test hierarchy
       
  1172 	testFailureCount = iTestDomainManager.GetTransitionFailureCount();
       
  1173 	test (testFailureCount == 1);
       
  1174 
       
  1175 	r = iTestDomainManager.GetTransitionFailures(testFailures);
       
  1176 	test(r == KErrNone);
       
  1177 	test(testFailureCount == testFailures.Count());
       
  1178 
       
  1179 	test.Printf(_L("Test failures = %d\n"), testFailureCount);
       
  1180 	for (i=0; i<testFailureCount; i++)
       
  1181 		{
       
  1182 		test.Printf(_L("%d: iDomainId %d, iError %d\n"), 
       
  1183 			i, testFailures[i].iDomainId, testFailures[i].iError);
       
  1184 		test(testFailures[i].iError == KErrGeneral);
       
  1185 		}
       
  1186 
       
  1187 	// get the failures on the power hierarchy
       
  1188 	powerFailureCount = powerDomainManager->GetTransitionFailureCount();
       
  1189 	test (powerFailureCount == expectedPowerNotifications);
       
  1190 
       
  1191 	r = powerDomainManager->GetTransitionFailures(powerFailures);
       
  1192 	test(r == KErrNone);
       
  1193 	test(powerFailureCount == powerFailures.Count());
       
  1194 
       
  1195 	test.Printf(_L("Power failures = %d\n"), powerFailureCount);
       
  1196 	for (i=0; i<powerFailureCount; i++)
       
  1197 		{
       
  1198 		test.Printf(_L("%d: iDomainId %d, iError %d\n"), 
       
  1199 			i, powerFailures[i].iDomainId, powerFailures[i].iError);
       
  1200 		test(powerFailures[i].iError == KErrGeneral);
       
  1201 		}
       
  1202 
       
  1203 	
       
  1204 	// cleanup
       
  1205 
       
  1206 	testFailures.Reset();
       
  1207 	powerFailures.Reset();
       
  1208 
       
  1209 	iTestDomainManager.Close();
       
  1210 	delete powerDomainManager;
       
  1211 	powerDomainManager = NULL;
       
  1212 
       
  1213 	CDmTestMember** mt;
       
  1214 	for (mt = iTestMembers; *mt; ++mt)
       
  1215 		delete *mt;
       
  1216 
       
  1217 	CDomainMemberAo** mp;
       
  1218 	for (mp = iPowerMembers; *mp; ++mp)
       
  1219 		delete *mp;
       
  1220 
       
  1221 
       
  1222 	// restore the domain hierarchies to their initial state so as not to 
       
  1223 	// upset any subsequent tests which rely on this
       
  1224 	{
       
  1225 	RDmDomainManager manager;
       
  1226 	TInt r = manager.Connect();
       
  1227 	test (r == KErrNone);
       
  1228 	TRequestStatus status;
       
  1229 	manager.RequestDomainTransition(KDmIdRoot, EPwActive, status);
       
  1230 	test(status.Int() == KRequestPending);
       
  1231 	User::WaitForRequest(status);
       
  1232 	test(status.Int() == KErrNone);
       
  1233 	manager.Close();
       
  1234 	
       
  1235 	r = manager.Connect(KDmHierarchyIdTest);
       
  1236 	test (r == KErrNone);
       
  1237 	manager.RequestDomainTransition(KDmIdRoot, EStartupCriticalStatic, ETraverseDefault, status);
       
  1238 	test(status.Int() == KRequestPending);
       
  1239 	User::WaitForRequest(status);
       
  1240 	test(status.Int() == KErrNone);
       
  1241 	manager.Close();
       
  1242 	}
       
  1243 
       
  1244  	__UHEAP_MARKEND;
       
  1245 	}
       
  1246 
       
  1247 // This handles a transition notification from either a power domain member or 
       
  1248 // a test domain member.
       
  1249 // Verifies that the domain state is as expected.
       
  1250 // Updates the number of notifications for each hierarchy and verifies that all parent 
       
  1251 // domains have transitioned already (for parent-to-child transitions) or that all child 
       
  1252 // domains have been transitioned already (for child-to-parent transitions).
       
  1253 
       
  1254 TInt CDmTest5::TransitionNotification(MDmDomainMember& aDomainMember)
       
  1255 	{
       
  1256 	if (aDomainMember.HierarchyId() == KDmHierarchyIdPower)
       
  1257 		iPowerNotifications++;
       
  1258 	else
       
  1259 		iTestNotifications++;
       
  1260 
       
  1261 	if (aDomainMember.HierarchyId() == KDmHierarchyIdPower)
       
  1262 		{
       
  1263 		__PRINT((_L("CDmTest5::TransitionNotification(), Hierarchy = %d, iOrdinal = 0x%08X, state = 0x%x, status = %d\n"), 
       
  1264 			aDomainMember.HierarchyId(), aDomainMember.Ordinal(), aDomainMember.State(), aDomainMember.Status()));
       
  1265 		test(aDomainMember.State() == iPowerState);
       
  1266 		}
       
  1267 	else if (aDomainMember.HierarchyId() == KDmHierarchyIdTest)
       
  1268 		{
       
  1269 		TBuf16<4> buf;
       
  1270 		GetDomainDesc(aDomainMember.Ordinal(), buf);
       
  1271 
       
  1272 		__PRINT((_L("CDmTest5::TransitionNotification(), Hierarchy = %d, domain = %S, iOrdinal = 0x%08X, state = 0x%x, status = %d\n"), 
       
  1273 			aDomainMember.HierarchyId(), &buf, aDomainMember.Ordinal(), aDomainMember.State(), aDomainMember.Status()));
       
  1274 		test(aDomainMember.State() == iTestState);
       
  1275 		}
       
  1276 	else
       
  1277 		{
       
  1278 		test(0);
       
  1279 		}
       
  1280 
       
  1281 	// if we're going from parent to child, 
       
  1282 	// check that each parent domain has received a notification already
       
  1283 	// if not, check that each child domain has received a notification already
       
  1284 
       
  1285 	CDmTestMember** mp;
       
  1286 
       
  1287 	if (aDomainMember.HierarchyId() == KDmHierarchyIdTest && iAckMode == KAckAlways)
       
  1288 		{
       
  1289 
       
  1290 		if (iTraverseDirection == ETraverseParentsFirst)
       
  1291 			{
       
  1292 			TUint ordThis = aDomainMember.Ordinal();
       
  1293 			TUint ordParent = PARENT_ORDINAL(ordThis);
       
  1294 
       
  1295 			TInt levelParent = ORDINAL_LEVEL(ordParent);
       
  1296 
       
  1297 			TBuf16<4> buf;
       
  1298 			GetDomainDesc(ordParent, buf);
       
  1299 			if (levelParent >= iTestDomainLevel)
       
  1300 				{
       
  1301 				__PRINT((_L("Searching for parent domain = %S, ordinal = %08X \n"), &buf, ordParent));
       
  1302 				for (mp = iTestMembers; *mp; ++mp)
       
  1303 					{
       
  1304 					if ((*mp)->Ordinal() == ordParent)
       
  1305 						{
       
  1306 						TBuf16<4> buf;
       
  1307 						GetDomainDesc((*mp)->Ordinal(), buf);
       
  1308 						__PRINT((_L("Found parent (%S). notification = %d\n"), &buf, (*mp)->Notifications()));
       
  1309 						test ((*mp)->Notifications() == aDomainMember.Notifications());
       
  1310 						break;
       
  1311 						}
       
  1312 					}
       
  1313 				}
       
  1314 			}
       
  1315 		else
       
  1316 			{
       
  1317 			__PRINT((_L("Searching for children\n")));
       
  1318 			for (mp = iTestMembers; *mp; ++mp)
       
  1319 				{
       
  1320 
       
  1321 				TUint ordParent = PARENT_ORDINAL((*mp)->Ordinal());
       
  1322 				if (ordParent == aDomainMember.Ordinal())
       
  1323 					{
       
  1324 					TBuf16<4> buf;
       
  1325 					GetDomainDesc((*mp)->Ordinal(), buf);
       
  1326 					__PRINT((_L("Found child (%S). notification = %d\n"), &buf, (*mp)->Notifications()));
       
  1327 					test ((*mp)->Notifications() == aDomainMember.Notifications());
       
  1328 					}
       
  1329 				}
       
  1330 			}
       
  1331 		}
       
  1332 
       
  1333 	TInt ackError;
       
  1334 	switch (iAckMode)
       
  1335 		{
       
  1336 		case KAckNever:
       
  1337 			ackError = KErrAbort;
       
  1338 			break;
       
  1339 		case KAckError:		// return an error to the DM
       
  1340 			ackError = KErrGeneral;
       
  1341 			break;
       
  1342 		case KAckOddDomainsOnly:
       
  1343 			ackError = (aDomainMember.DomainId() & 1)?KErrNone:KErrAbort;
       
  1344 			break;
       
  1345 		case KAckAlways:
       
  1346 		default:
       
  1347 			ackError = KErrNone;
       
  1348 			break;
       
  1349 		}
       
  1350 	return ackError;
       
  1351 	}
       
  1352 
       
  1353 void CDmTest5::RunL()
       
  1354 	{
       
  1355 	iTransitionsCompleted++;
       
  1356 
       
  1357 	__PRINT((_L("CDmTest5::RunL(), error = %d, iTestNotifications %d, iPowerNotifications %d\n"), 
       
  1358 		iStatus.Int(), iTestNotifications , iPowerNotifications));
       
  1359 
       
  1360 	if (iTransitionsCompleted == iTransitionsExpected)
       
  1361 		CActiveScheduler::Stop();
       
  1362 	}
       
  1363 
       
  1364 void CDmTest5::TransitionRequestComplete()
       
  1365 	{
       
  1366 	iTransitionsCompleted++;
       
  1367 
       
  1368 	__PRINT((_L("CDmTest5::TransitionRequestComplete(), error = %d, iTestNotifications %d, iPowerNotifications %d\n"), 
       
  1369 		iStatus.Int(), iTestNotifications , iPowerNotifications));
       
  1370 	
       
  1371 	if (iTransitionsCompleted == iTransitionsExpected)
       
  1372 		CActiveScheduler::Stop();
       
  1373 	}
       
  1374 
       
  1375 void CDmTest5::DoCancel()
       
  1376 	{
       
  1377 	test(0);
       
  1378 	}
       
  1379 
       
  1380 void CDmTest5::Release()
       
  1381 	{
       
  1382 	delete this;
       
  1383 	}
       
  1384 
       
  1385 const TInt KMembersMax = 16;
       
  1386 
       
  1387 // Negative testing 
       
  1388 class CDmTest6 : public CActive, public MDmTest
       
  1389 	{
       
  1390 public:
       
  1391 	enum 
       
  1392 	{
       
  1393 	ENegTestTransitionNoConnect,
       
  1394 	ENegTestGetStateNoConnect,
       
  1395 	ENegTestTransitionInvalidMode
       
  1396 	};
       
  1397 
       
  1398 	class TData 
       
  1399 		{
       
  1400 	public:
       
  1401 		inline TData(TInt aTest) : iTest(aTest){};
       
  1402 		TInt iTest;
       
  1403 		};
       
  1404 
       
  1405 public: 
       
  1406 	// from CActive
       
  1407 	void RunL();
       
  1408  
       
  1409 	// from MDmTest
       
  1410 	void Perform();
       
  1411 	void Release();
       
  1412 	TInt TransitionNotification(MDmDomainMember& aDomainMember);
       
  1413 	void TransitionRequestComplete();
       
  1414 
       
  1415 
       
  1416 	CDmTest6() : CActive(CActive::EPriorityStandard) {}
       
  1417 
       
  1418 protected:
       
  1419 	// from CActive
       
  1420 	virtual void DoCancel();
       
  1421 
       
  1422 private:
       
  1423 	static TInt PanicThreadFunc(TAny* aData);
       
  1424 	void PanicTest(TInt aTestNumber);
       
  1425 
       
  1426 
       
  1427 	CDomainMemberAo*	iTestMembers[KMembersMax]; 
       
  1428 	CDomainManagerAo*	iTestDomainManager;
       
  1429 	
       
  1430 	TDmDomainId			iTestDomainId;
       
  1431 	TDmDomainState		iTestState;
       
  1432 
       
  1433 public:
       
  1434 	TInt				iTestNotifications;
       
  1435 	TInt				iTestNotificationsExpected;
       
  1436 
       
  1437 	TInt				iTransitionsCompleted;
       
  1438 	TInt				iTransitionsExpected;
       
  1439 	};
       
  1440 
       
  1441 TInt CDmTest6::PanicThreadFunc(TAny* aData)
       
  1442 	{
       
  1443 	const TData* data = (const TData*)aData;
       
  1444 	switch (data->iTest)
       
  1445 		{
       
  1446 		case ENegTestTransitionNoConnect:
       
  1447 			{
       
  1448 			// request a transition notification without connecting first (should panic)
       
  1449 			RDmDomain domainMember;
       
  1450 			TRequestStatus status;
       
  1451 			User::SetJustInTime(EFalse);
       
  1452 			domainMember.RequestTransitionNotification(status);
       
  1453 			}
       
  1454 			break;
       
  1455 		case ENegTestGetStateNoConnect:
       
  1456 			{
       
  1457 			// Get the domain state without connecting (should panic)
       
  1458 			RDmDomain domainMember;
       
  1459 			User::SetJustInTime(EFalse);
       
  1460 			domainMember.GetState();
       
  1461 			}
       
  1462 			break;
       
  1463 		case ENegTestTransitionInvalidMode:
       
  1464 			{
       
  1465 			RDmDomainManager manager;
       
  1466 			TRequestStatus status;
       
  1467 			TInt r = manager.Connect(KDmHierarchyIdTest);
       
  1468 			test(r == KErrNone);
       
  1469 
       
  1470 			User::SetJustInTime(EFalse);
       
  1471 			manager.RequestDomainTransition(KDmIdRoot, 0, TDmTraverseDirection(-1), status);
       
  1472 			}
       
  1473 			break;
       
  1474 		default:
       
  1475 			break;
       
  1476 		}
       
  1477 	return KErrNone;
       
  1478 	}
       
  1479 
       
  1480 void CDmTest6::PanicTest(TInt aTestNumber)
       
  1481 	{
       
  1482 	test.Printf(_L("panic test number %d\n"), aTestNumber);
       
  1483 
       
  1484 	TBool jit = User::JustInTime();
       
  1485 
       
  1486 	TData data(aTestNumber);
       
  1487 
       
  1488 	TInt KHeapSize=0x2000;
       
  1489 
       
  1490 	RThread thread;
       
  1491 	TInt ret = thread.Create(KThreadName, PanicThreadFunc, KDefaultStackSize, KHeapSize, KHeapSize, &data);
       
  1492 	test(KErrNone == ret);
       
  1493 	TRequestStatus stat;
       
  1494 	thread.Logon(stat);
       
  1495 	thread.Resume();
       
  1496 	User::WaitForRequest(stat);
       
  1497 
       
  1498 	User::SetJustInTime(jit);
       
  1499 
       
  1500 	// The thread must panic
       
  1501 	test(thread.ExitType() == EExitPanic);
       
  1502 	TInt exitReason = thread.ExitReason();
       
  1503 	test.Printf(_L("panic test exit reason = %d\n"), exitReason);
       
  1504 
       
  1505 	switch(aTestNumber)
       
  1506 		{
       
  1507 		case ENegTestTransitionNoConnect:
       
  1508 			test (exitReason == EBadHandle);
       
  1509 			break;
       
  1510 		case ENegTestGetStateNoConnect:
       
  1511 			test (exitReason == EBadHandle);
       
  1512 			break;
       
  1513 		case ENegTestTransitionInvalidMode:
       
  1514 			break;
       
  1515 		default:
       
  1516 			break;
       
  1517 		}
       
  1518 
       
  1519 	CLOSE_AND_WAIT(thread);
       
  1520 	}
       
  1521 
       
  1522 
       
  1523 //! @SYMTestCaseID PBASE-T_DOMAIN-6
       
  1524 //! @SYMTestType CT
       
  1525 //! @SYMTestCaseDesc Negative testing
       
  1526 //! @SYMPREQ 810
       
  1527 //! @SYMTestActions Various negative tests
       
  1528 //! @SYMTestExpectedResults  All tests should pass
       
  1529 //! @SYMTestPriority High
       
  1530 //! @SYMTestStatus Defined
       
  1531 void CDmTest6::Perform()
       
  1532 	{
       
  1533 
       
  1534  	__UHEAP_MARK;
       
  1535 
       
  1536 	CActiveScheduler::Add(this);
       
  1537 
       
  1538 	CDomainManagerAo* iTestDomainManager = NULL;
       
  1539 	TRAP_IGNORE(iTestDomainManager = CDomainManagerAo::NewL(KDmHierarchyIdTest, *this));
       
  1540 	test (iTestDomainManager != NULL);
       
  1541 
       
  1542 	TInt r = CDomainManagerAo::AddDomainHierarchy(KDmHierarchyIdTest);
       
  1543 	test(r == KErrNone);
       
  1544 
       
  1545 	//*************************************************
       
  1546 	// Test 6a - Connect to the same hierarchy twice
       
  1547 	//*************************************************
       
  1548 	test.Next(_L("Test 6a - Connect to the same hierarchy twice"));
       
  1549 
       
  1550 	// verify that we can't connect to the same hierarchy more than once
       
  1551 	CDomainManagerAo* testDomainManager = NULL;
       
  1552 	TRAP(r, testDomainManager = CDomainManagerAo::NewL(KDmHierarchyIdTest, *this));
       
  1553 	test(r == KErrInUse);
       
  1554 	test (testDomainManager == NULL);
       
  1555 
       
  1556 
       
  1557 	TInt testMemberCount = 0;
       
  1558 
       
  1559 	// Add some test hierarchy members
       
  1560 	TRAP(r, iTestMembers[testMemberCount] = CDomainMemberAo::NewL(KDmHierarchyIdTest, KDmIdRoot, ORDINAL_FROM_DOMAINID0(KDmIdRoot), this));
       
  1561 	test(iTestMembers[testMemberCount++] != NULL);
       
  1562 	TRAP(r, iTestMembers[testMemberCount] = CDomainMemberAo::NewL(KDmHierarchyIdTest, KDmIdRoot, ORDINAL_FROM_DOMAINID0(KDmIdRoot), this));
       
  1563 	test(iTestMembers[testMemberCount++] != NULL);
       
  1564 	
       
  1565 	// row 1
       
  1566 	TRAP(r, iTestMembers[testMemberCount] = CDomainMemberAo::NewL(KDmHierarchyIdTest, KDmIdTestA, ORDINAL_FROM_DOMAINID1(KDmIdRoot, KDmIdTestA), this));
       
  1567 	test(iTestMembers[testMemberCount++] != NULL);
       
  1568 	TRAP(r, iTestMembers[testMemberCount] = CDomainMemberAo::NewL(KDmHierarchyIdTest, KDmIdTestB, ORDINAL_FROM_DOMAINID1(KDmIdRoot, KDmIdTestB), this));
       
  1569 	test(iTestMembers[testMemberCount++] != NULL);
       
  1570 	TRAP(r, iTestMembers[testMemberCount] = CDomainMemberAo::NewL(KDmHierarchyIdTest, KDmIdTestC, ORDINAL_FROM_DOMAINID1(KDmIdRoot, KDmIdTestC), this));
       
  1571 	test(iTestMembers[testMemberCount++] != NULL);
       
  1572 	
       
  1573 	// row2
       
  1574 	TRAP(r, iTestMembers[testMemberCount] = CDomainMemberAo::NewL(KDmHierarchyIdTest, KDmIdTestAA, ORDINAL_FROM_DOMAINID2(KDmIdRoot, KDmIdTestA, KDmIdTestAA), this));
       
  1575 	test(iTestMembers[testMemberCount++] != NULL);
       
  1576 	TRAP(r, iTestMembers[testMemberCount] = CDomainMemberAo::NewL(KDmHierarchyIdTest, KDmIdTestAB, ORDINAL_FROM_DOMAINID2(KDmIdRoot, KDmIdTestA, KDmIdTestAB), this));
       
  1577 	test(iTestMembers[testMemberCount++] != NULL);
       
  1578 	TRAP(r, iTestMembers[testMemberCount] = CDomainMemberAo::NewL(KDmHierarchyIdTest, KDmIdTestBA, ORDINAL_FROM_DOMAINID2(KDmIdRoot, KDmIdTestB, KDmIdTestBA), this));
       
  1579 	test(iTestMembers[testMemberCount++] != NULL);
       
  1580 	TRAP(r, iTestMembers[testMemberCount] = CDomainMemberAo::NewL(KDmHierarchyIdTest, KDmIdTestCA, ORDINAL_FROM_DOMAINID2(KDmIdRoot, KDmIdTestC, KDmIdTestCA), this));
       
  1581 	test(iTestMembers[testMemberCount++] != NULL);
       
  1582 	
       
  1583 	// row 3
       
  1584 	TRAP(r, iTestMembers[testMemberCount] = CDomainMemberAo::NewL(KDmHierarchyIdTest, KDmIdTestABA, ORDINAL_FROM_DOMAINID3(KDmIdRoot, KDmIdTestA, KDmIdTestAB, KDmIdTestABA), this));
       
  1585 	test(iTestMembers[testMemberCount++] != NULL);
       
  1586 	TRAP(r, iTestMembers[testMemberCount] = CDomainMemberAo::NewL(KDmHierarchyIdTest, KDmIdTestABB, ORDINAL_FROM_DOMAINID3(KDmIdRoot, KDmIdTestA, KDmIdTestAB, KDmIdTestABB), this));
       
  1587 	test(iTestMembers[testMemberCount++] != NULL);
       
  1588 	TRAP(r, iTestMembers[testMemberCount] = CDomainMemberAo::NewL(KDmHierarchyIdTest, KDmIdTestCAA, ORDINAL_FROM_DOMAINID3(KDmIdRoot, KDmIdTestC, KDmIdTestCA, KDmIdTestCAA), this));
       
  1589 	test(iTestMembers[testMemberCount++] != NULL);
       
  1590 
       
  1591 
       
  1592 	//*************************************************
       
  1593 	// Test 6b change to current state
       
  1594 	//*************************************************
       
  1595 	test.Next(_L("Test 6b change to current state"));
       
  1596 	iTestState =  EStartupCriticalStatic;
       
  1597 	iTestDomainId = KDmIdRoot;
       
  1598 
       
  1599 	iTransitionsCompleted = iTestNotifications = 0;
       
  1600 	iTestNotificationsExpected = testMemberCount;
       
  1601 	iTransitionsExpected = 1;
       
  1602 
       
  1603 	// request a domain transition
       
  1604 	iTestDomainManager->RequestDomainTransition(iTestDomainId, iTestState, ETraverseDefault);
       
  1605 
       
  1606 	// wait for test transitions to complete
       
  1607 	CActiveScheduler::Start();
       
  1608 	test(iStatus == KErrNone);
       
  1609 	test(iTestNotifications == iTestNotificationsExpected);
       
  1610 	
       
  1611 
       
  1612 	// cancel a member notification request 
       
  1613 	//*************************************************
       
  1614 	// Test 6c cancel a member notification request
       
  1615 	//*************************************************
       
  1616 	test.Next(_L("Test 6c cancel a member notification request"));
       
  1617 	RDmDomain domainMember;
       
  1618 	TRequestStatus status;
       
  1619 	domainMember.Connect(KDmHierarchyIdTest, iTestDomainId);
       
  1620 	domainMember.RequestTransitionNotification(status);
       
  1621 	domainMember.CancelTransitionNotification();
       
  1622 	User::WaitForRequest(status);
       
  1623 	domainMember.Close();
       
  1624 
       
  1625 	//*************************************************
       
  1626 	// Test 6d cancel a member notification request without having first requested a notification
       
  1627 	//*************************************************
       
  1628 	test.Next(_L("Test 6d cancel a member notification request without having first requested a notification"));
       
  1629 	domainMember.Connect(KDmHierarchyIdTest, iTestDomainId);
       
  1630 	domainMember.CancelTransitionNotification();
       
  1631 	domainMember.Close();
       
  1632 
       
  1633 	//*************************************************
       
  1634 	// Test 6e domain controller adds invalid hierarchy
       
  1635 	//*************************************************
       
  1636 	test.Next(_L("Test 6e domain controller connects to invalid hierarchy"));
       
  1637 	r = RDmDomainManager::AddDomainHierarchy(TDmHierarchyId(-1));
       
  1638 	test(r == KErrBadHierarchyId);
       
  1639 
       
  1640 	//*************************************************
       
  1641 	// Test 6f domain member connects to invalid hierarchy
       
  1642 	//*************************************************
       
  1643 	test.Next(_L("Test 6f domain member connects to invalid hierarchy"));
       
  1644 	r = domainMember.Connect(TDmHierarchyId(-1), TDmDomainId(KDmIdRoot));
       
  1645 	test (r == KErrBadHierarchyId);
       
  1646 
       
  1647 	//*************************************************
       
  1648 	// Test 6g domain member connects to valid hierarchy but invalid domain
       
  1649 	//*************************************************
       
  1650 	test.Next(_L("Test 6g domain member connects to valid hierarchy but invalid domain"));
       
  1651 	r = domainMember.Connect(KDmHierarchyIdTest, TDmDomainId(-1));
       
  1652 	test (r == KDmErrBadDomainId);
       
  1653 
       
  1654 	delete iTestDomainManager;
       
  1655 	iTestDomainManager = NULL;
       
  1656 
       
  1657 	// Panic tests
       
  1658 
       
  1659 	//*************************************************
       
  1660 	// Test 6h request a transition notification without connecting first
       
  1661 	//*************************************************
       
  1662 	test.Next(_L("Test 6h request a transition notification without connecting first"));
       
  1663 	PanicTest(ENegTestTransitionNoConnect);
       
  1664 
       
  1665 	//*************************************************
       
  1666 	// Test 6i Get the domain state without connecting
       
  1667 	//*************************************************
       
  1668 	test.Next(_L("Test 6i Get the domain state without connecting"));
       
  1669 	PanicTest(ENegTestGetStateNoConnect);
       
  1670 
       
  1671 	//*************************************************
       
  1672 	// Test 6j request a transition notification with an invalid transition mode
       
  1673 	//*************************************************
       
  1674 	test.Next(_L("Test 6j request a transition notification with an invalid transition mode"));
       
  1675 	PanicTest(ENegTestTransitionInvalidMode);
       
  1676 
       
  1677 
       
  1678 	// cleanup
       
  1679 
       
  1680 	CDomainMemberAo** mt;
       
  1681 	for (mt = iTestMembers; *mt; ++mt)
       
  1682 		delete *mt;
       
  1683 
       
  1684  	__UHEAP_MARKEND;
       
  1685 	}
       
  1686 
       
  1687 // This handles a transition notification from a test domain member.
       
  1688 TInt CDmTest6::TransitionNotification(MDmDomainMember& aDomainMember)
       
  1689 	{
       
  1690 	TInt status = aDomainMember.Status();
       
  1691 		
       
  1692 	iTestNotifications++;
       
  1693 
       
  1694 	test (aDomainMember.HierarchyId() == KDmHierarchyIdTest);
       
  1695 
       
  1696 	TBuf16<4> buf;
       
  1697 	GetDomainDesc(aDomainMember.Ordinal(), buf);
       
  1698 
       
  1699 	test.Printf(_L("CDmTest6::TransitionNotification(), Hierarchy = %d, domain = %S, iOrdinal = 0x%08X, state = 0x%x, status = %d\n"), 
       
  1700 		aDomainMember.HierarchyId(), &buf, aDomainMember.Ordinal(), aDomainMember.State(), status);
       
  1701 
       
  1702 
       
  1703 	return KErrNone;
       
  1704 	}
       
  1705 
       
  1706 void CDmTest6::RunL()
       
  1707 	{
       
  1708 	iTransitionsCompleted++;
       
  1709 
       
  1710 	TInt error = iStatus.Int();
       
  1711 
       
  1712 	test.Printf(_L("CDmTest6::RunL(), error = %d, iTestNotifications %d\n"), 
       
  1713 		error, iTestNotifications);
       
  1714 
       
  1715 	if (iTransitionsCompleted == iTransitionsExpected)
       
  1716 		CActiveScheduler::Stop();
       
  1717 	}
       
  1718 
       
  1719 void CDmTest6::TransitionRequestComplete()
       
  1720 	{
       
  1721 	iTransitionsCompleted++;
       
  1722 
       
  1723 	TInt error = iStatus.Int();
       
  1724 	
       
  1725 	test.Printf(_L("CDmTest6::TransitionRequestComplete(), error = %d, iTestNotifications %d\n"), 
       
  1726 		error, iTestNotifications);
       
  1727 	
       
  1728 	if (iTransitionsCompleted == iTransitionsExpected)
       
  1729 		CActiveScheduler::Stop();
       
  1730 	}
       
  1731 
       
  1732 void CDmTest6::DoCancel()
       
  1733 	{
       
  1734 	test(0);
       
  1735 	}
       
  1736 
       
  1737 void CDmTest6::Release()
       
  1738 	{
       
  1739 	delete this;
       
  1740 	}
       
  1741 
       
  1742 // Transition progress Observer testing
       
  1743 class CDmTest7 : public CActive, public MDmTest, public MHierarchyObserver
       
  1744 	{
       
  1745 public: 
       
  1746 	// from CActive
       
  1747 	void RunL();
       
  1748  
       
  1749 	// from MDmTest
       
  1750 	void Perform();
       
  1751 	void Release();
       
  1752 	TInt TransitionNotification(MDmDomainMember& aDomainMember);
       
  1753 	void TransitionRequestComplete();
       
  1754 
       
  1755 	// from MHierarchyObserver
       
  1756 	virtual void TransProgEvent(TDmDomainId aDomainId, TDmDomainState aState);
       
  1757 	virtual void TransFailEvent(TDmDomainId aDomainId, TDmDomainState aState, TInt aError);
       
  1758 	virtual void TransReqEvent(TDmDomainId aDomainId, TDmDomainState aState);
       
  1759 
       
  1760 
       
  1761 
       
  1762 	CDmTest7(TDmDomainId aDomainId) : CActive(CActive::EPriorityStandard), iObservedDomainId(aDomainId) {}
       
  1763 
       
  1764 protected:
       
  1765 	// from CActive
       
  1766 	virtual void DoCancel();
       
  1767 
       
  1768 private:
       
  1769 	void TestForCompletion();
       
  1770 
       
  1771 
       
  1772 private:
       
  1773 
       
  1774 	enum { KMembersMax = 16 };
       
  1775 
       
  1776 	CDomainMemberAo*	iTestMembers[KMembersMax]; 
       
  1777 	CDomainManagerAo*	iTestDomainManager;
       
  1778 	
       
  1779 	TDmDomainId			iTestDomainId;
       
  1780 	TDmDomainState		iTestState;
       
  1781 	TDmDomainId			iObservedDomainId;
       
  1782 
       
  1783 public:
       
  1784 	TInt				iTestNotifications;
       
  1785 	TInt				iTestNotificationsExpected;
       
  1786 
       
  1787 	TInt				iTransitionsCompleted;
       
  1788 	TInt				iTransitionsExpected;
       
  1789 
       
  1790 	TInt				iTransProgEvents;
       
  1791 	TInt				iTransFailEvents;
       
  1792 	TInt				iTransReqEvents;
       
  1793 
       
  1794 	TInt				iTransProgEventsExpected;
       
  1795 	TInt				iTransFailEventsExpected;
       
  1796 	TInt				iTransReqEventsExpected;
       
  1797 	};
       
  1798 
       
  1799 //! @SYMTestCaseID PBASE-T_DOMAIN-7
       
  1800 //! @SYMTestType CT
       
  1801 //! @SYMTestCaseDesc Transition progress Observer testing
       
  1802 //! @SYMREQ REQ3723
       
  1803 //! @SYMTestActions Various negative tests
       
  1804 //! @SYMTestExpectedResults  All tests should pass
       
  1805 //! @SYMTestPriority High
       
  1806 //! @SYMTestStatus Defined
       
  1807 void CDmTest7::Perform()
       
  1808 	{
       
  1809 
       
  1810  	__UHEAP_MARK;
       
  1811 
       
  1812 	//
       
  1813 	// Test domain transitions with activated observer
       
  1814 	//
       
  1815 	CActiveScheduler::Add(this);
       
  1816 
       
  1817 	TInt r = RDmDomainManager::AddDomainHierarchy(KDmHierarchyIdTest);
       
  1818 	test(r == KErrNone);
       
  1819 
       
  1820 	CDomainManagerAo* iTestDomainManager = NULL;
       
  1821 	TRAP_IGNORE(iTestDomainManager = CDomainManagerAo::NewL(KDmHierarchyIdTest, *this));
       
  1822 	test (iTestDomainManager != NULL);
       
  1823 
       
  1824 	r = CDomainManagerAo::AddDomainHierarchy(KDmHierarchyIdTest);
       
  1825 	test(r == KErrNone);
       
  1826 
       
  1827 	//*************************************************
       
  1828 	// Test 7a - Testing observer notifications
       
  1829 	//*************************************************
       
  1830 	
       
  1831 	test.Next(_L("Test 7a - Testing observer notifications"));
       
  1832 
       
  1833 	TInt testMemberCount = 0;
       
  1834 
       
  1835 	// Add some test hierarchy members
       
  1836 	TRAP(r, iTestMembers[testMemberCount] = CDomainMemberAo::NewL(KDmHierarchyIdTest, KDmIdRoot, ORDINAL_FROM_DOMAINID0(KDmIdRoot), this));
       
  1837 	test(iTestMembers[testMemberCount++] != NULL);
       
  1838 	
       
  1839 	// row 1
       
  1840 	TRAP(r, iTestMembers[testMemberCount] = CDomainMemberAo::NewL(KDmHierarchyIdTest, KDmIdTestA, ORDINAL_FROM_DOMAINID1(KDmIdRoot, KDmIdTestA), this));
       
  1841 	test(iTestMembers[testMemberCount++] != NULL);
       
  1842 	TRAP(r, iTestMembers[testMemberCount] = CDomainMemberAo::NewL(KDmHierarchyIdTest, KDmIdTestB, ORDINAL_FROM_DOMAINID1(KDmIdRoot, KDmIdTestB), this));
       
  1843 	test(iTestMembers[testMemberCount++] != NULL);
       
  1844 	TRAP(r, iTestMembers[testMemberCount] = CDomainMemberAo::NewL(KDmHierarchyIdTest, KDmIdTestC, ORDINAL_FROM_DOMAINID1(KDmIdRoot, KDmIdTestC), this));
       
  1845 	test(iTestMembers[testMemberCount++] != NULL);
       
  1846 	
       
  1847 	// row2
       
  1848 	TRAP(r, iTestMembers[testMemberCount] = CDomainMemberAo::NewL(KDmHierarchyIdTest, KDmIdTestAA, ORDINAL_FROM_DOMAINID2(KDmIdRoot, KDmIdTestA, KDmIdTestAA), this));
       
  1849 	test(iTestMembers[testMemberCount++] != NULL);
       
  1850 	TRAP(r, iTestMembers[testMemberCount] = CDomainMemberAo::NewL(KDmHierarchyIdTest, KDmIdTestAB, ORDINAL_FROM_DOMAINID2(KDmIdRoot, KDmIdTestA, KDmIdTestAB), this));
       
  1851 	test(iTestMembers[testMemberCount++] != NULL);
       
  1852 	TRAP(r, iTestMembers[testMemberCount] = CDomainMemberAo::NewL(KDmHierarchyIdTest, KDmIdTestBA, ORDINAL_FROM_DOMAINID2(KDmIdRoot, KDmIdTestB, KDmIdTestBA), this));
       
  1853 	test(iTestMembers[testMemberCount++] != NULL);
       
  1854 	TRAP(r, iTestMembers[testMemberCount] = CDomainMemberAo::NewL(KDmHierarchyIdTest, KDmIdTestCA, ORDINAL_FROM_DOMAINID2(KDmIdRoot, KDmIdTestC, KDmIdTestCA), this));
       
  1855 	test(iTestMembers[testMemberCount++] != NULL);
       
  1856 	
       
  1857 	// row 3
       
  1858 	TRAP(r, iTestMembers[testMemberCount] = CDomainMemberAo::NewL(KDmHierarchyIdTest, KDmIdTestABA, ORDINAL_FROM_DOMAINID3(KDmIdRoot, KDmIdTestA, KDmIdTestAB, KDmIdTestABA), this));
       
  1859 	test(iTestMembers[testMemberCount++] != NULL);
       
  1860 	TRAP(r, iTestMembers[testMemberCount] = CDomainMemberAo::NewL(KDmHierarchyIdTest, KDmIdTestABB, ORDINAL_FROM_DOMAINID3(KDmIdRoot, KDmIdTestA, KDmIdTestAB, KDmIdTestABB), this));
       
  1861 	test(iTestMembers[testMemberCount++] != NULL);
       
  1862 	TRAP(r, iTestMembers[testMemberCount] = CDomainMemberAo::NewL(KDmHierarchyIdTest, KDmIdTestCAA, ORDINAL_FROM_DOMAINID3(KDmIdRoot, KDmIdTestC, KDmIdTestCA, KDmIdTestCAA), this));
       
  1863 	test(iTestMembers[testMemberCount++] != NULL);
       
  1864 
       
  1865 	// create an observer
       
  1866 	CHierarchyObserver* observer = NULL;
       
  1867 	TRAP(r, observer = CHierarchyObserver::NewL(*this, KDmHierarchyIdTest));
       
  1868 	test (r == KErrNone);
       
  1869 	test(observer != NULL);
       
  1870 	observer->StartObserver(iObservedDomainId, EDmNotifyAll);
       
  1871 	
       
  1872 	// request a state change
       
  1873 	iTestState =  EStartupCriticalDynamic;
       
  1874 	iTestDomainId = KDmIdRoot;
       
  1875 	iTransitionsCompleted = iTestNotifications = 0;
       
  1876 	iTestNotificationsExpected = testMemberCount;
       
  1877 	iTransitionsExpected = 1;
       
  1878 
       
  1879 	iTransProgEvents = iTransFailEvents = iTransReqEvents = 0;
       
  1880 	
       
  1881 	iTransReqEventsExpected = iTransProgEventsExpected = observer->ObserverDomainCount();
       
  1882 	iTransFailEventsExpected = 0;
       
  1883 
       
  1884 
       
  1885 	iTestDomainManager->RequestDomainTransition(iTestDomainId, iTestState, ETraverseDefault);
       
  1886 
       
  1887 	// wait for test transitions to complete
       
  1888 	CActiveScheduler::Start();
       
  1889 	test(iStatus == KErrNone);
       
  1890 	test(iTestNotifications == iTestNotificationsExpected);
       
  1891 	test (iTransProgEvents == iTransProgEventsExpected);
       
  1892 	test (iTransFailEvents == iTransFailEventsExpected);
       
  1893 	test (iTransReqEvents == iTransReqEventsExpected);
       
  1894 
       
  1895 
       
  1896 	// cleanup
       
  1897 	delete observer; 
       
  1898 	observer = NULL;
       
  1899 
       
  1900 	//*************************************************
       
  1901 	// Test 7b - start & stop the observer
       
  1902 	//*************************************************
       
  1903 	test.Next(_L("Test 7b - start & stop the observer"));
       
  1904 
       
  1905 	// create an observer, start it stop and then start it again
       
  1906 	TRAP(r, observer = CHierarchyObserver::NewL(*this, KDmHierarchyIdTest));
       
  1907 	test (r == KErrNone);
       
  1908 	test(observer != NULL);
       
  1909 	observer->StartObserver(iObservedDomainId, EDmNotifyAll);
       
  1910 	observer->StopObserver();
       
  1911 	observer->StartObserver(iObservedDomainId, EDmNotifyAll);
       
  1912 
       
  1913 	// request a state change
       
  1914 	iTestState++;
       
  1915 	iTestDomainId = KDmIdRoot;
       
  1916 	iTransitionsCompleted = iTestNotifications = 0;
       
  1917 	iTestNotificationsExpected = testMemberCount;
       
  1918 	iTransitionsExpected = 1;
       
  1919 
       
  1920 	iTransProgEvents = iTransFailEvents = iTransReqEvents = 0;
       
  1921 	
       
  1922 	iTransProgEventsExpected = iTransReqEventsExpected = observer->ObserverDomainCount();
       
  1923 	iTransFailEventsExpected = 0;
       
  1924 
       
  1925 	iTestDomainManager->RequestDomainTransition(iTestDomainId, iTestState, ETraverseDefault);
       
  1926 
       
  1927 	// wait for test transitions to complete
       
  1928 	CActiveScheduler::Start();
       
  1929 	test(iStatus == KErrNone);
       
  1930 	test(iTestNotifications == iTestNotificationsExpected);
       
  1931 	test (iTransProgEvents == iTransProgEventsExpected);
       
  1932 	test (iTransFailEvents == iTransFailEventsExpected);
       
  1933 	test (iTransReqEvents == iTransReqEventsExpected);
       
  1934 
       
  1935 	// stop the observer & request another state change
       
  1936 	observer->StopObserver();
       
  1937 	iTestState++;
       
  1938 	iTestDomainId = KDmIdRoot;
       
  1939 	iTransitionsCompleted = iTestNotifications = 0;
       
  1940 	iTestNotificationsExpected = testMemberCount;
       
  1941 	iTransitionsExpected = 1;
       
  1942 
       
  1943 	iTransProgEvents = iTransFailEvents = iTransReqEvents = 0;
       
  1944 	
       
  1945 	iTransProgEventsExpected = 0;
       
  1946 	iTransFailEventsExpected = 0;
       
  1947 	iTransReqEventsExpected = 0;
       
  1948 
       
  1949 	iTestDomainManager->RequestDomainTransition(iTestDomainId, iTestState, ETraverseDefault);
       
  1950 	// wait for test transitions to complete
       
  1951 	CActiveScheduler::Start();
       
  1952 	test(iStatus == KErrNone);
       
  1953 	test(iTestNotifications == iTestNotificationsExpected);
       
  1954 	test (iTransProgEvents == iTransProgEventsExpected);
       
  1955 	test (iTransFailEvents == iTransFailEventsExpected);
       
  1956 	test (iTransReqEvents == iTransReqEventsExpected);
       
  1957 
       
  1958 	// Start the observer again on a different domain and only ask for transition requests
       
  1959 	// Then request another state change
       
  1960 	observer->StartObserver((iObservedDomainId == KDmIdRoot)?KDmIdTestCA:KDmIdRoot, EDmNotifyTransRequest);
       
  1961 	iTestState++;
       
  1962 	iTestDomainId = KDmIdRoot;
       
  1963 	iTransitionsCompleted = iTestNotifications = 0;
       
  1964 	iTestNotificationsExpected = testMemberCount;
       
  1965 	iTransitionsExpected = 1;
       
  1966 
       
  1967 	iTransProgEvents = iTransFailEvents = iTransReqEvents = 0;
       
  1968 	
       
  1969 	iTransReqEventsExpected = observer->ObserverDomainCount();
       
  1970 	iTransProgEventsExpected = 0;
       
  1971 	iTransFailEventsExpected = 0;
       
  1972 
       
  1973 
       
  1974 	iTestDomainManager->RequestDomainTransition(iTestDomainId, iTestState, ETraverseDefault);
       
  1975 	// wait for test transitions to complete
       
  1976 	CActiveScheduler::Start();
       
  1977 	test(iStatus == KErrNone);
       
  1978 	test(iTestNotifications == iTestNotificationsExpected);
       
  1979 	test (iTransProgEvents == iTransProgEventsExpected);
       
  1980 	test (iTransFailEvents == iTransFailEventsExpected);
       
  1981 	test (iTransReqEvents == iTransReqEventsExpected);
       
  1982 
       
  1983 	delete observer; 
       
  1984 	observer = NULL;
       
  1985 
       
  1986 	//*************************************************
       
  1987 	// Test 7c - invalid arguments testing for observer
       
  1988 	//*************************************************
       
  1989 	test.Next(_L("Test 7c - Invalid arguments testing for observer"));
       
  1990 	
       
  1991 	const TDmHierarchyId	KDmHierarchyIdInvalid = 110;
       
  1992 	
       
  1993 	test.Printf(_L("Test 7c.1 - create observer with invalid hierarchy Id\n"));
       
  1994 	
       
  1995 	// create an observer
       
  1996 	TRAP(r, observer = CHierarchyObserver::NewL(*this, KDmHierarchyIdInvalid));
       
  1997 	test (r == KErrBadHierarchyId);
       
  1998 	
       
  1999 	
       
  2000 	test.Printf(_L("Test 7c.2 - Starting the observer with wrong domain Id\n"));
       
  2001 	TRAP(r, observer = CHierarchyObserver::NewL(*this, KDmHierarchyIdTest));
       
  2002 	test (r == KErrNone);
       
  2003 	test(observer != NULL);
       
  2004 
       
  2005 	//Wrong domain Id
       
  2006 	const TDmDomainId	KDmIdInvalid	= 0x0f;
       
  2007 	r= observer->StartObserver(KDmIdInvalid, EDmNotifyAll);
       
  2008 	test(r==KDmErrBadDomainId);
       
  2009 
       
  2010 	test.Printf(_L("Test 7c.3 - Trying to create second observer on the same hierarchy\n"));
       
  2011 	TRAP(r, CHierarchyObserver::NewL(*this, KDmHierarchyIdTest));
       
  2012 	test (r == KDmErrBadSequence);
       
  2013 
       
  2014 	
       
  2015 	
       
  2016 	//*************************************************
       
  2017 	// Test 7d - Wrong sequence of API calls for observer
       
  2018 	//*************************************************
       
  2019 	test.Next(_L("Test 7d - Observer wrong sequence of calls"));
       
  2020 	
       
  2021 	test.Printf(_L("Test 7d.1 - Stopping Observer before starting it\n"));
       
  2022 	r = observer->StopObserver();
       
  2023 	test(r==KDmErrBadSequence);
       
  2024 	
       
  2025 	test.Printf(_L("Test 7d.2 - Starting Observer twice\n"));
       
  2026 	r= observer->StartObserver(KDmIdRoot, EDmNotifyAll);
       
  2027 	test(r==KErrNone);
       
  2028 
       
  2029 	r= observer->StartObserver(KDmIdRoot, EDmNotifyAll);
       
  2030 	test(r==KDmErrBadSequence);
       
  2031 
       
  2032 	
       
  2033 	delete observer;
       
  2034 
       
  2035 	/***************************************/
       
  2036 
       
  2037 	delete iTestDomainManager;
       
  2038 	iTestDomainManager = NULL;
       
  2039 
       
  2040 	CDomainMemberAo** mt;
       
  2041 	for (mt = iTestMembers; *mt; ++mt)
       
  2042 		delete *mt;
       
  2043 
       
  2044 
       
  2045 	// restore the domain hierarchies to their initial state so as not to 
       
  2046 	// upset any subsequent tests which rely on this
       
  2047 	{
       
  2048 	RDmDomainManager manager;
       
  2049 	TRequestStatus status;
       
  2050 	TInt r = manager.Connect(KDmHierarchyIdTest);
       
  2051 	test (r == KErrNone);
       
  2052 	manager.RequestDomainTransition(KDmIdRoot, EStartupCriticalStatic, ETraverseDefault, status);
       
  2053 	User::WaitForRequest(status);
       
  2054 	test(status.Int() == KErrNone);
       
  2055 	manager.Close();
       
  2056 	}
       
  2057 
       
  2058  	__UHEAP_MARKEND;
       
  2059 	}
       
  2060 
       
  2061 // This handles a transition notification from a test domain member.
       
  2062 TInt CDmTest7::TransitionNotification(MDmDomainMember& aDomainMember)
       
  2063 	{
       
  2064 		
       
  2065 	iTestNotifications++;
       
  2066 
       
  2067 	test (aDomainMember.HierarchyId() == KDmHierarchyIdTest);
       
  2068 
       
  2069 	TBuf16<4> buf;
       
  2070 	GetDomainDesc(aDomainMember.Ordinal(), buf);
       
  2071 
       
  2072 	__PRINT((_L("CDmTest7::TransitionNotification(), Hierarchy = %d, domain = %S, iOrdinal = 0x%08X, state = 0x%x, status = %d\n"), 
       
  2073 		aDomainMember.HierarchyId(), &buf, aDomainMember.Ordinal(), aDomainMember.State(), aDomainMember.Status()));
       
  2074 
       
  2075 	return KErrNone;
       
  2076 	}
       
  2077 
       
  2078 void CDmTest7::RunL()
       
  2079 	{
       
  2080 	iTransitionsCompleted++;
       
  2081 
       
  2082 	__PRINT((_L("CDmTest7::RunL(), error = %d, iTestNotifications %d\n"), 
       
  2083 		iStatus.Int(), iTestNotifications));
       
  2084 
       
  2085 	TestForCompletion();
       
  2086 	}
       
  2087 
       
  2088 void CDmTest7::TransitionRequestComplete()
       
  2089 	{
       
  2090 	iTransitionsCompleted++;
       
  2091 
       
  2092 	__PRINT((_L("CDmTest7::TransitionRequestComplete(), error = %d, iTestNotifications %d\n"), 
       
  2093 		iStatus.Int(), iTestNotifications));
       
  2094 	
       
  2095 	TestForCompletion();
       
  2096 	}
       
  2097 
       
  2098 void CDmTest7::DoCancel()
       
  2099 	{
       
  2100 	test(0);
       
  2101 	}
       
  2102 
       
  2103 void CDmTest7::Release()
       
  2104 	{
       
  2105 	delete this;
       
  2106 	}
       
  2107 
       
  2108 void CDmTest7::TestForCompletion()
       
  2109 	{
       
  2110 
       
  2111 	if (iTransitionsCompleted == iTransitionsExpected &&
       
  2112 		iTransProgEvents == iTransProgEventsExpected && 
       
  2113 		iTransFailEvents == iTransFailEventsExpected &&
       
  2114 		iTransReqEvents == iTransReqEventsExpected)
       
  2115 		{
       
  2116 		CActiveScheduler::Stop();
       
  2117 		}
       
  2118 	}
       
  2119 
       
  2120 #ifdef _DEBUG
       
  2121 void CDmTest7::TransProgEvent(TDmDomainId aDomainId, TDmDomainState aState)
       
  2122 #else
       
  2123 void CDmTest7::TransProgEvent(TDmDomainId /*aDomainId*/, TDmDomainState /*aState*/)
       
  2124 #endif
       
  2125 	{
       
  2126 	iTransProgEvents++;
       
  2127 	__PRINT((_L("CDmTest7::TransProgEvent(), aDomainId = %d, aState %d, iTransProgEvents %d\n"), 
       
  2128 		aDomainId, aState, iTransProgEvents));
       
  2129 	TestForCompletion();
       
  2130 	}
       
  2131 
       
  2132 #ifdef _DEBUG
       
  2133 void CDmTest7::TransFailEvent(TDmDomainId aDomainId, TDmDomainState aState, TInt aError)
       
  2134 #else
       
  2135 void CDmTest7::TransFailEvent(TDmDomainId /*aDomainId*/, TDmDomainState /*aState*/, TInt /*aError*/)
       
  2136 #endif
       
  2137 
       
  2138 	{
       
  2139 	iTransFailEvents++;
       
  2140 	__PRINT((_L("CDmTest7::TransFailEvent(), aDomainId = %d, aState %d aError %d, iTransFailEvents %d\n"), 
       
  2141 		aDomainId, aState, iTransFailEvents, aError));
       
  2142 	TestForCompletion();
       
  2143 	}
       
  2144 
       
  2145 #ifdef _DEBUG
       
  2146 void CDmTest7::TransReqEvent(TDmDomainId aDomainId, TDmDomainState aState)
       
  2147 #else
       
  2148 void CDmTest7::TransReqEvent(TDmDomainId /*aDomainId*/, TDmDomainState /*aState*/)
       
  2149 #endif
       
  2150 	{
       
  2151 	iTransReqEvents++;
       
  2152 	__PRINT((_L("CDmTest7::TransReqEvent(), aDomainId = %d, aState %d, iTransReqEvents %d\n"), 
       
  2153 		aDomainId, aState, iTransReqEvents));
       
  2154 	TestForCompletion();
       
  2155 	}
       
  2156 
       
  2157 GLDEF_C TInt E32Main()
       
  2158 	{
       
  2159 	CTrapCleanup* trapHandler=CTrapCleanup::New();
       
  2160 	test(trapHandler!=NULL);
       
  2161 
       
  2162 	CActiveScheduler* scheduler = new CActiveScheduler();
       
  2163 	test(scheduler != NULL);
       
  2164 	CActiveScheduler::Install(scheduler);
       
  2165 
       
  2166 	// Turn off evil lazy dll unloading
       
  2167 	RLoader l;
       
  2168 	test(l.Connect()==KErrNone);
       
  2169 	test(l.CancelLazyDllUnload()==KErrNone);
       
  2170 	l.Close();
       
  2171 
       
  2172 	//
       
  2173 	// Perform the number of iterations specifed by the command line argument.
       
  2174 	//
       
  2175 	// If no arguments - perform two iterations
       
  2176 	//
       
  2177 //  TInt iter = 2;
       
  2178     TInt iter = 1;
       
  2179 
       
  2180 	TInt len = User::CommandLineLength();
       
  2181 	if (len)
       
  2182 		{
       
  2183 		// Copy the command line in a buffer
       
  2184 		HBufC* hb = HBufC::NewMax(len);
       
  2185 		test(hb != NULL);
       
  2186 		TPtr cmd((TUint16*) hb->Ptr(), len);
       
  2187 		User::CommandLine(cmd);
       
  2188 		// Extract the number of iterations
       
  2189 		TLex l(cmd);
       
  2190 		TInt i;
       
  2191 		TInt r = l.Val(i);
       
  2192 		if (r == KErrNone)
       
  2193 			iter = i;
       
  2194 		else
       
  2195 			// strange command - silently ignore
       
  2196 			{} 
       
  2197 		delete hb;
       
  2198 		}
       
  2199 
       
  2200 	test.Title();
       
  2201 	test.Start(_L("Testing"));
       
  2202 
       
  2203 	test.Printf(_L("Go for %d iterations\n"), iter);
       
  2204 
       
  2205 	// Remember the number of open handles. Just for a sanity check ....
       
  2206 	TInt start_thc, start_phc;
       
  2207 	RThread().HandleCount(start_phc, start_thc);
       
  2208 
       
  2209 	while (iter--)
       
  2210 		{
       
  2211 		MDmTest* tests[] = 
       
  2212 			{
       
  2213 
       
  2214 			new CDmTest1(KDmIdRoot, EPwStandby),
       
  2215 			new CDmTest1(KDmIdRoot, EPwOff),
       
  2216 			new CDmTest1(KDmIdRoot, EPwActive),
       
  2217 			new CDmTest1(KDmIdApps, EPwStandby),
       
  2218 			new CDmTest1(KDmIdApps, EPwOff),
       
  2219 			new CDmTest1(KDmIdApps, EPwActive),
       
  2220 			new CDmTest1(KDmIdUiApps, EPwStandby),
       
  2221 			new CDmTest1(KDmIdUiApps, EPwOff),
       
  2222 			new CDmTest1(KDmIdUiApps, EPwActive),
       
  2223 			new CDmTest2(EPwStandby),
       
  2224 			new CDmTest3(),
       
  2225 	
       
  2226 			// platform security tests
       
  2227 			new CDmTest4(),
       
  2228 
       
  2229 			// PREQ810 tests :
       
  2230 			// note that we use a fictitious power state to prevent any 
       
  2231 			new CDmTest5(KDmIdRoot, KDmIdRoot, EPwActive+10, EStartupCriticalDynamic),
       
  2232 			new CDmTest5(KDmIdUiApps, KDmIdTestAB, EPwActive+10, EStartupCriticalDynamic),
       
  2233 
       
  2234         // negative tests
       
  2235 			new CDmTest6(),
       
  2236 
       
  2237 
       
  2238 			// observer tests
       
  2239      		new CDmTest7(KDmIdTestA),
       
  2240 			new CDmTest7(KDmIdRoot),
       
  2241 			
       
  2242 			};
       
  2243 
       
  2244 		for (unsigned int i = 0; i < sizeof(tests)/sizeof(*tests); ++i)
       
  2245 			{
       
  2246 			test(tests[i] != NULL);
       
  2247 			tests[i]->Perform();
       
  2248 			tests[i]->Release();
       
  2249 			}
       
  2250 
       
  2251 		}
       
  2252 
       
  2253 	test.End();
       
  2254 
       
  2255 	// Sanity check for open handles and for pending requests ...
       
  2256 	TInt end_thc, end_phc;
       
  2257 	RThread().HandleCount(end_phc, end_thc);
       
  2258 	test(start_thc == end_thc);
       
  2259 	test(start_phc == end_phc);
       
  2260 	test(RThread().RequestCount() >= 0);
       
  2261 
       
  2262 	delete scheduler;
       
  2263 	delete trapHandler;
       
  2264 
       
  2265 	return KErrNone;
       
  2266 	}