os/kernelhwsrv/kerneltest/e32test/resmanus/t_resmanus.cpp
author sl
Tue, 10 Jun 2014 14:32:02 +0200
changeset 1 260cb5ec6c19
permissions -rw-r--r--
Update contrib.
     1 // Copyright (c) 2007-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 //
    15 
    16 #include <e32test.h>
    17 #include <e32def.h>
    18 #include <e32def_private.h>
    19 
    20 #include <d32resmanus.h>
    21 
    22 #ifdef PRM_ENABLE_EXTENDED_VERSION
    23 #define LDD_NAME _L("resourcecontrollerextended.ldd")
    24 #else
    25 #define LDD_NAME _L("resourcecontrol.ldd")
    26 #endif
    27 
    28 #ifdef PRM_ENABLE_EXTENDED_VERSION
    29 #define PDD_NAME _L("resourcecontrollerextended.pdd")
    30 #else
    31 #define PDD_NAME _L("resourcecontroller.pdd")
    32 #endif
    33 
    34 //#define PIRATE_THREAD_TESTS
    35 
    36 _LIT(testableResourceName,"SymbianSimulResource");
    37 
    38 #ifdef RESMANUS_KERN
    39 _LIT(testName,"t_resmanuskern");
    40 #else
    41 _LIT(testName,"t_resmanus");
    42 #endif
    43 
    44 TBuf<16> gTestName(testName);
    45 
    46 GLDEF_D RTest gTest(testName);
    47 GLDEF_D RBusDevResManUs gChannel;
    48 
    49 TUint8 KNoOfGetStateRequests = 5;
    50 TUint8 KNoOfSetStateRequests = 4;
    51 TUint8 KNoOfNotifyRequests = 7;
    52 #define MAX_NUM_REQUESTS 8		// Must be (at least) one greater than the largest of 
    53 								// KNoOfGetStateRequests, KNoOfSetStateRequests, KNoOfNotifyRequests
    54 #ifdef _DEBUG
    55 TUint gLongLatencyResource;
    56 TBool gHaveAsyncRes = EFalse;
    57 TInt gAsyncResStateDelta = 0;
    58 
    59 TUint gSharedResource;
    60 TBool gHaveSharedRes = EFalse;
    61 TInt gSharedResStateDelta = 0;
    62 #else
    63 // The UREL version of the driver will not implement the arrays and functionality required
    64 // to determine the async and shared resources to use at runtime. The values provided here
    65 // have been pre-determined to operate successfully with the simulated PSL.
    66 //
    67 TUint gLongLatencyResource = 6;
    68 TBool gHaveAsyncRes = ETrue;
    69 TInt gAsyncResStateDelta = -1;
    70 
    71 TUint gSharedResource = 12;
    72 TBool gHaveSharedRes = ETrue;
    73 TInt gSharedResStateDelta = -1;
    74 #endif
    75 
    76 TBool gUseCached = EFalse;
    77 
    78 LOCAL_C TInt OpenChannel(TDesC16& aName, RBusDevResManUs& aChannel)
    79 	{
    80 	TInt r = KErrNone;
    81 	// API accepts 8-bit descriptors, only - so convert name accordingly
    82 	TBuf8<MAX_RESOURCE_NAME_LENGTH+1>EightBitName;
    83 	EightBitName.Copy(aName);
    84     r=(aChannel.Open(EightBitName));
    85     if (r!=KErrNone)
    86 		gTest.Printf(_L("OpenChannel: Handle for channel %S error code =0x%x\n"),&aName,r);
    87 	else
    88 		gTest.Printf(_L("OpenChannel: Handle for channel %S =0x%x\n"),&aName,aChannel.Handle());
    89 	return r;
    90 	}
    91 
    92 LOCAL_C TInt HelperResources()
    93 //
    94 // Helper method to support OpenAndRegisterChannel
    95 // Invokes GetNoOfResources, GetAllResourcesInfo and GetResourceIdByName
    96 //
    97 	{
    98 	TInt r = KErrNone;
    99 
   100 	__KHEAP_MARK;
   101 
   102 	// Check what resources are available
   103     gTest.Printf(_L("**Test GetNoOfResources\n"));
   104 	TUint numResources=0;
   105 	if((r=gChannel.GetNoOfResources(numResources))!=KErrNone)
   106 		{
   107 		gTest.Printf(_L("GetNoOfResources for test channel returned %d\n"),r);
   108 		return r;
   109 		}
   110 	gTest.Printf(_L("Number of resources = %d (=0x%x)\n"),numResources,numResources);
   111 
   112 	// Read the resource information
   113     gTest.Printf(_L("**Test GetAllResourcesInfo\n"));
   114 
   115 	// To support the GetAllResourcesInfo testing, instantiate TResourceInfoBuf objects
   116 	// and reference via an RSimplePointerArray
   117 	TUint bufSize = numResources;
   118 	RSimplePointerArray<TResourceInfoBuf> infoPtrs(bufSize);
   119 	for(TUint i=0;i<bufSize;i++)
   120 		{
   121 		TResourceInfoBuf *info = new TResourceInfoBuf();
   122 		if((r=infoPtrs.Insert(info, i))!=KErrNone)
   123 			{
   124 			gTest.Printf(_L("GetAllResourcesInfo infoPtrs.Insert at index %d returned %d\n"),i,r);
   125 			}
   126 		}
   127 	TUint updateNumResources=numResources;
   128 	if((r=gChannel.GetAllResourcesInfo(&infoPtrs,updateNumResources))!=KErrNone)
   129 		{
   130 		gTest.Printf(_L("GetAllResourcesInfo for channel returned %d\n"),r);
   131 		return r;
   132 		}
   133 	gTest.Printf(_L("Updated number of resources = %d\n"),updateNumResources);
   134 
   135 #ifdef _DEBUG
   136 	// Print resource names
   137 	{
   138 	TBuf16<MAX_RESOURCE_NAME_LENGTH+1>name;
   139 	for(TUint i=0; i<updateNumResources; i++)
   140 		{
   141 		TResourceInfoBuf* currRes = infoPtrs[i];
   142 		name.Copy((*currRes)().iName);
   143 		name.PtrZ();
   144 		gTest.Printf(_L("Resource %d name = %S \n"),i,&name);
   145 		};
   146 	}
   147 #endif
   148 
   149 	// Select a resource to use, then pass its name to GetResourceIdByName
   150 	// to check that the corresponding resource ID is acquired.
   151 	TResourceInfo currRes = (*infoPtrs[0])(); 
   152 	if(updateNumResources>1)
   153 		currRes=(*infoPtrs[1])();// First resource may be a dummy
   154 	TUint resourceId;
   155 	gTest.Printf(_L("Invoking GetResourceIdByName for last resource name extracted \n"));
   156 	if((r=gChannel.GetResourceIdByName(currRes.iName, resourceId))!=KErrNone)
   157 		{
   158 		gTest.Printf(_L("GetResourceIdByName for channel returned %d \n"),r);
   159 		return r;
   160 		}
   161 	gTest.Printf(_L("GetResourceIdByName gave ID = %d\n"),resourceId);
   162 
   163 	infoPtrs.Close();
   164 
   165 	__KHEAP_MARKEND;
   166 
   167 	return r;
   168 	}
   169 
   170 LOCAL_C TInt CheckForSimulatedResources()
   171 //
   172 // Get the name of the first resource - if it does not match the expected name
   173 // then the testing must not proceed, so return the relevant error code
   174 //
   175 	{
   176     TInt r = KErrNone;
   177 	TResourceInfoBuf buffer;
   178 	if((r=gChannel.GetResourceInfo(1, &buffer))!=KErrNone)	// first resource ID = 1
   179 		{
   180 		gTest.Printf(_L("CheckForSimulatedResources, candidate get resource info returned %d\n"),r);
   181 		return r;
   182 		}
   183 	// Check the name of the resource
   184 	TBuf16<MAX_RESOURCE_NAME_LENGTH+1>name;
   185 	name.Copy(buffer().iName);
   186 	name.PtrZ();
   187 	if((r=name.Compare(testableResourceName))!=KErrNone)
   188 		{
   189 		gTest.Printf(_L("Resource name = %S, require %S \n"),&name,&testableResourceName);
   190 		r=KErrNotSupported;
   191 		}
   192 	return r;
   193 	}
   194 
   195 //----------------------------------------------------------------------------------------------
   196 //! @SYMTestCaseID      KBASE-T_RESMANUS-0607
   197 //! @SYMTestType        UT
   198 //! @SYMPREQ            PREQ1398
   199 //! @SYMTestCaseDesc    This test case tests channel opening and initialisation APIs.
   200 //! @SYMTestActions     0) Call Open API with a valid name.
   201 //! 
   202 //!						1) Call Open API for two more channels 
   203 //!						(to demonstrate multiple clients (channels) can be supported concurrently).
   204 //! 
   205 //!						2) Call Open with an oversized name. 
   206 //! 
   207 //!						3) Call GetNoOfResources API
   208 //! 
   209 //!						4) Call GetAllResourcesInfo API
   210 //! 
   211 //!						5) Call GetResourceIdByName API for last of resource names gathered
   212 //!						in previous step
   213 //! 
   214 //!						6) Call Initialise API on the channel originally created, with non-zero arguments.
   215 //!
   216 //! @SYMTestExpectedResults 0) API should return with KErrNone, exits otherwise.
   217 //!						1) API should return with KErrNone, exits otherwise.
   218 //!						2) API should return with KErrBadName, exits otherwise.
   219 //!						3) API should return with KErrNone, exits otherwise.
   220 //!						4) API should return with KErrNone, exits otherwise.
   221 //!						5) API should return with KErrNone, exits otherwise.
   222 //!						6) API should return with KErrNone, exits otherwise.
   223 //!
   224 //! @SYMTestPriority        High
   225 //! @SYMTestStatus          Implemented
   226 //----------------------------------------------------------------------------------------------
   227 LOCAL_C TInt OpenAndRegisterChannel()
   228 //
   229 // Test Open and Initialise functionality
   230 // Also invokes Resource inspection methods via HelperResource
   231 //
   232     {
   233     TInt r;
   234 
   235 	if((r=OpenChannel(gTestName, gChannel))!=KErrNone)
   236 		return r;
   237 
   238 	// Check that the simulated resources required to support this testing are present
   239 	// If not, close the channel and return the propagated error code.
   240 	if((r=CheckForSimulatedResources())!=KErrNone)
   241 		{
   242 		gChannel.Close();
   243 		return r;
   244 		}
   245 
   246 	__KHEAP_MARK; // gTestName will remain open (allocated) when heap is checked
   247 
   248 	// Open a couple of additional channels to prove that more than one
   249 	// can exist
   250 	_LIT(tempStr1,"temp1");
   251 	TBufC<16> tempName1(tempStr1);
   252 	_LIT(tempStr2,"temp2");
   253 	TBufC<16> tempName2(tempStr2);
   254 
   255 	RBusDevResManUs channelTwo;
   256 	RBusDevResManUs channelThree;
   257 
   258 	if((r=OpenChannel(tempName1, channelTwo))!=KErrNone)
   259 		return r;
   260 	if((r=OpenChannel(tempName2, channelThree))!=KErrNone)
   261 		return r;
   262 
   263 	// The following test requires manual enabling in resource controller of macro
   264 	// DEBUG_VERSION - this is not done by default, so test is deactivated here.
   265 	//
   266 #if 0
   267 	// Test rejection if try a name already in use
   268 	//
   269 	// (For UREL builds, duplicate names are allowed; but
   270 	//  for UDEB builds, they are monitored and rejected)
   271 	//
   272 	RBusDevResManUs channelSameName;
   273 	r=OpenChannel(tempName1, channelSameName);
   274 	channelSameName.Close(); // Channel not used after here
   275     if (r==KErrNone)
   276 		{
   277 		gTest.Printf(_L("Error: Handle for re-used name channel =0x%x\n"),channelSameName.Handle());
   278 		return KErrGeneral;
   279 		}
   280 	else if(r!=KErrCouldNotConnect)
   281 		{
   282 		gTest.Printf(_L("Error: re-used name gave unexpected error code =0x%x\n"),r);
   283 		return r;
   284 		}
   285 	else // if(r==KErrCouldNotConnect)
   286 		{
   287 		gTest.Printf(_L("Re-used channel name rejected with correct error code\n"));
   288 		}
   289 #endif // if 0
   290 
   291 	// Test oversized name rejection
   292 	_LIT(longStr,"1abcdefghijklmnopqrstuvwxyz2abcdefghijklmnopqrstuvwxyz3abcdefghijklmnopqrstuvwxyz4abcdefghijklmnopqrstuvwxyz5abcdefghijklmnopqrstuvwxyz6abcdefghijklmnopqrstuvwxyz7abcdefghijklmnopqrstuvwxyz8abcdefghijklmnopqrstuvwxyz9abcdefghijklmnopqrstuvwxyz10abcdefghijklmnopqrstuvwxyz");
   293 	TBufC<271> longName(longStr);
   294 
   295 	// API accepts 8-bit descriptors for names, only
   296 	TBuf8<271>longName_8Bit;
   297 	longName_8Bit.Copy(longName);
   298 
   299 	RBusDevResManUs channelLong;
   300     r=(channelLong.Open(longName_8Bit));
   301 	channelLong.Close(); // Channel not used after here
   302     if (r==KErrNone)
   303 		{
   304 		gTest.Printf(_L("Error: Handle for oversize name channel =0x%x\n"),channelLong.Handle());
   305 		return KErrGeneral;
   306 		}
   307 	else if(r!=KErrBadName)
   308 		{
   309 		gTest.Printf(_L("Error: oversized name gave unexpected error code =0x%x\n"),r);
   310 		return r;
   311 		}
   312 	else // if(r==KErrBadName)
   313 		{
   314 		gTest.Printf(_L("Oversized name for channel rejected with correct error code\n"));
   315 		}
   316 
   317 	// Invokes GetNoOfResources, GetAllResourcesInfo and GetResourceIdByName
   318 	if((r=HelperResources())!=KErrNone)
   319 		return r;
   320 
   321 	// Close the temporary channels
   322 	// Do this before  channel registration to enable valid check of kernel heap
   323 	channelTwo.Close();
   324 	channelThree.Close();
   325 
   326 	__KHEAP_MARKEND;
   327 
   328 	// Channel registration
   329     gTest.Printf(_L("Invoking Initialise with values 0x%x, 0x%x, 0x%x\n"),KNoOfGetStateRequests,KNoOfSetStateRequests,KNoOfNotifyRequests);
   330     if ((r=gChannel.Initialise(KNoOfGetStateRequests,KNoOfSetStateRequests,KNoOfNotifyRequests))!=KErrNone)
   331 		{
   332 		gTest.Printf(_L("Initialise for channel returned %d\n"),r);
   333 		return r;
   334 		}
   335 
   336     return KErrNone;
   337     }
   338 
   339 
   340 LOCAL_C TInt HelperClients()
   341 //
   342 // Helper method to support TestGetClientGetResourceInfo
   343 // Invokes GetNoOfClients and GetNamesAllClients
   344 //
   345 	{
   346 	__KHEAP_MARK;
   347 
   348 	TInt r = KErrNone;
   349 	TUint numClients = 0;
   350 	TUint numAllClients = 0;
   351 	//
   352 	// GetNoOfClients - with aIncludeKern=EFalse
   353 	//
   354 	if((r=gChannel.GetNoOfClients(numClients, EFalse)) != KErrNone)
   355 		{
   356 		gTest.Printf(_L("GetNoOfClients (aIncludeKern==EFalse) returned %d\n"),r);
   357 		return r;
   358 		}
   359 	gTest.Printf(_L("GetNoOfClients (aIncludeKern==EFalse) gave 0x%x clients\n"),numClients);
   360 
   361 	//
   362 	// GetNoOfClients - with aIncludeKern=ETrue
   363 	//
   364 	r=gChannel.GetNoOfClients(numAllClients, ETrue);
   365 #ifdef RESMANUS_KERN
   366 	if(r==KErrNone)
   367 		gTest.Printf(_L("GetNoOfClients (aIncludeKern==ETrue) returned KErrNone\n"));
   368 #else
   369 	if(r==KErrPermissionDenied)
   370 		gTest.Printf(_L("GetNoOfClients (aIncludeKern==ETrue) returned KErrPermissionDenied\n"));
   371 #endif
   372 	else
   373 		{
   374 		gTest.Printf(_L("GetNoOfClients (aIncludeKern==ETrue) returned %d"),r);
   375 		return KErrGeneral;
   376 		}
   377 
   378 	// To support the GetNamesAllClients testing, instantiate TClientName objects
   379 	// and reference via an RSimplePointerArray
   380 	TUint bufSize = (numAllClients>numClients)?numAllClients:numClients;
   381 	RSimplePointerArray<TClientName> infoPtrs(bufSize);
   382 	for(TUint i=0;i<bufSize;i++)
   383 		{
   384 		TClientName *info = new TClientName();
   385 		if((r=infoPtrs.Insert(info, i))!=KErrNone)
   386 			{
   387 			gTest.Printf(_L("GetNamesAllClients infoPtrs.Insert at index %d returned %d\n"),i,r);
   388 			}
   389 		}
   390 
   391 	//
   392 	// GetNamesAllClients - with aIncludeKern=EFalse
   393 	//
   394 	if((r=gChannel.GetNamesAllClients(&infoPtrs, numClients, EFalse)) != KErrNone)
   395 		{
   396 		gTest.Printf(_L("GetNamesAllClients (aIncludeKern==EFalse) returned %d\n"),r);
   397 		return r;
   398 		}
   399 #ifdef _DEBUG
   400 	else
   401 		{
   402 		gTest.Printf(_L("GetNamesAllClients (aIncludeKern==EFalse) returned KErrNone, names follow\n"));
   403 		for(TUint i=0;i<numClients;i++)
   404 			{
   405 			TClientName *currName = infoPtrs[i];
   406 			TBuf16<sizeof(TClientName)> name;
   407 			name.Copy(*currName);
   408 			gTest.Printf(_L("Client name %d = %S\n"),i,&name);
   409 			}
   410 		}
   411 #endif
   412 
   413 	//
   414 	// GetNamesAllClients - with aIncludeKern=ETrue
   415 	//
   416 #ifdef RESMANUS_KERN
   417 	if((r=gChannel.GetNamesAllClients(&infoPtrs, numAllClients, ETrue)) != KErrNone)
   418 		{
   419 		gTest.Printf(_L("GetNamesAllClients (aIncludeKern==ETrue) returned %d\n"),r);
   420 		return r;
   421 		}
   422 #ifdef _DEBUG
   423 	else
   424 		{
   425 		gTest.Printf(_L("GetNamesAllClients (aIncludeKern==ETrue) returned KErrNone, names follow\n"));
   426 		for(TUint i=0;i<numAllClients;i++)
   427 			{
   428 			TClientName *currName = infoPtrs[i];
   429 			TBuf16<sizeof(TClientName)> name;
   430 			name.Copy(*currName);
   431 			gTest.Printf(_L("Client name %d = %S\n"),i,&name);
   432 			}
   433 		}
   434 #endif
   435 #else
   436 	if((r=gChannel.GetNamesAllClients(&infoPtrs, numClients, ETrue)) == KErrPermissionDenied)
   437 		{
   438 		gTest.Printf(_L("GetNamesAllClients (aIncludeKern==ETrue) returned KErrPermissionDenied\n"));
   439 		r=KErrNone; // Ensure misleading status is not returned
   440 		}
   441 	else
   442 		{
   443 		gTest.Printf(_L("GetNamesAllClients (aIncludeKern==ETrue) returned %d"),r);
   444 		return r;
   445 		}
   446 #endif
   447 
   448 	infoPtrs.Close();
   449 	__KHEAP_MARKEND;
   450 
   451 	return r;
   452 	}
   453 
   454 LOCAL_C TInt HelperClientsUsingResource(TUint aResourceId)
   455 //
   456 // Helper method to support TestGetClientGetResourceInfo
   457 // Invokes GetNumClientsUsingResource and GetInfoOnClientsUsingResource
   458 //
   459 	{
   460 	__KHEAP_MARK;
   461 
   462 	TInt r = KErrNone;
   463 	//
   464 	// GetNumClientsUsingResource - with aIncludeKern=ETrue
   465 	//
   466 	TUint resourceAllClients = 0;
   467 	if((r=gChannel.GetNumClientsUsingResource(aResourceId, resourceAllClients, ETrue)) == KErrPermissionDenied)
   468 		{
   469 		gTest.Printf(_L("GetNumClientsUsingResource (aIncludeKern==ETrue) returned KErrPermissionDenied\n"));
   470 #ifdef RESMANUS_KERN
   471 		return r;
   472 		}
   473 	else
   474 		{
   475 		if(r!=KErrNone)
   476 			{
   477 			gTest.Printf(_L("GetNumClientsUsingResource (aIncludeKern==ETrue) returned %d\n"),r);
   478 			return r;
   479 			}
   480 		else
   481 			gTest.Printf(_L("GetNumClientsUsingResource (aIncludeKern==ETrue) reported 0x%x clients\n"),resourceAllClients);
   482 		}
   483 #else
   484 		}
   485 	else
   486 		{
   487 		gTest.Printf(_L("GetNumClientsUsingResource (aIncludeKern==ETrue) returned %d\n"),r);
   488 		return r;
   489 		}
   490 #endif
   491 	//
   492 	// GetNumClientsUsingResource - with aIncludeKern=EFalse
   493 	//
   494 	TUint resourceClients = 0;
   495 	if((r=gChannel.GetNumClientsUsingResource(aResourceId, resourceClients, EFalse)) != KErrNone)
   496 		{
   497 		// If there are no clients that have requested a level then the Resource Controller will
   498 		// the client ID as a bad argument
   499 		if(!((resourceClients==0)&&(r==KErrArgument)))
   500 			{
   501 			gTest.Printf(_L("GetNumClientsUsingResource (aIncludeKern==EFalse) returned %d\n"),r);
   502 			return r;
   503 			}
   504 		else
   505 			r=KErrNone;	// Ensure expected error is not misinterpeted
   506 		}
   507 	else
   508 		gTest.Printf(_L("GetNumClientsUsingResource (aIncludeKern==EFalse) reported 0x%x clients\n"),resourceClients);
   509 		
   510 	// To support the GetInfoOnClientsUsingResource testing, instantiate TClientInfoBuf objects
   511 	// and reference via an RSimplePointerArray
   512 	TUint bufSize = (resourceAllClients>resourceClients)?resourceAllClients:resourceClients;
   513 	if(bufSize>0)
   514 		{
   515 		RSimplePointerArray<TClientInfoBuf> infoPtrs(bufSize);
   516 		for(TUint i=0;i<bufSize;i++)
   517 			{
   518 			TClientInfoBuf *info = new TClientInfoBuf();
   519 			if((r=infoPtrs.Insert(info, i))!=KErrNone)
   520 				{
   521 				gTest.Printf(_L("GetInfoOnClientsUsingResource infoPtrs.Insert at index %d returned %d\n"),i,r);
   522 				}
   523 			}
   524 
   525 		//
   526 		// GetInfoOnClientsUsingResource - with aIncludeKern=EFalse
   527 		//
   528 		if((r=gChannel.GetInfoOnClientsUsingResource(aResourceId, resourceClients, &infoPtrs, EFalse)) != KErrNone)
   529 			{
   530 			// If there are no clients that have requested a level then the resource will not
   531 			// have been found
   532 			if(!((resourceClients==0)&&(r==KErrNotFound)))
   533 				{
   534 				gTest.Printf(_L("GetInfoOnClientsUsingResource (aIncludeKern==EFalse) returned %d\n"),r);
   535 				return r;
   536 				}
   537 			}
   538 #ifdef _DEBUG
   539 		else
   540 			{
   541 			gTest.Printf(_L("GetInfoOnClientsUsingResource (aIncludeKern==EFalse) returned KErrNone, info follows\n"));
   542 			for(TUint i=0;i<resourceClients;i++)
   543 				{
   544 				TClientInfoBuf* currInfoBuf = infoPtrs[i];
   545 				TClientInfo currInfo=(*currInfoBuf)();
   546 				TBuf16<sizeof(TClientName)> name;
   547 				name.Copy(currInfo.iName);
   548 				gTest.Printf(_L("Client name %d = %S, ID=0x%x\n"),i,&name,currInfo.iId);
   549 				}
   550 			}
   551 #endif
   552 		//
   553 		// GetInfoOnClientsUsingResource - with aIncludeKern=ETrue
   554 		//
   555 		r=gChannel.GetInfoOnClientsUsingResource(aResourceId, resourceAllClients, &infoPtrs, ETrue);
   556 			{
   557 #ifdef RESMANUS_KERN
   558 			if(r != KErrNone)
   559 				{
   560 				// If there are no clients that have requested a level then the Resource Controller
   561 				// will report a request for information on 0 clients as a bad argument
   562 				if(!((resourceClients==0)&&(r==KErrArgument)))
   563 					{
   564 					gTest.Printf(_L("GetInfoOnClientsUsingResource (aIncludeKern==ETrue) returned %d\n"),r);
   565 					return r;
   566 					}
   567 				else
   568 					r=KErrNone; // Ensure misleading result is not returned
   569 				}
   570 #ifdef _DEBUG
   571 			else
   572 				{
   573 				gTest.Printf(_L("GetInfoOnClientsUsingResource (aIncludeKern==ETrue) returned KErrNone, info follows\n"));
   574 				for(TUint i=0;i<resourceClients;i++)
   575 					{
   576 					TClientInfoBuf* currInfoBuf = infoPtrs[i];
   577 					TClientInfo currInfo=(*currInfoBuf)();
   578 					TBuf16<sizeof(TClientName)> name;
   579 					name.Copy(currInfo.iName);
   580 					gTest.Printf(_L("Client name %d = %S, ID=0x%x\n"),i,&name,currInfo.iId);
   581 					}
   582 				}
   583 #endif
   584 #else
   585 			if(r == KErrNone)
   586 				{
   587 				gTest.Printf(_L("GetInfoOnClientsUsingResource (aIncludeKern==ETrue) returned KErrNone"));
   588 				return KErrGeneral;
   589 				}
   590 			else if(r==KErrPermissionDenied)
   591 				{
   592 				gTest.Printf(_L("GetInfoOnClientsUsingResource (aIncludeKern==ETrue) returned KErrPermissionDenied\n"));
   593 				r=KErrNone; // Ensure that misleading result is not propagated
   594 				}
   595 			else
   596 				{
   597 				gTest.Printf(_L("GetInfoOnClientsUsingResource (aIncludeKern==ETrue) returned %d\n"),r);
   598 				// If there are no clients that have requested a level then the Resource Controller
   599 				// will report a request for information on 0 clients as a bad argument
   600 				if(!((resourceClients==0)&&(r==KErrArgument)))
   601 					return r;
   602 				}
   603 #endif
   604 			}
   605 		}
   606 
   607 	__KHEAP_MARKEND;
   608 
   609 	return r;
   610 	}
   611 
   612 
   613 
   614 LOCAL_C TInt HelperResourcesInUseByClient()
   615 //
   616 // Helper method to supportTestGetClientGetResourceInfo
   617 // Invokes GetNumResourcesInUseByClient and GetInfoOnResourcesInUseByClient
   618 //
   619 	{
   620 	__KHEAP_MARK;
   621 
   622 	TInt r = KErrNone;
   623 	//
   624 	// GetNumResourcesInUseByClient
   625 	//
   626 	// API accepts 8-bit descriptors, only - so convert name accordingly
   627 	TBuf8<MAX_RESOURCE_NAME_LENGTH+1>name8Bit;
   628 	name8Bit.Copy(gTestName);
   629 	TClientName* clientName = (TClientName*)&name8Bit;
   630 #if _DEBUG
   631 	TBuf <MAX_CLIENT_NAME_LENGTH> clientName16Bit;
   632 	clientName16Bit.Copy(*clientName);
   633 	clientName16Bit.SetLength(clientName->Length());
   634 	gTest.Printf(_L("Invoking GetNumResourcesInUseByClient with %S (expect KErrPermissionDenied if no levels requested yet)\n"),&clientName16Bit);
   635 #endif
   636 	TUint numResourcesForClient;
   637 	if((r=gChannel.GetNumResourcesInUseByClient(*clientName, numResourcesForClient)) != KErrNone)
   638 		{
   639 		gTest.Printf(_L("GetNumResourcesInUseByClient returned %d\n"),r);
   640 		return r;
   641 		}
   642 	gTest.Printf(_L("GetNumResourcesInUseByClient gave number of resources = %d\n"),numResourcesForClient);
   643 	//
   644 	// In addition, check response when the name of an unknown client is passed
   645 	//
   646 	// Negative test - ensure that an unknown client name fails
   647 	_LIT(dumName,"DoesNotExist");
   648 	TBuf<16> dumNameBuf(dumName);
   649 	TBuf8<MAX_RESOURCE_NAME_LENGTH+1>dumName8Bit;
   650 	dumName8Bit.Copy(dumNameBuf);
   651 	TClientName* dumClientName = (TClientName*)&dumName8Bit;
   652 #if _DEBUG
   653 	gTest.Printf(_L("Invoking GetNumResourcesInUseByClient with %S\n"),&dumNameBuf);
   654 #endif
   655 	TUint numResForDumClient;
   656 	if((r=gChannel.GetNumResourcesInUseByClient(*dumClientName, numResForDumClient)) != KErrNotFound)
   657 		{
   658 		gTest.Printf(_L("GetNumResourcesInUseByClient returned %d\n"),r);
   659 		if(r==KErrNone)
   660 			r=KErrGeneral;
   661 		return r;
   662 		}
   663 	gTest.Printf(_L("GetNumResourcesInUseByClient returned %d\n"),r);
   664 	r=KErrNone;	// Ensure misleading error code is not propagated
   665 
   666 	//
   667 	// GetInfoOnResourcesInUseByClient
   668 	//
   669 	// If the (TUint) number of resources in use by the client is zero skip the attempt to read the resource information
   670 	TUint updatedNumResourcesForClient = numResourcesForClient;
   671 	if(numResourcesForClient!=0)
   672 		{
   673 		TUint bufSize = numResourcesForClient;
   674 		RSimplePointerArray<TResourceInfoBuf> infoPtrs(bufSize);
   675 		for(TUint i=0;i<bufSize;i++)
   676 			{
   677 			TResourceInfoBuf *info = new TResourceInfoBuf();
   678 			if((r=infoPtrs.Insert(info, i))!=KErrNone)
   679 				{
   680 				gTest.Printf(_L("GetInfoOnResourcesInUseByClient infoPtrs.Insert at index %d returned %d\n"),i,r);
   681 				}
   682 			}
   683 
   684 		if((r=gChannel.GetInfoOnResourcesInUseByClient(*clientName, updatedNumResourcesForClient, &infoPtrs)) != KErrNone)
   685 			{
   686 			gTest.Printf(_L("GetInfoOnResourcesInUseByClient returned %d\n"),r);
   687 			// If there are no clients that have requested a level then the Resource Controller
   688 			// will report a request for information on 0 clients as a bad argument
   689 			if(!((updatedNumResourcesForClient==0)&&(r==KErrArgument)))
   690 				return r;
   691 			else
   692 				r=KErrNone; // Ensure misleading value is not returned by this function
   693 			}
   694 		else
   695 			{
   696 			gTest.Printf(_L("GetInfoOnResourcesInUseByClient gave updated number of resources %d\n"),updatedNumResourcesForClient);
   697 #ifdef _DEBUG
   698 			// Print resource names
   699 			TBuf16<MAX_RESOURCE_NAME_LENGTH+1>name;
   700 			for(TUint i=0; i<updatedNumResourcesForClient; i++)
   701 				{
   702 				TResourceInfoBuf* currRes = infoPtrs[i];
   703 				name.Copy((*currRes)().iName);
   704 				name.PtrZ();
   705 				gTest.Printf(_L("Resource %d name = %S \n"),i,&name);
   706 				};
   707 #endif
   708 			}
   709 		//
   710 		// In addition, check response when the name of an unknown client is passed
   711 		//
   712 		// Negative test - ensure that an unknown client name fails
   713 		r=gChannel.GetInfoOnResourcesInUseByClient(*dumClientName, updatedNumResourcesForClient, &infoPtrs);
   714 		gTest.Printf(_L("GetInfoOnResourcesInUseByClient for dummy client returned %d\n"),r);
   715 		if(r==KErrNone)
   716 			return KErrGeneral;
   717 		else if(r!=KErrNotFound)
   718 			return r;
   719 		// Ensure that misleading information is not returned to the calling function
   720 		r=KErrNone;
   721 
   722 		infoPtrs.Close();
   723 		}
   724 	
   725 	__KHEAP_MARKEND;
   726 
   727 	return r;
   728 	}
   729 
   730 
   731 LOCAL_C TInt HelperGetClientResourceInfo()
   732 //
   733 // Test methods to access information about clients and resources
   734 //
   735 	{
   736 	__KHEAP_MARK;
   737 
   738 	TInt r = KErrNone;
   739 	// Invokes GetNoOfClients and GetNamesAllClients
   740 	if((r=HelperClients())!=KErrNone)
   741 		return r;
   742 
   743 	// Invokes GetNumClientsUsingResource and GetInfoOnClientsUsingResource
   744 	//
   745 	// First invoke on the Async resource
   746 	TUint resourceId = 1;	// Arbitrary
   747 	if(gHaveAsyncRes)
   748 		{
   749 		resourceId = gLongLatencyResource;
   750 		gTest.Printf(_L("Invoking HelperClientsUsinResource for Async resource ID %d\n"),resourceId);
   751 		}
   752 	else
   753 		{
   754 		gTest.Printf(_L("Invoking HelperClientsUsinResource for default resource ID %d (Async resource not yet accessed)\n"),resourceId);
   755 		}
   756 	if((r=HelperClientsUsingResource(resourceId))!=KErrNone)
   757 		return r;
   758 	//
   759 	// Second invoke on the Shared resource - skip if not available
   760 	if(gHaveSharedRes)
   761 		{
   762 		resourceId = gSharedResource;
   763 		gTest.Printf(_L("Invoking HelperClientsUsinResource for Shared resource ID %d\n"),resourceId);
   764 		if((r=HelperClientsUsingResource(resourceId))!=KErrNone)
   765 			return r;
   766 		}
   767 
   768 	// Invokes GetNumResourcesInUseByClient and GetInfoOnResourcesInUseByClient
   769 	if((r=HelperResourcesInUseByClient())!=KErrNone)
   770 		return r;
   771 
   772 	__KHEAP_MARKEND;
   773 
   774 	return r;
   775 	}
   776 
   777 #ifdef _DEBUG
   778 LOCAL_C TInt SetAsyncResource()
   779 //
   780 // Support function for tests of asynchronous API methods
   781 //
   782 	{
   783 	if(!gHaveAsyncRes)
   784 		{
   785 		gTest.Printf(_L("SetAsyncResource, Find Async resource to use\n"));
   786 		TRequestStatus status;
   787 		TBool cached = gUseCached;
   788 		TInt readValue = 0;
   789 		TInt levelOwnerId = 0;
   790 		TUint numPotentialResources;
   791 		TUint index=0;
   792 		TInt r=gChannel.GetNumCandidateAsyncResources(numPotentialResources);
   793 		if(r!=KErrNone)
   794 			{
   795 			gTest.Printf(_L("SetAsyncResource, GetNumCandidateAsyncResources returned %d\n"),r);
   796 			return r;
   797 			}
   798 		gTest.Printf(_L("SetAsyncResource, GetNumCandidateAsyncResources found %d resources\n"),numPotentialResources);
   799 		while((numPotentialResources>0) && !gHaveAsyncRes)
   800 			{
   801 			TUint tryResourceId=0;
   802 			r=gChannel.GetCandidateAsyncResourceId(index,tryResourceId);
   803 			if(r!=KErrNone)
   804 				{
   805 				gTest.Printf(_L("SetAsyncResource, GetCandidateAsyncResourceId returned %d\n"),r);
   806 				break;
   807 				}
   808 			gTest.Printf(_L("SetAsyncResource, GetNumCandidateAsyncResources index %d, resource ID %d\n"),index,tryResourceId);
   809 			// For the candidate resource to be usable, we need its current state
   810 			// to be sufficiently less the maximum for positive sense (or sufficiently
   811 			// more than the greater than the minimum for negative sense - but the current 
   812 			// version of the code only considers positive sense).
   813 			gChannel.GetResourceState(status,tryResourceId,cached,&readValue,&levelOwnerId);
   814 			User::WaitForRequest(status);
   815 			if(status.Int() != KErrNone)
   816 				{
   817 				gTest.Printf(_L("SetAsyncResource, candidate get state returned %d\n"),r);
   818 				return r;
   819 				}
   820 			gTest.Printf(_L("SetAsyncResource, candidate get state gave %d, levelOwnerId = %d\n"),readValue,levelOwnerId);
   821 			TResourceInfoBuf buffer;
   822 			if((r=gChannel.GetResourceInfo(tryResourceId, &buffer))!=KErrNone)
   823 				{
   824 				gTest.Printf(_L("SetAsyncResource, candidate get resource info returned %d\n"),r);
   825 				return r;
   826 				}
   827 			// Print resource info
   828 			TBuf16<MAX_RESOURCE_NAME_LENGTH+1>name;
   829 			TResourceInfo* infoPtr = &(buffer());
   830 			name.Copy(infoPtr->iName);
   831 			gTest.Printf(_L("SetAsyncResource: Resource name = %S \n"),&name);
   832 			gTest.Printf(_L("SetAsyncResource: Resource Class =%d\n"),infoPtr->iClass);
   833 			gTest.Printf(_L("SetAsyncResource: Resource Type =%d\n"), infoPtr->iType);
   834 			gTest.Printf(_L("SetAsyncResource: Resource Usage =%d\n"), infoPtr->iUsage);
   835 			gTest.Printf(_L("SetAsyncResource: Resource Sense =%d\n"), infoPtr->iSense);
   836 			gTest.Printf(_L("SetAsyncResource: Resource MinLevel =%d\n"),infoPtr->iMinLevel);
   837 			gTest.Printf(_L("SetAsyncResource: Resource MaxLevel =%d\n"),infoPtr->iMaxLevel);
   838 
   839 			if((infoPtr->iMaxLevel - readValue) > LEVEL_GAP_REQUIRED_FOR_ASYNC_TESTING)
   840 				{
   841 				gLongLatencyResource = tryResourceId;
   842 				gAsyncResStateDelta = 1;  // Will change resource level in positive direction
   843 				gHaveAsyncRes = ETrue;
   844 				}
   845 			else if((readValue - infoPtr->iMinLevel) > LEVEL_GAP_REQUIRED_FOR_ASYNC_TESTING)
   846 				{
   847 				gLongLatencyResource = tryResourceId;
   848 				gAsyncResStateDelta = -1;  // Will change resource level in negative direction
   849 				gHaveAsyncRes = ETrue;
   850 				}
   851 			else
   852 				{
   853 				++index;
   854 				--numPotentialResources;
   855 				}
   856 			};
   857 		}
   858 	if(!gHaveAsyncRes)
   859 		{
   860 	    gTest.Printf(_L("**Test SetAsyncResource - don't have suitable resource ... exiting\n"));
   861 		return KErrNotReady;
   862 		}
   863 
   864 	return KErrNone;
   865 	}
   866 
   867 LOCAL_C TInt SetSharedResource()
   868 //
   869 // Support function for tests of shareable resources
   870 //
   871 	{
   872 	__KHEAP_MARK;
   873 
   874 	if(!gHaveSharedRes)
   875 		{
   876 		TRequestStatus status;
   877 		TBool cached = gUseCached;
   878 		TInt readValue = 0;
   879 		TUint numPotentialResources;
   880 		TUint index=0;
   881 		TInt r=gChannel.GetNumCandidateSharedResources(numPotentialResources);
   882 		if(r!=KErrNone)
   883 			{
   884 			gTest.Printf(_L("SetSharedResource, GetNumCandidateSharedResources returned %d\n"),r);
   885 			return r;
   886 			}
   887 		gTest.Printf(_L("SetSharedResource, GetNumCandidateSharedResources found %d resources\n"),numPotentialResources);
   888 		while((numPotentialResources>0) && !gHaveSharedRes)
   889 			{
   890 			TUint tryResourceId=0;
   891 			r=gChannel.GetCandidateSharedResourceId(index,tryResourceId);
   892 			if(r!=KErrNone)
   893 				{
   894 				gTest.Printf(_L("SetSharedResource, GetCandidateSharedResourceId returned %d\n"),r);
   895 				break;
   896 				}
   897 			gTest.Printf(_L("SetSharedResource, GetNumCandidateSharedResources index %d, resource ID %d\n"),index,tryResourceId);
   898 			// To support the tests, the selected shareable resource must not be the same
   899 			// resource as that selected for asynchronous testing
   900 			if(gHaveAsyncRes)
   901 				if(tryResourceId==gLongLatencyResource)
   902 					{
   903 					gTest.Printf(_L("SetSharedResource - skipping candidate resource %d - already used for async testing\n"),tryResourceId);
   904 					continue;
   905 					}
   906 			// For the candidate resource to be usable, we need its current state
   907 			// to be sufficiently less the maximum for positive sense (or sufficiently
   908 			// more than the greater than the minimum for negative sense - but the current 
   909 			// version of the code only considers positive sense).
   910 			TInt levelOwnerId = 0;
   911 			gChannel.GetResourceState(status,tryResourceId,cached,&readValue,&levelOwnerId);
   912 			User::WaitForRequest(status);
   913 			if(status.Int() != KErrNone)
   914 				{
   915 				gTest.Printf(_L("SetSharedResource, candidate get state returned %d\n"),r);
   916 				return r;
   917 				}
   918 			gTest.Printf(_L("SetSharedResource, candidate get state gave %d, levelOwnerId = %d\n"),readValue,levelOwnerId);
   919 			TResourceInfoBuf buffer;
   920 			if((r=gChannel.GetResourceInfo(tryResourceId, &buffer))!=KErrNone)
   921 				{
   922 				gTest.Printf(_L("SetSharedResource, candidate get resource info returned %d\n"),r);
   923 				return r;
   924 				}
   925 			// Print resource info
   926 			TBuf16<MAX_RESOURCE_NAME_LENGTH+1>name;
   927 			TResourceInfo* infoPtr = &buffer();
   928 			name.Copy(infoPtr->iName);
   929 			gTest.Printf(_L("SetSharedResource: Resource name = %S \n"),&name);
   930 			gTest.Printf(_L("SetSharedResource: Resource Class =%d\n"),infoPtr->iClass);
   931 			gTest.Printf(_L("SetSharedResource: Resource Type =%d\n"), infoPtr->iType);
   932 			gTest.Printf(_L("SetSharedResource: Resource Usage =%d\n"), infoPtr->iUsage);
   933 			gTest.Printf(_L("SetSharedResource: Resource Sense =%d\n"), infoPtr->iSense);
   934 			gTest.Printf(_L("SetSharedResource: Resource MinLevel =%d\n"),infoPtr->iMinLevel);
   935 			gTest.Printf(_L("SetSharedResource: Resource MaxLevel =%d\n"),infoPtr->iMaxLevel);
   936 
   937 			if((infoPtr->iMaxLevel - readValue) > LEVEL_GAP_REQUIRED_FOR_ASYNC_TESTING)
   938 				{
   939 				gSharedResource = tryResourceId;
   940 				gSharedResStateDelta = 1;  // Will change resource level in positive direction
   941 				gHaveSharedRes = ETrue;
   942 				}
   943 			else if((readValue - infoPtr->iMinLevel) > LEVEL_GAP_REQUIRED_FOR_ASYNC_TESTING)
   944 				{
   945 				gSharedResource = tryResourceId;
   946 				gSharedResStateDelta = -1;  // Will change resource level in negative direction
   947 				gHaveSharedRes = ETrue;
   948 				}
   949 			else
   950 				{
   951 				++index;
   952 				--numPotentialResources;
   953 				}
   954 			};
   955 		}
   956 	if(!gHaveSharedRes)
   957 		{
   958 	    gTest.Printf(_L("**Test SetSharedResource - don't have suitable resource ... exiting\n"));
   959 		return KErrNotReady;
   960 		}
   961 
   962 	__KHEAP_MARKEND;
   963 	return KErrNone;
   964 	}
   965 
   966 #endif
   967 
   968 
   969 //----------------------------------------------------------------------------------------------
   970 //! @SYMTestCaseID      KBASE-T_RESMANUS-0609
   971 //! @SYMTestType        UT
   972 //! @SYMPREQ            PREQ1398
   973 //! @SYMTestCaseDesc    This test case tests APIs for retrieving information about 
   974 //!						(1) clients of the channel and 
   975 //!						(2) power resources. 
   976 //!						Since the client lacks the ReadDeviceData PlatSec capability it will not
   977 //!						be permitted to access information about kernel-side clients
   978 //! 
   979 //!						The tests are invoked a number of times:
   980 //!						-	first, to examine the starting state
   981 //!						-	then, to examine the effect of adding a new client (channel)
   982 //!						-	then, the examine the effect of adding a new client that requests a
   983 //|							level on a resource
   984 //!						-	then, to test the effect of the original client requesting a level 
   985 //!							on a resource
   986 //! 
   987 //! @SYMTestActions     0) Call GetNoOfClients API with default aIncludeKern=EFalse.
   988 //! 
   989 //!						1) Call GetNoOfClients API with aIncludeKern=ETrue.
   990 //!
   991 //!						2) Call GetNamesAllClients API with default aIncludeKern=EFalse.
   992 //!
   993 //!						3) Call GetNamesAllClients API with aIncludeKern=ETrue.
   994 //!
   995 //!						4) Call GetNumClientsUsingResource API with aIncludeKern=ETrue.
   996 //!
   997 //!						5) Call GetNumClientsUsingResource API with default aIncludeKern=EFalse.
   998 //!
   999 //!						6) Call GetInfoOnClientsUsingResource API with default aIncludeKern=EFalse.
  1000 //!
  1001 //!						7) Call GetInfoOnClientsUsingResource API with aIncludeKern=ETrue.
  1002 //!
  1003 //!						8) GetNumResourcesInUseByClient for the original client
  1004 //!
  1005 //!						9) GetNumResourcesInUseByClient for a non-existent client
  1006 //!
  1007 //!						10) GetInfoOnResourcesInUseByClient for the original client
  1008 //!
  1009 //!						11) GetInfoOnResourcesInUseByClient for a non-existent client
  1010 //!
  1011 //! @SYMTestExpectedResults 0) API should return with KErrNone, exits otherwise.
  1012 //!
  1013 //!						1) If client exhibits PlatSec capability ReadDeviceData, API should return with KErrNone, exits otherwise.
  1014 //!						   If client lacks PlatSec capability ReadDeviceData, API should return with KErrPermissionDenied, exits otherwise.
  1015 //!
  1016 //!						2) API should return with KErrNone, exits otherwise.
  1017 //!
  1018 //!						3) If client exhibits PlatSec capability ReadDeviceData, API should return with KErrNone, exits otherwise
  1019 //!						   If client lacks PlatSec capability ReadDeviceData, API should return with KErrPermissionDenied, exits otherwise
  1020 //!
  1021 //!						4) If client exhibits PlatSec capability ReadDeviceData, API should return with KErrNone, exits otherwise.
  1022 //!						   If client lacks PlatSec capability ReadDeviceData, API should return with KErrPermissionDenied, exits otherwise.
  1023 //!
  1024 //!						5) API should return with KErrNone, exits otherwise
  1025 //!
  1026 //!						6) API should return with KErrNone, exits otherwise.
  1027 //!
  1028 //!						7) If client exhibits PlatSec capability ReadDeviceData, API should return with KErrNone, exits otherwise
  1029 //!						   If client lacks PlatSec capability ReadDeviceData, API should return with KErrPermissionDenied, exits otherwise
  1030 //!
  1031 //!						8) API should return with KErrNone, exits otherwise.
  1032 //!
  1033 //!						9) API should return with KErrNotFound, exits otherwise.
  1034 //!
  1035 //!						10) API should return with KErrNone, exits otherwise.
  1036 //!
  1037 //!						11) API should return with KErrNotFound, exits otherwise.
  1038 //!
  1039 //! @SYMTestPriority        High
  1040 //! @SYMTestStatus          Implemented
  1041 //----------------------------------------------------------------------------------------------
  1042 LOCAL_C TInt TestGetClientGetResourceInfo()
  1043 //
  1044 // Test methods to access information about clients and resources
  1045 //
  1046 	{
  1047 	TInt r = KErrNone;
  1048 
  1049 	// Open a couple of additional channels  
  1050 	_LIT(tempStr1,"ExtraChan1");
  1051 	TBufC<16> tempName1(tempStr1);
  1052 	_LIT(tempStr2,"ExtraChan2");
  1053 	TBufC<16> tempName2(tempStr2);
  1054 
  1055 	RBusDevResManUs channelTwo;
  1056 	RBusDevResManUs channelThree;
  1057 
  1058 	if((r=OpenChannel(tempName1, channelTwo))!=KErrNone)
  1059 		return r;
  1060 	if((r=OpenChannel(tempName2, channelThree))!=KErrNone)
  1061 		return r;
  1062 
  1063 	// Test the tracking of the client and resource info
  1064 	//
  1065 
  1066 	// First invocation to establish starting state
  1067 #ifdef _DEBUG
  1068 	gTest.Printf(_L("TestGetClientGetResourceInfo: First HelperGetClientResourceInfo call (starting state):\n"));
  1069 #endif
  1070 	if((r=HelperGetClientResourceInfo())!=KErrNone)
  1071 		return r;
  1072 
  1073 	// Second invocation - examine effect of adding a client
  1074 	_LIT(tempStr3,"ExtraChan3");
  1075 	TBufC<16> tempName3(tempStr3);
  1076 	RBusDevResManUs channelFour;
  1077 	if((r=OpenChannel(tempName3, channelFour))!=KErrNone)
  1078 		return r;
  1079 #ifdef _DEBUG
  1080 	gTest.Printf(_L("TestGetClientGetResourceInfo: Second HelperGetClientResourceInfo call (added client ExtraChan3):\n"));
  1081 #endif
  1082 
  1083 	if((r=HelperGetClientResourceInfo())!=KErrNone)
  1084 		return r;
  1085 
  1086 	// Third invocation  - examine effect of new client requesting a level for a resource
  1087 	// (This relies on getting and setting the state of gSharedResource - so skip the 
  1088 	// test if this has not yet been identified
  1089 	//
  1090 	TUint startingLevel = 0;
  1091 #ifdef _DEBUG
  1092 	if((r=SetSharedResource())!=KErrNone)
  1093 		return r;
  1094 #endif
  1095 	if(!gHaveSharedRes)
  1096 		{
  1097 		gTest.Printf(_L("TestGetClientGetResourceInfo: no suitable shareable resource, so skipping third call:\n"));
  1098 		}
  1099 	else
  1100 		{
  1101 		// Channel registration
  1102 		gTest.Printf(_L("Initialise for temporary channel with arguments 1,1,0\n"));
  1103 		if ((r=channelFour.Initialise(1,1,0))!=KErrNone)  // Just need 1 get and 1 set state
  1104 			{
  1105 			gTest.Printf(_L("Initialise for channel returned %d\n"),r);
  1106 			return r;
  1107 			}
  1108 		// Get initial state
  1109 		TRequestStatus status;
  1110 		TBool cached = gUseCached;
  1111 		TInt readValue;
  1112 		TInt levelOwnerId = 0;
  1113 		channelFour.GetResourceState(status,gSharedResource,cached,&readValue,&levelOwnerId);
  1114 		User::WaitForRequest(status);
  1115 		r=status.Int();
  1116 		if(r != KErrNone)
  1117 			{
  1118 			gTest.Printf(_L("TestGetClientGetResourceInfo, first get state for shareable returned %d\n"),r);
  1119 			return r;
  1120 			}
  1121 		startingLevel = (TUint)readValue;
  1122 		// Write updated state
  1123 		TUint newLevel = (TUint)(readValue + gSharedResStateDelta);
  1124 		gTest.Printf(_L("TestGetClientGetResourceInfo: levelOwnerId = %d\n"), levelOwnerId);
  1125 		gTest.Printf(_L("TestGetClientGetResourceInfo: shareable resource startingLevel=0x%x, writing 0x%x\n"), startingLevel, newLevel);
  1126 		channelFour.ChangeResourceState(status,gSharedResource,newLevel);
  1127 		User::WaitForRequest(status);
  1128 		r=status.Int();
  1129 		if(r != KErrNone)
  1130 			{
  1131 			gTest.Printf(_L("TestGetClientGetResourceInfo, first change state for shareable resource returned %d\n"),r);
  1132 			return r;
  1133 			}
  1134 #ifdef _DEBUG
  1135 		gTest.Printf(_L("TestGetClientGetResourceInfo: third HelperGetClientResourceInfo call (new client set level on shared resource):\n"));
  1136 #endif
  1137 		if((r=HelperGetClientResourceInfo())!=KErrNone)
  1138 			return r;
  1139 		}
  1140 
  1141 
  1142 	// Fourth invocation - examine effect of orignal client requesting a level for 
  1143 	// the Shared resource
  1144 	if(gHaveSharedRes)
  1145 		{
  1146 		TRequestStatus status;
  1147 		TBool cached = gUseCached;
  1148 		TInt readValue;
  1149 		TInt levelOwnerId;
  1150 		gChannel.GetResourceState(status,gSharedResource,cached,&readValue,&levelOwnerId);
  1151 		User::WaitForRequest(status);
  1152 		r=status.Int();
  1153 		if(r != KErrNone)
  1154 			{
  1155 			gTest.Printf(_L("TestGetClientGetResourceInfo, gChannel get state on Shareable resource returned %d\n"),r);
  1156 			return r;
  1157 			}
  1158 		gTest.Printf(_L("TestGetClientGetResourceInfo, GetResourceState levelOwnerId =  %d\n"),levelOwnerId);		// Request a level on the resource
  1159 		gChannel.ChangeResourceState(status,gSharedResource,(readValue+gSharedResStateDelta));
  1160 		User::WaitForRequest(status);
  1161 		if(status.Int() != KErrNone)
  1162 			{
  1163 			gTest.Printf(_L("TestGetClientGetResourceInfo, gChannel change state on Shareable returned %d\n"),r);
  1164 			return r;
  1165 			}
  1166 #ifdef _DEBUG
  1167 	gTest.Printf(_L("TestGetClientGetResourceInfo: fourth HelperGetClientResourceInfo call (gChannel set level on Shareable resource):\n"));
  1168 #endif
  1169 		if((r=HelperGetClientResourceInfo())!=KErrNone)
  1170 		return r;
  1171 		}
  1172 
  1173 	// Return the resource to the state it was on function entry
  1174 	if(gHaveSharedRes)
  1175 		{
  1176 		TRequestStatus status;
  1177 		gTest.Printf(_L("TestGetClientGetResourceInfo: returning sharable resource to startingLevel=0x%x\n"), startingLevel);
  1178 		gChannel.ChangeResourceState(status,gSharedResource,startingLevel);
  1179 		User::WaitForRequest(status);
  1180 		r=status.Int();
  1181 		if(r != KErrNone)
  1182 			{
  1183 			gTest.Printf(_L("TestGetClientGetResourceInfo, attempt to reset shareable resource state returned %d\n"),r);
  1184 			return r;
  1185 			}
  1186 		}
  1187 
  1188 
  1189 	// Close the temporary channels
  1190 	channelTwo.Close();
  1191 	channelThree.Close();
  1192 	channelFour.Close();
  1193 
  1194 	return r;
  1195 	}
  1196 
  1197 
  1198 
  1199 //----------------------------------------------------------------------------------------------
  1200 //! @SYMTestCaseID      KBASE-T_RESMANUS-0610
  1201 //! @SYMTestType        UT
  1202 //! @SYMPREQ            PREQ1398
  1203 //! @SYMTestCaseDesc    This test case tests APIs for getting and setting the state of resources; 
  1204 //!						it also tests APIs to cancel such requests.
  1205 //! 
  1206 //! @SYMTestActions     0) Call API to get the initial state of a selected resource.
  1207 //! 
  1208 //!						1) Call API to modify the state of the resource.
  1209 //! 
  1210 //!						2) Call API to get the new state of the resource and check it exhibits
  1211 //!						the expected value.
  1212 //! 
  1213 //!						3) Call API to return the resource state to its original value.
  1214 //! 
  1215 //!						4) Call API to get the state of a long latency resource then call API
  1216 //!						with operation-type qualifier cancel the request.
  1217 //! 
  1218 //!						5) Call API to modify the state of the long latency resource then call API
  1219 //!						with operation-type qualifier to cancel the request.
  1220 //! 
  1221 //!						6) Call API to get the state of a long latency resource and wait for it 
  1222 //!						to complete. Then call API with operation-type qualifier to cancel the request.
  1223 //! 
  1224 //!						7) Call API to modify the state of the long latency resource and wait for
  1225 //!						it to complete. Then call API with operation-type qualifier to cancel the request.
  1226 //! 
  1227 //!						8) Call API to get the state of a long latency resource then call API
  1228 //!						without operation-type qualifier to cancel the request.
  1229 //! 
  1230 //!						9) Call API to modify the state of the long latency resource then call API
  1231 //!						without operation-type qualifier to cancel the request.
  1232 //! 
  1233 //!						10) Call API to get the state of a long latency resource and wait for it 
  1234 //!						to complete. Then call API without operation-type qualifier to cancel the request.
  1235 //! 
  1236 //!						11) Call API to modify the state of the long latency resource and wait for
  1237 //!						it to complete. Then call API without operation-type qualifier to cancel the request.
  1238 //! 
  1239 //!						12) Call API to get the state of a long latency resource 'n' times. Then call API with 
  1240 //!						resource qualifier to cancel the requests.
  1241 //! 
  1242 //!						13) Call API to modify the state of a long latency resource 'm' times. Then call API with 
  1243 //!						resource qualifier to cancel the requests.
  1244 //! 
  1245 //!						14) Call API to get the state of a long latency resource 'n' times and wait for them to complete.
  1246 //!						Then call API with resource qualifier to cancel the requests.
  1247 //! 
  1248 //!						15) Call API to modify the state of a long latency resource 'm' times and wait for them to complete.
  1249 //!						Then call API with resource qualifier to cancel the requests.
  1250 //! 
  1251 //!						16) Call API to get the state of a long latency resource 'n' times, call API to modify the state of
  1252 //!						a long latency resource 'm' times. Call the API to cancel the get operations with resource qualifier.
  1253 //!						Wait for the operations to complete. Check the state of the associated TRequestStatus objects.
  1254 //! 
  1255 //!						17) Call API to get the state of a long latency resource 'n' times, call API to modify the state of
  1256 //!						a long latency resource 'm' times. Call the API to cancel the modify operations with resource qualifier.
  1257 //!						Wait for the get operations to complete. Check the state of the associated TRequestStatus objects.
  1258 //! 
  1259 //!						18) Call API to get the state of a long latency resource 'n' times, call API to modify the state of
  1260 //!						a long latency resource 'm' times. Wait for the get operations to complete. Call the API to cancel the get
  1261 //!						operations with resource qualifier. Check the state of the associated TRequestStatus objects.
  1262 //! 
  1263 //!						19) Call API to get the state of a long latency resource 'n' times, call API to modify the state of
  1264 //!						a long latency resource 'm' times. Wait for the modify operations to complete. Call the API to cancel the modify
  1265 //!						operations with resource qualifier. Check the state of the associated TRequestStatus objects.
  1266 //! 
  1267 //!						20) Call API to get the state of a long latency resource 'n' times, call API to modify the state of
  1268 //!						a long latency resource 'm' times.
  1269 //!						Then call API with operation-type qualifier to cancel the even-numbered get request(s).
  1270 //!						Then call API without operation-type qualifier to cancel the even-numbered modify request(s).
  1271 //!						Check the state of the associated TRequestStatus objects.
  1272 //! 
  1273 //! @SYMTestExpectedResults 0) The associated TRequestStatus object should indicate KErrNone, exits otherwise.
  1274 //! 
  1275 //!						1) The associated TRequestStatus object should indicate KErrNone, exits otherwise.
  1276 //! 
  1277 //!						2) The associated TRequestStatus object should indicate KErrNone, exits otherwise.
  1278 //!						Exit if the value read back is not as expected.
  1279 //! 
  1280 //!						3) The associated TRequestStatus object should indicate KErrNone, exits otherwise.
  1281 //! 
  1282 //!						4) The associated TRequestStatus object should indicate KErrCancel if the cancel 
  1283 //!						request was accepted, exits otherwise.
  1284 //!						The associated TRequestStatus object should indicate KErrNone if the cancel request
  1285 //!						was not accepted, exits otherwise.
  1286 //! 
  1287 //!						5) The associated TRequestStatus object should indicate KErrCancel if the cancel 
  1288 //!						request was accepted, exits otherwise.
  1289 //!						The associated TRequestStatus object should indicate KErrNone if the cancel request
  1290 //!						was not accepted, exits otherwise.
  1291 //! 
  1292 //!						6) The TRequestStatus object associated with the get operation should indicate 
  1293 //!						KErrNone - exits otherwise. The TRequestStatus object associated with the cancel
  1294 //!						operation should indicate KErrNone - exits otherwise.
  1295 //! 
  1296 //!						7) The TRequestStatus object associated with the get operation should indicate
  1297 //!						KErrNone - exits otherwise. The TRequestStatus object associated with the cancel
  1298 //!						operation should indicate KErrNone - exits otherwise.
  1299 //! 
  1300 //!						8) The associated TRequestStatus object should indicate KErrCancel, exits otherwise.
  1301 //! 
  1302 //!						9) The associated TRequestStatus object should indicate KErrCancel, exits otherwise.
  1303 //! 
  1304 //!						10) The TRequestStatus object associated with the get operation should indicate 
  1305 //!						KErrNone - exits otherwise. The TRequestStatus object associated with the cancel
  1306 //!						operation should indicate KErrNone - exits otherwise.
  1307 //! 
  1308 //!						11) The TRequestStatus object associated with the get operation should indicate
  1309 //!						KErrNone - exits otherwise. The TRequestStatus object associated with the cancel
  1310 //!						operation should indicate KErrNone - exits otherwise.
  1311 //!
  1312 //!						12) The TRequestStatus objects should all exibit KErrCancel - exits otherwise.
  1313 //! 
  1314 //!						13) The TRequestStatus objects should all exibit KErrCancel - exits otherwise.
  1315 //! 
  1316 //!						14) The TRequestStatus objects associated with the get operations should all exibit KErrNone - exits otherwise.
  1317 //!						The TRequestStatus objects associated with the cancel operations should all exibit KErrNone - exits otherwise
  1318 //! 
  1319 //!						15) The TRequestStatus objects associated with the modify operations should all exibit KErrNone - exits otherwise.
  1320 //!						The TRequestStatus objects associated with the cancel operations should all exibit KErrNone - exits otherwise
  1321 //! 
  1322 //!						16) The TRequestStatus objects associated with the get operations should all exibit KErrCancel - exits otherwise.
  1323 //!						The TRequestStatus objects associated with the modify operations should all exibit KErrNone - exits otherwise
  1324 //! 
  1325 //!						17) The TRequestStatus objects associated with the get operations should all exibit KErrNone - exits otherwise.
  1326 //!						The TRequestStatus objects associated with the modify operations should all exibit KErrCancel - exits otherwise
  1327 //! 
  1328 //!						18) The TRequestStatus objects associated with the get and modify operations should all exibit KErrNone - exits otherwise.
  1329 //! 
  1330 //!						19) The TRequestStatus objects associated with the get and modify operations should all exibit KErrNone - exits otherwise.
  1331 //!
  1332 //!						20) The TRequestStatus objects associated with the even-numbered request should exhibit KErrCancel.
  1333 //!						The TRequestStatus objects associated with the odd-numbered request should exhibit KErrNone.
  1334 //!
  1335 //! @SYMTestPriority        High
  1336 //! @SYMTestStatus          Implemented
  1337 //----------------------------------------------------------------------------------------------
  1338 LOCAL_C TInt TestGetSetResourceStateOps()
  1339 //
  1340 // Test resource state access methods
  1341 //
  1342 	{
  1343 	TInt r = KErrNone;
  1344 
  1345 	TRequestStatus status;
  1346 	TBool cached = gUseCached;
  1347 	TInt readValue = 0;
  1348 	TInt levelOwnerId = 0;
  1349 	TInt testNo = 0;
  1350 
  1351 #ifdef _DEBUG
  1352 	// Ensure we have a resource we can use
  1353 	if((r=SetAsyncResource())!=KErrNone)
  1354 		return r;
  1355 #endif
  1356 
  1357 	// 0) Call API to get the initial state of a selected resource.
  1358 	gTest.Printf(_L("TestGetSetResourceStateOps, starting test %d\n"),testNo++);
  1359 	gChannel.GetResourceState(status,gLongLatencyResource,cached,&readValue,&levelOwnerId);
  1360 	User::WaitForRequest(status);
  1361 	if(status.Int() != KErrNone)
  1362 		{
  1363 		gTest.Printf(_L("TestGetSetResourceStateOps, get state status = %d\n"),r);
  1364 		return r;
  1365 		}
  1366 	TUint startingLevel = (TUint)readValue;
  1367 	gTest.Printf(_L("TestGetSetResourceStateOps: initial level read =0x%x, levelOwnerId = %d\n"),readValue,levelOwnerId);
  1368 
  1369 	// 1) Call API to modify the state of the resource.
  1370 	gTest.Printf(_L("TestGetSetResourceStateOps, starting test %d\n"),testNo++);
  1371 	TUint newLevel = (TUint)(readValue + gAsyncResStateDelta);
  1372 	gTest.Printf(_L("TestGetSetResourceStateOps: writing 0x%x\n"), newLevel);
  1373 	gChannel.ChangeResourceState(status,gLongLatencyResource,newLevel);
  1374 	User::WaitForRequest(status);
  1375 	if(status.Int() != KErrNone)
  1376 		{
  1377 		gTest.Printf(_L("TestGetSetResourceStateOps, first change state returned %d\n"),r);
  1378 		return r;
  1379 		}
  1380 
  1381 	// 2) Call API to get the new state of the resource and check it exhibits the expected value.
  1382 	gTest.Printf(_L("TestGetSetResourceStateOps, starting test %d\n"),testNo++);
  1383 	gChannel.GetResourceState(status,gLongLatencyResource,cached,&readValue,&levelOwnerId);
  1384 	User::WaitForRequest(status);
  1385 	if(status.Int() != KErrNone)
  1386 		{
  1387 		gTest.Printf(_L("TestGetSetResourceStateOps, get state status = %d\n"),r);
  1388 		return r;
  1389 		}
  1390 	gTest.Printf(_L("TestGetSetResourceStateOps: level read back =0x%x, levelOwnerId=%d\n"),readValue,levelOwnerId);
  1391 	gTest(newLevel==(TUint)readValue);
  1392 
  1393 	// 3) Call API to return the resource state to its original value.
  1394 	gTest.Printf(_L("TestGetSetResourceStateOps, starting test %d\n"),testNo++);
  1395 	gTest.Printf(_L("TestGetSetResourceStateOps: write original level 0x%x\n"), startingLevel);
  1396 	gChannel.ChangeResourceState(status,gLongLatencyResource,startingLevel);
  1397 	User::WaitForRequest(status);
  1398 	if(status.Int() != KErrNone)
  1399 		{
  1400 		gTest.Printf(_L("TestGetSetResourceStateOps, change state status = %d\n"),r);
  1401 		return r;
  1402 		}
  1403 	gChannel.GetResourceState(status,gLongLatencyResource,cached,&readValue,&levelOwnerId);
  1404 	User::WaitForRequest(status);
  1405 	if(status.Int() != KErrNone)
  1406 		{
  1407 		gTest.Printf(_L("TestGetSetResourceStateOps, get state status = %d\n"),r);
  1408 		return r;
  1409 		}
  1410 	gTest.Printf(_L("TestGetSetResourceStateOps: check original level read back =0x%x, levelOwnerId=%d\n"),readValue,levelOwnerId);
  1411 
  1412 	// 4) Call API to get the state of a long latency resource then call API with operation-type qualifier cancel the request.
  1413 	gTest.Printf(_L("TestGetSetResourceStateOps, starting test %d\n"),testNo++);
  1414 	gChannel.GetResourceState(status,gLongLatencyResource,cached,&readValue,&levelOwnerId);
  1415 	r=gChannel.CancelGetResourceState(status);
  1416 	if(r!=KErrInUse)
  1417 		{
  1418 		gTest.Printf(_L("TestGetSetResourceStateOps, CancelGetResourceState returned %d\n"),r);
  1419 		}
  1420 	if(r!=KErrCompletion) // If request had not completed before cancellation request
  1421 		{
  1422 		User::WaitForRequest(status);
  1423 		if(r==KErrNone)	// Cancel expected to proceed as requested
  1424 			{
  1425 			if(status.Int() != KErrCancel)
  1426 				{
  1427 				gTest.Printf(_L("TestGetSetResourceStateOps, expected KErrCancel but cancelled get state status = %d\n"),r);
  1428 				return r;
  1429 				}
  1430 			}
  1431 		else if(r==KErrInUse)	// Cancel failed since request was being processed - so expect successful completion
  1432 			{
  1433 			if(status.Int() != KErrNone)
  1434 				{
  1435 				gTest.Printf(_L("TestGetSetResourceStateOps, expected KErrNone but cancelled get state status = %d\n"),r);
  1436 				return r;
  1437 				}
  1438 			}
  1439 		else if(status.Int() != KErrCancel)	// Just report the error code and return
  1440 			{
  1441 			gTest.Printf(_L("TestGetSetResourceStateOps, cancelled get state status = %d\n"),r);
  1442 			return r;
  1443 			}
  1444 
  1445 		}
  1446 
  1447 	// 5) Call API to modify the state of the long latency resource then call API with operation-type qualifier to cancel the request.
  1448 	gTest.Printf(_L("TestGetSetResourceStateOps, starting test %d\n"),testNo++);
  1449 	newLevel = (TUint)(readValue + gAsyncResStateDelta);
  1450 	gChannel.ChangeResourceState(status,gLongLatencyResource,newLevel);
  1451 	r=gChannel.CancelChangeResourceState(status);
  1452 	if(r!=KErrInUse)
  1453 		{
  1454 		gTest.Printf(_L("TestGetSetResourceStateOps, CancelChangeResourceState returned %d\n"),r);
  1455 		}
  1456 	if(r!=KErrCompletion) // If request had not completed before cancellation request
  1457 		{
  1458 		User::WaitForRequest(status);
  1459 		if(r==KErrNone)	// Cancel expected to proceed as requested
  1460 			{
  1461 			if(status.Int() != KErrCancel)
  1462 				{
  1463 				gTest.Printf(_L("TestGetSetResourceStateOps, expected KErrCancel but cancelled get state status = %d\n"),r);
  1464 				return r;
  1465 				}
  1466 			}
  1467 		else if(r==KErrInUse)	// Cancel failed since request was being processed - so expect successful completion
  1468 			{
  1469 			if(status.Int() != KErrNone)
  1470 				{
  1471 				gTest.Printf(_L("TestGetSetResourceStateOps, expected KErrNone but cancelled get state status = %d\n"),r);
  1472 				return r;
  1473 				}
  1474 			}
  1475 		else if(status.Int() != KErrCancel)	// Just report the error code and return
  1476 			{
  1477 			gTest.Printf(_L("TestGetSetResourceStateOps, cancelled get state status = %d\n"),r);
  1478 			return r;
  1479 			}
  1480 		}
  1481 
  1482 
  1483 	// 6) Call API to get the state of a long latency resource and wait for it to complete.
  1484 	//    Then call API with operation-type qualifier to cancel the request.	
  1485 	gTest.Printf(_L("TestGetSetResourceStateOps, starting test %d\n"),testNo++);
  1486 	gChannel.GetResourceState(status,gLongLatencyResource,cached,&readValue,&levelOwnerId);
  1487 	User::WaitForRequest(status);
  1488 	if(status.Int() != KErrNone)
  1489 		{
  1490 		gTest.Printf(_L("TestGetSetResourceStateOps, get state status = %d\n"),r);
  1491 		return r;
  1492 		}
  1493 	r=gChannel.CancelGetResourceState(status);
  1494 	if(r!=KErrNone)
  1495 		{
  1496 		gTest.Printf(_L("TestGetSetResourceStateOps, CancelGetResourceState returned %d\n"),r);
  1497 		}
  1498 	if(status.Int() != KErrNone)	// TRequestStatus should be unchanged
  1499 		{
  1500 		gTest.Printf(_L("TestGetSetResourceStateOps, completed-then-cancelled get state status = %d\n"),r);
  1501 		return r;
  1502 		}
  1503 
  1504 	// 7) Call API to modify the state of the long latency resource and wait for it to complete. 
  1505 	//    Then call API with operation-type qualifier to cancel the request.
  1506 	gTest.Printf(_L("TestGetSetResourceStateOps, starting test %d\n"),testNo++);
  1507 	gChannel.ChangeResourceState(status,gLongLatencyResource,(readValue + gAsyncResStateDelta));
  1508 	User::WaitForRequest(status);
  1509 	if(status.Int() != KErrNone)
  1510 		{
  1511 		gTest.Printf(_L("TestGetSetResourceStateOps, change state status = %d\n"),r);
  1512 		return r;
  1513 		}
  1514 	r=gChannel.CancelChangeResourceState(status);
  1515 	if(r!=KErrNone)
  1516 		{
  1517 		gTest.Printf(_L("TestGetSetResourceStateOps, CancelChangeResourceState returned %d\n"),r);
  1518 		}
  1519 	if(status.Int() != KErrNone)	// TRequestStatus should be unchanged
  1520 		{
  1521 		gTest.Printf(_L("TestGetSetResourceStateOps, completed-then-cancelled change state status = %d\n"),r);
  1522 		return r;
  1523 		}
  1524 
  1525 	// 8) Call API to get the state of a long latency resource then call API without operation-type qualifier to cancel the request.
  1526 	gTest.Printf(_L("TestGetSetResourceStateOps, starting test %d\n"),testNo++);
  1527 	gChannel.GetResourceState(status,gLongLatencyResource,cached,&readValue,&levelOwnerId);
  1528 	gChannel.CancelAsyncOperation(&status);
  1529 	User::WaitForRequest(status);
  1530 	if(status.Int() != KErrCancel)
  1531 		{
  1532 		gTest.Printf(_L("TestGetSetResourceStateOps, cancelled get state status = %d\n"),r);
  1533 		return r;
  1534 		}
  1535 
  1536 	// 9) Call API to modify the state of the long latency resource then call API without operation-type qualifier to cancel the request.
  1537 	gTest.Printf(_L("TestGetSetResourceStateOps, starting test %d\n"),testNo++);
  1538 	newLevel = (TUint)(readValue + gAsyncResStateDelta);
  1539 	gChannel.ChangeResourceState(status,gLongLatencyResource,newLevel);
  1540 	gChannel.CancelAsyncOperation(&status);
  1541 	User::WaitForRequest(status);
  1542 	if(status.Int() != KErrCancel)
  1543 		{
  1544 		gTest.Printf(_L("TestGetSetResourceStateOps, cancelled change state status = %d\n"),r);
  1545 		return r;
  1546 		}
  1547 
  1548 	// 10) Call API to get the state of a long latency resource and wait for it to complete.
  1549 	//     Then call API without operation-type qualifier to cancel the request.
  1550 	gTest.Printf(_L("TestGetSetResourceStateOps, starting test %d\n"),testNo++);
  1551 	gChannel.GetResourceState(status,gLongLatencyResource,cached,&readValue,&levelOwnerId);
  1552 	User::WaitForRequest(status);
  1553 	if(status.Int() != KErrNone)
  1554 		{
  1555 		gTest.Printf(_L("TestGetSetResourceStateOps, get state status = %d\n"),r);
  1556 		return r;
  1557 		}
  1558 	gChannel.CancelAsyncOperation(&status);
  1559 	if(status.Int() != KErrNone)	// TRequestStatus should be unchanged
  1560 		{
  1561 		gTest.Printf(_L("TestGetSetResourceStateOps, completed-then-cancelled get state status = %d\n"),r);
  1562 		return r;
  1563 		}
  1564 
  1565 	// 11) Call API to modify the state of the long latency resource and wait for it to complete. 
  1566 	//     Then call API without operation-type qualifier to cancel the request.
  1567 	gTest.Printf(_L("TestGetSetResourceStateOps, starting test %d\n"),testNo++);
  1568 	gChannel.ChangeResourceState(status,gLongLatencyResource,(readValue + gAsyncResStateDelta));
  1569 	User::WaitForRequest(status);
  1570 	if(status.Int() != KErrNone)
  1571 		{
  1572 		gTest.Printf(_L("TestGetSetResourceStateOps, change state status = %d\n"),r);
  1573 		return r;
  1574 		}
  1575 	gChannel.CancelAsyncOperation(&status);
  1576 	if(status.Int() != KErrNone)	// TRequestStatus should be unchanged
  1577 		{
  1578 		gTest.Printf(_L("TestGetSetResourceStateOps, completed-then-cancelled change state status = %d\n"),r);
  1579 		return r;
  1580 		}
  1581 
  1582 	// 'n' and 'm' values and support for cancellation of multiple requests
  1583 	const TInt KLoopVarN = 2;
  1584 	const TInt KLoopVarM = 3;
  1585 	TRequestStatus getReqStatus[KLoopVarN];
  1586 	TRequestStatus setReqStatus[KLoopVarM];
  1587 	TInt i=0;
  1588 
  1589 	// 12) Call API to get the state of a long latency resource 'n' times. 
  1590 	//     Then call API with resource qualifier to cancel the requests.
  1591 	gTest.Printf(_L("TestGetSetResourceStateOps, starting test %d\n"),testNo++);
  1592 	for(i=0;i<KLoopVarN;i++)
  1593 		{
  1594 		gChannel.GetResourceState(getReqStatus[i],gLongLatencyResource,cached,&readValue,&levelOwnerId);
  1595 		}
  1596 	gChannel.CancelGetResourceStateRequests(gLongLatencyResource);
  1597 	for(i=0;i<KLoopVarN;i++)
  1598 		{
  1599 		User::WaitForRequest(getReqStatus[i]);
  1600 		if((r=getReqStatus[i].Int()) != KErrCancel)
  1601 			{
  1602 			gTest.Printf(_L("TestGetSetResourceStateOps, cancelled get state status[%d] = %d\n"),i,r);
  1603 			return r;
  1604 			}
  1605 		}
  1606 
  1607 	// 13) Call API to modify the state of a long latency resource 'm' times. 
  1608 	//     Then call API with resource qualifier to cancel the requests.
  1609 	gTest.Printf(_L("TestGetSetResourceStateOps, starting test %d\n"),testNo++);
  1610 	for(i=0;i<KLoopVarM;i++)
  1611 		{
  1612 		gChannel.ChangeResourceState(setReqStatus[i],gLongLatencyResource,(readValue + gAsyncResStateDelta));
  1613 		}
  1614 	gChannel.CancelChangeResourceStateRequests(gLongLatencyResource);
  1615 	for(i=0;i<KLoopVarM;i++)
  1616 		{
  1617 		User::WaitForRequest(setReqStatus[i]);
  1618 		if((r=setReqStatus[i].Int()) != KErrCancel)
  1619 			{
  1620 			gTest.Printf(_L("TestGetSetResourceStateOps, cancelled change state status[%d] = %d\n"),i,r);
  1621 			return r;
  1622 			}
  1623 		}
  1624 
  1625 	// 14) Call API to get the state of a long latency resource 'n' times and wait for them to complete.
  1626 	//     Then call API with resource qualifier to cancel the requests.
  1627 	gTest.Printf(_L("TestGetSetResourceStateOps, starting test %d\n"),testNo++);
  1628 	for(i=0;i<KLoopVarN;i++)
  1629 		{
  1630 		gChannel.GetResourceState(getReqStatus[i],gLongLatencyResource,cached,&readValue,&levelOwnerId);
  1631 		}
  1632 	for(i=0;i<KLoopVarN;i++)
  1633 		{
  1634 		User::WaitForRequest(getReqStatus[i]);
  1635 		if((r=getReqStatus[i].Int()) != KErrNone)
  1636 			{
  1637 			gTest.Printf(_L("TestGetSetResourceStateOps, before cancel get state status[%d] = %d\n"),i,r);
  1638 			return r;
  1639 			}
  1640 		}
  1641 	gChannel.CancelGetResourceStateRequests(gLongLatencyResource);
  1642 	for(i=0;i<KLoopVarN;i++)
  1643 		{
  1644 		if((r=getReqStatus[i].Int()) != KErrNone)
  1645 			{
  1646 			gTest.Printf(_L("TestGetSetResourceStateOps, after cancel get state status[%d] = %d\n"),i,r);
  1647 			return r;
  1648 			}
  1649 		}
  1650 
  1651 	// 15) Call API to modify the state of a long latency resource 'm' times and wait for them to complete.
  1652 	//     Then call API with resource qualifier to cancel the requests.
  1653 	gTest.Printf(_L("TestGetSetResourceStateOps, starting test %d\n"),testNo++);
  1654 	for(i=0;i<KLoopVarM;i++)
  1655 		{
  1656 		gChannel.ChangeResourceState(setReqStatus[i],gLongLatencyResource,(readValue + gAsyncResStateDelta));
  1657 		}
  1658 	for(i=0;i<KLoopVarM;i++)
  1659 		{
  1660 		User::WaitForRequest(setReqStatus[i]);
  1661 		if((r=setReqStatus[i].Int()) != KErrNone)
  1662 			{
  1663 			gTest.Printf(_L("TestGetSetResourceStateOps, before cancel change state status[%d] = %d\n"),i,r);
  1664 			return r;
  1665 			}
  1666 		}
  1667 	gChannel.CancelChangeResourceStateRequests(gLongLatencyResource);
  1668 	for(i=0;i<KLoopVarM;i++)
  1669 		{
  1670 		if((r=setReqStatus[i].Int()) != KErrNone)
  1671 			{
  1672 			gTest.Printf(_L("TestGetSetResourceStateOps, after cancel change state status[%d] = %d\n"),i,r);
  1673 			return r;
  1674 			}
  1675 		}
  1676 
  1677 	// 16) Call API to get the state of a long latency resource 'n' times, call API to modify the state of
  1678 	//     a long latency resource 'm' times. 
  1679 	//     Call the API to cancel the get operations with resource qualifier.
  1680 	//     Wait for the operations to complete. Check the state of the associated TRequestStatus objects.
  1681 	gTest.Printf(_L("TestGetSetResourceStateOps, starting test %d\n"),testNo++);
  1682 	for(i=0;i<KLoopVarN;i++)
  1683 		{
  1684 		gChannel.GetResourceState(getReqStatus[i],gLongLatencyResource,cached,&readValue,&levelOwnerId);
  1685 		}
  1686 	for(i=0;i<KLoopVarM;i++)
  1687 		{
  1688 		gChannel.ChangeResourceState(setReqStatus[i],gLongLatencyResource,(readValue + gAsyncResStateDelta));
  1689 		}
  1690 	gChannel.CancelGetResourceStateRequests(gLongLatencyResource);
  1691 	for(i=0;i<KLoopVarN;i++)
  1692 		{
  1693 		User::WaitForRequest(getReqStatus[i]);
  1694 		if((r=getReqStatus[i].Int()) != KErrCancel)
  1695 			{
  1696 			gTest.Printf(_L("TestGetSetResourceStateOps, cancelled get state status[%d] = %d\n"),i,r);
  1697 			return r;
  1698 			}
  1699 		}
  1700 	for(i=0;i<KLoopVarM;i++)
  1701 		{
  1702 		User::WaitForRequest(setReqStatus[i]);
  1703 		if((r=setReqStatus[i].Int()) != KErrNone)
  1704 			{
  1705 			gTest.Printf(_L("TestGetSetResourceStateOps, completed  change state status[%d] = %d\n"),i,r);
  1706 			return r;
  1707 			}
  1708 		}
  1709 
  1710 	// 17) Call API to get the state of a long latency resource 'n' times, call API to modify the state of
  1711 	//     a long latency resource 'm' times. 
  1712 	//     Call the API to cancel the modify operations with resource qualifier.
  1713 	//     Wait for the get operations to complete. Check the state of the associated TRequestStatus objects.
  1714 	gTest.Printf(_L("TestGetSetResourceStateOps, starting test %d\n"),testNo++);
  1715 	for(i=0;i<KLoopVarN;i++)
  1716 		{
  1717 		gChannel.GetResourceState(getReqStatus[i],gLongLatencyResource,cached,&readValue,&levelOwnerId);
  1718 		}
  1719 	for(i=0;i<KLoopVarM;i++)
  1720 		{
  1721 		gChannel.ChangeResourceState(setReqStatus[i],gLongLatencyResource,(readValue + gAsyncResStateDelta));
  1722 		}
  1723 	gChannel.CancelChangeResourceStateRequests(gLongLatencyResource);
  1724 	for(i=0;i<KLoopVarN;i++)
  1725 		{
  1726 		User::WaitForRequest(getReqStatus[i]);
  1727 		if((r=getReqStatus[i].Int()) != KErrNone)
  1728 			{
  1729 			gTest.Printf(_L("TestGetSetResourceStateOps, completed get state status[%d] = %d\n"),i,r);
  1730 			return r;
  1731 			}
  1732 		}
  1733 	for(i=0;i<KLoopVarM;i++)
  1734 		{
  1735 		User::WaitForRequest(setReqStatus[i]);
  1736 		if((r=setReqStatus[i].Int()) != KErrCancel)
  1737 			{
  1738 			gTest.Printf(_L("TestGetSetResourceStateOps, cancelled change state status[%d] = %d\n"),i,r);
  1739 			return r;
  1740 			}
  1741 		}
  1742 
  1743 	// 18) Call API to get the state of a long latency resource 'n' times, call API to modify the state of
  1744 	//     a long latency resource 'm' times. Wait for the get operations to complete. 
  1745 	//     Call the API to cancel the get operations with resource qualifier. Check the state of the associated TRequestStatus objects.
  1746 	gTest.Printf(_L("TestGetSetResourceStateOps, starting test %d\n"),testNo++);
  1747 	for(i=0;i<KLoopVarN;i++)
  1748 		{
  1749 		gChannel.GetResourceState(getReqStatus[i],gLongLatencyResource,cached,&readValue,&levelOwnerId);
  1750 		}
  1751 	TInt flipper = -1;
  1752 	for(i=0;i<KLoopVarM;i++)
  1753 		{
  1754 		gChannel.ChangeResourceState(setReqStatus[i],gLongLatencyResource,(readValue + (flipper*gAsyncResStateDelta)));
  1755 		flipper*=-1;
  1756 		}
  1757 	for(i=0;i<KLoopVarN;i++)
  1758 		{
  1759 		User::WaitForRequest(getReqStatus[i]);
  1760 		if((r=getReqStatus[i].Int()) != KErrNone)
  1761 			{
  1762 			gTest.Printf(_L("TestGetSetResourceStateOps, completed get state status[%d] = %d\n"),i,r);
  1763 			return r;
  1764 			}
  1765 		}
  1766 	gChannel.CancelGetResourceStateRequests(gLongLatencyResource);
  1767 	for(i=0;i<KLoopVarM;i++)
  1768 		{
  1769 		User::WaitForRequest(setReqStatus[i]);
  1770 		if((r=setReqStatus[i].Int()) != KErrNone)
  1771 			{
  1772 			gTest.Printf(_L("TestGetSetResourceStateOps, completed change state status[%d]= %d\n"),i,r);
  1773 			return r;
  1774 			}
  1775 		}
  1776 	for(i=0;i<KLoopVarN;i++)
  1777 		{
  1778 		if((r=getReqStatus[i].Int()) != KErrNone)
  1779 			{
  1780 			gTest.Printf(_L("TestGetSetResourceStateOps, completed-then-cancelled get state status[%d]= %d\n"),i,r);
  1781 			return r;
  1782 			}
  1783 		}
  1784 
  1785 	// 19) Call API to get the state of a long latency resource 'n' times, call API to modify the state of
  1786 	//     a long latency resource 'm' times. Wait for the modify operations to complete. Call the API to cancel the modify
  1787 	//     operations with resource qualifier. Check the state of the associated TRequestStatus objects.
  1788 	gTest.Printf(_L("TestGetSetResourceStateOps, starting test %d\n"),testNo++);
  1789 	for(i=0;i<KLoopVarN;i++)
  1790 		{
  1791 		gChannel.GetResourceState(getReqStatus[i],gLongLatencyResource,cached,&readValue,&levelOwnerId);
  1792 		}
  1793 	for(i=0;i<KLoopVarM;i++)
  1794 		{
  1795 		gChannel.ChangeResourceState(setReqStatus[i],gLongLatencyResource,(readValue + gAsyncResStateDelta));
  1796 		}
  1797 	for(i=0;i<KLoopVarM;i++)
  1798 		{
  1799 		User::WaitForRequest(setReqStatus[i]);
  1800 		if((r=setReqStatus[i].Int()) != KErrNone)
  1801 			{
  1802 			gTest.Printf(_L("TestGetSetResourceStateOps, completed change state status[%d] = %d\n"),i,r);
  1803 			return r;
  1804 			}
  1805 		}
  1806 	gChannel.CancelChangeResourceStateRequests(gLongLatencyResource);
  1807 	for(i=0;i<KLoopVarN;i++)
  1808 		{
  1809 		User::WaitForRequest(getReqStatus[i]);
  1810 		if((r=getReqStatus[i].Int()) != KErrNone)
  1811 			{
  1812 			gTest.Printf(_L("TestGetSetResourceStateOps, completed get state status[%d] = %d\n"),i,r);
  1813 			return r;
  1814 			}
  1815 		}
  1816 	for(i=0;i<KLoopVarM;i++)
  1817 		{
  1818 		if((r=setReqStatus[i].Int()) != KErrNone)
  1819 			{
  1820 			gTest.Printf(_L("TestGetSetResourceStateOps, cancelled change state status[%d] = %d\n"),i,r);
  1821 			return r;
  1822 			}
  1823 		}
  1824 
  1825 	// 20) Call API to get the state of a long latency resource 'n' times, call API to modify the state of a long latency resource 'm' times.
  1826 	//     Then call API without operation-type qualifier to cancel the even-numbered modify request(s).
  1827 	//     Then call API with operation-type qualifier to cancel the even-numbered get request(s).
  1828 	//     Check the state of the associated TRequestStatus objects.
  1829 	gTest.Printf(_L("TestGetSetResourceStateOps, starting test %d\n"),testNo++);
  1830 	for(i=0;i<KLoopVarN;i++)
  1831 		{
  1832 		gChannel.GetResourceState(getReqStatus[i],gLongLatencyResource,cached,&readValue,&levelOwnerId);
  1833 		}
  1834 	for(i=0;i<KLoopVarM;i++)
  1835 		{
  1836 		gChannel.ChangeResourceState(setReqStatus[i],gLongLatencyResource,(readValue + gAsyncResStateDelta));
  1837 		}
  1838 	for(i=0;i<KLoopVarM;i+=2)
  1839 		{
  1840 		gChannel.CancelAsyncOperation(&(setReqStatus[i]));
  1841 		}
  1842 	for(i=0;i<KLoopVarN;i+=2)
  1843 		{
  1844 		r=gChannel.CancelGetResourceState(getReqStatus[i]);
  1845 		if(r!=KErrNone)
  1846 			{
  1847 			gTest.Printf(_L("TestGetSetResourceStateOps, CancelGetResourceState for index %d returned %d\n"),i,r);
  1848 			return r;
  1849 			}
  1850 		}
  1851 	for(i=0;i<KLoopVarM;i++)
  1852 		{
  1853 		User::WaitForRequest(setReqStatus[i]);
  1854 		if((r=setReqStatus[i].Int()) != KErrCancel)
  1855 			{
  1856 			gTest.Printf(_L("TestGetSetResourceStateOps, cancelled change state status[%d] = %d\n"),i,r);
  1857 			return r;
  1858 			}
  1859 		if(++i >= KLoopVarM)
  1860 			break;
  1861 		User::WaitForRequest(setReqStatus[i]);
  1862 		if((r=setReqStatus[i].Int()) != KErrNone)
  1863 			{
  1864 			gTest.Printf(_L("TestGetSetResourceStateOps, completed change state status[%d] = %d\n"),i,r);
  1865 			return r;
  1866 			}
  1867 		}
  1868 	for(i=0;i<KLoopVarN;i++)
  1869 		{
  1870 		User::WaitForRequest(getReqStatus[i]);
  1871 		if((r=getReqStatus[i].Int()) != KErrCancel)
  1872 			{
  1873 			gTest.Printf(_L("TestGetSetResourceStateOps, cancelled get state status[%d] = %d\n"),i,r);
  1874 			return r;
  1875 			}
  1876 		if(++i >= KLoopVarN)
  1877 			break;
  1878 		User::WaitForRequest(getReqStatus[i]);
  1879 		if((r=getReqStatus[i].Int()) != KErrNone)
  1880 			{
  1881 			gTest.Printf(_L("TestGetSetResourceStateOps, completed get state status[%d] = %d\n"),i,r);
  1882 			return r;
  1883 			}
  1884 		}	
  1885 	return KErrNone;
  1886 	}
  1887 
  1888 
  1889 //----------------------------------------------------------------------------------------------
  1890 //! @SYMTestCaseID      KBASE-T_RESMANUS-0611
  1891 //! @SYMTestType        UT
  1892 //! @SYMPREQ            PREQ1398
  1893 //! @SYMTestCaseDesc    This test case tests APIs for regulating getting and setting the state of resources 
  1894 //! 
  1895 //! @SYMTestActions     0) Issue the maximum number (requested in the call to the Initialise API)
  1896 //!						of requests to get the current state of a resource. Then issue one further request.
  1897 //!
  1898 //!						1) Issue the maximum number (requested in the call to the Initialise API) of 
  1899 //!						requests to set the current state of a resource. Then issue one further request.
  1900 //!
  1901 //! @SYMTestExpectedResults 0) Test that the TRequestStatus object associated with the last request
  1902 //!							exhibits status code KErrUnderflow - exit otherwise. Test that the 
  1903 //!							TRequestStatus objects associated with the preceding requests exhibit 
  1904 //!							status code KErrNone - exit otherwise.
  1905 //!
  1906 //!							1) Test that the TRequestStatus object associated with the last request
  1907 //!							exhibits status code KErrUnderflow - exit otherwise. Test that the 
  1908 //!							TRequestStatus objects associated with the preceding requests exhibit 
  1909 //!							status code KErrNone - exit otherwise.
  1910 //!
  1911 //! @SYMTestPriority        High
  1912 //! @SYMTestStatus          Implemented
  1913 //----------------------------------------------------------------------------------------------
  1914 LOCAL_C TInt TestGetSetResourceStateQuota()
  1915 //
  1916 // Test resource state access quota management
  1917 //
  1918 	{
  1919 	TUint resourceId;
  1920 
  1921 	// To perform the quota test we need a long latency resource
  1922 	// If one has not been defined alert the user and return
  1923 	if(!gHaveAsyncRes)
  1924 		{
  1925 		gTest.Printf(_L("TestGetSetResourceStateQuota: don't have suitable asynchronous resource ... exiting\n"));
  1926 		return KErrNone;
  1927 		}
  1928 	else
  1929 		resourceId = gLongLatencyResource;
  1930 
  1931 	TInt r = KErrNone;
  1932 	TBool lastErr = KErrNone;
  1933 
  1934 	TInt i = 0;
  1935 	TRequestStatus status[MAX_NUM_REQUESTS];
  1936 	TInt state[MAX_NUM_REQUESTS];
  1937 	TBool cached = gUseCached;
  1938 	TInt levelOwnerId = 0;
  1939 
  1940 	//
  1941 	//	Test GetResourceState - check client can not exceed quota of requests
  1942 	//
  1943     gTest.Printf(_L("**Test GetResourceState (quota management)\n"));
  1944 
  1945 	// KNoOfGetStateRequests Get state requests (of the same resource, ID=1) to consume the client quota
  1946 	for(i=0; i<KNoOfGetStateRequests; i++)
  1947 		gChannel.GetResourceState(status[i],resourceId,cached,&(state[i]),&levelOwnerId);
  1948 
  1949 	// Addition Get state request to exceed the quota - the provided TRequestStatus
  1950 	// object should indicate KErrUnderflow
  1951 	gChannel.GetResourceState(status[KNoOfGetStateRequests],resourceId,cached,&(state[KNoOfGetStateRequests]),&levelOwnerId);
  1952 	User::WaitForRequest(status[KNoOfGetStateRequests]);
  1953 	if(status[KNoOfGetStateRequests].Int() != KErrUnderflow)
  1954 		{
  1955 		gTest.Printf(_L("TestGetSetResourceStateQuota, extra get state returned %d\n"),r);
  1956 		return r;
  1957 		}
  1958 
  1959 	// Need to check the TRequestStatus objects
  1960 	for(i=0; i<KNoOfGetStateRequests; i++)
  1961 		{
  1962 		User::WaitForRequest(status[i]);
  1963 		if((r=status[i].Int()) != KErrNone)
  1964 			{
  1965 			gTest.Printf(_L("TestGetSetResourceStateQuota, get state %d returned %d\n"),i, r);
  1966 			lastErr = r;
  1967 			}
  1968 		}
  1969 	if(lastErr != KErrNone)
  1970 		return lastErr;
  1971 
  1972 	//
  1973 	//	Test ChangeResourceState - check client can not exceed quota of requests
  1974 	//
  1975     gTest.Printf(_L("**Test ChangeResourceState (quota management)\n"));
  1976 
  1977 	// KNoOfSetStateRequests Set state requests (of the same resource, ID=1) to consume the client quota
  1978 	TInt newState = (state[1])+1;
  1979 	for(i=0; i<KNoOfSetStateRequests; i++)
  1980 		{
  1981 		gChannel.ChangeResourceState(status[i],resourceId,newState);
  1982 		}
  1983 
  1984 	// Addition Set state request to exceed the quota - the provided TRequestStatus
  1985 	// object should indicate KErrUnderflow
  1986 	gChannel.ChangeResourceState(status[KNoOfSetStateRequests],resourceId,newState);
  1987 	User::WaitForRequest(status[KNoOfSetStateRequests]);
  1988 	if(status[KNoOfSetStateRequests].Int() != KErrUnderflow)
  1989 		{
  1990 		gTest.Printf(_L("TestGetSetResourceStateQuota, extra set state returned %d\n"),r);
  1991 		return r;
  1992 		}
  1993 
  1994 	// Need to check the TRequestStatus objects
  1995 	for(i=0; i<KNoOfSetStateRequests; i++)
  1996 		{
  1997 		User::WaitForRequest(status[i]);
  1998 		if((r=status[i].Int()) != KErrNone)
  1999 			{
  2000 			gTest.Printf(_L("TestGetSetResourceStateQuota, set state %d returned %d\n"),i, r);
  2001 			lastErr = r;
  2002 			}
  2003 		}
  2004 	if(lastErr != KErrNone)
  2005 		return lastErr;
  2006 
  2007 	return r;
  2008 	}
  2009 
  2010 
  2011 LOCAL_C TInt TriggerNotification(TRequestStatus& aStatus, TUint aResourceId, TBool aCached, TInt aDelta)
  2012 //
  2013 // Support the notification tests - cause a notification for the specified resource
  2014 //
  2015 	{
  2016 	TInt r = KErrNone;
  2017 	TInt readValue = 0;
  2018 	TInt levelOwnerId = 0;
  2019 	// Get initial state
  2020 	gChannel.GetResourceState(aStatus,aResourceId,aCached,&readValue,&levelOwnerId);
  2021 	User::WaitForRequest(aStatus);
  2022 	if(aStatus.Int() != KErrNone)
  2023 		{
  2024 		r=aStatus.Int();
  2025 		gTest.Printf(_L("TriggerNotification, get state returned %d\n"),r);
  2026 		return r;
  2027 		}
  2028 	TUint startingLevel = (TUint)readValue;
  2029 
  2030 	// Write updated state
  2031 	TUint newLevel = (TUint)(readValue + aDelta);
  2032 	gTest.Printf(_L("TriggerNotification: startingLevel=0x%x, writing 0x%x\n"), startingLevel, newLevel);
  2033 	gChannel.ChangeResourceState(aStatus,aResourceId,newLevel);
  2034 	User::WaitForRequest(aStatus);
  2035 	if(aStatus.Int() != KErrNone)
  2036 		{
  2037 		r=aStatus.Int();
  2038 		gTest.Printf(_L("TriggerNotification, change state returned %d\n"),r);
  2039 		return r;
  2040 		}
  2041 
  2042 	return r;
  2043 	}
  2044 
  2045 
  2046 LOCAL_C TInt CalcNotifyDirAndThr(TRequestStatus& aStatus, TUint aResourceId, TBool aCached, TInt& aThreshold, TBool& aDirection)
  2047 //
  2048 // Support the notification tests - determine an appropriate threshold and direction to request
  2049 //
  2050 	{
  2051 	__KHEAP_MARK;
  2052 
  2053 	// Need to know current state
  2054 	TInt r = KErrNone;
  2055 	TInt readValue = 0;
  2056 	TInt levelOwnerId = 0;
  2057 		{
  2058 		gChannel.GetResourceState(aStatus,aResourceId,aCached,&readValue,&levelOwnerId);
  2059 		User::WaitForRequest(aStatus);
  2060 		if(aStatus.Int() != KErrNone)
  2061 			{
  2062 			r=aStatus.Int();
  2063 			gTest.Printf(_L("TestNotificationOps, pre-qualified notify get state returned %d\n"),r);
  2064 			return r;
  2065 			}
  2066 		}
  2067 	aThreshold = readValue + gAsyncResStateDelta;
  2068 	aDirection=(gAsyncResStateDelta>0)?ETrue:EFalse;
  2069 
  2070 	__KHEAP_MARKEND;
  2071 
  2072 	return r;
  2073 	}
  2074 
  2075 
  2076 //----------------------------------------------------------------------------------------------
  2077 //! @SYMTestCaseID      KBASE-T_RESMANUS-0612
  2078 //! @SYMTestType        UT
  2079 //! @SYMPREQ            PREQ1398
  2080 //! @SYMTestCaseDesc    This test case tests APIs for requesting both qualified and unqualified
  2081 //!						notifications; it also tests APIs to cancel such requests. 
  2082 //! 
  2083 //! @SYMTestActions     0) Call API to request notification of an unqualified change in resource
  2084 //!						state for a selected resource. Trigger a state change.
  2085 //!
  2086 //!						1) Call API to request notification of a qualified change in resource
  2087 //!						state for a selected resource. Trigger a state change.
  2088 //!	
  2089 //!						2) Call API to request notification of an unqualified change in resource
  2090 //!						state for a selected resource. Then call API to cancel all notifications for the resource.
  2091 //!
  2092 //!						3) Call API to request notification of a qualified change in resource 
  2093 //!						state for a selected resource. Then call API to cancel all notifications for the resource.
  2094 //!
  2095 //!						4) Call API to request notification of an unqualified change in resource 
  2096 //!						state for a selected resource. Trigger a state change. Then call API to cancel all
  2097 //!						notifications for the resource.
  2098 //!
  2099 //!						5) Call API to request notification of a qualified change in resource 
  2100 //!						state for a selected resource. Trigger a state change. Then call API to cancel all
  2101 //!						notifications for the resource.
  2102 //!
  2103 //!						6) Call API to request notification of an unqualified change in resource
  2104 //!						state for a selected resource. Then call API to cancel the notification request
  2105 //!
  2106 //!						7) Call API to request notification of a qualified change in resource 
  2107 //!						state for a selected resource. Then call API to cancel the notification request
  2108 //!
  2109 //!						8) Call API to request notification of an unqualified change in resource 
  2110 //!						state for a selected resource. Trigger a state change. Then call API to cancel the
  2111 //!						notification request
  2112 //!
  2113 //!						9) Call API to request notification of a qualified change in resource 
  2114 //!						state for a selected resource. Trigger a state change. Then call API to cancel the
  2115 //!						notification request
  2116 //!
  2117 //!						10) Call API to request notification of an unqualified change in resource
  2118 //!						state for a selected resource. Then call API to cancel generic async request
  2119 //!
  2120 //!						11) Call API to request notification of a qualified change in resource 
  2121 //!						state for a selected resource. Then call API to cancel generic async request
  2122 //!
  2123 //!						12) Call API to request notification of an unqualified change in resource 
  2124 //!						state for a selected resource. Trigger a state change. Then call API to cancel
  2125 //!						generic async request
  2126 //!
  2127 //!						13) Call API to request notification of a qualified change in resource 
  2128 //!						state for a selected resource. Trigger a state change. Then call API to cancel
  2129 //!						generic async request
  2130 //!
  2131 //! @SYMTestExpectedResults 0) The associated TRequestStatus object should indicate KErrNone 
  2132 //!						- exits otherwise.
  2133 //!
  2134 //!						1) The associated TRequestStatus object should indicate KErrNone 
  2135 //!						- exits otherwise.
  2136 //!
  2137 //!						2) The associated TRequestStatus object should indicate KErrCancel 
  2138 //!						- exits otherwise. 
  2139 //!
  2140 //!						3) The associated TRequestStatus object should indicate KErrCancel 
  2141 //!						- exits otherwise. 
  2142 //!
  2143 //!						4) The TRequestStatus object should indicate state KRequestPending until
  2144 //!						the state change is triggered, upon which it should exhibit state 
  2145 //!						KErrNone. After the cancellation it should still exhibit state KErrNone.
  2146 //!						Exit for any deviation from this behaviour.
  2147 //!
  2148 //!						5) The TRequestStatus object should indicate state KRequestPending until
  2149 //!						the state change is triggered, upon which it should exhibit state 
  2150 //!						KErrNone. After the cancellation it should still exhibit state KErrNone.
  2151 //!						Exit for any deviation from this behaviour.
  2152 //!
  2153 //!						6) The associated TRequestStatus object should indicate KErrCancel 
  2154 //!						- exits otherwise. 
  2155 //!
  2156 //!						7) The associated TRequestStatus object should indicate KErrCancel 
  2157 //!						- exits otherwise. 
  2158 //!
  2159 //!						8) The TRequestStatus object should indicate state KRequestPending until
  2160 //!						the state change is triggered, upon which it should exhibit state 
  2161 //!						KErrNone. After the cancellation it should still exhibit state KErrNone.
  2162 //!						Exit for any deviation from this behaviour.
  2163 //!
  2164 //!						9) The TRequestStatus object should indicate state KRequestPending until
  2165 //!						the state change is triggered, upon which it should exhibit state 
  2166 //!						KErrNone. After the cancellation it should still exhibit state KErrNone.
  2167 //!						Exit for any deviation from this behaviour.
  2168 //!
  2169 //!						10) The associated TRequestStatus object should indicate KErrCancel 
  2170 //!						- exits otherwise. 
  2171 //!
  2172 //!						11) The associated TRequestStatus object should indicate KErrCancel 
  2173 //!						- exits otherwise. 
  2174 //!
  2175 //!						12) The TRequestStatus object should indicate state KRequestPending until
  2176 //!						the state change is triggered, upon which it should exhibit state 
  2177 //!						KErrNone. After the cancellation it should still exhibit state KErrNone.
  2178 //!						Exit for any deviation from this behaviour.
  2179 //!
  2180 //!						13) The TRequestStatus object should indicate state KRequestPending until
  2181 //!						the state change is triggered, upon which it should exhibit state 
  2182 //!						KErrNone. After the cancellation it should still exhibit state KErrNone.
  2183 //!						Exit for any deviation from this behaviour.
  2184 //!
  2185 //! @SYMTestPriority        High
  2186 //! @SYMTestStatus          Implemented
  2187 //----------------------------------------------------------------------------------------------
  2188 LOCAL_C TInt TestNotificationOps()
  2189 //
  2190 // Test notification methods
  2191 //
  2192 	{
  2193 	__KHEAP_MARK;
  2194 
  2195 	TInt r = KErrNone;
  2196 	TRequestStatus status;
  2197 	TUint resourceId;
  2198 	TInt stateDelta;
  2199 	if(!gHaveAsyncRes)
  2200 		{
  2201 		resourceId = 2; // Arbitrary
  2202 		stateDelta = 1; // Arbitrary
  2203 		}
  2204 	else
  2205 		{
  2206 		resourceId = gLongLatencyResource;
  2207 		stateDelta = gAsyncResStateDelta;
  2208 		}
  2209 	TInt testIndex = 0;
  2210 
  2211 	// 0) Call API to request notification of an unqualified change in resource
  2212 	//    state for a selected resource. Trigger a state change.
  2213 	gTest.Printf(_L("TestNotificationOps: starting test %d\n"),testIndex++);
  2214 	gChannel.RequestNotification(status, resourceId);
  2215 	if(status.Int() != KRequestPending)
  2216 		{
  2217 		gTest.Printf(_L("TestNotificationOps: status=%d\n"),status.Int());
  2218 		return KErrGeneral;
  2219 		}
  2220 	TBool cached = gUseCached;
  2221 	TRequestStatus triggerStatus;
  2222 	if((r=TriggerNotification(triggerStatus, resourceId, cached, stateDelta))!=KErrNone)
  2223 		return r;
  2224 	User::WaitForRequest(status);
  2225 	if(status.Int()!=KErrNone)
  2226 		{
  2227 		gTest.Printf(_L("TestNotificationOps: after TriggerNotification status = %d\n"),status.Int());
  2228 		return r;
  2229 		}
  2230 
  2231 	// 1) Call API to request notification of a qualified change in resource
  2232 	//    state for a selected resource. Trigger a state change.
  2233 	gTest.Printf(_L("TestNotificationOps: starting test %d\n"),testIndex++);
  2234 	TInt dumThreshold=0;
  2235 	TBool dumDirection=EFalse;
  2236 	if((r=CalcNotifyDirAndThr(status, resourceId, cached, dumThreshold, dumDirection))!=KErrNone)
  2237 		return r;
  2238 	gChannel.RequestNotification(status, resourceId, dumThreshold, dumDirection);
  2239 	if(status.Int() != KRequestPending)
  2240 		{
  2241 		gTest.Printf(_L("TestNotificationOps: status=%d\n"),status.Int());
  2242 		return KErrGeneral;
  2243 		}
  2244 	// Pass gAsyncResStateDelta as this represents the delta value
  2245 	if((r=TriggerNotification(triggerStatus, resourceId, cached, gAsyncResStateDelta))!=KErrNone)
  2246 		return r;
  2247 	User::WaitForRequest(status);
  2248 	if(status.Int()!=KErrNone)
  2249 		{
  2250 		gTest.Printf(_L("TestNotificationOps: after TriggerNotification status = %d\n"),status.Int());
  2251 		return r;
  2252 		}
  2253 
  2254 	// 2) Call API to request notification of an unqualified change in resource
  2255 	//    state for a selected resource. Then call API to cancel all notifications for the resource.
  2256 	gTest.Printf(_L("TestNotificationOps: starting test %d\n"),testIndex++);
  2257 	gChannel.RequestNotification(status, resourceId);
  2258 	if(status.Int() != KRequestPending)
  2259 		{
  2260 		gTest.Printf(_L("TestNotificationOps: status=%d\n"),status.Int());
  2261 		return KErrGeneral;
  2262 		}
  2263 	r=gChannel.CancelNotificationRequests(resourceId);
  2264 	if(r!=KErrNone)
  2265 		{
  2266 		gTest.Printf(_L("TestNotificationOps, CancelNotificationRequests returned %d\n"),r);
  2267 		return r;
  2268 		}
  2269 	User::WaitForRequest(status);
  2270 	if(status.Int()!=KErrCancel)
  2271 		{
  2272 		gTest.Printf(_L("TestNotificationOps: after cancel basic request status = %d\n"),status.Int());
  2273 		return r;
  2274 		}
  2275 
  2276 	// 3) Call API to request notification of a qualified change in resource 
  2277 	//    state for a selected resource. Then call API to cancel all notifications for the resource.
  2278 	gTest.Printf(_L("TestNotificationOps: starting test %d\n"),testIndex++);
  2279 	dumThreshold = 0;			// Arbitrary
  2280 	dumDirection = ETrue;		// Arbitrary
  2281 	if((r=CalcNotifyDirAndThr(status, resourceId, cached, dumThreshold, dumDirection))!=KErrNone)
  2282 		return r;
  2283 	gChannel.RequestNotification(status, resourceId, dumThreshold, dumDirection);
  2284 	if(status.Int() != KRequestPending)
  2285 		{
  2286 		gTest.Printf(_L("TestNotificationOps: status=%d\n"),status.Int());
  2287 		return KErrGeneral;
  2288 		}
  2289 	r=gChannel.CancelNotificationRequests(resourceId);
  2290 	if(r!=KErrNone)
  2291 		{
  2292 		gTest.Printf(_L("TestNotificationOps, CancelNotificationRequests (qualified) returned %d\n"),r);
  2293 		return r;
  2294 		}
  2295 	User::WaitForRequest(status);
  2296 	if(status.Int()!=KErrCancel)
  2297 		{
  2298 		gTest.Printf(_L("TestNotificationOps: after qualified request cancel status = %d\n"),status.Int());
  2299 		return r;
  2300 		}
  2301 
  2302 	// 4) Call API to request notification of an unqualified change in resource 
  2303 	//    state for a selected resource. Trigger a state change. Then call API to cancel all
  2304 	//    notifications for the resource.
  2305 	gTest.Printf(_L("TestNotificationOps: starting test %d\n"),testIndex++);
  2306 	gChannel.RequestNotification(status, resourceId);
  2307 	if(status.Int() != KRequestPending)
  2308 		{
  2309 		gTest.Printf(_L("TestNotificationOps: status=%d\n"),status.Int());
  2310 		return KErrGeneral;
  2311 		}
  2312 	// Pass gAsyncResStateDelta as this represents the delta value
  2313 	if((r=TriggerNotification(triggerStatus, resourceId, cached, gAsyncResStateDelta))!=KErrNone)
  2314 		return r;
  2315 	User::WaitForRequest(status);
  2316 	if(status.Int()!=KErrNone)
  2317 		{
  2318 		gTest.Printf(_L("TestNotificationOps: trigger basic request before cancel, status = %d\n"),status.Int());
  2319 		return r;
  2320 		}
  2321 	r=gChannel.CancelNotificationRequests(resourceId);
  2322 	if(r!=KErrNone)
  2323 		{
  2324 		gTest.Printf(_L("TestNotificationOps, CancelNotificationRequests returned %d\n"),r);
  2325 		return r;
  2326 		}
  2327 	if(status.Int()!=KErrNone)
  2328 		{
  2329 		gTest.Printf(_L("TestNotificationOps: after cancel (completed) basic request status = %d\n"),status.Int());
  2330 		return r;
  2331 		}
  2332 
  2333 	// 5) Call API to request notification of a qualified change in resource 
  2334 	//    state for a selected resource. Trigger a state change. Then call API to cancel all
  2335 	//    notifications for the resource.
  2336 	gTest.Printf(_L("TestNotificationOps: starting test %d\n"),testIndex++);
  2337 	if((r=CalcNotifyDirAndThr(status, resourceId, cached, dumThreshold, dumDirection))!=KErrNone)
  2338 		return r;
  2339 	gChannel.RequestNotification(status, resourceId, dumThreshold, dumDirection);
  2340 	if(status.Int() != KRequestPending)
  2341 		{
  2342 		gTest.Printf(_L("TestNotificationOps: status=%d\n"),status.Int());
  2343 		return KErrGeneral;
  2344 		}
  2345 	// Pass gAsyncResStateDelta as this represents the delta value
  2346 	if((r=TriggerNotification(triggerStatus, resourceId, cached, gAsyncResStateDelta))!=KErrNone)
  2347 		return r;
  2348 	User::WaitForRequest(status);
  2349 	if(status.Int()!=KErrNone)
  2350 		{
  2351 		gTest.Printf(_L("TestNotificationOps: trigger qualified request before cancel, status = %d\n"),status.Int());
  2352 		return r;
  2353 		}
  2354 	r=gChannel.CancelNotificationRequests(resourceId);
  2355 	if(r!=KErrNone)
  2356 		{
  2357 		gTest.Printf(_L("TestNotificationOps, CancelNotificationRequests (qualified) returned %d\n"),r);
  2358 		return r;
  2359 		}
  2360 	if(status.Int()!=KErrNone)
  2361 		{
  2362 		gTest.Printf(_L("TestNotificationOps: after cancel (completed) qualified request status = %d\n"),status.Int());
  2363 		return r;
  2364 		}
  2365 
  2366 	// 6) Call API to request notification of an unqualified change in resource
  2367 	//    state for a selected resource. Then call API to cancel the notification request
  2368 	gTest.Printf(_L("TestNotificationOps: starting test %d\n"),testIndex++);
  2369 	gChannel.RequestNotification(status, resourceId);
  2370 	if(status.Int() != KRequestPending)
  2371 		{
  2372 		gTest.Printf(_L("TestNotificationOps: status=%d\n"),status.Int());
  2373 		return KErrGeneral;
  2374 		}
  2375 	r=gChannel.CancelRequestNotification(status);
  2376 	if(r!=KErrNone)
  2377 		{
  2378 		gTest.Printf(_L("TestNotificationOps, CancelNotificationRequests returned %d\n"),r);
  2379 		return r;
  2380 		}
  2381 	User::WaitForRequest(status);
  2382 	if(status.Int()!=KErrCancel)
  2383 		{
  2384 		gTest.Printf(_L("TestNotificationOps: after cancel basic request status = %d\n"),status.Int());
  2385 		return r;
  2386 		}
  2387 
  2388 	// 7) Call API to request notification of a qualified change in resource 
  2389 	//    state for a selected resource. Then call API to cancel the notification request
  2390 	gTest.Printf(_L("TestNotificationOps: starting test %d\n"),testIndex++);
  2391 	dumThreshold = 0;			// Arbitrary
  2392 	dumDirection = ETrue;		// Arbitrary
  2393 	if((r=CalcNotifyDirAndThr(status, resourceId, cached, dumThreshold, dumDirection))!=KErrNone)
  2394 		return r;
  2395 	gChannel.RequestNotification(status, resourceId, dumThreshold, dumDirection);
  2396 	if(status.Int() != KRequestPending)
  2397 		{
  2398 		gTest.Printf(_L("TestNotificationOps: status=%d\n"),status.Int());
  2399 		return KErrGeneral;
  2400 		}
  2401 	r=gChannel.CancelRequestNotification(status);
  2402 	if(r!=KErrNone)
  2403 		{
  2404 		gTest.Printf(_L("TestNotificationOps, CancelNotificationRequests (qualified) returned %d\n"),r);
  2405 		return r;
  2406 		}
  2407 	User::WaitForRequest(status);
  2408 	if(status.Int()!=KErrCancel)
  2409 		{
  2410 		gTest.Printf(_L("TestNotificationOps: after qualified request cancel status = %d\n"),status.Int());
  2411 		return r;
  2412 		}
  2413 
  2414 	// 8) Call API to request notification of an unqualified change in resource 
  2415 	//    state for a selected resource. Trigger a state change. Then call API to cancel the
  2416 	//    notification request
  2417 	gTest.Printf(_L("TestNotificationOps: starting test %d\n"),testIndex++);
  2418 	gChannel.RequestNotification(status, resourceId);
  2419 	if(status.Int() != KRequestPending)
  2420 		{
  2421 		gTest.Printf(_L("TestNotificationOps: status=%d\n"),status.Int());
  2422 		return KErrGeneral;
  2423 		}
  2424 	// Pass gAsyncResStateDelta as this represents the delta value
  2425 	if((r=TriggerNotification(triggerStatus, resourceId, cached, gAsyncResStateDelta))!=KErrNone)
  2426 		return r;
  2427 	User::WaitForRequest(status);
  2428 	if(status.Int()!=KErrNone)
  2429 		{
  2430 		gTest.Printf(_L("TestNotificationOps: trigger basic request before cancel, status = %d\n"),status.Int());
  2431 		return r;
  2432 		}
  2433 	r=gChannel.CancelRequestNotification(status);
  2434 	if(r!=KErrNone)
  2435 		{
  2436 		gTest.Printf(_L("TestNotificationOps, CancelNotificationRequests returned %d\n"),r);
  2437 		return r;
  2438 		}
  2439 	if(status.Int()!=KErrNone)
  2440 		{
  2441 		gTest.Printf(_L("TestNotificationOps: after cancel (completed) basic request status = %d\n"),status.Int());
  2442 		return r;
  2443 		}
  2444 
  2445 	// 9) Call API to request notification of a qualified change in resource 
  2446 	//    state for a selected resource. Trigger a state change. Then call API to cancel the
  2447 	//    notification request
  2448 	gTest.Printf(_L("TestNotificationOps: starting test %d\n"),testIndex++);
  2449 	if((r=CalcNotifyDirAndThr(status, resourceId, cached, dumThreshold, dumDirection))!=KErrNone)
  2450 		return r;
  2451 	gChannel.RequestNotification(status, resourceId, dumThreshold, dumDirection);
  2452 	if(status.Int() != KRequestPending)
  2453 		{
  2454 		gTest.Printf(_L("TestNotificationOps: status=%d\n"),status.Int());
  2455 		return KErrGeneral;
  2456 		}
  2457 	// Pass gAsyncResStateDelta as this represents the delta value
  2458 	if((r=TriggerNotification(triggerStatus, resourceId, cached, gAsyncResStateDelta))!=KErrNone)
  2459 		return r;
  2460 	User::WaitForRequest(status);
  2461 	if(status.Int()!=KErrNone)
  2462 		{
  2463 		gTest.Printf(_L("TestNotificationOps: trigger qualified request before cancel, status = %d\n"),status.Int());
  2464 		return r;
  2465 		}
  2466 	r=gChannel.CancelRequestNotification(status);
  2467 	if(r!=KErrNone)
  2468 		{
  2469 		gTest.Printf(_L("TestNotificationOps, CancelNotificationRequests (qualified) returned %d\n"),r);
  2470 		return r;
  2471 		}
  2472 	if(status.Int()!=KErrNone)
  2473 		{
  2474 		gTest.Printf(_L("TestNotificationOps: after cancel (completed) qualified request status = %d\n"),status.Int());
  2475 		return r;
  2476 		}
  2477 
  2478 
  2479 	// 10) Call API to request notification of an unqualified change in resource
  2480 	//     state for a selected resource. Then call API to cancel generic async request
  2481 	gTest.Printf(_L("TestNotificationOps: starting test %d\n"),testIndex++);
  2482 	gChannel.RequestNotification(status, resourceId);
  2483 	if(status.Int() != KRequestPending)
  2484 		{
  2485 		gTest.Printf(_L("TestNotificationOps: status=%d\n"),status.Int());
  2486 		return KErrGeneral;
  2487 		}
  2488 	gChannel.CancelAsyncOperation(&status);
  2489 	User::WaitForRequest(status);
  2490 	if(status.Int()!=KErrCancel)
  2491 		{
  2492 		gTest.Printf(_L("TestNotificationOps: after cancel basic request status = %d\n"),status.Int());
  2493 		return r;
  2494 		}
  2495 
  2496 	// 11) Call API to request notification of a qualified change in resource 
  2497 	//     state for a selected resource. Then call API to cancel generic async request
  2498 	gTest.Printf(_L("TestNotificationOps: starting test %d\n"),testIndex++);
  2499 	dumThreshold = 0;			// Arbitrary
  2500 	dumDirection = ETrue;		// Arbitrary
  2501 	if((r=CalcNotifyDirAndThr(status, resourceId, cached, dumThreshold, dumDirection))!=KErrNone)
  2502 		return r;
  2503 	gChannel.RequestNotification(status, resourceId, dumThreshold, dumDirection);
  2504 	if(status.Int() != KRequestPending)
  2505 		{
  2506 		gTest.Printf(_L("TestNotificationOps: status=%d\n"),status.Int());
  2507 		return KErrGeneral;
  2508 		}
  2509 	gChannel.CancelAsyncOperation(&status);
  2510 	User::WaitForRequest(status);
  2511 	if(status.Int()!=KErrCancel)
  2512 		{
  2513 		gTest.Printf(_L("TestNotificationOps: after qualified request cancel status = %d\n"),status.Int());
  2514 		return r;
  2515 		}
  2516 
  2517 	// 12) Call API to request notification of an unqualified change in resource 
  2518 	//     state for a selected resource. Trigger a state change. Then call API to cancel
  2519 	//     generic async request
  2520 	gTest.Printf(_L("TestNotificationOps: starting test %d\n"),testIndex++);
  2521 	gChannel.RequestNotification(status, resourceId);
  2522 	if(status.Int() != KRequestPending)
  2523 		{
  2524 		gTest.Printf(_L("TestNotificationOps: status=%d\n"),status.Int());
  2525 		return KErrGeneral;
  2526 		}
  2527 	// Pass gAsyncResStateDelta as this represents the delta value
  2528 	if((r=TriggerNotification(triggerStatus, resourceId, cached, gAsyncResStateDelta))!=KErrNone)
  2529 		return r;
  2530 	User::WaitForRequest(status);
  2531 	if(status.Int()!=KErrNone)
  2532 		{
  2533 		gTest.Printf(_L("TestNotificationOps: trigger basic request before cancel, status = %d\n"),status.Int());
  2534 		return r;
  2535 		}
  2536 	gChannel.CancelAsyncOperation(&status);
  2537 	if(status.Int()!=KErrNone)
  2538 		{
  2539 		gTest.Printf(_L("TestNotificationOps: after cancel (completed) basic request status = %d\n"),status.Int());
  2540 		return r;
  2541 		}
  2542 
  2543 	// 13) Call API to request notification of a qualified change in resource 
  2544 	//     state for a selected resource. Trigger a state change. Then call API to cancel
  2545 	//     generic async request
  2546 	gTest.Printf(_L("TestNotificationOps: starting test %d\n"),testIndex++);
  2547 	if((r=CalcNotifyDirAndThr(status, resourceId, cached, dumThreshold, dumDirection))!=KErrNone)
  2548 		return r;
  2549 	gChannel.RequestNotification(status, resourceId, dumThreshold, dumDirection);
  2550 	if(status.Int() != KRequestPending)
  2551 		{
  2552 		gTest.Printf(_L("TestNotificationOps: status=%d\n"),status.Int());
  2553 		return KErrGeneral;
  2554 		}
  2555 	// Pass gAsyncResStateDelta as this represents the delta value
  2556 	if((r=TriggerNotification(triggerStatus, resourceId, cached, gAsyncResStateDelta))!=KErrNone)
  2557 		return r;
  2558 	User::WaitForRequest(status);
  2559 	if(status.Int()!=KErrNone)
  2560 		{
  2561 		gTest.Printf(_L("TestNotificationOps: trigger qualified request before cancel, status = %d\n"),status.Int());
  2562 		return r;
  2563 		}
  2564 	gChannel.CancelAsyncOperation(&status);
  2565 	if(status.Int()!=KErrNone)
  2566 		{
  2567 		gTest.Printf(_L("TestNotificationOps: after cancel (completed) qualified request status = %d\n"),status.Int());
  2568 		return r;
  2569 		}
  2570 
  2571 	__KHEAP_MARKEND;
  2572 	
  2573 	return r;
  2574 	}
  2575 
  2576 //----------------------------------------------------------------------------------------------
  2577 //! @SYMTestCaseID      KBASE-T_RESMANUS-0613
  2578 //! @SYMTestType        UT
  2579 //! @SYMPREQ            PREQ1398
  2580 //! @SYMTestCaseDesc    This test case tests quota management for notification operations.
  2581 //! 
  2582 //! @SYMTestActions     0) Issue the maximum number (requested in the call to the Initialise API)
  2583 //!						of requests for notification of unqualified changes to the state of a 
  2584 //!						resource. Then issue one further request.
  2585 //!
  2586 //!						1) Issue the maximum number (requested in the call to the Initialise API)
  2587 //!						of requests for notification of qualified changes to the state of a 
  2588 //!						resource. Then issue one further request.
  2589 //!
  2590 //!						2) Issue the maximum number (requested in the call to the Initialise API)
  2591 //!						of requests for notification changes to the state of a resource, where 
  2592 //!						every odd request is for an unqualified change and every even request is
  2593 //!						for a qualified change. Then issue one further request.
  2594 //!
  2595 //! @SYMTestExpectedResults 0) Test that the TRequestStatus object associated with the last 
  2596 //!							request exhibits status code KErrUnderflow - exit otherwise. Test
  2597 //!							that the TRequestStatus objects associated with the preceding requests
  2598 //!							exhibit status code KErrNone - exit otherwise.
  2599 //!
  2600 //!							1) Test that the TRequestStatus object associated with the last request
  2601 //!							exhibits status code KErrUnderflow - exit otherwise. Test that the 
  2602 //!							TRequestStatus objects associated with the preceding requests exhibit
  2603 //!							status code KErrNone - exit otherwise.
  2604 //!
  2605 //!							2) Test that the TRequestStatus object associated with the last request
  2606 //!							exhibits status code KErrUnderflow - exit otherwise. Test that the 
  2607 //!							TRequestStatus objects associated with the preceding requests exhibit
  2608 //!							status code KErrNone - exit otherwise.
  2609 //!
  2610 //! @SYMTestPriority        High
  2611 //! @SYMTestStatus          Implemented
  2612 //----------------------------------------------------------------------------------------------
  2613 LOCAL_C TInt TestNotificationQuota()
  2614 //
  2615 // Test notification request quota management
  2616 //
  2617 	{
  2618 	__KHEAP_MARK;
  2619 
  2620 	TInt r = KErrNone;
  2621 	TRequestStatus status[MAX_NUM_REQUESTS];
  2622 	TInt loopVar=0;
  2623 	TBool cached = gUseCached;
  2624 	TRequestStatus triggerStatus;
  2625 	TUint resourceId = gLongLatencyResource;
  2626 
  2627 	// Test quota for basic operation
  2628 	//
  2629 	// Loop to perform maximum number of requests, check TRequestStatus objects are pending
  2630 	for(loopVar=0; loopVar<KNoOfNotifyRequests; loopVar++)
  2631 		{
  2632 		gChannel.RequestNotification(status[loopVar], resourceId);
  2633 		if(status[loopVar].Int() != KRequestPending)
  2634 			{
  2635 			gTest.Printf(_L("TestNotificationQuota: status not KRequestPending, =%d\n"),
  2636 													status[loopVar].Int());
  2637 			return KErrGeneral;
  2638 			}
  2639 		}
  2640 	// Issue one more request, check that TRequestStatus object exhibits state KErrUnderflow
  2641 	gChannel.RequestNotification(status[KNoOfNotifyRequests], resourceId);
  2642 	if(status[KNoOfNotifyRequests].Int() != KErrUnderflow)
  2643 		{
  2644 		gTest.Printf(_L("TestNotificationQuota: status[%d] not KErrUnderflow, =%d\n"),
  2645 													KNoOfNotifyRequests,status[loopVar].Int());
  2646 		return KErrGeneral;
  2647 		}
  2648 	// Loop to trigger previously-issued notifications, check TRequestStatus objects
  2649 	for(loopVar=0; loopVar<KNoOfNotifyRequests; loopVar++)
  2650 		{
  2651 		// Pass gAsyncResStateDelta as this represents the delta value
  2652 		if((r=TriggerNotification(triggerStatus, resourceId, cached, gAsyncResStateDelta))!=KErrNone)
  2653 			return r;
  2654 		User::WaitForRequest(status[loopVar]);
  2655 		if(status[loopVar].Int()!=KErrNone)
  2656 			{
  2657 			gTest.Printf(_L("TestNotificationQuota: trigger basic request status[%d] = %d\n"),
  2658 																loopVar,status[loopVar].Int());
  2659 			return r;
  2660 			}
  2661 		}
  2662 
  2663 
  2664 	// Test quota for qualified operation
  2665 	//
  2666 	TInt dumThreshold = -25;	// Arbitrary
  2667 	TBool dumDirection = ETrue;	// Arbitrary
  2668 	//
  2669 	// Loop to perform maximum number of requests, check TRequestStatus objects are pending
  2670 	for(loopVar=0; loopVar<KNoOfNotifyRequests; loopVar++)
  2671 		{
  2672 	if((r=CalcNotifyDirAndThr(status[loopVar], resourceId, cached, dumThreshold, dumDirection))!=KErrNone)
  2673 		return r;
  2674 		gChannel.RequestNotification(status[loopVar], resourceId, dumThreshold, dumDirection);
  2675 		if(status[loopVar].Int() != KRequestPending)
  2676 			{
  2677 			gTest.Printf(_L("TestNotificationQuota: status[%d] not KRequestPending, =%d\n"),
  2678 																loopVar,status[loopVar].Int());
  2679 			return KErrGeneral;
  2680 			}
  2681 		}
  2682 	// Issue one more request, check that TRequestStatus object exhibits state KErrUnderflow
  2683 	if((r=CalcNotifyDirAndThr(status[KNoOfNotifyRequests], resourceId, cached, dumThreshold, dumDirection))!=KErrNone)
  2684 		return r;
  2685 	gChannel.RequestNotification(status[KNoOfNotifyRequests], resourceId, dumThreshold, dumDirection);
  2686 	if(status[KNoOfNotifyRequests].Int() != KErrUnderflow)
  2687 		{
  2688 		gTest.Printf(_L("TestNotificationQuota: status[%d] not KErrUnderflow, =%d\n"),
  2689 													KNoOfNotifyRequests,status[loopVar].Int());
  2690 		return KErrGeneral;
  2691 		}
  2692 	// Loop to trigger previously-issued notifications, check TRequestStatus objects
  2693 	for(loopVar=0; loopVar<KNoOfNotifyRequests; loopVar++)
  2694 		{
  2695 		// Pass gAsyncResStateDelta as this represents the delta value
  2696 		if((r=TriggerNotification(triggerStatus, resourceId, cached, gAsyncResStateDelta))!=KErrNone)
  2697 			return r;
  2698 		User::WaitForRequest(status[loopVar]);
  2699 		if(status[loopVar].Int()!=KErrNone)
  2700 			{
  2701 			gTest.Printf(_L("TestNotificationQuota: trigger qualified request status[%d] = %d\n"),
  2702 																loopVar,status[loopVar].Int());
  2703 			return r;
  2704 			}
  2705 		}
  2706 
  2707 	// Text quota with mixture of basic and qualified requests
  2708 	//
  2709 	TBool qualified = ETrue;
  2710 	// Issue requests and check TRequestStatus objects are pending
  2711 	for(loopVar=0; loopVar<KNoOfNotifyRequests; loopVar++)
  2712 		{
  2713 		if(qualified)
  2714 			{
  2715 			if((r=CalcNotifyDirAndThr(status[loopVar], resourceId, cached, dumThreshold, dumDirection))!=KErrNone)
  2716 				return r;
  2717 			gChannel.RequestNotification(status[loopVar], resourceId, dumThreshold, dumDirection);
  2718 			}
  2719 		else
  2720 			{
  2721 			gChannel.RequestNotification(status[loopVar], resourceId);
  2722 			}
  2723 		qualified=!qualified;
  2724 		if(status[loopVar].Int() != KRequestPending)
  2725 			{
  2726 			gTest.Printf(_L("TestNotificationQuota: mixed loop status[%d] not KRequestPending, =%d\n"),
  2727 																loopVar,status[loopVar].Int());
  2728 			return KErrGeneral;
  2729 			}
  2730 		}
  2731 	// Issue one more request, check that TRequestStatus object exhibits state KErrUnderflow
  2732 	if(qualified)
  2733 		{
  2734 		if((r=CalcNotifyDirAndThr(status[KNoOfNotifyRequests], resourceId, cached, dumThreshold, dumDirection))!=KErrNone)
  2735 			return r;
  2736 		gChannel.RequestNotification(status[KNoOfNotifyRequests], resourceId, dumThreshold, dumDirection);
  2737 		}
  2738 	else
  2739 		{
  2740 		gChannel.RequestNotification(status[KNoOfNotifyRequests], resourceId);
  2741 		}
  2742 	if(status[KNoOfNotifyRequests].Int() != KErrUnderflow)
  2743 		{
  2744 		gTest.Printf(_L("TestNotificationQuota: mixed loop status[%d] not KErrUnderflow, =%d\n"),
  2745 													KNoOfNotifyRequests,status[loopVar].Int());
  2746 		return KErrGeneral;
  2747 		}
  2748 	// Loop to trigger previously-issued notifications, check TRequestStatus objects
  2749 	for(loopVar=0; loopVar<KNoOfNotifyRequests; loopVar++)
  2750 		{
  2751 		// Pass gAsyncResStateDelta as this represents the delta value
  2752 		if((r=TriggerNotification(triggerStatus, resourceId, cached, gAsyncResStateDelta))!=KErrNone)
  2753 			return r;
  2754 		User::WaitForRequest(status[loopVar]);
  2755 		if(status[loopVar].Int()!=KErrNone)
  2756 			{
  2757 			gTest.Printf(_L("TestNotificationQuota: trigger mixed request status[%d] = %d\n"),
  2758 																loopVar,status[loopVar].Int());
  2759 			return r;
  2760 			}
  2761 		}
  2762 
  2763 	__KHEAP_MARKEND;
  2764 
  2765 	return r;
  2766 	}
  2767 
  2768 #ifdef PIRATE_THREAD_TESTS
  2769 
  2770 RThread PirateThread;
  2771 TRequestStatus PirateStatus;
  2772 const TInt KHeapSize=0x4000;
  2773 const TInt KStackSize=0x4000;
  2774 
  2775 _LIT(KPirateThreadName,"Pirate");
  2776 
  2777 TInt PirateThreadFn(TAny* /*aSrcThread*/)
  2778 	{
  2779 #if 0
  2780 	TInt r=KErrNone;
  2781 	RBusDevResManUs pirateChannel = gChannel;
  2782 	RThread& thread = *((RThread*)aSrcThread);
  2783 
  2784 /* 1 - pirate with current thread - Panics kernel with KErrBadHandle */
  2785 	if((r=pirateChannel.Duplicate(RThread(),EOwnerProcess))!=KErrAccessDenied)
  2786 		{
  2787 		gTest.Printf(_L("TestThreadExclusiveAccess: pirateChannel.Duplicate(RThread(),EOwnerProcess) returned %d\n"),r);
  2788 		return KErrGeneral;
  2789 		}
  2790 
  2791 /* 2 - pirate with parent thread - Panics kernel with KErrBadHandle */
  2792 	pirateChannel = gChannel;
  2793 	if((r=pirateChannel.Duplicate(thread,EOwnerThread))!=KErrAccessDenied)
  2794 		{
  2795 		gTest.Printf(_L("TestThreadExclusiveAccess: pirateChannel.Duplicate(thread,EOwnerThread) returned %d\n"),r);
  2796 		return KErrGeneral;
  2797 		}
  2798 
  2799 /* 3 - gChannel with current thread - Panics kernel with KErrBadHandle */
  2800 	if((r=gChannel.Duplicate(RThread(),EOwnerThread))!=KErrAccessDenied)
  2801 		{
  2802 		gTest.Printf(_L("TestThreadExclusiveAccess: gChannel.Duplicate(RThread(),EOwnerThread) returned %d\n"),r);
  2803 		return KErrGeneral;
  2804 		}
  2805 
  2806 /* 4 - gChannel with parent thread - Panics kernel with KErrBadHandle */
  2807 	if((r=gChannel.Duplicate(thread,EOwnerThread))!=KErrAccessDenied)
  2808 		{
  2809 		gTest.Printf(_L("TestThreadExclusiveAccess: gChannel.Duplicate(thread,EOwnerThread)returned %d\n"),r);
  2810 		return KErrGeneral;
  2811 		}
  2812 #endif
  2813 
  2814 //	pirateChannel.Close();
  2815 	return KErrNone;
  2816 	}
  2817 
  2818 TInt StartPirate(RThread& aSrcThread)
  2819 	{
  2820 	TAny* srcThread =(TAny*)(&aSrcThread);
  2821 	TInt r=PirateThread.Create(KPirateThreadName,PirateThreadFn,KStackSize,KHeapSize,KHeapSize,srcThread,EOwnerThread);
  2822 	if (r!=KErrNone)
  2823 		return r;
  2824 	PirateThread.Logon(PirateStatus);
  2825 	PirateThread.Resume();
  2826 	return KErrNone;
  2827 	}
  2828 
  2829 TInt WaitForPirateThread()
  2830 	{
  2831 	User::WaitForRequest(PirateStatus);
  2832 	TInt exitType=PirateThread.ExitType();
  2833 	TInt exitReason=PirateThread.ExitReason();
  2834 	TBuf<16> exitCat=PirateThread.ExitCategory();
  2835 	if((exitType!= EExitKill)||(exitReason!=KErrNone))
  2836 		{
  2837 		gTest.Printf(_L("Pirate thread error: %d\n"),PirateStatus.Int());
  2838 		gTest.Printf(_L("Thread exit reason: %d,%d,%S\n"),exitType,exitReason,&exitCat);
  2839 		gTest(0);		
  2840 		}
  2841 	PirateThread.Close();
  2842 	return KErrNone;
  2843 	}
  2844 
  2845 #endif
  2846 
  2847 //----------------------------------------------------------------------------------------------
  2848 //! @SYMTestCaseID      KBASE-T_RESMANUS-0608
  2849 //! @SYMTestType        UT
  2850 //! @SYMPREQ            PREQ1398
  2851 //! @SYMTestCaseDesc    This test case tests that channels can not be shared between threads.
  2852 //! @SYMTestActions     0) Attempt to Duplicate the channel handle with EOwnerProcess as the owner type.
  2853 //!
  2854 //!						1) Attempt to Duplicate the channel handle with EOwnerThread
  2855 //!
  2856 //! @SYMTestExpectedResults 0) API should return with KErrAccessDenied, exits otherwise.
  2857 //!						1) API should return with KErrNone, exits otherwise.
  2858 //!
  2859 //! @SYMTestPriority        High
  2860 //! @SYMTestStatus          Implemented
  2861 //----------------------------------------------------------------------------------------------
  2862 LOCAL_C TInt TestThreadExclusiveAccess()
  2863 //
  2864 // Test mechanism to prevent other threads accessing a channel
  2865 //
  2866 	{
  2867 	__KHEAP_MARK;
  2868 
  2869 	TInt r;
  2870 	RBusDevResManUs pirateChannel = gChannel;
  2871 	if((r=pirateChannel.Duplicate(RThread(),EOwnerProcess))!=KErrAccessDenied)
  2872 		{
  2873 		gTest.Printf(_L("TestThreadExclusiveAccess: Duplicate with EOwnerProcess returned %d\n"),r);
  2874 		if(r==KErrNone)
  2875 			r=KErrGeneral;
  2876 		return r;
  2877 		}
  2878 	pirateChannel = gChannel;
  2879 	if((r=pirateChannel.Duplicate(RThread(),EOwnerThread))!=KErrNone)
  2880 		{
  2881 		gTest.Printf(_L("TestThreadExclusiveAccess: Duplicate with EOwnerThread returned %d\n"),r);
  2882 		return r;
  2883 		}
  2884 #ifdef PIRATE_THREAD_TESTS
  2885 	RThread& threadRef = RThread();
  2886 	if((r=StartPirate(threadRef))!=KErrNone)
  2887 		{
  2888 		gTest.Printf(_L("TestThreadExclusiveAccess: StartPirate returned %d\n"),r);
  2889 		return KErrGeneral;
  2890 		}
  2891 	if((r=WaitForPirateThread())!=KErrNone)
  2892 		{
  2893 		gTest.Printf(_L("TestThreadExclusiveAccess: WaitForPirateThread returned %d\n"),r);
  2894 		return KErrGeneral;
  2895 		}
  2896 #endif
  2897 	pirateChannel.Close();
  2898 
  2899 	__KHEAP_MARKEND;
  2900 
  2901 	return KErrNone;
  2902 	}
  2903 
  2904 RThread Thrd2;
  2905 TRequestStatus Thrd2Status;
  2906 const TInt KHeapSize=0x4000;
  2907 const TInt KStackSize=0x4000;
  2908 
  2909 _LIT(KThrd2Name,"Thread2");
  2910 
  2911 
  2912 TInt Thread2Fn(TAny* /* */)
  2913 //
  2914 // Test that more than one thread can be supported
  2915 //
  2916 	{
  2917 	TInt r;
  2918 
  2919 	// Open a channel
  2920 	//
  2921 	_LIT(secThrdStr,"Thrd2Channel");
  2922 	TBufC<16> secThrdName(secThrdStr);
  2923 	// API accepts 8-bit descriptors, only - so convert name accordingly
  2924 	TBuf8<MAX_RESOURCE_NAME_LENGTH+1>EightBitName;
  2925 	EightBitName.Copy(secThrdName);
  2926 	RBusDevResManUs secThrdChannel;
  2927     if((r=secThrdChannel.Open(EightBitName))!=KErrNone)
  2928 		return r;
  2929 
  2930 	// Read the resource information
  2931 	//
  2932 	TUint numResources=0;
  2933 	if((r=secThrdChannel.GetNoOfResources(numResources))!=KErrNone)
  2934 		return r;
  2935 
  2936 	// To support the GetAllResourcesInfo testing, instantiate TResourceInfoBuf objects
  2937 	// and reference via an RSimplePointerArray
  2938 	TUint bufSize = numResources;
  2939 	RSimplePointerArray<TResourceInfoBuf> resPtrs(bufSize);
  2940 	for(TUint i=0;i<bufSize;i++)
  2941 		{
  2942 		TResourceInfoBuf *info = new TResourceInfoBuf();
  2943 		if((r=resPtrs.Insert(info, i))!=KErrNone)
  2944 			return r;
  2945 		}
  2946 
  2947 	TUint updateNumResources=numResources;
  2948 	if((r=secThrdChannel.GetAllResourcesInfo(&resPtrs,updateNumResources))!=KErrNone)
  2949 		return r;
  2950 	resPtrs.Close();
  2951 
  2952 
  2953 	// Read current client information
  2954 	//
  2955 	TUint numClients=0;
  2956 	TUint numAllClients=0;
  2957 	//
  2958 	// GetNoOfClients - with default aIncludeKern=EFalse
  2959 	//
  2960 	if((r=secThrdChannel.GetNoOfClients(numClients,EFalse)) != KErrNone)
  2961 		return r;
  2962 	//
  2963 	// GetNoOfClients - with aIncludeKern=ETrue
  2964 	//
  2965 	r=secThrdChannel.GetNoOfClients(numAllClients, ETrue);
  2966 #ifdef RESMANUS_KERN
  2967 	if(r!=KErrNone)
  2968 #else
  2969 	if(r!=KErrPermissionDenied)
  2970 #endif
  2971 		return KErrGeneral;
  2972 	//
  2973 	// Need a buffer big enough to contain numClients instances of TClientName
  2974 	// To support the GetNamesAllClients testing, instantiate TClientName objects
  2975 	// and reference via an RSimplePointerArray
  2976 	TUint resBufSize = (numAllClients>numClients)?numAllClients:numClients;
  2977 	RSimplePointerArray<TClientName> infoPtrs(resBufSize);
  2978 	for(TUint j=0;j<resBufSize;j++)
  2979 		{
  2980 		TClientName *info = new TClientName();
  2981 		if((r=infoPtrs.Insert(info, j))!=KErrNone)
  2982 			return r;
  2983 		}
  2984 	//
  2985 	// GetNamesAllClients - with aIncludeKern=EFalse
  2986 	//
  2987 	if((r=secThrdChannel.GetNamesAllClients(&infoPtrs, numClients, EFalse)) != KErrNone)
  2988 		return r;
  2989 	//
  2990 	// GetNamesAllClients - with aIncludeKern=ETrue
  2991 	//
  2992 #ifdef RESMANUS_KERN
  2993 	if((r=secThrdChannel.GetNamesAllClients(&infoPtrs, numAllClients, ETrue)) != KErrNone)
  2994 		return r;
  2995 #else
  2996 	if((r=secThrdChannel.GetNamesAllClients(&infoPtrs, numClients, ETrue)) != KErrPermissionDenied)
  2997 		{
  2998 		if(r==KErrNone)
  2999 			r=KErrGeneral;
  3000 		return r;
  3001 		}
  3002 	else
  3003 		r=KErrNone; // Ensure misleading result is not propagated
  3004 #endif
  3005 	infoPtrs.Close();
  3006 
  3007 	// If we don't have a shared resource identified, skip the remaining tests
  3008 	if(gHaveSharedRes)
  3009 		{
  3010 		// Register with the Resource Controller
  3011 		//
  3012 		if ((r=secThrdChannel.Initialise(1,1,0))!=KErrNone)  // Just need 1 get and 1 set state
  3013 			return r;
  3014 		// Set a level on the shared resource
  3015 		//
  3016 		// Get initial state
  3017 		TRequestStatus status;
  3018 		TBool cached = gUseCached;
  3019 		TInt readValue;
  3020 		TInt levelOwnerId;
  3021 		secThrdChannel.GetResourceState(status,gSharedResource,cached,&readValue,&levelOwnerId);
  3022 		User::WaitForRequest(status);
  3023 		r=status.Int();
  3024 		if(r != KErrNone)
  3025 			return r;
  3026 		// Write updated state
  3027 		TUint newLevel = (TUint)(readValue + gSharedResStateDelta);
  3028 		secThrdChannel.ChangeResourceState(status,gSharedResource,newLevel);
  3029 		User::WaitForRequest(status);
  3030 		r=status.Int();
  3031 		if(r != KErrNone)
  3032 			return r;
  3033 		
  3034 		// Read current client information
  3035 		//
  3036 		numClients=0;
  3037 		numAllClients=0;
  3038 		//
  3039 		// GetNoOfClients - with default aIncludeKern=EFalse
  3040 		//
  3041 		if((r=secThrdChannel.GetNoOfClients(numClients,EFalse)) != KErrNone)
  3042 			return r;
  3043 		//
  3044 		// GetNoOfClients - with aIncludeKern=ETrue
  3045 		//
  3046 #ifdef RESMANUS_KERN
  3047 		if((r=secThrdChannel.GetNoOfClients(numAllClients, ETrue))!=KErrNone)
  3048 #else
  3049 		if((r=secThrdChannel.GetNoOfClients(numAllClients, ETrue))!=KErrPermissionDenied)
  3050 #endif
  3051 			return KErrGeneral;
  3052 		//
  3053 		// Need a buffer big enough to contain numClients instances of TClientName
  3054 		// To support the GetNamesAllClients testing, instantiate TClientName objects
  3055 		// and reference via an RSimplePointerArray
  3056 		TUint bufSize = (numAllClients>numClients)?numAllClients:numClients;
  3057 		RSimplePointerArray<TClientName> infoPtrs(bufSize);
  3058 		for(TUint i=0;i<bufSize;i++)
  3059 			{
  3060 			TClientName *info = new TClientName();
  3061 			if((r=infoPtrs.Insert(info, i))!=KErrNone)
  3062 				return r;
  3063 			}
  3064 		//
  3065 		// GetNamesAllClients - with aIncludeKern=EFalse
  3066 		//
  3067 		if((r=secThrdChannel.GetNamesAllClients(&infoPtrs, numClients, EFalse)) != KErrNone)
  3068 			return r;
  3069 		//
  3070 		// GetNamesAllClients - with aIncludeKern=ETrue
  3071 		//
  3072 #ifdef RESMANUS_KERN
  3073 		if((r=secThrdChannel.GetNamesAllClients(&infoPtrs, numAllClients, ETrue)) != KErrNone)
  3074 			return r;
  3075 #else
  3076 		if((r=secThrdChannel.GetNamesAllClients(&infoPtrs, numClients, ETrue)) != KErrPermissionDenied)
  3077 			{
  3078 			if(r==KErrNone)
  3079 				r=KErrGeneral;
  3080 			return r;
  3081 			}
  3082 		else
  3083 			r=KErrNone; // Ensure misleading result is not propagated
  3084 #endif
  3085 		infoPtrs.Close();
  3086 
  3087 		// Read the resource information
  3088 		//
  3089 		numResources=0;
  3090 		if((r=secThrdChannel.GetNoOfResources(numResources))!=KErrNone)
  3091 			return r;
  3092 
  3093 		//
  3094 		// Need a buffer big enough to contain numResources instances of TResourceInfoBuf
  3095 		// To support the GetAllResourcesInfo testing, instantiate TResourceInfoBuf objects
  3096 		// and reference via an RSimplePointerArray
  3097 		RSimplePointerArray<TResourceInfoBuf> resPtrs(numResources);
  3098 		for(TUint j=0;j<numResources;j++)
  3099 			{
  3100 			TResourceInfoBuf *info = new TResourceInfoBuf();
  3101 			if((r=resPtrs.Insert(info, j))!=KErrNone)
  3102 				return r;
  3103 			}
  3104 
  3105 		if((r=secThrdChannel.GetAllResourcesInfo(&resPtrs,numResources))!=KErrNone)
  3106 			return r;
  3107 		resPtrs.Close();
  3108 		}
  3109 
  3110 	// Close the channel
  3111 	secThrdChannel.Close();
  3112 	return r;
  3113 	}
  3114 
  3115 TInt StartThread2()
  3116 	{
  3117 	TInt r=Thrd2.Create(KThrd2Name,Thread2Fn,KStackSize,KHeapSize,KHeapSize,NULL,EOwnerThread);
  3118 	if (r!=KErrNone)
  3119 		return r;
  3120 	Thrd2.Logon(Thrd2Status);
  3121 	Thrd2.Resume();
  3122 	return KErrNone;
  3123 	}
  3124 
  3125 TInt WaitForThread2()
  3126 	{
  3127 	User::WaitForRequest(Thrd2Status);
  3128 	TInt exitType=Thrd2.ExitType();
  3129 	TInt exitReason=Thrd2.ExitReason();
  3130 	TBuf<16> exitCat=Thrd2.ExitCategory();
  3131 	if((exitType!= EExitKill)||(exitReason!=KErrNone))
  3132 		{
  3133 		gTest.Printf(_L("Thread2 error: %d\n"),Thrd2Status.Int());
  3134 		gTest.Printf(_L("Thread exit reason: %d,%d,%S\n"),exitType,exitReason,&exitCat);
  3135 		gTest(0);		
  3136 		}
  3137 	Thrd2.Close();
  3138 	return KErrNone;
  3139 	}
  3140 
  3141 
  3142 //----------------------------------------------------------------------------------------------
  3143 //! @SYMTestCaseID      KBASE-T_RESMANUS-0614
  3144 //! @SYMTestType        UT
  3145 //! @SYMPREQ            PREQ1398
  3146 //! @SYMTestCaseDesc    This test case tests that an additional thread can open a channel and
  3147 //!						exercise selected APIs.
  3148 //! 
  3149 //! @SYMTestActions     0) Call API to open a channel.
  3150 //! 
  3151 //!						1) Call GetNoOfResources API.
  3152 //! 
  3153 //!						2) Call GetAllResourcesInfo API.
  3154 //! 
  3155 //!						3) Call GetNoOfClients API with default aIncludeKern=EFalse.
  3156 //! 
  3157 //!						4) Call GetNoOfClients API with aIncludeKern=ETrue
  3158 //! 
  3159 //!						5) Call GetNamesAllClientsAPI with default aIncludeKern=EFalse.
  3160 //! 
  3161 //!						6) Call GetNamesAllClientsAPI with aIncludeKern=ETrue
  3162 //! 
  3163 //!						7) Call Initialise API.
  3164 //! 
  3165 //!						8) Call GetResourceState API for selected resource. 
  3166 //! 
  3167 //!						9) Call GetResourceState API for selected resource.
  3168 //! 
  3169 //!						10) Call GetNoOfClients API with default aIncludeKern=EFalse.
  3170 //! 
  3171 //!						11) Call GetNoOfClients API with aIncludeKern=ETrue
  3172 //! 
  3173 //!						12) Call GetNamesAllClientsAPI with default aIncludeKern=EFalse.
  3174 //! 
  3175 //!						13) Call GetNamesAllClientsAPI with aIncludeKern=ETrue
  3176 //! 
  3177 //!						14) Call GetNoOfResources API.
  3178 //! 
  3179 //!						15) Call GetAllResourcesInfo API.
  3180 //!
  3181 //! @SYMTestExpectedResults 0) Test that the channel was opened - exit otherwise.
  3182 //! 
  3183 //!							1) Test that the API call returned KErrNone - exit otherwise.
  3184 //! 
  3185 //!							2) Test that the API call returned KErrNone - exit otherwise.
  3186 //! 
  3187 //!							3) Test that the API call returned KErrNone - exit otherwise.
  3188 //! 
  3189 //!							4) If client exhibits PlatSec capability ReadDeviceData, Test that the API call returned KErrNone - exit otherwise
  3190 //!							   If client lacks PlatSec capability ReadDeviceData, Test that the API call returned KErrPermissionDenied - exit otherwise
  3191 //! 
  3192 //!							5) Test that the API call returned KErrNone - exit otherwise.
  3193 //! 
  3194 //!							6) If client exhibits PlatSec capability ReadDeviceData, Test that the API call returned KErrNone - exit otherwise
  3195 //!							   If client lacks PlatSec capability ReadDeviceData, Test that the API call returned KErrPermissionDenied - exit otherwise
  3196 //! 
  3197 //!							7) Test that the API call returned KErrNone - exit otherwise
  3198 //! 
  3199 //!							8) Test that the associated TRequestStatus object exhibited state KErrNone - exit otherwise
  3200 //! 
  3201 //!							9) Test that the associated TRequestStatus object exhibited state KErrNone - exit otherwise
  3202 //! 
  3203 //!							10) Test that the API call returned KErrNone - exit otherwise.
  3204 //! 
  3205 //!							11) If client exhibits PlatSec capability ReadDeviceData, Test that the API call returned KErrNone - exit otherwise
  3206 //!							    If client lacks PlatSec capability ReadDeviceData, Test that the API call returned KErrPermissionDenied - exit otherwise
  3207 //! 
  3208 //!							12) Test that the API call returned KErrNone - exit otherwise.
  3209 //! 
  3210 //!							13) If client exhibits PlatSec capability ReadDeviceData, Test that the API call returned KErrNone - exit otherwise
  3211 //!							    If client lacks PlatSec capability ReadDeviceData, Test that the API call returned KErrPermissionDenied - exit otherwise
  3212 //! 
  3213 //!							14) Test that the API call returned KErrNone - exit otherwise.
  3214 //! 
  3215 //!							15) Test that the API call returned KErrNone - exit otherwise.
  3216 //!
  3217 //! @SYMTestPriority        High
  3218 //! @SYMTestStatus          Implemented
  3219 //----------------------------------------------------------------------------------------------
  3220 LOCAL_C TInt TestAdditionalThread()
  3221 //
  3222 // Test that more than one thread can be supported
  3223 //
  3224 	{
  3225 	TInt r;
  3226 	if((r=StartThread2())!=KErrNone)
  3227 		{
  3228 		gTest.Printf(_L("TestAdditionalThread: StartThread2 returned %d\n"),r);
  3229 		return KErrGeneral;
  3230 		}
  3231 	if((r=WaitForThread2())!=KErrNone)
  3232 		{
  3233 		gTest.Printf(_L("TestAdditionalThread: WaitForThread2 returned %d\n"),r);
  3234 		return KErrGeneral;
  3235 		}
  3236 
  3237 	return r;
  3238 	}
  3239 
  3240 
  3241 LOCAL_C TInt LocateResourceWithDependencies(TUint &aNumResources, TUint &aResId, TUint &aNumDependents)
  3242 //
  3243 // Support function for tests of dependencies
  3244 //
  3245 	{
  3246 	__KHEAP_MARK;
  3247 
  3248 	TInt r = KErrNone;
  3249 	if((r=gChannel.GetNoOfResources(aNumResources))!=KErrNone)
  3250 		{
  3251 		gTest.Printf(_L("GetNoOfResources for test channel returned %d\n"),r);
  3252 		return r;
  3253 		}
  3254 	TUint bufSize = aNumResources;
  3255 	RSimplePointerArray<TResourceInfoBuf> infoPtrs(bufSize);
  3256 	for(TUint i=0;i<bufSize;i++)
  3257 		{
  3258 		TResourceInfoBuf *info = new TResourceInfoBuf();
  3259 		if((r=infoPtrs.Insert(info, i))!=KErrNone)
  3260 			{
  3261 			gTest.Printf(_L("GetAllResourcesInfo infoPtrs.Insert at index %d returned %d\n"),i,r);
  3262 			}
  3263 		}
  3264 	TUint updateNumResources=aNumResources;
  3265 	if((r=gChannel.GetAllResourcesInfo(&infoPtrs,updateNumResources))!=KErrNone)
  3266 		{
  3267 		gTest.Printf(_L("GetAllResourcesInfo for channel returned %d\n"),r);
  3268 		return r;
  3269 		}
  3270 	for(TUint resNo=0;resNo<aNumResources;resNo++)
  3271 		{
  3272 		TResourceInfoBuf *info = infoPtrs[resNo];
  3273 		TUint resId = ((*info)()).iId;
  3274 		TUint numDependents = 0;
  3275 		r=gChannel.GetNumDependentsForResource(resId,&numDependents, EFalse); // EFalse - don't load the dependency info
  3276 		if((r!=KErrNone)&&(r!=KErrNotFound)&&(r!=KErrNotSupported))
  3277 			{
  3278 			gTest.Printf(_L("TestTransientHandling: GetNumDependentsForResource returned %d\n"),r);
  3279 			return r;
  3280 			}
  3281 		if(numDependents>0)
  3282 			{
  3283 			aResId = resId;
  3284 			aNumDependents = numDependents;
  3285 			break;
  3286 			}
  3287 		}
  3288 
  3289 	infoPtrs.Close();
  3290 
  3291 	__KHEAP_MARKEND;
  3292 	
  3293 	return r;
  3294 	}
  3295 
  3296 
  3297 
  3298 //----------------------------------------------------------------------------------------------
  3299 //! @SYMTestCaseID      KBASE-T_RESMANUS-0615
  3300 //! @SYMTestType        UT
  3301 //! @SYMPREQ            PREQ1398
  3302 //! @SYMTestCaseDesc    This test case tests the different options available for handling transient data.
  3303 //! @SYMTestActions     0) Locate a resource that has at least one dependency.
  3304 //! 
  3305 //!						1) Read the number of dependencies without reading the dependency information. 
  3306 //!						   Call to read the dependency information (without re-loading).
  3307 //! 
  3308 //!						2) Read the number of dependencies (with default option of reading the dependency information). 
  3309 //!						   Then read the dependency information (without re-loading).
  3310 //!
  3311 //!						3) Repeat the read the number of dependencies without reading the dependency information
  3312 //!						   Then read the dependency information (without re-loading).
  3313 //!						   Then read the dependency information (with re-loading).
  3314 //!
  3315 //!						4) Attempt to read the dependency information (without re-loading) with a buffer of insufficient size 
  3316 //! 
  3317 //!						5) Read the number of (all) resources without reading the resource information. 
  3318 //!						   Call to read (all) the resource information (without re-loading).
  3319 //!
  3320 //!						6) Read the number of (all) resources (with default option of reading the resource information). 
  3321 //!						   Then read (all) the resource information (without re-loading).
  3322 //!
  3323 //!						7) Repeat the read the number of (all) resources without reading the resources information
  3324 //!						   Then read (all) the resources information (without re-loading).
  3325 //!						   Then read (all) the resources information (with re-loading).
  3326 //!
  3327 //!						8) Attempt to read (all) the resource information (without re-loading) with a buffer of insufficient size 
  3328 //!
  3329 //!						9) Read the number of user-side clients using a resource without reading the resource information. 
  3330 //!						   Call to read the information for user-side clients using a resource (without re-loading).
  3331 //!
  3332 //!						10) Read the number of user-side clients (with loading of the client information)
  3333 //!						   Call to read the client information (without re-loading) should return be successful
  3334 //!						   Call to read the information for a resourceID with zero clients (without re-loading)
  3335 //!						   Call to read the information for the first resourceID
  3336 //!
  3337 //!						11) Repeat the read of the number of user-side clients (without re-loading)
  3338 //!						   Call to read the client information (without re-loading)
  3339 //!						   Call to read the client information (with re-loading)
  3340 //!
  3341 //!						12) Open a second channel on the User-Side API, and call initialise support for resource state access
  3342 //!						   Get the current state of a specific resource, then change the state
  3343 //!						   Call to read the number of user-side clients for the resource (with loading of the client information)
  3344 //!						   but with a buffer of insufficient size.
  3345 //!
  3346 //!						13) Read the number of resources in use by a specified client (without loading)
  3347 //!						   Call to read the information on the resources in use by the client (without loading)
  3348 //!
  3349 //!						14) Open a third channel on the User-Side API, do not call initialise.
  3350 //!						   Read the number of resources in use by a specified client (with loading)
  3351 //!						   Call to read the information for resources in use by the third channel (without re-loading)
  3352 //!						   Call to read the information for resources in use by the second channel (without re-loading)
  3353 //!
  3354 //!						15) Read the number of resources in use by a specified client (without loading)
  3355 //!						   Call to read the information on the resources in use by the client (without loading)
  3356 //!						   Call to read the information on the resources in use by the client (with loading)
  3357 //!
  3358 //!						16) Read the number of resources in use by a specified client (with loading)
  3359 //!						   Call to read the information on the resources in use by the client (without loading) 
  3360 //!						   with a buffer of insufficient size.
  3361 //!
  3362 //! @SYMTestExpectedResults 0) If a suitable resource is found, the number of dependencies is reported - exit otherwise.
  3363 //!
  3364 //!						1) Test that the read of the number of dependencies returns KErrNone - exit otherwise.
  3365 //!						   Test that the read of the dependency information returned KErrNotReady - exit otherwise.
  3366 //!
  3367 //!						2) Test that the read of the number of dependencies returns KErrNone - exit otherwise.
  3368 //!						   Test that the read of the dependency information returned KErrNone - exit otherwise.
  3369 //!
  3370 //!						3) Test that the read of the number of dependencies returns KErrNone - exit otherwise.
  3371 //!						   Test that the read of the dependency information (without re-loading) returned KErrNotReady - exit otherwise.
  3372 //!						   Test that the read of the dependency information (with re-loading) returned KErrNone - exit otherwise.
  3373 //!
  3374 //!						4) Test that the read of the dependency information returns KErrArgument - exit otherwise 
  3375 //!
  3376 //!						5) Test that the read of the number of resources returns KErrNone - exit otherwise.
  3377 //!						   Test that the read of the resource information returned KErrNotReady - exit otherwise.
  3378 //!
  3379 //!						6) Test that the read of the number of resources returns KErrNone - exit otherwise.
  3380 //!						   Test that the read of the resource information returned KErrNone - exit otherwise.
  3381 //!
  3382 //!						7) Test that the read of the number of resources returns KErrNone - exit otherwise.
  3383 //!						   Test that the read of the resource information (without re-loading) returned KErrNotReady - exit otherwise.
  3384 //!						   Test that the read of the resources information (with re-loading) returned KErrNone - exit otherwise.
  3385 //!
  3386 //!						8) Test that the read of the resource information returns KErrArgument - exit otherwise 
  3387 //!
  3388 //!						9) Test that the read of the number of clients returns KErrNone - exit otherwise.
  3389 //!						   Test that the read of the client information returned KErrNotReady - exit otherwise.
  3390 //!
  3391 //!						10) Test that the read of the number of clients returns KErrNone - exit otherwise.
  3392 //!						  Test that the read of the client information returned KErrNone - exit otherwise.
  3393 //!						  Test that the read of the client information returned KErrNone and numClients==0 - exit otherwise.
  3394 //!						  Test that the read of the client information returned KErrNotReady - exit otherwise.
  3395 //!
  3396 //!						11) Test that the read of the number of clients returns KErrNone - exit otherwise.
  3397 //!						  Test that the read of the client information returned KErrNotReady - exit otherwise.
  3398 //!						  Test that the read of the client information returned KErrNone - exit otherwise.
  3399 //!
  3400 //!						12) Test that the opening and initialisation of the channel was successful - exit otherwise.
  3401 //!						  Test that the get and change of the resource state completed successfully - exit otherwise
  3402 //!						  Test that the read of the client information returned KErrArgument - exit otherwise.
  3403 //!
  3404 //!						13) Test that the read of the number of resources returns KErrNone - exit otherwise.
  3405 //!						  Test that the read of the resource information returned KErrNotReady - exit otherwise.
  3406 //!
  3407 //!						14) Test that the opening of the channel was successful - exit otherwise.
  3408 //!						   Test that the read of the resource information returned KErrNone - exit otherwise.
  3409 //!						   Test that the read of the client information returned KErrNone, and numResources = 0 - exit otherwise.
  3410 //!						   Test that the read of the client information returned KErrNotReady - exit otherwise.
  3411 //!
  3412 //!						15) Test that the read of the number of resources returns KErrNone - exit otherwise.
  3413 //!						   Test that the read of the resource information returned KErrNotReady - exit otherwise.
  3414 //!						   Test that the read of the resource information returned KErrNone - exit otherwise.
  3415 //!
  3416 //!						16) Test that the read of the number of resources returns KErrNone - exit otherwise.
  3417 //!						   Test that the read of the resource information returned KErrArgument - exit otherwise..
  3418 //!
  3419 //! @SYMTestPriority        High
  3420 //! @SYMTestStatus          Implemented
  3421 //----------------------------------------------------------------------------------------------
  3422 LOCAL_C TInt TestTransientHandling()
  3423 //
  3424 // Test APIs with options for handling transient data (dependencies, resources and clients)
  3425 //
  3426 	{
  3427 	TInt r = KErrNone;
  3428 	TUint testNo = 1;
  3429 
  3430 	TUint numDependents = 0; 
  3431 	TUint resNo = 0;
  3432 
  3433 	//
  3434 	//					Dependency data tests
  3435 	//
  3436 
  3437 	gTest.Printf(_L("TestTransientHandling: dependency data tests ...\n"));
  3438 
  3439 	// 0) Find a resource that has dependents - if none is located skip the remaining dependancy tests
  3440 	// (this reads the number of dependencies, without loading the dependency data)
  3441 	//
  3442 	TUint numResources=0;
  3443 	if((r=LocateResourceWithDependencies(numResources, resNo, numDependents))!=KErrNone)
  3444 		{
  3445 		gTest.Printf(_L("TestTransientHandling: no resource with dependencies found ... skipping tests\n"));
  3446 		return KErrNone;
  3447 		}
  3448 	if(numDependents==0)
  3449 		{
  3450 		gTest.Printf(_L("TestTransientHandling: no resource with dependencies found ... skipping tests\n"));
  3451 		}
  3452 	else
  3453 		{
  3454 		// 1) Read the number of dependencies without reading the dependency information
  3455 		// Subsequent call to read the dependency information (without re-loading) should return error KErrNotReady
  3456 		gTest.Printf(_L("TestTransientHandling: test %d\n"),testNo++);
  3457 		if((r=gChannel.GetNumDependentsForResource(resNo,&numDependents, EFalse))!=KErrNone)
  3458 			{
  3459 			gTest.Printf(_L("TestTransientHandling: GetNumDependentsForResource returned %d\n"),r);
  3460 			return r;
  3461 			}
  3462 		gTest.Printf(_L("TestTransientHandling: GetNumDependentsForResource reported %d dependents for resource %d\n"),numDependents,resNo);
  3463 		if(numDependents > 0)
  3464 			{
  3465 			RBuf8 buffer;
  3466 			if((buffer.Create(numDependents*sizeof(SResourceDependencyInfo)))!=KErrNone)
  3467 				return KErrGeneral;
  3468 			buffer.SetLength(0);
  3469 			if((r=gChannel.GetDependentsIdForResource(resNo, buffer, &numDependents))!=KErrNotReady)
  3470 				{
  3471 				gTest.Printf(_L("TestTransientHandling: GetDependentsIdForResource returned %d\n"),r);
  3472 				return KErrGeneral;
  3473 				}
  3474 			buffer.Close();
  3475 			}
  3476 
  3477 		// 2) Read the number of dependencies (and, by default, read the dependency information)
  3478 		// Subsequent call to read the dependency information (without re-loading) should return be successful
  3479 		gTest.Printf(_L("TestTransientHandling: test %d\n"),testNo++);
  3480 		if((r=gChannel.GetNumDependentsForResource(resNo,&numDependents))!=KErrNone)
  3481 			{
  3482 			gTest.Printf(_L("TestTransientHandling: GetNumDependentsForResource returned %d\n"),r);
  3483 			return r;
  3484 			}
  3485 		gTest.Printf(_L("TestTransientHandling: GetNumDependentsForResource reported %d dependents for resource %d\n"),numDependents,resNo);
  3486 		if(numDependents > 0)
  3487 			{
  3488 			RBuf8 buffer;
  3489 			if((buffer.Create(numDependents*sizeof(SResourceDependencyInfo)))!=KErrNone)
  3490 				return KErrGeneral;
  3491 			buffer.SetLength(0);
  3492 			if((r=gChannel.GetDependentsIdForResource(resNo, buffer, &numDependents))!=KErrNone)
  3493 				{
  3494 				gTest.Printf(_L("TestTransientHandling: GetDependentsIdForResource returned %d\n"),r);
  3495 				return r;
  3496 				}
  3497 			SResourceDependencyInfo* tempPtr = (SResourceDependencyInfo*)(buffer.Ptr());
  3498 			gTest.Printf(_L("TestTransientHandling: numDependents = %d\n"),numDependents);
  3499 			for(TUint i=0; i<numDependents; i++,tempPtr++)
  3500 				{
  3501 				gTest.Printf(_L("TestTransientHandling: info.iResourceId = %d\n"),tempPtr->iResourceId);
  3502 				gTest.Printf(_L("TestTransientHandling: info.iDependencyPriority= %d\n"),tempPtr->iDependencyPriority);
  3503 				}
  3504 			buffer.Close();
  3505 			}
  3506 
  3507 		// 3) Repeat the read the number of dependencies without reading the dependency information
  3508 		// Subsequent call to read the dependency information (without re-loading) should return error KErrNotReady
  3509 		// Then call to read the dependency information (with re-loading) should be successful
  3510 		gTest.Printf(_L("TestTransientHandling: test %d\n"),testNo++);
  3511 		if((r=gChannel.GetNumDependentsForResource(resNo,&numDependents, EFalse))!=KErrNone)
  3512 			{
  3513 			gTest.Printf(_L("TestTransientHandling: GetNumDependentsForResource returned %d\n"),r);
  3514 			return r;
  3515 			}
  3516 		gTest.Printf(_L("TestTransientHandling: GetNumDependentsForResource reported %d dependents for resource %d\n"),numDependents,resNo);
  3517 		if(numDependents > 0)
  3518 			{
  3519 			RBuf8 buffer;
  3520 			if((buffer.Create(numDependents*sizeof(SResourceDependencyInfo)))!=KErrNone)
  3521 				return KErrGeneral;
  3522 			buffer.SetLength(0);
  3523 
  3524 			if((r=gChannel.GetDependentsIdForResource(resNo, buffer, &numDependents))!=KErrNotReady)
  3525 				{
  3526 				gTest.Printf(_L("TestTransientHandling: GetDependentsIdForResource returned %d\n"),r);
  3527 				return KErrGeneral;
  3528 				}
  3529 			if((r=gChannel.GetDependentsIdForResource(resNo, buffer, &numDependents, ETrue))!=KErrNone)
  3530 				{
  3531 				gTest.Printf(_L("TestTransientHandling: GetDependentsIdForResource returned %d\n"),r);
  3532 				return KErrGeneral;
  3533 				}
  3534 			SResourceDependencyInfo* tempPtr = (SResourceDependencyInfo*)(buffer.Ptr());
  3535 			for(TUint i=0; i<numDependents; i++,tempPtr++)
  3536 				{
  3537 				gTest.Printf(_L("TestTransientHandling: info.iResourceId = %d"),tempPtr->iResourceId);
  3538 				gTest.Printf(_L("TestTransientHandling: info.iDependencyPriority= %d"),tempPtr->iDependencyPriority);
  3539 				}
  3540 			buffer.Close();
  3541 			}
  3542 
  3543 		// 4) Attempt to read the dependency information (without re-loading) with a buffer of insufficient size should
  3544 		// return error KErrArgument
  3545 		gTest.Printf(_L("TestTransientHandling: test %d\n"),testNo++);
  3546 		if(numDependents > 0)
  3547 			{
  3548 			RBuf8 buffer;
  3549 			if((buffer.Create((numDependents-1)*sizeof(SResourceDependencyInfo)))!=KErrNone)
  3550 				return KErrGeneral;
  3551 			buffer.SetLength(0);
  3552 			if((r=gChannel.GetDependentsIdForResource(resNo, buffer, &numDependents))!=KErrArgument)
  3553 				{
  3554 				gTest.Printf(_L("TestTransientHandling: GetDependentsIdForResource returned %d\n"),r);
  3555 				return KErrGeneral;
  3556 				}
  3557 			// Ensure misleading result is not returned
  3558 			r=KErrNone;
  3559 			buffer.Close();
  3560 			}
  3561 		}
  3562 	
  3563 
  3564 	//
  3565 	//					All resource data tests
  3566 	//
  3567 
  3568 	gTest.Printf(_L("TestTransientHandling: All resource data tests ...\n"));
  3569 	testNo=1;
  3570 
  3571 	// 5) Attempt to read the resource information without having previously loaded it.
  3572 	gTest.Printf(_L("TestTransientHandling: test %d\n"),testNo++);
  3573 		{
  3574 		TUint numResources = 0;
  3575 		r = gChannel.GetNoOfResources(numResources, EFalse); // EFalse - don't load the resource info
  3576 		if(r!=KErrNone)
  3577 			{
  3578 			gTest.Printf(_L("GetNoOfResources returned %d\n"),r);
  3579 			return r;
  3580 			}
  3581 		// To support the GetAllResourcesInfo testing, instantiate TResourceInfoBuf objects
  3582 		// and reference via an RSimplePointerArray
  3583 		RSimplePointerArray<TResourceInfoBuf> infoPtrs(numResources);
  3584 		for(TUint i=0;i<numResources;i++)
  3585 			{
  3586 			TResourceInfoBuf *info = new TResourceInfoBuf();
  3587 			if((r=infoPtrs.Insert(info, i))!=KErrNone)
  3588 				{
  3589 				gTest.Printf(_L("TestTransientHandling test, GetAllResourcesInfo infoPtrs.Insert at index %d returned %d\n"),testNo,i,r);
  3590 				}
  3591 			}
  3592 		if((r=gChannel.GetAllResourcesInfo(&infoPtrs, numResources))!=KErrNotReady)
  3593 			{
  3594 			gTest.Printf(_L("TestTransientHandling: GetAllResourcesInfo returned %d\n"),r);
  3595 			return KErrGeneral;
  3596 			}
  3597 		else
  3598 			r=KErrNone;	// Ensure misleading result is not propagated
  3599 		infoPtrs.Close();
  3600 		}
  3601 
  3602 	// 6) Read the number of resources (and, by default, read the resource information)
  3603 	// Subsequent call to read the resource information (without re-loading) should return be successful
  3604 	gTest.Printf(_L("TestTransientHandling: test %d\n"),testNo++);
  3605 		{
  3606 		TUint numResources = 0;
  3607 		if((r=gChannel.GetNoOfResources(numResources))!=KErrNone)
  3608 			{
  3609 			gTest.Printf(_L("GetNoOfResources returned %d\n"),r);
  3610 			return r;
  3611 			}
  3612 		// To support the GetAllResourcesInfo testing, instantiate TResourceInfoBuf objects
  3613 		// and reference via an RSimplePointerArray
  3614 		RSimplePointerArray<TResourceInfoBuf> infoPtrs(numResources);
  3615 		for(TUint i=0;i<numResources;i++)
  3616 			{
  3617 			TResourceInfoBuf *info = new TResourceInfoBuf();
  3618 			if((r=infoPtrs.Insert(info, i))!=KErrNone)
  3619 				{
  3620 				gTest.Printf(_L("TestTransientHandling test, GetAllResourcesInfo infoPtrs.Insert at index %d returned %d\n"),testNo,i,r);
  3621 				}
  3622 			}
  3623 		if((r=gChannel.GetAllResourcesInfo(&infoPtrs, numResources))!=KErrNone)
  3624 			{
  3625 			gTest.Printf(_L("TestTransientHandling: GetAllResourcesInfo returned %d\n"),r);
  3626 			return r;
  3627 			}
  3628 		infoPtrs.Close();
  3629 		}
  3630 
  3631 	// 7) Repeat the read the number of resources without reading the resource information
  3632 	// Subsequent call to read the resource information (without re-loading) should return error KErrNotReady
  3633 	// Then call to read the resource information (with re-loading) should be successful
  3634 	gTest.Printf(_L("TestTransientHandling: test %d\n"),testNo++);
  3635 		{
  3636 		TUint numResources = 0;
  3637 		if((r=gChannel.GetNoOfResources(numResources, EFalse))!=KErrNone)	// EFalse - don't load the resource info
  3638 			{
  3639 			gTest.Printf(_L("GetNoOfResources returned %d\n"),r);
  3640 			return r;
  3641 			}
  3642 		// To support the GetAllResourcesInfo testing, instantiate TResourceInfoBuf objects
  3643 		// and reference via an RSimplePointerArray
  3644 		RSimplePointerArray<TResourceInfoBuf> infoPtrs(numResources);
  3645 		for(TUint i=0;i<numResources;i++)
  3646 			{
  3647 			TResourceInfoBuf *info = new TResourceInfoBuf();
  3648 			if((r=infoPtrs.Insert(info, i))!=KErrNone)
  3649 				{
  3650 				gTest.Printf(_L("TestTransientHandling test, GetAllResourcesInfo infoPtrs.Insert at index %d returned %d\n"),testNo,i,r);
  3651 				}
  3652 			}
  3653 		if((r=gChannel.GetAllResourcesInfo(&infoPtrs, numResources))!=KErrNotReady)
  3654 			{
  3655 			gTest.Printf(_L("TestTransientHandling: GetAllResourcesInfo returned %d\n"),r);
  3656 			return KErrGeneral;
  3657 			}
  3658 		if((r=gChannel.GetAllResourcesInfo(&infoPtrs, numResources,ETrue))!=KErrNone)
  3659 			{
  3660 			gTest.Printf(_L("TestTransientHandling: GetAllResourcesInfo returned %d\n"),r);
  3661 			return r;
  3662 			}
  3663 		else
  3664 		infoPtrs.Close();
  3665 		}
  3666 
  3667 
  3668 	// 8) Attempt to read the resource information (without re-loading) with a buffer of insufficient size should
  3669 	// return error KErrArgument
  3670 	gTest.Printf(_L("TestTransientHandling: test %d\n"),testNo++);
  3671 		{
  3672 		TUint numResources = 0;
  3673 		if((r=gChannel.GetNoOfResources(numResources, EFalse))!=KErrNone)	// EFalse - don't load the resource info
  3674 			{
  3675 			gTest.Printf(_L("GetNoOfResources returned %d\n"),r);
  3676 			return r;
  3677 			}
  3678 		// To support the GetAllResourcesInfo testing, instantiate TResourceInfoBuf objects
  3679 		// and reference via an RSimplePointerArray
  3680 		RSimplePointerArray<TResourceInfoBuf> infoPtrs(numResources - 1);
  3681 		for(TUint i=0;i<(numResources-1);i++)
  3682 			{
  3683 			TResourceInfoBuf *info = new TResourceInfoBuf();
  3684 			if((r=infoPtrs.Insert(info, i))!=KErrNone)
  3685 				{
  3686 				gTest.Printf(_L("TestTransientHandling test, GetAllResourcesInfo infoPtrs.Insert at index %d returned %d\n"),testNo,i,r);
  3687 				}
  3688 			}
  3689 		if((r=gChannel.GetAllResourcesInfo(&infoPtrs, numResources))!=KErrArgument)
  3690 			{
  3691 			gTest.Printf(_L("TestTransientHandling: GetAllResourcesInfo returned %d\n"),r);
  3692 			return KErrGeneral;
  3693 			}
  3694 		// Ensure misleading result is not returned
  3695 		r=KErrNone;
  3696 		infoPtrs.Close();
  3697 		}
  3698 
  3699 	//
  3700 	//					Specific resource data tests
  3701 	//
  3702 
  3703 	gTest.Printf(_L("TestTransientHandling: Resource-specific data tests ...\n"));
  3704 	testNo=1;
  3705 
  3706 	// 9) Attempt to read the resource information without having previously loaded it.
  3707 	gTest.Printf(_L("TestTransientHandling: test %d\n"),testNo++);
  3708 		{
  3709 		TUint numClients = 0;
  3710 		if((r=gChannel.GetNumClientsUsingResource(gLongLatencyResource, numClients, EFalse, EFalse))!=KErrNone) // user-side clients, don't load the info
  3711 			{
  3712 			gTest.Printf(_L("GetNumClientsUsingResource returned %d\n"),r);
  3713 			return r;
  3714 			}
  3715 		// To support the GetInfoOnClientsUsingResource testing, instantiate TClientInfoBuf objects
  3716 		// and reference via an RSimplePointerArray
  3717 		RSimplePointerArray<TClientInfoBuf> infoPtrs(numClients);
  3718 		for(TUint i=0;i<numClients;i++)
  3719 			{
  3720 			TClientInfoBuf *info = new TClientInfoBuf();
  3721 			if((r=infoPtrs.Insert(info, i))!=KErrNone)
  3722 				{
  3723 				gTest.Printf(_L("TestTransientHandling test, GetInfoOnClientsUsingResource infoPtrs.Insert at index %d returned %d\n"),testNo,i,r);
  3724 				}
  3725 			}
  3726 		if((r=gChannel.GetInfoOnClientsUsingResource(gLongLatencyResource, numClients, &infoPtrs, EFalse))!=KErrNotReady)
  3727 			{
  3728 			gTest.Printf(_L("TestTransientHandling: GetInfoOnClientsUsingResource returned %d\n"),r);
  3729 			return KErrGeneral;
  3730 			}
  3731 		else
  3732 			r=KErrNone;	// Ensure misleading result is not propagated
  3733 		infoPtrs.Close();
  3734 		}
  3735 
  3736 	// 10) Read the number of clients (and, by default, read the client information)
  3737 	// Subsequent call to read the client information (without re-loading) should return be successful
  3738 	// Call to read the information for a resourceID with zero clients (without re-loading) should return KErrNone, numClients==0
  3739 	// Call to read the information for a resourceID with one or more clients (without re-loading) should return KErrNotReady
  3740 	gTest.Printf(_L("TestTransientHandling: test %d\n"),testNo++);
  3741 		{
  3742 		TUint numClients = 0;
  3743 		if((r=gChannel.GetNumClientsUsingResource(gLongLatencyResource, numClients, EFalse))!=KErrNone) // user-side clients, load the info
  3744 			{
  3745 			gTest.Printf(_L("GetNumClientsUsingResource returned %d\n"),r);
  3746 			return r;
  3747 			}
  3748 		// To support the GetInfoOnClientsUsingResource testing, instantiate TClientInfoBuf objects
  3749 		// and reference via an RSimplePointerArray
  3750 		RSimplePointerArray<TClientInfoBuf> infoPtrs(numClients);
  3751 		for(TUint i=0;i<numClients;i++)
  3752 			{
  3753 			TClientInfoBuf *info = new TClientInfoBuf();
  3754 			if((r=infoPtrs.Insert(info, i))!=KErrNone)
  3755 				{
  3756 				gTest.Printf(_L("TestTransientHandling test, GetInfoOnClientsUsingResource infoPtrs.Insert at index %d returned %d\n"),testNo,i,r);
  3757 				}
  3758 			}
  3759 		if((r=gChannel.GetInfoOnClientsUsingResource(gLongLatencyResource, numClients, &infoPtrs, EFalse))!=KErrNone)
  3760 			{
  3761 			gTest.Printf(_L("TestTransientHandling: GetInfoOnClientsUsingResource for gLongLatencyResource returned %d\n"),r);
  3762 			return r;
  3763 			}
  3764 		if(((r=gChannel.GetInfoOnClientsUsingResource((gLongLatencyResource+1), numClients, &infoPtrs, EFalse))!=KErrNone) || (numClients!=0))
  3765 			{
  3766 			gTest.Printf(_L("TestTransientHandling: GetInfoOnClientsUsingResource for (gLongLatencyResource+1) returned %d\n"),r);
  3767 			if(numClients!=0)
  3768 				gTest.Printf(_L("TestTransientHandling: GetInfoOnClientsUsingResource for (gLongLatencyResource+1), %d clients\n"),numClients);
  3769 			return KErrGeneral;
  3770 			}
  3771 		if((r=gChannel.GetInfoOnClientsUsingResource(gSharedResource, numClients, &infoPtrs, EFalse))!=KErrNotReady)
  3772 			{
  3773 			gTest.Printf(_L("TestTransientHandling: GetInfoOnClientsUsingResource (for gSharedResource) returned %d\n"),r);
  3774 			return r;
  3775 			}
  3776 		infoPtrs.Close();
  3777 		}
  3778 
  3779 
  3780 	// 11) Repeat the read the number of clients without reading the client information
  3781 	// Subsequent call to read the client information (without re-loading) should return error KErrNotReady
  3782 	// Then call to read the client information (with re-loading) should be successful
  3783 	gTest.Printf(_L("TestTransientHandling: test %d\n"),testNo++);
  3784 		{
  3785 		TUint numClients = 0;
  3786 		if((r=gChannel.GetNumClientsUsingResource(gLongLatencyResource, numClients, EFalse, EFalse))!=KErrNone) // user-side clients, don't load the info
  3787 			{
  3788 			gTest.Printf(_L("GetNumClientsUsingResource returned %d\n"),r);
  3789 			return r;
  3790 			}
  3791 		// To support the GetInfoOnClientsUsingResource testing, instantiate TClientInfoBuf objects
  3792 		// and reference via an RSimplePointerArray
  3793 		RSimplePointerArray<TClientInfoBuf> infoPtrs(numClients);
  3794 		for(TUint i=0;i<numClients;i++)
  3795 			{
  3796 			TClientInfoBuf *info = new TClientInfoBuf();
  3797 			if((r=infoPtrs.Insert(info, i))!=KErrNone)
  3798 				{
  3799 				gTest.Printf(_L("TestTransientHandling test, GetInfoOnClientsUsingResource infoPtrs.Insert at index %d returned %d\n"),testNo,i,r);
  3800 				}
  3801 			}
  3802 		if((r=gChannel.GetInfoOnClientsUsingResource(gLongLatencyResource, numClients, &infoPtrs, EFalse))!=KErrNotReady)
  3803 			{
  3804 			gTest.Printf(_L("TestTransientHandling: GetInfoOnClientsUsingResource for gLongLatencyResource returned %d\n"),r);
  3805 			return KErrGeneral;
  3806 			}
  3807 		if((r=gChannel.GetInfoOnClientsUsingResource(gLongLatencyResource, numClients, &infoPtrs, EFalse, ETrue))!=KErrNone)
  3808 			{
  3809 			gTest.Printf(_L("TestTransientHandling: GetInfoOnClientsUsingResource for gLongLatencyResource returned %d\n"),r);
  3810 			return r;
  3811 			}
  3812 
  3813 		infoPtrs.Close();
  3814 		}
  3815 
  3816 	// 12) To support the following test (and specific resource data tests, below) need a second channel to be using the resource
  3817 	_LIT(tempStr1,"ExtraChan1");
  3818 	TBufC<16> tempName1(tempStr1);
  3819 	RBusDevResManUs channelTwo;
  3820 	if((r=OpenChannel(tempName1, channelTwo))!=KErrNone)
  3821 		{
  3822 		gTest.Printf(_L("Failed to open channelTwo, %d\n"),r);
  3823 		channelTwo.Close();
  3824 		return r;
  3825 		}
  3826 	if ((r=channelTwo.Initialise(1,1,1))!=KErrNone)
  3827 		{
  3828 		gTest.Printf(_L("Failed to Initialise channelTwo, %d\n"),r);
  3829 		channelTwo.Close();
  3830 		return r;
  3831 		}
  3832 	// Attempt to change the resource level
  3833 	// Get initial state
  3834 	TRequestStatus status;
  3835 	TBool cached = gUseCached;
  3836 	TInt readValue;
  3837 	TInt levelOwnerId = 0;
  3838 	channelTwo.GetResourceState(status,gSharedResource,cached,&readValue,&levelOwnerId);
  3839 	User::WaitForRequest(status);
  3840 	r=status.Int();
  3841 	if(r != KErrNone)
  3842 		{
  3843 		gTest.Printf(_L("GetResourceState for gSharedResource completed with = 0x%x\n"),r);
  3844 		return r;
  3845 		}
  3846 	// Write updated state
  3847 	TUint newLevel = (TUint)(readValue + gSharedResStateDelta);
  3848 	channelTwo.ChangeResourceState(status,gSharedResource,newLevel);
  3849 	User::WaitForRequest(status);
  3850 	r=status.Int();
  3851 	if(r != KErrNone)
  3852 		{
  3853 		gTest.Printf(_L("ChangeResourceState forgSharedResource completed with %d\n"),r);
  3854 		return r;
  3855 		}
  3856 
  3857 	// Attempt to read the client information (without re-loading) with a buffer of insufficient size should
  3858 	// return error KErrArgument
  3859 	gTest.Printf(_L("TestTransientHandling: test %d\n"),testNo++);
  3860 		{
  3861 		TUint numClients = 0;
  3862 		if((r=gChannel.GetNumClientsUsingResource(gSharedResource, numClients, EFalse))!=KErrNone) // user-side clients, load the info
  3863 			{
  3864 			gTest.Printf(_L("GetNumClientsUsingResource returned %d\n"),r);
  3865 			channelTwo.Close();
  3866 			return r;
  3867 			}
  3868 		// To support the GetInfoOnClientsUsingResource testing, instantiate TClientInfoBuf objects
  3869 		// and reference via an RSimplePointerArray
  3870 		RSimplePointerArray<TClientInfoBuf> infoPtrs(numClients-1);
  3871 		for(TUint i=0;i<(numClients-1);i++)
  3872 			{
  3873 			TClientInfoBuf *info = new TClientInfoBuf();
  3874 			if((r=infoPtrs.Insert(info, i))!=KErrNone)
  3875 				{
  3876 				gTest.Printf(_L("TestTransientHandling test, GetInfoOnClientsUsingResource infoPtrs.Insert at index %d returned %d\n"),testNo,i,r);
  3877 				channelTwo.Close();
  3878 				}
  3879 			}
  3880 		if((r=gChannel.GetInfoOnClientsUsingResource(gSharedResource, numClients, &infoPtrs, EFalse))!=KErrArgument)
  3881 			{
  3882 			gTest.Printf(_L("TestTransientHandling: GetInfoOnClientsUsingResource for gLongLatencyResource returned %d\n"),r);
  3883 			channelTwo.Close();
  3884 			return KErrGeneral;
  3885 			}
  3886 		// Ensure misleading result is not returned
  3887 		r=KErrNone;
  3888 		infoPtrs.Close();
  3889 		}
  3890 
  3891 
  3892 	//
  3893 	//					Specific resource data tests
  3894 	//
  3895 
  3896 	gTest.Printf(_L("TestTransientHandling: Client-specific data tests ...\n"));
  3897 	testNo=1;
  3898 
  3899 	// These tests require a client name
  3900 	TBuf8<MAX_RESOURCE_NAME_LENGTH+1>name8Bit;
  3901 	name8Bit.Copy(gTestName);
  3902 	TClientName* clientName = (TClientName*)&name8Bit;
  3903 #if _DEBUG
  3904 	TBuf <MAX_CLIENT_NAME_LENGTH> clientName16Bit;
  3905 	clientName16Bit.Copy(*clientName);
  3906 	clientName16Bit.SetLength(clientName->Length());
  3907 	gTest.Printf(_L("Invoking TestTransientHandling client-specific data tests  with %S \n"),&clientName16Bit);
  3908 #endif
  3909 	// 13) Attempt to read the resource information without having previously loaded it.
  3910 	gTest.Printf(_L("TestTransientHandling: test %d\n"),testNo++);
  3911 		{
  3912 		TUint numResources = 0;
  3913 		if((r=gChannel.GetNumResourcesInUseByClient(*clientName, numResources, EFalse))!=KErrNone) // EFalse - don't load data
  3914 			{
  3915 			gTest.Printf(_L("GetNumResourcesInUseByClient returned %d\n"),r);
  3916 			return r;
  3917 			}
  3918 		// To support the GetInfoOnResourcesInUseByClient testing, instantiate TResourceInfoBuf objects
  3919 		// and reference via an RSimplePointerArray
  3920 		RSimplePointerArray<TResourceInfoBuf> infoPtrs(numResources);
  3921 		for(TUint i=0;i<numResources;i++)
  3922 			{
  3923 			TResourceInfoBuf *info = new TResourceInfoBuf();
  3924 			if((r=infoPtrs.Insert(info, i))!=KErrNone)
  3925 				{
  3926 				gTest.Printf(_L("TestTransientHandling test, GetAllResourcesInfo infoPtrs.Insert at index %d returned %d\n"),testNo,i,r);
  3927 				}
  3928 			}
  3929 		if((r=gChannel.GetInfoOnResourcesInUseByClient(*clientName, numResources, &infoPtrs))!=KErrNotReady)
  3930 			{
  3931 			gTest.Printf(_L("TestTransientHandling: GetInfoOnClientsUsingResource returned %d\n"),r);
  3932 			return KErrGeneral;
  3933 			}
  3934 		else
  3935 			r=KErrNone;	// Ensure misleading result is not propagated
  3936 		infoPtrs.Close();
  3937 		}
  3938 
  3939 	// 14) To support the following test need a third channel
  3940 	_LIT(tempStr2,"ExtraChan2");
  3941 	TBufC<16> tempName2(tempStr2);
  3942 	RBusDevResManUs channelThree;
  3943 	if((r=OpenChannel(tempName2, channelThree))!=KErrNone)
  3944 		{
  3945 		gTest.Printf(_L("Failed to open channelThree, %d\n"),r);
  3946 		channelTwo.Close();
  3947 		return r;
  3948 		}
  3949 	// Read the number of resources (and, by default, read the resource information)
  3950 	// Subsequent call to read the resource information (without re-loading) should return be successful
  3951 	// Call to read the information for a client name with zero resource requirements (without re-loading) should return KErrNone, numResources==0
  3952 	// Call to read the information for a client name with one or more resource requirements (without re-loading) should return KErrNotReady
  3953 	gTest.Printf(_L("TestTransientHandling: test %d\n"),testNo++);
  3954 		{
  3955 		TUint numResources = 0;
  3956 		if((r=gChannel.GetNumResourcesInUseByClient(*clientName, numResources))!=KErrNone) // load data
  3957 			{
  3958 			gTest.Printf(_L("GetNumResourcesInUseByClient returned %d\n"),r);
  3959 			return r;
  3960 			}
  3961 		// To support the GetInfoOnResourcesInUseByClient testing, instantiate TResourceInfoBuf objects
  3962 		// and reference via an RSimplePointerArray
  3963 		RSimplePointerArray<TResourceInfoBuf> infoPtrs(numResources);
  3964 		for(TUint i=0;i<numResources;i++)
  3965 			{
  3966 			TResourceInfoBuf *info = new TResourceInfoBuf();
  3967 			if((r=infoPtrs.Insert(info, i))!=KErrNone)
  3968 				{
  3969 				gTest.Printf(_L("TestTransientHandling test, GetAllResourcesInfo infoPtrs.Insert at index %d returned %d\n"),testNo,i,r);
  3970 				}
  3971 			}
  3972 		if((r=gChannel.GetInfoOnResourcesInUseByClient(*clientName, numResources, &infoPtrs))!=KErrNone)
  3973 			{
  3974 			gTest.Printf(_L("TestTransientHandling: gChannel GetInfoOnClientsUsingResource returned %d\n"),r);
  3975 			return KErrGeneral;
  3976 			}
  3977 		TUint dumResources=0;
  3978 		TBuf8<MAX_RESOURCE_NAME_LENGTH+1>name8Bit2;
  3979 		name8Bit2.Copy(tempName2);
  3980 		TClientName* clientName2 = (TClientName*)&name8Bit2;
  3981 		if((r=gChannel.GetInfoOnResourcesInUseByClient(*clientName2, dumResources, &infoPtrs))!=KErrNone)
  3982 			{
  3983 			gTest.Printf(_L("TestTransientHandling: tempName2 GetInfoOnClientsUsingResource returned %d\n"),r);
  3984 			return KErrGeneral;
  3985 			}
  3986 		if(dumResources!=0)
  3987 			{
  3988 			gTest.Printf(_L("TestTransientHandling: tempName2 GetInfoOnClientsUsingResource dumResources=%d\n"),dumResources);
  3989 			return KErrGeneral;
  3990 			}
  3991 		TBuf8<MAX_RESOURCE_NAME_LENGTH+1>name8Bit1;
  3992 		name8Bit1.Copy(tempName1);
  3993 		TClientName* clientName1 = (TClientName*)&name8Bit1;
  3994 		if((r=gChannel.GetInfoOnResourcesInUseByClient(*clientName1, numResources, &infoPtrs))!=KErrNotReady)
  3995 			{
  3996 			gTest.Printf(_L("TestTransientHandling: tempName1 GetInfoOnClientsUsingResource returned %d\n"),r);
  3997 			return KErrGeneral;
  3998 			}
  3999 
  4000 		infoPtrs.Close();
  4001 		}
  4002 
  4003 
  4004 	// 15) Repeat the read the number of resources without reading the resource information
  4005 	// Subsequent call to read the resources information (without re-loading) should return error KErrNotReady
  4006 	// Then call to read the resources information (with re-loading) should be successful
  4007 	gTest.Printf(_L("TestTransientHandling: test %d\n"),testNo++);
  4008 		{
  4009 		TUint numResources = 0;
  4010 		if((r=gChannel.GetNumResourcesInUseByClient(*clientName, numResources, EFalse))!=KErrNone) // don't load data
  4011 			{
  4012 			gTest.Printf(_L("GetNumResourcesInUseByClient returned %d\n"),r);
  4013 			return r;
  4014 			}
  4015 		// To support the GetInfoOnResourcesInUseByClient testing, instantiate TResourceInfoBuf objects
  4016 		// and reference via an RSimplePointerArray
  4017 		RSimplePointerArray<TResourceInfoBuf> infoPtrs(numResources);
  4018 		for(TUint i=0;i<numResources;i++)
  4019 			{
  4020 			TResourceInfoBuf *info = new TResourceInfoBuf();
  4021 			if((r=infoPtrs.Insert(info, i))!=KErrNone)
  4022 				{
  4023 				gTest.Printf(_L("TestTransientHandling test, GetAllResourcesInfo infoPtrs.Insert at index %d returned %d\n"),testNo,i,r);
  4024 				}
  4025 			}
  4026 		if((r=gChannel.GetInfoOnResourcesInUseByClient(*clientName, numResources, &infoPtrs))!=KErrNotReady)
  4027 			{
  4028 			gTest.Printf(_L("TestTransientHandling: GetInfoOnResourcesInUseByClient returned %d\n"),r);
  4029 			return KErrGeneral;
  4030 			}
  4031 		if((r=gChannel.GetInfoOnResourcesInUseByClient(*clientName, numResources, &infoPtrs, ETrue))!=KErrNone)
  4032 			{
  4033 			gTest.Printf(_L("TestTransientHandling: GetInfoOnResourcesInUseByClient returned %d\n"),r);
  4034 			return r;
  4035 			}
  4036 		infoPtrs.Close();
  4037 		}
  4038 
  4039 
  4040 	// 16) Attempt to read the resource information (without re-loading) with a buffer of insufficient size should
  4041 	// return error KErrArgument
  4042 	gTest.Printf(_L("TestTransientHandling: test %d\n"),testNo++);
  4043 		{
  4044 		TUint numResources = 0;
  4045 		if((r=gChannel.GetNumResourcesInUseByClient(*clientName, numResources))!=KErrNone) // load data
  4046 			{
  4047 			gTest.Printf(_L("GetNumResourcesInUseByClient returned %d\n"),r);
  4048 			return r;
  4049 			}
  4050 		// To support the GetInfoOnResourcesInUseByClient testing, instantiate TResourceInfoBuf objects
  4051 		// and reference via an RSimplePointerArray
  4052 		RSimplePointerArray<TResourceInfoBuf> infoPtrs(numResources-1);
  4053 		for(TUint i=0;i<(numResources-1);i++)
  4054 			{
  4055 			TResourceInfoBuf *info = new TResourceInfoBuf();
  4056 			if((r=infoPtrs.Insert(info, i))!=KErrNone)
  4057 				{
  4058 				gTest.Printf(_L("TestTransientHandling test, GetAllResourcesInfo infoPtrs.Insert at index %d returned %d\n"),testNo,i,r);
  4059 				}
  4060 			}
  4061 		if((r=gChannel.GetInfoOnResourcesInUseByClient(*clientName, numResources, &infoPtrs))!=KErrArgument)
  4062 			{
  4063 			gTest.Printf(_L("TestTransientHandling: GetInfoOnResourcesInUseByClient returned %d\n"),r);
  4064 			return KErrGeneral;
  4065 			}
  4066 
  4067 		// Ensure misleading result is not returned
  4068 		r=KErrNone;
  4069 		infoPtrs.Close();
  4070 		}
  4071 
  4072 	channelTwo.Close();
  4073 	channelThree.Close();
  4074 
  4075 	return r;
  4076 	}
  4077 
  4078 
  4079 EXPORT_C TInt E32Main()
  4080 //
  4081 // Main
  4082 //
  4083     {
  4084 	gTest.Start(_L("Test Power Resource Manager user side API\n"));
  4085   
  4086 	TInt r = KErrNone;
  4087 
  4088 	// Test attempted load of PDD
  4089     gTest.Next(_L("**Load PDD\n"));
  4090     r=User::LoadPhysicalDevice(PDD_NAME);
  4091     if((r!=KErrNone)&&(r!=KErrAlreadyExists))
  4092 		{
  4093 		gTest.Printf(_L("User::LoadPhysicalDevice error %d\n"),r);
  4094 		}
  4095 	else
  4096 		{
  4097 		// Test attempted load of LDD
  4098 		gTest.Next(_L("**Load LDD\n"));
  4099 		r=User::LoadLogicalDevice(LDD_NAME);
  4100 		if((r!=KErrNone)&&(r!=KErrAlreadyExists))
  4101 			gTest.Printf(_L("User::LoadLogicalDevice error - expected %d, got %d\n"),KErrAlreadyExists,r);
  4102 		}
  4103     if((r==KErrNone)||(r==KErrAlreadyExists))
  4104 		{
  4105 		r = KErrNone; // Re-initialise in case set to KErrAlreadyExists
  4106 		//
  4107 		// Need a channel open for the following tests
  4108 		gTest.Next(_L("**OpenAndRegisterChannel\n"));
  4109 		r=OpenAndRegisterChannel();
  4110 		if (r==KErrNone)
  4111 			{
  4112 			// Get the version of the ResourceController
  4113 			TUint version;
  4114 			if((r=gChannel.GetResourceControllerVersion(version))!=KErrNone)
  4115 				{
  4116 				gTest.Printf(_L("TestTransientHandling: GetResourceControllerVersion returned %d\n"),r);
  4117 				return r;
  4118 				}
  4119 			gTest.Printf(_L("TestTransientHandling: ResourceController version =0x%x\n"),version);
  4120 			}
  4121 		if (r==KErrNone)
  4122 			{
  4123 			gTest.Next(_L("**TestThreadExclusiveAccess\n"));
  4124 			r=TestThreadExclusiveAccess();
  4125 			}
  4126 		if (r==KErrNone)
  4127 			{
  4128 			gTest.Next(_L("**TestGetClientGetResourceInfo - initial state\n"));
  4129 			r=TestGetClientGetResourceInfo();
  4130 			}
  4131 		if (r==KErrNone)
  4132 			{
  4133 			gTest.Next(_L("**TestGetSetResourceStateOps\n"));
  4134 			r=TestGetSetResourceStateOps();
  4135 			}
  4136 		if (r==KErrNone)
  4137 			{
  4138 			gTest.Next(_L("**TestGetClientGetResourceInfo - after changing stateof Async resource\n"));
  4139 			r=TestGetClientGetResourceInfo();
  4140 			}
  4141 		if (r==KErrNone)
  4142 			{
  4143 			gTest.Next(_L("**TestGetSetResourceStateQuota\n"));
  4144 			r=TestGetSetResourceStateQuota();
  4145 			}
  4146 		if (r==KErrNone)
  4147 			{
  4148 			gTest.Next(_L("**TestNotificationOps\n"));
  4149 			r=TestNotificationOps();
  4150 			}
  4151 		if (r==KErrNone)
  4152 			{
  4153 			gTest.Next(_L("**TestNotificationQuota\n"));
  4154 			r=TestNotificationQuota();
  4155 			}
  4156 		if (r==KErrNone)
  4157 			{
  4158 			// Should be no change since last invocation (assuming that
  4159 			// no clients other than those in this test)
  4160 			gTest.Next(_L("**TestGetClientGetResourceInfo - last invocation\n"));
  4161 			r=TestGetClientGetResourceInfo();
  4162 			}
  4163 		if (r==KErrNone)
  4164 			{
  4165 			gTest.Next(_L("**TestAdditionalThread\n"));
  4166 			r=TestAdditionalThread();
  4167 			}
  4168 		if (r==KErrNone)
  4169 			{
  4170 			gTest.Next(_L("**TestTransientHandling\n"));
  4171 			r=TestTransientHandling();
  4172 			}
  4173 		}
  4174 	gChannel.Close();
  4175 
  4176     User::FreeLogicalDevice(KLddRootName);
  4177     User::FreePhysicalDevice(PDD_NAME);	
  4178 	User::After(100000);	// Allow idle thread to run for driver unloading
  4179 
  4180 	gTest.End();
  4181 	return r;
  4182     }
  4183