248 TestBufferFail(aBuffer, pos, aLength); |
249 TestBufferFail(aBuffer, pos, aLength); |
249 } |
250 } |
250 } |
251 } |
251 } |
252 } |
252 |
253 |
|
254 //*test************************************************************************** |
|
255 TInt FreeRam() |
|
256 { |
|
257 // wait for any async cleanup in the supervisor to finish first... |
|
258 UserSvr::HalFunction(EHalGroupKernel, EKernelHalSupervisorBarrier, 0, 0); |
|
259 |
|
260 TMemoryInfoV1Buf meminfo; |
|
261 UserHal::MemoryInfo(meminfo); |
|
262 return meminfo().iFreeRamInBytes; |
|
263 } |
|
264 //*test************************************************************************** |
|
265 |
253 |
266 |
254 LOCAL_C void UnitTests() |
267 LOCAL_C void UnitTests() |
255 // |
268 // |
256 // Test read file handling. |
269 // Test read file handling. |
257 // |
270 // |
296 TPtr8 readPtr(gBuf->Des()); |
309 TPtr8 readPtr(gBuf->Des()); |
297 #if defined(_DEBUG) || defined(_DEBUG_RELEASE) |
310 #if defined(_DEBUG) || defined(_DEBUG_RELEASE) |
298 TInt uncachedBytesRead; |
311 TInt uncachedBytesRead; |
299 TInt uncachedPacketsRead; |
312 TInt uncachedPacketsRead; |
300 #endif |
313 #endif |
|
314 |
|
315 //*test************************************************************************** |
|
316 { |
|
317 TInt fileSize = 0; |
|
318 |
|
319 const TInt KWriteLen = 128*1024; |
|
320 test.Next(_L("Test appending to a file with low memory")); |
|
321 gBufPtr.SetLength(KBufSize); |
|
322 |
|
323 r = f.Replace(TheFs, testFile, EFileWrite | EFileWriteBuffered); |
|
324 test_KErrNone(r); |
|
325 |
|
326 pos = 0; |
|
327 |
|
328 writePtr.Set(gBufPtr.MidTPtr(pos, KWriteLen)); |
|
329 |
|
330 r = f.Write(pos, writePtr); |
|
331 test_KErrNone(r); |
|
332 pos+= writePtr.Length(); |
|
333 |
|
334 r = f.Size(fileSize); |
|
335 test_KErrNone(r); |
|
336 test_Equal(fileSize,pos); |
|
337 |
|
338 |
|
339 |
|
340 TInt freeRam = FreeRam(); |
|
341 test.Printf(_L("FreeRam = %d"), freeRam); |
|
342 const TInt KPageSize=4096; |
|
343 |
|
344 RChunk chunk; |
|
345 TChunkCreateInfo chunkInfo; |
|
346 chunkInfo.SetDisconnected(0, 0, freeRam); |
|
347 chunkInfo.SetPaging(TChunkCreateInfo::EUnpaged); |
|
348 test_KErrNone(chunk.Create(chunkInfo)); |
|
349 |
|
350 TUint commitEnd = 0; |
|
351 TInt r; |
|
352 while(KErrNone == (r = chunk.Commit(commitEnd,KPageSize))) |
|
353 { |
|
354 commitEnd += KPageSize; |
|
355 } |
|
356 test_Equal(KErrNoMemory, r); |
|
357 |
|
358 |
|
359 |
|
360 pos-= KSegmentSize; |
|
361 writePtr.Set(gBufPtr.MidTPtr(pos, KWriteLen)); |
|
362 |
|
363 r = f.Write(pos, writePtr); |
|
364 test_KErrNone(r); |
|
365 pos+= writePtr.Length(); |
|
366 |
|
367 r = f.Size(fileSize); |
|
368 test_KErrNone(r); |
|
369 test_Equal(fileSize,pos); |
|
370 |
|
371 f.Close(); |
|
372 |
|
373 chunk.Close(); |
|
374 } |
|
375 //*test************************************************************************** |
301 |
376 |
302 // create an empty file, so that any writes overlapping segemt boundaries |
377 // create an empty file, so that any writes overlapping segemt boundaries |
303 // need a read first |
378 // need a read first |
304 // create a test file using directIO and then re-open it in buffered mode, |
379 // create a test file using directIO and then re-open it in buffered mode, |
305 // so that any writes overlapping segemt boundaries need a read first |
380 // so that any writes overlapping segemt boundaries need a read first |