kerneltest/f32test/demandpaging/t_paginginfo.cpp
changeset 0 a41df078684a
child 6 0173bcd7697c
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/kerneltest/f32test/demandpaging/t_paginginfo.cpp	Mon Oct 19 15:55:17 2009 +0100
@@ -0,0 +1,216 @@
+// Copyright (c) 2008-2009 Nokia Corporation and/or its subsidiary(-ies).
+// All rights reserved.
+// This component and the accompanying materials are made available
+// under the terms of the License "Eclipse Public License v1.0"
+// which accompanies this distribution, and is available
+// at the URL "http://www.eclipse.org/legal/epl-v10.html".
+//
+// Initial Contributors:
+// Nokia Corporation - initial contribution.
+//
+// Contributors:
+//
+// Description:
+// f32test\demandpaging\t_paginginfo.cpp
+// 
+//
+
+#include <e32test.h>
+
+RTest test(_L("t_paginginfo"));
+
+#include <e32rom.h>
+#include <u32hal.h>
+#include <f32file.h>
+#include <f32dbg.h>
+#include "testdefs.h"
+#include <hal.h>
+
+
+TInt DriveNumber=-1;   // Parameter - Which drive?  -1 = autodetect.
+TInt locDriveNumber;
+
+TBusLocalDrive Drive;
+TBool DisplayStats = ETrue;
+TBool ManualTest = EFalse;
+
+TInt findDataPagingDrive()
+/** 
+Find the drive containing a swap partition.
+
+@return		Local drive identifier.
+*/
+	{
+	TInt drive = KErrNotFound;
+	
+	test.Printf(_L("Searching for data paging drive:\n"));
+	
+	for(TInt i = 0; i < KMaxLocalDrives && drive < 0; ++i)
+		{
+		RLocalDrive	d;
+		TBool		change = EFalse;
+		
+		if(d.Connect(i, change) == KErrNone)
+			{
+			test.Printf(_L("Connected to local drive %d\n"), i);
+			TLocalDriveCapsV4			dc;
+			TPckg<TLocalDriveCapsV4>	capsPack(dc);
+			
+			if(d.Caps(capsPack) == KErrNone)
+				{
+				if ((dc.iMediaAtt & KMediaAttPageable) &&
+					(dc.iPartitionType == KPartitionTypePagedData))
+					{
+					test.Printf(_L("Found swap partition on local drive %d\n"), i);
+					drive = i;
+
+					TPageDeviceInfo pageDeviceInfo;
+
+					TPtr8 pageDeviceInfoBuf((TUint8*) &pageDeviceInfo, sizeof(pageDeviceInfo));
+					pageDeviceInfoBuf.FillZ();
+
+					TInt r = d.QueryDevice(RLocalDrive::EQueryPageDeviceInfo, pageDeviceInfoBuf);
+
+					test.Printf(_L("EQueryPageDeviceInfo on local drive %d returned %d\n"), i, r);
+					}
+				}
+			d.Close();
+			}
+		}
+	return drive;
+	}
+
+
+
+void DisplayPageDeviceInfo(TInt aDataPagingDrive)
+	{
+	test.Printf(_L("Stats: \n"));
+
+	SMediaPagingInfo info;
+	TInt r = UserSvr::HalFunction(EHalGroupMedia,EMediaHalGetPagingInfo,(TAny*) aDataPagingDrive, &info);
+	test.Printf(_L("HAL: EMediaHalGetPagingInfo returned %d\n"), r);
+	if (r == KErrNone)
+		{
+		test.Printf(_L("iRomPageInCount %d\n"), info.iRomPageInCount);
+		test.Printf(_L("iCodePageInCount %d\n"), info.iCodePageInCount);
+		test.Printf(_L("iDataPageInCount %d\n"), info.iDataPageInCount);
+		test.Printf(_L("iDataPageOutCount %d\n"), info.iDataPageOutCount);
+		test.Printf(_L("iDataPageOutBackgroundCount %d\n"), info.iDataPageOutBackgroundCount);
+		}
+
+	
+	RLocalDrive	d;
+	TBool change = EFalse;
+	r = d.Connect(aDataPagingDrive, change);
+	test (r == KErrNone);
+		
+	TPageDeviceInfo pageDeviceInfo;
+	TPtr8 pageDeviceInfoBuf((TUint8*) &pageDeviceInfo, sizeof(pageDeviceInfo));
+	pageDeviceInfoBuf.FillZ();
+	r = d.QueryDevice(RLocalDrive::EQueryPageDeviceInfo, pageDeviceInfoBuf);
+	test (r == KErrNone || r == KErrNotSupported);
+
+	d.Close();
+	test.Printf(_L("iReservoirBlockCount %d\n"),		pageDeviceInfo.iReservoirBlockCount);
+	test.Printf(_L("iBadBlockCount %d\n"),	pageDeviceInfo.iBadBlockCount);
+
+	}
+
+//
+// The gubbins that starts all the tests
+//
+// ParseCommandLine reads the arguments and sets globals accordingly.
+//
+
+void ParseCommandLine()
+	{
+	TBuf<32> args;
+	User::CommandLine(args);
+	TLex lex(args);
+	
+	FOREVER
+		{
+		
+		TPtrC token=lex.NextToken();
+		if(token.Length()!=0)
+			{
+			if ((token.Length()==2) && (token[1]==':'))
+				DriveNumber=User::UpperCase(token[0])-'A';
+			else if (token.Length()==1)
+				{
+				TChar driveLetter = User::UpperCase(token[0]); 
+				if ((driveLetter>='A') && (driveLetter<='Z'))
+					DriveNumber=driveLetter - (TChar) 'A';
+				else 
+					test.Printf(_L("Unknown argument '%S' was ignored.\n"), &token);
+				}
+			else if ((token==_L("help")) || (token==_L("-h")) || (token==_L("-?")))
+				{
+				test.Printf(_L("\nUsage:  t_paginginfo [enable] [disable] [stats]\n\n"));
+				test.Getch();
+				}
+			else if (token==_L("stats"))
+				{
+				DisplayStats = ETrue;
+				}
+			else if (token==_L("-m"))
+				{
+				ManualTest = ETrue;
+				}
+			else
+				test.Printf(_L("Unknown argument '%S' was ignored.\n"), &token);
+			}
+		else
+			break;
+		
+		}
+	}
+
+//
+// E32Main
+//
+
+TInt E32Main()
+	{
+	test.Title();
+
+	test.Start(_L("Check that the rom is paged"));
+
+	TRomHeader* romHeader = (TRomHeader*)UserSvr::RomHeaderAddress();
+
+	if (romHeader->iPageableRomStart==NULL)
+		{
+		test.Printf(_L("Test ROM is not paged - test skipped!\r\n"));
+		test.End();
+		return 0;
+		}
+	ParseCommandLine();	
+
+	TInt dataPagingDrive = findDataPagingDrive();
+	if (dataPagingDrive == KErrNotFound)
+		{
+		test.Printf(_L("Swap partition not found - test skipped!\r\n"));
+		test.End();
+		return 0;
+		}
+
+
+
+	if (DisplayStats)
+		{
+		DisplayPageDeviceInfo(dataPagingDrive);
+
+		if (ManualTest)
+			test.Getch();
+
+		test.End();
+		return 0;
+		}
+
+
+
+	test.End();
+	return 0;
+	}
+
+