pimprotocols/phonebooksync/Test/TE_cntsync/te_cntsyncbase.cpp
changeset 0 e686773b3f54
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/pimprotocols/phonebooksync/Test/TE_cntsync/te_cntsyncbase.cpp	Tue Feb 02 10:12:17 2010 +0200
@@ -0,0 +1,544 @@
+// Copyright (c) 2004-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 <c32comm.h>
+#include <f32file.h>
+
+#include <e32base.h>
+#include <e32test.h>
+#include <e32svr.h>
+#include <c32root.h>
+#include <e32property.h>
+
+#include "te_cntsyncadd.h"
+#include "te_cntsyncdelete.h"
+#include "te_cntsyncedit.h"
+#include "te_cntsyncfind.h"
+#include "te_cntsyncread.h"
+#include "te_cntsyncstress.h"
+#include "te_cntsyncbase.h"
+#include "te_cntsyncsync.h"
+#include "te_cntsyncutils.h"
+#include "te_cntsyncview.h"
+
+#include <e32property.h> 
+
+
+const	TInt KTestStringSize=30;
+typedef TBuf<KTestStringSize> TTestString;
+
+#if defined (__WINS__)
+#define PDD_NAME _L("ECDRV")
+#define LDD_NAME _L("ECOMM")
+#else
+#define PDD_NAME _L("EUART1")
+#define LDD_NAME _L("ECOMM")
+#endif
+
+#include "te_cntsyncbase.h"
+
+ 
+/**
+ 	Instruct the PhBkSync server to configure to a 'Full' state
+ 	by using the Secure Backup interface. This will cause the
+ 	server to reconnect to ETel and SIMTSY.
+ */
+void CCntSyncTestStep::ConfigurePhbkSyncToFullL()
+	{
+	//
+	// Ensure that the Secure Backup system does not currently think
+	// it is performing a backup or restore.
+	//
+ 	iSecureBackupEngine->SetBURModeL(TDriveList(_L8("C")),
+ 									 EBURNormal, ENoBackup);
+
+	//
+	// Connect to the server to ensure that the server is running and
+	// responding.
+	//
+	RPhoneBookSession  phoneBookSession;
+	RPhoneBookSession::TPhonebookSyncMode  dummySyncMode;
+	TInt ret;
+	
+	ret = phoneBookSession.Connect();
+	TESTCHECKL(ret, KErrNone);
+
+	ret = KErrNotReady;
+	while (ret != KErrNone)
+		{
+		ret = phoneBookSession.GetSyncMode(dummySyncMode);
+		if (ret != KErrNone)
+			{
+			User::After(1);
+			}
+		}
+
+	phoneBookSession.Close();
+	} // CCntSyncTestStep::ConfigurePhbkSyncToFullL
+
+
+/**
+ 	Instruct the PhBkSync server to unconfigure to an 'Idle' state
+ 	by using the Secure Backup interface. This will cause the
+ 	server to disconnect from ETel and SIMTSY. This is effectively
+ 	the same as shutting down the server, but can be performed on
+ 	release versions.
+ */
+void CCntSyncTestStep::ConfigurePhbkSyncToIdleL()
+	{
+	//
+	// Connect to the server to ensure that the server is running.
+	//
+	RPhoneBookSession  phoneBookSession;
+	TInt ret;
+	
+	ret = phoneBookSession.Connect();
+	TESTCHECKL(ret, KErrNone);
+
+	//
+	// Ensure that the Secure Backup system does not currently think
+	// it is performing a backup or restore.
+	//
+ 	iSecureBackupEngine->SetBURModeL(TDriveList(_L8("C")),
+ 									 EBURBackupFull, EBackupBase);
+
+	//
+	// Check that the server is responding.
+	//
+	RPhoneBookSession::TPhonebookSyncMode  dummySyncMode;
+
+	ret = KErrNone;
+	while (ret == KErrNone)
+		{
+		ret = phoneBookSession.GetSyncMode(dummySyncMode);
+		if (ret == KErrNone)
+			{
+			User::After(1);
+			}
+		}
+
+	phoneBookSession.Close();
+	} // CCntSyncTestStep::ConfigurePhbkSyncToIdleL
+	
+
+/** 
+ * Set the synchronisation mode as aMode
+ * @param aMode RPhoneBookSession::TPhonebookSyncMode enumeration
+ */
+void CCntSyncTestStep::SetSyncModeL(RPhoneBookSession::TPhonebookSyncMode aMode)
+	{
+	User::LeaveIfError(iSession.SetSyncMode(aMode));
+	User::LeaveIfError(iSession.SetSyncMode(aMode, KUidIccGlobalSdnPhonebook));
+	User::LeaveIfError(iSession.SetSyncMode(aMode, KUidIccGlobalLndPhonebook));
+	User::LeaveIfError(iSession.SetSyncMode(aMode, KUidUsimAppAdnPhonebook));
+	User::LeaveIfError(iSession.SetSyncMode(aMode, KUidIccGlobalFdnPhonebook));
+	}
+
+
+/** 
+ * Check the synchronisation mode is the same as aMode
+ * @param aMode RPhoneBookSession::TPhonebookSyncMode enumeration
+ */
+void CCntSyncTestStep::CheckSyncModeL(RPhoneBookSession::TPhonebookSyncMode aMode)
+	{
+	RPhoneBookSession::TPhonebookSyncMode mode;
+	User::LeaveIfError(iSession.GetSyncMode(mode));
+	TESTCHECK(mode, aMode);
+	User::LeaveIfError(iSession.GetSyncMode(mode, KUidIccGlobalSdnPhonebook));
+	TESTCHECK(mode, aMode);
+	User::LeaveIfError(iSession.GetSyncMode(mode, KUidIccGlobalLndPhonebook));
+	TESTCHECK(mode, aMode);
+	User::LeaveIfError(iSession.GetSyncMode(mode, KUidUsimAppAdnPhonebook));
+	TESTCHECK(mode, aMode);
+	User::LeaveIfError(iSession.GetSyncMode(mode, KUidIccGlobalFdnPhonebook));
+	TESTCHECK(mode, aMode);
+	}
+
+
+/** 
+ *  Check the synchronisation state is aStat
+ *
+ *  @param aState  An expected sync state enumeration value.
+ */
+void CCntSyncTestStep::CheckCacheStateL(RPhoneBookSession::TSyncState aState)
+	{
+	RPhoneBookSession::TSyncState state;
+	TInt ret;
+	
+	ret = iSession.GetPhoneBookCacheState(state, KUidIccGlobalAdnPhonebook);
+	if (ret != KErrNone  &&  ret != KErrNotReady)
+		{
+		User::Leave(ret);
+		}
+	TESTCHECK(state, aState);
+
+	ret = iSession.GetPhoneBookCacheState(state, KUidIccGlobalSdnPhonebook);
+	if (ret != KErrNone  &&  ret != KErrNotReady)
+		{
+		User::Leave(ret);
+		}
+	TESTCHECK(state, aState);
+
+	ret = iSession.GetPhoneBookCacheState(state, KUidIccGlobalLndPhonebook);
+	if (ret != KErrNone  &&  ret != KErrNotReady)
+		{
+		User::Leave(ret);
+		}
+	TESTCHECK(state, aState);
+
+	ret = iSession.GetPhoneBookCacheState(state, KUidUsimAppAdnPhonebook);
+	if (ret != KErrNone  &&  ret != KErrNotReady)
+		{
+		User::Leave(ret);
+		}
+	TESTCHECK(state, aState);
+
+	ret = iSession.GetPhoneBookCacheState(state, KUidIccGlobalFdnPhonebook);
+	if (ret != KErrNone  &&  ret != KErrNotReady)
+		{
+		User::Leave(ret);
+		}
+	TESTCHECK(state, aState);
+	}
+
+TVerdict CCntSyncTestStep::doTestStepPreambleL()
+	{
+	__UHEAP_MARK;	//mark for memory leaks!!
+
+	iScheduler=new(ELeave) CActiveScheduler;
+	CActiveScheduler::Install(iScheduler);
+	
+	iSecureBackupEngine = CSBEClient::NewL();
+ 	iSecureBackupEngine->SetBURModeL(TDriveList(_L8("C")),
+ 									 EBURNormal, ENoBackup);
+
+	TInt  ret = iSession.Connect();
+	TESTCHECKL(ret, KErrNone);
+
+	//
+	// Open the existing database or create a new one.
+	//
+	TRAPD(err, iDb = OpenOrCreateContactDatabaseL());
+	TESTCHECKL(err, KErrNone);
+
+	return TestStepResult() ;
+	}
+
+TVerdict CCntSyncTestStep::doTestStepPostambleL()
+	{
+	delete iDb;
+	iDb=NULL;
+
+	iSession.Close();
+
+	delete iSecureBackupEngine;
+	iSecureBackupEngine = NULL;
+	
+	delete iScheduler;
+	iScheduler = NULL;
+
+	__UHEAP_MARKEND;
+
+ 	return TestStepResult() ;
+	}
+
+
+/** 
+ * Set the SIM TSY test number to run
+ *
+ */
+void CCntSyncTestStep::SetSimTsyTestNumberL(TInt aTestNumber)
+	{
+	RProperty testNumberProperty;
+	User::LeaveIfError(testNumberProperty.Attach(KUidPSSimTsyCategory, KPSSimTsyTestNumber));
+	CleanupClosePushL(testNumberProperty);
+
+	TRequestStatus status;
+	testNumberProperty.Subscribe(status);
+	User::LeaveIfError(testNumberProperty.Set(KUidPSSimTsyCategory,KPSSimTsyTestNumber,aTestNumber));
+	User::WaitForRequest(status);
+	User::LeaveIfError(status.Int());
+	TInt testNumberCheck;
+	User::LeaveIfError(testNumberProperty.Get(testNumberCheck));
+	if (aTestNumber != testNumberCheck)
+		{
+		User::Leave(KErrNotFound);		
+		}
+
+	CleanupStack::PopAndDestroy(&testNumberProperty);
+	
+ 	delete iDb;
+ 	iDb=NULL;
+
+	iSession.Close();
+
+	//
+	// Ensure that the server resets its configuration....
+	//
+	ConfigurePhbkSyncToIdleL();
+	ConfigurePhbkSyncToFullL();
+
+	iDb = OpenOrCreateContactDatabaseL();
+
+	User::LeaveIfError(iSession.Connect());
+		
+	// Ensure that the test number has been set properly
+	RProperty testNumberInUseProperty;
+	User::LeaveIfError(testNumberInUseProperty.Attach(KUidPSSimTsyCategory, KPSSimTsyTestNumberInUse));
+	CleanupClosePushL(testNumberInUseProperty);
+
+	TInt testNumberInUseCheck;
+	User::LeaveIfError(testNumberInUseProperty.Get(KUidPSSimTsyCategory, KPSSimTsyTestNumberInUse,testNumberInUseCheck));
+	TESTCHECKL(aTestNumber,testNumberInUseCheck);
+
+	CleanupStack::PopAndDestroy(&testNumberInUseProperty);
+	
+	} // CCntSyncTestStep::SetSimTsyTestNumberL
+
+
+/**
+ * Publish a new value to indicate that test has finished and simtsy timer can now stop.
+ *
+ */
+void CCntSyncTestStep::SignalSimTsyToReduceTimersL()
+	{
+	RProperty reduceTimersProperty;
+	User::LeaveIfError(reduceTimersProperty.Attach(KUidPSSimTsyCategory, KPSSimTsyTimersReduceTime));
+	CleanupClosePushL(reduceTimersProperty);
+
+	User::LeaveIfError(reduceTimersProperty.Set(KUidPSSimTsyCategory, KPSSimTsyTimersReduceTime,
+												KReduceSimTsyTimers));
+
+	CleanupStack::PopAndDestroy(&reduceTimersProperty);
+	}
+
+
+/** 
+ *  Opens the Contacts Database, allowing for errors if the database exists
+ *  or is not found. The function will retry where appropriate.
+ *
+ *  @return Pointer to opened database.
+ */
+CContactDatabase* CCntSyncTestStep::OpenOrCreateContactDatabaseL()
+	{
+	CContactDatabase*  db = NULL;
+	
+	//
+	// 10 attempts at opening the Contacts DB...
+	//
+	TInt  retryCount = 10;
+	
+	while (retryCount > 0)
+		{
+		TRAPD(err, db = CContactDatabase::OpenL());
+		if (err == KErrNone)
+			{
+			return db;
+			}
+		else if (err == KErrNotFound)
+			{
+			TRAP(err, db = CContactDatabase::CreateL());
+			if (err == KErrNone)
+				{
+				return db;
+				}
+			}
+
+		//
+		// If this is the last attempt then give up...
+		//
+		if (retryCount == 0)
+			{
+			User::Leave(err);
+			}
+
+		//
+		// Wait a short time and retry...
+		//
+		User::After(1000000);
+		retryCount--;
+		}
+
+	return db;
+	} // CCntSyncTestStep::OpenOrCreateContactDatabaseL
+
+
+/** Do a manual synchronisation */
+void CCntSyncTestStep::DoSyncL()
+	{
+	// Global ADN Phonebook
+	TRequestStatus status; 
+	iSession.DoSynchronisation(status);
+	User::WaitForRequest(status);
+	TESTCHECKL(status.Int(), KErrNone);
+
+	// Global SDN Phonebook
+	iSession.DoSynchronisation(status, KUidIccGlobalSdnPhonebook);
+	User::WaitForRequest(status);
+	TESTCHECKL(status.Int(), KErrNone);
+
+	// Global LND Phonebook
+	iSession.DoSynchronisation(status, KUidIccGlobalLndPhonebook);
+	User::WaitForRequest(status);
+	TESTCHECKL(status.Int(), KErrNone);
+
+	// Usim App ADN Phonebook
+	iSession.DoSynchronisation(status, KUidUsimAppAdnPhonebook);
+	User::WaitForRequest(status);
+	TESTCHECKL(status.Int(), KErrNone);
+
+	// Global FDN Phonebook
+	iSession.DoSynchronisation(status, KUidIccGlobalFdnPhonebook);
+	User::WaitForRequest(status);
+	TESTCHECKL(status.Int(), KErrNone);
+	}
+
+/** Do a manual synchronisation, but without checking for a succeess. This mehtod can 
+ *	be used to test DoSync failures.
+ */
+void CCntSyncTestStep::DoSyncFailL()
+	{
+	TRequestStatus status; 
+	iSession.DoSynchronisation(status, KUidIccGlobalAdnPhonebook);
+	User::WaitForRequest(status);
+	//If status is KErrNone then view has already been created so, sync 
+	//will not fail with access denied so no point in continuing with the test
+	if(status.Int() == KErrNone)
+		{
+		User::Leave(KErrGeneral);
+		}
+	TESTCHECKL(status.Int(), KErrAccessDenied);
+
+	// Global SDN Phonebook
+	iSession.DoSynchronisation(status, KUidIccGlobalSdnPhonebook);
+	User::WaitForRequest(status);
+	//If status is KErrNone then view has already been created so, sync 
+	//will not fail with access denied so no point in continuing with the test	
+	if(status.Int() == KErrNone)
+		{
+		User::Leave(KErrGeneral);
+		}	
+	TESTCHECKL(status.Int(), KErrAccessDenied);
+
+	// Global LND Phonebook
+	iSession.DoSynchronisation(status, KUidIccGlobalLndPhonebook);
+	User::WaitForRequest(status);
+	//If status is KErrNone then view has already been created so, sync 
+	//will not fail with access denied so no point in continuing with the test	
+	if(status.Int() == KErrNone)
+		{
+		User::Leave(KErrGeneral);
+		}	
+	TESTCHECKL(status.Int(), KErrAccessDenied);
+
+	// Usim App ADN Phonebook
+	iSession.DoSynchronisation(status, KUidUsimAppAdnPhonebook);
+	User::WaitForRequest(status);
+	//If status is KErrNone then view has already been created so, sync 
+	//will not fail with access denied so no point in continuing with the test	
+	if(status.Int() == KErrNone)
+		{
+		User::Leave(KErrGeneral);
+		}	
+	TESTCHECKL(status.Int(), KErrAccessDenied);
+
+	// Global FDN Phonebook
+	iSession.DoSynchronisation(status, KUidIccGlobalFdnPhonebook);
+	User::WaitForRequest(status);
+	//If status is KErrNone then view has already been created so, sync 
+	//will not fail with access denied so no point in continuing with the test	
+	if(status.Int() == KErrNone)
+		{
+		User::Leave(KErrGeneral);
+		}	
+	TESTCHECKL(status.Int(), KErrAccessDenied);
+	}
+
+void CCntSyncTestStep::WaitForSyncToCompleteL()
+/**
+ * Wait for all phonebooks to become syncronised.  The phonebooks checked are ADN, SDN,
+ * LND, USIM ADN and FDN.
+ */	{
+	RPhoneBookSession::TSyncState  iccAdnState, iccSdnState, iccLndState;
+	RPhoneBookSession::TSyncState  usimAdnState, iccFdnState;
+
+	//
+	// Initial check and setup of variables...
+	//
+	TInt  ret;
+	
+	ret = iSession.GetPhoneBookCacheState(iccAdnState, KUidIccGlobalAdnPhonebook);
+	if (ret != KErrNone  &&  ret != KErrNotReady)
+		{
+		User::Leave(ret);
+		}
+	ret = iSession.GetPhoneBookCacheState(iccSdnState, KUidIccGlobalSdnPhonebook);
+	if (ret != KErrNone  &&  ret != KErrNotReady)
+		{
+		User::Leave(ret);
+		}
+	ret = iSession.GetPhoneBookCacheState(iccLndState, KUidIccGlobalLndPhonebook);
+	if (ret != KErrNone  &&  ret != KErrNotReady)
+		{
+		User::Leave(ret);
+		}
+	ret = iSession.GetPhoneBookCacheState(usimAdnState, KUidUsimAppAdnPhonebook);
+	if (ret != KErrNone  &&  ret != KErrNotReady)
+		{
+		User::Leave(ret);
+		}
+	ret = iSession.GetPhoneBookCacheState(iccFdnState, KUidIccGlobalFdnPhonebook);
+	if (ret != KErrNone  &&  ret != KErrNotReady)
+		{
+		User::Leave(ret);
+		}
+
+	//
+	// Wait if needed, checking every 1 second...
+	//
+	while (iccAdnState  != RPhoneBookSession::ECacheValid  ||
+		   iccSdnState  != RPhoneBookSession::ECacheValid  ||
+		   iccLndState  != RPhoneBookSession::ECacheValid  ||
+		   usimAdnState != RPhoneBookSession::ECacheValid  ||
+		   iccFdnState  != RPhoneBookSession::ECacheValid) 
+		{
+		User::After(1000000);
+		ret = iSession.GetPhoneBookCacheState(iccAdnState, KUidIccGlobalAdnPhonebook);
+		if (ret != KErrNone  &&  ret != KErrNotReady)
+			{
+			User::Leave(ret);
+			}
+		ret = iSession.GetPhoneBookCacheState(iccSdnState, KUidIccGlobalSdnPhonebook);
+		if (ret != KErrNone  &&  ret != KErrNotReady)
+			{
+			User::Leave(ret);
+			}
+		ret = iSession.GetPhoneBookCacheState(iccLndState, KUidIccGlobalLndPhonebook);
+		if (ret != KErrNone  &&  ret != KErrNotReady)
+			{
+			User::Leave(ret);
+			}
+		ret = iSession.GetPhoneBookCacheState(usimAdnState, KUidUsimAppAdnPhonebook);
+		if (ret != KErrNone  &&  ret != KErrNotReady)
+			{
+			User::Leave(ret);
+			}
+		ret = iSession.GetPhoneBookCacheState(iccFdnState, KUidIccGlobalFdnPhonebook);
+		if (ret != KErrNone  &&  ret != KErrNotReady)
+			{
+			User::Leave(ret);
+			}
+		}
+	}