--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/messagingapp/msgutils/unidatautils/unidatamodelplugins/unibiomessagedataplugin/tsrc/testunidatamodelvcalplugin/src/testunidatamodelvcalplugin.cpp Sun Jul 25 18:59:19 2010 +0530
@@ -0,0 +1,682 @@
+/*
+ * Copyright (c) 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 <QtTest/QtTest>
+#include <QtDebug>
+#include <QTimer>
+#include <QSignalSpy>
+#include <xqconversions.h>
+#include <bsp.h>
+#include <biodb.h>
+#include <biouids.h>
+#include <biocmtm.h>
+#include "convergedmessageaddress.h"
+
+#include "testunidatamodelvcalplugin.h"
+#include <unidatamodelloader.h>
+#include "testunidatamodelvcalplugin.ini"
+#include "unidatamodelplugininterface.h"
+#include <convergedmessage.h>
+
+const TInt KTelephoneNumberMaxLength = 32;
+_LIT(KBIOTxtFilePath, "C:\\test\\");
+_LIT(KBIOvCalenderPrefix, "vcal*");
+// vCalender
+_LIT(KUnixEpoch, "19700000:000000.000000");
+#define KBioUidValue 0x10001262
+
+const TUid KBioUidValueUid =
+{KBioUidValue};
+
+
+
+
+//out put directory for test results.
+QString OUTPUTDIRECTORY = "c:/logs/TestUniDataModelVCalPlugin";
+//o/p directory for data to be written on temp file.
+QString TEMPDIR = "c:/logs/TestUniDataModelVCalPlugin/testdata";
+//test result O/P file name.
+QString RESULTFILE = "c:/logs/TestUniDataModelVCalPlugin/result_%1.txt";
+// folder named UID3 of TestUniDataModelVCalPlugin inside private folder.
+const QString PRIVATE_DIR("C:/private/Ed034a47");
+
+//factory method to create objects.
+QObject* getObject(QString className)
+{
+ if(className == "TestUniDataModelVCalPlugin" )
+ {
+ return new TestUniDataModelVCalPlugin;
+ }
+ else
+ {
+ return 0;
+ }
+}
+
+//creating o/p directory.
+void createOutPutDirectory()
+ {
+ QDir dir;
+ //o/p dir
+ dir.mkdir(OUTPUTDIRECTORY);
+ //tmp dir
+ dir.mkdir(TEMPDIR);
+ // dir inside private folder.
+ dir.mkdir(PRIVATE_DIR);
+ }
+
+//main entry point
+int main(int argc, char *argv[])
+ {
+ int ret = -1;
+ QCoreApplication app(argc, argv);
+
+ //creating output directory.
+ createOutPutDirectory();
+
+ //the configuration file.
+ QFile data("c:/TestUniDataModelVCalPlugin.cfg");
+
+ if (data.open(QFile::ReadOnly))
+ {
+ QTextStream in(&data);
+ while(!in.atEnd())
+ {
+ QStringList args;
+ QString appName = argv[0];
+ args << appName;
+
+ QString option = "-o";
+ args << option;
+
+ QString outFile = RESULTFILE;
+ QString name = in.readLine();
+ outFile = outFile.arg(name);
+ args << outFile;
+
+ QObject* tc = getObject(name);
+
+ if(tc)
+ {
+
+ ret = QTest::qExec(tc, args);
+ delete tc;
+ }
+ }
+ }
+ data.close();
+ return ret;
+ }
+
+
+
+
+
+//---------------------------------------------------------------
+// TestUniDataModelVCalPlugin::init
+//---------------------------------------------------------------
+
+
+void TestUniDataModelVCalPlugin::initTestCase()
+{
+ iObserver = new (ELeave) MsgObserver();
+
+ // Create a new messaging server session..
+ iMSession = CMsvSession::OpenSyncL(*iObserver);
+
+ iMsvEntry = iMSession->GetEntryL(KMsvRootIndexEntryId);
+ newEntryId = 0;
+ pluginLoader = new UniDataModelLoader();
+
+ retTimeStamp = QDateTime::currentDateTime();
+ int err = iFs.Connect();
+ QVERIFY(err == 0);
+ iBioDb = CBIODatabase::NewL(iFs);
+ iFs.SetSessionPath(_L("c:\\"));
+ inbox = EFalse;
+ drafts = EFalse;
+}
+void TestUniDataModelVCalPlugin::cleanupTestCase()
+{
+ delete iMsvEntry;
+ iMsvEntry = NULL;
+ delete iObserver;
+ iObserver = NULL;
+ delete iMSession;
+ iMSession = NULL;
+ delete pluginLoader;
+}
+
+void TestUniDataModelVCalPlugin::init()
+{
+
+}
+
+//---------------------------------------------------------------
+// TestUniDataModelVCalPlugin::cleanup
+//---------------------------------------------------------------
+void TestUniDataModelVCalPlugin::cleanup()
+{
+
+
+}
+
+void TestUniDataModelVCalPlugin::testInBoxVCalMessage()
+{
+ inbox = ETrue;
+ GenerateMessagesL();
+
+ pluginInterface = pluginLoader->getDataModelPlugin(ConvergedMessage::BioMsg);
+ pluginInterface->setMessageId(newEntryId);
+
+ int count = pluginInterface->attachmentCount();
+ QVERIFY(count == 1);
+
+ UniMessageInfoList attachmentlist = pluginInterface->attachmentList();
+ QVERIFY(!attachmentlist.isEmpty());
+
+ UniMessageInfo* att = attachmentlist.at(0);
+ QString path = att->path();
+
+ QString recepient(TEST_MSG_FROM1);
+ QString fromaddress;
+ pluginInterface->fromAddress(fromaddress);
+ QVERIFY(recepient == fromaddress);
+
+ QString body;
+ pluginInterface->body(body);
+ QVERIFY(!body.isEmpty());
+
+ // Compare input message , with the read message
+ RFile origFile;
+ int op = origFile.Open(iFs, currentFile, EFileRead);
+ QVERIFY(op == 0);
+
+ TBuf8<1000> readBuf;
+ HBufC* readBuf16 = HBufC::NewL(2000);
+
+ origFile.Read(readBuf);
+ readBuf16->Des().Copy(readBuf);
+
+ QString orig = XQConversions::s60DescToQString(*readBuf16);
+ origFile.Close();
+
+ HBufC* filepath = XQConversions::qStringToS60Desc(path);
+
+ int size = pluginInterface->messageSize();
+
+ MsgPriority priority = pluginInterface->messagePriority();
+ // Normal priority
+ qDebug() << "prority" << priority;
+ QVERIFY(priority == 1);
+
+ QVERIFY(pluginInterface->timeStamp() == retTimeStamp);
+
+ ConvergedMessageAddressList recipientList;
+ pluginInterface->toRecipientList(recipientList);
+ QVERIFY(recipientList.count() == 0);
+ qDebug() << "recipientList.count" << recipientList.count();
+
+ if (inbox)
+ {
+ iMsvEntry->SetEntryL(KMsvGlobalInBoxIndexEntryId);
+ qDebug() << "SetEntry" ;
+ }
+
+
+}
+
+void TestUniDataModelVCalPlugin::testDraftsVCalMessage()
+{
+ drafts = ETrue;
+ GenerateMessagesL();
+
+ pluginInterface = pluginLoader->getDataModelPlugin(ConvergedMessage::BioMsg);
+ pluginInterface->setMessageId(newEntryId);
+
+ int count = pluginInterface->attachmentCount();
+ QVERIFY(count == 1);
+
+ UniMessageInfoList attachmentlist = pluginInterface->attachmentList();
+ QVERIFY(!attachmentlist.isEmpty());
+
+ UniMessageInfo* att = attachmentlist.at(0);
+ QString path = att->path();
+
+ QString fromaddress;
+ pluginInterface->fromAddress(fromaddress);
+ QVERIFY(!fromaddress.isEmpty()); //added ! shweta
+
+ QString body;
+ pluginInterface->body(body);
+ QVERIFY(!body.isEmpty());
+
+ // Compare input message , with the read message
+ RFile origFile;
+ int op = origFile.Open(iFs, currentFile, EFileRead);
+ QVERIFY(op == 0);
+
+ TBuf8<1000> readBuf;
+ HBufC* readBuf16 = HBufC::NewL(2000);
+
+ origFile.Read(readBuf);
+ readBuf16->Des().Copy(readBuf);
+
+ QString orig = XQConversions::s60DescToQString(*readBuf16);
+ origFile.Close();
+
+ int size = pluginInterface->messageSize();
+
+ MsgPriority priority = pluginInterface->messagePriority();
+ // Normal priority
+ qDebug() << "prority" << priority;
+ QVERIFY(priority == 1);
+
+ QVERIFY(pluginInterface->timeStamp() == retTimeStamp);
+
+ QString recepient(TEST_MSG_FROM1);
+ ConvergedMessageAddressList recipientList;
+ ConvergedMessageAddress alias(recepient);
+
+ recipientList.append(&alias);
+ pluginInterface->toRecipientList(recipientList);
+
+ QVERIFY( recipientList.count() != 0 );
+ qDebug() << "recipientList.count()"<<recipientList.count() ;
+
+ const QString& copy = recipientList[0]->address();
+ qDebug() << "copy = "<<recipientList[0]->address();
+ QVERIFY(recepient == copy);
+ qDebug() << "Receipient Verified";
+
+ if (drafts)
+ {
+ iMsvEntry->SetEntryL(KMsvDraftEntryId);
+ qDebug() << "SetEntry" ;
+ }
+ }
+
+
+
+void TestUniDataModelVCalPlugin::testUnusedAPIs()
+{
+ pluginInterface = pluginLoader->getDataModelPlugin(ConvergedMessage::BioMsg);
+
+ QVERIFY(pluginInterface->objectCount() == 0);
+
+ UniMessageInfoList objectlist = pluginInterface->objectList();
+ QVERIFY(objectlist.isEmpty());
+
+ QVERIFY(pluginInterface->slideCount() == 0);
+
+ UniMessageInfoList slidelist = pluginInterface->slideContent(0);
+ QVERIFY(slidelist.isEmpty());
+
+ QVERIFY(pluginInterface->hasAttachment() == true );
+
+ ConvergedMessageAddressList recipientList;
+
+ pluginInterface->ccRecipientList(recipientList);
+ QVERIFY(recipientList.count() == 0);
+
+ pluginInterface->bccRecipientList(recipientList);
+ QVERIFY(recipientList.count() == 0);
+}
+
+CMsvEntrySelection* TestUniDataModelVCalPlugin::GenerateMessagesL()
+{
+ HBufC* aFileDirectory = KBIOTxtFilePath().AllocL();
+ TMsvId messageId;
+ TBIOMessageType currentMsgType;
+
+ CMsvEntrySelection* selection = new (ELeave) CMsvEntrySelection();
+ CleanupStack::PushL(selection);
+
+ TInt err = iFs.GetDir(aFileDirectory->Des(),
+ KEntryAttMatchMask,
+ ESortByName,
+ iDir);
+ if (err == KErrPathNotFound)
+ {
+ TInt makeDirErr = iFs.MkDirAll(aFileDirectory->Des());
+ makeDirErr == KErrNone ? User::Leave(KErrNotFound)
+ : User::Leave(makeDirErr);
+ }
+ else if (err != KErrNone)
+ {
+ User::Leave(err);
+ }
+
+ // Set the session path for the RFs
+ SetSessionPath(aFileDirectory->Des());
+ if (iDir)
+ {
+ delete iDir;
+ iDir = NULL;
+ }
+
+ User::LeaveIfError(iFs.GetDir(_L("*.txt"), KEntryAttNormal, ESortByName, iDir));
+ TInt count = iDir->Count();
+ if (count == 0)
+ {
+ User::Leave(KErrNotFound); // No files to process
+ }
+
+ TBuf<60> outputBuf;
+
+ for (TInt loop = 0; loop < count; loop++)
+ {
+ TEntry as = (*iDir)[0];
+ currentFile = (as.iName);
+ // Not processed all the messages - so keep the current state
+ iFilesProcessed++; // Here because need to update the counter promptly
+ currentMsgType = SetMessageType(currentFile);
+ if (currentMsgType != ENoMessage) // skip any dodgy filenames
+ {
+ messageId = CreateBIOEntryFromFileL(currentFile, currentMsgType);
+ selection->AppendL(messageId);
+ TPtrC tempPtr = (currentFile.Des());
+
+ }
+ }
+ CleanupStack::Pop(); // selection
+
+ return selection;
+}
+
+TBIOMessageType TestUniDataModelVCalPlugin::SetMessageType(
+ const TDesC& aFileName)
+{
+
+ if (aFileName.MatchF(KBIOvCalenderPrefix) == 0)
+ {
+ return EBiovCalenderMessage;
+ }
+
+ return ENoMessage;
+}
+
+TMsvId TestUniDataModelVCalPlugin::CreateBIOEntryFromFileL(
+ const TDesC& aFilename,
+ TBIOMessageType aMessageType)
+{
+ //First use the filename to get the message body,
+ // then convert '\n' to the paragraph delimiters used in proper SMS
+ HBufC* tempBuffer;
+
+ tempBuffer = ReadFromFileL(aFilename);
+ CleanupStack::PushL(tempBuffer);
+
+ newEntryId = CreateBIOEntryL(*tempBuffer, aMessageType);
+
+ // Finished with our local descriptors - free up some memory
+ CleanupStack::PopAndDestroy();
+
+ return newEntryId;
+}
+
+void TestUniDataModelVCalPlugin::SetSessionPath(const TDesC& aSessionPath)
+{
+ iFs.SetSessionPath(aSessionPath);
+}
+
+HBufC* TestUniDataModelVCalPlugin::ReadFromFileL(const TDesC& aFile)
+{
+ RFile file;
+ TBuf8<1024> lineBuffer;
+ TInt err = KErrNone;
+
+ err = file.Open(iFs, aFile, EFileStreamText | EFileRead | EFileShareAny);
+
+ if (err != KErrNone) // Didn't find the file, so leave - should only get valid filenames!
+ {
+ User::Leave(KErrNotFound);
+ }
+
+ HBufC* bioBuf = HBufC::NewLC(65535); // Create a new descriptor on the heap.
+ HBufC* copyBuffer = HBufC::NewLC(1024);
+
+ do // Read in the text from file, and also check if there is a name field:
+ {
+ err = file.Read(lineBuffer);// Read upto 256 chars, '\n' and all...
+ //err = ReadLineL(file,lineBuffer);
+ if (err == KErrNone) // Made a valid read,
+ if (lineBuffer.Length() == 0) // but read 0 chars
+ err = KErrEof; // so set err value to end processing
+
+ if (err == KErrNone)
+ {
+ copyBuffer->Des().Copy(lineBuffer);// Copy, and overwrite existing text
+ if ( (bioBuf->Length() + copyBuffer->Length())
+ > bioBuf->Des().MaxLength())
+ {
+ bioBuf = bioBuf->ReAllocL(bioBuf->Length()
+ + copyBuffer->Length());
+ }
+ bioBuf->Des().Append(*copyBuffer);
+ //bioBuf->Des().Append(_L("\n"));
+ }
+ }while (err != KErrEof);
+
+ CleanupStack::PopAndDestroy(); // Destroy the copyBuffer.
+ CleanupStack::Pop();// Remove the bioBuf.
+
+ file.Close();
+ return bioBuf;
+}
+
+TMsvId TestUniDataModelVCalPlugin::CreateBIOEntryL(TDesC& aText,
+ TBIOMessageType aMessageType)
+{
+ // Ensure that we have a valid service ID to work with:
+ TMsvId iBioServiceId;
+
+ iBioServiceId = SetBIOServiceIdL();
+
+ HBufC* localBuffer = aText.AllocL();
+ CleanupStack::PushL(localBuffer);
+
+ TPtr messDes = localBuffer->Des();
+
+ if (aMessageType != EBiovCardMessage && aMessageType
+ != EBiovCalenderMessage)
+ {
+ // convert \r\n to \n since this is what is expected from SMS when not vCard data
+ for (TInt i = 0; i < messDes.Length(); i++)
+ {
+ if (messDes[i] == (TText) '\r' && i < messDes.Length() - 1
+ && messDes[i + 1] == (TText) '\n')
+ messDes.Delete(i, 1);
+ }
+ }
+
+ // Create and fill a CRichText object for the jobbie:
+ CParaFormatLayer* paraFormatLayer = CParaFormatLayer::NewL();
+ CleanupStack::PushL(paraFormatLayer);
+ CCharFormatLayer* charFormatLayer = CCharFormatLayer::NewL();
+ CleanupStack::PushL(charFormatLayer);
+ CRichText* richText = CRichText::NewL(paraFormatLayer, charFormatLayer);
+ CleanupStack::PushL(richText);
+
+ TInt pos = richText->DocumentLength();
+ richText->InsertL(pos, messDes);
+
+ TMsvEntry newBioEntry;
+ newBioEntry.SetNew(ETrue);
+ newBioEntry.SetComplete(EFalse);
+ newBioEntry.SetUnread(ETrue);
+ newBioEntry.SetVisible(ETrue);
+ newBioEntry.SetReadOnly(EFalse);
+ newBioEntry.SetFailed(EFalse);
+ newBioEntry.SetOperation(EFalse);
+ newBioEntry.SetMultipleRecipients(EFalse);
+ newBioEntry.SetAttachment(EFalse);
+ newBioEntry.iMtm = KUidBIOMessageTypeMtm;
+ newBioEntry.iType = KUidMsvMessageEntry;
+ newBioEntry.iServiceId = iBioServiceId;
+ TTime now;
+ now.UniversalTime();
+ newBioEntry.iDate = now;
+
+ TTime unixEpoch(KUnixEpoch);
+ TTimeIntervalSeconds seconds;
+ TTime timeStamp = newBioEntry.iDate;
+ timeStamp.SecondsFrom(unixEpoch, seconds);
+ retTimeStamp.setTime_t(seconds.Int());
+
+ newBioEntry.iDescription.Set(richText->Read(0, richText->DocumentLength()));
+ TBufC<KTelephoneNumberMaxLength> telNumber;
+
+ QString recepient(TEST_MSG_FROM1);
+ tempNumber = XQConversions::qStringToS60Desc(recepient);
+
+ telNumber = tempNumber->Des();
+ newBioEntry.iDetails.Set(telNumber);
+
+ SetForMtmTypeL(newBioEntry, aMessageType);
+
+ newBioEntry.iSize = richText->DocumentLength();// msgSize;
+ CreateBioEntryClientSideL(newBioEntry, *richText);
+
+ CleanupStack::PopAndDestroy(4); // richText, charFormatLayer, paraFormatLayer, localBuffer
+ return newBioEntry.Id();
+}
+
+void TestUniDataModelVCalPlugin::CreateBioEntryClientSideL(TMsvEntry& aEntry,
+ CRichText& aBody)
+{
+ if (inbox)
+ {
+ iMsvEntry->SetEntryL(KMsvGlobalInBoxIndexEntryId);
+ }
+ else if (drafts)
+ {
+ iMsvEntry->SetEntryL(KMsvDraftEntryId);
+ }
+ // Get the global inbox.
+
+ iMsvEntry->CreateL(aEntry);
+ iMsvEntry->SetEntryL(aEntry.Id());
+
+ // Save all the changes
+ CMsvStore* store = iMsvEntry->EditStoreL();
+ CleanupStack::PushL(store);
+
+ if (store->HasBodyTextL())
+ {
+ store->DeleteBodyTextL();
+ }
+
+ CPlainText* pText = CPlainText::NewL();
+ CleanupStack::PushL(pText);
+
+ if (inbox)
+ {
+ CSmsHeader* smsHeader = CSmsHeader::NewL(CSmsPDU::ESmsDeliver, *pText);
+ CleanupStack::PushL(smsHeader);
+ smsHeader->SetFromAddressL(*tempNumber);
+ smsHeader->StoreL(*store);
+
+ }
+ else if (drafts)
+ {
+
+ QString recepient(TEST_MSG_FROM1);
+ QString recepient2(TEST_MSG_FROM2);
+ QString alias(TEST_MSG_ALIAS1);
+
+ HBufC* addr = XQConversions::qStringToS60Desc(recepient);
+ HBufC* addr2 = XQConversions::qStringToS60Desc(recepient2);
+ HBufC* alias1 = XQConversions::qStringToS60Desc(alias);
+
+ CSmsHeader* smsHeader = CSmsHeader::NewL(CSmsPDU::ESmsSubmit, *pText);
+ CleanupStack::PushL(smsHeader);
+
+ CSmsNumber* number1 = CSmsNumber::NewL(); // create the instance
+ CleanupStack::PushL(number1);
+
+ number1->SetNameL(TPtrC());
+ number1->SetAddressL(*addr);
+ smsHeader->Recipients().AppendL(number1);
+ CleanupStack::Pop(number1);
+
+ CSmsNumber* number2 = CSmsNumber::NewL();
+ CleanupStack::PushL(number2);
+
+ number2->SetNameL(*alias1);
+ number2->SetAddressL(*addr2);
+
+ smsHeader->Recipients().AppendL(number2);
+ CleanupStack::Pop(number2);
+ smsHeader->StoreL(*store);
+
+ }
+
+ store->StoreBodyTextL(aBody);
+ store->CommitL();
+
+ CleanupStack::PopAndDestroy(3); //store - close the store
+
+ aEntry.SetComplete(ETrue);
+ // Update the entry
+ iMsvEntry->ChangeL(aEntry);
+ iMsvEntry->SetEntryL(KMsvRootIndexEntryId);
+}
+
+TMsvId TestUniDataModelVCalPlugin::SetBIOServiceIdL()
+{
+ // Haven't found an entry so create a BIO Message service:
+ TMsvEntry bioServiceEntry;
+ bioServiceEntry.iMtm = KUidBIOMessageTypeMtm;
+ bioServiceEntry.iType = KUidMsvServiceEntry;
+ bioServiceEntry.SetVisible(EFalse);
+ bioServiceEntry.iDate.UniversalTime();
+ bioServiceEntry.iDescription.Set(_L("BIO Message Service ")); // Is there such a thing?
+ bioServiceEntry.iDetails.Set(_L("BIO Message Service"));
+
+ TMsvId newBIOServiceId;
+
+ iMsvEntry->SetEntryL(KMsvRootIndexEntryId);
+ iMsvEntry->CreateL(bioServiceEntry); // Needs to be a child of the root!
+ newBIOServiceId = bioServiceEntry.Id();
+
+ return newBIOServiceId;
+}
+
+void TestUniDataModelVCalPlugin::SetForMtmTypeL(TMsvEntry& aEntry,
+ TBIOMessageType aType)
+{
+ TInt index;
+
+ aEntry.iBioType = KUidBIOVCalenderMsg;
+
+ // Set other TMsvEntry fields if we have a BIO message type
+ if (aType != ENoMessage)
+ {
+ aEntry.SetMtmData2(0);
+ aEntry.SetMtmData3(0);
+ }
+
+ // set description from BIF file
+ iBioDb->GetBioIndexWithMsgIDL(TUid::Uid(aEntry.iBioType), index);
+ if (index == KErrNotFound)
+ User::Leave(KErrNotFound);
+ aEntry.iDescription.Set(iBioDb->BifReader(index).Description());
+}
+
+void MsgObserver::HandleSessionEventL(TMsvSessionEvent /*aEvent*/,
+ TAny* /*aArg1*/, TAny* /*aArg2*/, TAny* /*aArg3*/)
+{
+}