baseintegtests/baseintegrationtest/testsuites/fat32/src/basetestfat32base.cpp
changeset 0 a41df078684a
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/baseintegtests/baseintegrationtest/testsuites/fat32/src/basetestfat32base.cpp	Mon Oct 19 15:55:17 2009 +0100
@@ -0,0 +1,447 @@
+// Copyright (c) 2006-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:
+// Performs basic operations required by all test steps
+// 
+//
+
+#include "basetestfat32base.h"
+#include "sl_bpb1.h"
+#include "basetedefs.h"
+#include <f32file.h>
+
+static RRawDisk TheDisk;
+static  TFatBootSector TheBootSector;
+
+TDiskType gDiskType = EFatUnknown;
+TInt gBytesPerCluster;
+TInt gEntriesPerCluster;
+TInt gDataStartBytes;
+TInt gRootDirSectors;
+TInt gTotalSectors;
+TInt gRootDirStart;
+TInt gRootSector;
+TInt gRootCluster;
+TInt gFatStartBytes;
+TInt gFatTestEntries;
+TInt gFatSizeSectors;
+TInt gFirstDataSector;
+TInt gFirstDataCluster;
+TInt gMaxDataCluster;
+TInt gClusterCount;
+TInt gEndOfChain;      
+
+/**
+Class Constructor
+*/		    
+CBaseTestFat32Base::CBaseTestFat32Base() 
+	{
+	SetTestStepName(KTestStepBase);
+	}
+	
+/**
+Class Destructor
+*/		    
+CBaseTestFat32Base::~CBaseTestFat32Base() 
+	{
+	}
+
+
+/** 
+Base step to all test steps which carries out the followng actions:
+1. Gets the drive letter
+2. Checks that it is not a RAM drive
+3. Obtains the size of the disk
+4. Ensures that the volume is either FAT or FAT32
+5. Sets the session path
+6. Ensures that the number of sectors per cluster is correct
+7. Calculates the cluster count of the volume. 
+
+@return EPass if test passes and EFail if test fails
+*/ 
+
+TVerdict CBaseTestFat32Base::doTestStepPreambleL()
+	{
+	SetTestStepResult(EFail);
+	RDebug::Printf("Starting next test step...");
+	CheckDebug(); 
+	ParseCommandArguments();
+	iTheFs.Connect();
+	TInt drvNum = CurrentDrive();
+	if (!IsFileSystemFAT32() && !IsFileSystemFAT(iTheFs,drvNum))
+		{
+		_LIT(KNotFat, "Test requires FAT filesystem");
+		INFO_PRINTF1(KNotFat);
+		return TestStepResult();
+		}
+	
+	
+	// check this is not the internal ram drive and get the size of the disk
+	TVolumeInfo volumeInfo;
+	TInt res = iTheFs.Volume(volumeInfo, CurrentDrive());
+	TBool isRamDrive = volumeInfo.iDrive.iMediaAtt&KMediaAttVariableSize;
+	iDiskSize = volumeInfo.iSize;
+
+	// Obtain the Size of the disk from the media driver
+	TBusLocalDrive mmcDrive;
+	TBool changeFlag;
+	changeFlag=EFalse;
+	TInt r = mmcDrive.Connect(1,changeFlag);
+	TTime startTime;
+	startTime.HomeTime();
+	TLocalDriveCapsV2 information;
+	TPckg<TLocalDriveCapsV2> pckg(information);
+	r = mmcDrive.Caps(pckg);
+	iDriveSize = information.iSize;
+
+
+	// Set the Session Path	
+	_LIT(Ksp, "%c:\\");
+	TBuf<4> sessionPath;
+	sessionPath.Format(Ksp, (TUint)iDriveToTest);
+	r = iTheFs.SetSessionPath(sessionPath);
+	r = iTheFs.SessionPath(iSessionPath);
+	 
+	
+
+	CalculateClusCount();
+	
+	// Check the Sectors per cluster and Cluster count	
+	r = CheckSecPerClus();
+	if (r != KErrNone)
+		{
+		INFO_PRINTF1(_L("WARNING: Sector Per Cluster check was incorrect - Card should have special format requirements"));
+		iMedia = 1;
+		}
+	else
+		{
+		INFO_PRINTF1(_L("Sector Per Cluster check is correct"));
+		iMedia = 0;
+		}
+	
+	if (isRamDrive)
+		{
+		SetTestStepResult(EAbort);
+		_LIT(KRamNotValid, "Tests not valid on internal ram drive ");
+		INFO_PRINTF1(KRamNotValid);
+		return TestStepResult();
+		}
+	else
+	SetTestStepResult(EPass);
+	return TestStepResult();
+	}
+
+/**
+Get the drive letter from the ini file
+*/
+void CBaseTestFat32Base::ParseCommandArguments(void)
+	{
+	TBufC<2> driveLetter;
+	TPtrC16 letter = driveLetter;
+	_LIT(KLetter,"DriveLetter");
+	_LIT(KCommon,"Common");
+	TBool alright = GetStringFromConfig(KCommon, KLetter, letter);
+	if (alright)		
+		{			
+		iDriveToTest = letter[0];
+		iDriveToTest.UpperCase();
+		}
+	
+	}
+
+/** 
+Sets the debug register value for debug builds if specified in the ini file
+*/	
+void CBaseTestFat32Base::CheckDebug()
+	{
+	TInt debug;
+	_LIT(KDebug,"SetDebug");
+	_LIT(KCommon,"Common");
+	TBool alright = GetIntFromConfig(KCommon, KDebug, debug);
+	if (alright)		
+		{
+		if (debug == 1)
+			{
+			#ifdef _DEBUG			
+			iTheFs.SetDebugRegister(KFSYS);
+			#else
+			_LIT(KNotDebug,"This is not a Debug build");
+			INFO_PRINTF1(KNotDebug);
+			#endif
+			}
+		else
+			{
+			_LIT(KSpecifyDebug,"Debugging not specified in ini file");
+			INFO_PRINTF1(KSpecifyDebug);
+			}
+		}
+	
+	}
+/** 
+Converts the drive letter to the drive number
+
+@return driveNum The number of the drive
+*/	
+TInt CBaseTestFat32Base::CurrentDrive()
+	{
+	TInt driveNum;
+	TInt ret = iTheFs.CharToDrive(iDriveToTest,driveNum);
+	return(driveNum);
+	}
+	
+	
+/** 
+Check to see whether the volume is FAT32
+
+@return TRUE if is Fat32 else FALSE
+*/	
+TBool CBaseTestFat32Base:: IsFileSystemFAT32()
+	{
+//	_LIT(KFat32Name,"Fat32");
+	if(TheBootSector.RootDirEntries() == 0)
+		{
+		gEndOfChain = 0x0FFFFFFF;
+		_LIT(KIsFat32, "Is Fat32 filesystem");
+		INFO_PRINTF1(KIsFat32);
+		return TRUE;
+		}
+	else
+		{
+		_LIT(KIsNotFat32, "Is Not Fat32 filesystem");
+		INFO_PRINTF1(KIsNotFat32);
+		return FALSE;
+		}
+	}
+
+/** 
+Check to see whether the volume is FAT
+
+@return TRUE if is Fat else FALSE
+*/	
+TBool CBaseTestFat32Base::IsFileSystemFAT(RFs &aFsSession,TInt aDrive)
+	{
+	_LIT(KFatName,"Fat");
+	TFileName f;
+	TInt r = aFsSession.FileSystemName(f,aDrive);
+	if (r != KErrNone)
+		{
+		_LIT(KNoFatName, "Unable to get file system name");
+		INFO_PRINTF1(KNoFatName);
+		return FALSE;
+		}
+	return (f.CompareF(KFatName) == 0);
+	}
+
+
+/** 
+Check that the sectors per cluster is correct for the disk size used
+
+@return KErrNone if Sectors Per Cluster is correct
+*/	
+TInt CBaseTestFat32Base::CheckSecPerClus()
+	{
+	TInt64 diskSizeSec = iDiskSize / 512;
+	if (diskSizeSec <= 16777216)
+		{
+		if (iBPB_SecPerClus == 8)
+		return KErrNone;
+		else return -1;
+		}
+	else if (diskSizeSec <= 33554432)
+		{
+		if (iBPB_SecPerClus == 16)
+		return KErrNone;
+		else return -1;
+		}
+	else if (diskSizeSec <= 67108864)
+		{
+		if (iBPB_SecPerClus == 32)
+		return KErrNone;
+		else return -1;
+		}
+	else if (diskSizeSec <= 0xFFFFFFFF)
+		{
+		if (iBPB_SecPerClus == 64)
+		return KErrNone;
+		else return -1;
+		}
+	return KErrNone;
+	}
+
+
+/**
+Calculate the cluster count of the volume
+
+@return KErrNone Successful
+*/	
+TInt CBaseTestFat32Base::CalculateClusCount()
+	{
+	TInt r;
+	r = TheDisk.Open(iTheFs, CurrentDrive());
+	if (r != KErrNone)
+		{
+		_LIT(KErrorRead, "Cannot open the raw disk - r=%d");
+		INFO_PRINTF2(KErrorRead, r);
+		return r;
+		}
+
+	r = ReadField(4, 32,  &iBPB_TotSec32); 
+	if (r != KErrNone)
+		{
+		_LIT(KErrorRead, "Cannot get the field value BPB_TotSec32 - r=%d");
+		INFO_PRINTF2(KErrorRead, r);
+		return r;
+		}
+	r = ReadField(2, 14,  &iBPB_ResvdSecCnt);
+	if (r != KErrNone)
+		{
+		_LIT(KErrorReadField, "Cannot get the field value BPB_ResvdSecCnt - r=%d");
+		INFO_PRINTF2(KErrorReadField, r);
+		return r;
+		}
+	r = ReadField(1, 16,  &iBPB_NumFATs);
+	if (r != KErrNone)
+		{
+		_LIT(KErrorReadField, "Cannot get the field value BPB_NumFATs - r=%d");
+		INFO_PRINTF2(KErrorReadField, r);
+		return r;
+		}
+	r = ReadField(4, 36,  &iBPB_FATSz32);
+	if (r != KErrNone)
+		{
+		_LIT(KErrorReadField, "Cannot get the field value BPB_FATSz32 - r=%d");
+		INFO_PRINTF2(KErrorReadField, r);
+		return r;
+		}
+	r = ReadField(1, 13,  &iBPB_SecPerClus);
+	if (r != KErrNone)
+		{
+		_LIT(KErrorReadField, "Cannot get the field value BPB_SecPerClus - r=%d");
+		INFO_PRINTF2(KErrorReadField, r);
+		return r;
+		}
+	iClusterCount = (iBPB_TotSec32-(iBPB_ResvdSecCnt+(iBPB_NumFATs*iBPB_FATSz32)))/(iBPB_SecPerClus);
+	_LIT(KClusterCountValue, "The cluster count of the volume is %d");
+	INFO_PRINTF2(KClusterCountValue, iClusterCount);	
+	TheDisk.Close();
+	return KErrNone;	
+	}
+
+/** 
+Convert the field to the correct endien format
+
+@param aLen The length of the field being read
+@param aBuffer The original endien format of the field
+@param aField the correct endien format of the field
+
+@return KErrNone Successful
+*/	
+TInt CBaseTestFat32Base::Convert(TInt aLen, TUint8 *aBuffer, TUint32 *aField)
+	{
+	TInt i = aLen-1;
+	*aField = 0;
+	while(i >= 0)
+		{
+		*aField = *aField << 8;
+		*aField = *aField + aBuffer[i];
+		i--;
+		}
+	return KErrNone;
+	}
+
+/** 
+Read the entire field
+
+@param aLen The length of the field being read
+@param aOffSt The position at which to start reading
+@param aName The entire field to read
+
+@return KErrNone Successful
+*/		
+TInt CBaseTestFat32Base::ReadField(TInt aLen, TInt aOffSet, TUint32 *aName)
+	{
+	TInt r;
+	TUint8  aField[4];
+	TPtr8 bufPtr(&aField[0], aLen);
+	r=TheDisk.Read(aOffSet, bufPtr);
+	if (r != KErrNone)
+		{
+		_LIT(KErrorRead, "Cannot read the raw disk - r=%d");
+		INFO_PRINTF2(KErrorRead, r);
+		return r;
+		}
+	r = Convert(aLen, aField,aName); 
+	return r;
+	}
+
+
+/** 
+Get the number of bytes per sector
+
+@param aSecPerCluster The number of sectors per cluster
+
+@return The number of bytes per cluster
+*/		
+TInt64 getBytesPerCluster(TUint32 aSecPerClus)
+	{
+	TInt64 res = aSecPerClus * 512;
+	return res;
+	}
+
+/** 
+Convert the cluster number to byte offset on disk
+
+@param aCluster The cluster number 
+
+@return The offset in bytes
+*/
+TInt64 CBaseTestFat32Base::ClusterToByte(TInt aCluster)
+	{
+	TInt64 FirstDataSector = (iBPB_ResvdSecCnt + (iBPB_NumFATs * iBPB_FATSz32));
+	TInt64 pos;
+	pos = ((aCluster - 2) * iBPB_SecPerClus + FirstDataSector) * 512 ;
+	return pos;
+	}
+
+/** 
+Return number of bytes into the FAT
+
+@param aFatIndex The Fat index 
+
+@return The Fat position in bytes
+*/
+TInt CBaseTestFat32Base::PosInBytes(TInt aFatIndex)
+	{
+	TInt fatPosInBytes = -1;
+	if(IsFileSystemFAT32())
+		{
+		gDiskType = EFat32;
+		}	
+	switch (gDiskType)
+		{
+		case EFat32:
+			fatPosInBytes=aFatIndex<<2;
+			break;
+		case EFat16:
+			fatPosInBytes=aFatIndex<<1;
+			break;
+		case EFat12:
+			fatPosInBytes=(aFatIndex*3>>1);
+			break;
+		default:
+			break;
+		}
+	return(fatPosInBytes);
+	}
+	
+