kerneltest/f32test/manager/t_oom.cpp
changeset 0 a41df078684a
child 109 b3a1d9898418
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/kerneltest/f32test/manager/t_oom.cpp	Mon Oct 19 15:55:17 2009 +0100
@@ -0,0 +1,222 @@
+// Copyright (c) 1996-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\manager\t_oom.cpp
+// 
+//
+
+#include <hal.h>
+#include <f32file.h>
+#include <e32test.h>
+#include "../server/t_server.h"
+
+GLDEF_D RTest test(_L("T_OOM"));
+
+LOCAL_C void FormatFat()
+//
+// Call all RFormat methods
+//
+	{
+
+	test.Next(_L("Format the disk"));
+	RFormat format;
+	TFileName sessionPath;
+	TInt r=TheFs.SessionPath(sessionPath);
+	test(r==KErrNone);
+	TInt count;
+	r=format.Open(TheFs,sessionPath,EHighDensity,count);
+	test(r==KErrNone);
+//	test(count==100);
+//	TRequestStatus status;
+//	TPckgBuf<TInt> step;
+//	do 	{
+//		format.Next(step,status);
+//		User::WaitForRequest(status);
+//		test(status==KErrNone);
+//	} while (step()<count);
+//	test(step()==count);
+	const TInt total(count);
+	while (count && r == KErrNone)
+		{
+		test((r = format.Next(count)) == KErrNone);
+		test.Printf(_L("\r%d/%d"), count, total);
+		}
+	test.Printf(_L("\n"));
+	format.Close();
+	}
+
+LOCAL_C void Test1()
+//
+// Test openning a large file
+//
+	{
+
+	test.Next(_L("Create a file GOBBLE.DAT"));
+	TUint size=0x340000; // 3.25MB
+	
+	test.Printf(_L("FileSize = 0x%x\n"),size);
+	RFile file;
+	TInt r=file.Replace(TheFs,_L("\\F32-TST\\GOBBLE.DAT"),EFileRead);
+	test(r==KErrNone);
+	r=file.SetSize(size);
+	test(r==KErrNone || r==KErrDiskFull);
+	if (r==KErrDiskFull)
+		{
+		TFileName sessionPath;
+		r=TheFs.SessionPath(sessionPath);
+		test(r==KErrNone);
+		test.Printf(_L("Error %S diskfull\n"),&sessionPath);
+// Reintroduce when we can detect that the test is being run manually
+//		test.Getch();
+		}
+	file.Close();
+	}
+
+/** if internal RAM drive has a defined limit, test cannot be exceeded */
+
+LOCAL_C void TestRAMDriveLimit()
+	{
+	test.Start(_L("TestRAMDriveLimit"));
+
+	TInt r;										// error code
+
+	for (TInt d = EDriveA; d <= EDriveZ; ++d)
+		{
+		TDriveInfo di;
+		test((r = TheFs.Drive(di, d)) == KErrNone);
+		TInt maxRam;
+
+		if (di.iType == EMediaRam && HAL::Get(HAL::EMaxRAMDriveSize, maxRam) == KErrNone)
+			{
+#ifdef __WINS__									// c: not EMediaRam on WINS
+			if (d != EDriveY)
+				continue;
+#endif
+
+			test.Printf(_L("Testing RAM drive limit %08x on drive %x\n"), maxRam, d);
+
+			// create lots of files and check KErrDiskFull after right number
+
+			const TInt KFileSize = 16 * 1024;
+
+			_LIT(KDrvTmp, "?:\\");				// set session path to limited drive
+			TBuf<3> bfDrv(KDrvTmp);
+			TChar ch;
+			test(RFs::DriveToChar(d, ch) == KErrNone);
+			bfDrv[0] = static_cast<TText>(ch);
+			test.Printf(_L("Setting session path to \"%S\".\n"), &bfDrv);
+			test(TheFs.SetSessionPath(bfDrv) == KErrNone);
+
+			FormatFat();						// remove all current files from drive
+
+			TBuf<3 + 2> bfDir;					// subdir to avoid root KErrDirFull
+			bfDir.Append(bfDrv);
+			_LIT(KTstDir, "t\\");
+			bfDir.Append(KTstDir);
+			test.Printf(_L("creating directory \"%S\".\n"), &bfDir);
+			r = TheFs.MkDir(bfDir);
+			test(r == KErrNone);
+
+			TBuf<3 + 3 + 8 + 1 + 3> bfFlNm(bfDir);
+			TInt ctr = 0;						// create files until KErrDiskFull
+			do
+				{
+				bfFlNm.SetLength(bfDir.Length());
+				bfFlNm.AppendFormat(_L("%08x.dat"), ctr);
+
+				test.Printf(
+					_L("\rcreating %S @ %08x (total %08x)"),
+					&bfFlNm, KFileSize, ctr * KFileSize);
+
+				RFile f;
+				r = f.Create(TheFs, bfFlNm, EFileShareExclusive | EFileStream | EFileWrite);
+				test(r == KErrNone || r == KErrDiskFull);
+				if (r == KErrNone)
+					{
+					r = f.SetSize(KFileSize);
+					test(r == KErrNone || r == KErrDiskFull);
+					}
+				f.Close();
+
+				++ctr;
+				} while (r != KErrDiskFull);
+			test.Printf(_L("\n"));
+
+			// new file takes KFileSize, any possibly metadata cluster
+
+			TVolumeInfo vi;
+			test(TheFs.Volume(vi, d) == KErrNone);
+			test(vi.iSize < maxRam);			// vi.iSize does not include FAT
+			test(vi.iFree < 2 * KFileSize);
+
+			FormatFat();
+
+			// create single file and set to > maxRam
+
+			RFile fS;
+			_LIT(bfFlNmS, "00000000.dat");
+			test(fS.Create(TheFs, bfFlNmS, EFileShareExclusive | EFileStream | EFileWrite) == KErrNone);
+			test(fS.SetSize(maxRam) == KErrDiskFull);
+			fS.Close();
+			}
+		}	// for (TInt d = EDriveA; d <= EDriveZ; ++d)
+
+	test.End();
+	}
+
+GLDEF_C void CallTestsL()
+//
+// Call all tests
+//
+	{
+	test.Title();
+	test.Start(_L("Starting T_OOM test"));
+
+	TDriveInfo driveInfo;
+	TInt r=TheFs.Drive(driveInfo);
+	test(r==KErrNone);
+	if (driveInfo.iType==EMediaNotPresent)
+		{
+		test.Printf(_L("ERROR: MEDIA NOT PRESENT\n"));
+// Reintroduce when we can detect that the test is being run manually
+//		test.Getch();
+		return;
+		}
+
+	TFileName sessionPath;
+	r=TheFs.SessionPath(sessionPath);
+	test(r==KErrNone);
+	r=TheFs.MkDirAll(sessionPath);
+	test(r==KErrCorrupt || r==KErrAlreadyExists || r==KErrNone);
+	if (r==KErrCorrupt)
+		FormatFat();
+	if (r==KErrAlreadyExists)
+		{
+		test.Next(_L("Remove test directory"));
+		CFileMan* fman=CFileMan::NewL(TheFs);
+		TInt ret=fman->RmDir(sessionPath);
+		test(ret==KErrNone);
+		delete fman;
+		}
+	if (r!=KErrNone)
+		{
+		r=TheFs.MkDirAll(sessionPath);
+		test(r==KErrNone);
+		}
+
+	Test1();
+
+	TestRAMDriveLimit();
+	test.End();
+	test.Close();
+	}