--- /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);
+ }
+}