diff -r 000000000000 -r 8e480a14352b messagingfw/biomsgfw/T_BIOMSG/SRC/harness.cpp --- /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 +#include +#include + +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(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 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 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); + } +}