diff -r 000000000000 -r bde4ae8d615e os/persistentdata/persistentstorage/centralrepository/test/t_oomcenrepsrv.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/os/persistentdata/persistentstorage/centralrepository/test/t_oomcenrepsrv.cpp Fri Jun 15 03:10:57 2012 +0200 @@ -0,0 +1,1454 @@ +// Copyright (c) 2005-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: +// t_oomcenrep.cpp +// +// + +#include "t_cenrep_helper.h" +#include +#include +#include +#include "srvsess.h" +#include "sessmgr.h" +#include "srvres.h" +#include "srvreqs.h" +#include "cachemgr.h" +#include "clientrequest.h" +#include "install.h" +#include + +LOCAL_D RFs TheFs; +LOCAL_D RTest TheTest (_L ("t_oomcenrep.exe")); + +#ifdef __SECURE_DATA__ +_LIT(KInstallDirFile, "c:\\private\\10202BE9\\persists\\installdir.bin"); + +_LIT(KPersistsFile, "c:\\private\\10202BE9\\persists\\11111111.cre"); +_LIT(KInstallPersistsFile, "c:\\private\\10202BE9\\persists\\11111110.cre"); +_LIT(KPersistsFileNoUpgrade, "c:\\private\\10202BE9\\bur\\11111111.crn"); +_LIT(KPersistsFileUpgraded, "c:\\private\\10202BE9\\bur\\11111111.cru"); + +_LIT(KRomUpgradeRev1File, "z:\\private\\10202BE9\\11111111.txu"); +_LIT(KRomUpgradeRev2File, "z:\\private\\10202BE9\\11111112.txu"); +_LIT(KUpgradeFile, "c:\\private\\10202BE9\\11111111.txt"); + +_LIT(KInstallOnlyFile, "z:\\private\\10202BE9\\11111110.cri"); +_LIT(KInstallOnlyUpgradeFile, "z:\\private\\10202BE9\\11111110.cru"); +_LIT(KInstallFile, "c:\\private\\10202BE9\\11111110.cre"); + +#else +_LIT(KPersistsFiles, "c:\\system\\data\\cenrep\\persists\\*.*"); +#endif + + +//Test repositories Uid +const TUid KTestRepositoryUid={0x11111111}; +const TUid KCorruptRepositoryUid={0xBADBADBB}; + +static TUid KCurrentTestUid; + +/////////////////////////////////////////////////////////////////////////////////////// +//Test macroses and functions +LOCAL_C void CheckL(TInt aValue, TInt aLine) + { + if(!aValue) + { + RDebug::Print(_L("Error\r\n")); + CleanupCDriveL(); + TheTest(EFalse, aLine); + } + } +LOCAL_C void CheckL(TInt aValue, TInt aExpected, TInt aLine) + { + if(aValue != aExpected) + { + RDebug::Print(_L("*** Expected error: %d, got: %d\r\n"), aExpected, aValue); + CleanupCDriveL(); + TheTest(EFalse, aLine); + } + } +#define TESTL(arg) ::CheckL((arg), __LINE__) +#define TEST2L(aValue, aExpected) ::CheckL(aValue, aExpected, __LINE__) +#define TESTKErrNoneL(aValue) ::CheckL(aValue,0,__LINE__); + +///////////////////////////////////////////////////////////////////////////////////////// +class CenrepSrvOOMTest :public CBase +{ +public: + void GetL(); + void FindL(); + void ResetL(); + void NotifyL(); + void SetL(); + void CreateL(); + void DeleteL(); + void MoveL(); + + CenrepSrvOOMTest(); + ~CenrepSrvOOMTest(); + static CenrepSrvOOMTest* NewL(); +#ifdef SYMBIAN_CENTREP_SUPPORT_MULTIROFS + void DoHeapRepositoryContentCheckL(); +#endif +private: + void ConstructL(); +public: + CServerRepository* iServerRepo; + CSessionNotifier* iSessionNotif; +}; + +////////////////////////////////////////////////////////////////////////////////////////////////// +class CenrepSwiOOMTest :public CBase +{ +public: + void UpgradeROMRev1L(TBool aIsSetup); + void UpgradeROMRev2L(TBool aIsSetup); + void UninstallROMUpgradeL(TBool aIsSetup); + + void InstallL(TBool aIsSetup); + void UpgradeInstallL(TBool aIsSetup); + void UninstallL(TBool aIsSetup); + + CenrepSwiOOMTest(); + ~CenrepSwiOOMTest(); + static CenrepSwiOOMTest* NewL(); +private: + void ConstructL(); + CCentRepSWIWatcher* iSwiWatcher; +public: +}; +////////////////////////////////////////////////////////////////////////////////////////////////// + +CenrepSrvOOMTest::CenrepSrvOOMTest(){} + +CenrepSrvOOMTest::~CenrepSrvOOMTest() + { + if (iServerRepo) + { + if (iSessionNotif) + { + iServerRepo->Close(); + } + delete iServerRepo; + } + if (iSessionNotif) + delete iSessionNotif; + + // Cache must be disabled here. Otherwise, if any idle repositories exists, they will + // still be open (have their pointers in the iOpenRepositories list) and the list will leak. + TServerResources::iCacheManager->DisableCache(); + TServerResources::iObserver->CloseiOpenRepositories(); + } + +CenrepSrvOOMTest* CenrepSrvOOMTest::NewL() + { + CenrepSrvOOMTest* self=new (ELeave)CenrepSrvOOMTest; + CleanupStack::PushL(self); + self->ConstructL(); + CleanupStack::Pop(self); + return self; + } + +void CenrepSrvOOMTest::ConstructL() + { + iServerRepo=new (ELeave)CServerRepository(); + iSessionNotif=new (ELeave) CSessionNotifier(); + + iServerRepo->OpenL(KCurrentTestUid,*iSessionNotif); + } + +////////////////////////////////////////////////////////////////////////////////////////////////// + +CenrepSwiOOMTest::CenrepSwiOOMTest(){} + +CenrepSwiOOMTest::~CenrepSwiOOMTest() + { + delete iSwiWatcher; + } + +CenrepSwiOOMTest* CenrepSwiOOMTest::NewL() + { + CenrepSwiOOMTest* self=new (ELeave)CenrepSwiOOMTest; + CleanupStack::PushL(self); + self->ConstructL(); + CleanupStack::Pop(self); + return self; + } + +void CenrepSwiOOMTest::ConstructL() + { + iSwiWatcher = CCentRepSWIWatcher::NewL(TServerResources::iFs); + } + +//Getting various information and security policy from the repository +//TInt CServerRepository::Get(TUint32 aId,T& aVal) +//TServerSetting* CServerRepository::GetSetting(TUint32 aId) +void CenrepSrvOOMTest::GetL() + { + TInt err=KErrNone; + TInt keyInt=0; + TServerSetting* srvsetting; + //----------Getting the TInt(1-15)----------------------------- + for (TInt i=1;i<=15;i++) + { + err=iServerRepo->Get(i,keyInt); + //Remember the policy check is done at the session level + TESTKErrNoneL(err); + TESTL(i==keyInt); + srvsetting=iServerRepo->GetSetting(i); + TESTL(srvsetting->Key()==static_cast(i)); + } + //---------Getting the TReal(16-19)--------------------------- + TReal keyValue; + err=iServerRepo->Get(16,keyValue); + TESTKErrNoneL(err); + TESTL(keyValue==10.1010); + srvsetting=iServerRepo->GetSetting(16); + TESTL(srvsetting->Key()==16); + + err=iServerRepo->Get(19,keyValue); + TESTKErrNoneL(err); + TESTL(keyValue==13.1313); + + //----------Getting the String(20-23)----------------------- + TBuf8<50> keyString; + _LIT(KFourteen,"fourteen"); + err=iServerRepo->Get(20,keyString); + TESTKErrNoneL(err); + //Even ascii(8 bytes) are stored as 16 bytes!!! + TPtr16 str16((TUint16*) keyString.Ptr(),keyString.Length()/2,keyString.Length()/2); + TESTL(str16.Compare(KFourteen)==0); + srvsetting=iServerRepo->GetSetting(20); + TESTL(srvsetting->Key()==20); + + //---------Getting the String8(0x79)------------------------ + TBuf8<50> keyString8; + _LIT8(KString8,"string8"); + err=iServerRepo->Get(0x79,keyString8); + TESTKErrNoneL(err); + TESTL(keyString8.Compare(KString8)==0); + srvsetting=iServerRepo->GetSetting(0x79); + TESTL(srvsetting->Key()==0x79); + + //---------Getting the binary(0x82)------------------------- + TBuf8<50> keyBinary; + _LIT8(KBinary8,"\x12\x34\xAB\xCD"); + err=iServerRepo->Get(0x82,keyBinary); + TESTKErrNoneL(err); + //temporarily added to solve coverage problem in WINSCW +#ifdef __EPOC32__ + TESTL(keyBinary.Compare(KBinary8)==0); +#endif + srvsetting=iServerRepo->GetSetting(0x82); + TESTL(srvsetting->Key()==0x82); + + //----------Getting individual policy----------------------- + //Current Exe has caps AllFiles+WriteDeviceData+ReadDeviceData + RThread currentThread; + TSecurityPolicy secPolicy; + //default policy + secPolicy=iServerRepo->GetDefaultReadAccessPolicy(); + TESTL(secPolicy.CheckPolicy(currentThread)==1); + secPolicy=iServerRepo->GetDefaultWriteAccessPolicy(); + TESTL(secPolicy.CheckPolicy(currentThread)==1); + + //check settings policies + //0x2 int 2 1 cap_rd=CommDD cap_wr=WriteDeviceData + //0x19 int 25 0 //defined in range policies with cap_rd=NetworkServices + secPolicy=iServerRepo->GetReadAccessPolicy(2); + TESTL(secPolicy.CheckPolicy(currentThread)==0); + secPolicy=iServerRepo->GetWriteAccessPolicy(2); + TESTL(secPolicy.CheckPolicy(currentThread)==1); + secPolicy=iServerRepo->GetReadAccessPolicy(25); + TESTL(secPolicy.CheckPolicy(currentThread)==0); + + } + +// now that write operations must be done in transactions, setting up this helper +// function to perform single Sets for the purpose of this test. +template +static TInt RepositorySingleSetL(CServerRepository& aRep, TUint32 aKey, const T& aValue) + { + aRep.StartTransaction(EConcurrentReadWriteTransaction); + aRep.CleanupCancelTransactionPushL(); + aRep.TransactionSetL(aKey, aValue); + CleanupStack::Pop(); + TUint32 keyInfo; + return User::LeaveIfError(aRep.CommitTransaction(keyInfo)); + }; + +//Setting OOM testing +void CenrepSrvOOMTest::SetL() + { + TInt ret=KErrNone; + TInt intValue=0; + TReal realValue=0; + + //---------------SetL----------------------------------- + //Setting an integer key + ret = RepositorySingleSetL(*iServerRepo, 0x60, 600); + TESTKErrNoneL(ret); + ret=iServerRepo->Get(0x60,intValue); + TESTL(intValue== 600); + + //Setting a real key + ret = RepositorySingleSetL(*iServerRepo, 0x66, 99.99); + TESTKErrNoneL(ret); + ret=iServerRepo->Get(0x66,realValue); + TESTL(realValue==99.99); + + //Setting a string key + //Even ascii(8 bytes) are stored as 16 bytes!!! + _LIT8(KString,"sixhundred"); + TBuf8<50> stringChangeValue=KString(); + ret = RepositorySingleSetL(*iServerRepo, 0x69, stringChangeValue); + TESTKErrNoneL(ret); + + TBuf8<50> keyString; + ret=iServerRepo->Get(0x69,keyString); + TESTKErrNoneL(ret); + TESTL(keyString.Compare(KString)==0); + } + +// now that write operations must be done in transactions, setting up this helper +// function to perform single Creates for the purpose of this test. +template +static TInt RepositorySingleCreateL(CServerRepository& aRep, TUint32 aKey, const T& aValue, TUint32* aMeta) + { + aRep.StartTransaction(EConcurrentReadWriteTransaction); + aRep.CleanupCancelTransactionPushL(); + aRep.TransactionCreateL(aKey, aValue, aMeta); + CleanupStack::Pop(); + TUint32 keyInfo; + return User::LeaveIfError(aRep.CommitTransaction(keyInfo)); + }; + +void CenrepSrvOOMTest::CreateL() + { + TInt ret=KErrNone; + TInt intValue=0; + TReal realValue=0; + + //--------------CreateL----------------------------------- + //Creating an integer key + TInt intRetValue; + intValue=9000; + RepositorySingleCreateL(*iServerRepo, 0x90, intValue, NULL); + TESTKErrNoneL(ret); + ret=iServerRepo->Get(0x90,intRetValue); + TESTKErrNoneL(ret); + TESTL(intRetValue==intValue); + + //Creating a real key + TReal realRetValue; + realValue=33.3333; + RepositorySingleCreateL(*iServerRepo, 0x92, realValue, NULL); + TESTKErrNoneL(ret); + ret=iServerRepo->Get(0x92,realRetValue); + TESTKErrNoneL(ret); + TESTL(realValue==realRetValue); + + //Creating a string key + _LIT8(KStringValue,"creatingkey"); + TBuf8<50> stringCreateValue=KStringValue(); + RepositorySingleCreateL(*iServerRepo, 0x93, stringCreateValue, NULL); + TESTKErrNoneL(ret); + } + +// now that write operations must be done in transactions, setting up this helper +// function to perform single Creates for the purpose of this test. +static TInt RepositorySingleDeleteL(CServerRepository& aRep, TUint32 aKey) + { + aRep.StartTransaction(EConcurrentReadWriteTransaction); + aRep.CleanupCancelTransactionPushL(); + aRep.TransactionDeleteL(aKey); + CleanupStack::Pop(); + TUint32 keyInfo; + return User::LeaveIfError(aRep.CommitTransaction(keyInfo)); + }; + +void CenrepSrvOOMTest::DeleteL() + { + TInt ret=KErrNone; + //--------------Delete----------------------------------- + //Find the settings 0x10A-0x10C to ensure it is still there + RSettingPointerArray matchingArray; + TUint32 partialId=0x100; + TUint32 idMask=0xFFFFFFF0; + ret=iServerRepo->FindSettings(partialId,idMask,matchingArray); + if (ret==KErrNoMemory) + { + matchingArray.Close(); + User::LeaveNoMemory(); + } + + TESTKErrNoneL(ret); + TESTL(matchingArray.Count()==3); + matchingArray.Close(); + + //Deleting settings 0x10A to 0x10C + for (TInt i=0x10A;i<=0x10C;i++) + { + RepositorySingleDeleteL(*iServerRepo, i); + TESTKErrNoneL(ret); + } + //After deleting try to find the persistent settings again + ret=iServerRepo->FindSettings(partialId,idMask,matchingArray); + if (ret==KErrNoMemory) + { + matchingArray.Close(); + User::LeaveNoMemory(); + } + TESTKErrNoneL(ret); + TESTL(matchingArray.Count()==0); + matchingArray.Close(); + + //-------------DeleteRange--------------------------------- + //Deleting settings 0x1 to 0xF + TClientRequest dummyrequest; + TUint32 errId=0; + partialId=0; + idMask=0xFFFFFFF0; + ret=iServerRepo->FindSettings(partialId,idMask,matchingArray); + if (ret==KErrNoMemory) + { + matchingArray.Close(); + User::LeaveNoMemory(); + } + TESTKErrNoneL(ret) ; + TESTL(matchingArray.Count()==15); + matchingArray.Close(); + + //Deleting settings using the DeleteRange + dummyrequest.SetParam(0,partialId); + dummyrequest.SetParam(1,idMask); + dummyrequest.SetPolicyCheck(ETrue); + + // write operation must take place in a transaction + iServerRepo->StartTransaction(EConcurrentReadWriteTransaction); + iServerRepo->CleanupCancelTransactionPushL(); + iServerRepo->TransactionDeleteRangeL(dummyrequest,errId); + CleanupStack::Pop(); + TUint32 keyInfo; + User::LeaveIfError(iServerRepo->CommitTransaction(keyInfo)); + + //Now try to find the key being deleted + ret=iServerRepo->FindSettings(partialId,idMask,matchingArray); + if (ret==KErrNoMemory) + { + matchingArray.Close(); + User::LeaveNoMemory(); + } + TESTKErrNoneL(ret); + TESTL(matchingArray.Count()==0); + matchingArray.Close(); + } + +//Setting existing key value then follow by commit +void CenrepSrvOOMTest::MoveL() + { + RSettingPointerArray matchingArray; + TUint32 idMask=0xFFFFFFF0; + + /*---------------MoveL------------------------------------- + TUint32 sourcePartialId = aMessage.Int0(); + TUint32 targetPartialId = aMessage.Int1(); + TUint32 idMask = aMessage.Int2(); + */ + TClientRequest dummyrequest; + TUint32 errId=0; + TUint32 sourcePartialId=0x110; + TUint32 targetPartialId=0x120; + idMask=0xFFFFFFF0; + + TKeyFilter srcKeyIdentifier = {sourcePartialId, idMask}; + TPckg pSrcIdentifier(srcKeyIdentifier); + TKeyFilter tgtKeyIdentifier = {targetPartialId, idMask}; + TPckg pTgtIdentifier(tgtKeyIdentifier); + + //First check to ensure the target key before move does not exist + User::LeaveIfError(iServerRepo->FindSettings(targetPartialId,idMask,matchingArray)); + TESTL(matchingArray.Count()==0); + matchingArray.Close(); + + //moving from 0x110(0x11B,0x11C,0x11E) to 0x120 + dummyrequest.SetParam(0, &pSrcIdentifier); + dummyrequest.SetParam(1, &pTgtIdentifier); + dummyrequest.SetPolicyCheck(ETrue); + + // write operation must take place in a transaction + iServerRepo->StartTransaction(EConcurrentReadWriteTransaction); + iServerRepo->CleanupCancelTransactionPushL(); + iServerRepo->TransactionMoveL(dummyrequest,errId); + CleanupStack::Pop(); + TUint32 keyInfo; + User::LeaveIfError(iServerRepo->CommitTransaction(keyInfo)); + + //Now try to find the key being moved + User::LeaveIfError(iServerRepo->FindSettings(targetPartialId,idMask,matchingArray)); + TESTL(matchingArray.Count()==3); + matchingArray.Close(); + } + +//Finding keys from the settings +//TInt FindSettings(TUint32 aPartialId,TUint32 aIdMask,RSettingPointerArray& aMatches) +//Guarantees the heap free in aMatches if this function fail +void CenrepSrvOOMTest::FindL() + { + TInt ret=KErrNone; + RSettingPointerArray foundIdArray; + TUint32 partialId=0; + TUint32 idMask=0; + //-----------Finding settings array using partial id & mask------ + + //------------------Real type--------------------------------- + //0x42,0x44,0x45,0x48 + partialId=0x40; + idMask=0xFFFFFFF0; + User::LeaveIfError(iServerRepo->FindSettings(partialId,idMask,foundIdArray)); + TESTKErrNoneL(ret); + TESTL(foundIdArray.Count()==4); + foundIdArray.Close(); + + //-----------------String type------------------------------- + //0x51,0x54,0x5B + partialId=0x50; + idMask=0xFFFFFFF0; + User::LeaveIfError(iServerRepo->FindSettings(partialId,idMask,foundIdArray)); + TESTKErrNoneL(ret); + TESTL(foundIdArray.Count()==3); + foundIdArray.Close(); + + //--------------------Int type---------------------------------------------------- + partialId=0x30; + idMask=0xFFFFFFF0; + //This should return only 0x30,0x34,0x35,0x39,0x3B( 5 items) + User::LeaveIfError(iServerRepo->FindSettings(partialId,idMask,foundIdArray)); + TESTKErrNoneL(ret); + TESTL(foundIdArray.Count()==5); + + //----------------Find comparison using EEqual & ENotEqual------------------------ + TInt searchValue=100; + TClientRequest dummyrequest; + RArray idArray; + //Set the policycheck to always pass + dummyrequest.SetPolicyCheck(ETrue); + //Comparison using Equal + TRAP(ret,iServerRepo->FindCompareL(foundIdArray,searchValue,EEqual,idArray)); + if (ret==KErrNoMemory) + { + //do not need to reset idArray as it is done inside the function itself when it returns not KErrNone + foundIdArray.Close(); + User::LeaveNoMemory(); + } + TESTL(idArray.Count()==2); + TESTL((idArray[0]==0x30 && idArray[1]==0x34) || (idArray[0]==0x34 && idArray[1]==0x30)); + idArray.Close(); + //Comparison using ENotEqual + TRAP(ret,iServerRepo->FindCompareL(foundIdArray,searchValue,ENotEqual,idArray)); + if (ret==KErrNoMemory) + { + //do not need to reset idArray as it is done inside the function itself when it returns not KErrNone + foundIdArray.Close(); + User::LeaveNoMemory(); + } + TESTL(idArray.Count()==3); + idArray.Close(); + foundIdArray.Close(); + + } + +//Resetting settings +void CenrepSrvOOMTest::ResetL() + { + TInt ret=KErrNone; + TInt retValue=0; + TReal realValue=0; + + //-------------Single key reset---------------------------- + + ret = RepositorySingleSetL(*iServerRepo, 1, 500); + TESTKErrNoneL(ret); + ret=iServerRepo->Get(1,retValue); + TESTL(retValue==500); + + //Resetting individual settings + ret=iServerRepo->ResetL(1); + TESTKErrNoneL(ret); + + //Check for value once being reset + ret=iServerRepo->Get(1,retValue); + TESTL(retValue==1); + + //------------All keys reset------------------------------ + ret = RepositorySingleSetL(*iServerRepo, 17, 3.1343424); + TESTKErrNoneL(ret); + + //Reset all settings from Rom + User::LeaveIfError(iServerRepo->ResetAllL()); + TESTKErrNoneL(ret); + + //Check for value once all being reset + + ret=iServerRepo->Get(17,realValue); + TESTL(realValue==11.1111); + } + +void CenrepSrvOOMTest::NotifyL() + { + TInt err=KErrNone; + + //addding individual requests + for (TInt i=0;i<10;i++) + { + TClientRequest dummyRequest; + User::LeaveIfError(iSessionNotif->AddRequest(i,dummyRequest)); + } + + //adding group requests + for (TInt i=0;i<10;i++) + { + TClientRequest dummyRequest; + TUint32 partialId=100*i; + TUint32 idMask=0xFFFFFFF0; + User::LeaveIfError(iSessionNotif->AddRequest(partialId,idMask,dummyRequest)); + } + + //cancelling individual requests + User::LeaveIfError(iSessionNotif->CancelRequest(5)); + //Check to ensure that it has been deleted so calling cancel again will return KErrNotFound + err=iSessionNotif->CancelRequest(5); + TESTL(err==KErrNotFound); + + //cancelling group requests + User::LeaveIfError(iSessionNotif->CancelRequest(500,0xFFFFFFF0)); + err=iSessionNotif->CancelRequest(500,0xFFFFFF0); + TESTL(err==KErrNotFound); + + //Finally cancel ALL requests + iSessionNotif->CancelAllRequests(); + + } + +//Deletes the CServerRepository object properly +LOCAL_C void ReleaseRepository(TAny* aServerRepository) + { + CServerRepository* serverRepository = static_cast(aServerRepository); + + TServerResources::iCacheManager->DisableCache(); + TServerResources::iObserver->CloseiOpenRepositories(); + delete serverRepository; + TServerResources::iCacheManager->EnableCache(); + } + +//Opening a repository and closing the repository +LOCAL_C void CreateDeleteL(TBool /*aOOMMode*/) +{ + CServerRepository* serverRepo=new (ELeave)CServerRepository(); + TCleanupItem cleanupItem(&ReleaseRepository, serverRepo); + CleanupStack::PushL(cleanupItem); + + CSessionNotifier* sessNotif=new (ELeave)CSessionNotifier(); + CleanupStack::PushL(sessNotif); + +// test access to a valid repository + serverRepo->OpenL(KCurrentTestUid,*sessNotif); + serverRepo->Close(); + + CleanupStack::PopAndDestroy(sessNotif); + CleanupStack::PopAndDestroy(1); +} + +LOCAL_C void CreateDeleteCorruptL(TBool /*aOOMMode*/) +{ + CServerRepository* serverRepo=new (ELeave)CServerRepository(); + TCleanupItem cleanupItem(&ReleaseRepository, serverRepo); + CleanupStack::PushL(cleanupItem); + + CSessionNotifier* sessNotif=new (ELeave)CSessionNotifier(); + CleanupStack::PushL(sessNotif); + +// test access to a corrupt repository + // trap KErrCorrupt + TRAPD(err, serverRepo->OpenL(KCorruptRepositoryUid,*sessNotif)); + // leave if not KErrCorrupt + User::LeaveIfError((err == KErrCorrupt) ? KErrNone : err); + serverRepo->Close(); + + CleanupStack::PopAndDestroy(sessNotif); + CleanupStack::PopAndDestroy(1); +} + +void CenrepSwiOOMTest::UpgradeROMRev1L(TBool aIsSetup) + { + if(aIsSetup) + { + RFs fs; + User::LeaveIfError(fs.Connect()); + CleanupClosePushL(fs); + CFileMan* fm = CFileMan::NewL(fs); + CleanupStack::PushL(fm); + + // Copy rev 1 file into install dir & Reset read-only bit + User::LeaveIfError(fm->Copy(KRomUpgradeRev1File, KUpgradeFile)); + User::LeaveIfError(fm->Attribs(KUpgradeFile,0,KEntryAttReadOnly,TTime(0))); + CleanupStack::PopAndDestroy(2); // fs and fm + } + else + { + iSwiWatcher->HandleSWIEventL(ESASwisInstall | ESASwisStatusSuccess); + } + } + +LOCAL_C void ModifyTimeStampL(RFs &fs, TDesC *fileName, TTime aTime) + { + // Reset read-only bit + User::LeaveIfError(fs.SetAtt(*fileName, 0, KEntryAttReadOnly)); + TTimeIntervalHours interval(1); + TTime newTime=aTime+interval; + User::LeaveIfError(fs.SetModified(*fileName, newTime)); + } + + +void CenrepSwiOOMTest::UpgradeROMRev2L(TBool aIsSetup) + { + if(aIsSetup) + { + // Set up rev 1 + UpgradeROMRev1L(ETrue); + UpgradeROMRev1L(EFalse); + + RFs fs; + User::LeaveIfError(fs.Connect()); + CleanupClosePushL(fs); + CFileMan* fm = CFileMan::NewL(fs); + CleanupStack::PushL(fm); + + // Get modification time + TTime time; + TBuf<50> fileName(KUpgradeFile); + fs.Modified(fileName, time); + + // Copy rev2 file into install dir & Reset read-only bit + User::LeaveIfError(fm->Copy(KRomUpgradeRev2File, KUpgradeFile)); + User::LeaveIfError(fm->Attribs(KUpgradeFile,0,KEntryAttReadOnly,TTime(0))); + // Modify timestamp to cause upgrade + ModifyTimeStampL(fs,&fileName, time); + + CleanupStack::PopAndDestroy(2); // fs and fm + } + else + { + iSwiWatcher->HandleSWIEventL(ESASwisInstall | ESASwisStatusSuccess); + } + + } + +void CenrepSwiOOMTest::UninstallROMUpgradeL(TBool aIsSetup) + { + if(aIsSetup) + { + // Install rev 2 + UpgradeROMRev2L(ETrue); + UpgradeROMRev2L(EFalse); + + RFs fs; + User::LeaveIfError(fs.Connect()); + CleanupClosePushL(fs); + CFileMan* fm = CFileMan::NewL(fs); + CleanupStack::PushL(fm); + + // Delete file from install dir + User::LeaveIfError(fm->Attribs(KUpgradeFile,0,KEntryAttReadOnly,TTime(0))); + TInt err=fs.Delete(KUpgradeFile); + if((err!=KErrNone)&&(err!=KErrNotFound)) + User::Leave(err); + + CleanupStack::PopAndDestroy(2); // fs and fm + } + else + { + iSwiWatcher->HandleSWIEventL(ESASwisUninstall | ESASwisStatusSuccess); + } + } + +void CenrepSwiOOMTest::InstallL(TBool aIsSetup) + { + if(aIsSetup) + { + RFs fs; + User::LeaveIfError(fs.Connect()); + CleanupClosePushL(fs); + CFileMan* fm = CFileMan::NewL(fs); + CleanupStack::PushL(fm); + + // Copy rev 1 file into install dir & Reset read-only bit + User::LeaveIfError(fm->Copy(KInstallOnlyFile, KInstallFile)); + User::LeaveIfError(fm->Attribs(KInstallFile,0,KEntryAttReadOnly,TTime(0))); + + CleanupStack::PopAndDestroy(2); // fs and fm + } + else + { + iSwiWatcher->HandleSWIEventL(ESASwisInstall | ESASwisStatusSuccess); + } + } + +void CenrepSwiOOMTest::UpgradeInstallL(TBool aIsSetup) + { + if(aIsSetup) + { + // Install file + InstallL(ETrue); + InstallL(EFalse); + + RFs fs; + User::LeaveIfError(fs.Connect()); + CleanupClosePushL(fs); + CFileMan* fm = CFileMan::NewL(fs); + CleanupStack::PushL(fm); + + // Get modification time + TTime time; + TBuf<50> fileName(KInstallFile); + fs.Modified(fileName, time); + + // Copy upgrade file into install dir & Reset read-only bit + User::LeaveIfError(fm->Copy(KInstallOnlyUpgradeFile, KInstallFile)); + User::LeaveIfError(fm->Attribs(KInstallFile,0,KEntryAttReadOnly,TTime(0))); + // Modify timestamp to cause upgrade + ModifyTimeStampL(fs,&fileName, time); + + CleanupStack::PopAndDestroy(2); // fs and fm + } + else + { + iSwiWatcher->HandleSWIEventL(ESASwisInstall | ESASwisStatusSuccess); + } + } + +void CenrepSwiOOMTest::UninstallL(TBool aIsSetup) + { + if(aIsSetup) + { + // Install upgrade + UpgradeInstallL(ETrue); + UpgradeInstallL(EFalse); + + RFs fs; + User::LeaveIfError(fs.Connect()); + CleanupClosePushL(fs); + CFileMan* fm = CFileMan::NewL(fs); + CleanupStack::PushL(fm); + + // Delete file from install dir + User::LeaveIfError(fm->Attribs(KInstallFile,0,KEntryAttReadOnly,TTime(0))); + TInt err=fs.Delete(KInstallFile); + if((err!=KErrNone)&&(err!=KErrNotFound)) + User::Leave(err); + + // Create a cre persists file, doesn't matter what's in it, it should be deleted + User::LeaveIfError(fm->Copy(KPersistsFileUpgraded, KInstallPersistsFile)); + User::LeaveIfError(fm->Attribs(KInstallPersistsFile,0,KEntryAttReadOnly,TTime(0))); + + CleanupStack::PopAndDestroy(2); // fs and fm + } + else + { + iSwiWatcher->HandleSWIEventL(ESASwisUninstall | ESASwisStatusSuccess); + } + } + +LOCAL_C void StartupUpgradeL(TBool aIsSetup) +{ + if(aIsSetup) + { + // Set up files for test + RFs fs; + User::LeaveIfError(fs.Connect()); + CleanupClosePushL(fs); + CFileMan* fm = CFileMan::NewL(fs); + CleanupStack::PushL(fm); + + // Clean out files + TInt err=fs.Delete(KInstallDirFile); + if((err!=KErrNone)&&(err!=KErrNotFound)) + User::Leave(err); + + // Cause directory listing with no files to be written + CCentRepSWIWatcher* swiWatcher = CCentRepSWIWatcher::NewL(TServerResources::iFs); + delete swiWatcher; + + User::LeaveIfError(fm->Copy(KPersistsFileNoUpgrade, KPersistsFile)); + User::LeaveIfError(fm->Attribs(KPersistsFile,0,KEntryAttReadOnly,TTime(0))); + + User::LeaveIfError(fm->Copy(KRomUpgradeRev1File, KUpgradeFile)); + User::LeaveIfError(fm->Attribs(KUpgradeFile,0,KEntryAttReadOnly,TTime(0))); + + CleanupStack::PopAndDestroy(2); // fs and fm + } + else + { + CCentRepSWIWatcher* swiWatcher = CCentRepSWIWatcher::NewL(TServerResources::iFs); + delete swiWatcher; + } +} + +LOCAL_C void StartupDowngradeL(TBool aIsSetup) +{ + if(aIsSetup) + { + StartupUpgradeL(ETrue); + StartupUpgradeL(EFalse); + + // Set up files for test + RFs fs; + User::LeaveIfError(fs.Connect()); + CleanupClosePushL(fs); + TInt err=fs.Delete(KUpgradeFile); + if((err!=KErrNone)&&(err!=KErrNotFound)) + User::Leave(err); + + CleanupStack::PopAndDestroy(); // fs + } + else + { + CCentRepSWIWatcher* swiWatcher = CCentRepSWIWatcher::NewL(TServerResources::iFs); + delete swiWatcher; + } +} + +LOCAL_C void StartupUninstallL(TBool aIsSetup) +{ + if(aIsSetup) + { + RFs fs; + User::LeaveIfError(fs.Connect()); + CleanupClosePushL(fs); + CFileMan* fm = CFileMan::NewL(fs); + CleanupStack::PushL(fm); + + // Copy rev 1 file into install dir & Reset read-only bit + User::LeaveIfError(fm->Copy(KInstallOnlyFile, KInstallFile)); + User::LeaveIfError(fm->Attribs(KInstallFile,0,KEntryAttReadOnly,TTime(0))); + + // Cause directory listing to be written and file to be installed + CCentRepSWIWatcher* swiWatcher = CCentRepSWIWatcher::NewL(TServerResources::iFs); + delete swiWatcher; + + // Create a persists file that will be deleted + User::LeaveIfError(fm->Copy(KPersistsFileUpgraded, KInstallPersistsFile)); + User::LeaveIfError(fm->Attribs(KInstallPersistsFile,0,KEntryAttReadOnly,TTime(0))); + + TInt err=fs.Delete(KInstallFile); + if((err!=KErrNone)&&(err!=KErrNotFound)) + User::Leave(err); + + CleanupStack::PopAndDestroy(2); // fs and fm + } + else + { + CCentRepSWIWatcher* swiWatcher = CCentRepSWIWatcher::NewL(TServerResources::iFs); + delete swiWatcher; + } +} + +// Type definition for pointer to function +// Used for functions that can't use CenrepSrvOOMTest::ConstructL +typedef void (*FuncPtrL) (TBool); +/** +Wrapper function to call all OOM test functions +@param testFuncL pointer to OOM test function +@param aTestDesc test function name +*/ +LOCAL_C void DoOOMNoServReposL( FuncPtrL atestFuncL, const TDesC& aTestDesc, TBool aOOMMode) + { + TheTest.Next(aTestDesc); + + TInt err; + TInt tryCount = 0; + do + { + __UHEAP_MARK; + + //Initializing the server resources + TServerResources::InitialiseL (); + //Clear any files in the persist directory + CleanupCDriveL(); + + // find out the number of open handles + TInt startProcessHandleCount; + TInt startThreadHandleCount; + RThread().HandleCount(startProcessHandleCount, startThreadHandleCount); + + (*atestFuncL)(ETrue); + + if (aOOMMode) + __UHEAP_SETFAIL(RHeap::EDeterministic, ++tryCount); + + TRAP(err, (*atestFuncL)(EFalse)); + if (err!=KErrNoMemory) + TESTKErrNoneL(err); + + if (aOOMMode) + __UHEAP_SETFAIL(RHeap::ENone, 0); + + // check that no handles have leaked + TInt endProcessHandleCount; + TInt endThreadHandleCount; + RThread().HandleCount(endProcessHandleCount, endThreadHandleCount); + TEST2L(startProcessHandleCount, endProcessHandleCount); + TEST2L(startThreadHandleCount, endThreadHandleCount); + + //Freeing the server resources + TServerResources::Close(); + + __UHEAP_MARKEND; + } while(err == KErrNoMemory); + + TESTKErrNoneL(err); + if (aOOMMode) + TheTest.Printf(_L("- server succeeded at heap failure rate of %i\n"), tryCount); + } + +// Type definition for pointer to member function. +// Used in calling the CRegistryDataTest member function for testing. +typedef void (CenrepSrvOOMTest::*ClassFuncPtrL) (void); +/** +Wrapper function to call all OOM test functions +@param testFuncL pointer to OOM test function +@param aTestDesc test function name +@param aOOMMode to enable/disable the OOM environment +*/ +LOCAL_C void DoOOMTestL(ClassFuncPtrL testFuncL, const TDesC& aTestDesc,TBool aOOMMode) + { + TheTest.Next(aTestDesc); + + TInt err=KErrNone; + TInt tryCount = 0; + do + { + __UHEAP_MARK; + + //Initializing the server resources + TServerResources::InitialiseL (); + + //Clear any files in the persist directory + CleanupCDriveL(); + + CenrepSrvOOMTest* theTest=CenrepSrvOOMTest::NewL(); + CleanupStack::PushL(theTest); + + TInt startProcessHandleCount; + TInt startThreadHandleCount; + RThread().HandleCount(startProcessHandleCount, startThreadHandleCount); + + if (aOOMMode) + __UHEAP_SETFAIL(RHeap::EDeterministic, ++tryCount); + + TRAP(err, (theTest->*testFuncL)()); + + if (aOOMMode) + __UHEAP_SETFAIL(RHeap::ENone, 0); + + if (err!=KErrNoMemory) + TESTKErrNoneL(err); + + CleanupStack::PopAndDestroy(theTest); + + // check that no handles have leaked + TInt endProcessHandleCount; + TInt endThreadHandleCount; + RThread().HandleCount(endProcessHandleCount, endThreadHandleCount); + + TEST2L(startProcessHandleCount, endProcessHandleCount); + TEST2L(startThreadHandleCount, endThreadHandleCount); + + //Freeing the server resources + TServerResources::Close(); + __UHEAP_MARKEND; + } while(err == KErrNoMemory); + + TESTKErrNoneL(err); + if (aOOMMode) + TheTest.Printf(_L("- server succeeded at heap failure rate of %i\n"), tryCount); + } + +// Type definition for pointer to member function. +// Used in calling the CRegistryDataTest member function for testing. +typedef void (CenrepSwiOOMTest::*ClassSwiFuncPtrL) (TBool); +/** +Wrapper function to call all OOM test functions +@param testFuncL pointer to OOM test function +@param aTestDesc test function name +@param aOOMMode to enable/disable the OOM environment +*/ +LOCAL_C void DoOOMSwiTestL(ClassSwiFuncPtrL aTestFuncL, const TDesC& aTestDesc,TBool aOOMMode) + { + TheTest.Next(aTestDesc); + + TInt err=KErrNone; + TInt tryCount = 0; + do + { + __UHEAP_MARK; + + //Initializing the server resources + TServerResources::InitialiseL (); + //Clear any files in the persist directory + CleanupCDriveL(); + + TInt startProcessHandleCount; + TInt startThreadHandleCount; + RThread().HandleCount(startProcessHandleCount, startThreadHandleCount); + + CenrepSwiOOMTest* theTest=CenrepSwiOOMTest::NewL(); + CleanupStack::PushL(theTest); + + // Set up test + (theTest->*aTestFuncL)(ETrue); + + if (aOOMMode) + __UHEAP_SETFAIL(RHeap::EDeterministic, ++tryCount); + + TRAP(err, (theTest->*aTestFuncL)(EFalse)); + + if (aOOMMode) + __UHEAP_SETFAIL(RHeap::ENone, 0); + + if (err!=KErrNoMemory) + TESTKErrNoneL(err); + + CleanupStack::PopAndDestroy(theTest); + + // check that no handles have leaked + TInt endProcessHandleCount; + TInt endThreadHandleCount; + RThread().HandleCount(endProcessHandleCount, endThreadHandleCount); + + TEST2L(startProcessHandleCount, endProcessHandleCount); + TEST2L(startThreadHandleCount, endThreadHandleCount); + + //Freeing the server resources + TServerResources::Close(); + __UHEAP_MARKEND; + } while(err == KErrNoMemory); + + TESTKErrNoneL(err); + if (aOOMMode) + TheTest.Printf(_L("- server succeeded at heap failure rate of %i\n"), tryCount); + } + +#ifdef SYMBIAN_CENTREP_SUPPORT_MULTIROFS +void CenrepSrvOOMTest::DoHeapRepositoryContentCheckL() + { + CServerRepository* srv=iServerRepo; + //check setting and its meta + TServerSetting* setting=NULL; + + setting=srv->GetSetting(1); + TESTL(setting->iKey==1); + TESTL(setting->iMeta==0x80000010); + //points to global default policy here + TESTL(setting->iAccessPolicy->LowKey()==KUnspecifiedKey); + TESTL(setting->iAccessPolicy->HighKey()==1); + TESTL(setting->iAccessPolicy->KeyMask()==1); + + setting=srv->GetSetting(2); + TESTL(setting->iKey==2); + TESTL(setting->iMeta==0xA0000010); + //points to global default policy here + TESTL(setting->iAccessPolicy->LowKey()==KUnspecifiedKey); + TESTL(setting->iAccessPolicy->HighKey()==1); + TESTL(setting->iAccessPolicy->KeyMask()==1); + + setting=srv->GetSetting(3); + TESTL(setting->iKey==3); + TESTL(setting->iMeta==0x800000FF); + //points to global default policy here + TESTL(setting->iAccessPolicy->LowKey()==KUnspecifiedKey); + TESTL(setting->iAccessPolicy->HighKey()==1); + TESTL(setting->iAccessPolicy->KeyMask()==1); + + setting=srv->GetSetting(4); + TESTL(setting->iKey==4); + TESTL(setting->iMeta==0x80000010); + TESTL(setting->iAccessPolicy->LowKey()==4); + TESTL(setting->iAccessPolicy->HighKey()==1); + TESTL(setting->iAccessPolicy->KeyMask()==0); + + setting=srv->GetSetting(5); + TESTL(setting->iKey==5); + TESTL(setting->iMeta==0xC0000063); + //points to global default policy here + TESTL(setting->iAccessPolicy->LowKey()==KUnspecifiedKey); + TESTL(setting->iAccessPolicy->HighKey()==1); + TESTL(setting->iAccessPolicy->KeyMask()==1); + + setting=srv->GetSetting(6); + TESTL(setting->iKey==6); + TESTL(setting->iMeta==0x90000010); + TESTL(setting->iAccessPolicy->LowKey()==6); + TESTL(setting->iAccessPolicy->HighKey()==1); + TESTL(setting->iAccessPolicy->KeyMask()==0); + + setting=srv->GetSetting(7); + TESTL(setting->iKey==7); + TESTL(setting->iMeta==0x80000010); + TESTL(setting->iAccessPolicy->LowKey()==7); + TESTL(setting->iAccessPolicy->HighKey()==1); + TESTL(setting->iAccessPolicy->KeyMask()==0); + + setting=srv->GetSetting(9); + TESTL(setting->iKey==9); + TESTL(setting->iMeta==0x80000010); + TESTL(setting->iAccessPolicy->LowKey()==KUnspecifiedKey); + TESTL(setting->iAccessPolicy->HighKey()==1); + TESTL(setting->iAccessPolicy->KeyMask()==1); + + setting=srv->GetSetting(10); + TESTL(setting->iKey==10); + TESTL(setting->iMeta==0x80000010); + TESTL(setting->iAccessPolicy->LowKey()==10); + TESTL(setting->iAccessPolicy->HighKey()==1); + TESTL(setting->iAccessPolicy->KeyMask()==0); + + setting=srv->GetSetting(300); + TESTL(setting->iKey==300); + TESTL(setting->iMeta==0x900003E7); + TESTL(setting->iAccessPolicy->LowKey()==KUnspecifiedKey); + TESTL(setting->iAccessPolicy->HighKey()==1); + TESTL(setting->iAccessPolicy->KeyMask()==1); + } + +LOCAL_C void DoAdditionalCheckingL() + { + TServerResources::InitialiseL (); + + CenrepSrvOOMTest* test=CenrepSrvOOMTest::NewL(); + CleanupStack::PushL(test); + test->DoHeapRepositoryContentCheckL(); + + CleanupStack::PopAndDestroy(); + + TServerResources::Close(); + } + +/** +@SYMTestCaseID PDS-CENTRALREPOSITORY-UT-4050 +@SYMTestCaseDesc Verifying that CRE generated will have the latest CRE version which is currently 2 +@SYMTestPriority High +@SYMTestActions Validating that CRE files generated with post PREQ2112 code will always contain version 2. + The unit test will load a txt repository and then modify some settings so that it gets persisted + in the persists directory. The test then read the cre files to verify that the version persisted + is the latest which is 2. +@SYMTestExpectedResults The correct file version is returned. +@SYMREQ REQ11282 +*/ +LOCAL_C void DoPersistedVersionCheckingL() + { + TheTest.Next (_L (" @SYMTestCaseID:PDS-CENTRALREPOSITORY-UT-4050 Verifying CRE generated will always be version 2 ")); + TServerResources::InitialiseL (); + + const TUid KTestUid={0x88880000}; + KCurrentTestUid=KTestUid; + + CenrepSrvOOMTest* test=CenrepSrvOOMTest::NewL(); + CleanupStack::PushL(test); + + //persist immediately + test->iServerRepo->CommitChangesL(); + + //now check the version of the CRE file + CHeapRepository* heap=CHeapRepository::NewL(KTestUid); + CleanupStack::PushL(heap); + TUint8 creVersion; + heap->CreateRepositoryFromCreFileL(TServerResources::iFs,_L("c:\\private\\10202be9\\persists\\88880000.cre"),creVersion); + TESTL(creVersion==KPersistFormatSupportsIndMetaIndicator); + + CleanupStack::PopAndDestroy(2,test); + TServerResources::Close(); + } +/** +@SYMTestCaseID PDS-CENTRALREPOSITORY-UT-4051 +@SYMTestCaseDesc Server side OOM loading of a multiple repository files +@SYMTestPriority High +@SYMTestActions Create the server class CServerRepository and used it to load the multi ROFS keyspace. + Test are repeated for the following keyspace combination such as TXT/TXT, CRE/TXT or TXT/CRE and CRE/CRE. + Test will also verify the resulting merged settings which includes checking + individual metadata bits and security policy bits +@SYMTestExpectedResults Server loading of the multi rofs keypsace should not fail and leak memory under OOM condition. +@SYMREQ REQ11282 +*/ +LOCAL_C void DoOOMMultiRofsTestL() + { + TheTest.Next (_L (" @SYMTestCaseID:PDS-CENTRALREPOSITORY-UT-4051 CENREPSRV MultiROFS OOM Test ")); + + const TUid KMultiRofsRepositoryUid1={0xFFFF0000}; + const TUid KMultiRofsRepositoryUid2={0xEEEE0000}; + const TUid KMultiRofsRepositoryUid3={0xDDDD0000}; + const TUid KMultiRofsRepositoryUid4={0xCCCC0000}; + + //First Testuid=KMultiRofsRepositoryUid + //Testing the OOM of multi rofs processing + KCurrentTestUid=KMultiRofsRepositoryUid1; + DoOOMNoServReposL(&CreateDeleteL, _L("Create Delete OOM Multi ROFS Test"),ETrue); + DoAdditionalCheckingL(); + KCurrentTestUid=KMultiRofsRepositoryUid2; + DoOOMNoServReposL(&CreateDeleteL, _L("Create Delete OOM Multi ROFS Test"),ETrue); + DoAdditionalCheckingL(); + KCurrentTestUid=KMultiRofsRepositoryUid3; + DoOOMNoServReposL(&CreateDeleteL, _L("Create Delete OOM Multi ROFS Test"),ETrue); + DoAdditionalCheckingL(); + KCurrentTestUid=KMultiRofsRepositoryUid4; + DoOOMNoServReposL(&CreateDeleteL, _L("Create Delete OOM Multi ROFS Test"),ETrue); + DoAdditionalCheckingL(); + } +#endif + +LOCAL_C void DoOOMTestsL() + { + TheTest.Next (_L (" @SYMTestCaseID:SYSLIB-CENTRALREPOSITORY-LEGACY-T_OOMCENREP-0001 Starting CENREPSRV OOM Test ")); + RFs fs; + User::LeaveIfError(fs.Connect()); + CleanupClosePushL(fs); + CFileMan* fm = CFileMan::NewL(fs); + CleanupStack::PushL(fm); + + //Clear any files in the persist directory + CleanupCDriveL(); + + //First Testuid=KTestRepositoryUid + KCurrentTestUid=KTestRepositoryUid; + + DoOOMTestL(&CenrepSrvOOMTest::GetL,_L("Get Basic Test"),EFalse); + DoOOMTestL(&CenrepSrvOOMTest::FindL,_L("FindL Basic Test"),EFalse); + DoOOMTestL(&CenrepSrvOOMTest::NotifyL,_L("NotifyL Basic Test"),EFalse); + DoOOMTestL(&CenrepSrvOOMTest::ResetL,_L("ResetL Basic Test"),EFalse); + // Save file without timestamp + User::LeaveIfError(fm->Copy(KPersistsFile, KPersistsFileNoUpgrade)); + DoOOMTestL(&CenrepSrvOOMTest::SetL,_L("SetL Basic Test"),EFalse); + DoOOMTestL(&CenrepSrvOOMTest::CreateL,_L("CreateL Basic Test"),EFalse); + DoOOMTestL(&CenrepSrvOOMTest::DeleteL,_L("DeleteL Basic Test"),EFalse); + DoOOMTestL(&CenrepSrvOOMTest::MoveL,_L("MoveL Basic Test"),EFalse); + + //Clear any files in the persist directory + CleanupCDriveL(); + + // Simulate response to SWI rom-upgrade and downgrade events + DoOOMSwiTestL(&CenrepSwiOOMTest::UpgradeROMRev1L,_L("SwiUpgradeROMRev1L Basic Test"),EFalse); + // Save file with timestamp + User::LeaveIfError(fm->Copy(KPersistsFile, KPersistsFileUpgraded)); + DoOOMSwiTestL(&CenrepSwiOOMTest::UpgradeROMRev2L,_L("SwiUpgradeROMRev2L Basic Test"),EFalse); + DoOOMSwiTestL(&CenrepSwiOOMTest::UninstallROMUpgradeL,_L("SwiUninstallROMUpgradeL Basic Test"),EFalse); + + // Simulate response to SWI new rep install/uninstall event events + DoOOMSwiTestL(&CenrepSwiOOMTest::InstallL,_L("SwiInstallL Basic Test"),EFalse); + DoOOMSwiTestL(&CenrepSwiOOMTest::UpgradeInstallL,_L("SwiUpgradeInstallL Basic Test"),EFalse); + DoOOMSwiTestL(&CenrepSwiOOMTest::UninstallL,_L("SwiUninstallL Basic Test"),EFalse); + + // Simulate SWI events before server startup + DoOOMNoServReposL(&StartupUpgradeL, _L("Startup Upgrade Basic Test"), EFalse); + DoOOMNoServReposL(&StartupDowngradeL, _L("Startup Downgrade Basic Test"), EFalse); + DoOOMNoServReposL(&StartupUninstallL,_L("Startup Uninstall Basic Test"), EFalse); + + //OOM Test aOOMMode=ETrue + DoOOMNoServReposL(&CreateDeleteL, _L("Create Delete OOM Test"),ETrue); + DoOOMNoServReposL(&CreateDeleteCorruptL, _L("Create Delete Corrupt OOM Test"),ETrue); + DoOOMTestL(&CenrepSrvOOMTest::GetL,_L("Get OOM Test"),ETrue); + DoOOMTestL(&CenrepSrvOOMTest::FindL,_L("FindL OOM Test"),ETrue); + DoOOMTestL(&CenrepSrvOOMTest::NotifyL,_L("NotifyL OOM Test"),ETrue); + DoOOMTestL(&CenrepSrvOOMTest::ResetL,_L("ResetL OOM Test"),ETrue); + DoOOMTestL(&CenrepSrvOOMTest::SetL,_L("SetL OOM Test"),ETrue); + DoOOMTestL(&CenrepSrvOOMTest::CreateL,_L("CreateL OOM Test"),ETrue); + DoOOMTestL(&CenrepSrvOOMTest::DeleteL,_L("DeleteL OOM Test"),ETrue); + DoOOMTestL(&CenrepSrvOOMTest::MoveL,_L("MoveL OOM Test"),ETrue); + + //Clear any files in the persist directory + CleanupCDriveL(); + + DoOOMSwiTestL(&CenrepSwiOOMTest::UpgradeROMRev1L,_L("SwiUpgradeROMRev1L OOM Test"),ETrue); + DoOOMSwiTestL(&CenrepSwiOOMTest::UpgradeROMRev2L,_L("SwiUpgradeROMRev2L OOM Test"),ETrue); + DoOOMSwiTestL(&CenrepSwiOOMTest::UninstallROMUpgradeL,_L("SwiUninstallROMUpgradeL OOM Test"),ETrue); + + DoOOMSwiTestL(&CenrepSwiOOMTest::InstallL,_L("SwiInstallL OOM Test"),ETrue); + DoOOMSwiTestL(&CenrepSwiOOMTest::UpgradeInstallL,_L("SwiUpgradeInstallL OOM Test"),ETrue); + DoOOMSwiTestL(&CenrepSwiOOMTest::UninstallL,_L("SwiUninstallL OOM Test"),ETrue); + + DoOOMNoServReposL(&StartupUpgradeL, _L("Startup Upgrade OOM Test"), ETrue); + DoOOMNoServReposL(&StartupDowngradeL, _L("Startup Downgrade OOM Test"), ETrue); + DoOOMNoServReposL(&StartupUninstallL, _L("Startup Uninstall OOM Test"), ETrue); + +#ifdef SYMBIAN_CENTREP_SUPPORT_MULTIROFS + DoPersistedVersionCheckingL(); + DoOOMMultiRofsTestL(); +#endif + + // Delete files from bur dir + User::LeaveIfError(fm->Attribs(KPersistsFileNoUpgrade,0,KEntryAttReadOnly,TTime(0))); + TInt err=fs.Delete(KPersistsFileNoUpgrade); + if((err!=KErrNone)&&(err!=KErrNotFound)) + User::Leave(err); + + User::LeaveIfError(fm->Attribs(KPersistsFileUpgraded,0,KEntryAttReadOnly,TTime(0))); + err=fs.Delete(KPersistsFileUpgraded); + if((err!=KErrNone)&&(err!=KErrNotFound)) + User::Leave(err); + + + //Clear any files in the persist directory + CleanupCDriveL(); + + CleanupStack::PopAndDestroy (2); // fs and fm + } + + +LOCAL_C void MainL() + { + TheTest.Title (); + TheTest.Start (_L("OOM Cenrepserv Test")); + + CActiveScheduler* scheduler = new(ELeave)CActiveScheduler; + CActiveScheduler::Install(scheduler); + + DoOOMTestsL(); + + //Clear any files in the persist directory + CleanupCDriveL(); + + TheFs.Close (); + + delete scheduler; + + TheTest.End (); + TheTest.Close (); + } + +TInt E32Main () + { + + __UHEAP_MARK; + CTrapCleanup* cleanup = CTrapCleanup::New(); + if(!cleanup) + return KErrNoMemory; + + TRAPD(err, MainL()); + if (err != KErrNone) + User::Panic(_L("Testing failed: "), err); + + delete cleanup; + __UHEAP_MARKEND; + + return KErrNone; + }