kerneltest/f32test/server/b_rand.cpp
changeset 0 a41df078684a
child 109 b3a1d9898418
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/kerneltest/f32test/server/b_rand.cpp	Mon Oct 19 15:55:17 2009 +0100
@@ -0,0 +1,463 @@
+// Copyright (c) 1995-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\server\b_rand.cpp
+// 
+//
+
+#include <f32file.h>
+#include <e32math.h>
+#include <e32test.h>
+#include "t_server.h"
+
+const TInt64 KInitialSeedL=24;
+const TInt KInitialSeed5=42;
+const TInt KMaxStream=0x1000;
+
+class RStream
+	{
+public:
+	RStream();
+	void Set(RFile& aFile);
+	TInt Read(TDes8& aDes);
+private:
+	const TText8* iNext;
+	const TText8* iEnd;
+	TBool iEOF;
+	RFile iFile;
+	TBuf8<KMaxStream> iStream;
+	};
+
+GLDEF_D RTest test(_L("B_RAND"));
+LOCAL_D RFile TheFile1;
+LOCAL_D RFile TheFile2;
+LOCAL_D RFile TheFile3;
+LOCAL_D RFile TheFile4;
+LOCAL_D RFile TheFile5;
+LOCAL_D TFileName fBuf;
+LOCAL_D TFileName nameBuf1;
+LOCAL_D TFileName nameBuf2;
+LOCAL_D TFileName nameBuf3;
+LOCAL_D TFileName nameBuf4;
+LOCAL_D TFileName nameBuf5;
+LOCAL_D TBuf8<0x200> chkPat;
+LOCAL_D TBuf8<0x200> testPat2;
+LOCAL_D TBuf8<0x400> testPat3;
+LOCAL_D TBuf8<0x400> testPat4;
+LOCAL_D TBuf8<0x40> testPat5;
+LOCAL_D TBuf8<0x400> buf;
+LOCAL_D RStream sBuf;
+LOCAL_D TPtrC testDir(_S("\\F32-TST\\"));
+
+LOCAL_C void TestRet(TInt aRet)
+//
+// Display error value if aRet!=KErrNone
+//
+	{
+
+	if (aRet==KErrNone)
+		return;
+	test.Printf(_L("Error: %d\n"),aRet);
+	test(EFalse);
+	}
+
+#if defined(__SLOW_TEST__)
+LOCAL_C void CheckFile(const RFile& aFile,const TChar aChar)
+//
+// Check that aFile only contains aChar and '\n' characters
+//
+	{
+
+	TBuf8<0x400> buf(0x400);
+	TInt pos=0;
+	TInt r=aFile.Seek(ESeekStart,pos);
+	TestRet(r);
+	while(buf.Length()==buf.MaxLength())
+		{
+		r=aFile.Read(buf);
+		TestRet(r);
+		TInt len=buf.Length();
+		while(len--)
+			test(buf[len]=='\n' || aChar==buf[len]);
+		}
+	}
+#else
+LOCAL_C void CheckFile(const RFile& /*aFile*/,const TChar /*aChar*/)
+	{
+	}
+#endif
+
+LOCAL_C void CheckFile1()
+	{CheckFile(TheFile1,'A');}
+LOCAL_C void CheckFile2()
+	{CheckFile(TheFile2,'B');}
+
+RStream::RStream()
+//
+// Constructor.
+//
+	{
+	}
+
+void RStream::Set(RFile& aFile)
+//
+// Initialize the stream on a file.
+//
+	{
+
+	iEOF=EFalse;
+	iFile=aFile;
+	iStream.Zero();
+	iNext=iStream.Ptr();
+	iEnd=iNext;
+	}
+
+TInt RStream::Read(TDes8& aDes)
+//
+// Read from the stream.
+//
+	{
+
+	TText8* pD=(TText8*)aDes.Ptr();
+	TInt len=aDes.MaxLength();
+	TInt newLen=0;
+	while (newLen<len)
+		{
+		if (iNext>=iEnd)
+			{
+			if (iEOF)
+				{
+				if (newLen==0)
+					return(KErrEof);
+				aDes.SetLength(newLen);
+				return(KErrNone);
+				}
+			TInt r=iFile.Read(iStream);
+			if (r!=KErrNone)
+				return(r);
+			if (iStream.Length()!=iStream.MaxLength())
+				iEOF=ETrue;
+			iNext=iStream.Ptr();
+			iEnd=iNext+iStream.Length();
+			continue;
+			}
+		TUint c=(*iNext++);
+		if (c=='\n')
+			{
+			aDes.SetLength(newLen);
+			return(KErrNone);
+			}
+		*pD++=(TText8)c;
+		newLen++;
+		}
+	return(KErrTooBig);
+	}
+
+
+GLDEF_C void CallTestsL(void)
+//
+// Do tests relative to session path
+//
+	{
+
+	TTime timerC;
+	timerC.HomeTime();
+
+	test.Next(_L("Make test directory"));
+//
+	TInt n_times=400;
+	testPat2.Fill('B',testPat2.MaxLength());
+	testPat3.Fill('C',testPat3.MaxLength());
+	testPat4.Fill('D',testPat4.MaxLength());
+//
+	TInt r=TheFile1.Temp(TheFs,testDir,nameBuf1,EFileStream|EFileWrite);
+	TestRet(r);
+    test.Printf(_L("Created1: %S\n"),&nameBuf1);
+    TInt sum1=0;
+//
+	r=TheFile2.Temp(TheFs,testDir,nameBuf2,EFileStreamText|EFileWrite);
+	TestRet(r);
+    test.Printf(_L("Created2: %S\n"),&nameBuf2);
+    TInt sum2=0;
+//
+	r=TheFile3.Temp(TheFs,testDir,nameBuf3,EFileStream|EFileWrite);
+	TestRet(r);
+    test.Printf(_L("Created3: %S\n"),&nameBuf3);
+    TInt sum3=0;
+//
+	r=TheFile4.Temp(TheFs,testDir,nameBuf4,EFileStream|EFileWrite);
+	TestRet(r);
+    test.Printf(_L("Created4: %S\n"),&nameBuf4);
+    TInt sum4=0;
+//
+	r=TheFile5.Temp(TheFs,testDir,nameBuf5,EFileStreamText|EFileWrite);
+	TestRet(r);
+    test.Printf(_L("Created5: %S\n"),&nameBuf5);
+    TInt sum5=0;
+	TheFile5.Close();
+//
+    TInt64 seed5=KInitialSeed5;
+    TInt64 seedL=KInitialSeedL;
+	TBuf<0x100> pBuf;
+    for (TInt rep=0;rep<n_times;rep++)
+        {
+		pBuf.Zero();
+		pBuf.Format(_L("RAND(%03u) "),rep);
+        sum1++;
+		pBuf.Append(_L("W1->F1 ")); // Write 1 byte to file1
+		TPtrC8 pA=_L8("A");
+		r=TheFile1.Write(pA);
+		TestRet(r);
+		CheckFile1();
+	
+		CheckFile2();
+		TInt len=(Math::Rand(seedL)&0xff); // 0 to 255
+        sum2+=len;
+		pBuf.AppendFormat(_L("W%03u->F2 "),len); // Write len bytes to file2
+		r=TheFile2.Write(testPat2,len);
+		TestRet(r);
+		r=TheFile2.Write(_L8("\n"));
+		TestRet(r);
+		CheckFile2();
+    
+	    if (Math::Rand(seedL)&0x10)
+            {
+			CheckFile2();
+            len=(Math::Rand(seedL)&0x2ff);
+            sum3+=len;
+			pBuf.AppendFormat(_L("W%03u->F3 "),len); // Write len bytes to file3
+			r=TheFile3.Write(testPat3,len);
+			TestRet(r);
+			CheckFile2();
+			}
+
+        if (Math::Rand(seedL)&0x10)
+            {
+            len=(Math::Rand(seedL)&0x3ff);
+            sum4+=len;
+			pBuf.AppendFormat(_L("W%04u->F4 "),len); // Write len bytes to file4
+			r=TheFile4.Write(testPat4,len);
+			TestRet(r);
+//			CheckFile4();
+		    }
+
+        if ((Math::Rand(seedL)&0x70)==0x70)
+            {
+			r=TheFile5.Open(TheFs,nameBuf5,EFileStreamText|EFileWrite);
+			TestRet(r);
+			TInt pos=0;
+			r=TheFile5.Seek(ESeekEnd,pos);
+			TestRet(r);
+			testPat5.Format(_L8("%8x\n"),Math::Rand(seed5));
+			pBuf.Append(_L("W8->F5")); // Write 8 bytes to file5
+			r=TheFile5.Write(testPat5);
+			TestRet(r);
+			TheFile5.Close();
+            sum5+=8;
+            }
+		test.Printf(pBuf);
+
+		if ((Math::Rand(seedL)&0xf0)==0xf0)
+            {
+            test.Printf(_L("  DELETE F3"));
+			TheFile3.Close();
+			r=TheFs.Delete(nameBuf3);
+            TestRet(r);
+			r=TheFile3.Temp(TheFs,testDir,nameBuf3,EFileStream|EFileWrite);
+	        TestRet(r);
+            sum3=0L;
+            }
+        if ((Math::Rand(seedL)&0xf0)==0xf0)
+            {
+            test.Printf(_L("  DELETE F4"));
+			TheFile4.Close();
+			r=TheFs.Delete(nameBuf4);
+	        TestRet(r);
+			r=TheFile4.Temp(TheFs,testDir,nameBuf4,EFileStream|EFileWrite);
+	        TestRet(r);
+            sum4=0L;
+            }
+        if ((Math::Rand(seedL)&0x1f0)==0x1f0)
+            {
+            test.Printf(_L("  REPLACE F3"));
+			TheFile3.Close();
+	        TestRet(r);
+			r=TheFile3.Replace(TheFs,nameBuf3,EFileStream|EFileWrite);
+	        TestRet(r);
+            sum3=0L;
+            }
+        if ((Math::Rand(seedL)&0x1f0)==0x1f0)
+            {
+            test.Printf(_L("  REPLACE F4"));
+			TheFile4.Close();
+			r=TheFile4.Replace(TheFs,nameBuf4,EFileStream|EFileWrite);
+	        TestRet(r);
+            sum4=0L;
+            }
+        if ((Math::Rand(seedL)&0x1f0)==0x1f0)
+            {
+            test.Printf(_L("  TRUNCATE F3 to zero"));
+			r=TheFile3.SetSize(0);
+	        TestRet(r);
+            sum3=0L;
+            }
+        if ((Math::Rand(seedL)&0x1f0)==0x1f0)
+            {
+            test.Printf(_L("  TRUNCATE F4 to zero"));
+			r=TheFile4.SetSize(0);
+	        TestRet(r);
+            sum4=0L;
+            }
+        if ((Math::Rand(seedL)&0x70)==0x70)
+            {
+			sum3=Math::Rand(seedL)&0x3fff;
+            test.Printf(_L("  SET SIZE F3 to %u"),sum3);
+			r=TheFile3.SetSize(sum3);
+	        TestRet(r);
+			TInt pos=0;
+			r=TheFile3.Seek(ESeekEnd,pos);
+	        TestRet(r);
+			test(pos==sum3);
+            }
+        if ((Math::Rand(seedL)&0x70)==0x70)
+            {
+			sum4=Math::Rand(seedL)&0x3fff;
+            test.Printf(_L("  SET SIZE F4 to %u"),sum4);
+			r=TheFile4.SetSize(sum4);
+	        TestRet(r);
+			TInt pos=0;
+			r=TheFile4.Seek(ESeekEnd,pos);
+	        TestRet(r);
+			test(pos==sum4);
+            }
+        if ((Math::Rand(seedL)&0x70)==0x70)
+            {
+            test.Printf(_L("  CHECKING F1"));
+            TInt pos=0;
+			r=TheFile1.Seek(ESeekStart,pos);
+	        TestRet(r);
+			test(pos==0);
+            TInt sum=0;
+			buf.Fill('A',0x200);
+            do
+                {
+				r=TheFile1.Read(chkPat);
+				TestRet(r);
+				if (chkPat.Length()<chkPat.MaxLength())
+					buf.SetLength(chkPat.Length());
+				test(buf==chkPat);
+                sum+=chkPat.Length();
+                } while (chkPat.Length()==chkPat.MaxLength());
+            test(sum==sum1);
+            }
+        if ((Math::Rand(seedL)&0x70)==0x70)
+            {
+            test.Printf(_L("  CHECKING F2"));
+            TInt pos=0;
+			r=TheFile2.Seek(ESeekStart,pos);
+			TestRet(r);
+			test(pos==0);
+            TInt sum=0;
+			sBuf.Set(TheFile2);
+            FOREVER
+                {
+				r=sBuf.Read(chkPat);
+				if (r!=KErrNone)
+					{
+					if (r==KErrEof)
+						break;
+					test.Panic(r,_L("Read text failed"));
+					}
+				testPat2.SetLength(chkPat.Length());
+                test(chkPat==testPat2);
+                sum+=chkPat.Length();
+                }
+			testPat2.SetLength(testPat2.MaxLength());
+            test(sum==sum2);
+            }
+        if ((Math::Rand(seedL)&0x70)==0x70)
+            {
+			pBuf.Zero();
+			pBuf.Format(_L("  CHECKING F3 "));
+			TheFile3.Close();
+			TEntry e;
+			r=TheFs.Entry(nameBuf3,e);
+			TestRet(r);
+			pBuf.AppendFormat(_L("Info=%u sum3=%u"),e.iSize,sum3);
+			test.Printf(pBuf);
+			r=TheFile3.Open(TheFs,nameBuf3,EFileStream|EFileWrite);
+			TestRet(r);
+            TInt pos=0;
+			r=TheFile3.Seek(ESeekEnd,pos);
+			TestRet(r);
+			test(pos==sum3);
+            }
+        if ((Math::Rand(seedL)&0x70)==0x70)
+            {
+			pBuf.Format(_L("  CHECKING F4 "));
+			TheFile4.Close();
+			TEntry e;
+			r=TheFs.Entry(nameBuf4,e);
+			TestRet(r);
+			pBuf.AppendFormat(_L("Info=%u sum4=%u"),e.iSize,sum4);
+			test.Printf(pBuf);
+			r=TheFile4.Open(TheFs,nameBuf4,EFileStream|EFileWrite);
+			TestRet(r);
+            TInt pos=sum4;
+			r=TheFile4.Seek(ESeekStart,pos);
+			TestRet(r);
+			test(pos==sum4);
+            }
+        if ((Math::Rand(seedL)&0x1f0)==0x1f0)
+            {
+            test.Printf(_L("  CHECKING F5"));
+			r=TheFile5.Open(TheFs,nameBuf5,EFileStreamText|EFileWrite);
+			TestRet(r);
+			TInt64 seed=KInitialSeed5;
+            TInt sum=0;
+			sBuf.Set(TheFile5);
+            FOREVER
+                {
+				chkPat.Format(_L8("%8x"),Math::Rand(seed));
+				r=sBuf.Read(testPat5);
+				if (r!=KErrNone)
+					{
+					if (r==KErrEof)
+						break;
+					test.Panic(r,_L("Read text failed"));
+					}
+				test(testPat5.Length()==8);
+                sum+=testPat5.Length();
+                test(chkPat==testPat5);
+                }
+            test(sum==sum5);
+			TheFile5.Close();
+            }
+        }
+	TheFile1.Close();
+	TheFile2.Close();
+	TheFile3.Close();
+	TheFile4.Close();
+	TheFs.Delete(nameBuf1);
+	TheFs.Delete(nameBuf2);
+	TheFs.Delete(nameBuf3);
+	TheFs.Delete(nameBuf4);
+	TheFs.Delete(nameBuf5);
+	
+	TTime endTimeC;
+	endTimeC.HomeTime();
+	TTimeIntervalSeconds timeTakenC;
+	r=endTimeC.SecondsFrom(timerC,timeTakenC);
+	TestRet(r);
+	test.Printf(_L("Time taken for test = %d secs\n"),timeTakenC.Int());
+	}