diff -r 08008ce8a6df -r bde600d88860 messagingfw/msgtest/integration/server/src/t_msgs.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/messagingfw/msgtest/integration/server/src/t_msgs.cpp Fri Jun 04 10:32:16 2010 +0100 @@ -0,0 +1,430 @@ +// Copyright (c) 2000-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 +#include +#include +#include "msvtestutils.h" +#include "msvtestconfig.h" +#include "msgservertestutils.h" +#include + +_LIT(KTestName,"Message Server Smoke test"); +RTest tests(KTestName); +CMsgServerTestUtils* theUtils = NULL; + + + + +class TTestSessionObserver: public MMsvSessionObserver + { +public: + TTestSessionObserver() : iNumberOfEvents(0) {}; + virtual void HandleSessionEventL(TMsvSessionEvent aEvent, TAny*, TAny*, TAny*) + { + iLastEvent=aEvent; + iNumberOfEvents++; + }; + + TInt CheckEvents(TInt aNumber) + { + _LIT(KNote3,"Checking session observer got the correct number of events\n"); + theUtils->Printf(KNote3); + TInt err=KErrNone; + if(iNumberOfEvents!=aNumber) + { + _LIT(KErrMsg,"Wrong Number of Events, Wanted %d Got %d, last event %d\n"); + theUtils->Printf(KErrMsg,aNumber,iNumberOfEvents,iLastEvent); + err=KErrUnknown; + } + iNumberOfEvents=0; + return err; + }; + + TInt CheckEvents(TInt aNumber, TMsvSessionEvent aLastEvent) + { + _LIT(KNote3,"Checking session observer got the correct event\n"); + theUtils->Printf(KNote3); + + TInt err=KErrNone; + if(aNumber !=0 && iLastEvent!=aLastEvent) + { + _LIT(KErrMsg,"Wrong Event Wanted %d Got %d\n"); + theUtils->Printf(KErrMsg,aLastEvent,iLastEvent); + err=KErrUnknown; + } + if(iNumberOfEvents!=aNumber) + { + _LIT(KErrMsg,"Wrong Number of Events Wanted %d Got %d\n"); + theUtils->Printf(KErrMsg,aNumber,iNumberOfEvents); + err=KErrUnknown; + } + iNumberOfEvents=0; + return err; + }; + +private: + + TMsvSessionEvent iLastEvent; + TInt iNumberOfEvents; + }; + + +class TTestEntryObserver: public MMsvEntryObserver + { +public: + TTestEntryObserver() : iNumberOfEvents(0) {}; + virtual void HandleEntryEventL(TMsvEntryEvent aEvent, TAny*, TAny*, TAny*) + { + iLastEvent=aEvent; + iNumberOfEvents++; + } + + + TInt CheckEvents(TInt aNumber) + { + _LIT(KNote3,"Checking entry observer got the correct number of events\n"); + theUtils->Printf(KNote3); + TInt err=KErrNone; + if(iNumberOfEvents!=aNumber) + { + _LIT(KErrMsg,"Wrong Number of Events, Wanted %d Got %d, last event %d\n"); + theUtils->Printf(KErrMsg,aNumber,iNumberOfEvents,iLastEvent); + err=KErrUnknown; + } + iNumberOfEvents=0; + return err; + }; + + TInt CheckEvents(TInt aNumber, TMsvEntryEvent aLastEvent) + { + _LIT(KNote3,"Checking entry observer got the correct event\n"); + theUtils->Printf(KNote3); + + TInt err=KErrNone; + if(iNumberOfEvents!=aNumber) + { + _LIT(KErrMsg,"Wrong Number of Events, Wanted %d Got %d\n"); + theUtils->Printf(KErrMsg,aNumber,iNumberOfEvents); + err=KErrUnknown; + } + if(iLastEvent!=aLastEvent) + { + _LIT(KErrMsg,"Wrong Entry Event, Wanted %d Got %d\n"); + theUtils->Printf(KErrMsg,aLastEvent,iLastEvent); + err=KErrUnknown; + } + iNumberOfEvents=0; + return err; + }; + + +private: + TMsvEntryEvent iLastEvent; + TInt iNumberOfEvents; + }; + + + +class TEntryObserverCleanup + { + public: + TEntryObserverCleanup(CMsvEntry &aEntry,TTestEntryObserver &aObserver) + : iEntry(aEntry), iObserver(aObserver) {}; + static void CleanupEntryObserver(TAny* aPtr) + { + TEntryObserverCleanup* me = STATIC_CAST(TEntryObserverCleanup*, aPtr); + me->Cleanup(); + }; + private: + void Cleanup() + { + iEntry.RemoveObserver(iObserver); + }; + + private: + CMsvEntry &iEntry; + TTestEntryObserver &iObserver; + }; + + +TInt RunWhilePending(const TRequestStatus &aStatus) + { + _LIT(KNote2,"Running scheduler till we complete\n"); + theUtils->Printf(KNote2); + + TInt err=KErrNone; + while(aStatus==KRequestPending) + { + CActiveScheduler::Current()->RunIfReady(err,0); + CActiveScheduler::Current()->WaitForAnyRequest(); + } + + _LIT(KNote3,"Completed\n"); + theUtils->Printf(KNote3); + return err; + } + + +// create a service +TInt CreateServiceTest(TTestSessionObserver &aObserver, CMsvEntry &aEntry, TMsvId &aServiceId) + { + + TMsvEntry tEntry; + + tEntry.iMtm = KUidMsgTypePOP3; + tEntry.iType = KUidMsvServiceEntry; + tEntry.SetReadOnly(EFalse); + tEntry.SetVisible(ETrue); + _LIT(KADescription,"A Fake Service"); + tEntry.iDescription.Set(KADescription); + + _LIT(KNote0,"Setting entry to root\n"); + theUtils->Printf(KNote0); + aEntry.SetEntryL(KMsvRootIndexEntryIdValue); + + _LIT(KNote1,"Starting async create service\n"); + theUtils->Printf(KNote1); + TRequestStatus status; + CMsvOperation *anop=aEntry.CreateL(tEntry,status); + CleanupStack::PushL(anop); + + TInt err=RunWhilePending(status); + if(err==KErrNone) + { + err=aObserver.CheckEvents(1,MMsvSessionObserver::EMsvEntriesCreated); + aServiceId = McliUtils::GetLocalProgressL(*anop).iId; + } + + CleanupStack::PopAndDestroy(anop); + return err ; + } + + +// create a service +TInt CreateMessageTest(TTestSessionObserver &aObserver, CMsvEntry &aEntry, TMsvId aServiceId, TMsvId& aMessageId) + { + _LIT(KNote0,"Setting entry to drafts entry\n"); + theUtils->Printf(KNote0); + aEntry.SetEntryL(KMsvDraftEntryIdValue); + _LIT(KNote1,"Observing draft entry\n"); + theUtils->Printf(KNote1); + TTestEntryObserver eObs; + aEntry.AddObserverL(eObs); + TEntryObserverCleanup clean(aEntry,eObs); + CleanupStack::PushL(TCleanupItem(TEntryObserverCleanup::CleanupEntryObserver, &clean)); + + + _LIT(KAnAddress,"Test@psion7.demon.co.uk"); + _LIT(KADescription,"A Message"); + + TMsvEntry message; + message.iDetails.Set(KAnAddress); + message.iDescription.Set(KADescription); + message.iMtm=KUidMsgTypePOP3; + + message.iServiceId=aServiceId; + message.iType=KUidMsvMessageEntry; + + _LIT(KNote2,"Starting async create message\n"); + theUtils->Printf(KNote2); + + TRequestStatus status; + CMsvOperation *anop=aEntry.CreateL(message,status); + CleanupStack::PushL(anop); + + TInt err=RunWhilePending(status); + + if(err==KErrNone) + { + aMessageId = McliUtils::GetLocalProgressL(*anop).iId; + err=aObserver.CheckEvents(1,MMsvSessionObserver::EMsvEntriesCreated); + } + if(err==KErrNone) + err=eObs.CheckEvents(1,MMsvEntryObserver::EMsvNewChildren); + + CleanupStack::PopAndDestroy(anop); + CleanupStack::PopAndDestroy(&clean); + return(err); + } + + +TInt CopyMessageTest(TTestSessionObserver &aObserver, CMsvEntry &aEntry, TMsvId aMessageId) + { + _LIT(KNote0,"Setting entry to drafts\n"); + theUtils->Printf(KNote0); + aEntry.SetEntryL(KMsvDraftEntryId); + _LIT(KNote1,"Observing drafts entry\n"); + theUtils->Printf(KNote1); + TTestEntryObserver eObs; + aEntry.AddObserverL(eObs); + TEntryObserverCleanup clean(aEntry,eObs); + CleanupStack::PushL(TCleanupItem(TEntryObserverCleanup::CleanupEntryObserver, &clean)); + + + _LIT(KNote3,"Starting async copy message on draft entry/aMessageId to Outbox\n"); + theUtils->Printf(KNote3); + + TRequestStatus status; + CMsvOperation *anop=aEntry.CopyL(aMessageId,KMsvGlobalOutBoxIndexEntryId,status); + CleanupStack::PushL(anop); + + TInt err=RunWhilePending(status); + + if(err==KErrNone) + err=aObserver.CheckEvents(1,MMsvSessionObserver::EMsvEntriesCreated); + if(err==KErrNone) + err=eObs.CheckEvents(0); + + CleanupStack::PopAndDestroy(anop); + CleanupStack::PopAndDestroy(&clean); + return err ; + } + +TInt MoveMessageTest(TTestSessionObserver &aObserver, CMsvEntry &aEntry, TMsvId aMessageId) + { + _LIT(KNote0,"Setting entry to drafts\n"); + theUtils->Printf(KNote0); + aEntry.SetEntryL(KMsvDraftEntryId); + _LIT(KNote1,"Observing drafts entry\n"); + theUtils->Printf(KNote1); + TTestEntryObserver eObs; + aEntry.AddObserverL(eObs); + TEntryObserverCleanup clean(aEntry,eObs); + CleanupStack::PushL(TCleanupItem(TEntryObserverCleanup::CleanupEntryObserver, &clean)); + + + _LIT(KNote2,"Getting outbox entry\n"); + theUtils->Printf(KNote2); + CMsvEntry* outboxEntry=aEntry.Session().GetEntryL(KMsvGlobalOutBoxIndexEntryId); + CleanupStack::PushL(outboxEntry); + _LIT(KNote3,"Observing outbox entry\n"); + theUtils->Printf(KNote3); + TTestEntryObserver outboxObs; + outboxEntry->AddObserverL(outboxObs); + TEntryObserverCleanup clean2(*outboxEntry,outboxObs); + CleanupStack::PushL(TCleanupItem(TEntryObserverCleanup::CleanupEntryObserver, &clean2)); + + _LIT(KNote5,"Starting async move message on draft entry/aMessageId to Outbox\n"); + theUtils->Printf(KNote5); + + TRequestStatus status; + CMsvOperation *anOp=aEntry.MoveL(aMessageId,KMsvGlobalOutBoxIndexEntryId,status); + CleanupStack::PushL(anOp); + + TInt err=RunWhilePending(status); + + if(err==KErrNone) + err=aObserver.CheckEvents(1,MMsvSessionObserver::EMsvEntriesMoved); + + _LIT(KNote6,"Checking drafts entry events\n"); + theUtils->Printf(KNote6); + if(err==KErrNone) + err=eObs.CheckEvents(1,MMsvEntryObserver::EMsvDeletedChildren); + + _LIT(KNote7,"Checking outbox entry events\n"); + theUtils->Printf(KNote7); + if(err==KErrNone) + err=outboxObs.CheckEvents(1,MMsvEntryObserver::EMsvNewChildren); + + CleanupStack::PopAndDestroy(anOp); + CleanupStack::PopAndDestroy(&clean2); + CleanupStack::PopAndDestroy(outboxEntry); + CleanupStack::PopAndDestroy(&clean); + return err ; + } + + + +TInt DoTestsL(TTestSessionObserver &aSessionObs, CMsvEntry &aEntry) + { + TInt testno=1; + TInt err=KErrNone; + + TMsvId serviceId; + + theUtils->TestStart(testno,_L("Creating a Service")); + err=CreateServiceTest(aSessionObs,aEntry,serviceId); + theUtils->TestFinish(testno++,err); + if(err!=KErrNone) return(err); + + TMsvId messageId; + theUtils->TestStart(testno,_L("Creating a Message")); + err=CreateMessageTest(aSessionObs,aEntry,serviceId,messageId); + theUtils->TestFinish(testno++,err); + if(err!=KErrNone) return(err); + + theUtils->TestStart(testno,_L("Copying message to Outbox")); + err=CopyMessageTest(aSessionObs,aEntry,messageId); + theUtils->TestFinish(testno++,err); + if(err!=KErrNone) return(err); + + theUtils->TestStart(testno,_L("Creating another Message")); + err=CreateMessageTest(aSessionObs,aEntry,serviceId,messageId); + theUtils->TestFinish(testno++,err); + if(err!=KErrNone) return(err); + + theUtils->TestStart(testno,_L("Moving message to Outbox")); + err=MoveMessageTest(aSessionObs,aEntry,messageId); + theUtils->TestFinish(testno++,err); + if(err!=KErrNone) return(err); + + + return KErrNone; + } + + + + +void DoMainL() + { + theUtils=CMsgServerTestUtils::NewL(tests); + theUtils->SetupL(); + TTestSessionObserver sObs; + CMsvSession *session=CMsvSession::OpenSyncL(sObs); + CleanupStack::PushL(session); + CMsvEntry *cEntry=session->GetEntryL(KMsvRootIndexEntryId); + CleanupStack::PushL(cEntry); + + TInt err=DoTestsL(sObs,*cEntry); + CleanupStack::PopAndDestroy(cEntry); + CleanupStack::PopAndDestroy(session); + theUtils->Close(err); + delete theUtils; + } + +GLDEF_C TInt E32Main() + { + __UHEAP_MARK; + CTrapCleanup* cleanup = CTrapCleanup::New(); + TRAPD(ret, DoMainL()); + tests(ret==KErrNone); + tests.Getch(); + tests.Close(); + delete cleanup; + __UHEAP_MARKEND; + return(KErrNone); + } + +EXPORT_C TInt WinsMain() + { +#if defined(__WINS__) + E32Main(); +#endif + return KErrNone; + } + + +