diff -r 15018f1726c7 -r 3eacc0623088 persistentstorage/sql/TEST/t_sqloslayer.cpp --- a/persistentstorage/sql/TEST/t_sqloslayer.cpp Fri Mar 19 10:00:55 2010 +0200 +++ b/persistentstorage/sql/TEST/t_sqloslayer.cpp Fri Apr 16 16:49:27 2010 +0300 @@ -41,6 +41,8 @@ const char* KTestFile1Z = "c:\\test\\t_sqloslayer.bin"; const char* KTestFile2Z = "z:\\test\\TestDb1.db"; const char* KTestFile3Z = "c:\\test\\t_sqloslayer.db"; +_LIT(KPrivateDir, "c:\\private\\21F12127\\"); +const char* KTestFile4Z = "c:\\test\\t_sqloslayer2.db"; //In order to be able to compile the test, the following variables are defined (used inside the OS porting layer, when _SQLPROFILER macro is defined) #ifdef _SQLPROFILER @@ -91,6 +93,63 @@ /////////////////////////////////////////////////////////////////////////////////////// +static TInt TheProcessHandleCount = 0; +static TInt TheThreadHandleCount = 0; +static TInt TheAllocatedCellsCount = 0; + +#ifdef _DEBUG +static const TInt KBurstRate = 20; +#endif + +static void MarkHandles() + { + RThread().HandleCount(TheProcessHandleCount, TheThreadHandleCount); + } + +static void MarkAllocatedCells() + { + TheAllocatedCellsCount = User::CountAllocCells(); + } + +static void CheckAllocatedCells() + { + TInt allocatedCellsCount = User::CountAllocCells(); + TEST2(allocatedCellsCount, TheAllocatedCellsCount); + } + +static void CheckHandles() + { + TInt endProcessHandleCount; + TInt endThreadHandleCount; + + RThread().HandleCount(endProcessHandleCount, endThreadHandleCount); + + TEST2(TheProcessHandleCount, endProcessHandleCount); + TEST2(TheThreadHandleCount, endThreadHandleCount); + } + +static void OomPreStep(TInt +#ifdef _DEBUG + aFailingAllocationNo +#endif + ) + { + MarkHandles(); + MarkAllocatedCells(); + __UHEAP_MARK; + __UHEAP_SETBURSTFAIL(RAllocator::EBurstFailNext, aFailingAllocationNo, KBurstRate); + } + +static void OomPostStep() + { + __UHEAP_RESET; + __UHEAP_MARKEND; + CheckAllocatedCells(); + CheckHandles(); + } + +/////////////////////////////////////////////////////////////////////////////////////// + void TestEnvInit() { TInt err = TheFs.Connect(); @@ -405,35 +464,14 @@ TInt err = KErrNoMemory; while(err == KErrNoMemory) { - TInt processHandleCnt = 0; - TInt threadHandleCnt = 0; - RThread().HandleCount(processHandleCnt, threadHandleCnt); - TInt allocCellsCnt = User::CountAllocCells(); - - __UHEAP_MARK; - - __UHEAP_SETBURSTFAIL(RHeap::EDeterministic, ++failingAllocNum, 10); - + OomPreStep(++failingAllocNum); err = sqlite3SymbianLibInit(); - - __UHEAP_SETBURSTFAIL(RHeap::ENone, 0, 0); - - if(err != KErrNoMemory) - { - TEST2(err, KErrNone); - sqlite3SymbianLibFinalize(); - } - - __UHEAP_MARKEND; - - TInt processHandleCnt2 = 0; - TInt threadHandleCnt2 = 0; - RThread().HandleCount(processHandleCnt2, threadHandleCnt2); - TEST2(processHandleCnt2, processHandleCnt); - TEST2(threadHandleCnt2, threadHandleCnt); - - TInt allocCellsCnt2 = User::CountAllocCells(); - TEST2(allocCellsCnt2, allocCellsCnt); + sqlite3SymbianLibFinalize(); + OomPostStep(); + if(err != KErrNoMemory) + { + TEST2(err, KErrNone); + } } TEST2(err, KErrNone); TheTest.Printf(_L("=== sqlite3SymbianLibInit() OOM test succeeded at allcoation %d\r\n"), failingAllocNum); @@ -585,6 +623,94 @@ User::Free(osFile); } +void VfsOpenTempFileOomTest() + { + //Delete all temp files in this test private data cage. + CFileMan* fm = NULL; + TRAPD(err, fm = CFileMan::NewL(TheFs)); + TEST2(err, KErrNone); + TBuf<50> path; + path.Copy(KPrivateDir); + path.Append(_L("*.$$$")); + err = fm->Delete(path); + TEST(err == KErrNone || err == KErrNotFound); + + sqlite3_vfs* vfs = sqlite3_vfs_find(NULL); + TEST(vfs != NULL); + + sqlite3_file* osFile = (sqlite3_file*)User::Alloc(vfs->szOsFile); + TEST(osFile != NULL); + + TheTest.Printf(_L("Iteration: ")); + TInt failingAllocNum = 0; + err = SQLITE_IOERR_NOMEM; + while(err == SQLITE_IOERR_NOMEM) + { + ++failingAllocNum; + TheTest.Printf(_L("%d "), failingAllocNum); + OomPreStep(failingAllocNum); + int outFlags = 0; + err = sqlite3OsOpen(vfs, NULL, osFile, SQLITE_OPEN_READWRITE, &outFlags); + if(err == SQLITE_OK) + { + err = sqlite3OsClose(osFile); + } + OomPostStep(); + if(err != SQLITE_OK) + { + TEST2(err, SQLITE_IOERR_NOMEM); + } + //If the iteration has failed, then no temp file should exist in the test private data cage. + //If the iteration has succeeded, then sqlite3OsClose() should have deleted the temp file. + TInt err2 = fm->Delete(path); + TEST2(err2, KErrNotFound); + } + TEST2(err, SQLITE_OK); + TheTest.Printf(_L("\r\n=== TVfs::Open() OOM test succeeded at allcoation %d\r\n"), failingAllocNum); + + User::Free(osFile); + delete fm; + } + +void VfsCreateDeleteOnCloseFileOomTest() + { + sqlite3_vfs* vfs = sqlite3_vfs_find(NULL); + TEST(vfs != NULL); + + sqlite3_file* osFile = (sqlite3_file*)User::Alloc(vfs->szOsFile); + TEST(osFile != NULL); + + TheTest.Printf(_L("Iteration: ")); + TInt failingAllocNum = 0; + TInt err = SQLITE_IOERR_NOMEM; + while(err == SQLITE_IOERR_NOMEM) + { + ++failingAllocNum; + TheTest.Printf(_L("%d "), failingAllocNum); + OomPreStep(failingAllocNum); + int outFlags = 0; + err = sqlite3OsOpen(vfs, KTestFile4Z, osFile, SQLITE_OPEN_CREATE | SQLITE_OPEN_DELETEONCLOSE, &outFlags); + if(err == SQLITE_OK) + { + err = sqlite3OsClose(osFile); + } + OomPostStep(); + if(err != SQLITE_OK) + { + TEST2(err, SQLITE_IOERR_NOMEM); + } + //Whether the iteration has failed or succeeded, the file should not exist. + TPtrC8 ptrname((const TUint8*)KTestFile4Z); + TBuf<50> fname; + fname.Copy(ptrname); + TInt err2 = TheFs.Delete(fname); + TEST2(err2, KErrNotFound); + } + TEST2(err, SQLITE_OK); + TheTest.Printf(_L("\r\n=== TVfs::Open() OOM test succeeded at allcoation %d\r\n"), failingAllocNum); + User::Free(osFile); + } + /** @SYMTestCaseID SYSLIB-SQL-CT-1650 @SYMTestCaseDesc SQL, OS porting layer tests. @@ -612,6 +738,10 @@ ProfilerDisabledTest(); TheTest.Printf(_L("OS porting layer test - negative tests\r\n")); NegativeTest(); + TheTest.Printf(_L("TVfs::Open() OOM test\r\n")); + VfsOpenTempFileOomTest(); + TheTest.Printf(_L("TVfs::Open(<'delete on close' file>) OOM test\r\n")); + VfsCreateDeleteOnCloseFileOomTest(); } TInt E32Main() @@ -619,6 +749,7 @@ TheTest.Title(); CTrapCleanup* tc = CTrapCleanup::New(); + TheTest(tc != NULL); __UHEAP_MARK;