kerneltest/e32test/resmanus/t_resmanus.cpp
branchRCL_3
changeset 257 3e88ff8f41d5
parent 256 c1f20ce4abcf
--- a/kerneltest/e32test/resmanus/t_resmanus.cpp	Tue Aug 31 16:34:26 2010 +0300
+++ b/kerneltest/e32test/resmanus/t_resmanus.cpp	Wed Sep 01 12:34:56 2010 +0100
@@ -43,6 +43,7 @@
 
 TBuf<16> gTestName(testName);
 
+GLDEF_D RTest gTest(testName);
 GLDEF_D RBusDevResManUs gChannel;
 
 TUint8 KNoOfGetStateRequests = 5;
@@ -74,116 +75,6 @@
 
 TBool gUseCached = EFalse;
 
-class RTestSafe: public RTest
-	{
-public:
-	RTestSafe(const TDesC &aTitle) :
-		RTest(aTitle), iCleanUpLevelMask (0), iFailHdnFunc(NULL)
-		{
-		}
-	RTestSafe(const TDesC &aTitle, void(*func)(RTestSafe &aTest)) :
-		RTest(aTitle), iFailHdnFunc(func)
-		{
-		}
-
-	// new version of operator(int), which calls our cleanup handler if check has failed
-	void operator()(TInt aResult)
-		{
-		if(!aResult && iFailHdnFunc)
-			iFailHdnFunc(*this);
-		RTest::operator ()(aResult);
-		}
-
-	void operator()(TInt aResult, TInt aLineNum)
-		{
-		if(!aResult && iFailHdnFunc)
-			iFailHdnFunc(*this);
-		RTest::operator ()(aResult, aLineNum);
-		}
-
-	void operator()(TInt aResult, TInt aLineNum, const TText* aFileName)
-		{
-		if(!aResult && iFailHdnFunc)
-			iFailHdnFunc(*this);
-		RTest::operator ()(aResult, aLineNum, aFileName);
-		}
-
-	// new version of End, which calls handler before exit..
-	void End()
-		{
-		if(iFailHdnFunc)
-			iFailHdnFunc(*this);
-		RTest::End();
-		}
-
-	void SetCleanupFlag(TUint aFlag)
-		{
-		iCleanUpLevelMask |= 1 << aFlag;
-		}
-
-	TBool CleanupNeeded(TUint aFlag)
-		{
-		return (iCleanUpLevelMask & (1 << aFlag)) >> aFlag;
-		}
-
-	TUint iCleanUpLevelMask;
-	void (*iFailHdnFunc)(RTestSafe &aTest);
-	};
-
-// cleanup handler
-enum TCleanupLevels
-	{
-	EPddLoaded = 0,
-	ELddLoaded,
-	EChannelOpened
-	};
-
-
-void TestCleanup(RTestSafe &aTest)
-	{
-	// cleanup for all 3 levels..
-	if(aTest.CleanupNeeded(EChannelOpened))
-		{
-		gChannel.Close();
-		}
-
-	if(aTest.CleanupNeeded(ELddLoaded))
-		{
-		User::FreeLogicalDevice(KLddRootName);
-		}
-
-	if(aTest.CleanupNeeded(EPddLoaded))
-		{
-		User::FreePhysicalDevice(PDD_NAME);
-		}
-	}
-
-// global gTest object..
-RTestSafe gTest(testName, &TestCleanup);
-
-LOCAL_C TInt CheckCaps()
-	{
-	TInt r = KErrNone;
-	RDevice d;
-	TPckgBuf<TCapsDevResManUs> caps;
-	r = d.Open(KLddRootName);
-	if(r == KErrNone)
-		{
-		d.GetCaps(caps);
-		d.Close();
-
-		TVersion ver = caps().version;
-		if(ver.iMajor != 1 || ver.iMinor != 0 || ver.iBuild != KE32BuildVersionNumber)
-			{
-			gTest.Printf(_L("Capabilities returned wrong version"));
-			gTest.Printf(_L("Expected(1, 0, %d), got (%d , %d, %d)"),
-			                KE32BuildVersionNumber, ver.iMajor, ver.iMinor, ver.iBuild);
-			r = KErrGeneral;
-			}
-		}
-	return r;
-	}
-
 LOCAL_C TInt OpenChannel(TDesC16& aName, RBusDevResManUs& aChannel)
 	{
 	TInt r = KErrNone;
@@ -1248,7 +1139,7 @@
 		}
 
 
-	// Fourth invocation - examine effect of oryginal client requesting a level for 
+	// Fourth invocation - examine effect of orignal client requesting a level for 
 	// the Shared resource
 	if(gHaveSharedRes)
 		{
@@ -1294,6 +1185,7 @@
 			}
 		}
 
+
 	// Close the temporary channels
 	channelTwo.Close();
 	channelThree.Close();
@@ -1451,10 +1343,8 @@
 	TInt r = KErrNone;
 
 	TRequestStatus status;
-	TRequestStatus status2;
 	TBool cached = gUseCached;
 	TInt readValue = 0;
-	TInt readValue2 = 0;
 	TInt levelOwnerId = 0;
 	TInt testNo = 0;
 
@@ -1634,20 +1524,10 @@
 
 	// 8) Call API to get the state of a long latency resource then call API without operation-type qualifier to cancel the request.
 	gTest.Printf(_L("TestGetSetResourceStateOps, starting test %d\n"),testNo++);
-	
-	// NOTE: Cancel operation can only remove request which is still inside the resource controller
-	// message queue. If the queue is empty, the resource controller may process the request very quickly
-	// after it is sent. It may cause the test fail. To solve this, two get long latency resource state 
-	// requests are submitted. So that the second one must be inside the resource controller. 
-	// And we will always test the second request
-	
 	gChannel.GetResourceState(status,gLongLatencyResource,cached,&readValue,&levelOwnerId);
-	gChannel.GetResourceState(status2,gLongLatencyResource,cached,&readValue2,&levelOwnerId);
 	gChannel.CancelAsyncOperation(&status);
-	gChannel.CancelAsyncOperation(&status2);
 	User::WaitForRequest(status);
-	User::WaitForRequest(status2);
-	if(status2.Int() != KErrCancel)
+	if(status.Int() != KErrCancel)
 		{
 		gTest.Printf(_L("TestGetSetResourceStateOps, cancelled get state status = %d\n"),r);
 		return r;
@@ -1655,21 +1535,11 @@
 
 	// 9) Call API to modify the state of the long latency resource then call API without operation-type qualifier to cancel the request.
 	gTest.Printf(_L("TestGetSetResourceStateOps, starting test %d\n"),testNo++);
-	
-	// NOTE: Cancel operation can only remove request which is still inside the resource controller
-	// message queue. If the queue is empty, the resource controller may process the request very quickly
-	// after it is sent. It may cause the test fail. To solve this, two get long latency resource state 
-	// requests are submitted. So that the second one must be inside the resource controller. 
-	// And we will always test the second request
-		
 	newLevel = (TUint)(readValue + gAsyncResStateDelta);
 	gChannel.ChangeResourceState(status,gLongLatencyResource,newLevel);
-	gChannel.ChangeResourceState(status2,gLongLatencyResource,newLevel);
 	gChannel.CancelAsyncOperation(&status);
-	gChannel.CancelAsyncOperation(&status2);
 	User::WaitForRequest(status);
-	User::WaitForRequest(status2);
-	if(status2.Int() != KErrCancel)
+	if(status.Int() != KErrCancel)
 		{
 		gTest.Printf(_L("TestGetSetResourceStateOps, cancelled change state status = %d\n"),r);
 		return r;
@@ -1727,12 +1597,7 @@
 	for(i=0;i<KLoopVarN;i++)
 		{
 		User::WaitForRequest(getReqStatus[i]);
-
-	// NOTE: Cancel operation can only remove request which is still inside the resource controller
-	// message queue. If the queue is empty, the resource controller may process the request very quickly
-	// after it is sent. It may cause the test fail. To solve this, we skip the test for request 0.
-			
-		if(i>0 && ((r=getReqStatus[i].Int()) != KErrCancel))
+		if((r=getReqStatus[i].Int()) != KErrCancel)
 			{
 			gTest.Printf(_L("TestGetSetResourceStateOps, cancelled get state status[%d] = %d\n"),i,r);
 			return r;
@@ -1750,12 +1615,7 @@
 	for(i=0;i<KLoopVarM;i++)
 		{
 		User::WaitForRequest(setReqStatus[i]);
-		
-	// NOTE: Cancel operation can only remove request which is still inside the resource controller
-	// message queue. If the queue is empty, the resource controller may process the request very quickly 
-	// after it is sent. It may cause the test fail. To solve this, we skip the test for request 0.
-		
-		if(i>0 && ((r=setReqStatus[i].Int()) != KErrCancel))
+		if((r=setReqStatus[i].Int()) != KErrCancel)
 			{
 			gTest.Printf(_L("TestGetSetResourceStateOps, cancelled change state status[%d] = %d\n"),i,r);
 			return r;
@@ -1831,12 +1691,7 @@
 	for(i=0;i<KLoopVarN;i++)
 		{
 		User::WaitForRequest(getReqStatus[i]);
-
-	// NOTE: Cancel operation can only remove request which is still inside the resource controller
-	// message queue. If the queue is empty, the resource controller may process the request very quickly 
-	// after it is sent. It may cause the test fail. To solve this, we skip the test for request 0.
-		
-		if(i>0 && ((r=getReqStatus[i].Int()) != KErrCancel))
+		if((r=getReqStatus[i].Int()) != KErrCancel)
 			{
 			gTest.Printf(_L("TestGetSetResourceStateOps, cancelled get state status[%d] = %d\n"),i,r);
 			return r;
@@ -1989,16 +1844,8 @@
 		r=gChannel.CancelGetResourceState(getReqStatus[i]);
 		if(r!=KErrNone)
 			{
-
-	// NOTE: Cancel operation can only remove request which is still inside the resource controller
-	// message queue. If the queue is empty, the resource controller may process the request very quickly 
-	// after it is sent. It may cause the test fail. To solve this, we skip the test for request 0.
-			
-			if(i!=0)
-				{
-				gTest.Printf(_L("TestGetSetResourceStateOps, CancelGetResourceState for index %d returned %d\n"),i,r);
-				return r;
-				}
+			gTest.Printf(_L("TestGetSetResourceStateOps, CancelGetResourceState for index %d returned %d\n"),i,r);
+			return r;
 			}
 		}
 	for(i=0;i<KLoopVarM;i++)
@@ -2021,12 +1868,7 @@
 	for(i=0;i<KLoopVarN;i++)
 		{
 		User::WaitForRequest(getReqStatus[i]);
-
-	// NOTE: Cancel operation can only remove request which is still inside the resource controller
-	// message queue. If the queue is empty, the resource controller may process the request very quickly 
-	// after it is sent. It may cause the test fail. To solve this, we skip the test for request 0.
-		
-		if(i>0 && ((r=getReqStatus[i].Int()) != KErrCancel))
+		if((r=getReqStatus[i].Int()) != KErrCancel)
 			{
 			gTest.Printf(_L("TestGetSetResourceStateOps, cancelled get state status[%d] = %d\n"),i,r);
 			return r;
@@ -3031,7 +2873,7 @@
 		gTest.Printf(_L("TestThreadExclusiveAccess: Duplicate with EOwnerProcess returned %d\n"),r);
 		if(r==KErrNone)
 			r=KErrGeneral;
-		return r; // return error which is neither KErrNone nor KErrAccessDenied
+		return r;
 		}
 	pirateChannel = gChannel;
 	if((r=pirateChannel.Duplicate(RThread(),EOwnerThread))!=KErrNone)
@@ -3155,7 +2997,7 @@
 		{
 		if(r==KErrNone)
 			r=KErrGeneral;
-		return r; // return error which is neither KErrPermissionDenied nor KErrGeneral
+		return r;
 		}
 	else
 		r=KErrNone; // Ensure misleading result is not propagated
@@ -3235,7 +3077,7 @@
 			{
 			if(r==KErrNone)
 				r=KErrGeneral;
-			return r; // return error which is neither KErrPermissionDenied nor KErrGeneral
+			return r;
 			}
 		else
 			r=KErrNone; // Ensure misleading result is not propagated
@@ -3929,7 +3771,7 @@
 		if((r=gChannel.GetInfoOnClientsUsingResource(gSharedResource, numClients, &infoPtrs, EFalse))!=KErrNotReady)
 			{
 			gTest.Printf(_L("TestTransientHandling: GetInfoOnClientsUsingResource (for gSharedResource) returned %d\n"),r);
-			return KErrGeneral;
+			return r;
 			}
 		infoPtrs.Close();
 		}
@@ -4238,82 +4080,104 @@
 //
 // Main
 //
-	{
-	gTest.Title();
+    {
 	gTest.Start(_L("Test Power Resource Manager user side API\n"));
+  
+	TInt r = KErrNone;
 
 	// Test attempted load of PDD
-	gTest.Next(_L("**Load PDD\n"));
-	TInt r = User::LoadPhysicalDevice(PDD_NAME);
-	gTest((r == KErrNone) || (r == KErrAlreadyExists));
-	gTest.SetCleanupFlag(EPddLoaded);
-
-	// Test attempted load of LDD
-	gTest.Next(_L("**Load LDD\n"));
-	r = User::LoadLogicalDevice(LDD_NAME);
-	gTest((r == KErrNone) || (r == KErrAlreadyExists));
-	r = KErrNone; // Re-initialise in case set to KErrAlreadyExists
-	gTest.SetCleanupFlag(ELddLoaded);
-
-	// test caps
-	gTest(CheckCaps() == KErrNone);
-
-	// Need a channel open for the following tests
-	gTest.Next(_L("**OpenAndRegisterChannel\n"));
-	r = OpenAndRegisterChannel();
-	gTest(r == KErrNone);
-	gTest.SetCleanupFlag(EChannelOpened);
-
-	// Get the version of the ResourceController
-	TUint version;
-	r = gChannel.GetResourceControllerVersion(version);
-	gTest.Printf(_L("TestTransientHandling: ResourceController version =0x%x\n"), version);
-	gTest(r == KErrNone);
-
-	gTest.Next(_L("**TestThreadExclusiveAccess\n"));
-	r = TestThreadExclusiveAccess();
-	gTest(r == KErrNone);
-
-	gTest.Next(_L("**TestGetClientGetResourceInfo - initial state\n"));
-	r = TestGetClientGetResourceInfo();
-	gTest(r == KErrNone);
-
-	gTest.Next(_L("**TestGetSetResourceStateOps\n"));
-	r = TestGetSetResourceStateOps();
-	gTest(r == KErrNone);
-
-	gTest.Next(_L("**TestGetClientGetResourceInfo - after changing stateof Async resource\n"));
-	r = TestGetClientGetResourceInfo();
-	gTest(r == KErrNone);
-
-	gTest.Next(_L("**TestGetSetResourceStateQuota\n"));
-	r = TestGetSetResourceStateQuota();
-	gTest(r == KErrNone);
-
-	gTest.Next(_L("**TestNotificationOps\n"));
-	r = TestNotificationOps();
-	gTest(r == KErrNone);
-
-	gTest.Next(_L("**TestNotificationQuota\n"));
-	r = TestNotificationQuota();
-	gTest(r == KErrNone);
-
-	// Should be no change since last invocation (assuming that
-	// no clients other than those in this test)
-	gTest.Next(_L("**TestGetClientGetResourceInfo - last invocation\n"));
-	r = TestGetClientGetResourceInfo();
-	gTest(r == KErrNone);
-
-	gTest.Next(_L("**TestAdditionalThread\n"));
-	r = TestAdditionalThread();
-	gTest(r == KErrNone);
-
-	gTest.Next(_L("**TestTransientHandling\n"));
-	r = TestTransientHandling();
-	gTest(r == KErrNone);
+    gTest.Next(_L("**Load PDD\n"));
+    r=User::LoadPhysicalDevice(PDD_NAME);
+    if((r!=KErrNone)&&(r!=KErrAlreadyExists))
+		{
+		gTest.Printf(_L("User::LoadPhysicalDevice error %d\n"),r);
+		}
+	else
+		{
+		// Test attempted load of LDD
+		gTest.Next(_L("**Load LDD\n"));
+		r=User::LoadLogicalDevice(LDD_NAME);
+		if((r!=KErrNone)&&(r!=KErrAlreadyExists))
+			gTest.Printf(_L("User::LoadLogicalDevice error - expected %d, got %d\n"),KErrAlreadyExists,r);
+		}
+    if((r==KErrNone)||(r==KErrAlreadyExists))
+		{
+		r = KErrNone; // Re-initialise in case set to KErrAlreadyExists
+		//
+		// Need a channel open for the following tests
+		gTest.Next(_L("**OpenAndRegisterChannel\n"));
+		r=OpenAndRegisterChannel();
+		if (r==KErrNone)
+			{
+			// Get the version of the ResourceController
+			TUint version;
+			if((r=gChannel.GetResourceControllerVersion(version))!=KErrNone)
+				{
+				gTest.Printf(_L("TestTransientHandling: GetResourceControllerVersion returned %d\n"),r);
+				return r;
+				}
+			gTest.Printf(_L("TestTransientHandling: ResourceController version =0x%x\n"),version);
+			}
+		if (r==KErrNone)
+			{
+			gTest.Next(_L("**TestThreadExclusiveAccess\n"));
+			r=TestThreadExclusiveAccess();
+			}
+		if (r==KErrNone)
+			{
+			gTest.Next(_L("**TestGetClientGetResourceInfo - initial state\n"));
+			r=TestGetClientGetResourceInfo();
+			}
+		if (r==KErrNone)
+			{
+			gTest.Next(_L("**TestGetSetResourceStateOps\n"));
+			r=TestGetSetResourceStateOps();
+			}
+		if (r==KErrNone)
+			{
+			gTest.Next(_L("**TestGetClientGetResourceInfo - after changing stateof Async resource\n"));
+			r=TestGetClientGetResourceInfo();
+			}
+		if (r==KErrNone)
+			{
+			gTest.Next(_L("**TestGetSetResourceStateQuota\n"));
+			r=TestGetSetResourceStateQuota();
+			}
+		if (r==KErrNone)
+			{
+			gTest.Next(_L("**TestNotificationOps\n"));
+			r=TestNotificationOps();
+			}
+		if (r==KErrNone)
+			{
+			gTest.Next(_L("**TestNotificationQuota\n"));
+			r=TestNotificationQuota();
+			}
+		if (r==KErrNone)
+			{
+			// Should be no change since last invocation (assuming that
+			// no clients other than those in this test)
+			gTest.Next(_L("**TestGetClientGetResourceInfo - last invocation\n"));
+			r=TestGetClientGetResourceInfo();
+			}
+		if (r==KErrNone)
+			{
+			gTest.Next(_L("**TestAdditionalThread\n"));
+			r=TestAdditionalThread();
+			}
+		if (r==KErrNone)
+			{
+			gTest.Next(_L("**TestTransientHandling\n"));
+			r=TestTransientHandling();
+			}
+		}
+	gChannel.Close();
+
+    User::FreeLogicalDevice(KLddRootName);
+    User::FreePhysicalDevice(PDD_NAME);	
+	User::After(100000);	// Allow idle thread to run for driver unloading
 
 	gTest.End();
-	return KErrNone;
-	}
-
-
+	return r;
+    }
+