messagingfw/biomsgfw/T_BIOMSG/SRC/harness.cpp
changeset 0 8e480a14352b
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/messagingfw/biomsgfw/T_BIOMSG/SRC/harness.cpp	Mon Jan 18 20:36:02 2010 +0200
@@ -0,0 +1,755 @@
+// Copyright (c) 2003-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 "harness.h"
+#include "testframeutils.h"
+#include "msvtestutils.h"
+#include "biotestutils.h"
+#include <cemailaccounts.h>
+#include <csmsaccount.h>
+#include <iapprefs.h>
+
+CBaseTestHarness::~CBaseTestHarness()
+{
+	iStateList->ResetAndDestroy();
+	delete iStateList;
+}
+
+void CBaseTestHarness::StartL(TRequestStatus& aStatus)
+{
+	iCurrentState = 0;
+	iReportStatus = &aStatus;
+	aStatus = KRequestPending;
+
+	TInt err = KErrNone;
+	if (iCurrentState < iStateList->Count())
+	{
+		//
+		// We have to handle the error handeling ourselfs for the 1st request
+		// every other request will be handled by AS
+		if(iMarkTestStarts)
+			TestStart(iCurrentState);
+
+		TRAP(err, (iStateList->At(iCurrentState))->StartL(iStatus));
+		if(err != KErrNone)
+			RunError(err);
+	}
+	else
+	{
+		//
+		// Nothing to do!
+		TRequestStatus* status = &iStatus;
+		User::RequestComplete(status, KErrNone);
+	}
+
+	if(err == KErrNone)
+		SetActive();
+}
+
+
+void CBaseTestHarness::AddStateL(MBaseTestState* aTestState, TTestDebugInfo aDebugInfo)
+{
+	aTestState->SetDebugInfo(aDebugInfo);
+	TRAPD(err, iStateList->AppendL(aTestState));
+	if (err != KErrNone)
+	{
+		//
+		// If the state can't be added then delete it.
+		// We do this because we have taken ownership of the state.
+		delete aTestState;
+		User::Leave(err);
+	}
+}
+
+//
+// From CActive
+void CBaseTestHarness::RunL()
+{
+	if(iOldCurrentState != iCurrentState && iMarkTestStarts)
+	{
+		iOldCurrentState = iCurrentState;
+		TestFinish(iCurrentState, iStatus);
+	}
+
+	//
+	// Was there an error?
+	if (iStatus == KErrNone)
+	{
+		//
+		// Any more states?
+		iCurrentState++;
+		if(iCurrentState < iStateList->Count())
+		{
+			// If there are any more states, start them.  If StartL leaves, RunErrorL is called
+			// and we complete the request, and move to the next state.
+			if(iMarkTestStarts)
+				TestStart(iCurrentState);
+
+			(*iStateList)[iCurrentState]->StartL(iStatus);
+
+			SetActive();
+		}
+		else
+		{
+			//
+			// If this is the last state, complete the parents request
+			User::RequestComplete(iReportStatus, iStatus.Int());
+		}
+	}
+	else
+	{
+		//
+		// Handle the error
+		OnStateError();
+	}
+}
+
+void CBaseTestHarness::OnStateError()
+{
+	//
+	// Log the error
+	LogStateError();
+
+	//
+	// Move to the next state
+	RunError(KErrNone);
+}
+
+TInt CBaseTestHarness::RunError(TInt aError)
+{
+	// 
+	// Called when StartL leaves.  Complete the request.  The next call
+	// of RunL will log the error.
+	TRequestStatus* i = &iStatus;
+
+	// If the cmd is expected to fail, pass test.
+	if ((KErrNone != iExpectedError) && (aError == iExpectedError))
+		{
+		User::RequestComplete(i, KErrNone);
+		iExpectedError = KErrNone;
+		}
+	else
+		User::RequestComplete(i, aError);
+
+	SetActive();
+	return KErrNone;
+}
+
+TInt CBaseTestHarness::LogStateError()
+{
+	//
+	// Get the error message for the state
+	TTestDebugInfo debugInfo = (*iStateList)[iCurrentState]->GetDebugInfo();
+
+	//
+	// Get the test failed string (section name etc)
+	TInt err;
+	HBufC* errorText = NULL;
+	TRAP(err, errorText = debugInfo.TestFailedStringL(iStatus.Int()));
+	if (err != KErrNone)
+		return err;
+
+	//
+	// Log it
+	TRAP(err, LogCommentL(*errorText));
+	if (err != KErrNone)
+		return err;
+	TestConsole().Printf(*errorText);
+	TestConsole().Printf(_L("\r"));
+	delete errorText;
+
+	return KErrNone;
+}
+
+void CBaseTestHarness::ConstructL()
+{
+	CActiveScheduler::Add(this);
+	iStateList = new (ELeave) CArrayPtrFlat<MBaseTestState>(10);
+}
+
+//
+//
+// CMainTestHarness
+//
+
+CMainTestHarness* CMainTestHarness::NewL(RTest& aTest)
+{
+	CMainTestHarness* self = new (ELeave) CMainTestHarness(aTest);
+	CleanupStack::PushL(self);
+	self->ConstructL();
+	CleanupStack::Pop(self);
+	return self;
+}
+
+void CMainTestHarness::ConstructL()
+{
+	CBaseTestHarness::ConstructL();
+
+	iBioUtils = CBioTestUtils::NewL(iTest);
+	iAllTestsSuccessful = ETrue;
+}
+
+CMainTestHarness::~CMainTestHarness()
+{
+	if(iAllTestsSuccessful)
+		iBioUtils->TestHarnessCompleted();
+
+	else
+		iBioUtils->TestHarnessFailed(KErrGeneral);
+
+	delete iBioUtils;
+}
+
+void CMainTestHarness::TestStart(TInt& aState)
+{
+	if(iBioUtils != NULL)
+		iBioUtils->TestStart(aState);
+}
+
+void CMainTestHarness::TestFinish(TInt& aState, TRequestStatus& aStatus)
+{
+	if(iBioUtils != NULL)
+		iBioUtils->TestFinish(aState, aStatus.Int());
+
+	if (aStatus != KErrNone)
+		iAllTestsSuccessful = EFalse;
+}
+
+//
+//
+// CClientTestHarness
+//
+CClientTestHarness* CClientTestHarness::NewL(CBioTestUtils& aTestUtils, RTest& aTest)
+{
+	CClientTestHarness* self = new (ELeave) CClientTestHarness(aTestUtils, aTest);
+	CleanupStack::PushL(self);
+	self->ConstructL();
+	CleanupStack::Pop(self);
+	return self;
+}
+
+void CClientTestHarness::ConstructL()
+{
+	CBaseTestHarness::ConstructL();
+}
+
+void CClientTestHarness::LogCommentL(const TDesC& aComment)
+{
+	iBioUtils.WriteComment(aComment);
+}
+
+//
+// Custom error handeling
+void CClientTestHarness::OnStateError()
+{
+	//
+	// Get the base class to log the error
+	CBaseTestHarness::LogStateError();
+
+	//
+	// Complete the parents request - this has the net effect of skipping any
+	// remaing tests in this section.  This is because if one test failes, the chances
+	// are the remaining tests are dependent on it and fail too - worse still, they normall panic...
+	User::RequestComplete(iReportStatus, iStatus.Int());
+}
+
+void CClientTestHarness::InstantiateSmsSettingsL()
+{
+	InstantiateClientMtmL();
+	delete iSmsSettings;
+	CSmsAccount* account = CSmsAccount::NewLC();
+	iSmsSettings = CSmsSettings::NewL();
+	account->LoadSettingsL(*iSmsSettings);
+	CleanupStack::PopAndDestroy(account);
+}
+
+TMsvId CClientTestHarness::GetImapServiceL(CEmailAccounts& aAccounts)
+	{
+	TMsvId imapService;
+	
+	RArray<TImapAccount> imapAccounts;
+	CleanupClosePushL(imapAccounts);
+	
+	aAccounts.GetImapAccountsL(imapAccounts);
+	if(imapAccounts.Count()>0)
+		{
+		// if a account exist take the first
+		imapService = imapAccounts[0].iImapService;
+		}
+	else
+		{
+		CImImap4Settings* imapSettings = new(ELeave) CImImap4Settings();
+		CleanupStack::PushL(imapSettings);
+
+		CImIAPPreferences* imapIAP = CImIAPPreferences::NewLC();
+				
+		aAccounts.PopulateDefaultImapSettingsL(*imapSettings, *imapIAP);
+
+		_LIT(KImapServer, "imap.dial.pipex.com");
+		imapSettings->SetServerAddressL(KImapServer);
+		_LIT8(KImapLoginName, "abf75");
+		imapSettings->SetLoginNameL(KImapLoginName);
+		_LIT8(KImapPassword, "oodifama");
+		imapSettings->SetPasswordL(KImapPassword);
+		imapSettings->SetPort(143);
+		
+		TImapAccount imapAccount = aAccounts.CreateImapAccountL(KNullDesC, *imapSettings, *imapIAP, EFalse);
+		imapService = imapAccount.iImapService;
+		
+		CleanupStack::PopAndDestroy(2, imapSettings); // imapIAP, imapSettings
+		}
+	CleanupStack::PopAndDestroy();
+	return imapService;
+	}
+
+void CClientTestHarness::InstantiateImapSettingsL()
+{
+	InstantiateClientMtmL();
+
+	if (iImapSettings==NULL)
+	{
+		TMsvId serviceId(KMsvNullIndexEntryId);
+		CEmailAccounts* accounts = CEmailAccounts::NewLC();
+		TRAPD(err, serviceId = GetImapServiceL(*accounts));
+		//
+		// If no default service
+		if((err==KErrNotFound) || (serviceId==KMsvUnknownServiceIndexEntryId))
+		{
+			_LIT(KUhOh,"ERROR Default IMAP4Settings Not Found");
+			TestUtils().WriteComment(KUhOh);
+			User::Leave(KErrNotFound);
+		}
+		else
+		{
+			iImapSettings = new(ELeave)CImImap4Settings();
+
+			TImapAccount imapAccount;
+			accounts->GetImapAccountL(serviceId, imapAccount);
+ 			accounts->LoadImapSettingsL(imapAccount, *iImapSettings);
+
+		}
+		
+		CleanupStack::PopAndDestroy(accounts);
+	}
+}
+
+void CClientTestHarness::InstantiateSmtpSettingsL()
+{
+	InstantiateClientMtmL();
+
+	if (iSmtpSettings==NULL)
+	{
+		TMsvId serviceId(KMsvNullIndexEntryId);
+		CEmailAccounts* accounts = CEmailAccounts::NewLC();
+		
+		TSmtpAccount smtpAccount;
+		TRAPD(err, accounts->DefaultSmtpAccountL(smtpAccount));
+		serviceId = smtpAccount.iSmtpService;
+
+		//
+		// if no default service
+		if((err==KErrNotFound) || (serviceId==KMsvUnknownServiceIndexEntryId))
+		{
+			_LIT(KUhOh,"ERROR Default SMTPSettings Not Found");
+			TestUtils().WriteComment(KUhOh);
+			User::Leave(KErrNotFound);
+		}
+		else
+		{
+			iSmtpSettings = new(ELeave)CImSmtpSettings();
+
+			
+			accounts->GetSmtpAccountL(serviceId, smtpAccount);
+			accounts->LoadSmtpSettingsL(smtpAccount, *iSmtpSettings);
+		}
+
+		CleanupStack::PopAndDestroy(accounts);
+	}
+}
+
+void CClientTestHarness::InstantiateNamedPop3SettingsL(const TDesC& aName)
+{
+	delete iPop3Settings;
+	iPop3Settings = NULL;
+
+	InstantiateClientMtmL();
+
+	TMsvId aPop3EntryId=KMsvNullIndexEntryId;
+
+	CMsvEntrySelection *msvSelection = NULL;
+
+	TMsvSelectionOrdering order;
+	order.SetShowInvisibleEntries( ETrue );
+	TestUtils().iMsvEntry->SetSortTypeL(order);
+
+	// Get list of children IDs
+	TestUtils().iMsvEntry->SetEntryL(KMsvRootIndexEntryId);
+
+	msvSelection = TestUtils().iMsvEntry->ChildrenL();
+	CleanupStack::PushL(msvSelection);
+
+	
+	TMsvEntry entry;
+	TInt count = msvSelection->Count(); 
+	for (TInt j = 0; j < count; j++)
+	{
+		// set context to service entry
+		TestUtils().iMsvEntry->SetEntryL((*msvSelection)[j]);
+		entry = TestUtils().iMsvEntry->Entry(); 
+		
+		if (entry.iType == KUidMsvServiceEntry)
+		{
+			if(entry.iDetails.Length() == aName.Length())
+			{
+				if(entry.iDetails.CompareF(aName)==0 )
+				{
+					if(entry.iMtm == KUidMsgTypePOP3)
+					{
+						aPop3EntryId= entry.Id();						
+					}
+				}
+			}
+		}
+	}
+
+	CleanupStack::PopAndDestroy(msvSelection);
+
+	if(aPop3EntryId==KMsvNullIndexEntryId)
+	{
+		_LIT(KUhOh,"ERROR Matching Pop3Settings Not Found");
+		TestUtils().WriteComment(KUhOh);
+		User::Leave(KErrNotFound);
+	}
+	else
+	{
+		iPop3Settings = new(ELeave)CImPop3Settings();
+		
+		CEmailAccounts* accounts = CEmailAccounts::NewLC();
+
+		TPopAccount popAccount;
+		accounts->GetPopAccountL(aPop3EntryId, popAccount);
+		accounts->LoadPopSettingsL(popAccount, *iPop3Settings);
+
+		CleanupStack::PopAndDestroy(accounts);
+	}
+}
+
+void CClientTestHarness::InstantiateNamedSmtpSettingsL(const TDesC& aName)
+{
+	if (iSmtpSettings)
+	{
+		delete iSmtpSettings;
+		iSmtpSettings = NULL;
+	}
+
+	InstantiateClientMtmL();
+
+	//TestUtils().iMsvEntry->SetEntryL(KMsvRootIndexEntryIdValue);
+
+	TMsvId aSmtpEntryId=KMsvNullIndexEntryId;
+
+	CMsvEntrySelection *msvSelection = NULL;
+
+	TMsvSelectionOrdering order;
+	order.SetShowInvisibleEntries( ETrue );
+	TestUtils().iMsvEntry->SetSortTypeL(order);
+
+	// Get list of children IDs
+	TestUtils().iMsvEntry->SetEntryL(KMsvRootIndexEntryId);
+
+	msvSelection = TestUtils().iMsvEntry->ChildrenL();
+	CleanupStack::PushL(msvSelection);
+
+	
+	TMsvEntry entry;
+	TInt count = msvSelection->Count(); 
+	for (TInt j = 0; j < count; j++)
+		{
+		// set context to service entry
+		TestUtils().iMsvEntry->SetEntryL((*msvSelection)[j]);
+		entry = TestUtils().iMsvEntry->Entry(); 
+
+		if (entry.iType == KUidMsvServiceEntry)
+		    if(entry.iDetails.Length() == aName.Length())
+				if(entry.iDetails.CompareF(aName)==0 )
+					{
+					if(entry.iMtm == KUidMsgTypeSMTP)
+						{
+						aSmtpEntryId= entry.Id();						
+						}
+					}
+
+		}
+
+	CleanupStack::PopAndDestroy(msvSelection);
+
+	if(aSmtpEntryId==KMsvNullIndexEntryId)
+			{
+				_LIT(KUhOh,"ERROR Matching SmtpSettings Not Found");
+				TestUtils().WriteComment(KUhOh);
+				User::Leave(KErrNotFound);
+			}
+			else
+			{
+				iSmtpSettings = new(ELeave)CImSmtpSettings();
+				
+				CEmailAccounts* accounts = CEmailAccounts::NewLC();
+
+				TSmtpAccount smtpAccount;
+				accounts->GetSmtpAccountL(aSmtpEntryId, smtpAccount);
+				accounts->LoadSmtpSettingsL(smtpAccount, *iSmtpSettings);
+
+				CleanupStack::PopAndDestroy(accounts);
+			}
+	
+	//Successful
+}
+
+void CClientTestHarness::InstantiateNamedImapSettingsL(const TDesC& aName)
+{
+	if (iImapSettings)
+	{
+		delete iImapSettings;
+		iImapSettings = NULL;
+	}
+
+	InstantiateClientMtmL();
+
+	//TestUtils().iMsvEntry->SetEntryL(KMsvRootIndexEntryIdValue);
+
+	TMsvId aImapEntryId=KMsvNullIndexEntryId;
+
+	CMsvEntrySelection *msvSelection = NULL;
+
+	TMsvSelectionOrdering order;
+	order.SetShowInvisibleEntries( ETrue );
+	TestUtils().iMsvEntry->SetSortTypeL(order);
+
+	// Get list of children IDs
+	TestUtils().iMsvEntry->SetEntryL(KMsvRootIndexEntryId);
+
+	msvSelection = TestUtils().iMsvEntry->ChildrenL();
+	CleanupStack::PushL(msvSelection);
+
+	
+	TMsvEntry entry;
+	TInt count = msvSelection->Count(); 
+	for (TInt j = 0; j < count; j++)
+		{
+		// set context to service entry
+		TestUtils().iMsvEntry->SetEntryL((*msvSelection)[j]);
+		entry = TestUtils().iMsvEntry->Entry(); 
+
+		if (entry.iType == KUidMsvServiceEntry)
+		    if(entry.iDetails.Length() == aName.Length())
+				if(entry.iDetails.CompareF(aName)==0 )
+					{
+					if(entry.iMtm == KUidMsgTypeIMAP4)
+						{
+						aImapEntryId= entry.Id();						
+						}
+					}
+
+		}
+
+	CleanupStack::PopAndDestroy(msvSelection);
+
+	if(aImapEntryId==KMsvNullIndexEntryId)
+			{
+				_LIT(KUhOh,"ERROR Matching ImapSettings Not Found");
+				TestUtils().WriteComment(KUhOh);
+				User::Leave(KErrNotFound);
+			}
+			else
+			{
+				iImapSettings = new(ELeave)CImImap4Settings();
+				
+				CEmailAccounts* accounts = CEmailAccounts::NewLC();
+
+				TImapAccount imapAccount;
+				accounts->GetImapAccountL(aImapEntryId, imapAccount);
+				accounts->LoadImapSettingsL(imapAccount, *iImapSettings);
+
+				CleanupStack::PopAndDestroy(accounts);
+			}
+	
+	//Successful
+}
+
+void CClientTestHarness::UnInstantiatePop3SettingsL()
+{
+	if (iPop3Settings)
+	{
+		delete iPop3Settings;
+		iPop3Settings = NULL;
+	}
+	
+}
+
+void CClientTestHarness::UnInstantiateSmtpSettingsL()
+{
+	if (iSmtpSettings)
+	{
+		delete iSmtpSettings;
+		iSmtpSettings = NULL;
+	}
+	
+}
+
+void CClientTestHarness::UnInstantiateImapSettingsL()
+{
+	if (iImapSettings)
+	{
+		delete iImapSettings;
+		iImapSettings = NULL;
+	}
+	
+}
+
+TMsvId CClientTestHarness::GetPopServiceL(CEmailAccounts& aAccounts)
+	{
+	TMsvId popService;
+	
+	RArray<TPopAccount> popAccounts;
+	CleanupClosePushL(popAccounts);
+	
+	aAccounts.GetPopAccountsL(popAccounts);
+	if(popAccounts.Count()>0)
+		{
+		// if a account exist take the first
+		popService = popAccounts[0].iPopService;
+		}
+	else
+		{
+		CImPop3Settings* popSettings = new(ELeave) CImPop3Settings();
+		CleanupStack::PushL(popSettings);
+
+		CImIAPPreferences* popIAP = CImIAPPreferences::NewLC();
+				
+		aAccounts.PopulateDefaultPopSettingsL(*popSettings, *popIAP);
+
+		TPopAccount popAccount = aAccounts.CreatePopAccountL(KNullDesC, *popSettings, *popIAP, EFalse);
+		popService = popAccount.iPopService;
+		
+		CleanupStack::PopAndDestroy(2, popSettings); // imapIAP, imapSettings
+		}
+	CleanupStack::PopAndDestroy();
+	return popService;
+	}
+
+void CClientTestHarness::InstantiatePop3SettingsL()
+{
+	
+	InstantiateClientMtmL();
+
+	if (iPop3Settings==NULL)
+	{
+		TestUtils().iMsvEntry->SetEntryL(KMsvRootIndexEntryIdValue);
+
+		TMsvId serviceId(KMsvNullIndexEntryId);
+		CEmailAccounts* accounts = CEmailAccounts::NewLC();
+		TRAPD(err, serviceId = GetPopServiceL(*accounts));
+
+		// if no default service
+			if((err==KErrNotFound) || (serviceId==KMsvUnknownServiceIndexEntryId))
+			{
+				_LIT(KUhOh,"ERROR Default Pop3Settings Not Found");
+				TestUtils().WriteComment(KUhOh);
+				User::Leave(KErrNotFound);
+			}
+			else
+			{
+				iPop3Settings = new(ELeave)CImPop3Settings();
+				
+				TPopAccount popAccount;
+				accounts->GetPopAccountL(serviceId, popAccount);
+				accounts->LoadPopSettingsL(popAccount, *iPop3Settings);
+			}
+	
+		CleanupStack::PopAndDestroy(accounts);
+		}
+}
+
+void CClientTestHarness::InstantiateClientMtmL()
+{
+	//
+	// To speed up creation, share a static connection to client side MTM
+	// set that connection up now
+	TInt nRetryCount = 2;
+	TInt err = KErrGeneral;
+
+	if(iBioUtils.iBioClientMtm == NULL)
+	{
+		while(iBioUtils.iBioClientMtm == NULL && nRetryCount > 0)
+		{
+			//
+			// Start up client side stuff
+			TRAP(err, iBioUtils.GoClientSideL());
+			if(err == KErrNone)
+			{
+				//
+				// Create services
+				TRAP(err, iBioUtils.CreateServicesL());
+				if(err == KErrNone)
+				{
+					//
+					// Instantiate client MTM
+					// (this in its self is a test, but must be done before we can do anything else)
+					TRAP(err, iBioUtils.InstantiateClientMtmsL());
+				}
+			}
+			nRetryCount--;
+		}
+		User::LeaveIfNull(iBioUtils.iBioClientMtm);
+		User::LeaveIfError(err);
+	}
+}
+
+void CClientTestHarness::InstantiateServerMtmL()
+{
+	
+
+	//
+	// To speed up creation, share a static connection to server side MTM
+	// set that connection up now
+	TInt nRetryCount = 5;
+	TInt err = KErrGeneral;
+
+	if(iBioUtils.iBioServerMtm == NULL)
+	{
+		while(iBioUtils.iBioServerMtm == NULL && nRetryCount > 0)
+		{
+			//
+			// Start up server side stuff
+			TRAP(err, iBioUtils.GoServerSideL());
+			if(err == KErrNone)
+			{			
+				//
+				// Create services
+				TRAP(err, iBioUtils.CreateServicesL());
+				if(err == KErrNone)
+				{
+					//
+					// Instantiate server MTM
+					// (this in its self is a test, but must be done before we can do anything else)
+					TRAP(err, iBioUtils.InstantiateServerMtmsL());
+				}
+			}
+			nRetryCount--;
+		}
+		User::LeaveIfNull(iBioUtils.iBioServerMtm);	// was out
+		User::LeaveIfError(err);
+	}
+}