kerneltest/e32test/lffs/tf_write.h
changeset 0 a41df078684a
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/kerneltest/e32test/lffs/tf_write.h	Mon Oct 19 15:55:17 2009 +0100
@@ -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
+