diff -r 000000000000 -r a41df078684a baseintegtests/baseintegrationtest/testsuites/fat32/src/basetestfat32calculate.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/baseintegtests/baseintegrationtest/testsuites/fat32/src/basetestfat32calculate.cpp Mon Oct 19 15:55:17 2009 +0100 @@ -0,0 +1,248 @@ +// 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 various different disk calculations +// +// + +#include "basetestfat32calculate.h" +#include "sl_bpb1.h" + +static RRawDisk TheDisk; + +/** +Class Constructor +*/ +CBaseTestFat32Calculate::CBaseTestFat32Calculate() + { + SetTestStepName(KTestStepCalculate); + } + +/** +Class Destructor +*/ +CBaseTestFat32Calculate::~CBaseTestFat32Calculate() + { + } + + +/** +Get the calculation to be performed from the ini file and carry out that +particular calculation +1. If SetGreater is specified in the ini file then the function SetToGreater + is called the set the cluster count to a value greater than it actually is +2. If ComputeFatSize is specified in the ini file then the function + ComputeFatSize is called to computer the size of each FAT +3. If ClusterCount is specified in the ini file, then the function + ClusterCount is called to return the clutser count of the volume + +@return EPass if test passes and EFail if test fails +*/ +TVerdict CBaseTestFat32Calculate::doTestStepL() + { + SetTestStepResult(EFail); + _LIT(KCalculation,"Calculation"); + TBufC<6> calculationType; + TPtrC16 calculation = calculationType; + TBool alright = GetStringFromConfig(ConfigSection(), KCalculation, calculation); + if(alright) + { + if (calculation == _L("SetGreater")) + { + TInt r = SetToGreater(iClusterCount, 1000); + if (r != KErrNone) + { + _LIT(KFailClusterCount, "Failed to Set to a greater cluster count - r=%d"); + INFO_PRINTF2(KFailClusterCount, r); + return TestStepResult(); + } + } + if (calculation == _L("ComputeFatSize")) + { + TInt r = ComputeFatSize(); + if (r != KErrNone) + { + _LIT(KFailComputeFatSz, "Failed to compute FatSz - r=%d"); + INFO_PRINTF2(KFailComputeFatSz, r); + return TestStepResult(); + } + } + if (calculation == _L("ClusterCount")) + { + TInt r = CheckClusterCount(iClusterCount); + if (r != KErrNone) + { + _LIT(KFailComputeClusCnt, "Failed to compute ClusterCount - r=%d"); + INFO_PRINTF2(KFailComputeClusCnt, r); + return TestStepResult(); + } + } + if (calculation == _L("CheckFSInfo")) + { + TInt r = CheckFSInfo(0x3E8); + if (r != KErrNone) + { + _LIT(KFailCheckFSInfo, "Failed FSInfo check - r=%d"); + INFO_PRINTF2(KFailCheckFSInfo, r); + return TestStepResult(); + } + } + } + else + { + _LIT(KIniFileError, "Failed to read calculation type from ini file"); + INFO_PRINTF1(KIniFileError); + return TestStepResult(); + } + + SetTestStepResult(EPass); + _LIT(KWritePass, "Calculation Pass"); + INFO_PRINTF1(KWritePass); + return TestStepResult(); + } + +/** +Set the cluster count to a value greater than it should be +The bad cluster count is caluclated as 10000 added to the actual +cluster count value. The bad cluster count is then written to the disk +in place of the actual cluster count. + +@param aClusterCount The cluster count of the volume +@param aPos The position at which to start writing to the raw disk + +@return KErrNone if successful +*/ +TInt CBaseTestFat32Calculate::SetToGreater(TUint32 aClusterCount, TInt aPos) + { + TUint32 badClusterCount; + badClusterCount = aClusterCount+10000; + TUint8 num[4]; + TInt i; + TInt r; + + r = TheDisk.Open(iTheFs, CurrentDrive()); + for (i=0; i<4; i++) + { + + num[i] = 0; + num[i] = num[i] + badClusterCount; + badClusterCount = badClusterCount >> 8; + } + + TUint8 data[1]; + TPtr8 buffer((TUint8*)&data[0],1); + + for (i=0; i<4; i++) + { + aPos = aPos + 1; + r=TheDisk.Read(aPos,buffer); + data[0]=num[i]; + r=TheDisk.Write(aPos,buffer); + } + TheDisk.Close(); + return r; + } + +/** +Calculate the size of each FAT and verify that it is equal the +value in BPB_FATSz32. The 'BPB_..' values are read directly from the disk +and the calculation is taken from the Microsoft FAT32 speification document + +@return KErrNone if successful +*/ +TInt CBaseTestFat32Calculate::ComputeFatSize() + { + TInt TmpVal1 = (iDriveSize/512) - iBPB_ResvdSecCnt; + TInt TmpVal2 = (256 * iBPB_SecPerClus) + iBPB_NumFATs; + TmpVal2 = TmpVal2 / 2; + TInt FatSz32 = (TmpVal1 + (TmpVal2 - 1)) / TmpVal2; + INFO_PRINTF2(_L("FatSz32 = %d"), FatSz32); + if (iBPB_FATSz32 == FatSz32) + { + _LIT(KFatSzPass, "BPB_FATSz32 = %d is equal to calculated value = %d"); + INFO_PRINTF3(KFatSzPass,iBPB_FATSz32, FatSz32 ); + return KErrNone; + } + else + { + _LIT(KFatSzFail, "BPB_FATSz32 = %d is not equal to the calculated value = %d"); + INFO_PRINTF3(KFatSzFail, iBPB_FATSz32,FatSz32); + return -1; + } + } + +/** +Verify that the cluster count is greater than 65525. +If the volume is FAT32 then it should have a cluster count greater than +65525. Otherwise the volume should be FAT16. + +@param aClusterCount The cluster count of the volume + +@return KErrNone if successful +*/ +TInt CBaseTestFat32Calculate::CheckClusterCount(TUint32 aClusterCount) + { + if (aClusterCount > 65525) + { + _LIT(KClusCntPass, "Cluster count is greater than 65525"); + INFO_PRINTF1(KClusCntPass); + return KErrNone; + } + else + { + _LIT(KClusCntFail, "Cluster count is not greater than 65525"); + INFO_PRINTF1(KClusCntFail); + return -1; + } + } + + +/** +Read the FSInfo sector at the FSI_Free_Count field. +Following this check that the last known cluster count is less than +the actual cluster count of the volume. + +Note: This function should be called after files have been written +to the disk to ensure that clusters have been occupied + +@param aPos The position at which to start reading from the raw disk + +@return KErrNone if successful +*/ +TInt CBaseTestFat32Calculate::CheckFSInfo(TInt aPos) + { + TUint32 fsInfo; + + TUint32 data; + TPtr8 buffer((TUint8*)&data,4); + + TInt r = TheDisk.Open(iTheFs, CurrentDrive()); + r = TheDisk.Read(aPos,buffer); + + fsInfo = data; + + TheDisk.Close(); + + if (fsInfo < iClusterCount) + { + _LIT(KFSInfoPass, "FSInfo Correct, iClusterCount = %08x fsInfo = %08x fsInfo = %08x"); + INFO_PRINTF4(KFSInfoPass, iClusterCount, data, fsInfo); + return KErrNone; + } + else + { + _LIT(KFSInfoFail, "FSInfo incorrect, iClusterCount = %08x fsInfo = %08x"); + INFO_PRINTF3(KFSInfoFail, iClusterCount, fsInfo); + return -1; + } + }