phonebookengines/contactsmodel/tsrc/t_lowdiskspace.cpp
changeset 0 e686773b3f54
child 24 0ba2181d7c28
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/phonebookengines/contactsmodel/tsrc/t_lowdiskspace.cpp	Tue Feb 02 10:12:17 2010 +0200
@@ -0,0 +1,379 @@
+// 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:
+//
+
+#include <e32test.h>
+#include <cntdb.h>
+#include <cntitem.h>
+#include "t_lowdiskspace.h"
+
+#include <cntfldst.h>
+
+_LIT(KTestName, "T_LOWDISKSPACE");
+_LIT( KFileName, "c:\\anyfile.any" );
+_LIT(KDatabaseFileName,"C:T_LOWDISKSPACE");
+
+GLDEF_D RTest test(KTestName);
+
+static const TInt KMinusFull = 50000;
+static const TInt64 KLowDiskThreshold = 0x20000;
+
+const TInt KFiveHundredContactItems = 500; 
+
+CLowDiskSpaceTest* CLowDiskSpaceTest::NewL()
+	{
+	CLowDiskSpaceTest* self = new(ELeave) CLowDiskSpaceTest();
+	CleanupStack::PushL(self);
+	self->ConstructL();
+	CleanupStack::Pop(self);
+	return self;
+	}
+	
+CLowDiskSpaceTest::CLowDiskSpaceTest():CActive(EPriorityIdle), iCount(0), iManyFiles(0)
+	{
+	CActiveScheduler::Add(this);
+	}
+
+CLowDiskSpaceTest::~CLowDiskSpaceTest()
+	{
+	Cleanup();
+	}
+
+void CLowDiskSpaceTest::Cleanup()
+	{
+	TRAP_IGNORE(ClearDiskL() );
+
+	delete iContactDatabase;
+	iContactDatabase = NULL;
+	
+	iFileSession.Close();
+	iFile->Close();
+	delete iFile;
+	iFile = NULL;
+
+	TRAP_IGNORE(CContactDatabase::DeleteDatabaseL(KDatabaseFileName) );
+
+	Cancel();
+	}
+
+void CLowDiskSpaceTest::DoCancel()
+	{
+	}
+
+void CLowDiskSpaceTest::ConstructL()
+	{
+	iContactDatabase = CContactDatabase::ReplaceL(KDatabaseFileName);
+	
+	// populate the database with 500 contact items
+	for (TInt i = 0; i < KFiveHundredContactItems; ++i)
+		{
+		AddContactToDatabaseL();
+		}
+
+	User::LeaveIfError(iFileSession.Connect());
+	iFile = new(ELeave) RFile();
+	}
+
+void CLowDiskSpaceTest::AddContactToDatabaseL()
+	{
+	_LIT(KXChar, "x");
+	CContactItem* item = CContactCard::NewLC();
+	CContactItemField* field = CContactItemField::NewLC(KStorageTypeText, KUidContactFieldCompanyName);
+	field->SetMapping(KUidContactFieldVCardMapORG);
+	field->TextStorage()->SetTextL(KXChar() );
+	item->AddFieldL(*field);
+	CleanupStack::Pop(); // field
+	field = CContactItemField::NewLC(KStorageTypeText,KUidContactFieldPhoneNumber);
+	field->SetMapping(KUidContactFieldVCardMapTEL);
+	field->TextStorage()->SetTextL(KXChar() );
+	item->AddFieldL(*field);
+	CleanupStack::Pop(); // field
+	field = CContactItemField::NewLC(KStorageTypeText,KUidContactFieldPhoneNumber);
+ 	field->SetMapping(KUidContactFieldVCardMapTEL);
+	field->TextStorage()->SetTextL(KXChar() );
+	item->AddFieldL(*field);
+	CleanupStack::Pop(); // field
+	field = CContactItemField::NewLC(KStorageTypeText,KUidContactFieldPhoneNumber);
+ 	field->SetMapping(KUidContactFieldVCardMapTEL);
+	field->TextStorage()->SetTextL(KXChar() );
+	item->AddFieldL(*field);
+	CleanupStack::Pop(); // field
+	field = CContactItemField::NewLC(KStorageTypeText,KUidContactFieldPhoneNumber);
+	field->SetMapping(KUidContactFieldVCardMapTEL);
+ 	field->SetHidden(ETrue);
+	field->TextStorage()->SetTextL(KXChar() );
+	item->AddFieldL(*field);
+	CleanupStack::Pop(); // field
+	field = CContactItemField::NewLC(KStorageTypeText,KUidContactFieldSuffixName);
+	field->SetMapping(KUidContactFieldVCardMapUnusedN);
+	field->TextStorage()->SetTextL(KXChar() );
+ 	item->AddFieldL(*field);
+	CleanupStack::Pop(); // field
+	field=CContactItemField::NewLC(KStorageTypeText,KUidContactFieldPrefixName);
+	field->SetMapping(KUidContactFieldVCardMapUnusedN);
+	field->TextStorage()->SetTextL(KXChar() );
+ 	item->AddFieldL(*field);
+	CleanupStack::Pop(); // field
+
+	iContactDatabase->AddNewContactL(*item);
+	CleanupStack::PopAndDestroy(); // item
+	}
+
+
+void CLowDiskSpaceTest::Start()
+	{
+	TRequestStatus *pS=&iStatus;
+	User::RequestComplete(pS,KErrNone);
+	SetActive();
+	}
+
+void CLowDiskSpaceTest::RunL()
+	{
+	TVolumeInfo tv;
+	switch(iCount)
+		{
+	case EFillDisk:
+	FillDiskL();//Fill the disk
+	iCount++;
+	Start();
+	break;
+
+	case EDatabaseTest:
+	User::LeaveIfError( iFileSession.Volume(tv) );
+	if(tv.iFree >= KLowDiskThreshold)
+		{
+		test.Printf(_L("Free space increased, refill the disk again.\n"));
+		ClearDiskL();
+		FillDiskL();//Fill the disk
+		Start();
+		break;
+		}
+	DatabaseTestL();
+	iCount++;
+	Start();
+	break;
+
+	case EClearDisk:
+	ClearDiskL();
+	iCount++;
+	Start();
+	break;
+
+	default:
+	CActiveScheduler::Stop();
+	break;
+		}
+	}
+
+void CLowDiskSpaceTest::FillDiskL()
+	{
+	_LIT(KFillDiskTitle, "Fill the disk");
+	test.Next(KFillDiskTitle);
+
+	
+	TVolumeInfo tv;
+	User::LeaveIfError( iFileSession.Volume(tv) );
+	
+	TInt frees = 0;
+	iManyFiles = tv.iFree / KMaxTInt;
+	
+	if ( iManyFiles > 0)
+		{
+		TPtrC tname( KFileName );
+		TInt i = 0;
+		for( ; i < iManyFiles; ++i )
+			{
+			HBufC *fval=HBufC::NewLC( tname.Length()+4 );//assume #files < 10000
+			TPtr fptr = fval->Des() ;
+			fptr.Append( tname );
+			fptr.AppendNum( i );
+			
+			User::LeaveIfError( iFile->Replace( iFileSession, fptr, EFileWrite ) );
+			User::LeaveIfError( iFile->SetSize( KMaxTInt ) );
+			iFile->Close();
+			
+			CleanupStack::PopAndDestroy( fval );
+			}
+		User::LeaveIfError( iFileSession.Volume(tv) );
+		
+		frees = tv.iFree - KMinusFull ;
+		if( frees <= 0 )
+			{
+			frees = tv.iFree;
+			}
+		User::LeaveIfError( iFile->Replace( iFileSession, KFileName, EFileWrite ) );
+		
+	#ifdef __SYMBIAN_CNTMODEL_USE_SQLITE__
+		TInt err = KErrDiskFull;
+		while(err == KErrDiskFull)
+			{
+			err = iFile->SetSize(frees);
+			frees -= 100;
+			if(frees <= 0)
+				{
+				break;	
+				}
+			}
+	#else
+		User::LeaveIfError( iFile->SetSize( frees ) );
+	#endif
+	
+		iFile->Close(); 
+		}
+	else
+		{
+		frees = tv.iFree - KMinusFull ;
+		if( frees <= 0 )
+			{
+			frees = tv.iFree;
+			}
+		User::LeaveIfError( iFile->Replace( iFileSession, KFileName, EFileWrite ) );
+
+	#ifdef __SYMBIAN_CNTMODEL_USE_SQLITE__
+		TInt err = KErrDiskFull;
+		while(err == KErrDiskFull)
+			{
+			err = iFile->SetSize(frees);
+			frees -= 100;
+			if(frees <= 0)
+				{
+				break;	
+				}
+			}
+	#else
+		User::LeaveIfError( iFile->SetSize( frees ) );
+	#endif
+				
+		iFile->Close();
+		}
+	}
+
+
+void CLowDiskSpaceTest::DatabaseTestL()
+	{
+#ifndef __SYMBIAN_CNTMODEL_USE_SQLITE__
+	_LIT(KDatabaseTestTitle, "Add new contact and check whether disk is full");
+#else
+	_LIT(KDatabaseTestTitle, "Test add/delete contacts in low disk conditions");
+#endif
+
+	test.Next(KDatabaseTestTitle);
+
+	CContactCard* card=CContactCard::NewL();
+	CleanupStack::PushL(card);
+	TRAPD(ret, iContactDatabase->AddNewContactL(*card));
+	if (ret != KErrDiskFull)
+		{
+		Cleanup(); // delete files filling up disk before exiting the test
+		test(EFalse); // fail the test
+		}
+
+#ifdef __SYMBIAN_CNTMODEL_USE_SQLITE__
+
+	_LIT(KNumContactsMsg, "Number of contacts in the database: %d\n");
+	_LIT(KDeletingMsg, "Deleting contact item: %d... ");
+	_LIT(KPassMsg, " [PASS -- Contacts deleted]\n");
+	_LIT(KFailMsg, " [FAILED with err code: %d]\n");
+
+	test.Printf(KNumContactsMsg, iContactDatabase->CountL());
+	const CContactIdArray* idArray = iContactDatabase->SortedItemsL(); // don't take ownership
+	const TInt KCount = idArray->Count();
+	test(KCount == KFiveHundredContactItems); // check we have all 500 items in the database
+
+
+	iContactDatabase->DatabaseBeginLC(ETrue);
+	for (TInt i = KCount - 1; i >= 0; --i)
+		{
+		const TContactItemId KItemId = (*idArray)[i];
+		test.Printf(KDeletingMsg, KItemId);
+		TRAP(ret, iContactDatabase->DeleteContactL(KItemId) );
+		if (ret != KErrNone)
+			{
+			test.Printf(KFailMsg, ret);
+			Cleanup(); // delete files filling up disk before exiting the test		
+			test(EFalse); // fail the test
+			}
+		}	
+	iContactDatabase->DatabaseCommitLP(ETrue);
+	test.Printf(KPassMsg);
+
+#endif
+
+	CleanupStack::PopAndDestroy(card);
+	}
+
+void CLowDiskSpaceTest::ClearDiskL()
+	{
+	test.Next(_L("Clear the disk"));
+
+	
+	TPtrC tname( KFileName );
+	TInt i = 0;
+	for(i = 0 ; i < iManyFiles; ++i )
+		{
+		HBufC *fval=HBufC::NewLC( tname.Length()+4 );//assume #files < 10000
+		TPtr fptr=fval->Des();
+		fptr.Append( tname );
+		fptr.AppendNum( i );
+		TInt err = iFileSession.Delete( fptr );
+		if( err != KErrNone && err != KErrNotFound )
+			{
+			User::Leave( err );
+			}
+		
+		CleanupStack::PopAndDestroy( fval );
+		}
+	TInt err = iFileSession.Delete( KFileName );
+
+	if( err != KErrNone && err != KErrNotFound )
+		{
+		User::Leave( err );
+		}
+	}
+
+LOCAL_C void DoTestL()
+	{
+	CLowDiskSpaceTest* test = CLowDiskSpaceTest::NewL();
+	test->Start();
+	CActiveScheduler::Start();
+	delete test;
+	}
+
+/**
+
+@SYMTestCaseID     PIM-T-LOWDISKSPACE-0001
+
+*/
+
+GLDEF_C TInt E32Main()
+	{
+    __UHEAP_MARK;
+	CActiveScheduler* scheduler=new CActiveScheduler;
+	if (scheduler)
+		{
+		CActiveScheduler::Install(scheduler);
+		CTrapCleanup* cleanup=CTrapCleanup::New();
+		test.Start(_L("@SYMTESTCaseID:PIM-T-LOWDISKSPACE-0001 T_LOWDISKSPACE"));
+
+		TRAPD(r, DoTestL());
+		test(r == KErrNone);
+		test.End();
+		test.Close();
+		delete scheduler;	
+		delete cleanup;
+		}
+	__UHEAP_MARKEND;
+	return KErrNone;
+    }
+