pimprotocols/phonebooksync/Test/TE_Sync/TE_Sync.cpp
changeset 0 e686773b3f54
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/pimprotocols/phonebooksync/Test/TE_Sync/TE_Sync.cpp	Tue Feb 02 10:12:17 2010 +0200
@@ -0,0 +1,1217 @@
+// Copyright (c) 2001-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:
+// Test programme for Phonebook Buffers
+// 
+//
+
+#include "TE_Sync.h"
+#include <e32std.h>
+#include <e32base.h>
+#include <e32test.h>
+#include <cntdb.h>
+#include <cntitem.h>
+#include <cntfield.h>
+#include <cntfldst.h>
+#include <etelmm.h>
+#include <c32root.h>
+#include <e32property.h>
+
+_LIT16(KTel,"1234567890");
+_LIT16(KText,"TelNo 567");
+_LIT16(KTelOverwrite,"07700900000");
+_LIT16(KTextOverwrite,"Overwrite 1");
+_LIT16(KTelNoSlot,"+442079460001");
+_LIT16(KTextNoSlot,"No slot");
+_LIT16(KTelWithLetters,"5678943Abc34");
+_LIT16(KTelExceedMax,"12345678901234567890123456789");
+_LIT16(KNameNormal,"Exceed");
+_LIT16(KTextExceedMax,"MaximName MaximName MaximName MaximName MaximName MaximName MaximName MaximName MaximName MaximName MaximName MaximName MaximName MaximName MaximName MaximName MaximName MaximName MaximName MaximName MaximName MaximName MaximName MaximName 1123");//244 long
+_LIT16(KTelNormal,"07700900002");
+_LIT16(KTelMax,"123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789");
+_LIT16(KEntryMaxName,"MaximName MaximName MaximName MaximName MaximName MaximName MaximName MaximName MaximName MaximName MaximName MaximName MaximName MaximName MaximName MaximName MaximName MaximName MaximName MaximName MaximName MaximName MaximName ");//230 long
+_LIT16(KTextMaxNum,"Max Number");
+_LIT16(KTextNonAlphabet,"(:,)=(),");
+_LIT16(KTelLookUp,"561234567890");
+_LIT16(KTextLookUp,"Look Up");
+_LIT(KInternationalPrefix,"+");
+
+#include <f32file.h>
+#include <f32ver.h>
+#include <f32dbg.h>
+#include <e32cons.h>
+#include <e32twin.h>
+
+#include <cntsync.h>
+
+
+CTestOpen::CTestOpen() 
+	{
+	SetTestStepName(_L("TestOpen"));
+	}
+
+enum TVerdict CTestOpen::doTestStepL()
+/**
+	Connection and disconnection test.
+    @return TVerdict result of running the test.
+  */
+	{
+	//
+	// Close the session...
+	//
+	iSession.Close();
+
+	//
+	// Delete PhBkSync INI file and Contacts DB...
+	//
+	ConfigurePhbkSyncToIdleL();
+
+	RFs fs;
+	User::LeaveIfError(fs.Connect()); // Connect to File server
+	CleanupClosePushL(fs);
+	_LIT(KPhbkSyncIniFile,"C:\\Private\\102030A1\\Phbksync.ini");
+	TInt err(fs.Delete(KPhbkSyncIniFile)); // Delete PhBkSync.INI file
+	TESTCHECKCONDITION(err == KErrNone  ||  err==KErrNotFound  ||  err==KErrPathNotFound); // Deleted successfully OR no default INI file
+	TRAP(err,CContactDatabase::DeleteDefaultFileL()); // Delete default ContactsDb 
+	TESTCHECKCONDITION(err == KErrNone  ||  err == KErrNotFound); // Deleted successfully OR no default ContactsDb  
+	CleanupStack::PopAndDestroy(&fs);
+
+	ConfigurePhbkSyncToFullL();
+
+	//
+	// Connect to PhBkSync Server...
+	//
+	TInt ret=iSession.Connect();
+	TESTCHECKL(ret, KErrNone);
+
+	return TestStepResult();
+	}
+
+
+CTestDoSynchronisation::CTestDoSynchronisation() 
+	{
+	SetTestStepName(_L("TestDoSynchronisation"));
+	}
+
+enum TVerdict CTestDoSynchronisation::doTestStepL()
+/**
+	Do Synchronisation test.
+    @return TVerdict result of running the test.
+  */
+	{
+	TRequestStatus status;
+	iSession.DoSynchronisation(status); // Send a Read-Contact-ICC request
+	User::WaitForRequest(status);
+	TESTCHECKL(status.Int(), KErrNone);
+
+	return TestStepResult();
+	}
+
+CTestDeleteContactFromICC::CTestDeleteContactFromICC() 
+	{
+	SetTestStepName(_L("TestDeleteContactFromICC"));
+	}
+
+enum TVerdict CTestDeleteContactFromICC::doTestStepL()
+/**
+	Delete Contact from ICC test.
+    @return TVerdict result of running the test.
+  */
+	{
+	TRequestStatus status;
+	TContactItemId id(GetValidUIDFromContactsDbL());	
+	iSession.DeleteContact(status, id); 	// Delete the contact 
+	User::WaitForRequest(status);
+	TESTCHECKL(status.Int(), KErrNone);
+	return TestStepResult();
+	}
+
+CTestDeleteContactInvalidIdFromICC::CTestDeleteContactInvalidIdFromICC() 
+	{
+	SetTestStepName(_L("TestDeleteContactInvalidIdFromICC"));
+	}
+
+enum TVerdict CTestDeleteContactInvalidIdFromICC::doTestStepL()
+/**
+	Delete Contact with invalid ID from ICC test.
+    @return TVerdict result of running the test.
+  */
+	{
+	TRequestStatus status;
+	TContactItemId id(7777);	
+	iSession.DeleteContact(status, id); 	// Delete the contact 
+	User::WaitForRequest(status);
+	TESTCHECKL(status.Int(), KErrArgument);
+	return TestStepResult();
+	}
+
+CTestValidateContact::CTestValidateContact() 
+	{
+	SetTestStepName(_L("TestValidateContact"));
+	}
+
+enum TVerdict CTestValidateContact::doTestStepL()
+/**
+	Validate Contact test.
+    @return TVerdict result of running the test.
+  */
+	{
+	TContactItemId id(GetValidUIDFromContactsDbL());
+	TInt ret(iSession.ValidateContact(MContactSynchroniser::ERead,id));
+	TESTCHECKL(ret, KErrNone);
+	id = GetValidUIDFromContactsDbL();
+	ret = iSession.ValidateContact(MContactSynchroniser::EEdit,id);
+	TESTCHECKL(ret, KErrNone);
+	id = GetValidUIDFromContactsDbL();
+	ret = iSession.ValidateContact(MContactSynchroniser::ESearch,id);
+	TESTCHECKL(ret, KErrNone);
+	return TestStepResult();
+	}
+
+CTestValidateContactAccessLockedTest::CTestValidateContactAccessLockedTest() 
+	{
+	SetTestStepName(_L("TestValidateContactAccessLockedTest"));
+	}
+
+enum TVerdict CTestValidateContactAccessLockedTest::doTestStepL()
+/**
+	Validate Contact - ICC PIN locked test.
+    @return TVerdict result of running the test.
+  */
+	{
+	TContactItemId id(GetValidUIDFromContactsDbL());
+	TInt ret(iSession.ValidateContact(MContactSynchroniser::ERead,id));
+	TESTCHECKCONDITIONL(ret == KErrAccessDenied  ||  ret == KErrNone );
+	return TestStepResult();
+	}
+
+CTestValidateContactInvalidUIDTest::CTestValidateContactInvalidUIDTest() 
+	{
+	SetTestStepName(_L("TestValidateContactInvalidUIDTest"));
+	}
+
+enum TVerdict CTestValidateContactInvalidUIDTest::doTestStepL()
+/**
+	Validate Contact - Invalid UID test.
+    @return TVerdict result of running the test.
+  */
+	{
+	TInt ret(iSession.ValidateContact(MContactSynchroniser::ERead,-1));
+	TESTCHECKL(ret, KErrNotFound);
+	ret = iSession.ValidateContact(MContactSynchroniser::EEdit,8888);
+	TESTCHECKL(ret, KErrNotFound);
+	ret = iSession.ValidateContact(MContactSynchroniser::ESearch,99999);
+	TESTCHECKL(ret, KErrNotFound);
+	return TestStepResult();
+	}
+
+CTestGetSyncMode::CTestGetSyncMode() 
+	{
+	SetTestStepName(_L("TestGetSyncMode"));
+	}
+
+enum TVerdict CTestGetSyncMode::doTestStepL()
+/**
+	Get Sync Mode test.
+    @return TVerdict result of running the test.
+  */
+	{
+	RPhoneBookSession::TPhonebookSyncMode syncMode; // Get current sync mode
+	iSession.GetSyncMode(syncMode);
+	TESTCHECKL(syncMode, RPhoneBookSession::EManual);
+	return TestStepResult();
+	}
+
+CTestSetSyncMode::CTestSetSyncMode() 
+	{
+	SetTestStepName(_L("TestSetSyncMode"));
+	}
+
+enum TVerdict CTestSetSyncMode::doTestStepL()
+/**
+	Set Sync Mode - Auto/Same/Manual test.
+    @return TVerdict result of running the test.
+  */
+	{
+	// EAutoCurrentIcc
+	RPhoneBookSession::TPhonebookSyncMode syncMode; // sync mode
+	syncMode = RPhoneBookSession::EAutoCurrentIcc;
+	iSession.SetSyncMode(syncMode);		// Set sync mode
+	syncMode = RPhoneBookSession::EManual; // reset sync mode to something else just in case
+	iSession.GetSyncMode(syncMode);
+	TESTCHECKL(syncMode, RPhoneBookSession::EAutoCurrentIcc);
+
+	// EAutoSameIcc
+	syncMode = RPhoneBookSession::EAutoSameIcc;
+	iSession.SetSyncMode(syncMode);		// Set sync mode
+	syncMode = RPhoneBookSession::EManual; // reset sync mode to something else just in case
+	iSession.GetSyncMode(syncMode);
+	TESTCHECKL(syncMode, RPhoneBookSession::EAutoSameIcc);
+
+	// EManual
+	syncMode = RPhoneBookSession::EManual;
+	iSession.SetSyncMode(syncMode);		// Set sync mode
+	syncMode = RPhoneBookSession::EAutoSameIcc; // reset sync mode to something else just in case
+	iSession.GetSyncMode(syncMode);
+	TESTCHECKL(syncMode, RPhoneBookSession::EManual);
+	return TestStepResult();
+	}
+
+CTestUpdateLookUpTableFailure::CTestUpdateLookUpTableFailure() 
+	{
+	SetTestStepName(_L("TestUpdateLookUpTableFailure"));
+	}
+
+enum TVerdict CTestUpdateLookUpTableFailure::doTestStepL()
+/**
+	Update look-up table - Failure test.
+    @return TVerdict result of running the test.
+  */
+	{
+	TContactItemId uid(100);
+	TInt slot(200);
+	TInt ret(iSession.UpdateLookuptable(uid, slot)); // Failure test cases, so make up some slot numbers
+	TESTCHECKL(ret, KErrNotFound);
+	return TestStepResult();
+	}
+
+CTestUpdateLookUpTableSuccess::CTestUpdateLookUpTableSuccess() 
+	{
+	SetTestStepName(_L("TestUpdateLookUpTableSuccess"));
+	}
+
+enum TVerdict CTestUpdateLookUpTableSuccess::doTestStepL()
+/**
+	Update look-up table - Success test.
+    @return TVerdict result of running the test.
+  */
+	{
+	// First populate the name and number fields - Synchroniser Internal Format
+	TContactICCEntry iccEntry;
+	iccEntry.iName.Format(KTextLookUp); // Supplied
+	iccEntry.iNumber.Format(KTelLookUp); // Supplied
+	iccEntry.iSlotNum=-1; // This is only for testing purposes, to indicate that it is a new entry
+	iccEntry.iContactUID=KNullContactId; // Only for testing purposes, reset Contact UID value
+	iccEntry.iTON=RMobilePhone::EUnknownNumber;
+
+	CContactDatabase *ContactsDb=NULL;
+	TRAPD(err,ContactsDb=CContactDatabase::OpenL());	// First try to open existing database
+	if (err != KErrNone)
+		{
+		TRAP(err,CContactDatabase::CreateL()); // There is no existing database, so create default one
+		if (err == KErrNone)
+			ContactsDb=CContactDatabase::OpenL();			// Open new database
+		}
+	CleanupStack::PushL(ContactsDb);
+
+	TContactItemId id = ContactsDb->ICCTemplateIdL(); 
+	CContactItem* iccTemplate = ContactsDb->ReadContactL(id);
+	CleanupStack::PushL(iccTemplate);
+	
+	CContactICCEntry* item = CContactICCEntry::NewL(*iccTemplate); // Create an ICC entry
+	CleanupStack::PopAndDestroy(iccTemplate);
+	CleanupStack::PushL(item);
+
+	// Create phone number field 
+	TBuf<RMobilePhone::KMaxMobileTelNumberSize> number;
+	if(iccEntry.iTON==RMobilePhone::EInternationalNumber)
+		number.Append(KInternationalPrefix); // Append '+' prefix if International Number
+	number.Append(iccEntry.iNumber);
+	AddTextFieldToIccContactL(KStorageTypeText, KUidContactFieldPhoneNumber, KUidContactFieldVCardMapTEL, number, item);
+
+	// Create name field
+	TBuf<TContactICCEntry::KMaxPhBkNameSize> name;
+	name.Copy(iccEntry.iName);
+	AddTextFieldToIccContactL(KStorageTypeText, KUidContactFieldFamilyName, KUidContactFieldVCardMapUnusedN, name, item);
+
+	if(iccEntry.iSlotNum!=KSyncIndexNotSupplied) // it is not a new entry so slot number is supplied
+		{
+		// Create slot number field
+		HBufC* buf = HBufC::NewL(5);
+		TPtr indexPtr(buf->Des());
+		indexPtr.AppendNum(iccEntry.iSlotNum);
+		TPtrC indexPtrC = indexPtr.Mid(0);
+		AddTextFieldToIccContactL(KStorageTypeText, KUidContactFieldICCSlot, KUidContactFieldVCardMapNotRequired, indexPtrC, item);
+		delete buf;
+		}
+
+	// Send a Write-Contact-ICC request
+	TRequestStatus status;
+
+	iSession.WriteContact(status, *item, iccEntry.iSlotNum); 
+	User::WaitForRequest(status);
+	TESTCHECKL(status.Int(), KErrNone);
+	TESTCHECKCONDITION(iccEntry.iSlotNum != KSyncIndexNotSupplied); // Make sure we received new slot number
+
+	TContactItemId lookupUID =  78; // Make up a Contacts UID value
+	TInt ret(iSession.UpdateLookuptable(lookupUID, iccEntry.iSlotNum)); // New entry successully written
+																 // so try to update look-up table
+	TESTCHECK(ret, KErrNone);
+	
+	CleanupStack::PopAndDestroy(2);	// item and ContactsDb
+	return TestStepResult();
+	}
+
+CTestGetContactFormat::CTestGetContactFormat() 
+	{
+	SetTestStepName(_L("TestGetContactFormat"));
+	}
+
+enum TVerdict CTestGetContactFormat::doTestStepL()
+/**
+	Get Contact Format test.  This method gets the current contact format.
+	The expected output test results may not be valid for different
+	ICCs/Phones.
+  */
+	{
+	RPhoneBookSession::TContactFieldsV1 contactFormat;
+	RPhoneBookSession::TContactFieldsV1Pckg contactFormatPckg(contactFormat);
+	iSession.GetContactFormat(contactFormatPckg); // Get contact format
+	TESTCHECK(contactFormat.iNameField.iCount, 1);
+	TESTCHECKCONDITION(contactFormat.iNameField.iDisplayed);
+	TESTCHECK(contactFormat.iNumberField.iCount, 1);
+	TESTCHECKCONDITION(contactFormat.iNumberField.iDisplayed);
+	TESTCHECK(contactFormat.iIccSlotField.iLength, -1);
+	TESTCHECK(contactFormat.iIccSlotField.iCount, 1);
+	TESTCHECKCONDITION(contactFormat.iIccSlotField.iDisplayed);
+	return TestStepResult();
+	}
+
+CTestGetPhoneBookCacheState::CTestGetPhoneBookCacheState() 
+	{
+	SetTestStepName(_L("TestGetPhoneBookCacheState"));
+	}
+
+enum TVerdict CTestGetPhoneBookCacheState::doTestStepL()
+/**
+	Get Cache state test.
+  */
+	{
+	RPhoneBookSession::TSyncState cacheState;
+	TInt ret(iSession.GetPhoneBookCacheState(cacheState)); // Get phone book Cache state
+	TESTCHECKL(ret, KErrNone);
+	TESTCHECKL(cacheState, RPhoneBookSession::ECacheValid);
+	return TestStepResult();
+	}
+
+CTestGetLastSyncError::CTestGetLastSyncError()
+	{
+	SetTestStepName(_L("TestGetLastSyncError"));
+	}
+
+enum TVerdict CTestGetLastSyncError::doTestStepL()
+/**
+	GetLastSyncError test.
+    @return TVerdict result of running the test.
+  */
+	{
+	TInt lastError;
+	TInt ret(iSession.GetLastSyncError(lastError)); // Get last phone book Cache error
+	TESTCHECKL(ret, KErrNone);
+	TESTCHECKL(lastError, KErrNone);
+	return TestStepResult();
+	}
+
+CTestNotifyCacheStateChange::CTestNotifyCacheStateChange() 
+	{
+	SetTestStepName(_L("TestNotifyCacheStateChange"));
+	}
+
+enum TVerdict CTestNotifyCacheStateChange::doTestStepL()
+/**
+	tNotifyCacheStateChange Test.
+    @return TVerdict result of running the test.
+  */
+	{
+ 	iSession.SetSyncMode(RPhoneBookSession::EManual);
+	TRequestStatus status, status2;
+	RPhoneBookSession::TSyncState cacheState;
+	iSession.NotifyPhBkCacheStateChange(status);
+	iSession.DoSynchronisation(status2);
+
+	User::WaitForRequest(status);
+	TESTCHECKL(status.Int(), KErrNone);
+
+	iSession.NotifyPhBkCacheStateChange(status);
+	TInt ret(iSession.GetPhoneBookCacheState(cacheState)); // Get phone book Cache state
+	TESTCHECKL(ret, KErrNone);
+	if (cacheState==RPhoneBookSession::ECacheValid)
+		{
+		iSession.CancelRequest(ESyncNotifyCacheStateChangeCancelClient);
+		User::WaitForRequest(status);
+		TESTCHECKL(status2.Int(), KErrNone);//the sync has completed
+		User::WaitForRequest(status2);
+		}
+	else
+		{
+		User::WaitForRequest(status);
+		User::WaitForRequest(status2);
+		iSession.GetPhoneBookCacheState(cacheState);
+		TESTCHECKL(cacheState, RPhoneBookSession::ECacheValid);
+		}
+	return TestStepResult();
+	}
+
+CTestGetPhoneBookId::CTestGetPhoneBookId() 
+	{
+	SetTestStepName(_L("TestGetPhoneBookId"));
+	}
+
+enum TVerdict CTestGetPhoneBookId::doTestStepL()
+/**
+	Get PhoneBook Id Test.
+    @return TVerdict result of running the test.
+  */
+	{
+	TContactItemId uid(KErrNotFound);
+	TInt ret(iSession.GetPhoneBookId(uid, RPhoneBookSession::ESyncGroupId)); // Group ID
+	TESTCHECKL(ret, KErrNone);
+	TESTCHECKCONDITION(uid != KErrNotFound); // Make sure we received valid values
+	ret = iSession.GetPhoneBookId(uid, RPhoneBookSession::ESyncTemplateId); // Template ID
+	TESTCHECKL(ret, KErrNone);
+	TESTCHECKCONDITION(uid != KErrNotFound); // Make sure we received valid values
+	return TestStepResult();
+	}
+
+CTestReset::CTestReset() 
+	{
+	SetTestStepName(_L("TestReset"));
+	}
+
+enum TVerdict CTestReset::doTestStepL()
+/**
+	Reset test.
+    @return TVerdict result of running the test.
+  */
+	{
+	TContactICCEntry i;
+	i.Reset();
+	return TestStepResult();
+	}
+
+CTestVersionTest::CTestVersionTest() 
+	{
+	SetTestStepName(_L("TestVersionTest"));
+	}
+
+enum TVerdict CTestVersionTest::doTestStepL()
+/**
+	Test Version.
+    @return TVerdict result of running the test.
+  */
+	{
+	TVersion version;
+	version = iSession.Version();
+	INFO_PRINTF4(_L("The version number of PhBkSync is %d.%d.%d"),
+                 version.iMajor, version.iMinor, version.iBuild);
+
+	TESTCHECK(version.iMajor, 1);
+	TESTCHECK(version.iMinor, 2);
+	TESTCHECK(version.iBuild, 1);
+
+	return TestStepResult();
+	}
+
+CTestCancelDoSyncRequest::CTestCancelDoSyncRequest() 
+	{
+	SetTestStepName(_L("TestCancelDoSyncRequest"));
+	}
+
+enum TVerdict CTestCancelDoSyncRequest::doTestStepL()
+/**
+	Cancel DoSync request test.
+    @return TVerdict result of running the test.
+  */
+	{
+	TRequestStatus status;
+	iSession.DoSynchronisation(status); // DoSync first, since EManual is set by default
+	iSession.CancelRequest(EDoSynchronisationCancelClient);
+	User::WaitForRequest(status);
+	TESTCHECKCONDITION(status.Int() == KErrNone  ||  status.Int() == KErrCancel);
+
+	iSession.CancelRequest(EDoSynchronisationCancelClient);	// Now try to cancel DoSynchronisation request
+	return TestStepResult();
+	}
+
+CTestCancelDeleteRequest::CTestCancelDeleteRequest() 
+	{
+	SetTestStepName(_L("TestCancelDeleteRequest"));
+	}
+
+enum TVerdict CTestCancelDeleteRequest::doTestStepL()
+/**
+	Cancel Delete request test.
+    @return TVerdict result of running the test.
+  */
+	{
+	TRequestStatus status;
+	TContactItemId id(GetValidUIDFromContactsDbL());	
+	iSession.DeleteContact(status, id); 	// Delete a contact 
+	iSession.CancelRequest(ESyncDeleteCntFromICCCancelClient); // Cancel outstanding delete request
+	User::WaitForRequest(status);
+	TESTCHECKCONDITION(status.Int() == KErrNone  ||  status.Int() == KErrCancel);
+	
+	iSession.CancelRequest(ESyncDeleteCntFromICCCancelClient);	// Now try to cancel Delete request
+														// with no outstanding delete request
+	return TestStepResult();
+	}
+
+CTestCancelWriteRequest::CTestCancelWriteRequest() 
+	{
+	SetTestStepName(_L("TestCancelWriteRequest"));
+	}
+
+enum TVerdict CTestCancelWriteRequest::doTestStepL()
+/**
+	Cancel Write request test.
+    @return TVerdict result of running the test.
+  */
+	{
+	// First populate the name and number fields - Synchroniser Internal Format
+	TContactICCEntry iccEntry;
+	iccEntry.iName.Format(KText); // Supplied
+	iccEntry.iNumber.Format(KTel); // Supplied
+	iccEntry.iSlotNum=-1; // This is only for testing purposes, to indicate that it is a new entry
+	iccEntry.iContactUID=1; // This is usually generated by the Contacts Model, but since we are not using 
+							// the contacts model to write this entry we will have to make up a number.
+	iccEntry.iTON=RMobilePhone::EUnknownNumber;
+
+	CContactDatabase *ContactsDb=NULL;
+	TRAPD(err,ContactsDb=CContactDatabase::OpenL());	// First try to open existing database
+	if (err != KErrNone)
+		{
+		TRAP(err,CContactDatabase::CreateL()); // There is no existing database, so create default one
+		if (err == KErrNone)
+			ContactsDb=CContactDatabase::OpenL();			// Open new database
+		}
+	CleanupStack::PushL(ContactsDb);
+
+	TContactItemId id = ContactsDb->ICCTemplateIdL(); 
+	CContactItem* iccTemplate = ContactsDb->ReadContactL(id);
+	CleanupStack::PushL(iccTemplate);
+	
+	CContactICCEntry* item = CContactICCEntry::NewL(*iccTemplate); // Create an ICC entry
+	CleanupStack::PopAndDestroy(iccTemplate);
+	CleanupStack::PushL(item);
+
+	// Create phone number field 
+	TBuf<RMobilePhone::KMaxMobileTelNumberSize> number;
+	if(iccEntry.iTON==RMobilePhone::EInternationalNumber)
+		number.Append(KInternationalPrefix); // Append '+' prefix if International Number
+	number.Append(iccEntry.iNumber);
+	AddTextFieldToIccContactL(KStorageTypeText, KUidContactFieldPhoneNumber, KUidContactFieldVCardMapTEL, number, item);
+
+	// Create name field
+	TBuf<TContactICCEntry::KMaxPhBkNameSize> name;
+	name.Copy(iccEntry.iName);
+	AddTextFieldToIccContactL(KStorageTypeText, KUidContactFieldFamilyName, KUidContactFieldVCardMapUnusedN, name, item);
+
+	if(iccEntry.iSlotNum!=KSyncIndexNotSupplied) // it is not a new entry so slot number is supplied
+		{
+		// Create slot number field
+		HBufC* buf = HBufC::NewL(5);
+		TPtr indexPtr(buf->Des());
+		indexPtr.AppendNum(iccEntry.iSlotNum);
+		TPtrC indexPtrC = indexPtr.Mid(0);
+		AddTextFieldToIccContactL(KStorageTypeText, KUidContactFieldICCSlot, KUidContactFieldVCardMapNotRequired, indexPtrC, item);
+		delete buf;
+		}
+
+	// Send a Write-Contact-ICC request
+	TRequestStatus status;
+
+	iSession.WriteContact(status, *item, iccEntry.iSlotNum); 
+	iSession.CancelRequest(ESyncWriteCntToICCCancelClient);
+	User::WaitForRequest(status);
+	TESTCHECKCONDITION(status.Int() == KErrNone  ||  status.Int() == KErrCancel);
+
+	iSession.CancelRequest(ESyncWriteCntToICCCancelClient);	// Now try to cancel Write request
+														// with no outstanding delete request
+	CleanupStack::PopAndDestroy(item);
+	CleanupStack::PopAndDestroy(ContactsDb);
+	return TestStepResult();
+	}
+
+CTestWriteContactToICCTest::CTestWriteContactToICCTest() 
+	{
+	SetTestStepName(_L("TestWriteContactToICCTest"));
+	}
+
+enum TVerdict CTestWriteContactToICCTest::doTestStepL()
+/**
+	Write Contact to ICC test.
+    @return TVerdict result of running the test.
+  */
+	{
+	// First populate the name and number fields - Synchroniser Internal Format
+	TContactICCEntry iccEntry;
+	TRequestStatus status;
+	iccEntry.iName.Format(KText); // Supplied
+	iccEntry.iNumber.Format(KTel); // Supplied
+	iccEntry.iSlotNum=-1; // This is only for testing purposes, to indicate that it is a new entry
+	iccEntry.iContactUID=1; // This is usually generated by the Contacts Model, but since we are not using 
+							// the contacts model to write this entry we will have to make up a number.
+	iccEntry.iTON=RMobilePhone::EUnknownNumber;
+
+	WriteContactToICCL(iccEntry, status); // Write an entry to ICC
+	TESTCHECKL(status.Int(), KErrNone);
+	TESTCHECKCONDITION(iccEntry.iSlotNum != KSyncIndexNotSupplied); // Make sure we receive a value
+
+	return TestStepResult();
+	}
+
+CTestWriteContactToICCOverwriteTest::CTestWriteContactToICCOverwriteTest() 
+	{
+	SetTestStepName(_L("TestWriteContactToICCOverwriteTest"));
+	}
+
+enum TVerdict CTestWriteContactToICCOverwriteTest::doTestStepL()
+/**
+	Write Contact to ICC test - Overwrite existing entry.
+    @return TVerdict result of running the test.
+  */
+	{
+	// First populate the name and number fields - Synchroniser Internal Format
+	TContactICCEntry iccEntry;
+	TRequestStatus status;
+	iccEntry.iName.Format(KTextOverwrite); // Supplied
+	iccEntry.iNumber.Format(KTelOverwrite); // Supplied
+	iccEntry.iSlotNum=10; // Index for this entry is supplied
+	iccEntry.iContactUID=1;
+	iccEntry.iTON=RMobilePhone::EUnknownNumber;
+
+	WriteContactToICCL(iccEntry, status); // Write an entry to ICC
+	TESTCHECKL(status.Int(), KErrNone);
+	TESTCHECK(iccEntry.iSlotNum, 10); // Make sure we receive a value
+
+	return TestStepResult();
+	}
+
+CTestWriteContactToICCNoSlotTest::CTestWriteContactToICCNoSlotTest() 
+	{
+	SetTestStepName(_L("TestWriteContactToICCNoSlotTest"));
+	}
+
+enum TVerdict CTestWriteContactToICCNoSlotTest::doTestStepL()
+/**
+	Local function that creates a CTestData object. This method writes a
+    new entry to the ICC.  The index field is not specified.
+    @return TVerdict result of running the test.
+  */
+	{
+	// First populate the name and number fields - Synchroniser Internal Format
+	TRequestStatus status;
+	TContactICCEntry iccEntry;
+	iccEntry.iName.Format(KTextNoSlot); // Supplied
+	iccEntry.iNumber.Format(KTelNoSlot); // Supplied
+	iccEntry.iSlotNum=-1; // This is only for testing purposes, to indicate that it is a new entry
+	iccEntry.iContactUID=2;
+	iccEntry.iTON=RMobilePhone::EInternationalNumber;
+
+	WriteContactToICCL(iccEntry, status); // Write an entry to ICC
+	TESTCHECKL(status.Int(), KErrNone);
+	TESTCHECKCONDITION(iccEntry.iSlotNum != KSyncIndexNotSupplied); // Make sure we receive a value
+
+	return TestStepResult();
+	}
+
+CTestWriteContactToICCInvalidSlotTest::CTestWriteContactToICCInvalidSlotTest() 
+	{
+	SetTestStepName(_L("TestWriteContactToICCInvalidSlotTest"));
+	}
+
+enum TVerdict CTestWriteContactToICCInvalidSlotTest::doTestStepL()
+/**
+	Write Contact to ICC - Invalid Slot number test.
+    @return TVerdict result of running the test.
+  */
+	{
+	// First populate the name and number fields - Synchroniser Internal Format
+	TRequestStatus status;
+	TContactICCEntry iccEntry;
+	iccEntry.iName.Format(KText); // Supplied
+	iccEntry.iNumber.Format(KTel); // Supplied
+	iccEntry.iSlotNum=230; // Invalid slot number
+	iccEntry.iContactUID=3;
+	iccEntry.iTON=RMobilePhone::EUnknownNumber;
+
+	WriteContactToICCL(iccEntry, status); // Write an entry to ICC
+	TESTCHECKL(status.Int(), KErrArgument);
+	TESTCHECK(iccEntry.iSlotNum, 230); // Make sure slot number has not changed
+
+	return TestStepResult();
+	}
+
+CTestWriteContactToICCBlankNumTest::CTestWriteContactToICCBlankNumTest() 
+	{
+	SetTestStepName(_L("TestWriteContactToICCBlankNumTest"));
+	}
+
+enum TVerdict CTestWriteContactToICCBlankNumTest::doTestStepL()
+/**
+	Write Contact to ICC - Blank Number test.
+    @return TVerdict result of running the test.
+  */
+	{
+	// First populate the name and number fields - Synchroniser Internal Format
+	TRequestStatus status;
+	TContactICCEntry iccEntry;
+	iccEntry.iName.Format(KText);
+	iccEntry.iSlotNum=-1; // This is only for testing purposes, to indicate that it is a new entry
+	iccEntry.iContactUID=4;
+	iccEntry.iTON=RMobilePhone::EUnknownNumber;
+
+	WriteContactToICCL(iccEntry, status); // Write an entry to ICC
+	TESTCHECKL(status.Int(), KErrNone);
+	TESTCHECKCONDITION(iccEntry.iSlotNum != KSyncIndexNotSupplied); // Make sure we receive a value
+
+	return TestStepResult();
+	}
+
+CTestWriteContactToICCBlankNameTest::CTestWriteContactToICCBlankNameTest() 
+	{
+	SetTestStepName(_L("TestWriteContactToICCBlankNameTest"));
+	}
+
+enum TVerdict CTestWriteContactToICCBlankNameTest::doTestStepL()
+/**
+	Write Contact to ICC - Blank Name test.
+    @return TVerdict result of running the test.
+  */
+	{
+	// First populate the name and number fields - Synchroniser Internal Format
+	TRequestStatus status;
+	TContactICCEntry iccEntry;
+	iccEntry.iNumber.Format(KTel);
+	iccEntry.iSlotNum=-1; // This is only for testing purposes, to indicate that it is a new entry
+	iccEntry.iContactUID=5;
+	iccEntry.iTON=RMobilePhone::EUnknownNumber;
+
+	WriteContactToICCL(iccEntry, status); // Write an entry to ICC
+//	TESTCHECKL(status.Int(), KErrNone); // Commented out as this is applicable to a Nokia phone only
+//	TESTCONDITION(iccEntry.iSlotNum != KSyncIndexNotSupplied); // Make sure we receive a value - Nokia phone only
+
+	return TestStepResult();
+	}
+
+CTestWriteContactToICCExceedMaxNameTest::CTestWriteContactToICCExceedMaxNameTest() 
+	{
+	SetTestStepName(_L("TestWriteContactToICCExceedMaxNameTest"));
+	}
+
+enum TVerdict CTestWriteContactToICCExceedMaxNameTest::doTestStepL()
+/**
+	Write Contact to ICC - Exceed Max Name test.
+    @return TVerdict result of running the test.
+  */
+	{
+	// First populate the name and number fields - Synchroniser Internal Format
+	TRequestStatus status;
+	TContactICCEntry iccEntry;
+	iccEntry.iName.Format(KTextExceedMax); // Exceeds max num of characters
+	iccEntry.iNumber.Format(KTelNormal); // Matching name which does not exceed max number of characters
+	iccEntry.iSlotNum=-1; // This is only for testing purposes, to indicate that it is a new entry
+	iccEntry.iContactUID=6;
+	iccEntry.iTON=RMobilePhone::EUnknownNumber;
+
+	WriteContactToICCL(iccEntry, status); // Write an entry to ICC
+	TESTCHECKCONDITIONL(status.Int() == KErrGeneral  ||  status.Int() == KErrOverflow);
+	TESTCHECK(iccEntry.iSlotNum, KSyncIndexNotSupplied); // No slot number assigned for this entry
+
+	return TestStepResult();
+	}
+
+CTestWriteContactToICCExceedMaxNumTest::CTestWriteContactToICCExceedMaxNumTest() 
+	{
+	SetTestStepName(_L("TestWriteContactToICCExceedMaxNumTest"));
+	}
+
+enum TVerdict CTestWriteContactToICCExceedMaxNumTest::doTestStepL()
+/**
+	Write Contact to ICC - Exceed Max Number test.
+    @return TVerdict result of running the test.
+  */
+	{
+	// First populate the name and number fields - Synchroniser Internal Format
+	TContactICCEntry iccEntry;
+	TRequestStatus status;
+	iccEntry.iName.Format(KNameNormal); // Matching name which does not exceed max number of characters
+	iccEntry.iNumber.Format(KTelExceedMax); // Exceeds max num of characters
+	iccEntry.iSlotNum=-1; // This is only for testing purposes, to indicate that it is a new entry
+	iccEntry.iContactUID=7;
+	iccEntry.iTON=RMobilePhone::EUnknownNumber;
+
+	WriteContactToICCL(iccEntry, status); // Write an entry to ICC
+
+	return TestStepResult();
+	}
+
+CTestWriteContactToICCMaxNumTest::CTestWriteContactToICCMaxNumTest() 
+	{
+	SetTestStepName(_L("TestWriteContactToICCMaxNumTest"));
+	}
+
+enum TVerdict CTestWriteContactToICCMaxNumTest::doTestStepL()
+/**
+	Write Contact to ICC - Max Number test.
+    @return TVerdict result of running the test.
+  */
+	{
+	// First populate the name and number fields - Synchroniser Internal Format
+	TContactICCEntry iccEntry;
+	TRequestStatus status;
+	iccEntry.iName.Format(KTextMaxNum);
+	iccEntry.iNumber.Format(KTelMax); // Supplied
+	iccEntry.iSlotNum=-1; // This is only for testing purposes, to indicate that it is a new entry
+	iccEntry.iContactUID=8;
+	iccEntry.iTON=RMobilePhone::EUnknownNumber;
+
+	WriteContactToICCL(iccEntry, status); // Write an entry to ICC
+	if ((status.Int() != KErrGeneral) && (status.Int() != KErrOverflow)) // MMTSY returns KErrGeneral for this
+		{
+		TESTCHECKL(status.Int(), KErrNone);
+		TESTCHECKCONDITION(iccEntry.iSlotNum != KSyncIndexNotSupplied); // Make sure we receive a value
+		}
+
+	return TestStepResult();
+	}
+
+CTestWriteContactToICCMaxNameTest::CTestWriteContactToICCMaxNameTest() 
+	{
+	SetTestStepName(_L("TestWriteContactToICCMaxNameTest"));
+	}
+
+enum TVerdict CTestWriteContactToICCMaxNameTest::doTestStepL()
+/**
+	Write Contact to ICC - Max Name test.
+    @return TVerdict result of running the test.
+  */
+	{
+	// First populate the name and number fields - Synchroniser Internal Format
+	TContactICCEntry iccEntry;
+	TRequestStatus status;
+	iccEntry.iName.Format(KEntryMaxName); // Supplied
+	iccEntry.iNumber.Format(KTel);
+	iccEntry.iSlotNum=-1; // This is only for testing purposes, to indicate that it is a new entry
+	iccEntry.iContactUID=9;
+	iccEntry.iTON=RMobilePhone::EUnknownNumber;
+
+	WriteContactToICCL(iccEntry, status); // Write an entry to ICC
+	if (status.Int() != KErrOverflow)
+		{
+		TESTCHECKL(status.Int(), KErrNone);
+		TESTCHECKCONDITION(iccEntry.iSlotNum != KSyncIndexNotSupplied); // Make sure we receive a value
+		}
+
+	return TestStepResult();
+	}
+
+CTestWriteContactToICCNumLettersTest::CTestWriteContactToICCNumLettersTest() 
+	{
+	SetTestStepName(_L("TestWriteContactToICCNumLettersTest"));
+	}
+
+enum TVerdict CTestWriteContactToICCNumLettersTest::doTestStepL()
+/**
+	Write Contact to ICC - Number with letters test.
+    @return TVerdict result of running the test.
+  */
+	{
+	// First populate the name and number fields - Synchroniser Internal Format
+	TContactICCEntry iccEntry;
+	TRequestStatus status;
+	iccEntry.iName.Format(KText); // Supplied
+	iccEntry.iNumber.Format(KTelWithLetters);
+	iccEntry.iSlotNum=-1; // This is only for testing purposes, to indicate that it is a new entry
+	iccEntry.iContactUID=10;
+	iccEntry.iTON=RMobilePhone::EUnknownNumber;
+
+	WriteContactToICCL(iccEntry, status); // Write an entry to ICC
+	TESTCHECKCONDITIONL(status.Int() == KErrGeneral  ||  status.Int() == KErrNone);
+	TESTCHECKCONDITION(iccEntry.iSlotNum == KSyncIndexNotSupplied  ||  iccEntry.iSlotNum == 18); // No slot number allocated for this entry
+
+	return TestStepResult();
+	}
+
+CTestWriteContactToICCObsecureTest::CTestWriteContactToICCObsecureTest() 
+	{
+	SetTestStepName(_L("TestWriteContactToICCObsecureTest"));
+	}
+
+enum TVerdict CTestWriteContactToICCObsecureTest::doTestStepL()
+/**
+	Write Contact to ICC - Name with non-alphabetical characters test.
+    @return TVerdict result of running the test.
+  */
+	{
+	// First populate the name and number fields - Synchroniser Internal Format
+	TContactICCEntry iccEntry;
+	TRequestStatus status;
+	iccEntry.iName.Format(KTextNonAlphabet);
+	iccEntry.iNumber.Format(KTel);
+//	iccEntry.iNumber.Format(KTelWithpw);
+	iccEntry.iSlotNum=-1; // This is only for testing purposes, to indicate that it is a new entry
+	iccEntry.iContactUID=11;
+	iccEntry.iTON=RMobilePhone::EUnknownNumber;
+
+	WriteContactToICCL(iccEntry, status); // Write an entry to ICC
+	TESTCHECKL(status.Int(), KErrNone);
+	TESTCHECKCONDITION(iccEntry.iSlotNum != KSyncIndexNotSupplied); // Make sure we receive a value
+
+	return TestStepResult();
+	}
+
+CTestSlotHandlingTest::CTestSlotHandlingTest() 
+	{
+	SetTestStepName(_L("TestSlotHandlingTest"));
+	}
+
+enum TVerdict CTestSlotHandlingTest::doTestStepL()
+/**
+	Slot Handling Test.
+    @return TVerdict result of running the test.
+  */
+	{
+	TInt aSlot;
+	TContactItemId aId=KNullContactId;
+	TInt numSlots; 
+	TInt err = iSession.GetNumSlots(numSlots);
+	TESTCHECKL(err, KErrNone);
+	TESTCHECKL(numSlots, 200);
+
+	RArray<TInt> freeSlotArray;
+	CleanupClosePushL(freeSlotArray);
+	
+	iSession.GetFreeSlotsL(freeSlotArray);
+
+	TInt FirstUsedSlot;
+	TBool free(EFalse);
+	 
+
+	TInt i;
+	for (FirstUsedSlot=1; FirstUsedSlot<numSlots; FirstUsedSlot++)
+		{
+		free=EFalse;
+		for (i=0;i<freeSlotArray.Count();i++)
+			{
+			if (FirstUsedSlot==freeSlotArray[i])
+				{
+				free=ETrue;
+				break;
+				}
+			}
+		if(free==EFalse)
+			{
+			break;
+			}
+		}
+	
+	err = iSession.GetSlotId(FirstUsedSlot, aId);
+	TESTCHECKL(err, KErrNone);
+	TESTCHECKCONDITIONL(aId > KNullContactId);
+	
+	aSlot = freeSlotArray[0];
+	err = iSession.GetSlotId(aSlot, aId);
+	TESTCHECKL(err, KErrNotFound);
+
+	CleanupStack::PopAndDestroy(&freeSlotArray);
+
+	return TestStepResult();
+	}
+
+CTestWriteToSlotTest::CTestWriteToSlotTest() 
+	{
+	SetTestStepName(_L("TestWriteToSlotTest"));
+	}
+
+enum TVerdict CTestWriteToSlotTest::doTestStepL()
+/**
+	Write To Slot Test.
+    @return TVerdict result of running the test.
+  */
+	{
+	TInt aSlot;
+	TContactItemId aId=KNullContactId;
+	TInt numSlots; 
+	TInt err = iSession.GetNumSlots(numSlots);
+	TESTCHECKL(err, KErrNone);
+	TESTCHECKL(numSlots, 200);
+
+	RArray<TInt> freeSlotArray;
+	CleanupClosePushL(freeSlotArray);
+
+	iSession.GetFreeSlotsL(freeSlotArray);
+
+	//TInt i;
+	//for (i=0; i<freeSlotArray.Count(); i++)
+	//	{
+	//	Log(_L("%d"),freeSlotArray[i]);
+	//	}
+	//Log(_L(""));
+	
+	TContactICCEntry iccEntry;
+	TRequestStatus status;
+	iccEntry.iName.Format(KText); // Supplied
+	iccEntry.iNumber.Format(KTel); // Supplied
+	iccEntry.iSlotNum=-1; 
+	iccEntry.iContactUID=15; // This is usually generated by the Contacts Model, but since we are not using 
+							// the contacts model to write this entry we will have to make up a number.
+	iccEntry.iTON=RMobilePhone::EUnknownNumber;
+
+	WriteContactToICCL(iccEntry, status); // Write an entry to ICC
+	TESTCHECKL(status.Int(), KErrNone);
+
+	iSession.GetFreeSlotsL(freeSlotArray);
+	//TInt j;
+	//for (j=0; j<freeSlotArray.Count(); j++)
+	//	{
+	//	Log(_L("%d"),freeSlotArray[j]);
+	//	}
+	//Log(_L(""));
+
+	aSlot=freeSlotArray[0];
+	err = iSession.GetSlotId(aSlot, aId);
+	TESTCHECKL(err, KErrNotFound);
+
+	//Add Entry at slot
+	iccEntry.iContactUID=15;
+	iccEntry.iSlotNum=25;//now the slot is specified
+	WriteContactToICCL(iccEntry, status); // Write an entry to ICC
+	TESTCHECKL(status.Int(), KErrNone);
+
+	iSession.GetFreeSlotsL(freeSlotArray);
+	//TInt jj;
+	//for (jj=0; jj<freeSlotArray.Count(); jj++)
+	//	{
+	//	Log(_L("%d"),freeSlotArray[jj]);
+	//	}
+	//Log(_L(""));
+	
+	aSlot=25;
+	err = iSession.GetSlotId(aSlot, aId);
+	TESTCHECKL(err, KErrNone);
+
+	//Edit entry same slot //
+/*	iccEntry.iSlotNum=25;
+	iccEntry.iName.Format(KTextOverwrite);
+	WriteContactToICCL(iccEntry, status);
+	for (i=0; i<freeSlotArray.Count(); i++)
+		{
+		Log(_L("%d"),freeSlotArray[i]);
+		}
+	Log(_L(""));
+	TESTCHECKCONDITIONL(aId > KNullContactId);
+*/
+	
+	CleanupStack::PopAndDestroy(&freeSlotArray);
+
+	return TestStepResult();
+	}
+
+CTestConnectionTest::CTestConnectionTest() 
+	{
+	SetTestStepName(_L("TestConnectionTest"));
+	} // CTestConnectionTest::CTestConnectionTest
+
+
+/**
+ *  Connection and disconnection test.
+ *
+ *  @return TVerdict result of running the test.
+ */
+enum TVerdict CTestConnectionTest::doTestStepL()
+	{
+	//
+	// Connect to PhBkSync Server and wait 30 seconds...
+	//
+	RPhoneBookSession sessionTest;
+
+	TInt ret(sessionTest.Connect()); // this one should start the server 
+	TESTCHECK(ret, KErrNone);
+	User::After(30*1000000);
+	sessionTest.Close();
+
+	return TestStepResult();
+	} // CTestConnectionTest::doTestStepL
+
+
+CTestFailedPhoneStartup::CTestFailedPhoneStartup() 
+	{
+	SetTestStepName(_L("TestFailedPhoneStartup"));
+	} // CTestFailedPhoneStartup::CTestFailedPhoneStartup
+
+
+/**
+ *  Connection and disconnection test.
+ *
+ *  @return TVerdict result of running the test.
+ */
+enum TVerdict CTestFailedPhoneStartup::doTestStepL()
+	{
+	//
+	// Shutdown the server if possible (only works if the server is in
+	// debug mode).
+	//
+	iSession.ShutdownServer(EFalse);
+	iSession.Close();
+
+	//
+	// Delete the SIMTSY config file so that the server cannot startup...
+	//
+	RFs  fs;
+	TInt  deleteResult;
+
+	User::LeaveIfError(fs.Connect());
+	CleanupClosePushL(fs);
+
+	deleteResult = fs.Delete(KConfigFilename);
+	TESTCHECKCONDITION(deleteResult == KErrNone  ||  deleteResult == KErrNotFound);
+
+	CleanupStack::PopAndDestroy(&fs);
+
+	//
+	// Connect to PhBkSync Server (restarting it). The next result will vary
+	// depending on whether the server is a UDeb or URel version.
+	//
+	// For UDeb the shutdown and reconnect will exercise the defect scenario
+	// of the TSY not opening. Initially (now that the server configures
+	// asynchronously) this will succeed but this fail.
+	//
+	// For a URel server the shutdown will not have happened and the delete
+	// of the config.txt would not be noticed. Therefore the reconnect would
+	// succeed with no problems.
+	//
+	TInt  ret;
+
+	ret = iSession.Connect();
+#ifdef _DEBUG
+	TESTCHECK(ret, KErrNone);
+#else
+	TESTCHECK(ret, KErrNone);
+#endif
+
+	//
+	// Test if the server managed to configure successfully...
+	//
+	RPhoneBookSession::TPhonebookSyncMode  syncMode;
+
+	ret = iSession.GetSyncMode(syncMode);
+#ifdef _DEBUG
+	TESTCHECK(ret, KErrServerTerminated);
+#else
+	TESTCHECK(ret, KErrNone);
+#endif
+
+	return TestStepResult();
+	} // CTestFailedPhoneStartup::doTestStepL
+