diff -r 000000000000 -r e686773b3f54 phonebookengines/contactsmodel/tsrc/Integration/PerfFuncSuite/src/LowDiskSpaceStep.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/phonebookengines/contactsmodel/tsrc/Integration/PerfFuncSuite/src/LowDiskSpaceStep.cpp Tue Feb 02 10:12:17 2010 +0200 @@ -0,0 +1,815 @@ +// Copyright (c) 2006-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: +// + +/** + @file + @publishedAll + @released +*/ +#include +#include "CCntDbManager.h" +#include "LowDiskSpaceStep.h" +#include "PerformanceFunctionalityDefs.h" + +_LIT( KTest1, "CRUD tests" ); +_LIT( KTest2, "Database tests" ); +_LIT( KTest3, "Other Miscellaneous apis tests" ); +_LIT( KTest4, "Transaction commit failure test"); +_LIT( KTest5, "Start server while in low disk mode test"); +_LIT( KTest6, "Transaction rollback failure test"); + +_LIT( KFailCommitTransactionTest, "FailCommitTransaction" ); +_LIT( KFailRollbackTransactionTest, "FailRollbackTransaction" ); +_LIT( KStartServerTest, "StartServer" ); + +_LIT( KFileName, "c:\\anyfile.any" ); +_LIT( KCntDB, "c:anyfile.cdb" ); +_LIT( KCntDB2, "c:anyfile2.cdb" ); +_LIT( KCntDB3, "c:anyfile3.cdb" ); +_LIT( KExport1, "c:\\export1.vcard" ); + +_LIT(KCleanup, "cleanup"); +_LIT(KDiskSize, "size: %LD, free space: %LD"); +_LIT(KStars,"*******************************"); + +// how much empty space will be made available on disk, in bytes +const static TInt KMinusFull = KLowDiskThreshold - 8000; +#define KNumberOfContacts 200 + +CLowDiskSpaceStep::CLowDiskSpaceStep(CPerformanceFunctionalityTestsSuite &aParent) : CPerformanceFunctionalityBase( KNumberOfContacts, aParent ), + iExpectedError( KErrDiskFull ) + { + SetTestStepName(KLowDiskSpaceStep); + } + +#ifndef __WINSCW__ +void CLowDiskSpaceStep::CLowDiskSpaceActive::RunL() + { + const static TInt numberOfTests = iStep->iTests->Count(); + if( iStep->iNextTest >= numberOfTests )//have we run all the tests + { + CActiveScheduler::Stop(); + iStep->iNextTest = 0; + } + else + { + if( *iStep->iConfigSection == KFailCommitTransactionTest ) + { + iStep->INFO_PRINTF1(KTest4); + iStep->FailTransactionTestL( ECommitTransaction ); + iStep->iNextTest = numberOfTests;//last test + } + else if( *iStep->iConfigSection == KFailRollbackTransactionTest ) + { + iStep->INFO_PRINTF1(KTest6); + iStep->FailTransactionTestL( ERollbackTransaction ); + iStep->iNextTest = numberOfTests;//last test + } + else if( *iStep->iConfigSection == KStartServerTest ) + { + iStep->INFO_PRINTF1(KTest5); + iStep->StartServerTestL(); + iStep->iNextTest = numberOfTests;//last test + } + else + { + RArray< TBool (CLowDiskSpaceStep::*)() > &testArray = *( iStep->iTests ); + + TBool (CLowDiskSpaceStep::*testFunction)() = testArray[iStep->iNextTest++]; + + TBool testResult = ( iStep->*testFunction )(); + + iStep->TEST1( testResult, ETrue);//run the next test + } + Activate(); + } + } + +void CLowDiskSpaceStep::CLowDiskSpaceActive::DoCancel() + { + } + +TInt CLowDiskSpaceStep::CLowDiskSpaceActive::RunError(TInt aError) + { + _LIT(KActiveError, "CLowDiskSpaceStep:: Error in doTest runL: %d"); + iStep->ERR_PRINTF2(KActiveError , aError ); + return aError; + } + +void CLowDiskSpaceStep::CLowDiskSpaceActive::Activate() + { + TRequestStatus *pS=&iStatus; + User::RequestComplete(pS,KErrNone); + SetActive(); + } +#endif + +TVerdict CLowDiskSpaceStep::doTestStepPostambleL() + { +#ifndef __WINSCW__ + CLEAR( iMyActive ); + if( iFile ) + { + iFile->Close(); + CLEAR(iFile); + } + if( iTests ) + { + iTests->Close(); + CLEAR(iTests); + } +#endif + return CPerformanceFunctionalityBase::doTestStepPostambleL(); + } + +#ifndef __WINSCW__ +void CLowDiskSpaceStep::InitializeL() + { + CPerformanceFunctionalityBase::InitializeL(); + iGroup = iContactsDatabase->CreateContactGroupL(); + iCustomTemplate = iContactsDatabase->CreateContactCardTemplateL(KCntDB); + iGroupedContact = iIterate->NextL(); + iContactsDatabase->AddContactToGroupL( iGroupedContact, iGroup->Id() ); + } + +void CLowDiskSpaceStep::Cleanup() + { + CLEAR( iGroup ); + CLEAR( iCustomTemplate ); + CPerformanceFunctionalityBase::Cleanup(); + } +#endif + +void CLowDiskSpaceStep::PreTestL() + { +#ifndef __WINSCW__ + iConfigSection = &ConfigSection(); + iMyActive = new (ELeave) CLowDiskSpaceStep::CLowDiskSpaceActive( this ); + iCleanup = (KCleanup() == *iConfigSection); + + User::LeaveIfError( iParent->Fs().Connect() ); + iFile = new(ELeave) RFile(); + + //create the necessary database files if we are not in cleanup mode + if(!iCleanup) + { + iTests = new(ELeave) RArray< TBool (CLowDiskSpaceStep::*)() >(); + + CContactDatabase *cdb = NULL; + cdb = CContactDatabase::ReplaceL( KCntDB2 ); + CLEAR(cdb); + cdb = CContactDatabase::ReplaceL( KCntDB3 ); + CLEAR(cdb); + InitializeL(); + + iIterate->Reset(); + TInt j = 0; + for(; j < iContacts; ++j) + { + OpenL(iIterate->NextL()); + SetAllFieldsL( GetFieldL(KStringFields, KField, 2) ); + CommitL(EFalse); + } + iIterate->Reset(); + ExportVcardL(EFalse, KExport1); + Cleanup(); + //populates array of tests, that will be executed sequentially by the CLowDiskSpaceActive::runl() + iTests->AppendL( &CLowDiskSpaceStep::StartLowDiskModeL ); + iTests->AppendL( &CLowDiskSpaceStep::CrudTestL ); + iTests->AppendL( &CLowDiskSpaceStep::MiscDbTestsL ); + iTests->AppendL( &CLowDiskSpaceStep::DatabaseTestsL ); + iTests->AppendL( &CLowDiskSpaceStep::StartHighdiskModeL ); + iTests->AppendL( &CLowDiskSpaceStep::CrudTestL ); + iTests->AppendL( &CLowDiskSpaceStep::MiscDbTestsL ); + iTests->AppendL( &CLowDiskSpaceStep::DatabaseTestsL ); + } +#endif + } + +TVerdict CLowDiskSpaceStep::doTestStepL() + { +#ifndef __WINSCW__ + if(iCleanup) + { + ClearDiskL(); + } + else + { + __UHEAP_MARK; + InitializeL(); + _LIT(KLowdiskStep,"CLowDiskSpaceStep::doTestStepL()"); + INFO_PRINTF1(KLowdiskStep); //Block start + CActiveScheduler::Add(iMyActive); + iMyActive->Activate(); + CActiveScheduler::Start(); + Cleanup(); + __UHEAP_MARKEND; + } +#endif + return TestStepResult(); + } + +#ifndef __WINSCW__ +/** +populates the disk so that only a very small amount of disk space is available, +invoking low disk notification within cntsrv +*/ +void CLowDiskSpaceStep::FillDiskL() + { + TVolumeInfo tv; + User::LeaveIfError( iParent->Fs().Volume(tv) ); + + INFO_PRINTF3(KDiskSize, tv.iSize, tv.iFree); + TInt frees = 0; + iManyFiles = static_cast(tv.iFree / KMaxTInt); + + _LIT(KTestNumberOfFiles, "Test will create %d full sized empty files"); + INFO_PRINTF2(KTestNumberOfFiles, iManyFiles ); + + if ( ( tv.iFree - KMinusFull ) > KMaxTInt ) + { + TPtrC tname( KFileName ); + TInt i = 0; + for( ; i < iManyFiles; ++i )//create imanyfile maxsized empty files, until no more can be created + { + HBufC *fval=HBufC::NewLC( tname.Length()+4 );//assume #files < 10000 + TPtr fptr = fval->Des() ; + fptr.Append( tname ); + fptr.AppendNum( i ); + + User::LeaveIfError( iFile->Replace( iParent->Fs(), fptr, EFileWrite ) ); + User::LeaveIfError( iFile->SetSize( KMaxTInt - KMinusFull) ); + iFile->Close(); + + CleanupStack::PopAndDestroy( fval ); + } + User::LeaveIfError( iParent->Fs().Volume(tv) ); + + INFO_PRINTF3(KDiskSize, tv.iSize, tv.iFree); + //check to see if there is still significant free space and create empty file to leave no empty space + frees = static_cast( tv.iFree - KMinusFull ); + if( frees <= 0 ) + { + frees = static_cast( tv.iFree ); + } + User::LeaveIfError( iFile->Replace( iParent->Fs(), KFileName, EFileWrite ) ); + User::LeaveIfError( iFile->SetSize( frees ) ); + iFile->Close(); + } + else + { + frees = static_cast( tv.iFree - KMinusFull ); + if( frees <= 0 ) + { + frees = static_cast( tv.iFree ); + } + User::LeaveIfError( iFile->Replace( iParent->Fs(), KFileName, EFileWrite ) ); + _LIT(KSingleFileSize,"Size of lone file %d"); + INFO_PRINTF2(KSingleFileSize, frees ); + User::LeaveIfError( iFile->SetSize( frees ) ); + iFile->Close(); + } + + User::LeaveIfError( iParent->Fs().Volume(tv) ); + + INFO_PRINTF3(KDiskSize, tv.iSize, tv.iFree); + } + + +/** +deletes all empty files and databses created for this test +*/ +void CLowDiskSpaceStep::ClearDiskL() + { + TPtrC tname( KFileName ); + TInt err = KErrNone; + + TInt i = 0; + for(i = 0 ; KErrNotFound != err ; ++i ) + { + HBufC *fval=HBufC::NewLC( tname.Length()+4 );//assume #files < 10000 + TPtr fptr=fval->Des(); + fptr.Append( tname ); + fptr.AppendNum( i ); + err = iParent->Fs().Delete( fptr ); + if( KErrNone != err && KErrNotFound != err ) + { + User::Leave( err ); + } + + CleanupStack::PopAndDestroy( fval ); + } + err = iParent->Fs().Delete( KFileName ); + err |= iParent->Fs().Delete( KExport1 ); + + TRAPD(err2, CContactDatabase::DeleteDatabaseL( KCntDB2 ) ); + err |= err2; + TRAP( err2, CContactDatabase::DeleteDatabaseL( KCntDB3 ) ); + err |= err2; + + if( err != KErrNone && err != KErrNotFound ) + { + User::Leave( err ); + } + } + +/** +delete an empty file so that we are no longer in lowdisk mode +*/ +void CLowDiskSpaceStep::HighDiskModeL() + { + TInt err = iParent->Fs().Delete( KFileName ); + if( KErrNotFound == err ) + { + TPtrC tname( KFileName ); + HBufC *fval=HBufC::NewLC( tname.Length()+4 );//assume #files < 10000 + TPtr fptr=fval->Des(); + fptr.Append( tname ); + fptr.AppendNum( iManyFiles-1 ); + err |= iParent->Fs().Delete( fptr ); + CleanupStack::PopAndDestroy( fval ); + } + + if( err != KErrNone && err != KErrNotFound ) + { + User::Leave( err ); + } + iExpectedError = KErrNone; + CContactDatabase *cdb = NULL; + cdb = CContactDatabase::ReplaceL( KCntDB2 ); + CLEAR(cdb); + cdb = CContactDatabase::ReplaceL( KCntDB3 ); + CLEAR(cdb); + + TVolumeInfo tv; + User::LeaveIfError( iParent->Fs().Volume(tv) ); + INFO_PRINTF3(KDiskSize, tv.iSize, tv.iFree); + } + +/** +increase size of last empty file so that we reach diskfull mode again +*/ +void CLowDiskSpaceStep::RefillL() + { + TVolumeInfo tv; + User::LeaveIfError( iParent->Fs().Volume(tv) ); + + //if not in lowdisk mode or disk is full, return + if( ( KErrDiskFull != iExpectedError ) || tv.iFree <= KMinusFull) + { + return; + } + TInt err = iFile->Open( iParent->Fs(), KFileName, EFileWrite ); + if( KErrNotFound == err ) + { + TPtrC tname( KFileName ); + HBufC *fval=HBufC::NewLC( tname.Length()+4 );//assume #files < 10000 + TPtr fptr=fval->Des(); + fptr.Append( tname ); + fptr.AppendNum( iManyFiles-1 ); + err |= iFile->Open( iParent->Fs(), fptr, EFileWrite ); + CleanupStack::PopAndDestroy( fval ); + } + if( err != KErrNone && err != KErrNotFound ) + { + User::Leave( err ); + } + TInt oldsize = 0; + User::LeaveIfError( iFile->Size( oldsize ) ); + TInt newsize = oldsize + static_cast(tv.iFree - KMinusFull); + User::LeaveIfError( iFile->SetSize( newsize ) ); + iFile->Close(); + + User::LeaveIfError( iParent->Fs().Volume(tv) ); + INFO_PRINTF3(KDiskSize, tv.iSize, tv.iFree); + } + +void CLowDiskSpaceStep::PrintFail( const TDesC &aFunc, const TBool aRet, const TInt aErr ) + { + _LIT(KFail,"Lowdisk test for %S Api has failed with following error: %d"); + if(!aRet && !iErrorPrinted) + { + INFO_PRINTF3(KFail, &aFunc, aErr); + iErrorPrinted = ETrue; + } + } + +TBool CLowDiskSpaceStep::CrudTestL() + { + INFO_PRINTF1(KTest1); + iErrorPrinted = EFalse; + TBool ret = EFalse; + TInt err = KErrNone; + CContactItem *item = NULL; + + + RefillL(); + CContactCard* contact = CContactCard::NewLC(iTemplate); + TRAP( err, iContactsDatabase->AddNewContactL(*contact) ); + CleanupStack::PopAndDestroy(contact); + ret = ( iExpectedError == err ); + _LIT(KAddNewContact,"AddNewContactL"); + PrintFail(KAddNewContact, ret, err ); + + RefillL(); + TRAP( err, item = iContactsDatabase->OpenContactL( iIterate->NextL() ) ); + if( item ) + { + CleanupStack::PushL( item ); + } + ret = ret && ( KErrNone == err ); + _LIT(KOpenContactL,"OpenContactL"); + PrintFail(KOpenContactL, ret, err ); + + if( NULL != item ) + { + RefillL(); + TRAP( err, iContactsDatabase->CommitContactL( *item ) ); + ret = ret && ( iExpectedError == err ); + CleanupStack::PopAndDestroy( item ); + item = NULL; + _LIT(KCommitContact,"CommitContactL"); + PrintFail(KCommitContact, ret, err ); + } + + RefillL(); + TRAP( err, item = iContactsDatabase->ReadContactL( iIterate->NextL() ) ); + if( item ) + { + CleanupStack::PushL( item ); + } + ret = ret && ( KErrNone == err ); + _LIT(KReadContact,"ReadContactL"); + PrintFail(KReadContact, ret, err ); + + + if( NULL != item ) + { + RefillL(); + TRAP( err, + iContactsDatabase->UpdateContactLC( iIterate->CurrentL(), item ); + CleanupStack::PopAndDestroy() ); + ret = ret && ( iExpectedError == err ); + CleanupStack::PopAndDestroy( item ); + item = NULL; + _LIT(KUpdateContact,"UpdateContactLC"); + PrintFail(KUpdateContact, ret, err ); + } + + RefillL(); + TRAP( err, iContactsDatabase->DeleteContactL( iIterate->NextL() ) ); +#ifdef __SYMBIAN_CNTMODEL_USE_SQLITE__ // Should always be able to delete (even in low disk) on 9.5 through SQLite + ret = ret && ( KErrNone == err ); +#else + ret = ret && ( iExpectedError == err ); +#endif + _LIT(KDeleteContact,"DeleteContactL"); + PrintFail(KDeleteContact, ret, err ); + if( KErrNone == err ) + { + iIterate->RemoveL( iIterate->CurrentL() ); + --iContacts; + } + + return ret; + } + +TBool CLowDiskSpaceStep::DatabaseTestsL() + { + INFO_PRINTF1(KTest2); + iErrorPrinted = EFalse; + TBool ret = EFalse; + TInt err = KErrNone; + CContactDatabase *cdb = NULL; + + RefillL(); + CLEAR( iContactsDatabase ); + TRAP( err, iContactsDatabase = CContactDatabase::OpenL() ); + ret = ( KErrNone == err ); + _LIT(KOpenDB,"OpenL"); + PrintFail(KOpenDB, ret, err ); + + RefillL(); + TRAP( err, cdb = CContactDatabase::ReplaceL( KCntDB ) ); + ret = ret && ( KErrNone == err ); + _LIT(KReplaceDB,"ReplaceL"); + PrintFail(KReplaceDB, ret, err ); + CLEAR( cdb ); + + RefillL(); + TRAP( err, CContactDatabase::DeleteDatabaseL( KCntDB ) ); + ret = ret && ( KErrNone == err ); + _LIT(KDeleteDB,"DeleteDatabaseL"); + PrintFail(KDeleteDB, ret, err ); + + RefillL(); + TRAP( err, iContactsDatabase->RecoverL() ); + ret = ret && ( KErrNone == err ); + _LIT(KRecoverDB,"RecoverL"); + PrintFail(KRecoverDB, ret, err ); + + RefillL(); + TRAP( err, iContactsDatabase->CompactL() ); + ret = ret && ( KErrNone == err ); + _LIT(KCompactDB,"CompactL"); + PrintFail(KCompactDB, ret, err ); + RefillL(); + + return ret; + } + + +TBool CLowDiskSpaceStep::MiscDbTestsL() + { + INFO_PRINTF1(KTest3); + iErrorPrinted = EFalse; + TBool ret = EFalse; + TInt err = KErrNone; + + RefillL(); + TRAP( err, iContactsDatabase->DatabaseBeginL(EFalse) ); + ret = ( iExpectedError == err ); + _LIT(KTransactionStart,"DatabaseBeginL"); + PrintFail(KTransactionStart, ret, err ); + + if( KErrNone == err) + { + iContactsDatabase->DatabaseCommitL( EFalse ); + } + RefillL(); + TRAP( err, + CDesCArray *array = CContactDatabase::ListDatabasesL(); + delete array; + ); + ret = ret && ( KErrNone == err ); + _LIT(KListDBs,"ListDatabasesL"); + PrintFail(KListDBs, ret, err ); + + RefillL(); + TRAP( err, CContactDatabase::ContactDatabaseExistsL(KCntDB2) ); + ret = ret && ( KErrNone == err ); + _LIT(KDatabaseExists,"ContactDatabaseExistsL"); + PrintFail(KDatabaseExists, ret, err ); + + RefillL(); + TRAP( err, + CContactItem *array = iContactsDatabase->CreateContactGroupL(); + delete array; + ); + ret = ret && ( iExpectedError == err ); + _LIT(KCreateContactGroup,"CreateContactGroupL"); + PrintFail(KCreateContactGroup, ret, err ); + TRAP( err, + CContactItem *array = iContactsDatabase->CreateContactCardTemplateL(KCntDB2); + delete array; + ); + ret = ret && ( iExpectedError == err ); + _LIT(KCreateContactCardTemplate2,"CreateContactCardTemplateL DB2"); + PrintFail(KCreateContactCardTemplate2, ret, err ); + + TContactItemId contactId = iIterate->NextL(); + OpenL( contactId ); + + RefillL(); + TRAP( err, + CContactItem *array = iContactsDatabase->CreateContactCardTemplateL(iContactItem, KCntDB3); + delete array; + ); + ret = ret && ( iExpectedError == err ); + _LIT(KCreateContactCardTemplate3,"CreateContactCardTemplateL DB3"); + PrintFail(KCreateContactCardTemplate3, ret, err ); + RefillL(); + + TInt fieldId=iFields->Find(KUidContactFieldPhoneNumber); + if( KErrNone == iExpectedError ) + { + // if this is not set, speeddial cant be set + TRAP(err, + SetFieldL(fieldId,GetFieldL(KStringFields, KField, 1)); + CommitL(EFalse); + OpenL(contactId); + ); + if( err ) + { + _LIT(KSpeedDialError,"setting speed dial filed in contact fails with %d error"); + INFO_PRINTF2(KSpeedDialError, err); + } + } + TRAP( err, iContactsDatabase->SetFieldAsSpeedDialL(*iContactItem, fieldId, 1) ); + ret = ret && ( iExpectedError == err ); + _LIT(KSetFieldAsSpeedDial,"SetFieldAsSpeedDialL"); + PrintFail(KSetFieldAsSpeedDial, ret, err ); + + RefillL(); + TRAP( err, iContactsDatabase->SetOwnCardL( *iContactItem ) ); + ret = ret && ( iExpectedError == err ); + _LIT(KSetOwnCard,"SetOwnCardL"); + PrintFail(KSetOwnCard, ret, err ); + CloseL( ETrue ); + //this doesnt leave... it should though... why does it leave with -1(trapped internally)? + RefillL(); + TRAP( err, iContactsDatabase->SetCurrentItem( iIterate->NextL() ) ); + ret = ret && ( KErrNone == err ); + _LIT(KSetCurrentItem,"SetCurrentItem"); + PrintFail(KSetCurrentItem, ret, err ); + RefillL(); + TRAP( err, iContactsDatabase->SetPrefTemplateL( *iCustomTemplate ) ); + ret = ret && ( iExpectedError == err ); + _LIT(KSetPrefTemplate,"SetPrefTemplateL"); + PrintFail(KSetPrefTemplate, ret, err ); + RefillL(); + TRAP( err, + CContactItem *array = iContactsDatabase->CreateOwnCardL(); + delete array; + ); + ret = ret && ( iExpectedError == err ); + _LIT(KCreateOwnCard,"CreateOwnCardL"); + PrintFail(KCreateOwnCard, ret, err ); + RefillL(); + TRAP( err, CContactDatabase::RecreateSystemTemplateL( KCntDB2 ) ); + ret = ret && ( iExpectedError == err ); + _LIT(KRecreateSystemTemplate,"RecreateSystemTemplateL"); + PrintFail(KRecreateSystemTemplate, ret, err ); + RefillL(); + TRAP( err, iContactsDatabase->AddContactToGroupL( iIterate->CurrentL(), iGroup->Id() ) ); + ret = ret && ( iExpectedError == err ); + _LIT(KAddContactToGroup,"AddContactToGroupL"); + PrintFail(KAddContactToGroup, ret, err ); + RefillL(); + TRAP( err, iContactsDatabase->RemoveContactFromGroupL( iGroupedContact, iGroup->Id() ) ); + ret = ret && ( iExpectedError == err ); + _LIT(KRemoveContactFromGroup,"RemoveContactFromGroupL"); + PrintFail(KRemoveContactFromGroup, ret, err ); + + RefillL(); + RFileReadStream rfrs; + CleanupClosePushL( rfrs ); + User::LeaveIfError( rfrs.Open( iParent->Fs(), KExport1, EFileRead | EFileShareAny ) ); + TRAP( err, ImportVcardL(iContacts+10, rfrs); ); + CleanupStack::PopAndDestroy(&rfrs); + if(err != KErrNoMemory) + { + ret = ret && ( iExpectedError == err ); + _LIT(KImportVcard,"ImportVcardL"); + PrintFail(KImportVcard, ret, err ); + } + + return ret; + } + + +/** +start transaction +add new contacts +transition to lowdisk mode +add new contact +commit/rollback transactions +check that commit was successful +check that only initial batch of/no contact were added to the database +*/ +void CLowDiskSpaceStep::FailTransactionTestL( const TTransactionType aTransactionType ) + { + const TInt KInitialContacts = 2; + const TInt KFullContacts = 5; + + TInt error = KErrNone; + iContacts = 0; + CPerformanceFunctionalityBase::InitializeL(); + + //start transaction + iContactsDatabase->DatabaseBeginLC(EFalse); + + iContacts = KInitialContacts; + TInt k = 0; + CContactCard* contact = CContactCard::NewLC(iTemplate); + //add empty contacts + for(; k < iContacts; k++) + { + iIterate->AddL( iContactsDatabase->doAddNewContactL(*contact,EFalse,ETrue) ); + } + + //transition to low disk mode + StartLowDiskModeL(); + iContacts = KFullContacts; + + //confirm that you can't add new contact in low disk mode + for(; k < iContacts; k++) + { + TRAP( error, + iIterate->AddL( iContactsDatabase->doAddNewContactL(*contact,EFalse,ETrue) ); + ); + TESTPRINTI( KErrDiskFull == error, k); + } + + CleanupStack::PopAndDestroy(contact); + + if( aTransactionType == ERollbackTransaction ) + { + //rollback transaction + TRAP( error, iContactsDatabase->DatabaseRollback() ); + //rollback transaction was succusseful in lowdisk mode + TESTPRINT( KErrNone == error ); + } + else + { + //commit transaction + TRAP( error, iContactsDatabase->DatabaseCommitL(EFalse) ); + //commit transaction was succusseful in lowdisk mode + TESTPRINT( KErrNone == error ); + } + + CleanupStack::Pop();//DatabaseBeginLC + + + //transition out of low disk mode + StartHighdiskModeL(); + + iIterate->Reset(); + + + if( aTransactionType == ERollbackTransaction ) + { + //confirm that no contacts were added to the database + TESTPRINT( ( iContactsDatabase->CountL() == 0 ) ); + //inital contact ids were added to local iterator but were not commited to the database + TESTPRINT( ( iIterate->Count() == KInitialContacts ) ); + } + else + { + //confirm that only initial contacts were added to the database + TESTPRINT( ( iContactsDatabase->CountL() == KInitialContacts ) ); + TESTPRINT( ( iIterate->Count() == KInitialContacts ) ); + } + } + +/** +close session to server +wait for server to close +transition to low disk mode +open new session +check that new session was opened successfully, or that the call failed KErrDiskFull +(Although the Contacts model does not itself leave with KErrDiskFull in this circumstance +the call to OpenL and ReplaceL on DBMS and SQLite can leave with these error codes +in some full disk states). +*/ +void CLowDiskSpaceStep::StartServerTestL() + { + //close database session + CLEAR( iContactsDatabase ); + iIterate->Clear(); + //wait for server to close + WaitForServerToExitL(); + //transition to low disk mode + StartLowDiskModeL(); + //open new session to server and open defualt database + TRAPD( error, iContactsDatabase = CContactDatabase::OpenL() ); + TESTPRINT( error == KErrNone || error == KErrDiskFull ); + //close database session + CLEAR( iContactsDatabase ); + //wait for server to close + WaitForServerToExitL(); + //open new session to server and replace defualt database + TRAP( error, iContactsDatabase = CContactDatabase::ReplaceL() ); + TESTPRINT( error == KErrNone || error == KErrDiskFull); + //transition out of low disk state + StartHighdiskModeL(); + } + +/** +Transition out of lowdisk mode +*/ +TBool CLowDiskSpaceStep::StartHighdiskModeL() + { + _LIT(KHighDiskMode,"Switch to testing high disk mode"); + INFO_PRINTF1(KStars); + INFO_PRINTF1(KHighDiskMode); + INFO_PRINTF1(KStars); + HighDiskModeL(); + return ETrue; + } + +/** +Transition into lowdisk mode +*/ +TBool CLowDiskSpaceStep::StartLowDiskModeL() + { + _LIT(KLowDiskMode,"Testing low disk mode"); + INFO_PRINTF1(KStars); + INFO_PRINTF1(KLowDiskMode); + INFO_PRINTF1(KStars); + FillDiskL(); + return ETrue; + } +#endif