pimprotocols/phonebooksync/Test/TE_PhBkSync/TestWriteContactSteps.cpp
author Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
Tue, 02 Feb 2010 10:12:17 +0200
changeset 0 e686773b3f54
permissions -rw-r--r--
Revision: 201003 Kit: 201005

// Copyright (c) 2002-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:
// This contains PhbkSync API WriteContact() related Unit Test Steps
// 
//

#include <e32base.h>
#include <exterror.h>

#include "TE_PhBkSyncBase.h"
#include "TestWriteContactSteps.h"

/**
 * Test writing a contact, where all the contact fields are valid.
 * Repeat for all supported phonebooks.
 */
//
//    Test step1 -- Test#54 in Unit Test Spec. Doc. //
//
CPhbkSyncWriteContactTest_01::CPhbkSyncWriteContactTest_01()
	{
	// store the name of this test step
	SetTestStepName(_L("PhbkSyncWriteContactTest_01"));
	}

CPhbkSyncWriteContactTest_01::~CPhbkSyncWriteContactTest_01()
	{
	}

TVerdict CPhbkSyncWriteContactTest_01::doTestStepL( )
	{
	TInt i(0);
	for (i=0; i<KTotalNumberOfPhoneBook; i++) 
		{ 
		ChangeSyncModeL(RPhoneBookSession::EAutoCurrentIcc, iPhoneBook[i]);
		CheckSyncModeL(RPhoneBookSession::EAutoCurrentIcc, iPhoneBook[i]);
		}

	SetSimTsyTestNumberL(54);

	// wait until all phonebooks have been synchronised
	for (i=0; i<KTotalNumberOfPhoneBook; i++) 
		{ 
		CheckCacheStateValidL(iPhoneBook[i]);
		}

	// to create a new entry with internal (long/new) format and initialise it
	MyCSyncContactICCEntry* iccEntryInternalNew = MyCSyncContactICCEntry::NewL();
	CleanupStack::PushL(iccEntryInternalNew); 
	InitialiseIccEntryInternalNewL(iccEntryInternalNew);

	// to create an old entry with internal (short/old) format and initialise it
	MyCSyncContactICCEntry* iccEntryInternalOld = MyCSyncContactICCEntry::NewL();
	CleanupStack::PushL(iccEntryInternalOld);
	InitialiseIccEntryInternalOldL(iccEntryInternalOld);

	// to call the DoWriteContactL
	TRequestStatus status;
	for (i=0; i<KTotalNumberOfPhoneBook; i++) 
		{
		// set the corresponding entry attributes
		if (iPhoneBook[i] == KUidIccGlobalSdnPhonebook ||
			iPhoneBook[i] == KUidIccGlobalLndPhonebook) 
			{
			// slot 1-4 is guaranteed free in phonebooks (see [test54] in cfg. file)
			iccEntryInternalOld->iSlotNum = i+1; 
			iccEntryInternalOld->iPhonebook = convertPhonebookUid2Enum(iPhoneBook[i]); 
			// do the real test by writing an entry to ICC
			DoWriteContactToICCL(iccEntryInternalOld, iPhoneBook[i], status);
			}
		else 
			{
			// slot 1-4 is guaranteed free in phonebooks (see [test54] in cfg. file)
			iccEntryInternalNew->iSlotNum = i+1; 
			iccEntryInternalNew->iPhonebook = convertPhonebookUid2Enum(iPhoneBook[i]); 
			// do the real test by writing an entry to ICC
			DoWriteContactToICCL(iccEntryInternalNew, iPhoneBook[i], status);
			}

		// check result
		TESTCHECK(status.Int(), KErrNone);
		TESTCHECKCONDITION(iccEntryInternalNew->iSlotNum != KSyncIndexNotSupplied);
		}
	CleanupStack::PopAndDestroy(2); 
	return TestStepResult();
	}

/**
 * Test writing a contact, where all the contact fields are 
 * valid except the ICC slot which is not specified and
 * there is space to add another contact. Repeat for all
 * supported phonebooks.
 */
//
//    Test step2 -- Test#55 in Unit Test Spec. Doc.  //
//
CPhbkSyncWriteContactTest_02::CPhbkSyncWriteContactTest_02()
	{
	// store the name of this test step
	SetTestStepName(_L("PhbkSyncWriteContactTest_02"));
	}

CPhbkSyncWriteContactTest_02::~CPhbkSyncWriteContactTest_02()
	{
	}

TVerdict CPhbkSyncWriteContactTest_02::doTestStepL( )
	{
	TInt i(0);

	for (i=0; i<KTotalNumberOfPhoneBook; i++) 
		{ 
		ChangeSyncModeL(RPhoneBookSession::EAutoCurrentIcc, iPhoneBook[i]);
		CheckSyncModeL(RPhoneBookSession::EAutoCurrentIcc, iPhoneBook[i]);
		}

	// load the dummy ICC which contains all phonebooks and also have 
	// plenty free slots
	SetSimTsyTestNumberL(0);

	// wait until all phonebooks have been synchronised
	for (i=0; i<KTotalNumberOfPhoneBook; i++) 
		{ 
		CheckCacheStateValidL(iPhoneBook[i]);
		}

	// to create an entry with internal (long/new) format and initialise it
	MyCSyncContactICCEntry* iccEntryInternalNew = MyCSyncContactICCEntry::NewL();
	CleanupStack::PushL(iccEntryInternalNew); 
	InitialiseIccEntryInternalNewL(iccEntryInternalNew);

	// to call the DoWriteContactL to do the real business
	TRequestStatus status;
	for (i=0; i<KTotalNumberOfPhoneBook; i++) 
		{
		// set the corresponding phonebook
		iccEntryInternalNew->iPhonebook = convertPhonebookUid2Enum(iPhoneBook[i]); 

		// do the real test by writing an entry to ICC
		DoWriteContactToICCL(iccEntryInternalNew, iPhoneBook[i], status);

		// check result
		TESTCHECK(status.Int(), KErrNone);
		TESTCHECKCONDITION(iccEntryInternalNew->iSlotNum != KSyncIndexNotSupplied);
		}
	CleanupStack::PopAndDestroy(); 
	return TestStepResult();
	}

/** 
 * Test writing a contact, where all the contact fields are 
 * valid except the ICC slot which is not specified and there
 * is no space to add another contact. Repeat for all supported
 * phonebooks.
 */ 
//
//    Test step3 -- Test#56 in Unit Test Spec. Doc.  //
//
CPhbkSyncWriteContactTest_03::CPhbkSyncWriteContactTest_03()
	{
	// store the name of this test step
	SetTestStepName(_L("PhbkSyncWriteContactTest_03"));
	}

CPhbkSyncWriteContactTest_03::~CPhbkSyncWriteContactTest_03()
	{
	}

TVerdict CPhbkSyncWriteContactTest_03::doTestStepL( )
	{
	TInt i(0);

	for (i=0; i<KTotalNumberOfPhoneBook; i++) 
		{ 
		ChangeSyncModeL(RPhoneBookSession::EAutoCurrentIcc, iPhoneBook[i]);
		CheckSyncModeL(RPhoneBookSession::EAutoCurrentIcc, iPhoneBook[i]);
		}

	// load all full phonebooks
	SetSimTsyTestNumberL(18);  // re-use Test#18 phonebooks, which are full

	// wait until all phonebooks have been synchronised
	for (i=0; i<KTotalNumberOfPhoneBook; i++) 
		{ 
		CheckCacheStateValidL(iPhoneBook[i]);
		}

	// to create an entry with internal (long/new) format and initialise it
	MyCSyncContactICCEntry* iccEntryInternalNew = MyCSyncContactICCEntry::NewL();
	CleanupStack::PushL(iccEntryInternalNew);
	InitialiseIccEntryInternalNewL(iccEntryInternalNew);

	// to call the DoWriteContactL to do the real business
	TRequestStatus status;
	for (i=0; i<KTotalNumberOfPhoneBook; i++) 
		{
		// set the corresponding phonebook
		iccEntryInternalNew->iPhonebook = convertPhonebookUid2Enum(iPhoneBook[i]); 

		// do the real test by writing an entry to ICC
		DoWriteContactToICCL(iccEntryInternalNew, iPhoneBook[i], status);

		// check result
//		TESTCHECK(status.Int(), KErrOverflow);

		// instead returning KErrOverflow, TSY wrongly returns KErrNoMemory
		TESTCHECK(status.Int(), KErrNoMemory);
		}
	CleanupStack::PopAndDestroy(); 
	return TestStepResult();
	}


/**
 * Test writing a contact, where all the contact fields are
 * valid except the ICC slot which is an invalid slot number 
 * (0, -1, -5765). Repeat for all supported phonebooks.
 */
//
//    Test step4 -- Test#57 in Unit Test Spec. Doc.  //
//
CPhbkSyncWriteContactTest_04::CPhbkSyncWriteContactTest_04()
	{
	// store the name of this test step
	SetTestStepName(_L("PhbkSyncWriteContactTest_04"));
	}

CPhbkSyncWriteContactTest_04::~CPhbkSyncWriteContactTest_04()
	{
	}

TVerdict CPhbkSyncWriteContactTest_04::doTestStepL( )
	{
	TInt NumOfInvalidSlots = 4;
	TInt invalidSlotNumbers[] = 
		{0,9876,-256,-5765};

	TInt i(0);

	for (i=0; i<KTotalNumberOfPhoneBook; i++) 
		{ 
		ChangeSyncModeL(RPhoneBookSession::EAutoCurrentIcc, iPhoneBook[i]);
		CheckSyncModeL(RPhoneBookSession::EAutoCurrentIcc, iPhoneBook[i]);
		}

	// load the dummy test which contains all phonebooks
	SetSimTsyTestNumberL(0);

	// wait until all phonebooks have been synchronised
	for (i=0; i<KTotalNumberOfPhoneBook; i++) 
		{ 
		CheckCacheStateValidL(iPhoneBook[i]);
		}

	// to create an entry with internal (lone/new) format and initialise it
	MyCSyncContactICCEntry* iccEntryInternalNew = MyCSyncContactICCEntry::NewL();
	CleanupStack::PushL(iccEntryInternalNew);
	InitialiseIccEntryInternalNewL(iccEntryInternalNew);

	// to call the DoWriteContactL to do the real business
	TRequestStatus status;
	for (i=0; i<KTotalNumberOfPhoneBook; i++) 
		{
		// set the corresponding phonebook
		iccEntryInternalNew->iPhonebook = convertPhonebookUid2Enum(iPhoneBook[i]); 

		// set invalid slot numbers and try to write into the phonebook
		TInt j=0;
		for (j = 0; j<NumOfInvalidSlots; j++) 
			{
			iccEntryInternalNew->iSlotNum = invalidSlotNumbers[j];

			// do the real test by writing an entry to ICC
			DoWriteContactToICCL(iccEntryInternalNew, iPhoneBook[i], status);

			// check result
			TESTCHECK(status.Int(), KErrArgument);
			}
		}
	CleanupStack::PopAndDestroy(); 
	return TestStepResult();
	}

/**
 * Test writing (edit) a contact, where all the contact fields
 * are valid, but the specified ICC slot already has an entry.
 */
//
//    Test step5 -- Test#58 in Unit Test Spec. Doc.  //
//
CPhbkSyncWriteContactTest_05::CPhbkSyncWriteContactTest_05()
	{
	// store the name of this test step
	SetTestStepName(_L("PhbkSyncWriteContactTest_05"));
	}

CPhbkSyncWriteContactTest_05::~CPhbkSyncWriteContactTest_05()
	{
	}

TVerdict CPhbkSyncWriteContactTest_05::doTestStepL( )
	{
	TInt i(0);

	for (i=0; i<KTotalNumberOfPhoneBook; i++) 
		{ 
		ChangeSyncModeL(RPhoneBookSession::EAutoCurrentIcc, iPhoneBook[i]);
		CheckSyncModeL(RPhoneBookSession::EAutoCurrentIcc, iPhoneBook[i]);
		}

	// load the dummy test which contains all phonebooks and also the 
	// first slot in each phonebook already has an entry
	SetSimTsyTestNumberL(0);

	// wait until all phonebooks have been synchronised
	for (i=0; i<KTotalNumberOfPhoneBook; i++) 
		{ 
		CheckCacheStateValidL(iPhoneBook[i]);
		}
	
	// to create an entry with internal (lone/new) format and initialise it
	MyCSyncContactICCEntry* iccEntryInternalNew = MyCSyncContactICCEntry::NewL();
	CleanupStack::PushL(iccEntryInternalNew);
	InitialiseIccEntryInternalNewL(iccEntryInternalNew);

	// to call the DoWriteContactL to do the real business
	TRequestStatus status;
	for (i=0; i<KTotalNumberOfPhoneBook; i++) 
		{
		// set a slot number which has been occupied by an entry in phonebook
		iccEntryInternalNew->iSlotNum = GetValidSlotFromContactsDbL(iPhoneBook[i]);

		// set the corresponding phonebook
		iccEntryInternalNew->iPhonebook = convertPhonebookUid2Enum(iPhoneBook[i]); 

		// do the real test by writing an entry to ICC
		DoWriteContactToICCL(iccEntryInternalNew, iPhoneBook[i], status);

		// check result
		TESTCHECK(status.Int(), KErrNone);  // the old entry is overwritten
		}
	CleanupStack::PopAndDestroy(); 
	return TestStepResult();
	}

/**
 * Test writing a contact, where all the contact fields are 
 * specified in such a way what they are only just valid, e.g.
 * no. of allowed characters for that field , no. of digits in
 * phone number = max no. of allowed digits for that field, 
 * ICC slot no. = max no. of ICC slots available.
 */
//
//    Test step6 -- Test#59 in Unit Test Spec. Doc.  //
//
CPhbkSyncWriteContactTest_06::CPhbkSyncWriteContactTest_06()
	{
	// store the name of this test step
	SetTestStepName(_L("PhbkSyncWriteContactTest_06"));
	}

CPhbkSyncWriteContactTest_06::~CPhbkSyncWriteContactTest_06()
	{
	}

TVerdict CPhbkSyncWriteContactTest_06::doTestStepL( )
	{
	TInt maxSlotNumber = 20; // for all phonebooks in [test0]

	// due to the bug in TSY, the size has to be limit (set in cfg. file) -1
	_LIT16(KT59Number,"1234567890123456789012345678901234567890");// 40 digits
	_LIT16(KT59Name,"abcdefghijklmnopqrstuvwxyz12345678901234567890"); // 46 chars

	TInt i(0);

	for (i=0; i<KTotalNumberOfPhoneBook; i++) 
		{ 
		ChangeSyncModeL(RPhoneBookSession::EAutoCurrentIcc, iPhoneBook[i]);
		CheckSyncModeL(RPhoneBookSession::EAutoCurrentIcc, iPhoneBook[i]);
		}

	// load the dummy test which contains all phonebooks
	SetSimTsyTestNumberL(0);

	// wait until all phonebooks have been synchronised
	for (i=0; i<KTotalNumberOfPhoneBook; i++) 
		{ 
		CheckCacheStateValidL(iPhoneBook[i]);
		}

	// to create an entry with internal (long/new) format and initialise it
	MyCSyncContactICCEntry* iccEntryInternalNew = MyCSyncContactICCEntry::NewL();
	CleanupStack::PushL(iccEntryInternalNew);
	InitialiseIccEntryInternalNewL(iccEntryInternalNew);

	// set the slot number = max no. of ICC slots available
	iccEntryInternalNew->iSlotNum = maxSlotNumber;

	// set the name = max no. of allowed characters
	TInt count = iccEntryInternalNew->iNameList->Count();
	for(i=0; i<count; ++i) 
		{
		iccEntryInternalNew->iNameList->At(i).Copy(KT59Name);
		}

	// set the phone number = max no. of allowed digits 
	iccEntryInternalNew->iNumber.Format(KT59Number);

	// to call the DoWriteContactL to do the real business
	TRequestStatus status;
	for (i=0; i<KTotalNumberOfPhoneBook; i++) 
		{
		// set the corresponding phonebook
		iccEntryInternalNew->iPhonebook = convertPhonebookUid2Enum(iPhoneBook[i]); 

		// do the real test by writing an entry to ICC
		DoWriteContactToICCL(iccEntryInternalNew, iPhoneBook[i], status);

		// check result
		TESTCHECK(status.Int(), KErrNone);  // everything is within limit
		}
	CleanupStack::PopAndDestroy(); 
	return TestStepResult();
	}


/**
 * Test writing a contact, where all the contact fields are
 * valid except the name which has more characters than
 * permitted.
 */
//
//    Test step7 -- Test#60 in Unit Test Spec. Doc.  //
//
CPhbkSyncWriteContactTest_07::CPhbkSyncWriteContactTest_07()
	{
	// store the name of this test step
	SetTestStepName(_L("PhbkSyncWriteContactTest_07"));
	}

CPhbkSyncWriteContactTest_07::~CPhbkSyncWriteContactTest_07()
	{
	}

TVerdict CPhbkSyncWriteContactTest_07::doTestStepL( )
	{
	_LIT16(KT60NameTooLong,"abcdefghijklmnopqrstuvwxyz12345678901234567890abcdefghijklmnopqrstuvwxyz"); // >> 47 chars defined in [test0]

	TInt i(0);
	for (i=0; i<KTotalNumberOfPhoneBook; i++) 
		{ 
		ChangeSyncModeL(RPhoneBookSession::EAutoCurrentIcc, iPhoneBook[i]);
		CheckSyncModeL(RPhoneBookSession::EAutoCurrentIcc, iPhoneBook[i]);
		}

	// load the dummy test which contains all phonebooks
	SetSimTsyTestNumberL(0);

	// wait until all phonebooks have been synchronised
	for (i=0; i<KTotalNumberOfPhoneBook; i++) 
		{ 
		CheckCacheStateValidL(iPhoneBook[i]);
		}

	// to create an entry with internal (long/new) format and initialise it
	MyCSyncContactICCEntry* iccEntryInternalNew = MyCSyncContactICCEntry::NewL();
	CleanupStack::PushL(iccEntryInternalNew);
	InitialiseIccEntryInternalNewL(iccEntryInternalNew);

	// set the name >> max no. of allowed characters
	TInt count = iccEntryInternalNew->iNameList->Count();
	for(i=0; i<count; ++i) 
		{
		iccEntryInternalNew->iNameList->At(i).Copy(KT60NameTooLong);
		}

	// to call the DoWriteContactL to do the real business
	TRequestStatus status;
	for (i=0; i<KTotalNumberOfPhoneBook; i++) 
		{
		// set the corresponding phonebook
		iccEntryInternalNew->iPhonebook = convertPhonebookUid2Enum(iPhoneBook[i]); 

		// do the real test by writing an entry to ICC
		DoWriteContactToICCL(iccEntryInternalNew, iPhoneBook[i], status);

		// check result
		TESTCHECK(status.Int(), KErrPhonebookTextOverflow);
		}
	CleanupStack::PopAndDestroy(); 
	return TestStepResult();
	}

/**
 * Test writing a contact, where all the contact fields are
 * valid except the phone number which has more digits than
 * permitted.
 */
//
//    Test step8 -- Test#61 in Unit Test Spec. Doc.  //
//
CPhbkSyncWriteContactTest_08::CPhbkSyncWriteContactTest_08()
	{
	// store the name of this test step
	SetTestStepName(_L("PhbkSyncWriteContactTest_08"));
	}

CPhbkSyncWriteContactTest_08::~CPhbkSyncWriteContactTest_08()
	{
	}

TVerdict CPhbkSyncWriteContactTest_08::doTestStepL( )
	{
	_LIT16(KT61NumberTooLong,"12345678901234567890123456789012345678901234567890");

	TInt i(0);
	for (i=0; i<KTotalNumberOfPhoneBook; i++) 
		{ 
		ChangeSyncModeL(RPhoneBookSession::EAutoCurrentIcc, iPhoneBook[i]);
		CheckSyncModeL(RPhoneBookSession::EAutoCurrentIcc, iPhoneBook[i]);
		}

	// load the dummy test which contains all phonebooks
	SetSimTsyTestNumberL(0);

	// wait until all phonebooks have been synchronised
	for (i=0; i<KTotalNumberOfPhoneBook; i++) 
		{ 
		CheckCacheStateValidL(iPhoneBook[i]);
		}

	// to create an entry with internal (long/new) format and initialise it
	MyCSyncContactICCEntry* iccEntryInternalNew = MyCSyncContactICCEntry::NewL();
	CleanupStack::PushL(iccEntryInternalNew);
	InitialiseIccEntryInternalNewL(iccEntryInternalNew);

	// set the phone number >> max no. of allowed digits 
	iccEntryInternalNew->iNumber.Format(KT61NumberTooLong);

	// to call the DoWriteContactL to do the real business
	TRequestStatus status;
	for (i=0; i<KTotalNumberOfPhoneBook; i++) 
		{
		// set the corresponding phonebook
		iccEntryInternalNew->iPhonebook = convertPhonebookUid2Enum(iPhoneBook[i]); 

		// do the real test by writing an entry to ICC
		DoWriteContactToICCL(iccEntryInternalNew, iPhoneBook[i], status);

		// check result
		TESTCHECK(status.Int(), KErrPhonebookNumberOverflow);
		}
	CleanupStack::PopAndDestroy();
	return TestStepResult();
	}

/**
 * Test writing a contact, where all the contact fields are
 * valid. the name field contains obscure characters
 * (anything other than letters) and the phone number field
 * contains "+" "p" "w".
 */
//
//    Test step9 -- Test#62 in Unit Test Spec. Doc.  //
//
CPhbkSyncWriteContactTest_09::CPhbkSyncWriteContactTest_09()
	{
	// store the name of this test step
	SetTestStepName(_L("PhbkSyncWriteContactTest_09"));
	}

CPhbkSyncWriteContactTest_09::~CPhbkSyncWriteContactTest_09()
	{
	}

TVerdict CPhbkSyncWriteContactTest_09::doTestStepL( )
	{
	_LIT16(KT62Number,"+1234p678901234w23456789");// < 41 digits
	_LIT16(KT62Name,"abcd*(&^%$\xa3_=><MJN<.<>+klmn60wxyz789"); // < 47 chars

	TInt i(0);
	for (i=0; i<KTotalNumberOfPhoneBook; i++) 
		{ 
		ChangeSyncModeL(RPhoneBookSession::EAutoCurrentIcc, iPhoneBook[i]);
		CheckSyncModeL(RPhoneBookSession::EAutoCurrentIcc, iPhoneBook[i]);
		}

	// load the dummy test which contains all phonebooks
	SetSimTsyTestNumberL(0);

	// wait until all phonebooks have been synchronised
	for (i=0; i<KTotalNumberOfPhoneBook; i++) 
		{ 
		CheckCacheStateValidL(iPhoneBook[i]);
		}

	// to create an entry with internal format and initialise it
	MyCSyncContactICCEntry* iccEntryInternalNew = MyCSyncContactICCEntry::NewL();
	CleanupStack::PushL(iccEntryInternalNew);
	InitialiseIccEntryInternalNewL(iccEntryInternalNew);

	// set the name < max no. of allowed characters
	TInt count = iccEntryInternalNew->iNameList->Count();
	for(i=0; i<count; i++) 
		{
		iccEntryInternalNew->iNameList->At(i).Copy(KT62Name);
		}

	// set the phone number < max no. of allowed digits 
	iccEntryInternalNew->iNumber.Format(KT62Number);

	// to call the DoWriteContactL to do the real business
	TRequestStatus status;
	for (i=0; i<KTotalNumberOfPhoneBook; i++) 
		{
		// set the corresponding phonebook
		iccEntryInternalNew->iPhonebook = convertPhonebookUid2Enum(iPhoneBook[i]); 

		// do the real test by writing an entry to ICC
		DoWriteContactToICCL(iccEntryInternalNew, iPhoneBook[i], status);

		// check result
		TESTCHECK(status.Int(), KErrNone);
		}
	CleanupStack::PopAndDestroy(); 
	return TestStepResult();
	}

/**
 * Test writing a contact, where all the contact fields are
 * valid except the phone no. which contains letters.
 */
//
//    Test step10 -- Test#63 in Unit Test Spec. Doc.  //
//
CPhbkSyncWriteContactTest_10::CPhbkSyncWriteContactTest_10()
	{
	// store the name of this test step
	SetTestStepName(_L("PhbkSyncWriteContactTest_10"));
	}

CPhbkSyncWriteContactTest_10::~CPhbkSyncWriteContactTest_10()
	{
	}

TVerdict CPhbkSyncWriteContactTest_10::doTestStepL( )
	{
	_LIT16(KT63Number,"12345characters1234567890");// < 41 digits defined in [test0]

	TInt i(0);

	for (i=0; i<KTotalNumberOfPhoneBook; i++) 
		{ 
		ChangeSyncModeL(RPhoneBookSession::EAutoCurrentIcc, iPhoneBook[i]);
		CheckSyncModeL(RPhoneBookSession::EAutoCurrentIcc, iPhoneBook[i]);
		}

	// load the dummy test which contains all phonebooks
	SetSimTsyTestNumberL(0);

	// wait until all phonebooks have been synchronised
	for (i=0; i<KTotalNumberOfPhoneBook; i++) 
		{ 
		CheckCacheStateValidL(iPhoneBook[i]);
		}

	// to create an entry with internal format and initialise it
	MyCSyncContactICCEntry* iccEntryInternalNew = MyCSyncContactICCEntry::NewL();
	CleanupStack::PushL(iccEntryInternalNew);
	InitialiseIccEntryInternalNewL(iccEntryInternalNew);

	// set the phone number which contains letters
	iccEntryInternalNew->iNumber.Format(KT63Number);

	// to call the DoWriteContactL to do the real business
	TRequestStatus status;
	for (i=0; i<KTotalNumberOfPhoneBook; i++) 
		{
		// set the corresponding phonebook
		iccEntryInternalNew->iPhonebook = convertPhonebookUid2Enum(iPhoneBook[i]); 

		// do the real test by writing an entry to ICC
		DoWriteContactToICCL(iccEntryInternalNew, iPhoneBook[i], status);

		// check result
		// KErrArgument is expected, but TSY doesn't reutrn this.
//		TESTCHECK(status.Int(), KErrArgument);

		// TSY doesn't check number containing letters and it simply returns KErrNone.
		TESTCHECK(status.Int(), KErrNone);
		}
	CleanupStack::PopAndDestroy(); 
	return TestStepResult();
	}

/**
 * Test writing a contact, where all the contact fields are
 * valid, but an error occurs when writing to the ICC.
 * Repeat this test case but with an error because the ICC
 * has become locked/blocked.
 */
//
//    Test step11 -- Test#64 in Unit Test Spec. Doc.  //
//
CPhbkSyncWriteContactTest_11::CPhbkSyncWriteContactTest_11()
	{
	// store the name of this test step
	SetTestStepName(_L("PhbkSyncWriteContactTest_11"));
	}

CPhbkSyncWriteContactTest_11::~CPhbkSyncWriteContactTest_11()
	{
	}

TVerdict CPhbkSyncWriteContactTest_11::doTestStepL( )
	{
	TInt i(0);
	for (i=0; i<KTotalNumberOfPhoneBook; i++) 
		{ 
		ChangeSyncModeL(RPhoneBookSession::EAutoCurrentIcc, iPhoneBook[i]);
		CheckSyncModeL(RPhoneBookSession::EAutoCurrentIcc, iPhoneBook[i]);
		}

	// load the test and no phonebook should be synchronised due to 
	// locking/blocking
	SetSimTsyTestNumberL(38); // re-use the test prepared for Test#38

	// wait until all phonebooks have been synchronised
	for (i=0; i<KTotalNumberOfPhoneBook; i++) 
		{ 
		CheckCacheStateValidL(iPhoneBook[i]);
		}

	// get a valid UID for each phonebook and keep them somewhere
	for (i=0; i<KTotalNumberOfPhoneBook; i++) 
		{ 
		 GetValidUIDFromContactsDbL(iPhoneBook[i]);
		}

	// Wait for ICC to become locked 
	WaitForIccToBecomeLockedL();

	// to create an entry with internal format and initialise it
	MyCSyncContactICCEntry* iccEntryInternalNew = MyCSyncContactICCEntry::NewL();
	CleanupStack::PushL(iccEntryInternalNew);
	InitialiseIccEntryInternalNewL(iccEntryInternalNew);

	// to call the DoWriteContactL to do the real business
	TRequestStatus status;

	for (i=0; i<KTotalNumberOfPhoneBook; i++) 
		{
		// set the corresponding phonebook
		iccEntryInternalNew->iPhonebook = convertPhonebookUid2Enum(iPhoneBook[i]); 

		// do the real test by writing an entry to ICC
		DoWriteContactToICCL(iccEntryInternalNew, iPhoneBook[i], status);

		// check result
		TESTCHECK(status.Int(), KErrAccessDenied);
		}
	CleanupStack::PopAndDestroy(); 
	return TestStepResult();
	}

/**
 * Test writing acontact where all the contact fields are
 * valid except the name which is blank.
 */
//
//    Test step12 -- Test#65 in Unit Test Spec. Doc.  //
//
CPhbkSyncWriteContactTest_12::CPhbkSyncWriteContactTest_12()
	{
	// store the name of this test step
	SetTestStepName(_L("PhbkSyncWriteContactTest_12"));
	}

CPhbkSyncWriteContactTest_12::~CPhbkSyncWriteContactTest_12()
	{
	}

TVerdict CPhbkSyncWriteContactTest_12::doTestStepL( )
	{
	_LIT16(KT65Name,""); // empty name

	TInt i(0);
	for (i=0; i<KTotalNumberOfPhoneBook; i++) 
		{ 
		ChangeSyncModeL(RPhoneBookSession::EAutoCurrentIcc, iPhoneBook[i]);
		CheckSyncModeL(RPhoneBookSession::EAutoCurrentIcc, iPhoneBook[i]);
		}

	// load the dummy test which contains all phonebooks
	SetSimTsyTestNumberL(0);

	// wait until all phonebooks have been synchronised
	for (i=0; i<KTotalNumberOfPhoneBook; i++) 
		{ 
		CheckCacheStateValidL(iPhoneBook[i]);
		}

	// to create an entry with internal format and initialise it
	MyCSyncContactICCEntry* iccEntryInternalNew = MyCSyncContactICCEntry::NewL();
	CleanupStack::PushL(iccEntryInternalNew);
	InitialiseIccEntryInternalNewL(iccEntryInternalNew);

	TInt count = iccEntryInternalNew->iNameList->Count();
	for(i=0; i<count; i++) 
		{
		iccEntryInternalNew->iNameList->At(i).Copy(KT65Name); // set blank name
		}

	// to call the DoWriteContactL to do the real business
	TRequestStatus status;

	for (i=0; i<KTotalNumberOfPhoneBook; i++) 
		{
		// set the corresponding phonebook
		iccEntryInternalNew->iPhonebook = convertPhonebookUid2Enum(iPhoneBook[i]); 

		// do the real test by writing an entry to ICC
		DoWriteContactToICCL(iccEntryInternalNew, iPhoneBook[i], status);

		// check result
		TESTCHECK(status.Int(), KErrNone);
		}
	CleanupStack::PopAndDestroy(); 
	return TestStepResult();
	}

/**
 * Test writing a contact where all the contact fields are
 * valid except the phone number which is blank.
 */
//
//    Test step13 -- Test#66 in Unit Test Spec. Doc.  //
//
CPhbkSyncWriteContactTest_13::CPhbkSyncWriteContactTest_13()
	{
	// store the name of this test step
	SetTestStepName(_L("PhbkSyncWriteContactTest_13"));
	}

CPhbkSyncWriteContactTest_13::~CPhbkSyncWriteContactTest_13()
	{
	}

TVerdict CPhbkSyncWriteContactTest_13::doTestStepL( )
	{
	_LIT16(KT66Number,""); // empty number

	TInt i(0);

	for (i=0; i<KTotalNumberOfPhoneBook; i++) 
		{ 
		ChangeSyncModeL(RPhoneBookSession::EAutoCurrentIcc, iPhoneBook[i]);
		CheckSyncModeL(RPhoneBookSession::EAutoCurrentIcc, iPhoneBook[i]);
		}

	// load the dummy test which contains all phonebooks
	SetSimTsyTestNumberL(0);

	// wait until all phonebooks have been synchronised
	for (i=0; i<KTotalNumberOfPhoneBook; i++) 
		{ 
		CheckCacheStateValidL(iPhoneBook[i]);
		}

	// to create an entry with internal format and initialise it
	MyCSyncContactICCEntry* iccEntryInternalNew = MyCSyncContactICCEntry::NewL();
	CleanupStack::PushL(iccEntryInternalNew);
	InitialiseIccEntryInternalNewL(iccEntryInternalNew);

	// set the phone number which contains letters
	iccEntryInternalNew->iNumber.Format(KT66Number);  // set blank number

	// to call the DoWriteContactL to do the real business
	TRequestStatus status;
	for (i=0; i<KTotalNumberOfPhoneBook; i++) 
		{
		// set the corresponding phonebook
		iccEntryInternalNew->iPhonebook = convertPhonebookUid2Enum(iPhoneBook[i]); 

		// do the real test by writing an entry to ICC
		DoWriteContactToICCL(iccEntryInternalNew, iPhoneBook[i], status);

		// check result
		// KErrArgument is expected, but TSY doesn't reutrn this.
//		TESTCHECK(status.Int(), KErrArgument);

		// TSY doesn't consider blank number as invalid and it simply returns KErrNone.
		TESTCHECK(status.Int(), KErrNone);
		}
	CleanupStack::PopAndDestroy(); 
	return TestStepResult();
	}

/**
 * Test writing a contact to a read only phonebook (SDN).
 */
//
//    Test step14 -- Test#67 in Unit Test Spec. Doc.  //
//
CPhbkSyncWriteContactTest_14::CPhbkSyncWriteContactTest_14()
	{
	// store the name of this test step
	SetTestStepName(_L("PhbkSyncWriteContactTest_14"));
	}

CPhbkSyncWriteContactTest_14::~CPhbkSyncWriteContactTest_14()
	{
	}

TVerdict CPhbkSyncWriteContactTest_14::doTestStepL( )
	{
	TInt i(0);
	for (i=0; i<KTotalNumberOfPhoneBook; i++) 
		{ 
		ChangeSyncModeL(RPhoneBookSession::EAutoCurrentIcc, iPhoneBook[i]);
		CheckSyncModeL(RPhoneBookSession::EAutoCurrentIcc, iPhoneBook[i]);
		}

	SetSimTsyTestNumberL(67);  // SDN and LND are read only

	// to create a new entry with internal (long/new) format and initialise it
	MyCSyncContactICCEntry* iccEntryInternalNew = MyCSyncContactICCEntry::NewL();
	CleanupStack::PushL(iccEntryInternalNew);
	InitialiseIccEntryInternalNewL(iccEntryInternalNew);

	// to call the DoWriteContactL
	TRequestStatus status;
	for (i=0; i<KTotalNumberOfPhoneBook; i++) 
		{
		// set the corresponding entry attributes
		if (iPhoneBook[i] == KUidIccGlobalSdnPhonebook ||
			iPhoneBook[i] == KUidIccGlobalLndPhonebook) 
			{
			// slot 1-4 is guaranteed free in phonebooks (see cfg. file)
			iccEntryInternalNew->iSlotNum = i+1; 
			iccEntryInternalNew->iPhonebook = convertPhonebookUid2Enum(iPhoneBook[i]); 
			// do the real test by writing an entry to ICC
			DoWriteContactToICCL(iccEntryInternalNew, iPhoneBook[i], status);

			// check result
			TESTCHECK(status.Int(), KErrAccessDenied);
			}
		}
	CleanupStack::PopAndDestroy(); 
	return TestStepResult();
	}

/**
 * Test writing a contact, where the slot number is not specified.
 */
//
//    Test step15 -- Test#68 in Unit Test Spec. Doc.  //
//
CPhbkSyncWriteContactTest_15::CPhbkSyncWriteContactTest_15()
	{
	// store the name of this test step
	SetTestStepName(_L("PhbkSyncWriteContactTest_15"));
	}

CPhbkSyncWriteContactTest_15::~CPhbkSyncWriteContactTest_15()
	{
	}

TVerdict CPhbkSyncWriteContactTest_15::doTestStepL( )
	{
	// =============================================================
	// *** This test is covered by combining Test#55 and Test#56 ***
	// =============================================================

	return TestStepResult();
	}

/**
 * Test writing (editing) a contact, where the contact is a
 * hidden entry and the hidden key has not been verified.
 */
//
//    Test step16 -- Test#69 in Unit Test Spec. Doc.  //
//
CPhbkSyncWriteContactTest_16::CPhbkSyncWriteContactTest_16()
	{
	// store the name of this test step
	SetTestStepName(_L("PhbkSyncWriteContactTest_16"));
	}

CPhbkSyncWriteContactTest_16::~CPhbkSyncWriteContactTest_16()
	{
	}

TVerdict CPhbkSyncWriteContactTest_16::doTestStepL( )
	{
	// =============================================================
	// *** This test situation cannot be created in cfg. file    ***
	// =============================================================

	return TestStepResult();
	}

/**
 * Test writing a new hidden entry without the hidden key
 * being verified.
 */
//
//    Test step17 -- Test#70 in Unit Test Spec. Doc.  //
//
CPhbkSyncWriteContactTest_17::CPhbkSyncWriteContactTest_17()
	{
	// store the name of this test step
	SetTestStepName(_L("PhbkSyncWriteContactTest_17"));
	}

CPhbkSyncWriteContactTest_17::~CPhbkSyncWriteContactTest_17()
	{
	}

TVerdict CPhbkSyncWriteContactTest_17::doTestStepL( )
	{
	// set mode as EAutoCurrentIcc for Global/GSM ADN and USim App ADN
	TInt i(0);
	for (i=0; i<KTotalNumberOfPhoneBook; i++) 
		{ 
		if ((iPhoneBook[i] != KUidIccGlobalSdnPhonebook) && 
		    (iPhoneBook[i] != KUidIccGlobalLndPhonebook) &&
			(iPhoneBook[i] != KUidIccGlobalFdnPhonebook))
			{ // exclude SDN, LND and FDN
			User::LeaveIfError(iSession.SetSyncMode(RPhoneBookSession::EAutoCurrentIcc, iPhoneBook[i]));
			CheckSyncModeL(RPhoneBookSession::EAutoCurrentIcc, iPhoneBook[i]);
			}
		}

	// load Global/GSM ADN and USim App ADN phonebooks
	SetSimTsyTestNumberL(70);

	// wait for at least 20 seconds (see [test69] in cfg. file) until the hidden key
	// tag effective which will block hidden entry write.
	User::After(23*KOneSeconduS);

	// now, we should get denied when writting into the locations of hidden entries.
	MyCSyncContactICCEntry* iccEntryInternalNew = MyCSyncContactICCEntry::NewL();
	CleanupStack::PushL(iccEntryInternalNew);
	InitialiseIccEntryInternalNewL(iccEntryInternalNew);

	// since it is not clear how to get the whole CContactICCEntry object from 
	// CContactDatabase and re-write it back to ICC, a new hidden entry will
	// be created and its slot number is the same as the one used by the real
	// hidden entry in ICC. This should do the same job as fas as DoWriteContact 
	// is concerned.
	iccEntryInternalNew->iIsHidden = ETrue;
	TRequestStatus status; 

	for (i=0; i<KTotalNumberOfPhoneBook; i++) 
		{
		if ((iPhoneBook[i] != KUidIccGlobalSdnPhonebook) &&
			(iPhoneBook[i] != KUidIccGlobalLndPhonebook) &&
			(iPhoneBook[i] != KUidIccGlobalFdnPhonebook))
			{ // excluse SDN and LND
			iccEntryInternalNew->iPhonebook = convertPhonebookUid2Enum(iPhoneBook[i]);
			DoWriteContactToICCL(iccEntryInternalNew, iPhoneBook[i], status);
			TESTCHECK(status.Int(), KErrAccessDenied); // check result
			}
		}
	CleanupStack::PopAndDestroy(); 
	return TestStepResult();
	}

/**
 * Test writing a new hidden entry after the hidden key 
 * has been verified.
 */
//
//    Test step18 -- Test#71 in Unit Test Spec. Doc.  //
//
CPhbkSyncWriteContactTest_18::CPhbkSyncWriteContactTest_18()
	{
	// store the name of this test step
	SetTestStepName(_L("PhbkSyncWriteContactTest_18"));
	}

CPhbkSyncWriteContactTest_18::~CPhbkSyncWriteContactTest_18()
	{
	}

TVerdict CPhbkSyncWriteContactTest_18::doTestStepL( )
{
	// set mode as EAutoCurrentIcc for Global/GSM ADN and USim App ADN
	TInt i(0);
	for (i=0; i<KTotalNumberOfPhoneBook; i++) 
		{ 
		if ((iPhoneBook[i] != KUidIccGlobalSdnPhonebook) &&
			(iPhoneBook[i] != KUidIccGlobalLndPhonebook) &&
			(iPhoneBook[i] != KUidIccGlobalFdnPhonebook))
			{ // exclude SDN and LND
			User::LeaveIfError(iSession.SetSyncMode(RPhoneBookSession::EAutoCurrentIcc, iPhoneBook[i]));
			CheckSyncModeL(RPhoneBookSession::EAutoCurrentIcc, iPhoneBook[i]);
		}
	}

	SetSimTsyTestNumberL(71);

	// wait for at least 20 seconds until the hidden key verified event is trigged
	User::After(23*KOneSeconduS);

	// now, we shouldn't get denied when writting a new hidden entry into ICC
	MyCSyncContactICCEntry* iccEntryInternalNew = MyCSyncContactICCEntry::NewL();
	CleanupStack::PushL(iccEntryInternalNew);
	InitialiseIccEntryInternalNewL(iccEntryInternalNew);
	iccEntryInternalNew->iIsHidden = ETrue;

	TRequestStatus status; 
	for (i=0; i<KTotalNumberOfPhoneBook; i++) 
		{
		if ((iPhoneBook[i] != KUidIccGlobalSdnPhonebook) &&
			(iPhoneBook[i] != KUidIccGlobalLndPhonebook) &&
			(iPhoneBook[i] != KUidIccGlobalFdnPhonebook))
			{ // exclude SDN and LND
			iccEntryInternalNew->iPhonebook = convertPhonebookUid2Enum(iPhoneBook[i]);
			DoWriteContactToICCL(iccEntryInternalNew, iPhoneBook[i], status);
			TESTCHECK(status.Int(), KErrNone); // check result
			}
		}
	CleanupStack::PopAndDestroy(); 
	return TestStepResult();
	}

/**
 * Test writing a new contact, which also contains an invalid
 * field.
 */
//
//    Test step19 -- Test#72 in Unit Test Spec. Doc.  //
//
CPhbkSyncWriteContactTest_19::CPhbkSyncWriteContactTest_19()
	{
	// store the name of this test step
	SetTestStepName(_L("PhbkSyncWriteContactTest_19"));
	}

CPhbkSyncWriteContactTest_19::~CPhbkSyncWriteContactTest_19()
	{
	}

TVerdict CPhbkSyncWriteContactTest_19::doTestStepL( )
	{
	_LIT16(KTelWithLetters,"5678943Abc34");

	// set mode as EAutoCurrentIcc for all phonebooks
	TInt i(0);
	for (i=0; i<KTotalNumberOfPhoneBook; i++) 
		{ 
		User::LeaveIfError(iSession.SetSyncMode(RPhoneBookSession::EAutoCurrentIcc, iPhoneBook[i]));
		CheckSyncModeL(RPhoneBookSession::EAutoCurrentIcc, iPhoneBook[i]);
		}

	// load the dummy test which contains all phonebooks
	SetSimTsyTestNumberL(0);

	// wait until all phonebooks have been synchronised
	for (i=0; i<KTotalNumberOfPhoneBook; i++) 
		{ 
		CheckCacheStateValidL(iPhoneBook[i]);
		}

	// try to write a new contact containing invalid field to ICC
	MyCSyncContactICCEntry* iccEntryInternalNew = MyCSyncContactICCEntry::NewL();
	CleanupStack::PushL(iccEntryInternalNew);
	InitialiseIccEntryInternalNewL(iccEntryInternalNew);

	// set an invalid number to iNumber field
	iccEntryInternalNew->iNumber.Format(KTelWithLetters);

	TRequestStatus status; 
	for (i=0; i<KTotalNumberOfPhoneBook; i++) 
		{
		iccEntryInternalNew->iPhonebook = convertPhonebookUid2Enum(iPhoneBook[i]);
		DoWriteContactToICCL(iccEntryInternalNew, iPhoneBook[i], status);

		// TSY doesn't consider the number containing letters as invalid.
//		TESTCHECK(status.Int(), KErrArgument); // check result
		TESTCHECK(status.Int(), KErrNone); // check result
		}
	CleanupStack::PopAndDestroy(); 
	return TestStepResult();
	}

/**
 * Test writing a contact, where all the contact fields are valid.
 * Repeat for all supported phonebooks.
 */
//
//    Test step22 -- Test#88 in Unit Test Spec. Doc. //
//
CPhbkSyncWriteContactTest_22::CPhbkSyncWriteContactTest_22()
	{
	// store the name of this test step
	SetTestStepName(_L("PhbkSyncWriteContactTest_22"));
	}

CPhbkSyncWriteContactTest_22::~CPhbkSyncWriteContactTest_22()
	{
	}

TVerdict CPhbkSyncWriteContactTest_22::doTestStepL( )
	{
	TInt i(0);
	for (i=0; i<KTotalNumberOfPhoneBook; i++) 
		{ 
		ChangeSyncModeL(RPhoneBookSession::EAutoCurrentIcc, iPhoneBook[i]);
		CheckSyncModeL(RPhoneBookSession::EAutoCurrentIcc, iPhoneBook[i]);
		}

	SetSimTsyTestNumberL(91);

	// wait until all phonebooks have been synchronised
	for (i=0; i<KTotalNumberOfPhoneBook; i++) 
		{ 
		CheckCacheStateValidL(iPhoneBook[i]);
		}

	// to create a new entry with internal (long/new) format and initialise it
	MyCSyncContactICCEntry* iccEntryInternalNew = MyCSyncContactICCEntry::NewL();
	CleanupStack::PushL(iccEntryInternalNew); 
	InitialiseIccEntryInternalNewL(iccEntryInternalNew);

	// to create an old entry with internal (short/old) format and initialise it
	MyCSyncContactICCEntry* iccEntryInternalOld = MyCSyncContactICCEntry::NewL();
	CleanupStack::PushL(iccEntryInternalOld);
	InitialiseIccEntryInternalOldL(iccEntryInternalOld);

	// to call the DoWriteContactL
	TRequestStatus status;
	for (i=0; i<KTotalNumberOfPhoneBook; i++) 
		{
		// set the corresponding entry attributes
		if (iPhoneBook[i] == KUidIccGlobalSdnPhonebook ||
			iPhoneBook[i] == KUidIccGlobalLndPhonebook) 
			{
			// slot 1-4 is guaranteed free in phonebooks (see [test91] in cfg. file)
			iccEntryInternalOld->iSlotNum = i+1; 
			iccEntryInternalOld->iPhonebook = convertPhonebookUid2Enum(iPhoneBook[i]); 
			// do the real test by writing an entry to ICC
			DoWriteContactToICCL(iccEntryInternalOld, iPhoneBook[i], status);
			}
		else 
			{
			// slot 1-4 is guaranteed free in phonebooks (see [test91] in cfg. file)
			iccEntryInternalNew->iSlotNum = i+1; 
			iccEntryInternalNew->iPhonebook = convertPhonebookUid2Enum(iPhoneBook[i]); 
			// do the real test by writing an entry to ICC
			DoWriteContactToICCL(iccEntryInternalNew, iPhoneBook[i], status);
			}

		// check result
		TESTCHECK(status.Int(), KErrNone);
		TESTCHECKCONDITION(iccEntryInternalNew->iSlotNum != KSyncIndexNotSupplied);
		}
	CleanupStack::PopAndDestroy(2); 
	return TestStepResult();
	}