--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/persistentstorage/centralrepository/test/t_oomcenrepsrv.cpp Fri Jan 22 11:06:30 2010 +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 <e32test.h>
+#include <f32file.h>
+#include <utf.h>
+#include "srvsess.h"
+#include "sessmgr.h"
+#include "srvres.h"
+#include "srvreqs.h"
+#include "cachemgr.h"
+#include "clientrequest.h"
+#include "install.h"
+#include <bautils.h>
+
+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<TUint32>(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<class T>
+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<class T>
+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<TKeyFilter> pSrcIdentifier(srcKeyIdentifier);
+ TKeyFilter tgtKeyIdentifier = {targetPartialId, idMask};
+ TPckg<TKeyFilter> 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<TUint32> 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<CServerRepository*>(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;
+ }