phonebookengines/contactsmodel/tsrc/t_speeddialtest.cpp
changeset 0 e686773b3f54
child 24 0ba2181d7c28
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/phonebookengines/contactsmodel/tsrc/t_speeddialtest.cpp	Tue Feb 02 10:12:17 2010 +0200
@@ -0,0 +1,710 @@
+// Copyright (c) 2000-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 <e32std.h>
+#include <e32test.h>
+#include <cntdb.h>
+#include <cntitem.h>
+#include <cntfldst.h>
+#include <cntview.h>
+#include "t_utils2.h"
+#include <coreappstest/testserver.h>
+#include "t_speeddialtest.h"
+
+//
+// Constants.
+//
+_LIT(KTestName,"T_SpeedDialTest");
+
+// Configure database locations
+_LIT(KDbFileName,"c:t_speeddialtest.cdb");
+_LIT(KLongNumSpeedDialDbName, "c:LongNumSpeedDialDb.cdb");
+
+// Configure .ini file location
+_LIT(KContactsModelIniFile,"C:\\private\\10003A73\\CntModel.ini");
+
+
+const TInt KNumSmsContacts=5;
+const TInt KSpeedDialPositionOne = 1;
+const TInt KSpeedDialPositionTwo  = 2;
+const TInt KSpeedDialContact = 3;
+const TInt KSpeedDialContactA = 4;
+const TInt KSpeedDialContactB = 5;
+
+
+//
+// Global Data
+//
+RTest g_test( KTestName );
+
+//
+// Class CLockServerTester Implementation
+//
+
+CLockServerTester* CLockServerTester::NewL()
+	{
+	CLockServerTester* self=new(ELeave) CLockServerTester();
+	CleanupStack::PushL(self);
+	self->ConstructL();
+	CleanupStack::Pop();
+	return self;
+	}
+ 
+CLockServerTester::~CLockServerTester()
+ 	{
+ 	DeleteProcess();
+ 	}
+ 
+CLockServerTester::CLockServerTester()
+ 	{
+ 	}
+ 	
+void CLockServerTester::ConstructL()
+ 	{
+ 	}
+ 
+void CLockServerTester::FindServerAndKillItL()
+ 	{
+ 	SetupProcessL();
+ 	OpenAndKillProcess();
+ 	}
+ 	
+void CLockServerTester::OpenAndKillProcess()
+	{
+	iProcess.iExecution->Open(iProcessFullName);
+	iProcess.iExecution->Kill(KErrNone);
+	}
+
+void CLockServerTester::SetupProcessL()
+	{
+	iProcess.iFind = new (ELeave) TFindProcess(_L("cntsrv*"));
+	iProcess.iExecution = new (ELeave) RProcess();
+	iProcess.iFind->Next(iProcessFullName);
+	}
+
+void CLockServerTester::DeleteProcess()
+	{
+	delete iProcess.iFind;
+	if (iProcess.iExecution != NULL) iProcess.iExecution->Close();
+	delete iProcess.iExecution;
+   
+	iProcess.iFind = NULL;
+	iProcess.iExecution = NULL;
+	}
+
+//
+// Function Implementation
+//
+TBool ContactIsASpeedDial(const CContactItem& aItem)
+	{
+	TBool retval = EFalse;
+	CContactItemFieldSet& fields = aItem.CardFields();
+	const TInt max = fields.Count();
+	TInt counter = 0;
+
+	for (counter = 0; counter < max; counter++)
+		{
+		retval = fields[counter].IsSpeedDial();
+		if (retval) break;
+		}
+
+	return retval;
+	}
+	
+
+TBool ContactIsASpeedDialL(TInt aContactId, CContactDatabase& aDatabase)
+    {
+    CContactItem* item = NULL;
+    TBool result = EFalse;
+    
+    item = aDatabase.OpenContactL(aContactId);
+    CleanupStack::PushL(item);
+    
+    const CContactItemFieldSet& fields = item->CardFields();
+    const TInt count = fields.Count();
+    
+    for (TInt index = 0; index < count; ++index)
+        {
+        if (fields[index].IsSpeedDial())
+            {
+            result = ETrue;
+            break;
+            }
+        }
+    aDatabase.CloseContactL(aContactId);        
+       
+    CleanupStack::PopAndDestroy(item);        
+    return result;    
+    }
+
+
+TInt DeleteIniFile()
+	{
+	TInt retval = KErrNone;
+	//TInt deleteSuccess;
+
+	// Delete any existing ini file so that we can be sure this test is ok
+
+    RPIMTestServer serv;
+    User::LeaveIfError(serv.Connect());
+    
+    TRAPD (deleteSuccess, serv.DeleteFileL(KContactsModelIniFile));
+    
+    if ( deleteSuccess != KErrNotFound && deleteSuccess != KErrNone )
+    {
+		  retval = deleteSuccess;
+	}
+		
+	return retval;
+	}
+
+void AddContactsL(CRandomContactGenerator& aGenerator)
+	{
+	TInt ii;
+	for (ii=0;ii<KNumSmsContacts;ii++)
+		{
+		TInt bit=0;
+		bit |= CContactDatabase::ESmsable;
+		aGenerator.AddTypicalContactForFilterL(bit);
+		}
+	}
+
+CContactDatabase* ReplaceDatabaseAndCreateContactsLC()
+	{
+	CContactDatabase* database = CContactDatabase::ReplaceL(KDbFileName);
+	CleanupStack::PushL(database);
+
+	CreateContactsL(*database);
+
+	return database;
+	}
+
+void CreateContactsL(CContactDatabase& aDb)
+	{
+	CRandomContactGenerator* generator = CRandomContactGenerator::NewL();
+	CleanupStack::PushL( generator );
+	generator->SetDbL(aDb);
+	AddContactsL(*generator);
+	CleanupStack::PopAndDestroy( generator );
+	}
+
+CContactDatabase* SetupLC()
+	{
+	User::LeaveIfError( DeleteIniFile() );
+	return ReplaceDatabaseAndCreateContactsLC();
+	}
+
+
+void AssignSpeedDialL( TInt aContact, TInt aSpeedDialID, CContactDatabase& database )
+	{
+	CContactItem* item = NULL;
+	item = database.OpenContactL( aContact );
+	
+	CleanupStack::PushL( item );
+
+	if ( ContactIsASpeedDial( *item ) )
+		{
+		g_test.Printf( _L("Contact is a speed dial !!! \n") );
+		}
+	else
+		{
+		g_test.Printf( _L("Contact is NOT A SPEED DIAL \n") );
+		}
+
+	CContactItemFieldSet &fieldSet = item->CardFields();
+    for(TInt index = fieldSet.Count() - 1; index > 0; --index)
+        {
+        if(fieldSet[index].StorageType() == KStorageTypeText)
+            {
+            //set the last text field from the fieldset as speeddial field.
+        	database.SetFieldAsSpeedDialL(*item, index, aSpeedDialID );
+            break;
+            }
+        }
+        
+	g_test.Next( _L("Contact changed to speed dial") );
+	g_test(ContactIsASpeedDial( *item ));
+
+	CleanupStack::PopAndDestroy( item );
+	}
+
+void UpdateSpeedDialL(TInt aContact, TInt aSpeedDialID, CContactDatabase& database )
+	{
+	CContactItem* item = NULL;
+	item = database.OpenContactL( aContact );
+	CleanupStack::PushL( item );
+
+	if ( ContactIsASpeedDial( *item ) )
+		{
+		g_test.Printf( _L("Contact is a speed dial !!! \n") );
+		database.SetFieldAsSpeedDialL(*item, item->Id(), aSpeedDialID );
+		}
+	else
+		{
+		g_test.Printf( _L("Contact is NOT A SPEED DIAL \n") );
+		}
+
+	CleanupStack::PopAndDestroy( item );
+	}
+		
+void RemoveSpeedDialL(TInt aContact, TInt aSpeedDialId, CContactDatabase& aDatabase)
+    {    
+    TInt error = KErrNone;
+        
+    TRAP(error, aDatabase.RemoveSpeedDialFieldL(aContact, aSpeedDialId));
+    g_test(error == KErrNone);           
+    }    
+
+void RemoveSpeedDialWhenOpenL(TInt aContact, TInt aSpeedDialID, CContactDatabase& aDatabase)
+	{
+	CContactItem* card1 = 0;
+	TInt error = KErrNone;
+
+	// First open the contact, which locks it:
+	card1 = aDatabase.OpenContactL(aContact);
+	CleanupStack::PushL(card1);
+
+	// Now attempt to open the contact (must fail with in use):
+	error = KErrNone;
+	TRAP(error, aDatabase.OpenContactL(aContact));
+	g_test(error == KErrInUse);
+
+	// Now remove the speed dial on that contact (must fail with in use):
+	error = KErrNone;
+	TRAP(error, aDatabase.RemoveSpeedDialFieldL(aContact, aSpeedDialID));
+	g_test(error == KErrInUse);
+	// Now remove the speed dial on that contact again (must fail with in use):
+	// Defect was application crash.
+	error = KErrNone;
+	TRAP(error, aDatabase.RemoveSpeedDialFieldL(aContact, aSpeedDialID));
+	g_test(error == KErrInUse);
+
+	// Now attempt to open the contact (must fail with in use):
+	// Defect was fails with wrong error/no error.
+	error = KErrNone;
+	TRAP(error, aDatabase.OpenContactL(aContact));
+	g_test(error == KErrInUse);
+
+	// Cleanup and close:
+	CleanupStack::PopAndDestroy(card1);
+	TRAP(error, aDatabase.CloseContactL(aContact));
+	g_test(error == KErrNone);
+	}
+
+void TestDatabaseWithSpeedDialsL()
+	{
+	g_test.Next(_L("Setting up..."));
+
+	CContactDatabase* database = SetupLC();
+
+	g_test.Next(_L("First Speed dial assignment"));
+	// Assign First time ok !
+	TRAPD(error, AssignSpeedDialL( KSpeedDialContact, KSpeedDialPositionOne, *database ) );
+	g_test(error == KErrNone);
+
+	g_test.Next(_L("Second Speed dial assignment"));
+	// Assign Second time falls over !
+	TRAP(error, AssignSpeedDialL( KSpeedDialContact, KSpeedDialPositionOne, *database ) );
+	g_test(error == KErrNone);
+
+	g_test.Next(_L("Open contact, remove from speed dial, open again"));
+	// The remove from speed dial on the open contact should return KErrInUse.
+	// The second open should also return KErrInUse.
+	TRAP(error, RemoveSpeedDialWhenOpenL(KSpeedDialContact, KSpeedDialPositionOne, *database));
+	g_test(error == KErrNone);
+
+	CleanupStack::PopAndDestroy( database );
+
+	// wait until Contacts Lock Server shuts down
+	User::After(6000000);
+
+	g_test.Next( _L("Try to open db again"));
+
+	database =  CContactDatabase::OpenL(KDbFileName);
+	CleanupStack::PushL(database);
+	
+	CContactItem* item = database->ReadContactL(KSpeedDialContact);
+	CleanupStack::PushL(item);
+	
+	g_test.Next( _L("Check that Speed dial is remembered"));
+	g_test(item->Id() == KSpeedDialContact);
+	// retored item should be a SpeedDial
+	g_test(ContactIsASpeedDial( *item ));
+
+	CleanupStack::PopAndDestroy(item);
+	CleanupStack::PopAndDestroy(database);
+	}
+
+/**
+
+@SYMTestCaseID PIM-T-SPEEDDIALTEST-0001
+
+*/
+
+void TestOneL()
+	{
+	g_test.Start(_L("@SYMTestCaseID:PIM-T-SPEEDDIALTEST-0001 Create Database with Speed Dials then Delete and Create database"));
+
+	TestDatabaseWithSpeedDialsL();
+
+	g_test.Next(_L("Delete database"));
+	CContactDatabase::DeleteDatabaseL(KDbFileName);
+	
+	g_test.Next( _L("open database should fail"));
+	CContactDatabase* database = NULL;
+
+	TRAPD(openError, database =  CContactDatabase::OpenL(KDbFileName));
+	g_test(openError == KErrNotFound && database == NULL);
+	
+
+	g_test.Next( _L("create replacement database"));
+	database =  CContactDatabase::CreateL(KDbFileName);
+	CleanupStack::PushL(database);
+
+	CreateContactsL(*database);
+
+	CContactItem* item = database->ReadContactL(KSpeedDialContact);
+	CleanupStack::PushL(item);
+	
+	g_test.Next( _L("Check that Speed dial is forgotten"));
+	g_test(item->Id() == KSpeedDialContact);
+	// retored item should not be a SpeedDial
+	g_test(!ContactIsASpeedDial( *item ));
+
+	CleanupStack::PopAndDestroy(item);
+	CleanupStack::PopAndDestroy(database);
+
+	g_test.End();
+	}
+
+void TestTwoL()
+	{
+	g_test.Start(_L("Create Database with Speed Dials then Replace database"));
+
+	TestDatabaseWithSpeedDialsL();
+
+	g_test.Next(_L("Replace database"));
+	CContactDatabase* database = ReplaceDatabaseAndCreateContactsLC();
+
+	CContactItem* item = database->ReadContactL(KSpeedDialContact );	
+	CleanupStack::PushL(item);
+	
+	g_test.Next(_L("Check that Speed dial is forgotten"));
+	g_test(item->Id() == KSpeedDialContact);
+	// retored item should not be a SpeedDial
+	g_test(!ContactIsASpeedDial( *item ));
+
+	CleanupStack::PopAndDestroy(item);
+	CleanupStack::PopAndDestroy(database);
+
+	g_test.End();
+	}
+
+void TestThreeL()
+	{
+	g_test.Start(_L("Check that Settings are saved - normal shutdown"));
+	
+    g_test.Next(_L("Setting up..."));
+	CContactDatabase* database = SetupLC();
+
+	g_test.Next( _L("Assign Speed Dial"));
+	TInt error = KErrNone;
+	TRAP(error, AssignSpeedDialL( KSpeedDialContact, KSpeedDialPositionOne, *database ) );
+	g_test(error == KErrNone);
+	
+	g_test.Next( _L("Update Speed Dial"));
+	error = KErrNone;
+	TRAP(error, UpdateSpeedDialL( KSpeedDialContact, KSpeedDialPositionTwo, *database ) );
+	g_test(error == KErrNone);
+	
+	g_test.Next( _L("Change Database Drive"));
+	CContactDatabase::SetDatabaseDriveL(TDriveUnit(EDriveD),EFalse);
+	
+	CleanupStack::PopAndDestroy( database );
+
+	g_test.Next(_L("Wait for Contact Server to shutdown"));
+	// wait until Contacts Lock Server shuts down
+	// applicabale only in the case of transient server.
+	User::After(6000000);
+	
+	g_test.Next( _L("Try to open Database again"));
+
+	database =  CContactDatabase::OpenL(KDbFileName);
+	CleanupStack::PushL(database);
+		
+	TDriveUnit driveUnit;
+	CContactDatabase::DatabaseDrive(driveUnit);
+	g_test.Next( _L("Check that Database Drive is changed"));
+	g_test(driveUnit==TDriveUnit(EDriveD));
+	
+	CContactItem* item = database->ReadContactL(KSpeedDialContact);
+	CleanupStack::PushL(item);
+	
+	g_test.Next( _L("Check that Speed Dial is remembered"));
+	g_test(item->Id() == KSpeedDialContact);
+	// retored item should be a SpeedDial
+	g_test(ContactIsASpeedDial( *item ));
+	
+	// reset Database Drive
+	g_test.Next( _L("Reset Database Drive setting"));
+	CContactDatabase::SetDatabaseDriveL(TDriveUnit(EDriveC),EFalse);
+
+	CleanupStack::PopAndDestroy(item);
+	CleanupStack::PopAndDestroy(database);
+	
+	g_test.End();
+	}
+
+void TestFourL()
+	{
+	g_test.Start(_L("Check that Settings are saved - killing ContactLockSrv"));
+	
+    g_test.Next(_L("Setting up..."));
+	CLockServerTester* lockSrvTester = CLockServerTester::NewL();
+	CleanupStack::PushL(lockSrvTester);
+	CContactDatabase* database = SetupLC();
+	
+	g_test.Next( _L("Assign Speed Dial"));
+	TInt error = KErrNone;
+	TRAP(error, AssignSpeedDialL( KSpeedDialContact, KSpeedDialPositionOne, *database ) );
+	g_test(error == KErrNone);
+	
+	g_test.Next( _L("Update Speed Dial"));
+	error = KErrNone;
+	TRAP(error, UpdateSpeedDialL( KSpeedDialContact, KSpeedDialPositionTwo, *database ) );
+	g_test(error == KErrNone);
+	
+	g_test.Next( _L("Change Database Drive"));
+	CContactDatabase::SetDatabaseDriveL(TDriveUnit(EDriveD),EFalse);
+	
+	CleanupStack::PopAndDestroy(database);
+	
+	// Kill ContactLockServer process
+	g_test.Next( _L("Kill CntServer"));
+	lockSrvTester->FindServerAndKillItL();
+	CleanupStack::PopAndDestroy( lockSrvTester );
+
+	g_test.Next( _L("Open Database"));
+	database =  CContactDatabase::OpenL(KDbFileName);
+	CleanupStack::PushL(database);
+		
+	TDriveUnit driveUnit;
+	CContactDatabase::DatabaseDrive(driveUnit);
+	g_test.Next( _L("Check that Database Drive is changed"));
+	g_test(driveUnit==TDriveUnit(EDriveD));
+	
+	CContactItem* item = database->ReadContactL(KSpeedDialContact);
+	CleanupStack::PushL(item);
+	
+	g_test.Next( _L("Check that Speed Dial is remembered"));
+	g_test(item->Id() == KSpeedDialContact);
+	// retored item should be a SpeedDial
+	g_test(ContactIsASpeedDial( *item ));
+	
+	// reset Database Drive
+	g_test.Next( _L("Reset Database Drive setting"));
+	CContactDatabase::SetDatabaseDriveL(TDriveUnit(EDriveC),EFalse);
+
+	CleanupStack::PopAndDestroy(item);
+	CleanupStack::PopAndDestroy(database);
+	
+	g_test.End();		
+	}
+	
+	
+/**
+@SYMTestCaseID PIM-T-SPEEDDIALTEST-INC097895-0001
+@SYMTestType UT
+@SYMTestPriority High
+@SYMDEF INC097895
+@SYMTestCaseDesc Pbk2 AIW: Speed dial is removed from incorrect entry 
+ 
+@SYMTestActions
+1. Add speed dials for contact A and B
+2. Try to reset speed dial belonging to A by using B's id
+3. Reset speed dials using the correct contacts
+ 
+@SYMTestExpectedResults Speed dial is still active when reset is attempted by wrong contact
+*/	
+void TestFiveL()
+    {
+    g_test.Start(_L("@SYMTestCaseID:PIM-T-SPEEDDIALTEST-INC097895-0001 Checking that the correct contact resets the speed dial number"));
+	
+   	g_test.Next(_L("Setting up..."));
+	CContactDatabase* database = SetupLC();
+
+	g_test.Next(_L("First Speed dial assignment"));	
+	TRAPD(error, AssignSpeedDialL( KSpeedDialContactA, KSpeedDialPositionOne, *database ) );
+	g_test(error == KErrNone);
+	
+	// Check that a speed dial is assigned
+	g_test(ContactIsASpeedDialL(KSpeedDialContactA, *database));
+
+	g_test.Next(_L("Second Speed dial assignment"));	
+	TRAP(error, AssignSpeedDialL( KSpeedDialContactB, KSpeedDialPositionTwo, *database ) );
+	g_test(error == KErrNone);
+	
+	// Check that a speed dial is assigned
+	g_test(ContactIsASpeedDialL(KSpeedDialContactB, *database));
+		
+	// Here, the wrong contact (B) is trying to reset the speed dial number
+	// which is set by contact A. 
+	g_test.Next(_L("Wrong contact - should be ignored"));	
+	TRAP(error, RemoveSpeedDialL(KSpeedDialContactB, KSpeedDialPositionOne, *database));
+	g_test(error == KErrNone);
+		
+	g_test.Next(_L("The first speed dial is still active"));	
+	g_test(ContactIsASpeedDialL(KSpeedDialContactA, *database));		
+	
+	g_test.Next(_L("and the second speed dial is still active"));	
+	g_test(ContactIsASpeedDialL(KSpeedDialContactB, *database));				
+	
+	g_test.Next(_L("Reset allowed by the correct contact"));	
+	TRAP(error, RemoveSpeedDialL(KSpeedDialContactA, KSpeedDialPositionOne, *database));
+	g_test(error == KErrNone);
+	
+	g_test.Next(_L("Check speed dial One has been reset"));	
+	g_test(!ContactIsASpeedDialL(KSpeedDialContactA, *database));		
+					
+	TRAP(error, RemoveSpeedDialL(KSpeedDialContactB, KSpeedDialPositionTwo, *database));
+	g_test(error == KErrNone);
+	
+	g_test.Next(_L("Check speed dial Two has been reset"));	
+	g_test(!ContactIsASpeedDialL(KSpeedDialContactB, *database));		
+	
+	CleanupStack::PopAndDestroy(database);	
+	
+	g_test.End();		
+    }
+
+
+LOCAL_C void LongNumSpeedDialTestsL()
+    {
+	_LIT(KLongNumSpeedDialTest, "Long Phone Number Speed Dial Test");
+	g_test.Start(KLongNumSpeedDialTest);
+
+	// create default, empty database
+	CContactDatabase* db = CContactDatabase::ReplaceL(KLongNumSpeedDialDbName);
+	CleanupStack::PushL(db);
+	
+	// create a contact and add it to the db
+	CContactItem* contact = CContactCard::NewLC();
+	CContactItemField* fname = CContactItemField::NewLC(KStorageTypeText, 
+			KUidContactFieldGivenName);
+	_LIT(KFname, "James");
+	fname->TextStorage()->SetTextL(KFname() );
+	contact->AddFieldL(*fname);
+	CleanupStack::Pop(fname);
+	CContactItemField* phone = CContactItemField::NewLC(KStorageTypeText,
+			KUidContactFieldPhoneNumber);
+	_LIT(KPhoneNum,	"01234567890123456789012345678901234567890123456789012345678901234567890123456789"); // 80 chars
+	phone->TextStorage()->SetTextL(KPhoneNum() );
+	contact->AddFieldL(*phone);
+	CleanupStack::Pop(phone);
+	const TContactItemId KContactId = db->AddNewContactL(*contact);
+	CleanupStack::PopAndDestroy(contact);
+	contact = NULL;
+
+	// retrieve contact and assign its number to speed dial #1
+	contact = db->OpenContactL(KContactId);
+	CleanupStack::PushL(contact);
+	const TInt KSpeedDial1(1);
+	const TInt KPhoneNumIndex = contact->CardFields().Find(KUidContactFieldPhoneNumber);
+	db->SetFieldAsSpeedDialL(*contact, KPhoneNumIndex, KSpeedDial1);
+	TBuf<100> speedDialNumberText;
+	TContactItemId speedDialId = db->GetSpeedDialFieldL(KSpeedDial1, speedDialNumberText);
+	_LIT(KOutputFormat, "retrieved speed dial id: %d;\nretrieved speed dial phone number: ...\n%S\n");
+	g_test.Printf(KOutputFormat, speedDialId, &speedDialNumberText);
+	db->CloseContactL(KContactId);
+	
+	// cleanup
+	CleanupStack::PopAndDestroy(2, db);	// and contact
+	CContactDatabase::DeleteDatabaseL(KLongNumSpeedDialDbName);
+
+	// Since PDEF121954, long phone numbers set as speed dial are truncated to 
+	// the length of KSpeedDialPhoneLength. So, we need to get the truncated 
+	// version of the phone number for comparison with the speed dial value.
+	TPtrC phoneNum(KPhoneNum().Mid(0, KSpeedDialPhoneLength));
+	g_test(speedDialId == KContactId && speedDialNumberText.CompareC(phoneNum) == 0);
+	g_test.End();
+	g_test.Close();
+    }
+
+
+
+void DoTestL()
+	{
+	CTestRegister * TempFiles = CTestRegister::NewLC();
+	TempFiles->RegisterL(KDbFileName, EFileTypeCnt);
+	TempFiles->RegisterL(KLongNumSpeedDialDbName, EFileTypeCnt);
+	TempFiles->RegisterL(KContactsModelIniFile);
+	
+	TestOneL();
+
+	g_test.Next(_L(""));
+	TestTwoL();
+
+	// Added for DEF075241
+	g_test.Next( _L(""));
+	TestThreeL();
+
+	g_test.Next( _L(""));
+	TestFourL();
+	// End of tests for DEF075241
+		
+	// INC097895 start
+	g_test.Next(_L(""));
+	TestFiveL();
+	// INC097895 end
+
+	// PDEF121954 start
+	g_test.Next(_L(""));
+	LongNumSpeedDialTestsL();
+	// PDEF121954 end
+	
+	// Delete cntmodel.ini
+	User::LeaveIfError( DeleteIniFile() );	
+	CleanupStack::PopAndDestroy(TempFiles);
+
+	g_test.End();
+	}
+
+
+//
+// Main.
+//
+
+GLDEF_C TInt E32Main()
+	{
+	__UHEAP_MARK;
+	g_test.Start(_L("Speed dial test"));
+
+	CActiveScheduler* scheduler=new CActiveScheduler;
+	if (scheduler)
+		{
+		CActiveScheduler::Install(scheduler);
+		CTrapCleanup* cleanup=CTrapCleanup::New();
+		if (cleanup)
+			{
+			TRAPD(err,DoTestL() );
+			g_test(err == KErrNone);
+			delete cleanup;
+			}
+		delete scheduler;
+		}
+	g_test.Close();
+	__UHEAP_MARKEND;
+	return KErrNone;
+    }