--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/kerneltest/e32test/lffs/tf_write.h Thu Dec 17 09:24:54 2009 +0200
@@ -0,0 +1,219 @@
+// Copyright (c) 2001-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:
+//
+
+
+#ifndef __TF_WRITE_H__
+#define __TF_WRITE_H__
+
+#include <e32std.h>
+
+enum TPanicNo
+ {
+ EPanicGetDesOverflow,
+ EPanicGetDesInitialOverflow,
+ EPanicCheckOverflow,
+ EPanicCompareDescOverflow,
+ EPanicEraseBlockOOR,
+ EPanicEraseBlockNeg,
+ EPanicJoinMaths
+ };
+
+GLREF_C void Panic( TPanicNo aPanic );
+
+class CWriteTest;
+
+class MGeneralizedWrite
+ //
+ // Provides an generic interface to a write function which
+ // can be either the simple of thread version. Used to hide which
+ // version of the write function a test is using
+ //
+ {
+ public:
+ virtual void Write(TInt aPos,const TDesC8& aSrc) = 0;
+ virtual void CheckedWrite(TInt aPos,const TDesC8& aSrc) = 0;
+ };
+
+class TWriteBase: public MGeneralizedWrite
+ {
+ public:
+ TWriteBase( CWriteTest& aOwner );
+ virtual void CheckedWrite(TInt aPos,const TDesC8& aSrc);
+
+ protected:
+ CWriteTest& iOwner;
+ };
+
+
+class TSimpleWrite : public TWriteBase
+ //
+ // Simple implementation of write function
+ //
+ {
+ public:
+ TSimpleWrite( CWriteTest& aOwner );
+ virtual void Write( TInt aPos, const TDesC8& aSrc );
+
+ private:
+ TBusLocalDrive& iDrive;
+ };
+
+class TThreadWrite : public TWriteBase
+ //
+ // Thread implementation of write function
+ //
+ {
+ public:
+ TThreadWrite( CWriteTest& aOwner );
+ virtual void Write(TInt aPos,const TDesC8& aSrc);
+
+ // Thread functions with offset, added by this class
+ void CheckedThreadWrite(TInt aPos, TInt aLength, const TDesC8& aSrc, TInt aDescOffset );
+ void CurrentThreadCheckedThreadWrite(TInt aPos, TInt aLength, const TDesC8& aSrc, TInt aDescOffset );
+
+ private:
+ TBusLocalDrive& iDrive;
+ const TInt iThreadHandle;
+ };
+
+
+class CBlockManager : public CBase
+ //
+ // class used to control erasing and allocation of blocks
+ //
+ {
+ public:
+ CBlockManager( TBusLocalDrive& iDrive, CWriteTest& aOwner );
+ ~CBlockManager();
+
+ void CreateL();
+
+ void EraseBlock( TInt aBlockNumber );
+ void EraseAllBlocks();
+ void VerifyErased( TInt aBlockNumber );
+
+ void InitialiseSequentialBlockAllocator();
+ TInt NextErasedBlock();
+
+ void InitialiseDataChunkAllocator();
+ TUint NextErasedDataChunk( TInt aRequiredLength, TInt aMultiple=4 );
+
+
+ inline TInt BlockCount() const;
+ inline TInt BlockSize() const;
+ inline TInt FlashSize() const;
+ inline TUint BlockAddress( TInt aBlockNumber ) const;
+
+ private:
+ TBusLocalDrive& iDrive;
+ TBuf8<512> iReadBuffer;
+ CWriteTest& iOwner;
+ TInt iBlockCount;
+ TInt iBlockSize;
+
+ enum TEraseStatus
+ {
+ EErased,
+ ENotErased
+ };
+ TEraseStatus* iEraseArray;
+
+ TInt iNextBlock;
+
+ TInt iDataBlock;
+ TInt iDataOffset;
+ };
+
+
+
+class CWriteTest : public CBase
+ {
+ public:
+ ~CWriteTest();
+
+ void CreateL();
+
+ void DoTests();
+
+ TBool CompareAgainstFlash( TInt aFlashOffset, const TDesC8& aDes );
+ TBool CompareAgainstFlash( TInt aFlashOffset, TInt aLength, const TDesC8& aDes, TInt aDescOffset );
+
+ inline const TUint8* ChunkBase() const;
+ inline TBusLocalDrive& Drive();
+ inline TInt DummyThreadHandle() const;
+
+ private:
+ static TInt DummyThread( TAny* aParam );
+
+ void CreateRandomData( TDes8& aDestBuf, TInt aLength );
+ TBool CheckOnes( TUint aFlashOffset, TInt aLength );
+ void CreateTestData( TInt aBlockNumber, TBool aEndOfBlock );
+
+ void SimpleWriteTest();
+ void SimpleThreadWriteTest();
+ void DoSimpleWriteTest( MGeneralizedWrite& aWriter );
+
+ void AlignedWriteTest();
+ void AlignedThreadWriteTest();
+ void DoAlignedWriteTest( MGeneralizedWrite& aWriter );
+
+ void UnalignedWriteTest();
+ void UnalignedThreadWriteTest();
+ void DoUnalignedWriteTest( MGeneralizedWrite& aWriter );
+
+ void OffsetDescriptorAlignedWriteTest();
+ void OffsetDescriptorUnalignedWriteTest();
+ void OffsetDescriptorCurrentThreadAlignedWriteTest();
+ void OffsetDescriptorCurrentThreadUnalignedWriteTest();
+
+ void JoinedWriteTest();
+ void JoinedThreadWriteTest();
+
+ void SingleBitOverwriteTest();
+ void TwoBitOverwriteTest();
+
+ void RunSimulationTest();
+
+
+ private:
+ TBusLocalDrive iDrive;
+ TBool iDriveOpened;
+ TBuf8<512> iReadBuffer;
+ CBlockManager* iBlocks;
+
+ TRandomGenerator iRandom;
+
+ TSimpleWrite* iSimpleWriter;
+ TThreadWrite* iThreadWriter;
+
+ RThread iDummyThread;
+ };
+
+
+
+
+inline TBusLocalDrive& CWriteTest::Drive()
+ {
+ return iDrive;
+ }
+
+inline TInt CWriteTest::DummyThreadHandle() const
+ {
+ return iDummyThread.Handle();
+ }
+
+
+#endif
+