kerneltest/f32test/server/t_filecache.cpp
changeset 139 95f71bcdcdb7
parent 109 b3a1d9898418
child 152 657f875b013e
--- a/kerneltest/f32test/server/t_filecache.cpp	Fri May 14 17:13:29 2010 +0300
+++ b/kerneltest/f32test/server/t_filecache.cpp	Thu May 27 14:17:14 2010 +0300
@@ -22,6 +22,7 @@
 #include "t_server.h"
 #include <e32twin.h>
 #include <e32rom.h>
+#include <u32hal.h>	//*test*
 
 
 //----------------------------------------------------------------------------------------------
@@ -250,6 +251,18 @@
 		}
 	}
 
+//*test**************************************************************************
+TInt FreeRam()
+	{
+	// wait for any async cleanup in the supervisor to finish first...
+	UserSvr::HalFunction(EHalGroupKernel, EKernelHalSupervisorBarrier, 0, 0);
+
+	TMemoryInfoV1Buf meminfo;
+	UserHal::MemoryInfo(meminfo);
+	return meminfo().iFreeRamInBytes;
+	}
+//*test**************************************************************************
+
 
 LOCAL_C void UnitTests()
 //
@@ -299,6 +312,68 @@
 	TInt uncachedPacketsRead;
 #endif
 
+//*test**************************************************************************
+	{
+	TInt fileSize = 0;
+	
+	const TInt KWriteLen = 128*1024;
+	test.Next(_L("Test appending to a file with low memory"));
+	gBufPtr.SetLength(KBufSize);
+
+	r = f.Replace(TheFs, testFile, EFileWrite | EFileWriteBuffered);
+	test_KErrNone(r);
+
+	pos = 0;
+
+	writePtr.Set(gBufPtr.MidTPtr(pos, KWriteLen));
+
+	r = f.Write(pos, writePtr);
+	test_KErrNone(r);
+	pos+= writePtr.Length();
+
+	r = f.Size(fileSize);
+	test_KErrNone(r);
+	test_Equal(fileSize,pos);
+
+
+
+	TInt freeRam = FreeRam();
+	test.Printf(_L("FreeRam = %d"), freeRam);
+	const TInt KPageSize=4096;
+
+	RChunk chunk;
+	TChunkCreateInfo chunkInfo;
+	chunkInfo.SetDisconnected(0, 0, freeRam);
+	chunkInfo.SetPaging(TChunkCreateInfo::EUnpaged);
+	test_KErrNone(chunk.Create(chunkInfo));
+
+	TUint commitEnd = 0;
+	TInt r;
+	while(KErrNone == (r = chunk.Commit(commitEnd,KPageSize)))
+		{
+		commitEnd += KPageSize;
+		}
+	test_Equal(KErrNoMemory, r);
+
+
+
+	pos-= KSegmentSize;
+	writePtr.Set(gBufPtr.MidTPtr(pos, KWriteLen));
+
+	r = f.Write(pos, writePtr);
+	test_KErrNone(r);
+	pos+= writePtr.Length();
+
+	r = f.Size(fileSize);
+	test_KErrNone(r);
+	test_Equal(fileSize,pos);
+
+	f.Close();
+
+	chunk.Close();
+	}
+//*test**************************************************************************
+
 	// create an empty file, so that any writes overlapping segemt boundaries
 	// need a read first
 	// create a test file using directIO and then re-open it in buffered mode,