diff -r 000000000000 -r bde4ae8d615e os/persistentdata/persistentstorage/store/TFILE/t_storoom.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/os/persistentdata/persistentstorage/store/TFILE/t_storoom.cpp Fri Jun 15 03:10:57 2012 +0200 @@ -0,0 +1,389 @@ +// Copyright (c) 1998-2009 Nokia Corporation and/or its subsidiary(-ies). +// All rights reserved. +// This component and the accompanying materials are made available +// under the terms of "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: +// + +#include +#include + +#define UNUSED_VAR(a) a = a + +const TInt KTestCleanupStack=0x20; +const TPtrC KTestDir=_L("\\STOR-TST\\T_OOM\\"); + +#ifdef _DEBUG +const TPtrC desOriginalReverted2(_S("original/reverted A"),19); +const TPtrC desOriginalReverted3(_S("original/reverted B"),19); +const TPtrC desNewOverwritten2(_S("new/overwritten X"),17); +const TPtrC desNewOverwritten3(_S("new/overwritten Y"),17); +const TPtrC alphabet(_S("abcdefghijklmnopqrstuvwxyz"),26); +LOCAL_D CFileStore* store; +RStoreWriteStream out; +RStoreReadStream in; +TInt KMemoryAllocsInTestFunction=1; +#endif + +LOCAL_D CTrapCleanup* TheTrapCleanup; +LOCAL_D RTest test(_L("t_storoom")); +LOCAL_D RFs TheFs; + +LOCAL_C void setupTestDirectory() + {// Prepare the test directory. + TInt r=TheFs.Connect(); + test(r==KErrNone); +// + r=TheFs.MkDirAll(KTestDir); + test(r==KErrNone||r==KErrAlreadyExists); + r=TheFs.SetSessionPath(KTestDir); + test(r==KErrNone); + } + +LOCAL_C void setupCleanup() + {// Initialise the cleanup stack + TheTrapCleanup=CTrapCleanup::New(); + test(TheTrapCleanup!=NULL); + TRAPD(r,\ + {\ + for (TInt i=KTestCleanupStack;i>0;i--)\ + CleanupStack::PushL((TAny*)0);\ + CleanupStack::Pop(KTestCleanupStack);\ + }); + test(r==KErrNone); + } + +#ifdef _DEBUG +LOCAL_D void CreateStoreSetRootAndDestroyStoreL() + { + TheFs.Delete(_L("pfs")); + store=CPermanentFileStore::CreateLC(TheFs,_L("pfs"),EFileWrite|EFileRead); + store->SetTypeL(KPermanentFileStoreLayoutUid); + TStreamId rootId = store->ExtendL(); + store->SetRootL(rootId); + store->CommitL(); + CleanupStack::PopAndDestroy(); + } + +LOCAL_D void AlterStoreL() + { + RStoreWriteStream out2; + RStoreWriteStream out3; + RStoreWriteStream out4; + RStoreReadStream in; + + TStreamId id2 = out.CreateLC(*store); + out.CommitL(); + CleanupStack::PopAndDestroy(); + + TStreamId id3 = out.CreateLC(*store); + out.CommitL(); + CleanupStack::PopAndDestroy(); + + TStreamId id4 = out.CreateLC(*store); + out << _L("mum"); + out.CommitL(); + CleanupStack::PopAndDestroy(); + + out.ReplaceLC(*store,store->Root()); + out << id2; + out << id3; + out << id4; + out.CommitL(); + CleanupStack::PopAndDestroy(); + + in.OpenLC(*store,store->Root());// use the root for in and out streams + out.ReplaceLC(*store,store->Root()); + out.WriteL(in); + out.CommitL(); + CleanupStack::PopAndDestroy(2); + + out.ReplaceLC(*store,store->Root());// swap the order + in.OpenLC(*store,store->Root()); + out.WriteL(in); + out << _L("fromage"); + out.CommitL(); + CleanupStack::PopAndDestroy(2); + + store->CommitL(); + + in.OpenLC(*store,store->Root()); + TStreamId idX,idZ; + in >> idX; + in >> idX; + in >> idZ;// id4 "mum" + CleanupStack::PopAndDestroy(); + out.OpenLC(*store,idZ); + in.OpenLC(*store,idZ); + out2.OpenLC(*store,idZ); + out3.OpenLC(*store,idZ); + out4.OpenLC(*store,idZ); + out4.WriteL(in); + out.CommitL(); + CleanupStack::PopAndDestroy(5); + } +/** +@SYMTestCaseID SYSLIB-STORE-CT-1170 +@SYMTestCaseDesc Allocation failure in store test +@SYMTestPriority High +@SYMTestActions Tests for any memory errors during allocation of store +@SYMTestExpectedResults Test must not fail +@SYMREQ REQ0000 +*/ +LOCAL_D void AllocFailInSampleStoreCodeL() + { + test.Next(_L(" @SYMTestCaseID:SYSLIB-STORE-CT-1170 ")); + test.Console()->Printf(_L("AllocFailInSampleStoreCodeL()\n")); + TRAPD(r,CreateStoreSetRootAndDestroyStoreL()) + UNUSED_VAR(r); + const TInt KAllocFail=15; + for (TInt ii=1;ii<=20;++ii) + { + store=CPermanentFileStore::OpenLC(TheFs,_L("pfs"),EFileWrite|EFileRead); + __UHEAP_FAILNEXT(ii); + TRAPD(r,AlterStoreL()); + if (ii=KAllocFail) + test(r==KErrNone); + __UHEAP_RESET; + CleanupStack::PopAndDestroy(); + } + TheFs.Delete(_L("pfs")); + } + +LOCAL_D void InitialseStoreWithDataL() + { + TheFs.Delete(_L("pope")); + store=CPermanentFileStore::CreateLC(TheFs,_L("pope"),EFileWrite|EFileRead); + store->SetTypeL(KPermanentFileStoreLayoutUid); + TStreamId rootId = store->ExtendL(); + store->SetRootL(rootId); + store->CommitL(); + CleanupStack::PopAndDestroy(); + + store=CPermanentFileStore::OpenLC(TheFs,_L("pope"),EFileWrite|EFileRead); + TStreamId id2 = out.CreateLC(*store); + out << desOriginalReverted2; + out.CommitL(); + CleanupStack::PopAndDestroy(); + + TStreamId id3 = out.CreateLC(*store); + out << desOriginalReverted3; + out.CommitL(); + CleanupStack::PopAndDestroy(); + + out.ReplaceLC(*store,store->Root()); + out << id2; + out << id3; + out.CommitL(); + CleanupStack::PopAndDestroy();// out + + store->CommitL(); + CleanupStack::PopAndDestroy();// store + } + +LOCAL_D void AlterStoreDuringOutOfMemoryL(TInt aFail) + { + store=CPermanentFileStore::OpenLC(TheFs,_L("pope"),EFileWrite|EFileRead); + in.OpenLC(*store,store->Root()); + TStreamId id2; + TStreamId id3; + in >> id2; + in >> id3; + CleanupStack::PopAndDestroy();// in + + out.ReplaceLC(*store,id2); + out << desNewOverwritten2; + out.CommitL(); + CleanupStack::PopAndDestroy();// out + + store->CommitL(); + __UHEAP_FAILNEXT(aFail);// Out of memory + + out.ReplaceLC(*store,id3); + out << desNewOverwritten3; + out.CommitL(); + CleanupStack::PopAndDestroy();// out + + store->CommitL(); + CleanupStack::PopAndDestroy();// store + + __UHEAP_RESET; + } + +/** +@SYMTestCaseID SYSLIB-STORE-CT-1346 +@SYMTestCaseDesc Streaming of data test +@SYMTestPriority High +@SYMTestActions Tests for RStoreReadStream::>> operator +@SYMTestExpectedResults Test must not fail +@SYMREQ REQ0000 +*/ +LOCAL_D void TestStreamDataL(TInt aFail) + { + test.Next(_L(" @SYMTestCaseID:SYSLIB-STORE-CT-1346 ")); + store=CPermanentFileStore::OpenLC(TheFs,_L("pope"),EFileWrite|EFileRead); + in.OpenLC(*store,store->Root()); + TStreamId id2; + TStreamId id3; + in >> id2; + in >> id3; + CleanupStack::PopAndDestroy();// in + + TBuf<32> buf; + + in.OpenLC(*store,id2); + in >> buf; + test(buf==desNewOverwritten2); + + CleanupStack::PopAndDestroy();// in + + in.OpenLC(*store,id3); + in >> buf; + if (aFail > KMemoryAllocsInTestFunction) + test(buf==desNewOverwritten3); + else if (aFail<=KMemoryAllocsInTestFunction) + test(buf==desOriginalReverted3); + + CleanupStack::PopAndDestroy();// in + + CleanupStack::PopAndDestroy();// store + } + +LOCAL_D void ResetStreamDataL() + { + store=CPermanentFileStore::OpenLC(TheFs,_L("pope"),EFileWrite|EFileRead); + in.OpenLC(*store,store->Root()); + TStreamId id2; + TStreamId id3; + in >> id2; + in >> id3; + CleanupStack::PopAndDestroy();// in + + out.ReplaceLC(*store,id2); + out << desOriginalReverted2; + out.CommitL(); + CleanupStack::PopAndDestroy();// out + + out.ReplaceLC(*store,id3); + out << desOriginalReverted3; + out.CommitL(); + CleanupStack::PopAndDestroy();// out + + store->CommitL(); + CleanupStack::PopAndDestroy();// store + } +/** +@SYMTestCaseID SYSLIB-STORE-CT-1171 +@SYMTestCaseDesc Out of memory errors test +@SYMTestPriority High +@SYMTestActions Tests for out of memory conditions before commiting to the store +@SYMTestExpectedResults Test must not fail +@SYMREQ REQ0000 +*/ +LOCAL_D void OutOfMemoryBeforeStoreCommitL() + { + test.Next(_L(" @SYMTestCaseID:SYSLIB-STORE-CT-1171 ")); + test.Console()->Printf(_L("OutOfMemoryBeforeStoreCommitL()\n")); + InitialseStoreWithDataL(); + for (TInt fail=1; fail<=5; ++ fail) + { + TRAPD(r,AlterStoreDuringOutOfMemoryL(fail)); + if (fail<=KMemoryAllocsInTestFunction) + test(r==KErrNoMemory);// store saved when r!=KErrNone + else + test(r==KErrNone); + TestStreamDataL(fail); + ResetStreamDataL(); + } + TheFs.Delete(_L("pope")); + } + + +LOCAL_D void OpenCloseStoreL(TInt aFail) + { + __UHEAP_FAILNEXT(aFail); + TheFs.Delete(_L("pope")); + store=CPermanentFileStore::CreateLC(TheFs,_L("pope"),EFileWrite|EFileRead); + store->SetTypeL(KPermanentFileStoreLayoutUid); + TStreamId rootId = store->ExtendL(); + store->SetRootL(rootId); + store->CommitL(); + CleanupStack::PopAndDestroy(); + + store=CPermanentFileStore::OpenLC(TheFs,_L("pope"),EFileWrite|EFileRead); + TStreamId id2 = out.CreateLC(*store); + out << desOriginalReverted2; + out << id2; + out.CommitL(); + CleanupStack::PopAndDestroy(2); + } +/** +@SYMTestCaseID SYSLIB-STORE-CT-1172 +@SYMTestCaseDesc Out of memory test +@SYMTestPriority High +@SYMTestActions Test for memory errors during opening and closing of store operation. +@SYMTestExpectedResults Test must not fail +@SYMREQ REQ0000 +*/ + +LOCAL_D void OutOfMemoryWhenOpeningClosingStoreL() + { + test.Next(_L(" @SYMTestCaseID:SYSLIB-STORE-CT-1172 ")); + test.Console()->Printf(_L("OutOfMemoryWhenOpeningClosingStoreL()\n")); + const TInt KAllocs=12; + for (TInt fail=1; fail<=20; ++ fail) + { + TRAPD(r,OpenCloseStoreL(fail)) + if (fail