--- /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 <e32math.h>
+#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<TInt>(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<TInt>( tv.iFree - KMinusFull );
+ if( frees <= 0 )
+ {
+ frees = static_cast<TInt>( tv.iFree );
+ }
+ User::LeaveIfError( iFile->Replace( iParent->Fs(), KFileName, EFileWrite ) );
+ User::LeaveIfError( iFile->SetSize( frees ) );
+ iFile->Close();
+ }
+ else
+ {
+ frees = static_cast<TInt>( tv.iFree - KMinusFull );
+ if( frees <= 0 )
+ {
+ frees = static_cast<TInt>( 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<TInt>(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