messagingapp/msgutils/unidatautils/unidatamodelplugins/unibiomessagedataplugin/tsrc/src/testunidatamodelvcalplugin.cpp
changeset 41 25fe1fe642e3
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/messagingapp/msgutils/unidatautils/unidatamodelplugins/unibiomessagedataplugin/tsrc/src/testunidatamodelvcalplugin.cpp	Fri Jul 09 14:46:10 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*/)
+{
+}