diff -r 000000000000 -r 876b1a06bc25 tests/benchmarks/messaging/tst_messaging.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/tests/benchmarks/messaging/tst_messaging.cpp Wed Aug 25 15:49:42 2010 +0300 @@ -0,0 +1,2074 @@ +/**************************************************************************** +** +** Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies). +** All rights reserved. +** Contact: Nokia Corporation (qt-info@nokia.com) +** +** This file is part of the Qt Mobility Components. +** +** $QT_BEGIN_LICENSE:LGPL$ +** No Commercial Usage +** This file contains pre-release code and may not be distributed. +** You may use this file in accordance with the terms and conditions +** contained in the Technology Preview License Agreement accompanying +** this package. +** +** GNU Lesser General Public License Usage +** Alternatively, this file may be used under the terms of the GNU Lesser +** General Public License version 2.1 as published by the Free Software +** Foundation and appearing in the file LICENSE.LGPL included in the +** packaging of this file. Please review the following information to +** ensure the GNU Lesser General Public License version 2.1 requirements +** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. +** +** In addition, as a special exception, Nokia gives you certain additional +** rights. These rights are described in the Nokia Qt LGPL Exception +** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. +** +** If you have questions regarding the use of this file, please contact +** Nokia at qt-info@nokia.com. +** +** +** +** +** +** +** +** +** $QT_END_LICENSE$ +** +****************************************************************************/ +#include +#include +#include +#include +#include + +#include "qmessagemanager.h" +#include "qmessage.h" + +#ifdef Q_OS_SYMBIAN +#include +#include // KMsvGlobalInBoxIndexEntryId +#include // CClientMtmRegistry +#include // CSmsClientMtm +#include // KUidMsgTypeSMS +#include // CRichText +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#endif + +#include + +QTM_USE_NAMESPACE + +class OsNative; + +#if defined(Q_OS_SYMBIAN) +class OsNative : public MMsvSessionObserver { +public: + OsNative() + { + }; + + void HandleSessionEventL(TMsvSessionEvent aEvent, TAny* aArg1, TAny* aArg2, TAny* aArg3) { }; + + void getFolders(RArray &folders); + + int countMessages(); + void deleteAllMessages(); + void createMailAccountL(); + void printAccounts(); + void deleteAccounts(); + void deleteAllFolders(); + TInt createFolder(TPtrC name); + + TMsvId makeSMS(TMsvId folder); + TMsvId makeIMAP4(TMsvId folder); + + CMsvSession *iSession; + CClientMtmRegistry *iMtmRegistry; + CSmsClientMtm *iSmsMtm; + CImap4ClientMtm *iImap4Mtm; + CSmtpClientMtm *iSmtpMtm; + CMmsClientMtm *iMmsMtm; + + RArray iFolders; + RArray iNewMsgs; + TMsvId iMsvImapService; + TMsvId iMsvSmtpService; + +}; + +TMsvId OsNative::makeSMS(TMsvId folder){ + TBuf<10> aAddress(_L("Nokia")); + TBuf<20> aDescription(_L("Important Message")); + + _LIT(KTxt1,"Hi phone owner, how r u?"); + + TBuf<150> iMessage; + iMessage.Copy(KTxt1); + + iSmsMtm->SwitchCurrentEntryL(folder); //inbox +// Clean phones without a SIM doesn't have a default service +// TMsvId serviceId; +// TRAPD(err, serviceId = iSmsMtm->DefaultServiceL()); +// if(err) { +// qDebug() << "No default service"; +// return 0; +// } + + + TRAPD(err1, iSmsMtm->SwitchCurrentEntryL( folder )); + if(err1){ + qDebug() << "Failed to create SMS1: " << err1; + return 0; + } + + TRAPD(err, iSmsMtm->CreateMessageL( iSmsMtm->ServiceId() )); + + //TRAPD(err, iSmsMtm->CreateMessageL(KMsvLocalServiceIndexEntryId)); + if(err){ + qDebug() << "Failed to create SMS: " << err; + return 0; + } + + CSmsHeader& iHeader = iSmsMtm->SmsHeader(); + TRAP(err, iHeader.SetFromAddressL(aAddress)); + if(err) + qDebug() << "Failed to set from address: " << err; + + CRichText& body = iSmsMtm->Body(); + body.Reset(); + TRAP(err, body.InsertL(0, iMessage)); + if(err) + qDebug() << "Failed to add body: " << err; + + TMsvEntry entry = iSmsMtm->Entry().Entry(); + entry.SetInPreparation(EFalse); + entry.SetVisible(ETrue); + entry.iDate.HomeTime(); + entry.iDescription.Set(aDescription); + entry.iDetails.Set(aAddress); + entry.SetUnread(ETrue); + + TRAP(err, + iSmsMtm->Entry().ChangeL(entry); + iSmsMtm->SaveMessageL(); + ); + if(err) + qDebug() << "Failed to save changes: " << err; + + return entry.Id(); +} + +void OsNative::printAccounts(){ + RArray aPop; + RArray aImap; + RArray aSmtp; + CEmailAccounts* account = CEmailAccounts::NewLC(); + TRAPD(err, + account->GetPopAccountsL(aPop); + account->GetImapAccountsL(aImap); + account->GetSmtpAccountsL(aSmtp); + ); + if(err){ + qDebug()<< "Can't get all accounts"; + } + + for(int i = 0; i < aPop.Count(); i++){ + QString name = QString::fromUtf16(aPop[i].iPopAccountName.Ptr(), aPop[i].iPopAccountName.Length()); + qDebug() << "Pop account: " << name << hex << " SMTP: " << aPop[i].iSmtpService; +// account->DeletePopAccountL(aPop[i]); + } + for(int i = 0; i < aImap.Count(); i++){ + QString name = QString::fromUtf16(aImap[i].iImapAccountName.Ptr(), aImap[i].iImapAccountName.Length()); + qDebug() << "Imap account: " << name << hex << " SMTP: " << aImap[i].iSmtpService; +// account->DeleteImapAccountL(aImap[i]); + } + for(int i = 0; i < aSmtp.Count(); i++){ + QString name = QString::fromUtf16(aSmtp[i].iSmtpAccountName.Ptr(), aSmtp[i].iSmtpAccountName.Length()); + qDebug() << "SMTP account: " << name << hex << " Related: " << aSmtp[i].iRelatedService; +// account->DeleteSmtpAccountL(aSmtp[i]); + } + aPop.Close(); + aSmtp.Close(); + aImap.Close(); + CleanupStack::PopAndDestroy(account); +} + +void OsNative::deleteAccounts(){ + RArray aPop; + RArray aImap; + RArray aSmtp; + CEmailAccounts* account = CEmailAccounts::NewLC(); + TRAPD(err, + account->GetPopAccountsL(aPop); + account->GetImapAccountsL(aImap); + account->GetSmtpAccountsL(aSmtp); + ); + if(err){ + qDebug()<< "Can't get all accounts"; + } + + for(int i = 0; i < aPop.Count(); i++){ + QString name = QString::fromUtf16(aPop[i].iPopAccountName.Ptr(), aPop[i].iPopAccountName.Size()); + if(name.startsWith("BMTestAccount")) + account->DeletePopAccountL(aPop[i]); + } + for(int i = 0; i < aImap.Count(); i++){ + QString name = QString::fromUtf16(aImap[i].iImapAccountName.Ptr(), aImap[i].iImapAccountName.Size()); + if(name.startsWith("BMTestAccount")) + account->DeleteImapAccountL(aImap[i]); + + } + for(int i = 0; i < aSmtp.Count(); i++){ + QString name = QString::fromUtf16(aSmtp[i].iSmtpAccountName.Ptr(), aSmtp[i].iSmtpAccountName.Size()); + if(name.startsWith("BMTestAccount")) + account->DeleteSmtpAccountL(aSmtp[i]); + } + aPop.Close(); + aSmtp.Close(); + aImap.Close(); + CleanupStack::PopAndDestroy(account); +} + +TMsvId OsNative::makeIMAP4(TMsvId folder){ + + // create a new object to access an existing entry + CMsvEntry* msvEntry = CMsvEntry::NewL(*iSession, KMsvGlobalInBoxIndexEntryId, TMsvSelectionOrdering()); + CleanupStack::PushL(msvEntry); // 1 + + msvEntry->SetEntryL(folder); + + // mtm takes ownership of entry context + CleanupStack::Pop(msvEntry); // 0 + iSmtpMtm->SetCurrentEntryL(msvEntry); + + // create a new message + TMsvId defaultServiceId(0); + defaultServiceId = iSmtpMtm->DefaultServiceL(); + CMsvEntry *pE = iSession->GetEntryL(defaultServiceId); + CleanupStack::PushL(pE); + QString name = QString::fromUtf16(pE->Entry().iDetails.Ptr(), pE->Entry().iDetails.Length()); + CleanupStack::PopAndDestroy(pE); + iSmtpMtm->CreateMessageL(defaultServiceId); + + // set subject + iSmtpMtm->SetSubjectL( _L("Test Message") ); + // set body + iSmtpMtm->Body().Reset(); + iSmtpMtm->Body().InsertL(0, _L("This is the text body")); + + // get the entry of the message + TMsvEntry messageEntry = iSmtpMtm->Entry().Entry(); +// AddSenderToMtmAddresseeL(*iSmtpMtm, parameters, ETrue ); +// SetSenderToEntryDetails(messageEntry, parameters, ETrue); + messageEntry.iMtm = KUidMsgTypeIMAP4; // or any other than KUidMsgTypeSMTP to display 'from' field instead of 'to' field + + // set the description field same as the message subject + messageEntry.iDescription.Set( _L("test") ); + messageEntry.iDetails.Set( _L("test subject") ); + + // save the changes done above + iSmtpMtm->Entry().ChangeL(messageEntry); + // get an access to the message store + CMsvStore* store = msvEntry->EditStoreL(); + CleanupStack::PushL(store); // 1 + + // save the attachments + + // save the changes made to the message store + store->CommitL(); + CleanupStack::PopAndDestroy(store); // 0 + // save the message + iSmtpMtm->SaveMessageL(); + // final fine tuning + TMsvEmailEntry temailEntry = static_cast(messageEntry); + temailEntry.SetMessageFolderType(EFolderTypeUnknown); + temailEntry.SetDisconnectedOperation(ENoDisconnectedOperations); + temailEntry.SetEncrypted(EFalse); + temailEntry.SetSigned(EFalse); + temailEntry.SetVCard(EFalse); + temailEntry.SetVCalendar(EFalse); + temailEntry.SetReceipt(EFalse); + temailEntry.SetMHTMLEmail(EFalse); + temailEntry.SetBodyTextComplete(ETrue); + + temailEntry.SetAttachment(EFalse); + + temailEntry.iDate.HomeTime(); + temailEntry.SetVisible(ETrue); + temailEntry.SetInPreparation(EFalse); + temailEntry.SetUnread(ETrue); + temailEntry.SetNew(ETrue); + + temailEntry.SetComplete(ETrue); + temailEntry.iServiceId = iMsvSmtpService; + temailEntry.iRelatedId = 0; + + iSmtpMtm->Entry().ChangeL(temailEntry); + + // reset email headers + CImHeader* header = CImHeader::NewLC(); // 1 + CMsvStore* msvStore = msvEntry->EditStoreL(); + CleanupStack::PushL(msvStore); // 2 + header->RestoreL(*msvStore); + header->SetSubjectL( _L("test email") ); + header->SetFromL( _L("blah@blah.com") ); + header->SetReceiptAddressL( _L("Foo@bar.com") ); + header->StoreL( *msvStore ); + msvStore->CommitL(); + CleanupStack::PopAndDestroy(2); // msvStore, header // 0 + + // id has been generated, store it for being able to delete + // only entries created with Creator + TMsvId id = messageEntry.Id(); + return id; +} + + +void OsNative::deleteAllFolders() { + + RArray aFolders; + + TRAP_IGNORE(getFolders(aFolders)); + + TMsvSelectionOrdering sort; + sort.SetSorting(EMsvSortByNone); + sort.SetShowInvisibleEntries(ETrue); + + for(int i = 0; i < aFolders.Count(); i++) { + CMsvEntry* inboxContext = CMsvEntry::NewL(*iSession, aFolders[i], sort); + CleanupStack::PushL(inboxContext); + + // Get all entries in the folder + CMsvEntrySelection* entries = inboxContext->ChildrenL(); + CleanupStack::PushL(entries); + QString desc = QString::fromUtf16(inboxContext->Entry().iDetails.Ptr(), inboxContext->Entry().iDetails.Length()); + + for (TInt j = 0; j < entries->Count(); j++) { + CMsvEntry* pEntry = CMsvEntry::NewL(*iSession, entries->At(j), sort); + CleanupStack::PushL(pEntry); + QString desc2 = QString::fromUtf16(pEntry->Entry().iDetails.Ptr(), pEntry->Entry().iDetails.Length()); + + const TMsvEntry &entry = pEntry->Entry(); + if((desc != "My folders" || desc2 == "Templates")) { + CleanupStack::PopAndDestroy(pEntry); + continue; + } + + CleanupStack::PopAndDestroy(pEntry); + + TMsvId id = entries->At(j); + qDebug() << "Deleting: " << desc << "/" << desc2; + TRAPD(ierr, iSession->RemoveEntry(id)); // works + if(ierr){ + qDebug() << "Failed to delete: " << ierr << " " << hex << entries->At(j); + } + } + CleanupStack::PopAndDestroy(2, inboxContext); + } +} + +void OsNative::createMailAccountL() { + CImIAPPreferences* outgoingIAPSet = CImIAPPreferences::NewLC(); // 1 + CImIAPPreferences* incomingIAPSet = CImIAPPreferences::NewLC(); // 2 + CEmailAccounts* account = CEmailAccounts::NewLC(); // 3 + + CImImap4Settings* imap4Set = new(ELeave) CImImap4Settings; + CleanupStack::PushL(imap4Set); // 4 + CImSmtpSettings* smtpSet = new(ELeave) CImSmtpSettings; + CleanupStack::PushL(smtpSet); // 5 + + account->PopulateDefaultSmtpSettingsL(*smtpSet, *outgoingIAPSet); + account->PopulateDefaultImapSettingsL(*imap4Set, *outgoingIAPSet); + + imap4Set->SetDisconnectedUserMode(ETrue); + imap4Set->SetSynchronise(EUseLocal); + imap4Set->SetSubscribe(EUpdateNeither); + imap4Set->SetAutoSendOnConnect(EFalse); + imap4Set->SetGetMailOptions(EGetImap4EmailBodyText); + imap4Set->SetUpdatingSeenFlags(ETrue); + imap4Set->SetServerAddressL(_L("test.sdfsdf.wer.sadazsdsddf.com")); + + TImapAccount imapAccountId = account->CreateImapAccountL(_L("BMTestAccount"), *imap4Set, *incomingIAPSet, EFalse); + TSmtpAccount smtpAccountId = account->CreateSmtpAccountL(imapAccountId, *smtpSet, *outgoingIAPSet, EFalse); + account->SetDefaultSmtpAccountL(smtpAccountId); + + iMsvImapService = imapAccountId.iImapService; + iMsvSmtpService = smtpAccountId.iSmtpAccountId; + + // Fails with NotSupported + //iImap4Mtm->ChangeDefaultServiceL(iMsvImapService); + // Failed with invalid arg + // iSmtpMtm->ChangeDefaultServiceL(iMsvSmtpService); + CleanupStack::PopAndDestroy(5); + +} + +int OsNative::countMessages() { + + RArray aFolders; + int total = 0; + + TRAPD(err, getFolders(aFolders)); + if(err){ + qDebug() << "getFodlers faield: " << err; + return 0; + } + + for(int i = 0; i < aFolders.Count(); i++){ + TMsvSelectionOrdering sort; + sort.SetSorting(EMsvSortByNone); + sort.SetShowInvisibleEntries(ETrue); + CMsvEntry* inboxContext = CMsvEntry::NewL(*iSession, + aFolders[i], sort); + CleanupStack::PushL(inboxContext); // 1 + + // Get all entries in the Inbox + CMsvEntrySelection* entries = inboxContext->ChildrenL(); + CleanupStack::PushL(entries); // 2 + for (TInt i = 0; i < entries->Count(); i++) { + + TMsvId entryID = entries->At(i); + + const TUid mtm = inboxContext->ChildDataL(entryID).iMtm; + if (mtm == KUidMsgTypeSMS) { + total++; + } + else if ((mtm == KUidMsgTypeIMAP4) || (mtm == KUidMsgTypeSMTP)) { + total++; + } + else { + } + } + CleanupStack::PopAndDestroy(2, inboxContext); + } + return total; +} + +void OsNative::deleteAllMessages() { + + RArray aFolders; + + TRAPD(err, getFolders(aFolders)); + if(err){ + qDebug() << "getFodlers faield: " << err; + return; + } + + for(int i = 0; i < aFolders.Count(); i++){ + TMsvSelectionOrdering sort; + CMsvEntry* inboxContext = CMsvEntry::NewL(*iSession, aFolders[i], sort); + CleanupStack::PushL(inboxContext); // 1 + + // Get all entries in the Inbox + CMsvEntrySelection* entries = inboxContext->ChildrenL(); + CleanupStack::PushL(entries); // 2 + for (TInt i = 0; i < entries->Count(); i++) { + + TMsvId entryID = entries->At(i); + const TUid mtm = inboxContext->ChildDataL(entryID).iMtm; + + if ((mtm == KUidMsgTypeSMS) || (mtm == KUidMsgTypeIMAP4) || (mtm == KUidMsgTypeSMTP)) { + iSession->RemoveEntry(entryID); + } + } + CleanupStack::PopAndDestroy(2, inboxContext); + } +} + + +#define KMsvMyFoldersEntryIdValue 0x1008 +const TMsvId KMsvMyFoldersEntryId=KMsvMyFoldersEntryIdValue; + +TInt OsNative::createFolder(TPtrC name){ + TMsvId msvServId; + CMsvEntry *entry1 = NULL; + CMsvEntry * rootEntry = NULL; + CMsvEntry *entryRootService = NULL; + + TInt newFldrID = 0; + + //Get the entry (whatever is passed in) + entry1 = iSession->GetEntryL(KMsvMyFoldersEntryIdValue); + CleanupStack::PushL(entry1); + + if (entry1) + { + msvServId = entry1->OwningService(); + + entryRootService = iSession->GetEntryL(msvServId); + CleanupStack::PushL(entryRootService); + + rootEntry = iSession->GetEntryL(msvServId); + CleanupStack::PushL(rootEntry); + + rootEntry->SetEntryL(KMsvMyFoldersEntryIdValue); // set to parent + + TMsvEntry newServiceEntry; + + newServiceEntry.iDate.HomeTime(); + newServiceEntry.iSize = 0; + newServiceEntry.iType = KUidMsvFolderEntry; + newServiceEntry.iMtm = KUidMsvLocalServiceMtm; +// newServiceEntry.iServiceId = iSmsMtm->ServiceId(); +// newServiceEntry.iServiceId = KMsvLocalServiceIndexEntryId; + newServiceEntry.iServiceId = iMsvImapService; + newServiceEntry.iDetails.Set(name); + newServiceEntry.iDescription.Set(KNullDesC); + newServiceEntry.SetVisible(ETrue); + + TRAPD(err, rootEntry->CreateL(newServiceEntry)); + if(err){ + QString n = QString::fromUtf16(name.Ptr(), name.Size()); + qDebug() << "Failed to create folder "<< n << ": " << err; + User::Panic(_L("Fail"), err); + } +// qDebug() << "iError: " << newServiceEntry.iError << " complete: " << newServiceEntry.Complete() << " prot: " << newServiceEntry.DeleteProtected(); +// newFldrID = newServiceEntry.Id(); + CleanupStack::PopAndDestroy(); + CleanupStack::PopAndDestroy(); + } + CleanupStack::PopAndDestroy(entry1); + + return newFldrID; +} + + +#else + class OsNative { + + }; +#endif + + + + +//Q_DECLARE_METATYPE(QSystemInfo::Feature); + +class tst_messaging : public QObject +{ + Q_OBJECT + +public: + enum platform { + QMessaging = 0, + Native = 1 + }; + + enum bases { + Accounts = 0, + AccountsImap, + AccountsPop, + AccountsSmtp, + Folders, + FoldersEmail, + FoldersSMS, + FoldersMMS, + Messages, + MessagesAlt, + + }; + + enum filter { + Id = 0, + Type, + Sender, + Recipients, + Subject, + TimeStamp, + Status, + Priority, + Size, + AllId, + AllSender + }; + + enum types { + Sms = 0, + Mms, + Email + }; + + +private slots: + void initTestCase(); + void cleanupTestCase(); + + void tst_createTime_data(); + void tst_createTime(); + + void tst_counts_data(); + void tst_counts(); + + void tst_query_data(); + void tst_query(); + + void tst_fetch_data(); + void tst_fetch(); + + void tst_fetchAll_data(); + void tst_fetchAll(); + + void tst_fetchFilter_data(); + void tst_fetchFilter(); + + void tst_addMessage_data(); + void tst_addMessage(); + + void tst_removeMessage_data(); + void tst_removeMessage(); + + void tst_removeAllMessage_data(); + void tst_removeAllMessage(); + +private: + QMessage *createMessage(); + QMessage *messageTemplate(); + QMessageId addMessage(QMessage *); + + void clearMessages(); + int countMessages(); + + QMessageManager *m_mgr; + + QMessageIdList msg_list; + + QMessageAccount m_act; + //QMessageFolder m_fol; + + + OsNative *m_native; +}; + +Q_DECLARE_METATYPE(tst_messaging::platform); +Q_DECLARE_METATYPE(tst_messaging::bases); +Q_DECLARE_METATYPE(tst_messaging::filter); +Q_DECLARE_METATYPE(tst_messaging::types); + +void tst_messaging::initTestCase() +{ + +#if defined(Q_WS_MAEMO_6) + QFAIL("Maemo 6 not supported by tst_messaging"); +#elif defined(Q_WS_MAEMO_5) + QFAIL("Maemo 5 does not support tst_messageing"); +#elif defined(Q_OS_SYMBIAN) + +#else + QFAIL("Platform not supported"); +#endif + + +// QMessageFolderIdList flist = m_mgr->queryFolders(); +// while(!flist.empty()) { +// QMessageFolder fol = m_mgr->folder(flist.takeFirst()); +// qDebug() << "Folder: " << fol.name(); +//#if defined(Q_OS_SYMBIAN) +// if(fol.name() == "Inbox"){ +// m_fol = fol; +// break; +// } +//#endif +// } + +#if defined(Q_OS_SYMBIAN) + // define/init native features we need native + m_native = new OsNative; + m_native->iSession = CMsvSession::OpenSyncL(*m_native); + m_native->iMtmRegistry = CClientMtmRegistry::NewL(*m_native->iSession); + m_native->iSmsMtm = STATIC_CAST(CSmsClientMtm*, m_native->iMtmRegistry->NewMtmL(KUidMsgTypeSMS)); + m_native->iImap4Mtm = STATIC_CAST(CImap4ClientMtm*, m_native->iMtmRegistry->NewMtmL(KUidMsgTypeIMAP4)); + m_native->iMmsMtm = STATIC_CAST(CMmsClientMtm*, m_native->iMtmRegistry->NewMtmL(KUidMsgTypeMultimedia)); + m_native->iSmtpMtm = STATIC_CAST(CSmtpClientMtm*,(m_native->iMtmRegistry->NewMtmL(KUidMsgTypeSMTP))); + + qDebug() << "Print accounts"; + m_native->printAccounts(); + qDebug() << "Delete accounts"; + m_native->deleteAccounts(); + qDebug() << "Delete all folders and messages"; + m_native->deleteAllFolders(); + m_native->deleteAllMessages(); + qDebug() << "Create accounts"; + TRAPD(err, m_native->createMailAccountL()); + if(err) + qDebug() << "Account create failed: " << err; + qDebug() << "Oustanding ops: " << m_native->iSession->OutstandingOperationsL(); + m_native->printAccounts(); + qDebug() << "Create 3 folders"; + m_native->createFolder(_L("Test1")); + m_native->createFolder(_L("Test2")); + m_native->createFolder(_L("Test3")); + +// Created messages with QMF, our symbian messages aren't very good +// qDebug() << "Create 15 emails"; +// for(int count = 0; count < 15; count++){ +// TRAP(err, TMsvId id = m_native->makeIMAP4(KMsvGlobalInBoxIndexEntryId); +// m_native->iNewMsgs.Append(id)); +// if(err){ +// qDebug() << "Error: " << err; +// } +// } + + +// Can't create SMS messages on a phone with no msg center +// qDebug() << "Create 15 SMS: " << m_native->iNewMsgs.Count(); +// TRAPD(err, +// for(int count = 0; count < 15; count++){ +// TMsvId id = m_native->makeSMS(KMsvDraftEntryId); +// m_native->iNewMsgs.Append(id); +// } +// ); + qDebug() << "Initial state is set: " << m_native->iNewMsgs.Count(); + RArray folders; + m_native->getFolders(folders); + qDebug() << "Number of folders: " << folders.Count(); + folders.Close(); + qDebug() << "Number of messages: " << m_native->countMessages(); +#else +// this doesn't really create testable messages on symbian + for(int i = 0; i < 30; i++) + createMessage(); +#endif + + m_mgr = new QMessageManager(); + + QMessageAccountIdList list; + list = m_mgr->queryAccounts(); + while(!list.empty()) { + QMessageAccount act = m_mgr->account(list.takeFirst()); + qDebug() << "Account: " << act.name(); +#if defined(Q_OS_SYMBIAN) + if(act.name() == "BMTestAccount"){ + qDebug() << "Using this account"; + m_act = act; + break; + } +#endif + } + + + for(int i = 0; i < 30; i++) + createMessage(); +} + +void tst_messaging::cleanupTestCase() +{ + + clearMessages(); + +#if defined(Q_OS_SYMBIAN) + qDebug() << "Delete: Oustanding ops: " << m_native->iSession->OutstandingOperationsL() << " outstanding messages: " << m_native->countMessages(); + m_native->deleteAccounts(); + m_native->deleteAllFolders(); + m_native->deleteAllMessages(); + m_native->iSession->RemoveEntry(m_native->iMsvImapService); + m_native->iSession->RemoveEntry(m_native->iMsvSmtpService); + delete m_native->iMmsMtm; + delete m_native->iImap4Mtm; + delete m_native->iSmsMtm; + delete m_native->iMtmRegistry; + delete m_native->iSession; + delete m_native; +#endif + + delete m_mgr; + + +} + + +void tst_messaging::tst_createTime_data() +{ + QTest::addColumn("platform"); + + QTest::newRow("Qt-Create") << tst_messaging::QMessaging; + QTest::newRow("Native-Create") << tst_messaging::Native; +} + + +void tst_messaging::tst_createTime() +{ + QFETCH(tst_messaging::platform, platform); + + //qDebug() << "Platform: " << platform; + + if(platform == tst_messaging::QMessaging){ + QMessageManager *mgr = 0x0; + + QBENCHMARK { + mgr = new QMessageManager(); + } + + delete mgr; + + } + else if(platform == tst_messaging::Native){ +#ifdef Q_OS_SYMBIAN + + __UHEAP_MARK; + + if(m_native){ + delete m_native->iSmtpMtm; + delete m_native->iMmsMtm; + delete m_native->iImap4Mtm; + delete m_native->iSmsMtm; + delete m_native->iMtmRegistry; + delete m_native->iSession; + delete m_native; + } + + QBENCHMARK { + // define/init native features we need native + m_native = new OsNative; + m_native->iSession = CMsvSession::OpenSyncL(*m_native); + m_native->iMtmRegistry = CClientMtmRegistry::NewL(*m_native->iSession); + m_native->iSmsMtm = STATIC_CAST(CSmsClientMtm*, m_native->iMtmRegistry->NewMtmL(KUidMsgTypeSMS)); + m_native->iImap4Mtm = STATIC_CAST(CImap4ClientMtm*, m_native->iMtmRegistry->NewMtmL(KUidMsgTypeIMAP4)); + m_native->iMmsMtm = STATIC_CAST(CMmsClientMtm*, m_native->iMtmRegistry->NewMtmL(KUidMsgTypeMultimedia)); + m_native->iSmtpMtm = STATIC_CAST(CSmtpClientMtm*, m_native->iMtmRegistry->NewMtmL(KUidMsgTypeSMTP)); + } + + __UHEAP_MARKEND; +#endif + } + +} + +void tst_messaging::tst_counts_data() +{ + QTest::addColumn("platform"); + QTest::addColumn("base"); + + QTest::newRow("Qt-Accounts") << tst_messaging::QMessaging << tst_messaging::Accounts; +// QTest::newRow("Native-Accounts") << tst_messaging::Native << tst_messaging::Accounts; + QTest::newRow("Qt-Folders") << tst_messaging::QMessaging << tst_messaging::Folders; + QTest::newRow("Native-Folders") << tst_messaging::Native << tst_messaging::Folders; + QTest::newRow("Qt-Messages") << tst_messaging::QMessaging << tst_messaging::Messages; + QTest::newRow("Qt-MessagesAlt") << tst_messaging::QMessaging << tst_messaging::MessagesAlt; + QTest::newRow("Native-Messages") << tst_messaging::Native << tst_messaging::Messages; + +} + +void tst_messaging::tst_counts() +{ + QFETCH(tst_messaging::platform, platform); + QFETCH(tst_messaging::bases, base); + + if(platform == tst_messaging::QMessaging){ + int cnt; + Q_UNUSED(cnt); + if(base == tst_messaging::Accounts){ + QBENCHMARK { + cnt = m_mgr->countAccounts(); + } + } + else if(base == tst_messaging::Folders){ + QBENCHMARK { + cnt = m_mgr->countFolders(); + } + } + else if(base == tst_messaging::Messages){ + QBENCHMARK { + cnt = m_mgr->countMessages(); + } + } + else if(base == tst_messaging::MessagesAlt){ + QMessageIdList list; + QBENCHMARK { + list = m_mgr->queryMessages(); + cnt = list.count(); + } + } + //qDebug() << "Got cnt: " << cnt; + } + else if(platform == tst_messaging::Native){ +#ifdef Q_OS_SYMBIAN + QBENCHMARK { + // Access the Inbox + TMsvSelectionOrdering sort; + CMsvEntry* inboxContext = CMsvEntry::NewL(*m_native->iSession, KMsvGlobalInBoxIndexEntryId, sort); + CleanupStack::PushL(inboxContext); + + // Get all entries in the Inbox + CMsvEntrySelection* entries = inboxContext->ChildrenL(); + CleanupStack::PushL(entries); + + + TInt messages = entries->Count(); + + CleanupStack::PopAndDestroy(2, inboxContext); + } +#endif + } + +} + +void tst_messaging::tst_query_data() +{ + QTest::addColumn("platform"); + QTest::addColumn("base"); + + QTest::newRow("Qt-Accounts") << tst_messaging::QMessaging << tst_messaging::Accounts; +// QTest::newRow("Qt-Folders") << tst_messaging::QMessaging << tst_messaging::Folders; + QTest::newRow("Qt-Messages") << tst_messaging::QMessaging << tst_messaging::Messages; + + QTest::newRow("Native-Accounts") << tst_messaging::Native << tst_messaging::Accounts; + QTest::newRow("Native-Accounts-Imap") << tst_messaging::Native << tst_messaging::AccountsImap; + QTest::newRow("Native-Accounts-Pop") << tst_messaging::Native << tst_messaging::AccountsPop; + QTest::newRow("Native-Accounts-Smtp") << tst_messaging::Native << tst_messaging::AccountsSmtp; + QTest::newRow("Native-Folders") << tst_messaging::Native << tst_messaging::Folders; +// QTest::newRow("Native-Folders") << tst_messaging::Native << tst_messaging::FoldersEmail; +// QTest::newRow("Native-Folders") << tst_messaging::Native << tst_messaging::FoldersSMS; +// QTest::newRow("Native-Folders") << tst_messaging::Native << tst_messaging::FoldersMMS; + QTest::newRow("Native-Messages") << tst_messaging::Native << tst_messaging::Messages; + +} + +void tst_messaging::tst_query() +{ + QFETCH(tst_messaging::platform, platform); + QFETCH(tst_messaging::bases, base); + + if(platform == tst_messaging::QMessaging){ +// int cnt; + if(base == tst_messaging::Accounts){ + QMessageAccountIdList list; + QBENCHMARK { + list = m_mgr->queryAccounts(); + } + } + else if(base == tst_messaging::Folders){ + QMessageFolderIdList list; + QBENCHMARK { + list = m_mgr->queryFolders(); + } +// XXX The library returns inbox/drafts/sent for all default accounts and greatly exagerates the number of folders +// qDebug() << "Number of folders: " << list.count(); +// while(!list.empty()){ +// QMessageFolder f(list.takeFirst()); +// qDebug() << "Folder: " << f.name(); +// } + } + else if(base == tst_messaging::Messages){ + QMessageIdList list; + QBENCHMARK { + list = m_mgr->queryMessages(); + } + } + //qDebug() << "Got cnt: " << cnt; + } + else if(platform == tst_messaging::Native){ +#ifdef Q_OS_SYMBIAN + if(base == tst_messaging::Accounts){ + CEmailAccounts *email = CEmailAccounts::NewLC(); + RArray aPop; + RArray aImap; + RArray aSmtp; + + QBENCHMARK { + email->GetPopAccountsL(aPop); + email->GetImapAccountsL(aImap); + email->GetSmtpAccountsL(aSmtp); + } + CleanupStack::PopAndDestroy(email); + } + else if(base == tst_messaging::AccountsImap) { + CEmailAccounts *email = CEmailAccounts::NewLC(); + RArray aImap; + + QBENCHMARK { + email->GetImapAccountsL(aImap); + } + CleanupStack::PopAndDestroy(email); + + } + else if(base == tst_messaging::AccountsPop) { + CEmailAccounts *email = CEmailAccounts::NewLC(); + RArray aPop; + + QBENCHMARK { + email->GetPopAccountsL(aPop); + } + CleanupStack::PopAndDestroy(email); + + } + else if(base == tst_messaging::AccountsSmtp) { + CEmailAccounts *email = CEmailAccounts::NewLC(); + RArray aSmtp; + + QBENCHMARK { + email->GetSmtpAccountsL(aSmtp); + } + CleanupStack::PopAndDestroy(email); + + } + else if(base == tst_messaging::Folders){ + RArray aFolders; + QBENCHMARK { + m_native->getFolders(aFolders); + aFolders.Close(); + } + } + else if(base == tst_messaging::Messages) { + + RArray aFolders; + +// aFolders.Append(KMsvGlobalInBoxIndexEntryId); +// aFolders.Append(KMsvGlobalOutBoxIndexEntryId); +// aFolders.Append(KMsvDraftEntryId); +// aFolders.Append(KMsvSentEntryId); +// for(int i = 0; i < m_native->iFolders.Count(); i++) +// aFolders.Append(m_native->iFolders[i]); + m_native->getFolders(aFolders); + + // Access the Inbox + QBENCHMARK { + + for(int i = 0; i < aFolders.Count(); i++){ + TMsvSelectionOrdering sort; + CMsvEntry* inboxContext = CMsvEntry::NewL(*m_native->iSession, aFolders[i], sort); + CleanupStack::PushL(inboxContext); + + // Get all entries in the Inbox + CMsvEntrySelection* entries = inboxContext->ChildrenL(); + CleanupStack::PushL(entries); + + TInt messages = entries->Count(); + for (TInt i = 0; i < messages; i++) { + TMsvId entryID = entries->At(i); + m_native->iSmsMtm->SwitchCurrentEntryL(entryID); + + CMsvEntry* entry; + + entry = m_native->iSession->GetEntryL((*entries)[i]); + + delete entry; + + } + + CleanupStack::PopAndDestroy(2, inboxContext); + } + } + } +#endif + } + +} + +void tst_messaging::tst_fetch_data() +{ + //qDebug() << "Start fetch_data"; + QTest::addColumn("platform"); + QTest::addColumn("base"); + + QTest::newRow("Qt-Accounts") << tst_messaging::QMessaging << tst_messaging::Accounts; + QTest::newRow("Native-Accounts") << tst_messaging::Native << tst_messaging::Accounts; + QTest::newRow("Qt-Folders") << tst_messaging::QMessaging << tst_messaging::Folders; + QTest::newRow("Native-Folders") << tst_messaging::Native << tst_messaging::Folders; + QTest::newRow("Qt-Messages") << tst_messaging::QMessaging << tst_messaging::Messages; + QTest::newRow("Native-Messages") << tst_messaging::Native << tst_messaging::Messages; +} + +void tst_messaging::tst_fetch() +{ + + QFETCH(tst_messaging::platform, platform); + QFETCH(tst_messaging::bases, base); + + //qDebug() << "Start fetch" << platform << " base: " << base; + if(platform == tst_messaging::QMessaging){ + int cnt; + Q_UNUSED(cnt); + if(base == tst_messaging::Accounts){ + QMessageAccountIdList list; + QMessageAccount acc; + list = m_mgr->queryAccounts(); + + if(!list.empty()){ + QBENCHMARK_ONCE { // XXX Maybe a bug here, if you call account a lot system crashes + acc = m_mgr->account(list.takeFirst()); + } + } + if(m_mgr->error()){ + QFAIL(QString("Failed fetching accounts: %1").arg(m_mgr->error()).toAscii()); + } + } + else if(base == tst_messaging::Folders){ + QMessageFolderIdList list; + QMessageFolder fol; + list = m_mgr->queryFolders(); + + if(!list.empty()) { + QBENCHMARK { + fol = m_mgr->folder(list.takeFirst()); + } + } + } + else if(base == tst_messaging::Messages){ + QMessageIdList list; + QMessage msg; + list = m_mgr->queryMessages(); + + if(!list.empty()){ + QBENCHMARK { + msg = m_mgr->message(list.takeFirst()); + } + } + } + //qDebug() << "Got cnt: " << cnt; + } + else if(platform == tst_messaging::Native){ +#ifdef Q_OS_SYMBIAN + if(base == tst_messaging::Messages){ + __UHEAP_MARK; + // Access the Inbox + QBENCHMARK { + TMsvSelectionOrdering sort; + sort.SetSorting(EMsvSortByDateReverse); + sort.SetShowInvisibleEntries(ETrue); + + CMsvEntry* inboxContext = CMsvEntry::NewL(*m_native->iSession, + KMsvDraftEntryIdValue /*KMsvGlobalInBoxIndexEntryId*/, sort); + CleanupStack::PushL(inboxContext); + + // Get all entries in the Inbox + CMsvEntrySelection* entries = inboxContext->ChildrenL(); + CleanupStack::PushL(entries); + + if(entries->Count() == 0){ + CleanupStack::PopAndDestroy(2, inboxContext); + QSKIP("No messages on device to list", SkipAll); + } + TMsvId entryID = entries->At(0); + const TUid mtm = inboxContext->ChildDataL(entryID).iMtm; + + if (mtm == KUidMsgTypeSMS) { + m_native->iSmsMtm->SwitchCurrentEntryL(entryID); + TRAPD(err, m_native->iSmsMtm->LoadMessageL()); + if(err){ + qDebug() << "LoadMessageL failed: " << err; + continue; + } + CSmsHeader& header = m_native->iSmsMtm->SmsHeader(); + } + else if (mtm == KUidMsgTypeMultimedia) { + // TODO None of these have a data store...skip until it can be fixed + QFAIL("MMS message handeling is broken, change setup to use non-MMS type"); + } + else if (mtm == KUidMsgTypeIMAP4) { + m_native->iImap4Mtm->SwitchCurrentEntryL(entryID); + m_native->iImap4Mtm->LoadMessageL(); + } + else if (mtm == KUidMsgTypeSMTP){ + m_native->iSmtpMtm->SwitchCurrentEntryL(entryID); + m_native->iSmtpMtm->LoadMessageL(); + } + else { + qDebug() << "Got Type: " << hex << mtm.iUid; + } + CleanupStack::PopAndDestroy(2, inboxContext); + } + __UHEAP_MARKEND; + } + +#endif + } +//qDebug() <<"End fetch"; +} + +void tst_messaging::tst_fetchAll_data() +{ + QTest::addColumn("platform"); + QTest::addColumn("base"); + + QTest::newRow("Qt-Accounts") << tst_messaging::QMessaging << tst_messaging::Accounts; + QTest::newRow("Native-Accounts") << tst_messaging::Native << tst_messaging::Accounts; +// QTest::newRow("Qt-Folders") << tst_messaging::QMessaging << tst_messaging::Folders; + QTest::newRow("Native-Folders") << tst_messaging::Native << tst_messaging::Folders; + QTest::newRow("Qt-Messages") << tst_messaging::QMessaging << tst_messaging::Messages; + QTest::newRow("Native-Messages") << tst_messaging::Native << tst_messaging::Messages; + +} + + +void tst_messaging::tst_fetchAll() +{ + QFETCH(tst_messaging::platform, platform); + QFETCH(tst_messaging::bases, base); + + if(platform == tst_messaging::QMessaging){ + if(base == tst_messaging::Accounts){ + QMessageAccountIdList list; + QMessageAccount acc; + list = m_mgr->queryAccounts(); + + QBENCHMARK { + while(!list.empty()) + acc = m_mgr->account(list.takeFirst()); + } + } + else if(base == tst_messaging::Folders){ + QMessageFolderIdList list; + QMessageFolder fol; + list = m_mgr->queryFolders(); + + QBENCHMARK { + while(!list.empty()) + fol = m_mgr->folder(list.takeFirst()); + } + } + else if(base == tst_messaging::Messages){ + QMessageIdList list; + QMessage msg; + list = m_mgr->queryMessages(); + if(list.count() == 0) + QFAIL("No messages to fetch"); + + qDebug() << "Total fetched messages: " << list.count(); + QBENCHMARK { + while(!list.empty()) + msg = m_mgr->message(list.takeFirst()); + } + } + //qDebug() << "Got cnt: " << cnt; + } + else if(platform == tst_messaging::Native){ +#ifdef Q_OS_SYMBIAN + if(base == tst_messaging::Messages){ + + __UHEAP_MARK; + + RArray aFolders; + int total = 0; + int skipped = 0; + + m_native->getFolders(aFolders); + + // Access the Inbox + QBENCHMARK { + + for(int i = 0; i < aFolders.Count(); i++){ + TMsvSelectionOrdering sort; + //sort.SetSorting(EMsvSortByDateReverse); + sort.SetSorting(EMsvSortByNone); + sort.SetShowInvisibleEntries(ETrue); + + CMsvEntry* inboxContext = CMsvEntry::NewL(*m_native->iSession, + aFolders[i], sort); + CleanupStack::PushL(inboxContext); + + // Get all entries in the Inbox + CMsvEntrySelection* entries = inboxContext->ChildrenL(); + CleanupStack::PushL(entries); + + for (TInt i = 0; i < entries->Count(); i++) { + + TMsvId entryID = entries->At(i); + + const TUid mtm = inboxContext->ChildDataL(entryID).iMtm; + +// qDebug() << "Entry: " << i << " mtm: " << hex << mtm.iUid; + + if (mtm == KUidMsgTypeSMS) { + + TRAP_IGNORE(m_native->iSmsMtm->SwitchCurrentEntryL(entryID)); + TRAPD(err, m_native->iSmsMtm->LoadMessageL()); + if(err){ + qDebug() << "LoadMessageL failed: " << err; + continue; + } + //CSmsHeader& header = m_native->iSmsMtm->SmsHeader(); + total++; + } + else if (mtm == KUidMsgTypeMultimedia) { + + // TODO None of these have a data store...skip until it can be fixed + +// CMsvEntry* pEntry = NULL; +// pEntry = m_native->iSession->GetEntryL(entryID); +// const TMsvEntry& entry = pEntry->Entry(); +// +// QString details = QString::fromUtf16(entry.iDetails.Ptr(),entry.iDetails.Length()); +// QString desc = QString::fromUtf16(entry.iDescription.Ptr(),entry.iDescription.Length()); +// qDebug() << "Nothing returned for entry: " << entryID << "/" << entry.Id() << " " << details << " - " << desc << " Has store: " << pEntry->HasStoreL(); +//// m_native->iImap4Mtm->SwitchCurrentEntryL(entry.Id()); + + +// m_native->iMmsMtm->SwitchCurrentEntryL(entryID); +// TRAPD(err, m_native->iMmsMtm->LoadMessageL()); +// if(err){ +// qDebug() << "LoadMessageL failed: " << err << "entryId/mtm" << entryID << "/" << mtm.iUid; +// continue; +// } + skipped++; + } + else if (mtm == KUidMsgTypeIMAP4 || mtm == KUidMsgTypeSMTP) { + CMsvEntry* pEntry = NULL; + pEntry = m_native->iSession->GetEntryL(entryID); + + CImEmailMessage *pMsg = CImEmailMessage::NewLC(*pEntry); + + CMsvStore *store = 0x0; + TRAPD(err, store = pEntry->ReadStoreL()); + if(err){ +// TPtrC sub; +// m_native->iImap4Mtm->SwitchCurrentEntryL(entryID); +// m_native->iImap4Mtm->LoadMessageL(); +// TRAP(err,sub.Set(m_native->iImap4Mtm->SubjectL())); +// if(err){ +// qDebug() << "No subject either: " << err; +// } +// qDebug() << "Can't read store: " << err << hex << entryID << " Details: " << QString::fromUtf16(sub.Ptr(), sub.Length()); + skipped++; + CleanupStack::PopAndDestroy(pMsg); + continue; + } + CleanupStack::PushL(store); + + CImHeader* header = CImHeader::NewLC(); + header->RestoreL(*store); + + //subject buffer contains the "subject" of the mail. + TBuf<50> subject = header->Subject(); + + //header buffer contains the "header" of the mail. + TBuf<50> from = header->From(); + + CleanupStack::PopAndDestroy(header); + CleanupStack::PopAndDestroy(store); + CleanupStack::PopAndDestroy(pMsg); + + total++; + } + else { +// qDebug() << "Got Type: " << mtm.iUid; + } + } + CleanupStack::PopAndDestroy(2, inboxContext); + } + } +// qDebug() << "Total messages fetched: " << total << " skipped: " << skipped; + __UHEAP_MARKEND; + } +#endif + } + +} + + + +void tst_messaging::tst_fetchFilter_data() +{ + QTest::addColumn("platform"); + QTest::addColumn("filter"); + + QTest::newRow("Qt-Id") << tst_messaging::QMessaging << tst_messaging::Id; + QTest::newRow("Qt-Type") << tst_messaging::QMessaging << tst_messaging::Type; + QTest::newRow("Qt-Sender") << tst_messaging::QMessaging << tst_messaging::Sender; + QTest::newRow("Qt-Subject") << tst_messaging::QMessaging << tst_messaging::Subject; + QTest::newRow("Qt-TimeStamp") << tst_messaging::QMessaging << tst_messaging::TimeStamp; + QTest::newRow("Qt-Status") << tst_messaging::QMessaging << tst_messaging::Status; + QTest::newRow("Qt-Priority") << tst_messaging::QMessaging << tst_messaging::Priority; + QTest::newRow("Qt-Size") << tst_messaging::QMessaging << tst_messaging::Size; + // XXX Test is broken, User::Panic(47) on symbian +// QTest::newRow("Qt-AllId") << tst_messaging::QMessaging << tst_messaging::AllId; + QTest::newRow("Qt-AllSender") << tst_messaging::QMessaging << tst_messaging::AllSender; + + QTest::newRow("Native-Id") << tst_messaging::Native << tst_messaging::Id; + QTest::newRow("Native-Type") << tst_messaging::Native << tst_messaging::Type; + QTest::newRow("Native-Sender") << tst_messaging::Native << tst_messaging::Sender; + QTest::newRow("Native-Subject") << tst_messaging::Native << tst_messaging::Subject; + QTest::newRow("Native-TimeStamp") << tst_messaging::Native << tst_messaging::TimeStamp; + QTest::newRow("Native-Status") << tst_messaging::Native << tst_messaging::Status; + QTest::newRow("Native-Priority") << tst_messaging::Native << tst_messaging::Priority; + QTest::newRow("Native-Size") << tst_messaging::Native << tst_messaging::Size; + QTest::newRow("Native-AllId") << tst_messaging::Native << tst_messaging::AllId; + QTest::newRow("Native-AllSender") << tst_messaging::Native << tst_messaging::AllSender; + + // QTest::newRow("Native-Size") << tst_messaging::Native << tst_messaging::Size; +} + +void tst_messaging::tst_fetchFilter() +{ + QFETCH(tst_messaging::platform, platform); + QFETCH(tst_messaging::filter, filter); + + if(platform == tst_messaging::QMessaging){ + + QMessageId msgId; + QMessageFilter mf; + QMessageId id; + // let's assume we want equal tests for all the filters. + // So let's try and filter out 1 message from each filter request. + if(filter == tst_messaging::Id){ + id = msg_list.takeFirst(); + mf = QMessageFilter::byId(id); + msg_list.push_back(id); + } + else if(filter == tst_messaging::Type){ + QMessage *msg = messageTemplate(); + + msgId = addMessage(msg); + mf = QMessageFilter::byType(QMessage::Sms); + + } + else if(filter == tst_messaging::Sender){ + QString email = "singletst@boo.com"; + QMessage *msg = messageTemplate(); + QMessageAddress addr; + addr.setAddressee(email); + msg->setFrom(addr); + msgId = addMessage(msg); + + id = msg_list.takeFirst(); + mf = QMessageFilter::bySender(email); + } + else if(filter == tst_messaging::TimeStamp){ + QMessage *msg = messageTemplate(); + QDateTime dt = QDateTime::currentDateTime(); + dt.addDays(1); + msg->setReceivedDate(dt); + msg->setDate(dt); + msgId = addMessage(msg); + + mf = QMessageFilter::byTimeStamp(dt, QMessageDataComparator::Equal); + } + else if(filter == tst_messaging::Status){ + QMessage *msg = messageTemplate(); + msg->setStatus(QMessage::Incoming); + msgId = addMessage(msg); + + mf = QMessageFilter::byStatus(QMessage::Incoming); + } + else if(filter == tst_messaging::Subject){ + QMessage *msg = messageTemplate(); + QString subject = "skdflkdsjfl sdfklke werewr"; + msg->setSubject(subject); + msgId = addMessage(msg); + + mf = QMessageFilter::bySubject(subject); + } + else if(filter == tst_messaging::Priority){ + QMessage *msg = messageTemplate(); + msg->setPriority(QMessage::LowPriority); + msgId = addMessage(msg); + + mf = QMessageFilter::byPriority(QMessage::LowPriority); + } + else if(filter == tst_messaging::Size){ + QString body; + body.fill('x', 5120); + QMessage *msg = messageTemplate(); + msg->setBody(body); + msgId = addMessage(msg); + + mf = QMessageFilter::bySize(5000, QMessageDataComparator::GreaterThan); + } + else if(filter == tst_messaging::AllId){ +// mf = QMessageFilter::byId(msg_list.mid(0, 2)); works, mid(0,15) fails... + mf = QMessageFilter::byId(msg_list); + } + else if(filter == tst_messaging::AllSender){ + id = msg_list.takeFirst(); + msg_list.push_back(id); + QMessage msg = m_mgr->message(id); + + mf = QMessageFilter::bySender(msg.from().addressee()); + } + if(!mf.isSupported()){ + QFAIL("QMessage filter returned unsupported"); + } + else if(mf.isEmpty()){ + QFAIL("Empty filter provided"); + } + else { + QMessageIdList list; + QMessageSortOrder sortOrder(QMessageSortOrder::byReceptionTimeStamp(Qt::DescendingOrder)); + QBENCHMARK { + list = m_mgr->queryMessages(mf, sortOrder, 100); + } + if(list.count() != 1 && filter != tst_messaging::AllId && filter != tst_messaging::AllSender) + qDebug() << "Wanted 1 message got: " << list.count(); + } + + if(msgId.isValid()){ + m_mgr->removeMessage(msgId); + } + } + else if(platform == tst_messaging::Native){ +#ifdef Q_OS_SYMBIAN + if(filter == tst_messaging::Id){ + // Access the Inbox + QBENCHMARK { + TMsvSelectionOrdering sort; + //sort.SetSorting(EMsvSortByDateReverse); + sort.SetSorting(EMsvSortById); + sort.SetShowInvisibleEntries(ETrue); + + CMsvEntry* inboxContext = CMsvEntry::NewL(*m_native->iSession, + KMsvDraftEntryIdValue /*KMsvGlobalInBoxIndexEntryId*/, sort); + CleanupStack::PushL(inboxContext); // 1 + + // Get all entries in the Inbox + CMsvEntrySelection* entries = inboxContext->ChildrenL(); + CleanupStack::PushL(entries); // 2 + if(entries->Count() == 0){ + CleanupStack::PopAndDestroy(2, inboxContext); + QSKIP("No messages on device to list", SkipAll); + } + + TMsvId entryID = entries->At(0); + + const TUid mtm = inboxContext->ChildDataL(entryID).iMtm; + + CleanupStack::PopAndDestroy(2, inboxContext); + } + } + else if(filter == tst_messaging::Type){ // look for SMS messages + // Access the Inbox + RArray msvids; + RArray aFolders; + + m_native->getFolders(aFolders); + + //qDebug() << "Total folders: " << aFolders.Count(); + + QBENCHMARK { + msvids.Close(); // zero it out + for(int i = 0; i < aFolders.Count(); i++){ + + TMsvSelectionOrdering sort; + //sort.SetSorting(EMsvSortByDateReverse); + sort.SetSorting(EMsvSortByNone); + sort.SetShowInvisibleEntries(ETrue); + + CMsvEntry* inboxContext = CMsvEntry::NewL(*m_native->iSession, + aFolders[i], sort); + CleanupStack::PushL(inboxContext); + + // Get all entries in the Inbox + CMsvEntrySelection* entries = inboxContext->ChildrenL(); + CleanupStack::PushL(entries); + + for (TInt j = 0; j < entries->Count(); j++) { + TMsvId entryID = entries->At(j); + const TUid mtm = inboxContext->ChildDataL(entryID).iMtm; + + if (mtm == KUidMsgTypeSMS) { + msvids.AppendL(entryID); + } + } + CleanupStack::PopAndDestroy(2, inboxContext); + } + } + msvids.Close(); + } + else if(filter == tst_messaging::Sender || + filter == tst_messaging::Subject || + filter == tst_messaging::TimeStamp){ + // Access the Inbox + + TMsvPartList part = KMsvMessagePartDescription; + TPtrC text = _L("tst"); + + if(filter == tst_messaging::Sender){ + part = KMsvMessagePartOriginator; + text.Set(_L("Millicent")); + } + else if(filter == tst_messaging::Subject){ + part = KMsvMessagePartDescription; + text.Set(_L("Free Bottle")); + } + else if(filter == tst_messaging::TimeStamp){ + part = KMsvMessagePartDate; + text.Set(_L("Sep")); + } + + CMsvOperationActiveSchedulerWait* waiter=CMsvOperationActiveSchedulerWait::NewLC(); + + CMsvFindOperation *finder = CMsvFindOperation::FindInChildrenL(*m_native->iSession, text, KMsvRootIndexEntryId, part, waiter->iStatus); + CleanupStack::PushL(finder); + + QBENCHMARK { + waiter->Start(); + } + if(finder->GetFindResult().Count() != 1) + qDebug() << "Wanted 1 message, got: " << finder->GetFindResult().Count(); + +// qDebug() << "Status: " << finder->GetFindResult().Count(); +// for(int i = 0; i < finder->GetFindResult().Count(); i++){ +// CMsvEntry *pEntry; +// TRAPD(err, pEntry = m_native->iSession->GetEntryL(finder->GetFindResult().At(i).iId)); +// if(err){ +// qDebug() << "Failed to fetch: " << i << " - " << finder->GetFindResult().At(i).iId; +// continue; +// } +// CleanupStack::PushL(pEntry); +// TMsvEntry entry = pEntry->Entry(); +// QString details = QString::fromUtf16(entry.iDetails.Ptr(),entry.iDetails.Length()); +// QString desc = QString::fromUtf16(entry.iDescription.Ptr(),entry.iDescription.Length()); +// qDebug() << "Got entry: " << details << " - " << desc; +// CleanupStack::PopAndDestroy(1); // +// } + + CleanupStack::PopAndDestroy(2, waiter); + + } + else if(filter == tst_messaging::Priority) { + RArray msvids; + + CMsvOperationActiveSchedulerWait* waiter=CMsvOperationActiveSchedulerWait::NewLC(); + + TBufC<10> null(_L(" ")); + CMsvFindOperation *finder = CMsvFindOperation::FindInChildrenL(*m_native->iSession, null, KMsvRootIndexEntryId, KMsvMessagePartDescription, waiter->iStatus); + CleanupStack::PushL(finder); + + QBENCHMARK { + waiter->Start(); + + const CMsvFindResultSelection &res = finder->GetFindResult(); + + for(int i = 0; i < res.Count(); i++){ + CMsvEntry *pEntry = 0x0; + TRAPD(err, pEntry = m_native->iSession->GetEntryL(res.At(i).iId)); + if(err){ + qDebug() << "Failed to fetch: " << i << " - " << res.At(i).iId; + continue; + } + CleanupStack::PushL(pEntry); + TMsvEntry entry = pEntry->Entry(); + + if(entry.Priority() == EMsvLowPriority) + msvids.Append(entry.Id()); + + CleanupStack::PopAndDestroy(1); // + } + } + msvids.Close(); + CleanupStack::PopAndDestroy(2, waiter); + } + else if(filter == tst_messaging::Size){ + RArray msvids; + + CMsvOperationActiveSchedulerWait* waiter=CMsvOperationActiveSchedulerWait::NewLC(); + + TBufC<10> null(_L(" ")); + CMsvFindOperation *finder = CMsvFindOperation::FindInChildrenL(*m_native->iSession, null, KMsvRootIndexEntryId, KMsvMessagePartDescription, waiter->iStatus); + CleanupStack::PushL(finder); + + QBENCHMARK { + waiter->Start(); + + const CMsvFindResultSelection &res = finder->GetFindResult(); + + for(int i = 0; i < res.Count(); i++){ + CMsvEntry *pEntry = 0x0; + TRAPD(err, pEntry = m_native->iSession->GetEntryL(res.At(i).iId)); + if(err){ + qDebug() << "Failed to fetch: " << i << " - " << res.At(i).iId; + continue; + } + CleanupStack::PushL(pEntry); + TMsvEntry entry = pEntry->Entry(); + + if(entry.iSize == 550) + msvids.Append(entry.Id()); + + CleanupStack::PopAndDestroy(1); // + } + } + msvids.Close(); + CleanupStack::PopAndDestroy(2, waiter); + } + if(filter == tst_messaging::AllId){ + // Access the Inbox + QBENCHMARK { + RArray msvids; + + TMsvSelectionOrdering sort; + //sort.SetSorting(EMsvSortByDateReverse); + sort.SetSorting(EMsvSortById); + sort.SetShowInvisibleEntries(ETrue); + + CMsvEntry* inboxContext = CMsvEntry::NewL(*m_native->iSession, + KMsvGlobalInBoxIndexEntryId, sort); + CleanupStack::PushL(inboxContext); + + // Get all entries in the Inbox + CMsvEntrySelection* entries = inboxContext->ChildrenL(); + CleanupStack::PushL(entries); + + for(int i = 0; i < entries->Count(); i++){ + msvids.Append(entries->At(i)); + } + + msvids.Close(); + + CleanupStack::PopAndDestroy(2, inboxContext); + } + } + else if(filter == tst_messaging::AllSender){ + RArray msvids; + + CMsvOperationActiveSchedulerWait* waiter=CMsvOperationActiveSchedulerWait::NewLC(); + + TBufC<10> null(_L("@")); + CMsvFindOperation *finder = CMsvFindOperation::FindInChildrenL(*m_native->iSession, null, KMsvRootIndexEntryId, KMsvMessagePartOriginator, waiter->iStatus); + CleanupStack::PushL(finder); + + QBENCHMARK { + waiter->Start(); + + const CMsvFindResultSelection &res = finder->GetFindResult(); + TMsvSelectionOrdering order; + + CMsvEntry *pEntry = CMsvEntry::NewL(*m_native->iSession, KMsvRootIndexEntryId, TMsvSelectionOrdering(KMsvNoGrouping, EMsvSortByNone)); + CleanupStack::PushL(pEntry); + + for(int i = 0; i < res.Count(); i++){ + TRAPD(err, pEntry->SetEntryL(res.At(i).iId)); + if(err){ + qDebug() << "Failed to fetch: " << i << " - " << res.At(i).iId; + continue; + } + TMsvEntry entry = pEntry->Entry(); + + msvids.Append(entry.Id()); + + } + + CleanupStack::PopAndDestroy(pEntry); + } + msvids.Close(); + CleanupStack::PopAndDestroy(2, waiter); + } +#endif + } +} + +void tst_messaging::clearMessages() +{ + QMessageId id; + int num = 0; + qDebug() << "Start QtMessaging removal"; + while(!msg_list.empty()) + m_mgr->removeMessage(msg_list.takeFirst()), num++; + qDebug() << "Start Native removal"; +#ifdef Q_OS_SYMBIAN + while(m_native->iNewMsgs.Count()) + m_native->iSession->RemoveEntry(m_native->iNewMsgs[0]), m_native->iNewMsgs.Remove(0), num++; +#endif + + qDebug() << "Cleanup Removed: " << num; +} + +QMessage *tst_messaging::messageTemplate() +{ + QMessage *msg = new QMessage; + + msg->setType(QMessage::Email); + msg->setDate(QDateTime::currentDateTime()); + msg->setSubject("test"); + QMessageAddress addr; + addr.setAddressee("abr@foo.com"); + addr.setType(QMessageAddress::Email); + msg->setTo(addr); + addr.setAddressee("from@bar.com"); + addr.setType(QMessageAddress::Email); + msg->setFrom(addr); + + return msg; +} + +QMessageId tst_messaging::addMessage(QMessage *msg) +{ + if(!m_mgr->addMessage(msg)) + qDebug() << "Failed to add message: " << m_mgr->error(); + + msg_list.append(msg->id()); + + //qDebug() << "id: " << msg->id().toString(); + + return msg->id(); +} + +QMessage *tst_messaging::createMessage() +{ + QMessage *msg = messageTemplate(); + addMessage(msg); + return msg; +} + +int tst_messaging::countMessages() +{ + QMessageIdList list; + list = m_mgr->queryMessages(); + return list.count(); +} + +void tst_messaging::tst_addMessage_data() +{ + QTest::addColumn("platform"); + QTest::addColumn("type"); + + QTest::newRow("Qt-Email") << tst_messaging::QMessaging << tst_messaging::Email; +// XXX SMS broken. On clean devices there is no SMSMC to create messages for. +// QTest::newRow("Native-SMS") << tst_messaging::Native << tst_messaging::Sms; + QTest::newRow("Native-Email") << tst_messaging::Native << tst_messaging::Email; + +} + +void tst_messaging::tst_addMessage() +{ + QFETCH(tst_messaging::platform, platform); + QFETCH(tst_messaging::types, type); + + if(platform == tst_messaging::QMessaging){ + QBENCHMARK { + QMessage *msg = createMessage(); + addMessage(msg); + } + } + else if(platform == tst_messaging::Native){ +#ifdef Q_OS_SYMBIAN + if(type == tst_messaging::Sms){ + TMsvId id; + QBENCHMARK { + TRAPD(err, id = m_native->makeSMS(KMsvGlobalInBoxIndexEntryId)); + if(err){ + qDebug() << "Failed to create sms: " << err; + } + } + m_native->iNewMsgs.Append(id); + } + else if(type == tst_messaging::Email){ + TMsvId id; + QBENCHMARK { + TRAPD(err, id = m_native->makeIMAP4(KMsvGlobalInBoxIndexEntryId)); + if(err){ + qDebug() << "Failed to create sms: " << err; + } + + } + m_native->iNewMsgs.Append(id); + } +#else + Q_UNUSED(type); +#endif + } + +} + +void tst_messaging::tst_removeMessage_data() +{ + QTest::addColumn("platform"); + + QTest::newRow("Qt-remove") << tst_messaging::QMessaging; + QTest::newRow("Native-remove") << tst_messaging::Native; +} + +void tst_messaging::tst_removeMessage() +{ + QFETCH(tst_messaging::platform, platform); + + if(platform == tst_messaging::QMessaging){ +//#ifdef Q_OS_SYMBIAN +// TMsvId id; +// id = m_native->makeIMAP4(KMsvDraftEntryIdValue); +// QString str; +// str.setNum(id); +// QMessageId qmid = str; +//#else + QMessageId qmid = msg_list.takeFirst(); +//#endif + + QBENCHMARK_ONCE { + m_mgr->removeMessage(qmid); + } + } + else if(platform == tst_messaging::Native){ +#ifdef Q_OS_SYMBIAN + TMsvId id; + id = m_native->makeIMAP4(KMsvDraftEntryIdValue); + CMsvEntry *pEntry = CMsvEntry::NewL(*m_native->iSession, id, TMsvSelectionOrdering()); + CleanupStack::PushL(pEntry); + QBENCHMARK_ONCE { // We're only guaranteed one entry to delete. Not a fast process anyways.s + TRAPD(err, pEntry->DeleteL(id)); // slightly dangerous since we never want this failing, but it can fail too something, should debug TODO + if(err){ + QFAIL(QString("Message delete failed with error: " + QString::number(err)).toAscii()); + } + } + CleanupStack::PopAndDestroy(pEntry); +#endif + } + +} + +void tst_messaging::tst_removeAllMessage_data() +{ + QTest::addColumn("platform"); + + QTest::newRow("Qt-removeAll") << tst_messaging::QMessaging; + QTest::newRow("Native-removeAll") << tst_messaging::Native; +} + +void tst_messaging::tst_removeAllMessage() +{ + QFETCH(tst_messaging::platform, platform); + + if(platform == tst_messaging::QMessaging){ + QBENCHMARK { + while(!msg_list.empty()) + m_mgr->removeMessage(msg_list.takeFirst()); + } + } + else if(platform == tst_messaging::Native){ +#ifdef Q_OS_SYMBIAN + // make sure there's enough messages to delete + while(m_native->iNewMsgs.Count() < 30) { + TMsvId id; + id = m_native->makeIMAP4(KMsvDraftEntryIdValue); + m_native->iNewMsgs.Append(id); + } + + QBENCHMARK { + CMsvEntry *pEntry = 0x0; + TRAPD(err, pEntry = CMsvEntry::NewL(*m_native->iSession, KMsvRootIndexEntryId, TMsvSelectionOrdering())); + if(err){ + qDebug() << "Failed to init CMsvEntryL " << err; + return; + } + CleanupStack::PushL(pEntry); + while(m_native->iNewMsgs.Count() != 0) { + TMsvId id = m_native->iNewMsgs[0]; + m_native->iNewMsgs.Remove(0); + //pEntry->SetEntryL(id); + TRAP_IGNORE(pEntry->DeleteL(id)); + } + CleanupStack::PopAndDestroy(pEntry); + } +#endif + } + +} + +#if defined(Q_OS_SYMBIAN) + +void OsNative::getFolders(RArray &folders) { + __UHEAP_MARK; + + CEmailAccounts *email = CEmailAccounts::NewLC(); + RArray aPop; + RArray aImap; + RArray aSmtp; + +#ifndef KDocumentsEntryIdValue +#define KDocumentsEntryIdValue 0x1008 +#endif + + folders.Append(KMsvRootIndexEntryId); + folders.Append(KMsvLocalServiceIndexEntryId); + folders.Append(KMsvGlobalInBoxIndexEntryId); + folders.Append(KMsvGlobalOutBoxIndexEntryId); + folders.Append(KMsvDraftEntryId); + folders.Append(KMsvSentEntryId); + folders.Append(KMsvDeletedEntryFolderEntryId); + folders.Append(KDocumentsEntryIdValue); + folders.Append(KMsvMyFoldersEntryId); + + email->GetPopAccountsL(aPop); + email->GetImapAccountsL(aImap); + email->GetSmtpAccountsL(aSmtp); + + RArray aService; + +// aService.Append(KMsvLocalServiceIndexEntryId); +// aService.Append(KMsvRootIndexEntryId); + + for(int i = 0; i < aPop.Count(); i++){ + aService.Append(aPop[i].iPopService); + } + for(int i = 0; i < aImap.Count(); i++){ + aService.Append(aImap[i].iImapService); + } + for(int i = 0; i < aSmtp.Count(); i++){ + aService.Append(aSmtp[i].iSmtpService); + } + + TSmtpAccount sacc; + if(email->DefaultSmtpAccountL(sacc)) + aService.Append(sacc.iSmtpService); + + if(aService.Count() > 0) { + CMsvEntry* pEntry = NULL; + + TRAPD(err, pEntry = iSession->GetEntryL(aService[0])); + if(!err) { + CleanupStack::PushL(pEntry); + for(int i = 0; i < aService.Count(); i++){ + TMsvId msvid = aService[i]; + + TRAP(err, pEntry->SetEntryL(msvid)); // faster to call set, saves .2ms out of 2.7ms. + if(err) + continue; + + const TMsvEntry& entry = pEntry->Entry(); + CMsvEntryFilter* pFilter = CMsvEntryFilter::NewLC(); + pFilter->SetService(msvid); + pFilter->SetType(KUidMsvFolderEntry); + CMsvEntrySelection* pSelection = new(ELeave) CMsvEntrySelection; + CleanupStack::PushL(pSelection); + + if (entry.iMtm == KUidMsgTypeSMS || entry.iMtm == KUidMsgTypeMultimedia || entry.iMtm == KUidMsgTypeSMTP) + pEntry->SetEntryL(KDocumentsEntryIdValue); + + iSession->GetChildIdsL(msvid, *pFilter, *pSelection); + for(TInt i = 0; i < pSelection->Count(); i++) { + folders.Append(pSelection->At(i)); + pEntry->SetEntryL(pSelection->At(i)); + if(pEntry->Entry().iMtm == KUidMsvFolderEntry){ + aService.Append(pSelection->At(i)); + } + } + CleanupStack::PopAndDestroy(pSelection); + CleanupStack::PopAndDestroy(pFilter); + + } + CleanupStack::PopAndDestroy(pEntry); + } + } + aPop.Close(); + aImap.Close(); + aSmtp.Close(); + aService.Close(); + + CleanupStack::PopAndDestroy(email); + __UHEAP_MARKEND; +} +#endif + +int main(int argc, char **argv){ + + QApplication app(argc, argv); + + tst_messaging test1; + QTest::qExec(&test1, argc, argv); + +} +//QTEST_MAIN(tst_messaging); + + +#include "tst_messaging.moc" +