os/kernelhwsrv/kerneltest/e32test/demandpaging/t_tbus_datapaging.cpp
author sl
Tue, 10 Jun 2014 14:32:02 +0200
changeset 1 260cb5ec6c19
permissions -rw-r--r--
Update contrib.
     1 // Copyright (c) 2008-2009 Nokia Corporation and/or its subsidiary(-ies).
     2 // All rights reserved.
     3 // This component and the accompanying materials are made available
     4 // under the terms of the License "Eclipse Public License v1.0"
     5 // which accompanies this distribution, and is available
     6 // at the URL "http://www.eclipse.org/legal/epl-v10.html".
     7 //
     8 // Initial Contributors:
     9 // Nokia Corporation - initial contribution.
    10 //
    11 // Contributors:
    12 //
    13 // Description:
    14 // e32test\demandpaging\t_tbus_datapaging.cpp
    15 // Functional tests for data paging.
    16 // 002 ???
    17 // 003 ???
    18 //
    19 
    20 //! @SYMTestCaseID			KBASE-T_TBUS_DATAPAGING
    21 //! @SYMTestType			UT
    22 //! @SYMPREQ				???
    23 //! @SYMTestCaseDesc		Data Paging functional tests with TBusLocalDrive.
    24 //! @SYMTestActions			001 ???
    25 //! @SYMTestExpectedResults All tests should pass.
    26 //! @SYMTestPriority        High
    27 //! @SYMTestStatus          Implementation on-going
    28 
    29 #define __E32TEST_EXTENSION__
    30 #include <e32test.h>
    31 #include <dptest.h>
    32 #include <e32hal.h>
    33 #include <u32exec.h>
    34 #include <e32svr.h>
    35 #include <e32panic.h>
    36 #include "u32std.h"
    37 
    38 #include <f32file.h>
    39 #include <f32dbg.h>
    40 #include <f32fsys.h>
    41 
    42 #include "t_dpcmn.h"
    43 #include "../secure/d_sldd.h"
    44 #include "../mmu/mmudetect.h"
    45 
    46 const TInt KMaxLengthOfStoreMapping = 16 + sizeof(TInt32) + KMaxMediaPassword;
    47 const TInt KMaxPersistentStore(TPasswordStore::EMaxPasswordLength+KMaxLengthOfStoreMapping);
    48 typedef TBuf8<KMaxPersistentStore> TPersistentStore;
    49 
    50 RChunk gMyChunk;
    51 TUint gOffset = 0;
    52 TUint8* gData = NULL;
    53 const TUint8 KClearValue = 0xed;
    54 const TUint  KChunkSizeInPages = 64;	// 64 * 4096 = 256K
    55 const TInt KTestBufLen=256;
    56 
    57 
    58 #define __DECLARE_VAR_IN_CHUNK(type, varRef)											\
    59 									type varRef = *(type*) (gData+gOffset);				\
    60 									gOffset += Max(gPageSize, sizeof(type));			\
    61 									test(gOffset <= gPageSize * KChunkSizeInPages);
    62 
    63 #define __DECLARE_AND_INIT_VAR_IN_CHUNK(type, var)										\
    64 									type &var = *(type*) (gData+gOffset);				\
    65 									var = type();										\
    66 									gOffset += Max(gPageSize, sizeof(type));			\
    67 									test(gOffset <= gPageSize * KChunkSizeInPages);	
    68 
    69 
    70 #define __DECLARE_ARRAY_IN_CHUNK(type, var, size)										\
    71 									type *var = (type*) (gData+gOffset);				\
    72 									gOffset += Max(gPageSize, (sizeof(type) * size));	\
    73 									test(gOffset <= gPageSize * KChunkSizeInPages);
    74 									
    75 #define __FLUSH_AND_CALL_API_METHOD(return, function)									\
    76 											DPTest::FlushCache(); 						\
    77 											return = function;
    78 											
    79 
    80 LOCAL_D RFs TheFs;
    81 TInt gFsDriveNumber	= -1;
    82 	
    83 RTest test(_L("T_TBUS_DATAPAGING"));
    84 _LIT(KChunkName, "t_datapaging chunk");
    85 
    86 const TUint KDriveAttMask = KDriveAttLocal | KDriveAttRom | KDriveAttRemote;
    87 const TUint KMediaAttMask = KMediaAttVariableSize | KMediaAttDualDensity | KMediaAttLockable | KMediaAttLocked | KMediaAttHasPassword  | KMediaAttReadWhileWrite;
    88 
    89 void CreatePagedChunk(TInt aSizeInPages, TInt aWipeByte = -1)
    90 	{
    91 	test_Equal(0,gMyChunk.Handle());
    92 	
    93 	TChunkCreateInfo createInfo;
    94 	TInt size = aSizeInPages * gPageSize;
    95 	createInfo.SetNormal(size, size);
    96 	createInfo.SetPaging(TChunkCreateInfo::EPaged);
    97 	createInfo.SetOwner(EOwnerProcess);
    98 	createInfo.SetGlobal(KChunkName);
    99 	if (aWipeByte != -1)
   100 		createInfo.SetClearByte(aWipeByte);
   101 	test_KErrNone(gMyChunk.Create(createInfo));
   102 	test(gMyChunk.IsPaged()); // this is only ever called if data paging is supported
   103 	
   104 	gData = gMyChunk.Base();
   105 	}
   106 	
   107 TInt TestDriveConnectAndCaps(TBusLocalDrive &aDrive, TInt &aLocalDriveNumber)
   108 	{
   109 
   110 	test.Next(_L("Test Drive Connect And Caps"));
   111 
   112 	__DECLARE_VAR_IN_CHUNK(TInt, &r);
   113 	
   114 	test.Printf(_L("changeFlag...\n"));
   115 	__DECLARE_VAR_IN_CHUNK(TBool, &changeFlag);
   116 	changeFlag = EFalse;
   117 	
   118 	test.Printf(_L("call aDrive.Connect()...\n"));	
   119 	__FLUSH_AND_CALL_API_METHOD(r, aDrive.Connect(aLocalDriveNumber,changeFlag));
   120 	
   121 	test.Printf(_L("r:%d\n"),r);	
   122 	test_Equal(KErrNone, r);
   123 	
   124 	test.Printf(_L("call aDrive.Caps()...\n"));	
   125 	__DECLARE_VAR_IN_CHUNK(TLocalDriveCapsV5, &driveCaps);
   126 	
   127 	TPckg<TLocalDriveCapsV5> capsPckg(driveCaps); 
   128 	__FLUSH_AND_CALL_API_METHOD(r, aDrive.Caps(capsPckg));
   129 	
   130 	test_Equal(KErrNone, r);
   131 	test.Printf(_L("r:%d\n"),r);
   132 	test.Printf(_L("driveCaps.iDriveAtt			:0x%08x\n"), driveCaps.iDriveAtt);
   133 	test.Printf(_L("driveCaps.iSize    			:%ld\n"), driveCaps.iSize);
   134 	test.Printf(_L("driveCaps.iSerialNumLength  :%d\n"), driveCaps.iSerialNumLength);
   135 	
   136 	return I64LOW(driveCaps.iSize);
   137 	}
   138 
   139 void TestDriveSizeRelatedMethods(TBusLocalDrive &aDrive, TInt aNewSize, TInt aOldSize)
   140 	{
   141 	TInt r;
   142 	
   143 	test.Next(_L("Test Drive Size Related Methods"));
   144 	test.Printf(_L("newDriveSize...\n"));
   145 	__DECLARE_VAR_IN_CHUNK(TInt, &newDriveSize);
   146 	newDriveSize = aNewSize;	
   147 	
   148 	test.Printf(_L("call aDrive.Enlarge()...\n"));
   149 	__FLUSH_AND_CALL_API_METHOD(r, aDrive.Enlarge(newDriveSize));
   150 	test.Printf(_L("r:%d\n"),r);
   151 	test((KErrNone == r) || (KErrNotSupported == r) || (KErrNotReady == r));
   152 	if(r != KErrNone )
   153 		{
   154 		test.Printf(_L("errInfo...\n"));
   155 		__DECLARE_ARRAY_IN_CHUNK(TUint8, errInfo, KTestBufLen);
   156 		
   157 		TPtr8 pErrInfoBuff(errInfo, KTestBufLen);
   158 		
   159 		__FLUSH_AND_CALL_API_METHOD(r, aDrive.GetLastErrorInfo(pErrInfoBuff));
   160 		test.Printf(_L("r:%d\n"),r);
   161 		test((KErrNone == r) || (KErrNotSupported == r));
   162 		}
   163 	
   164 	
   165 	test.Printf(_L("call aDrive.ReduceSize()...\n"));	
   166 	__FLUSH_AND_CALL_API_METHOD(r, aDrive.ReduceSize(0, aOldSize));
   167 	test((KErrNone == r) || (KErrNotSupported == r) || (KErrNotReady == r)); 
   168 
   169 	}
   170 
   171 void TestWriteReadRelatedMethods(TBusLocalDrive &aDrive)
   172 	{
   173 	
   174 	test.Next(_L("Test Write & Read Related Methods"));
   175 		
   176 	__DECLARE_VAR_IN_CHUNK(TInt, &r);
   177 	
   178 	test.Printf(_L("msgHandle...\n"));
   179 	__DECLARE_VAR_IN_CHUNK(TInt, &msgHandle);
   180 	msgHandle = KLocalMessageHandle;
   181 		
   182 
   183 	__DECLARE_VAR_IN_CHUNK(TUint, &i);
   184 	test.Printf(_L("wrBuf...\n"));	
   185 	TBuf8<KTestBufLen> wrBuf(KTestBufLen);
   186 	for (i=0 ; i<(TUint)KTestBufLen ; i++)
   187 		wrBuf[i]=(TUint8)i;
   188 	
   189 	
   190 	test.Printf(_L("wrBuf2...\n"));
   191 	__DECLARE_ARRAY_IN_CHUNK(TUint8, wrBuf2, KTestBufLen);
   192 			
   193 	test.Printf(_L("fill wrBuf2...\n"));
   194 	for (i=0 ; i<(TUint)KTestBufLen ; i++)
   195 		wrBuf2[i]=(TUint8)i;
   196 	
   197 	TPtr8 pWrBuf2(wrBuf2, KTestBufLen, KTestBufLen);
   198 	
   199 	test.Printf(_L("rdBuf...\n"));
   200 	TBuf8<KTestBufLen> rdBuf(KTestBufLen);
   201 	
   202 	
   203 	test.Printf(_L("rdBuf2...\n"));
   204 	__DECLARE_ARRAY_IN_CHUNK(TUint8, rdBuf2, KTestBufLen);
   205 	
   206 	TPtr8 pRdBuf2(rdBuf2, KTestBufLen);
   207 	
   208 	test.Printf(_L("call aDrive.Write()...\n"));	
   209 	rdBuf.Fill(0,KTestBufLen);
   210 	__FLUSH_AND_CALL_API_METHOD(r, aDrive.Write(0,KTestBufLen,&wrBuf,msgHandle,0));
   211 	test_Equal(KErrNone, r);
   212 	
   213 	
   214 	test.Printf(_L("call aDrive.Read()...\n"));	
   215 	__FLUSH_AND_CALL_API_METHOD(r, aDrive.Read(0,KTestBufLen,&rdBuf,msgHandle,0));
   216 	test_Equal(KErrNone, r);
   217 	
   218 	for (i=0 ; i<(TUint)KTestBufLen ; i++)
   219 		test_Equal(wrBuf[i], rdBuf[i]);
   220 	
   221 	test.Printf(_L("call aDrive.Write()...\n"));	
   222 	pRdBuf2.Fill(0,KTestBufLen);
   223 	__FLUSH_AND_CALL_API_METHOD(r, aDrive.Write(0,pWrBuf2));
   224 	test_Equal(KErrNone, r);
   225 	
   226 	
   227 	test.Printf(_L("call aDrive.Read()...\n"));	
   228 	__FLUSH_AND_CALL_API_METHOD(r, aDrive.Read(0,KTestBufLen, pRdBuf2));
   229 	test_Equal(KErrNone, r);
   230 	
   231 	for (i=0 ; i<(TUint)KTestBufLen ; i++)
   232 		test_Equal(wrBuf2[i], rdBuf2[i]);
   233 	
   234 	}
   235 
   236 void TestPasswordRelatedMethods(TBusLocalDrive &aDrive)
   237 	{
   238 	TInt r;
   239 	
   240 	test.Next(_L("Test Password Related Methods"));
   241 	//__DECLARE_VAR_IN_CHUNK(TPersistentStore, &wStore);
   242 	
   243 	TPersistentStore* pstoreAB;
   244 	test((pstoreAB = new TPersistentStore) != 0);
   245 	TPersistentStore& wStore = *pstoreAB;
   246 
   247 	//__DECLARE_AND_INIT_VAR_IN_CHUNK(TPersistentStore, wStore);
   248 	
   249 	// Password related API methods call
   250 	test.Printf(_L("call aDrive.WritePasswordData() to clear passwords...\n"));	
   251 	__DECLARE_VAR_IN_CHUNK(TInt, &passwordStoreLength);
   252 	
   253 	TBuf8<1> nulSt;
   254 	__FLUSH_AND_CALL_API_METHOD(r, aDrive.WritePasswordData(nulSt));
   255 	test( r == KErrNone);// empty
   256 	
   257 	test.Printf(_L("call aDrive.PasswordStoreLengthInBytes()...\n"));	
   258 	__FLUSH_AND_CALL_API_METHOD(passwordStoreLength, aDrive.PasswordStoreLengthInBytes());
   259 	
   260 	test.Printf(_L("passwordStoreLength:%d\n"), passwordStoreLength);
   261 	test_Equal(0, passwordStoreLength);
   262 
   263 
   264 	test.Printf(_L("call aDrive.ErasePassword()...\n"));	
   265 	__FLUSH_AND_CALL_API_METHOD(r, aDrive.ErasePassword());
   266 	test.Printf(_L("r:%d\n"),r);
   267 	
   268 
   269 	test.Printf(_L("wStore.Size():%d\n"),wStore.Size());
   270 	__FLUSH_AND_CALL_API_METHOD(r, aDrive.WritePasswordData(wStore));
   271 	
   272 	test.Printf(_L("r:%d\n"),r);
   273 	test((KErrNone == r)); // || (KErrCorrupt == r));		// TO-DO Why Corrupt???
   274 	
   275 	__FLUSH_AND_CALL_API_METHOD(passwordStoreLength, aDrive.PasswordStoreLengthInBytes());
   276 	
   277 	test.Printf(_L("passwordStoreLength:%d\n"), passwordStoreLength);
   278 	test((r == KErrNone ?  (wStore.Size() == passwordStoreLength) : (0 == passwordStoreLength) ));
   279 	
   280 
   281 
   282 	test.Printf(_L("Set and store a password...\n"));		
   283 	TDes8 &st = wStore;
   284 	TMediaPassword a((const TUint8*) "CID0ccccccccccc#");
   285 	TUint8 passLen[sizeof(TInt32)];
   286 	passLen[0] = 0;
   287 	passLen[1] = 0;
   288 	passLen[2] = 0;
   289 	passLen[3] = 16;
   290 	
   291 	//test.Printf(_L("Password3:'%S'\n"), &a);
   292 	
   293 	st.Append(a);
   294 	st.Append(passLen, sizeof(TInt32));
   295 	st.Append(a);
   296 	
   297 	test.Printf(_L("wStore.Size():%d\n"),wStore.Size());
   298 	__FLUSH_AND_CALL_API_METHOD(r, aDrive.WritePasswordData(wStore));
   299 	
   300 	test.Printf(_L("r:%d\n"),r);
   301 	test((KErrNone == r));
   302 	
   303 	__FLUSH_AND_CALL_API_METHOD(passwordStoreLength, aDrive.PasswordStoreLengthInBytes());
   304 	
   305 	test.Printf(_L("passwordStoreLength:%d\n"), passwordStoreLength);
   306 	test((r == KErrNone ?  (wStore.Size() == passwordStoreLength) : (0 == passwordStoreLength) ));
   307 	
   308 	test.Printf(_L("call aDrive.ErasePassword()...\n"));	
   309 	__FLUSH_AND_CALL_API_METHOD(r, aDrive.ErasePassword());
   310 	test.Printf(_L("r:%d\n"),r);
   311 	
   312 	test.Printf(_L("call aDrive.WritePasswordData() to set password again...\n"));	
   313 	test.Printf(_L("wStore.Size():%d\n"),wStore.Size());
   314 	__FLUSH_AND_CALL_API_METHOD(r, aDrive.WritePasswordData(wStore));
   315 	
   316 	test.Printf(_L("r:%d\n"),r);
   317 	test((KErrNone == r));
   318 	
   319 	__FLUSH_AND_CALL_API_METHOD(passwordStoreLength, aDrive.PasswordStoreLengthInBytes());
   320 	
   321 	test.Printf(_L("passwordStoreLength:%d\n"), passwordStoreLength);
   322 	test((r == KErrNone ?  (wStore.Size() == passwordStoreLength) : (0 == passwordStoreLength) ));
   323 	
   324 	
   325 	// Finally erase password
   326 	test.Printf(_L("call aDrive.WritePasswordData() to erase password...\n"));		
   327 	wStore.Zero();	// empty password store
   328 	__FLUSH_AND_CALL_API_METHOD(r, aDrive.WritePasswordData(wStore))
   329 	test( r == KErrNone);// Clear
   330 	
   331 	__FLUSH_AND_CALL_API_METHOD(passwordStoreLength, aDrive.PasswordStoreLengthInBytes());
   332 	
   333 	test.Printf(_L("passwordStoreLength:%d\n"), passwordStoreLength);
   334 	test((r == KErrNone ?  (wStore.Size() == passwordStoreLength) : (0 == passwordStoreLength) ));
   335 	
   336 	
   337 	
   338 	// Test SetPassword
   339 	TMediaPassword nul(nulSt);
   340 	
   341 	test.Printf(_L("call aDrive.SetPassword()...\n"));	
   342 	__FLUSH_AND_CALL_API_METHOD(r, aDrive.SetPassword(nul, a, EFalse));
   343 	test.Printf(_L("r:%d\n"),r);
   344 	test_Equal(KErrNone, r);
   345 	
   346 	// Erase Password
   347 	test.Printf(_L("call aDrive.ErasePassword()...\n"));	
   348 	__FLUSH_AND_CALL_API_METHOD(r, aDrive.ErasePassword());
   349 	test.Printf(_L("r:%d\n"),r);
   350 	
   351 
   352 	test.Printf(_L("call aDrive.SetPassword()...\n"));	
   353 	__FLUSH_AND_CALL_API_METHOD(r, aDrive.SetPassword(nul, a, EFalse));
   354 	test.Printf(_L("r:%d\n"),r);
   355 	test_Equal(KErrNone, r);
   356 	
   357 	// Erase Clear
   358 	test.Printf(_L("call aDrive.Clear()...\n"));	
   359 	__FLUSH_AND_CALL_API_METHOD(r, aDrive.Clear(a));
   360 	test.Printf(_L("r:%d\n"),r);
   361 	
   362 	
   363 	test.Printf(_L("call aDrive.SetPassword() to clear again...\n"));	
   364 	__FLUSH_AND_CALL_API_METHOD(r, aDrive.SetPassword(a, nul, EFalse));
   365 	test.Printf(_L("r:%d\n"),r);
   366 	test_Equal(KErrAccessDenied, r);
   367 	
   368 	
   369 	// Finally erase password
   370 	test.Printf(_L("call aDrive.WritePasswordData() to erase password...\n"));		
   371 	wStore.Zero();	// empty password store
   372 	__FLUSH_AND_CALL_API_METHOD(r, aDrive.WritePasswordData(wStore))
   373 	test( r == KErrNone);// Clear
   374 	
   375 	__FLUSH_AND_CALL_API_METHOD(passwordStoreLength, aDrive.PasswordStoreLengthInBytes());
   376 	
   377 	test.Printf(_L("passwordStoreLength:%d\n"), passwordStoreLength);
   378 	test((r == KErrNone ?  (wStore.Size() == passwordStoreLength) : (0 == passwordStoreLength) ));
   379 		
   380 	}
   381 
   382 void TestFormatRelatedMethods(TBusLocalDrive &aDrive, TInt aSize )
   383 	{
   384 	test.Next(_L("Test Format Related Methods"));	
   385 	
   386 	test.Printf(_L("call aDrive.Format(TFormatInfo)...\n"));	
   387 	__DECLARE_AND_INIT_VAR_IN_CHUNK(TFormatInfo, fi);
   388 	__DECLARE_VAR_IN_CHUNK(TInt, &ret);
   389 	__DECLARE_VAR_IN_CHUNK(TInt, &attempt);
   390 	
   391 	__FLUSH_AND_CALL_API_METHOD(ret, aDrive.Format(fi));
   392 	test.Printf(_L("ret:%d\n"),ret);
   393 	while(ret!=KErrEof)
   394 		{
   395 		if( ret == KErrNotReady )
   396 			{
   397 			attempt = 100;
   398 			while( (ret= aDrive.Format(fi)) == KErrNotReady && --attempt)
   399 				{
   400 				test.Printf(_L("attempt:%d\n"),attempt);
   401 				User::After(1000000);
   402 				}	
   403 			test(attempt);
   404 			}
   405 		else
   406 			{
   407 			test(ret==KErrNone);
   408 			ret= aDrive.Format(fi);	
   409 			}		
   410 		}
   411 	
   412 	
   413 	test.Printf(_L("call aDrive.Format(pos, length)...\n"));	
   414 	User::After(1000000);
   415 	
   416 	__DECLARE_VAR_IN_CHUNK(TInt64, &pos);
   417 	pos = 0;
   418 	__DECLARE_VAR_IN_CHUNK(TInt, &length);
   419 	length = aSize;
   420 	
   421 	attempt = 100;
   422 	__FLUSH_AND_CALL_API_METHOD(ret, aDrive.Format(pos, length));
   423 	while( ret == KErrNotReady && --attempt)
   424 		{
   425 		User::After(1000000);
   426 		ret= aDrive.Format(pos, length);
   427 		}	
   428 	test(attempt);
   429 	test_Equal(KErrNone, ret);
   430 
   431 	test.Printf(_L("End of TestFormatRelatedMethods)...\n"));
   432 	}
   433 
   434 void RestoreDriveState(void)
   435 	{
   436 	TBuf<3> bfDrv;
   437 
   438 	const TText KDrvLtr = 'A' + gFsDriveNumber;
   439 
   440 	bfDrv.Append(KDrvLtr);
   441 	_LIT(KBP, ":\\");
   442 	bfDrv.Append(KBP);
   443 
   444 
   445 	TheFs.Connect();
   446 	RFormat fmt;
   447 	TInt count;
   448 	
   449 	test(fmt.Open(TheFs, bfDrv, EHighDensity, count) == KErrNone);
   450 	while (count > 0)
   451 		{
   452 		test.Printf(_L("\rfmt:%d  "), count);
   453 		test(fmt.Next(count) == KErrNone);
   454 		}
   455 	test.Printf(_L("\n"));
   456 	fmt.Close();
   457 	
   458 	TheFs.Close();
   459 	}
   460 
   461 
   462 TInt FindDataPagingDrive()
   463 /** 
   464 Find the drive containing a swap partition.
   465 
   466 @return		Local drive identifier.
   467 */
   468 	{
   469 	TInt drive = KErrNotFound;
   470 	
   471 	test.Printf(_L("Searching for data paging drive:\n"));
   472 	
   473 	for(TInt i = 0; i < KMaxLocalDrives && drive < 0; ++i)
   474 		{
   475 		RLocalDrive	d;
   476 		TBool change = EFalse;
   477 		
   478 		if(d.Connect(i, change) == KErrNone)
   479 			{
   480 			TLocalDriveCapsV4			dc;
   481 			TPckg<TLocalDriveCapsV4>	capsPack(dc);
   482 			
   483 			if(d.Caps(capsPack) == KErrNone)
   484 				{
   485 				if ((dc.iMediaAtt & KMediaAttPageable) &&
   486 					(dc.iPartitionType == KPartitionTypePagedData))
   487 					{
   488 					test.Printf(_L("Found swap partition on local drive %d\n"), i);
   489 					drive = i;
   490 
   491 					TPageDeviceInfo pageDeviceInfo;
   492 
   493 					TPtr8 pageDeviceInfoBuf((TUint8*) &pageDeviceInfo, sizeof(pageDeviceInfo));
   494 					pageDeviceInfoBuf.FillZ();
   495 
   496 					TInt r = d.QueryDevice(RLocalDrive::EQueryPageDeviceInfo, pageDeviceInfoBuf);
   497 
   498 					test.Printf(_L("EQueryPageDeviceInfo on local drive %d returned %d\n"), i, r);
   499 					}
   500 				}
   501 			d.Close();
   502 			}
   503 		}
   504 	return drive;
   505 	}
   506 
   507 TDes& GetSerialNumber(TLocalDriveCapsV5& aCaps)
   508 	{
   509 	static TBuf16<80> serialNumBuf;
   510 
   511 	serialNumBuf.SetLength(0);
   512 
   513 	for (TUint n=0; n<aCaps.iSerialNumLength; n+=16)
   514 		{
   515 		for (TUint m=n; m<n+16; m++)
   516 			{
   517 			TBuf16<3> hexBuf;
   518 			hexBuf.Format(_L("%02X "), aCaps.iSerialNum[m]);
   519 			serialNumBuf.Append(hexBuf);
   520 			}
   521 		}
   522 
   523 	return serialNumBuf;
   524 	}
   525 
   526 TDes& GetSerialNumber(TMediaSerialNumber& aSerialNum)
   527 	{
   528 	static TBuf16<80> serialNumBuf;
   529 
   530 	serialNumBuf.SetLength(0);
   531 
   532 	TInt len = aSerialNum.Length();
   533 	for (TInt n=0; n<len; n+=16)
   534 		{
   535 		for (TInt m=n; m<n+16; m++)
   536 			{
   537 			TBuf16<3> hexBuf;
   538 			hexBuf.Format(_L("%02X "), aSerialNum[m]);
   539 			serialNumBuf.Append(hexBuf);
   540 			}
   541 		}
   542 
   543 	return serialNumBuf;
   544 	}
   545 
   546 TPtrC GetMediaType(TMediaType aType)
   547 	{
   548 	switch(aType)
   549 		{
   550 		case EMediaNotPresent: return _L("NotPresent");
   551 		case EMediaUnknown: return _L("Unknown");
   552 		case EMediaFloppy: return _L("Floppy");
   553 		case EMediaHardDisk: return _L("HardDisk");
   554 		case EMediaCdRom: return _L("CdRom");
   555 		case EMediaRam: return _L("Ram");
   556 		case EMediaFlash: return _L("Flash");
   557 		case EMediaRom: return _L("Rom");
   558 		case EMediaRemote: return _L("Remote");
   559 		case EMediaNANDFlash: return _L("NANDFlash");
   560 		case EMediaRotatingMedia : return _L("RotatingMedia ");
   561 		default:return _L("Unrecognised");
   562 		}
   563 	}
   564 
   565 TPtrC GetFileSystemId(TUint aFileSystemId)
   566 	{
   567 	switch(aFileSystemId)
   568 		{
   569 		case KDriveFileSysFAT: return _L("FAT");
   570 		case KDriveFileSysROM: return _L("ROM");
   571 		case KDriveFileSysLFFS: return _L("LFFS");
   572 		case KDriveFileSysROFS: return _L("ROFS");
   573 		case KDriveFileNone: return _L("None");
   574 		default:return _L("Unrecognised");
   575 		}
   576 	}
   577 
   578 
   579 
   580 // Find a drive which contains the swap partition; if this succeeds, find and return the FAT drive on the same media.
   581 // This isn't fool-proof as it works by comparing media types/drive attributes/media attributes/serial numbers
   582 TInt FindFatDriveOnDataPagingMedia()
   583 	{
   584 	TInt dataPagingDrive = FindDataPagingDrive();
   585 	if (dataPagingDrive == KErrNotFound)
   586 		return KErrNotFound;
   587 
   588 	TInt fatDriveNumber = KErrNotFound;
   589 		
   590 	test.Printf(_L("Finding Fat drive on datapaging media...\n"));
   591 	
   592 	RLocalDrive	dpDrive;
   593 	TBool change = EFalse;
   594 
   595 	TInt r = dpDrive.Connect(dataPagingDrive, change);
   596 	test(r == KErrNone);
   597 	TLocalDriveCapsV5 dpDriveCaps;
   598 	TPckg<TLocalDriveCapsV5> capsPack(dpDriveCaps);
   599 	r = dpDrive.Caps(capsPack);
   600 	test(r == KErrNone);
   601 	TPtrC8 dpDriveSerialNum(dpDriveCaps.iSerialNum, dpDriveCaps.iSerialNumLength);
   602 	dpDrive.Close();
   603 
   604 	TPtrC mediaType = GetMediaType(dpDriveCaps.iType);
   605 	TPtrC fileSystemId = GetFileSystemId(dpDriveCaps.iFileSystemId);
   606 	test.Printf(_L("Swap Drive %2d Type %S DriveAtt 0x%x MediaAtt 0x%x FileSysId %S SerialNum %S\n"), 
   607 		dataPagingDrive, &mediaType, dpDriveCaps.iDriveAtt, dpDriveCaps.iMediaAtt, &fileSystemId, &GetSerialNumber(dpDriveCaps));
   608 
   609 	// swap partition should be hidden 
   610 	test (dpDriveCaps.iDriveAtt & KDriveAttHidden);
   611 
   612 	// search for a FAT drive on the same media by searching for a drive which has
   613 	// 'similar' drive & media attributes as the the swap drive
   614 
   615 	dpDriveCaps.iDriveAtt&= KDriveAttMask;
   616 	dpDriveCaps.iMediaAtt&= KMediaAttMask;
   617 
   618 	for (TInt i = 0; i < KMaxLocalDrives /*&& fatDriveNumber == KErrNotFound*/; ++i)
   619 		{
   620 		RLocalDrive	d;
   621 		TBool change = EFalse;
   622 		
   623 		if(d.Connect(i, change) == KErrNone)
   624 			{
   625 			TLocalDriveCapsV5			caps;
   626 			TPckg<TLocalDriveCapsV5>	capsPack(caps);
   627 
   628 			r = d.Caps(capsPack);
   629 			if (r != KErrNone)
   630 				continue;
   631 
   632 			TPtrC8 localSerialNum(caps.iSerialNum, caps.iSerialNumLength);
   633 			TPtrC mediaType = GetMediaType(caps.iType);
   634 			TPtrC fileSystemId = GetFileSystemId(caps.iFileSystemId);
   635 			test.Printf(_L("Drive %2d Type %S DriveAtt 0x%x MediaAtt 0x%x FileSysId %S SerialNum %S\n"), 
   636 				i, &mediaType, caps.iDriveAtt, caps.iMediaAtt, &fileSystemId, &GetSerialNumber(caps));
   637 
   638 			// Turn off bits which may be different
   639 			caps.iDriveAtt&= KDriveAttMask;
   640 			caps.iMediaAtt&= KMediaAttMask;
   641 
   642 			if ((caps.iType == dpDriveCaps.iType) &&
   643 				(caps.iDriveAtt == dpDriveCaps.iDriveAtt) && 
   644 				(caps.iMediaAtt == dpDriveCaps.iMediaAtt) && 
   645 				(localSerialNum.Compare(dpDriveSerialNum) == 0) &&
   646 				(caps.iFileSystemId == KDriveFileSysFAT))
   647 				{
   648 				if (fatDriveNumber == KErrNotFound)
   649 					fatDriveNumber = i;
   650 				}
   651 			d.Close();
   652 			}
   653 		}
   654 
   655 
   656 	return fatDriveNumber;
   657 	}
   658 
   659 
   660 // Find and return the File Server drive number (0-25) corresponing to the passed local drive number
   661 // This isn't fool-proof as it works by comparing media types/drive attributes/media attributes/serial numbers
   662 TInt FindFsDriveNumber(TInt aLocalDriveNumber)
   663 	{
   664 	TInt fsDriveNumber = KErrNotFound;
   665 
   666 	RLocalDrive	dpDrive;
   667 	TBool change = EFalse;
   668 
   669 	TInt r = dpDrive.Connect(aLocalDriveNumber, change);
   670 	test(r == KErrNone);
   671 	TLocalDriveCapsV5 dpDriveCaps;
   672 	TPckg<TLocalDriveCapsV5> capsPack(dpDriveCaps);
   673 	r = dpDrive.Caps(capsPack);
   674 	test(r == KErrNone);
   675 	TPtrC8 dpDriveSerialNum(dpDriveCaps.iSerialNum, dpDriveCaps.iSerialNumLength);
   676 	dpDrive.Close();
   677 
   678 	dpDriveCaps.iDriveAtt&= KDriveAttMask;
   679 	dpDriveCaps.iMediaAtt&= KMediaAttMask;
   680 
   681 	RFs fs;
   682 	r = fs.Connect();
   683 	test(r == KErrNone);
   684 
   685 	TDriveInfo di;
   686 
   687 	for (TInt n=0; n<KMaxDrives /* && fsDriveNumber == KErrNotFound*/; n++)
   688 		{
   689 		r = fs.Drive(di, n);
   690 
   691 		TMediaSerialNumber serialNum;
   692 		fs.GetMediaSerialNumber(serialNum, n);
   693 
   694 		TFSName fsName;
   695 		fs.FileSystemName(fsName, n);
   696 
   697 		if (r != KErrNone )
   698 			continue;
   699 
   700 		TPtrC mediaType = GetMediaType(di.iType);
   701 		test.Printf(_L("Drive %C Type %S DriveAtt 0x%x MediaAtt 0x%x FileSysId %S SerialNum %S\n"), 
   702 			'A' + n, &mediaType, di.iDriveAtt, di.iMediaAtt, &fsName, &GetSerialNumber(serialNum));
   703 
   704 		di.iDriveAtt&= KDriveAttMask;
   705 		di.iMediaAtt&= KMediaAttMask;
   706 
   707 		if ((di.iType == dpDriveCaps.iType) &&
   708 			(di.iDriveAtt == dpDriveCaps.iDriveAtt) && 
   709 			(di.iMediaAtt == dpDriveCaps.iMediaAtt) && 
   710 			(serialNum.Compare(dpDriveSerialNum) == 0))
   711 			{
   712 			if (fsDriveNumber == KErrNotFound)
   713 				fsDriveNumber = n;
   714 			}
   715 		}
   716 
   717 	fs.Close();
   718 
   719 	return fsDriveNumber;
   720 	}
   721 
   722 TInt E32Main()
   723 	{
   724 	
   725 	// To use in command line
   726    	TBool callPasswordRelated = EFalse;
   727 
   728     TBuf<256> cmdline;
   729 	User::CommandLine(cmdline);
   730 	TLex lex(cmdline);
   731 
   732 	FOREVER
   733 		{
   734 		TPtrC token=lex.NextToken();
   735 		if(token.Length() != 0)
   736 			{
   737 			if (token == _L("-p"))
   738 				{
   739 				callPasswordRelated = ETrue;			
   740 				}
   741 			else
   742 				test.Printf(_L("Unknown argument '%S' was ignored.\n"), &token);
   743 			}
   744 		else
   745 			break;
   746 		
   747 		}
   748 
   749 	test.Title();
   750 	TInt r;
   751 
   752 	test.Start(_L("Verify the global and this process's data paging attributes"));
   753 	test_KErrNone(GetGlobalPolicies());
   754 
   755 	if (IsDataPagingSupported())
   756 		{
   757 		test.Printf(_L("Data paging supported\n"));
   758 		}
   759 	else
   760 		{// The system doesn't support data paging so this process shouldn't be
   761 		// data paged.
   762 		test.Printf(_L("Data paging not supported\n"));
   763 		test_Equal(EFalse, gProcessPaged);
   764 		test.End();
   765 		return 0;
   766 		}
   767 
   768 	r = UserHal::PageSizeInBytes(gPageSize);
   769 	test_KErrNone(r);
   770 
   771 	TInt fatDriveNumber = FindFatDriveOnDataPagingMedia();
   772 	if (fatDriveNumber == KErrNotFound)
   773 		{
   774 		test.Printf(_L("Could not find FAT partition on data paging media\n"));
   775 		test(0);
   776 		}
   777 	gFsDriveNumber = FindFsDriveNumber(fatDriveNumber);
   778 	if (gFsDriveNumber == KErrNotFound)
   779 		{
   780 		test.Printf(_L("Could not File Server drive\n"));
   781 		test(0);
   782 		}
   783 
   784 	test.Printf(_L("Found FAT drive on %C: (local drive #%d) on data paging media\n"), 'A'+gFsDriveNumber, fatDriveNumber);
   785 
   786 //	User::SetDebugMask(0x10000000);		//KMMU2
   787 //	User::SetDebugMask(0x40000000, 1);	//KPAGING
   788 	
   789 	test.Next(_L("Create a paged chunk"));
   790 	CreatePagedChunk(KChunkSizeInPages, KClearValue);
   791 
   792 	test.Next(_L("Chunk created, declare variables"));
   793 	
   794 	__DECLARE_VAR_IN_CHUNK(TBusLocalDrive, &drive)
   795 	TInt driveSize = TestDriveConnectAndCaps(drive, fatDriveNumber);
   796 	
   797 	TestDriveSizeRelatedMethods(drive, 0x00001000, driveSize);
   798 	
   799 	TestWriteReadRelatedMethods(drive);
   800 	
   801 	TestFormatRelatedMethods(drive, driveSize);
   802 	
   803 	if(callPasswordRelated)
   804 		{
   805 		TestPasswordRelatedMethods(drive);	
   806 		}
   807 	
   808 	//Disconnect drive
   809 	test.Next(_L("call aDrive.Disconnect()..."));		
   810 	DPTest::FlushCache();
   811 	drive.Disconnect();
   812 		
   813 	gMyChunk.Close();
   814 	
   815 	RestoreDriveState();
   816 	
   817 	test.End();
   818 	
   819 	User::SetDebugMask(0x00000000);		// No debug info
   820 	User::SetDebugMask(0x00000000, 1);	//No KPAGING
   821 	return 0;
   822 	}