ximpfw/tsrc/src/t_presencegroupmembermngt/t_presencegroupmembermngt.cpp
changeset 0 e6b17d312c8b
child 20 eedf17a17c27
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/ximpfw/tsrc/src/t_presencegroupmembermngt/t_presencegroupmembermngt.cpp	Thu Dec 17 08:54:49 2009 +0200
@@ -0,0 +1,2280 @@
+/*
+* Copyright (c) 2006 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: XIMP Framework Test Code 
+*
+*/
+
+
+#include "eunittools.h"
+
+#include <eunitmacros.h>
+#include <ecom/ecom.h>
+#include <badesca.h>
+#include <e32std.h>
+
+#include <ximpclient.h>
+#include <ximpcontext.h>
+#include <ximpobjectfactory.h>
+#include <ximpcontextstateevent.h>
+#include <ximprequestcompleteevent.h>
+#include <ximpstatus.h>
+#include <presencefeatures.h>
+#include <presentitygroups.h>
+#include <presentitygroupmemberinfo.h>
+#include <presentitygroupcontentevent.h>
+
+
+#include "ximpeventcodec.h"
+
+#include "t_presencegroupmembermngt.h"
+#include "prfwteststatuseventlistener.h"
+#include "prfwtestmessaging.h"
+#include "prfwtestmessenger.h"
+#include "prfwtestlistener.h"
+#include "prfwtestcontextwrappermgr.h"
+#include "prfwtestcontextwrapper.h"
+#include "ximpcontextstateeventimp.h"
+#include "ximpcontextstateevent.h"
+
+#include "presenceinfoimp.h"
+#include "presenceinfofilterimp.h"
+#include "prfwtestpresencedatautils.h"
+#include "ximpidentityimp.h"
+#include "presentitygroupcontenteventimp.h"
+#include "ximprequestcompleteeventimp.h"
+#include "presentitygroupinfoimp.h"
+#include "presentitygrouplisteventimp.h"
+#include "presentitygroupmemberinfoimp.h"
+#include "ximprequestcompleteeventimp.h"
+#include "ximprestrictedobjectcollection.h"
+#include "ximpobjectfactoryimp.h"
+
+#include "prfwtestrobustnesstools.h"
+#include "ximpobjecthelpers.h"
+#include "prfwtestfilesrvmsg.h"
+#include "prfwtestfiletool.h"
+#include "prfwtestwaithelper.h"
+#include "prfwtesteventfactory.h"
+
+
+_LIT( KGroupId,   "wv:group/member@imps.com" );
+_LIT( KGroupId2,  "wv:group2/chutney@naan.com" );
+_LIT( KGroupDisplayName, "Salamapartio Z" );
+
+_LIT( KMemberId, "wv:member@imps.com" );
+_LIT( KMemberDisplayName,  "Stroustrup" );
+_LIT( KMemberDisplayName2, "Bjarne" );
+
+// ============================ MEMBER FUNCTIONS ===============================
+
+// CONSTRUCTION
+T_PresenceGroupMemberManagement* T_PresenceGroupMemberManagement::NewL()
+    {
+    T_PresenceGroupMemberManagement* self = new( ELeave ) T_PresenceGroupMemberManagement;
+    CleanupStack::PushL( self );
+    self->ConstructL();
+    CleanupStack::Pop( self );
+
+    return self;
+    }
+
+T_PresenceGroupMemberManagement::~T_PresenceGroupMemberManagement()
+    {
+    delete iLastEvent;
+
+    if ( iASWait && iASWait->IsStarted() )
+        {
+        iASWait->AsyncStop();
+        }
+    delete iASWait;
+
+    delete iListener2;
+
+    delete iCurrentGrId;
+    }
+
+void T_PresenceGroupMemberManagement::ConstructL()
+    {
+    CEUnitTestSuiteClass::ConstructL();
+    iASWait = new ( ELeave ) CActiveSchedulerWait();
+    }
+
+
+T_PresenceGroupMemberManagement::T_PresenceGroupMemberManagement()
+    {
+    }
+
+// ===========================================================================
+// TEST CASE SETUP & TEARDOWN METHODS
+// ===========================================================================
+//
+
+void T_PresenceGroupMemberManagement::Setup_L()
+    {
+    PrfwTestRobustness::DoPreCleaning();
+
+    iWrapperMgr = CXIMPTestContextWrapperMgr::NewL();
+    iWrapperMgr->CreateWrapperL();
+
+    // must reset these to EFalse
+    iSkipSubscribe = EFalse;
+    iSkipUnsubscribe = EFalse;
+    }
+
+void T_PresenceGroupMemberManagement::SetupMultiple_L()
+    {
+    PrfwTestRobustness::DoPreCleaning();
+
+    iWrapperMgr = CXIMPTestContextWrapperMgr::NewL();
+    iWrapperMgr->CreateWrapperL();
+    iWrapperMgr->CreateWrapperL();
+    iWrapperMgr->CreateWrapperL();
+
+    // must reset these to EFalse
+    iSkipSubscribe = EFalse;
+    iSkipUnsubscribe = EFalse;
+    }
+
+// bind helper
+void T_PresenceGroupMemberManagement::BindAllL()
+    {
+    for( TInt a = 0; a < iWrapperMgr->WrapperCount(); ++a )
+        {
+        CXIMPTestContextWrapper* wrapper = iWrapperMgr->GetWrapperL( a );
+        wrapper->BindL( 0 );
+        }
+    }
+
+// unbind helper
+void T_PresenceGroupMemberManagement::UnbindAllL()
+    {
+    for( TInt a = 0; a < iWrapperMgr->WrapperCount(); ++a )
+        {
+        CXIMPTestContextWrapper* wrapper = iWrapperMgr->GetWrapperL( a );
+        wrapper->UnbindL();
+        }
+    }
+
+void T_PresenceGroupMemberManagement::TeardownTestSupport()
+    {
+    // anything NOT initialized by test case Setup method,
+    // but initialized in the test case itself, goes here
+    delete iCurrentGrId;
+    iCurrentGrId = NULL;
+
+    delete iListener2;
+    iListener2 = NULL;
+
+    delete iLastEvent;
+    iLastEvent = NULL;
+    }
+
+void T_PresenceGroupMemberManagement::Teardown()
+    {
+    TeardownTestSupport();
+    // just in case to avoid memleaks. should not have anything to
+    // delete anyway
+
+    delete iWrapperMgr;
+    iWrapperMgr = NULL;
+
+    REComSession::FinalClose();
+
+    // must reset these to EFalse
+    iSkipSubscribe = EFalse;
+    iSkipUnsubscribe = EFalse;
+
+    // it's best to nuke the servers during exit too.
+    PrfwTestRobustness::DoPreCleaning();
+    }
+
+// ===========================================================================
+// TEST CASES for presentity presence subscription
+// ===========================================================================
+
+// General test case for single member
+void T_PresenceGroupMemberManagement::T_GenericSubAndUnsubL(
+        TXIMPCallBack& aCbFuncL )
+    {
+    CXIMPTestContextWrapper* wrapper = iWrapperMgr->GetWrapperL( 0 );
+    wrapper->BindL( 0 );
+
+    // ------------------------------------------------------
+    // some startup stuff
+    MXIMPContext* context = wrapper->GetContext();
+    CXIMPTestMessenger* messenger = wrapper->GetMessenger();
+
+    // Get the interfaces
+    MPresenceFeatures* presFeat = wrapper->GetPresenceFeatures();
+    MPresentityGroups& presGroup = presFeat->PresentityGroups();
+
+    iListener2 = CXIMPTestListener::NewL( context );
+    // ------------------------------------------------------
+
+    // Tell the protocol it should act normally
+    wrapper->GetMessenger()->SetNoError();
+
+    iCurrentGrId = context->ObjectFactory().NewIdentityLC();
+    CleanupStack::Pop(); // iCurrentGrId
+    iCurrentGrId->SetIdentityL( KGroupId );
+
+    // ------------------------------------------------------
+    // create presentity group
+    //
+    // expect events:
+    // - request complete.
+    // NOTE: no presentitygrouplistevent as we've not subscribed the group lists
+
+    // normal request complete
+    TXIMPRequestId reqIdDummy;  // not checked
+    CXIMPRequestCompleteEventImp* evReqComplete = CXIMPRequestCompleteEventImp::NewLC( reqIdDummy );
+
+    // identity + displayname
+    CPresentityGroupInfoImp* infoImp = CPresentityGroupInfoImp::NewLC( *iCurrentGrId, KGroupDisplayName );
+    evReqComplete->AppendParamL( infoImp );
+    CleanupStack::Pop( infoImp );
+
+    iListener2->ExpectL( evReqComplete );
+    CleanupStack::Pop( evReqComplete );
+
+    TXIMPRequestId reqId = presGroup.CreatePresentityGroupL( *iCurrentGrId, KGroupDisplayName );
+
+    // and wait
+    EUNIT_ASSERT_DESC( KErrNone == iListener2->WaitAndAssertL(), "CreatePresentityGroupL failed" );
+    messenger->AssertCreatePresentityGroupCalled( ETrue );
+
+    if ( ! iSkipSubscribe )
+        {
+        // ------------------------------------------------------
+        // subscribe presentity group CONTENT
+        //
+        // expect events:
+        // - request complete
+        evReqComplete = CXIMPRequestCompleteEventImp::NewLC( reqIdDummy );
+        iListener2->ExpectL( evReqComplete );
+        CleanupStack::Pop( evReqComplete );
+
+        // do the call
+        reqId = presGroup.SubscribePresentityGroupContentL( *iCurrentGrId );
+
+        // and wait
+        EUNIT_ASSERT_DESC( KErrNone == iListener2->WaitAndAssertL(), "SubscribePresentityGroupContentL failed" );
+
+        // verify that subscribe was called
+        messenger->AssertSubscribePresentityGroupContentCalled( ETrue );
+        }
+
+    // ------------------------------------------------------
+    // do the actual test. this is a function pointer because the
+    // "red tape" of each test is similar (create group, subscribe content, do
+    // actual test, unsubscribe content, delete group) - this is the variable
+    // part, the "do actual test".
+    (this->*aCbFuncL)();
+
+    if ( ! iSkipUnsubscribe )
+        {
+        // ------------------------------------------------------
+        // unsubscribe presentity group content
+        //
+        // expect events:
+        // - request complete
+        // - presentity group content event
+
+        evReqComplete = CXIMPRequestCompleteEventImp::NewLC( reqIdDummy );
+        iListener2->ExpectL( evReqComplete );
+        CleanupStack::Pop( evReqComplete );
+
+        CPresentityGroupContentEventImp* groupCntEvent =
+            XIMPTestEventFactory::CreateGroupContentEventLCX(
+                    KGroupId,
+                    KNullDesC,
+                    KNullDesC,
+                    XIMPTestEventFactory::ETestPGLCntRemoved,
+                    KNullDesC,
+                    KNullDesC,
+                    MXIMPDataSubscriptionState::ESubscriptionInactive,
+                    MXIMPDataSubscriptionState::EDataUnavailable
+                    );
+
+        iListener2->ExpectL( groupCntEvent );
+        CleanupStack::Pop( groupCntEvent ); // 5 more items in cleanupstack
+
+        // do the call
+        reqId = presGroup.UnsubscribePresentityGroupContentL( *iCurrentGrId );
+
+        // and wait
+        EUNIT_ASSERT_DESC( KErrNone == iListener2->WaitAndAssertL(), "UnsubscribePresentityGroupContentL failed" );
+        CleanupStack::PopAndDestroy( 5 ); // lists
+
+        // verify that unsubscribe was called
+        messenger->AssertUnsubscribePresentityGroupContentCalled( ETrue );
+        }
+
+    // ------------------------------------------------------
+    // delete presentity group
+    //
+    // expect events:
+    // - request complete
+    // NO presentity group content event as we've just unsubscribed it.
+
+    evReqComplete = CXIMPRequestCompleteEventImp::NewLC( reqIdDummy );
+    iListener2->ExpectL( evReqComplete );
+    CleanupStack::Pop( evReqComplete );
+
+    // do the call
+    reqId = presGroup.DeletePresentityGroupL( *iCurrentGrId );
+
+    // and wait
+    EUNIT_ASSERT_DESC( KErrNone == iListener2->WaitAndAssertL(), "DeletePresentityGroupL failed" );
+
+    // ------------------------------------------------------
+
+    // make sure the new listener is not listening for events!
+    iListener2->SetEventSourceL( NULL );
+
+    wrapper->UnbindL();
+
+    TeardownTestSupport();
+    }
+
+// ===========================================================================
+// Variant methods, this is where the actual testing happens.
+// Called by the generic subscribe and unsubscribe -method
+// ===========================================================================
+
+// ------------------------------------------------------
+// empty test variant method
+// test only the creation, subscribe and unsubcscribe
+// ------------------------------------------------------
+//
+void T_PresenceGroupMemberManagement::T_EmptyFunc()
+    {
+    // nothing
+    }
+
+// ------------------------------------------------------
+// test adding members
+// ------------------------------------------------------
+//
+void T_PresenceGroupMemberManagement::T_TestAddMembersL()
+    {
+    CXIMPTestContextWrapper* wrapper = iWrapperMgr->GetWrapperL( 0 );
+    MXIMPContext* context = wrapper->GetContext();
+    CXIMPTestMessenger* messenger = wrapper->GetMessenger();
+
+    // Get the interfaces
+    MPresenceFeatures* presFeat = wrapper->GetPresenceFeatures();
+    MPresentityGroups& presGroup = presFeat->PresentityGroups();
+
+    // Tell the protocol it should act normally
+    messenger->SetNoError();
+
+    // ------------------------------------------------------
+    // add presentity group member
+    //
+    // expect events:
+    // - request complete,
+    // - presentitygroupcontentevent
+
+    MXIMPIdentity* member = context->ObjectFactory().NewIdentityLC();
+    member->SetIdentityL( KMemberId );
+
+    // normal request complete
+    TXIMPRequestId reqIdDummy;  // not checked
+    CXIMPRequestCompleteEventImp* evReqComplete = CXIMPRequestCompleteEventImp::NewLC( reqIdDummy );
+
+    // group id
+    CXIMPIdentityImp* identity = CXIMPIdentityImp::NewLC( iCurrentGrId->Identity() );
+    evReqComplete->AppendParamL( identity );
+    CleanupStack::Pop(); // identity
+
+    // id for member info
+    CXIMPIdentityImp* miId = CXIMPIdentityImp::NewLC( KMemberId );
+    // member info
+    CPresentityGroupMemberInfoImp* memInfoImp =
+        CPresentityGroupMemberInfoImp::NewLC( *miId, KMemberDisplayName );
+    evReqComplete->AppendParamL( memInfoImp );
+    CleanupStack::Pop(); // memInfoImp owned by AppendParamL
+    CleanupStack::PopAndDestroy( miId ); // copy was made
+
+    iListener2->ExpectL( evReqComplete );
+    CleanupStack::Pop( evReqComplete );
+
+    // group content event
+    CPresentityGroupContentEventImp* groupCntEvent =
+        XIMPTestEventFactory::CreateGroupContentEventLCX(
+                iCurrentGrId->Identity(),
+                KMemberId,
+                KMemberDisplayName,
+                XIMPTestEventFactory::ETestPGLCntAdded,
+                KMemberId,
+                KMemberDisplayName,
+                MXIMPDataSubscriptionState::ESubscriptionActive,
+                MXIMPDataSubscriptionState::EDataAvailable
+                );
+
+    iListener2->ExpectL( groupCntEvent );
+    CleanupStack::Pop( groupCntEvent ); // 5 more items in cleanupstack
+
+    // do the call
+    TXIMPRequestId reqId = presGroup.AddPresentityGroupMemberL(
+            *iCurrentGrId, *member, KMemberDisplayName );
+
+    // and wait
+    EUNIT_ASSERT_DESC( KErrNone == iListener2->WaitAndAssertL(), "AddPresentityGroupMemberL failed" );
+    CleanupStack::PopAndDestroy( 5 ); // lists from groupCntEvent
+
+    messenger->AssertAddPresentityGroupMemberCalled( ETrue );
+
+    // ------------------------------------------------------
+    CleanupStack::PopAndDestroy(); // member
+    }
+
+// ------------------------------------------------------
+// test adding members when not subscribed
+// ------------------------------------------------------
+//
+void T_PresenceGroupMemberManagement::T_TestAddMembers_NonSub_L()
+    {
+    CXIMPTestContextWrapper* wrapper = iWrapperMgr->GetWrapperL( 0 );
+    MXIMPContext* context = wrapper->GetContext();
+    CXIMPTestMessenger* messenger = wrapper->GetMessenger();
+
+    // Get the interfaces
+    MPresenceFeatures* presFeat = wrapper->GetPresenceFeatures();
+    MPresentityGroups& presGroup = presFeat->PresentityGroups();
+
+    // Tell the protocol it should act normally
+    messenger->SetNoError();
+
+    // ------------------------------------------------------
+    // add presentity group member
+    //
+    // expect events:
+    // - request complete,
+
+    MXIMPIdentity* member = context->ObjectFactory().NewIdentityLC();
+    member->SetIdentityL( KMemberId );
+
+    // normal request complete
+    TXIMPRequestId reqIdDummy;  // not checked
+    CXIMPRequestCompleteEventImp* evReqComplete = CXIMPRequestCompleteEventImp::NewLC( reqIdDummy );
+
+    // group id
+    CXIMPIdentityImp* identity = CXIMPIdentityImp::NewLC( iCurrentGrId->Identity() );
+    evReqComplete->AppendParamL( identity );
+    CleanupStack::Pop(); // identity
+
+    // id for member info
+    CXIMPIdentityImp* miId = CXIMPIdentityImp::NewLC( KMemberId );
+    // member info
+    CPresentityGroupMemberInfoImp* memInfoImp =
+        CPresentityGroupMemberInfoImp::NewLC( *miId, KMemberDisplayName );
+    evReqComplete->AppendParamL( memInfoImp );
+    CleanupStack::Pop(); // memInfoImp owned by AppendParamL
+    CleanupStack::PopAndDestroy( miId ); // copy was made
+
+    iListener2->ExpectL( evReqComplete );
+    CleanupStack::Pop( evReqComplete );
+
+    // do the call
+    TXIMPRequestId reqId = presGroup.AddPresentityGroupMemberL(
+            *iCurrentGrId, *member, KMemberDisplayName );
+
+    // and wait
+    EUNIT_ASSERT_DESC( KErrNone == iListener2->WaitAndAssertL(), "AddPresentityGroupMemberL failed" );
+
+    messenger->AssertAddPresentityGroupMemberCalled( ETrue );
+
+    // ------------------------------------------------------
+    CleanupStack::PopAndDestroy(); // member
+    }
+
+// ------------------------------------------------------
+// test removing members
+// ------------------------------------------------------
+//
+void T_PresenceGroupMemberManagement::T_TestRemoveMembersL()
+    {
+    // add a member
+    T_TestAddMembersL();
+
+    CXIMPTestContextWrapper* wrapper = iWrapperMgr->GetWrapperL( 0 );
+    MXIMPContext* context = wrapper->GetContext();
+    CXIMPTestMessenger* messenger = wrapper->GetMessenger();
+
+    // Get the interfaces
+    MPresenceFeatures* presFeat = wrapper->GetPresenceFeatures();
+    MPresentityGroups& presGroup = presFeat->PresentityGroups();
+
+    // Tell the protocol it should act normally
+    messenger->SetNoError();
+
+    // ------------------------------------------------------
+    // remove presentity group member
+    //
+    // expect events:
+    // - request complete,
+    // - presentitygroupcontentevent
+
+    MXIMPIdentity* member = context->ObjectFactory().NewIdentityLC();
+    member->SetIdentityL( KMemberId );
+
+    // normal request complete
+    TXIMPRequestId reqIdDummy;  // not checked
+    CXIMPRequestCompleteEventImp* evReqComplete = CXIMPRequestCompleteEventImp::NewLC( reqIdDummy );
+    iListener2->ExpectL( evReqComplete );
+    CleanupStack::Pop( evReqComplete );
+
+    // group content event
+    CPresentityGroupContentEventImp* groupCntEvent =
+        XIMPTestEventFactory::CreateGroupContentEventLCX(
+                iCurrentGrId->Identity(),
+                KMemberId,
+                KNullDesC,
+                XIMPTestEventFactory::ETestPGLCntRemoved,
+                KNullDesC,
+                KNullDesC,
+                MXIMPDataSubscriptionState::ESubscriptionActive,
+                MXIMPDataSubscriptionState::EDataAvailable
+                );
+
+    iListener2->ExpectL( groupCntEvent );
+    CleanupStack::Pop( groupCntEvent ); // 5 more items in cleanupstack
+
+    // do the call
+    TXIMPRequestId reqId = presGroup.RemovePresentityGroupMemberL(
+            *iCurrentGrId, *member );
+
+    // and wait
+    EUNIT_ASSERT_DESC( KErrNone == iListener2->WaitAndAssertL(), "RemovePresentityGroupMemberL failed" );
+    CleanupStack::PopAndDestroy( 5 ); // lists from groupCntEvent
+
+    messenger->AssertRemovePresentityGroupMemberCalled( ETrue );
+
+    // ------------------------------------------------------
+    CleanupStack::PopAndDestroy(); //member
+    }
+
+// ------------------------------------------------------
+// test removing members when non-subscribed
+// ------------------------------------------------------
+//
+void T_PresenceGroupMemberManagement::T_TestRemoveMembers_NonSub_L()
+    {
+    // add a member
+    T_TestAddMembers_NonSub_L();
+
+    CXIMPTestContextWrapper* wrapper = iWrapperMgr->GetWrapperL( 0 );
+    MXIMPContext* context = wrapper->GetContext();
+    CXIMPTestMessenger* messenger = wrapper->GetMessenger();
+
+    // Get the interfaces
+    MPresenceFeatures* presFeat = wrapper->GetPresenceFeatures();
+    MPresentityGroups& presGroup = presFeat->PresentityGroups();
+
+    // Tell the protocol it should act normally
+    messenger->SetNoError();
+
+    // ------------------------------------------------------
+    // remove presentity group member
+    //
+    // expect events:
+    // - request complete,
+    // - presentitygroupcontentevent
+
+    MXIMPIdentity* member = context->ObjectFactory().NewIdentityLC();
+    member->SetIdentityL( KMemberId );
+
+    // normal request complete
+    TXIMPRequestId reqIdDummy;  // not checked
+    CXIMPRequestCompleteEventImp* evReqComplete = CXIMPRequestCompleteEventImp::NewLC( reqIdDummy );
+    iListener2->ExpectL( evReqComplete );
+    CleanupStack::Pop( evReqComplete );
+
+    // do the call
+    TXIMPRequestId reqId = presGroup.RemovePresentityGroupMemberL(
+            *iCurrentGrId, *member );
+
+    // and wait
+    EUNIT_ASSERT_DESC( KErrNone == iListener2->WaitAndAssertL(), "RemovePresentityGroupMemberL failed" );
+
+    messenger->AssertRemovePresentityGroupMemberCalled( ETrue );
+
+    // ------------------------------------------------------
+    CleanupStack::PopAndDestroy(); //member
+    }
+
+// test removing nonexisting members
+void T_PresenceGroupMemberManagement::T_TestRemoveMembers_NonExisting_L()
+    {
+    CXIMPTestContextWrapper* wrapper = iWrapperMgr->GetWrapperL( 0 );
+    MXIMPContext* context = wrapper->GetContext();
+    CXIMPTestMessenger* messenger = wrapper->GetMessenger();
+
+    // Get the interfaces
+    MPresenceFeatures* presFeat = wrapper->GetPresenceFeatures();
+    MPresentityGroups& presGroup = presFeat->PresentityGroups();
+
+    // Tell the protocol it should act normally
+    messenger->SetNoError();
+
+    // ------------------------------------------------------
+    // remove presentity group member
+    //
+    // expect events:
+    // - request complete,
+
+    MXIMPIdentity* member = context->ObjectFactory().NewIdentityLC();
+    member->SetIdentityL( KMemberId );
+
+    // normal request complete
+    TXIMPRequestId reqIdDummy;  // not checked
+    CXIMPRequestCompleteEventImp* evReqComplete = CXIMPRequestCompleteEventImp::NewLC( reqIdDummy );
+    iListener2->ExpectL( evReqComplete );
+    CleanupStack::Pop( evReqComplete );
+
+    // do the call
+    TXIMPRequestId reqId = presGroup.RemovePresentityGroupMemberL(
+            *iCurrentGrId, *member );
+
+    // and wait
+    EUNIT_ASSERT_DESC( KErrNone == iListener2->WaitAndAssertL(), "RemovePresentityGroupMemberL failed" );
+
+    messenger->AssertRemovePresentityGroupMemberCalled( ETrue );
+
+    // ------------------------------------------------------
+    CleanupStack::PopAndDestroy(); //member
+    }
+
+// ------------------------------------------------------
+// test updating members
+// ------------------------------------------------------
+//
+void T_PresenceGroupMemberManagement::T_TestUpdateMembers_L()
+    {
+    // add a member
+    T_TestAddMembersL();
+
+    CXIMPTestContextWrapper* wrapper = iWrapperMgr->GetWrapperL( 0 );
+    MXIMPContext* context = wrapper->GetContext();
+    CXIMPTestMessenger* messenger = wrapper->GetMessenger();
+
+    // Get the interfaces
+    MPresenceFeatures* presFeat = wrapper->GetPresenceFeatures();
+    MPresentityGroups& presGroup = presFeat->PresentityGroups();
+
+    // Tell the protocol it should act normally
+    messenger->SetNoError();
+
+    // ------------------------------------------------------
+    // update presentity group member
+    //
+    // expect events:
+    // - request complete,
+    // - presentitygroupcontentevent
+
+    MXIMPIdentity* member = context->ObjectFactory().NewIdentityLC();
+    member->SetIdentityL( KMemberId );
+
+    // group content request complete
+    TXIMPRequestId reqIdDummy;  // not checked
+    CXIMPRequestCompleteEventImp* evReqComplete = CXIMPRequestCompleteEventImp::NewLC( reqIdDummy );
+    CXIMPIdentityImp* identity = CXIMPIdentityImp::NewLC( iCurrentGrId->Identity() );
+    evReqComplete->AppendParamL( identity );
+    CleanupStack::Pop( identity );
+
+    CPresentityGroupMemberInfoImp* mbrInfo = CPresentityGroupMemberInfoImp::NewLC( *member, KMemberDisplayName2 );
+    evReqComplete->AppendParamL( mbrInfo );
+    CleanupStack::Pop( mbrInfo );
+
+    iListener2->ExpectL( evReqComplete );
+    CleanupStack::Pop( evReqComplete );
+
+    // group content event
+    CPresentityGroupContentEventImp* groupCntEvent =
+        XIMPTestEventFactory::CreateGroupContentEventLCX(
+                iCurrentGrId->Identity(),
+                KMemberId,
+                KMemberDisplayName2,
+                XIMPTestEventFactory::ETestPGLCntUpdated,
+                KMemberId,
+                KMemberDisplayName2,
+                MXIMPDataSubscriptionState::ESubscriptionActive,
+                MXIMPDataSubscriptionState::EDataAvailable
+                );
+
+    iListener2->ExpectL( groupCntEvent );
+    CleanupStack::Pop( groupCntEvent ); // 5 more items in cleanupstack
+
+    // do the call
+    TXIMPRequestId reqId = presGroup.UpdatePresentityGroupMemberDisplayNameL(
+            *iCurrentGrId, *member, KMemberDisplayName2 );
+
+    // and wait
+    EUNIT_ASSERT_DESC( KErrNone == iListener2->WaitAndAssertL(), "UpdatePresentityGroupMemberDisplayNameL failed" );
+    CleanupStack::PopAndDestroy( 5 ); // lists from groupCntEvent
+
+    messenger->AssertUpdatePresentityGroupMemberDisplayNameCalled( ETrue );
+
+    // ------------------------------------------------------
+    CleanupStack::PopAndDestroy();
+    }
+
+// ------------------------------------------------------
+// test updating members (nonsubscribed)
+// ------------------------------------------------------
+//
+void T_PresenceGroupMemberManagement::T_TestUpdateMembers_NonSub_L()
+    {
+    // add a member
+    T_TestAddMembers_NonSub_L();
+
+    CXIMPTestContextWrapper* wrapper = iWrapperMgr->GetWrapperL( 0 );
+    MXIMPContext* context = wrapper->GetContext();
+    CXIMPTestMessenger* messenger = wrapper->GetMessenger();
+
+    // Get the interfaces
+    MPresenceFeatures* presFeat = wrapper->GetPresenceFeatures();
+    MPresentityGroups& presGroup = presFeat->PresentityGroups();
+
+    // Tell the protocol it should act normally
+    messenger->SetNoError();
+
+    // ------------------------------------------------------
+    // update presentity group member
+    //
+    // expect events:
+    // - request complete,
+
+    MXIMPIdentity* member = context->ObjectFactory().NewIdentityLC();
+    member->SetIdentityL( KMemberId );
+
+    // group content request complete
+    TXIMPRequestId reqIdDummy;  // not checked
+    CXIMPRequestCompleteEventImp* evReqComplete = CXIMPRequestCompleteEventImp::NewLC( reqIdDummy );
+    CXIMPIdentityImp* identity = CXIMPIdentityImp::NewLC( iCurrentGrId->Identity() );
+    evReqComplete->AppendParamL( identity );
+    CleanupStack::Pop( identity );
+
+    CPresentityGroupMemberInfoImp* mbrInfo = CPresentityGroupMemberInfoImp::NewLC( *member, KMemberDisplayName2 );
+    evReqComplete->AppendParamL( mbrInfo );
+    CleanupStack::Pop( mbrInfo );
+
+    iListener2->ExpectL( evReqComplete );
+    CleanupStack::Pop( evReqComplete );
+
+    // do the call
+    TXIMPRequestId reqId = presGroup.UpdatePresentityGroupMemberDisplayNameL(
+            *iCurrentGrId, *member, KMemberDisplayName2 );
+
+    // and wait
+    EUNIT_ASSERT_DESC( KErrNone == iListener2->WaitAndAssertL(), "UpdatePresentityGroupMemberDisplayNameL failed" );
+
+    messenger->AssertUpdatePresentityGroupMemberDisplayNameCalled( ETrue );
+
+    // ------------------------------------------------------
+    CleanupStack::PopAndDestroy();
+    }
+
+// ------------------------------------------------------
+// test updating members with non-existing id
+// ------------------------------------------------------
+//
+void T_PresenceGroupMemberManagement::T_TestUpdateMembers_NonExisting_L()
+    {
+    CXIMPTestContextWrapper* wrapper = iWrapperMgr->GetWrapperL( 0 );
+    MXIMPContext* context = wrapper->GetContext();
+    CXIMPTestMessenger* messenger = wrapper->GetMessenger();
+
+    // Get the interfaces
+    MPresenceFeatures* presFeat = wrapper->GetPresenceFeatures();
+    MPresentityGroups& presGroup = presFeat->PresentityGroups();
+    
+    // Tell the protocol it should act normally
+    messenger->SetNoError();
+
+    // ------------------------------------------------------
+    // update presentity group member
+    //
+    // expect events:
+    // - request complete,
+
+    MXIMPIdentity* member = context->ObjectFactory().NewIdentityLC();
+    member->SetIdentityL( KMemberId );
+
+    // group content request complete
+    TXIMPRequestId reqIdDummy;  // not checked
+    CXIMPRequestCompleteEventImp* evReqComplete = CXIMPRequestCompleteEventImp::NewLC( reqIdDummy );
+    CXIMPIdentityImp* identity = CXIMPIdentityImp::NewLC( iCurrentGrId->Identity() );
+    evReqComplete->AppendParamL( identity );
+    CleanupStack::Pop( identity );
+
+    CPresentityGroupMemberInfoImp* mbrInfo = CPresentityGroupMemberInfoImp::NewLC( *member, KMemberDisplayName2 );
+    evReqComplete->AppendParamL( mbrInfo );
+    CleanupStack::Pop( mbrInfo );
+
+    iListener2->ExpectL( evReqComplete );
+    CleanupStack::Pop( evReqComplete );
+
+    // do the call
+    TXIMPRequestId reqId = presGroup.UpdatePresentityGroupMemberDisplayNameL(
+            *iCurrentGrId, *member, KMemberDisplayName2 );
+
+    // and wait
+    EUNIT_ASSERT_DESC( KErrNone == iListener2->WaitAndAssertL(), "UpdatePresentityGroupMemberDisplayNameL failed" );
+
+    messenger->AssertUpdatePresentityGroupMemberDisplayNameCalled( ETrue );
+
+    // ------------------------------------------------------
+    CleanupStack::PopAndDestroy();
+    }
+
+// ===========================================================================
+// Test case methods
+// ===========================================================================
+
+// Subscribe and unsubscribe test
+void T_PresenceGroupMemberManagement::T_SubUnsubGroupContent_Single_L()
+    {
+    EUNIT_PRINT( _L("Single presentity group content sub and unsub") );
+
+    TXIMPCallBack callback = &T_PresenceGroupMemberManagement::T_EmptyFunc;
+    T_GenericSubAndUnsubL( callback );
+    }
+
+// subscribe and unsubscribe, altered id
+void T_PresenceGroupMemberManagement::T_SubUnsubGroupContent_Altered_Single_L()
+    {
+    EUNIT_PRINT( _L("Single presentity group content sub and unsub with altered id") );
+
+    CXIMPTestContextWrapper* wrapper = iWrapperMgr->GetWrapperL( 0 );
+    wrapper->BindL( 0 );
+
+    // ------------------------------------------------------
+    // some startup stuff
+    MXIMPContext* context = wrapper->GetContext();
+    CXIMPTestMessenger* messenger = wrapper->GetMessenger();
+
+    // Get the interfaces
+    MPresenceFeatures* presFeat = wrapper->GetPresenceFeatures();
+    MPresentityGroups& presGroup = presFeat->PresentityGroups();
+
+    iListener2 = CXIMPTestListener::NewL( context );
+    // ------------------------------------------------------
+
+    // Tell the protocol it should act normally
+    wrapper->GetMessenger()->SetNoError();
+
+    iCurrentGrId = context->ObjectFactory().NewIdentityLC();
+    CleanupStack::Pop(); // iCurrentGrId
+    iCurrentGrId->SetIdentityL( KGroupId );
+
+    // ------------------------------------------------------
+    // create presentity group
+    //
+    // expect events:
+    // - request complete.
+    // NOTE: no presentitygrouplistevent as we've not subscribed the group lists
+
+    // normal request complete
+    TXIMPRequestId reqIdDummy;  // not checked
+    CXIMPRequestCompleteEventImp* evReqComplete = CXIMPRequestCompleteEventImp::NewLC( reqIdDummy );
+
+    // identity + displayname
+    CPresentityGroupInfoImp* infoImp = CPresentityGroupInfoImp::NewLC( *iCurrentGrId, KGroupDisplayName );
+    evReqComplete->AppendParamL( infoImp );
+    CleanupStack::Pop( infoImp );
+
+    iListener2->ExpectL( evReqComplete );
+    CleanupStack::Pop( evReqComplete );
+
+    TXIMPRequestId reqId = presGroup.CreatePresentityGroupL( *iCurrentGrId, KGroupDisplayName );
+
+    // and wait
+    EUNIT_ASSERT_DESC( KErrNone == iListener2->WaitAndAssertL(), "CreatePresentityGroupL failed" );
+    messenger->AssertCreatePresentityGroupCalled( ETrue );
+
+    // ------------------------------------------------------
+    // subscribe presentity group CONTENT
+    //
+    // expect events:
+    // - request complete
+    evReqComplete = CXIMPRequestCompleteEventImp::NewLC( reqIdDummy );
+    iListener2->ExpectL( evReqComplete );
+    CleanupStack::Pop( evReqComplete );
+
+    // tell the test protocol to send back an altered id
+    MXIMPIdentity* identityParam = context->ObjectFactory().NewIdentityLC();
+    identityParam->SetIdentityL( KGroupId2 );
+
+    CXIMPIdentityImp* identityParamImp =
+             ( CXIMPIdentityImp* ) identityParam->GetInterface(
+                                        CXIMPIdentityImp::KClassId,
+                                        MXIMPBase::EPanicIfUnknown );
+    HBufC8* packedId = TXIMPObjectPacker< CXIMPIdentityImp >::PackL( *identityParamImp );
+    CleanupStack::PopAndDestroy(); // identityParam
+    CleanupStack::PushL( packedId );
+    CXIMPTestFileSrvMsg* srvMsg = CXIMPTestFileSrvMsg::NewL( CXIMPTestFileSrvMsg::ETestSrvMsgReqParamIdentity,
+                                                             *packedId );
+    CleanupStack::PopAndDestroy( packedId );
+    CleanupStack::PushL( srvMsg );
+    wrapper->FileTool().SrvMsgStoreL( srvMsg );
+    CleanupStack::PopAndDestroy( srvMsg );
+
+    // Wait for server to handle srvmsg.
+    User::After( 2 );
+    // now the adaptation should know how to answer
+
+    // do the call
+    reqId = presGroup.SubscribePresentityGroupContentL( *iCurrentGrId );
+
+    // and wait
+    EUNIT_ASSERT_DESC( KErrNone == iListener2->WaitAndAssertL(), "SubscribePresentityGroupContentL failed" );
+
+    // verify that subscribe was called
+    messenger->AssertSubscribePresentityGroupContentCalled( ETrue );
+
+    // ------------------------------------------------------
+
+    // make sure the new listener is not listening for events!
+    iListener2->SetEventSourceL( NULL );
+
+    wrapper->UnbindL();
+
+    TeardownTestSupport();
+    }
+
+// subscribe and unsubscribe, altered id is the same
+void T_PresenceGroupMemberManagement::T_SubUnsubGroupContent_AlteredSame_Single_L()
+    {
+    EUNIT_PRINT( _L("Single presentity group content sub and unsub with altered but same id") );
+
+    CXIMPTestContextWrapper* wrapper = iWrapperMgr->GetWrapperL( 0 );
+    wrapper->BindL( 0 );
+
+    // ------------------------------------------------------
+    // some startup stuff
+    MXIMPContext* context = wrapper->GetContext();
+    CXIMPTestMessenger* messenger = wrapper->GetMessenger();
+
+    // Get the interfaces
+    MPresenceFeatures* presFeat = wrapper->GetPresenceFeatures();
+    MPresentityGroups& presGroup = presFeat->PresentityGroups();
+
+    iListener2 = CXIMPTestListener::NewL( context );
+    // ------------------------------------------------------
+
+    // Tell the protocol it should act normally
+    wrapper->GetMessenger()->SetNoError();
+
+    iCurrentGrId = context->ObjectFactory().NewIdentityLC();
+    CleanupStack::Pop(); // iCurrentGrId
+    iCurrentGrId->SetIdentityL( KGroupId );
+
+    // ------------------------------------------------------
+    // create presentity group
+    //
+    // expect events:
+    // - request complete.
+    // NOTE: no presentitygrouplistevent as we've not subscribed the group lists
+
+    // normal request complete
+    TXIMPRequestId reqIdDummy;  // not checked
+    CXIMPRequestCompleteEventImp* evReqComplete = CXIMPRequestCompleteEventImp::NewLC( reqIdDummy );
+
+    // identity + displayname
+    CPresentityGroupInfoImp* infoImp = CPresentityGroupInfoImp::NewLC( *iCurrentGrId, KGroupDisplayName );
+    evReqComplete->AppendParamL( infoImp );
+    CleanupStack::Pop( infoImp );
+
+    iListener2->ExpectL( evReqComplete );
+    CleanupStack::Pop( evReqComplete );
+
+    TXIMPRequestId reqId = presGroup.CreatePresentityGroupL( *iCurrentGrId, KGroupDisplayName );
+
+    // and wait
+    EUNIT_ASSERT_DESC( KErrNone == iListener2->WaitAndAssertL(), "CreatePresentityGroupL failed" );
+    messenger->AssertCreatePresentityGroupCalled( ETrue );
+
+    // ------------------------------------------------------
+    // subscribe presentity group CONTENT
+    //
+    // expect events:
+    // - request complete
+    evReqComplete = CXIMPRequestCompleteEventImp::NewLC( reqIdDummy );
+    iListener2->ExpectL( evReqComplete );
+    CleanupStack::Pop( evReqComplete );
+
+    // tell the test protocol to send back an altered id
+    MXIMPIdentity* identityParam = context->ObjectFactory().NewIdentityLC();
+    identityParam->SetIdentityL( KGroupId );
+
+    CXIMPIdentityImp* identityParamImp =
+             ( CXIMPIdentityImp* ) identityParam->GetInterface(
+                                        CXIMPIdentityImp::KClassId,
+                                        MXIMPBase::EPanicIfUnknown );
+    HBufC8* packedId = TXIMPObjectPacker< CXIMPIdentityImp >::PackL( *identityParamImp );
+    CleanupStack::PopAndDestroy(); // identityParam
+    CleanupStack::PushL( packedId );
+    CXIMPTestFileSrvMsg* srvMsg = CXIMPTestFileSrvMsg::NewL( CXIMPTestFileSrvMsg::ETestSrvMsgReqParamIdentity,
+                                                             *packedId );
+    CleanupStack::PopAndDestroy( packedId );
+    CleanupStack::PushL( srvMsg );
+    wrapper->FileTool().SrvMsgStoreL( srvMsg );
+    CleanupStack::PopAndDestroy( srvMsg );
+
+    // Wait for server to handle srvmsg.
+    User::After( 2 );
+    // now the adaptation should know how to answer
+
+    // do the call
+    reqId = presGroup.SubscribePresentityGroupContentL( *iCurrentGrId );
+
+    // and wait
+    EUNIT_ASSERT_DESC( KErrNone == iListener2->WaitAndAssertL(), "SubscribePresentityGroupContentL failed" );
+
+    // verify that subscribe was called
+    messenger->AssertSubscribePresentityGroupContentCalled( ETrue );
+
+    // ------------------------------------------------------
+
+    // make sure the new listener is not listening for events!
+    iListener2->SetEventSourceL( NULL );
+
+    wrapper->UnbindL();
+
+    TeardownTestSupport();
+    }
+
+
+// Add members
+void T_PresenceGroupMemberManagement::T_AddGroupMembers_Single_L()
+    {
+    EUNIT_PRINT( _L("Single add members to group") );
+
+    TXIMPCallBack callback = &T_PresenceGroupMemberManagement::T_TestAddMembersL;
+    T_GenericSubAndUnsubL( callback );
+    }
+
+// Remove members
+void T_PresenceGroupMemberManagement::T_RemoveGroupMembers_Single_L()
+    {
+    EUNIT_PRINT( _L("Single remove member of group") );
+
+    TXIMPCallBack callback = &T_PresenceGroupMemberManagement::T_TestRemoveMembersL;
+    T_GenericSubAndUnsubL( callback );
+    }
+
+// Update members
+void T_PresenceGroupMemberManagement::T_UpdateGroupMembers_Single_L()
+    {
+    EUNIT_PRINT( _L("Single update member of group") );
+
+    TXIMPCallBack callback = &T_PresenceGroupMemberManagement::T_TestUpdateMembers_L;
+    T_GenericSubAndUnsubL( callback );
+    }
+
+// Update members without subscription
+void T_PresenceGroupMemberManagement::T_UpdateGroupMembers_NonSub_Single_L()
+    {
+    EUNIT_PRINT( _L("Single update member of group, unsubscribed") );
+
+    TXIMPCallBack callback = &T_PresenceGroupMemberManagement::T_TestUpdateMembers_NonSub_L;
+    iSkipSubscribe = ETrue;
+    iSkipUnsubscribe = ETrue;
+    T_GenericSubAndUnsubL( callback );
+    }
+
+// Update members with non-existing member
+void T_PresenceGroupMemberManagement::T_UpdateGroupMembers_NonExist_Single_L()
+    {
+    EUNIT_PRINT( _L("Single update nonexisting member of group") );
+
+    TXIMPCallBack callback = &T_PresenceGroupMemberManagement::T_TestUpdateMembers_NonExisting_L;
+    T_GenericSubAndUnsubL( callback );
+    }
+
+// Remove members without subscription
+void T_PresenceGroupMemberManagement::T_RemoveGroupMembers_NonSub_Single_L()
+    {
+    EUNIT_PRINT( _L("Single remove member of group, unsubscribed") );
+
+    TXIMPCallBack callback = &T_PresenceGroupMemberManagement::T_TestRemoveMembers_NonSub_L;
+    iSkipSubscribe = ETrue;
+    iSkipUnsubscribe = ETrue;
+    T_GenericSubAndUnsubL( callback );
+    }
+
+// Remove members with non-existing member
+void T_PresenceGroupMemberManagement::T_RemoveGroupMembers_NonExist_Single_L()
+    {
+    EUNIT_PRINT( _L("Single remove nonexisting member of group") );
+
+    TXIMPCallBack callback = &T_PresenceGroupMemberManagement::T_TestRemoveMembers_NonExisting_L;
+    T_GenericSubAndUnsubL( callback );
+    }
+
+// ------------------------------------------------------
+// expire non-subscribed data
+// ------------------------------------------------------
+//
+void T_PresenceGroupMemberManagement::T_ExpireNonSubscribedData_L()
+    {
+    EUNIT_PRINT( _L("Expire non subscribed data") );
+
+    CXIMPTestContextWrapper* wrapper = iWrapperMgr->GetWrapperL( 0 );
+    wrapper->BindL( 0 );
+
+    MXIMPContext* context = wrapper->GetContext();
+    CXIMPTestMessenger* messenger = wrapper->GetMessenger();
+
+    // Get the interfaces
+    MPresenceFeatures* presFeat = wrapper->GetPresenceFeatures();
+    MPresentityGroups& presGroup = presFeat->PresentityGroups();
+
+    iCurrentGrId = context->ObjectFactory().NewIdentityLC();
+    CleanupStack::Pop(); // iCurrentGrId
+    iCurrentGrId->SetIdentityL( KGroupId );
+
+    // Tell the protocol it should act normally
+    messenger->SetNoError();
+
+    // 1. Create notification
+    RXIMPObjOwningPtrArray<CPresentityGroupMemberInfoImp> groupMemberList;
+    CXIMPIdentityImp* identityImp =
+             ( CXIMPIdentityImp* ) iCurrentGrId->GetInterface(
+                                        CXIMPIdentityImp::KClassId,
+                                        MXIMPBase::EPanicIfUnknown );
+    HBufC8* packedId = TXIMPObjectPacker< CXIMPIdentityImp >::PackL( *identityImp );
+    CleanupStack::PushL( packedId );
+    HBufC8* packedArray = TXIMPObjectPacker<CPresentityGroupMemberInfoImp>::PackArrayL( groupMemberList );
+    CleanupStack::PushL( packedArray );
+    RPointerArray< HBufC8 > bufferArray;
+    CleanupClosePushL( bufferArray );
+    bufferArray.AppendL( packedId );
+    bufferArray.AppendL( packedArray );
+    HBufC8* packedBufferArray = TXIMPHBuf8Packer::PackArrayL( bufferArray );
+    CleanupStack::PopAndDestroy( 2, packedArray ); // bufferArray, packedArray
+    CleanupStack::PushL( packedBufferArray );
+
+    // 2. Use filetool to send it for plugin.
+    CXIMPTestFileSrvMsg* srvMsg = CXIMPTestFileSrvMsg::NewL( CXIMPTestFileSrvMsg::ETestSrvMsgPresentityGroupMemberList,
+                                                             *packedBufferArray );
+    CleanupStack::PopAndDestroy( packedBufferArray );
+    CleanupStack::PushL( srvMsg );
+    wrapper->FileTool().CleanAllL();
+    wrapper->FileTool().SrvMsgStoreL( srvMsg );
+    CleanupStack::PopAndDestroy( srvMsg );
+
+    // Wait for server to handle srvmsg.
+    CXIMPTestWaitHelper* wait = CXIMPTestWaitHelper::NewL();
+    CleanupStack::PushL( wait );
+    wait->WaitForL( 2 );
+
+    // 3. Create and send check notification to server
+    srvMsg = CXIMPTestFileSrvMsg::NewL( CXIMPTestFileSrvMsg::ETestCheckIfGroupMemberExists,
+                                                             *packedId );
+    CleanupStack::PushL( srvMsg );
+    wrapper->FileTool().SrvMsgStoreL( srvMsg );
+
+    // Wait for server to handle srvmsg.
+    wait->WaitForL( 2 );
+
+    TInt value = messenger->GetValueFor( EXIMPPlgTestExistsGroupContentInCache );
+    EUNIT_ASSERT_DESC( value == 1, "Data not cached temporarly" );
+
+   // 4. Wait for cache to clear.
+    wait->WaitForL( 15 );
+
+    // 5. Send check notification to server
+    wrapper->FileTool().SrvMsgStoreL( srvMsg );
+    CleanupStack::PopAndDestroy( srvMsg );
+
+    // Wait for server to handle srvmsg.
+    wait->WaitForL( 2 );
+    CleanupStack::PopAndDestroy( wait );
+    CleanupStack::PopAndDestroy( packedId );
+    value = messenger->GetValueFor( EXIMPPlgTestExistsGroupContentInCache );
+    EUNIT_ASSERT_DESC( value == KErrNotFound, "Data not cleared like it should" );
+    wrapper->UnbindL();
+    }
+
+// ------------------------------------------------------
+// expire non-subscribed data, update multiple
+// ------------------------------------------------------
+//
+void T_PresenceGroupMemberManagement::T_ExpireNonSubscribedDataUpdateMultiple_L()
+    {
+    EUNIT_PRINT( _L("Expire non subscribed data, update multiple") );
+
+    // Wait for server to handle srvmsg.
+    CXIMPTestWaitHelper* wait = CXIMPTestWaitHelper::NewL();
+    CleanupStack::PushL( wait );
+
+    CXIMPTestContextWrapper* wrapper = iWrapperMgr->GetWrapperL( 0 );
+    wrapper->BindL( 0 );
+
+    MXIMPContext* context = wrapper->GetContext();
+    CXIMPTestMessenger* messenger = wrapper->GetMessenger();
+
+    // Get the interfaces
+    MPresenceFeatures* presFeat = wrapper->GetPresenceFeatures();
+    MPresentityGroups& presGroup = presFeat->PresentityGroups();
+
+    iCurrentGrId = context->ObjectFactory().NewIdentityLC();
+    CleanupStack::Pop(); // iCurrentGrId
+    iCurrentGrId->SetIdentityL( KGroupId );
+
+    // Tell the protocol it should act normally
+    messenger->SetNoError();
+
+    // 1. Create notification
+    RXIMPObjOwningPtrArray<CPresentityGroupMemberInfoImp> groupMemberList;
+    CXIMPIdentityImp* identityImp =
+             ( CXIMPIdentityImp* ) iCurrentGrId->GetInterface(
+                                        CXIMPIdentityImp::KClassId,
+                                        MXIMPBase::EPanicIfUnknown );
+    HBufC8* packedId = TXIMPObjectPacker< CXIMPIdentityImp >::PackL( *identityImp );
+    CleanupStack::PushL( packedId );
+    HBufC8* packedArray = TXIMPObjectPacker<CPresentityGroupMemberInfoImp>::PackArrayL( groupMemberList );
+    CleanupStack::PushL( packedArray );
+    RPointerArray< HBufC8 > bufferArray;
+    CleanupClosePushL( bufferArray );
+    bufferArray.AppendL( packedId );
+    bufferArray.AppendL( packedArray );
+    HBufC8* packedBufferArray = TXIMPHBuf8Packer::PackArrayL( bufferArray );
+    CleanupStack::PopAndDestroy( 2, packedArray ); // bufferArray, packedArray
+    CleanupStack::PushL( packedBufferArray );
+
+    // 2. Use filetool to send it for plugin.
+    CXIMPTestFileSrvMsg* srvMsg = CXIMPTestFileSrvMsg::NewL( CXIMPTestFileSrvMsg::ETestSrvMsgPresentityGroupMemberList,
+                                                             *packedBufferArray );
+    CleanupStack::PopAndDestroy( packedBufferArray );
+    CleanupStack::PushL( srvMsg );
+    wrapper->FileTool().CleanAllL();
+    wrapper->FileTool().SrvMsgStoreL( srvMsg );
+
+    wait->WaitForL( 2 );
+
+    // 3. Create and send check notification to server
+    CXIMPTestFileSrvMsg* srvMsg2 = CXIMPTestFileSrvMsg::NewL( CXIMPTestFileSrvMsg::ETestCheckIfGroupMemberExists,
+                                                             *packedId );
+    CleanupStack::PushL( srvMsg2 );
+    wrapper->FileTool().SrvMsgStoreL( srvMsg2 );
+
+    // Wait for server to handle srvmsg.
+    wait->WaitForL( 2 );
+
+    TInt value = messenger->GetValueFor( EXIMPPlgTestExistsGroupContentInCache );
+    EUNIT_ASSERT_DESC( value == 1, "Data not cached temporarly" );
+
+   // 4. Wait for cache to clear.
+    wait->WaitForL( 5 );
+
+    // Refresh temporar cache.
+    wrapper->FileTool().SrvMsgStoreL( srvMsg );
+
+   // 4. Wait for cache to clear.
+    wait->WaitForL( 10 );
+
+    // 5. Send check notification to server
+    wrapper->FileTool().SrvMsgStoreL( srvMsg2 );
+    CleanupStack::PopAndDestroy( 3, packedId ); //packedId, srvMsg, srvMsg2
+
+    // Wait for server to handle srvmsg.
+    wait->WaitForL( 2 );
+    value = messenger->GetValueFor( EXIMPPlgTestExistsGroupContentInCache );
+    EUNIT_ASSERT_DESC( value == 1, "Data not cached temporarly, but it should be" );
+
+    wrapper->UnbindL();
+
+    CleanupStack::PopAndDestroy( wait );
+    }
+
+// ------------------------------------------------------
+// General subscribe and unsubscribe for multiple
+// ------------------------------------------------------
+//
+void T_PresenceGroupMemberManagement::T_SubUnsubGroupContent_Multi_L()
+    {
+    BindAllL();
+
+    TInt countOfWrappers = iWrapperMgr->WrapperCount();
+
+    CXIMPObjectFactoryImp* factory = CXIMPObjectFactoryImp::NewL();
+    CleanupStack::PushL( factory );
+
+    MXIMPIdentity* currentGrId = factory->NewIdentityLC();
+    currentGrId->SetIdentityL( KGroupId );
+
+    // create group to all connections
+    for ( TInt i = 0; i < countOfWrappers; i++ )
+        {
+        CXIMPTestContextWrapper* wrapper = iWrapperMgr->GetWrapperL( i );
+
+        // ------------------------------------------------------
+        // some startup stuff
+        MXIMPContext* context = wrapper->GetContext();
+        CXIMPTestMessenger* messenger = wrapper->GetMessenger();
+
+        // Get the interfaces
+        MPresenceFeatures* presFeat = wrapper->GetPresenceFeatures();
+        MPresentityGroups& presGroup = presFeat->PresentityGroups();
+
+        CXIMPTestListener* listener = CXIMPTestListener::NewL( context );
+        CleanupStack::PushL( listener );
+        // ------------------------------------------------------
+
+        // Tell the protocol it should act normally
+        wrapper->GetMessenger()->SetNoError();
+
+        // ------------------------------------------------------
+        // create presentity group
+        //
+        // expect events:
+        // - request complete.
+        // NOTE: no presentitygrouplistevent as we've not subscribed the group lists
+
+        // normal request complete
+        TXIMPRequestId reqIdDummy;  // not checked
+        CXIMPRequestCompleteEventImp* evReqComplete = CXIMPRequestCompleteEventImp::NewLC( reqIdDummy );
+
+        // identity + displayname
+        CPresentityGroupInfoImp* infoImp = CPresentityGroupInfoImp::NewLC( *currentGrId, KGroupDisplayName );
+        evReqComplete->AppendParamL( infoImp );
+        CleanupStack::Pop( infoImp );
+
+        listener->ExpectL( evReqComplete );
+        CleanupStack::Pop( evReqComplete );
+
+        TXIMPRequestId reqId = presGroup.CreatePresentityGroupL( *currentGrId, KGroupDisplayName );
+
+        // and wait
+        EUNIT_ASSERT_DESC( KErrNone == listener->WaitAndAssertL(), "CreatePresentityGroupL failed" );
+
+        // verify that create was called
+        messenger->AssertCreatePresentityGroupCalled( ETrue );
+
+        CleanupStack::PopAndDestroy( listener );
+        }
+
+    // subscribe presentity group content in all connections
+    for ( TInt i = 0; i < countOfWrappers; i++ )
+        {
+        CXIMPTestContextWrapper* wrapper = iWrapperMgr->GetWrapperL( i );
+
+        // ------------------------------------------------------
+        // some startup stuff
+        MXIMPContext* context = wrapper->GetContext();
+        CXIMPTestMessenger* messenger = wrapper->GetMessenger();
+
+        // Get the interfaces
+        MPresenceFeatures* presFeat = wrapper->GetPresenceFeatures();
+        MPresentityGroups& presGroup = presFeat->PresentityGroups();
+
+        CXIMPTestListener* listener = CXIMPTestListener::NewL( context );
+        CleanupStack::PushL( listener );
+        // ------------------------------------------------------
+
+        // ------------------------------------------------------
+        // subscribe presentity group CONTENT
+        //
+        // expect events:
+        // - request complete
+        TXIMPRequestId reqIdDummy;  // not checked
+        CXIMPRequestCompleteEventImp* evReqComplete = CXIMPRequestCompleteEventImp::NewLC( reqIdDummy );
+        listener->ExpectL( evReqComplete );
+        CleanupStack::Pop( evReqComplete );
+
+        // do the call
+        TXIMPRequestId reqId = presGroup.SubscribePresentityGroupContentL( *currentGrId );
+
+        // and wait
+        EUNIT_ASSERT_DESC( KErrNone == listener->WaitAndAssertL(), "SubscribePresentityGroupContentL failed" );
+
+        // verify that subscribe was called
+        messenger->AssertSubscribePresentityGroupContentCalled( ETrue );
+
+        CleanupStack::PopAndDestroy( listener );
+        }
+
+    // unsubscribe presentity group content in all connections
+    for ( TInt i = 0; i < countOfWrappers; i++ )
+        {
+        CXIMPTestContextWrapper* wrapper = iWrapperMgr->GetWrapperL( i );
+
+        // ------------------------------------------------------
+        // some startup stuff
+        MXIMPContext* context = wrapper->GetContext();
+        CXIMPTestMessenger* messenger = wrapper->GetMessenger();
+
+        // Get the interfaces
+        MPresenceFeatures* presFeat = wrapper->GetPresenceFeatures();
+        MPresentityGroups& presGroup = presFeat->PresentityGroups();
+
+        CXIMPTestListener* listener = CXIMPTestListener::NewL( context );
+        CleanupStack::PushL( listener );
+        // ------------------------------------------------------
+
+        // ------------------------------------------------------
+        // unsubscribe presentity group content
+        //
+        // expect events:
+        // - request complete
+        // - presentity group content event
+
+        TXIMPRequestId reqIdDummy;  // not checked
+        CXIMPRequestCompleteEventImp* evReqComplete = CXIMPRequestCompleteEventImp::NewLC( reqIdDummy );
+        listener->ExpectL( evReqComplete );
+        CleanupStack::Pop( evReqComplete );
+
+        CPresentityGroupContentEventImp* groupCntEvent =
+            XIMPTestEventFactory::CreateGroupContentEventLCX(
+                    KGroupId,
+                    KNullDesC,
+                    KNullDesC,
+                    XIMPTestEventFactory::ETestPGLCntRemoved,
+                    KNullDesC,
+                    KNullDesC,
+                    MXIMPDataSubscriptionState::ESubscriptionInactive,
+                    MXIMPDataSubscriptionState::EDataUnavailable
+                    );
+
+        listener->ExpectL( groupCntEvent );
+        CleanupStack::Pop( groupCntEvent ); // 5 more items in cleanupstack
+
+        // do the call
+        TXIMPRequestId reqId = presGroup.UnsubscribePresentityGroupContentL( *currentGrId );
+
+        // and wait
+        EUNIT_ASSERT_DESC( KErrNone == listener->WaitAndAssertL(), "UnsubscribePresentityGroupContentL failed" );
+        CleanupStack::PopAndDestroy( 5 ); // lists
+
+        // verify that unsubscribe was called
+        // unsubscribe really called only on the last one
+        messenger->AssertUnsubscribePresentityGroupContentCalled( i == countOfWrappers-1 ? ETrue : EFalse );
+
+        CleanupStack::PopAndDestroy( listener );
+        }
+
+    // delete presentity group in all connections
+    for ( TInt i = 0; i < countOfWrappers; i++ )
+        {
+        CXIMPTestContextWrapper* wrapper = iWrapperMgr->GetWrapperL( i );
+
+        // ------------------------------------------------------
+        // some startup stuff
+        MXIMPContext* context = wrapper->GetContext();
+        CXIMPTestMessenger* messenger = wrapper->GetMessenger();
+
+        // Get the interfaces
+        MPresenceFeatures* presFeat = wrapper->GetPresenceFeatures();
+        MPresentityGroups& presGroup = presFeat->PresentityGroups();
+
+        CXIMPTestListener* listener = CXIMPTestListener::NewL( context );
+        CleanupStack::PushL( listener );
+        // ------------------------------------------------------
+
+        // ------------------------------------------------------
+        // delete presentity group
+        //
+        // expect events:
+        // - request complete
+        // NO presentity group content event as we've just unsubscribed it.
+
+        TXIMPRequestId reqIdDummy;  // not checked
+        CXIMPRequestCompleteEventImp* evReqComplete = CXIMPRequestCompleteEventImp::NewLC( reqIdDummy );
+        listener->ExpectL( evReqComplete );
+        CleanupStack::Pop( evReqComplete );
+
+        // do the call
+        TXIMPRequestId reqId = presGroup.DeletePresentityGroupL( *currentGrId );
+
+        // and wait
+        EUNIT_ASSERT_DESC( KErrNone == listener->WaitAndAssertL(), "DeletePresentityGroupL failed" );
+
+        CleanupStack::PopAndDestroy( listener );
+        }
+
+    // ------------------------------------------------------
+
+    CleanupStack::PopAndDestroy( 2 ); // currentGrId, factory
+
+
+    UnbindAllL();
+
+    TeardownTestSupport();
+    }
+
+// ------------------------------------------------------
+// General subscribe and unsubscribe for multiple
+// Subscribed for all contexts, force refresh
+// ------------------------------------------------------
+//
+void T_PresenceGroupMemberManagement::T_SubUnsubGroupContent_All_Multi_L()
+    {
+    BindAllL();
+
+    TInt countOfWrappers = iWrapperMgr->WrapperCount();
+
+    CXIMPObjectFactoryImp* factory = CXIMPObjectFactoryImp::NewL();
+    CleanupStack::PushL( factory );
+
+    MXIMPIdentity* currentGrId = factory->NewIdentityLC();
+    currentGrId->SetIdentityL( KGroupId );
+
+    // create group to all connections
+    CXIMPTestContextWrapper* wrapper = iWrapperMgr->GetWrapperL( 0 );
+
+    // ------------------------------------------------------
+    // some startup stuff
+    MXIMPContext* context = wrapper->GetContext();
+    CXIMPTestMessenger* messenger = wrapper->GetMessenger();
+
+    // Get the interfaces
+    MPresenceFeatures* presFeat = wrapper->GetPresenceFeatures();
+    MPresentityGroups& presGroup = presFeat->PresentityGroups();
+
+    CXIMPTestListener* listener = CXIMPTestListener::NewL( context );
+    CleanupStack::PushL( listener );
+    // ------------------------------------------------------
+
+    // Tell the protocol it should act normally
+    wrapper->GetMessenger()->SetNoError();
+
+    // ------------------------------------------------------
+    // create presentity group
+    //
+    // expect events:
+    // - request complete.
+    // NOTE: no presentitygrouplistevent as we've not subscribed the group lists
+
+    // normal request complete
+    TXIMPRequestId reqIdDummy;  // not checked
+    CXIMPRequestCompleteEventImp* evReqComplete = CXIMPRequestCompleteEventImp::NewLC( reqIdDummy );
+
+    // identity + displayname
+    CPresentityGroupInfoImp* infoImp = CPresentityGroupInfoImp::NewLC( *currentGrId, KGroupDisplayName );
+    evReqComplete->AppendParamL( infoImp );
+    CleanupStack::Pop( infoImp );
+
+    listener->ExpectL( evReqComplete );
+    CleanupStack::Pop( evReqComplete );
+
+    TXIMPRequestId reqId = presGroup.CreatePresentityGroupL( *currentGrId, KGroupDisplayName );
+
+    // and wait
+    EUNIT_ASSERT_DESC( KErrNone == listener->WaitAndAssertL(), "CreatePresentityGroupL failed" );
+
+    // verify that create was called
+    messenger->AssertCreatePresentityGroupCalled( ETrue );
+
+    // we'll make a new listener below, disable temporarily
+    listener->SetEventSourceL( NULL );
+
+    // subscribe presentity group content in all connections
+    for ( TInt i = 0; i < countOfWrappers; i++ )
+        {
+        CXIMPTestContextWrapper* wrapper = iWrapperMgr->GetWrapperL( i );
+
+        // ------------------------------------------------------
+        // some startup stuff
+        MXIMPContext* context = wrapper->GetContext();
+        CXIMPTestMessenger* messenger = wrapper->GetMessenger();
+
+        // Get the interfaces
+        MPresenceFeatures* presFeat = wrapper->GetPresenceFeatures();
+        MPresentityGroups& presGroup = presFeat->PresentityGroups();
+
+        CXIMPTestListener* listener2 = CXIMPTestListener::NewL( context );
+        CleanupStack::PushL( listener2 );
+        // ------------------------------------------------------
+
+        // ------------------------------------------------------
+        // subscribe presentity group content for ALL contexts
+        //
+        // expect events:
+        // - request complete
+        evReqComplete = CXIMPRequestCompleteEventImp::NewLC( reqIdDummy );
+        listener2->ExpectL( evReqComplete );
+        CleanupStack::Pop( evReqComplete );
+
+        // do the call
+        reqId = presGroup.SubscribePresentityGroupContentL( *currentGrId );
+
+        // and wait
+        EUNIT_ASSERT_DESC( KErrNone == listener2->WaitAndAssertL(), "SubscribePresentityGroupContentL failed" );
+
+        // verify that subscribe was called for first only
+        if ( i == 0 )
+            {
+            messenger->AssertSubscribePresentityGroupContentCalled( ETrue );
+            // reset flag
+            messenger->SetValueFor(
+                    EXIMPPlgTestSubscribePresentityGroupContentCalled,
+                    EFalse );
+            }
+        else
+            {
+            messenger->AssertSubscribePresentityGroupContentCalled( EFalse );
+            }
+
+        CleanupStack::PopAndDestroy( listener2 );
+        }
+
+    for ( TInt i = 0; i < countOfWrappers; i++ )
+        {
+        CXIMPTestContextWrapper* wrapper = iWrapperMgr->GetWrapperL( i );
+
+        // ------------------------------------------------------
+        // some startup stuff
+        MXIMPContext* context = wrapper->GetContext();
+        CXIMPTestMessenger* messenger = wrapper->GetMessenger();
+
+        // Get the interfaces
+        MPresenceFeatures* presFeat = wrapper->GetPresenceFeatures();
+        MPresentityGroups& presGroup = presFeat->PresentityGroups();
+
+        CXIMPTestListener* listener2 = CXIMPTestListener::NewL( context );
+        CleanupStack::PushL( listener2 );
+        // ------------------------------------------------------
+
+        // ------------------------------------------------------
+        // subscribe presentity group content, making a REFRESH case
+        // with multiple contexts
+        //
+        // expect events:
+        // - request complete
+        // - group content event
+
+        evReqComplete = CXIMPRequestCompleteEventImp::NewLC( reqIdDummy );
+        listener2->ExpectL( evReqComplete );
+        CleanupStack::Pop( evReqComplete );
+
+        CPresentityGroupContentEventImp* groupCntEvent =
+            XIMPTestEventFactory::CreateGroupContentEventLCX(
+                    KGroupId,
+                    KNullDesC,
+                    KNullDesC,
+                    XIMPTestEventFactory::ETestPGLCntUpdated,
+                    KNullDesC,
+                    KNullDesC,
+                    MXIMPDataSubscriptionState::ESubscriptionActive,
+                    MXIMPDataSubscriptionState::EDataUnavailable
+                    );
+
+        listener2->ExpectL( groupCntEvent );
+        CleanupStack::Pop( groupCntEvent ); // 5 more items in cleanupstack
+
+        // do the call
+        reqId = presGroup.SubscribePresentityGroupContentL( *currentGrId );
+
+        // and wait
+        EUNIT_ASSERT_DESC( KErrNone == listener2->WaitAndAssertL(), "SubscribePresentityGroupContentL failed" );
+
+        CleanupStack::PopAndDestroy( 5 ); // rest of group the content event
+
+        // subscribe is not called in the adaptation, this is a refresh case
+        messenger->AssertSubscribePresentityGroupContentCalled( EFalse );
+
+        CleanupStack::PopAndDestroy( listener2 );
+        }
+
+    // continue listening
+    listener->SetEventSourceL( context );
+
+    // ------------------------------------------------------
+    // unsubscribe presentity group content
+    //
+    // expect events:
+    // - request complete
+    // - presentity group content event
+
+    evReqComplete = CXIMPRequestCompleteEventImp::NewLC( reqIdDummy );
+    listener->ExpectL( evReqComplete );
+    CleanupStack::Pop( evReqComplete );
+
+    CPresentityGroupContentEventImp* groupCntEvent =
+        XIMPTestEventFactory::CreateGroupContentEventLCX(
+                KGroupId,
+                KNullDesC,
+                KNullDesC,
+                XIMPTestEventFactory::ETestPGLCntRemoved,
+                KNullDesC,
+                KNullDesC,
+                MXIMPDataSubscriptionState::ESubscriptionInactive,
+                MXIMPDataSubscriptionState::EDataUnavailable
+                );
+
+    listener->ExpectL( groupCntEvent );
+    CleanupStack::Pop( groupCntEvent ); // 5 more items in cleanupstack
+
+    // do the call
+    reqId = presGroup.UnsubscribePresentityGroupContentL( *currentGrId );
+
+    // and wait
+    EUNIT_ASSERT_DESC( KErrNone == listener->WaitAndAssertL(), "UnsubscribePresentityGroupContentL failed" );
+    CleanupStack::PopAndDestroy( 5 ); // lists
+
+    // verify that unsubscribe was NOT called (other contexts are listening too),
+    // and it will be unscubscribed on the last call
+    messenger->AssertUnsubscribePresentityGroupContentCalled( EFalse );
+
+    // ------------------------------------------------------
+    // delete presentity group
+    //
+    // expect events:
+    // - request complete
+    // NO presentity group content event as we've just unsubscribed it.
+
+    evReqComplete = CXIMPRequestCompleteEventImp::NewLC( reqIdDummy );
+    listener->ExpectL( evReqComplete );
+    CleanupStack::Pop( evReqComplete );
+
+    // do the call
+    reqId = presGroup.DeletePresentityGroupL( *currentGrId );
+
+    // and wait
+    EUNIT_ASSERT_DESC( KErrNone == listener->WaitAndAssertL(), "DeletePresentityGroupL failed" );
+
+    // ------------------------------------------------------
+
+    CleanupStack::PopAndDestroy( 3 ); // listener, currentGrId, factory
+
+    UnbindAllL();
+
+    TeardownTestSupport();
+    }
+
+// ------------------------------------------------------
+// General subscribe and unsubscribe for multiple
+// Subscribed for one context only
+// ------------------------------------------------------
+//
+void T_PresenceGroupMemberManagement::T_SubUnsubGroupContent_One_Multi_L()
+    {
+    BindAllL();
+
+    CXIMPObjectFactoryImp* factory = CXIMPObjectFactoryImp::NewL();
+    CleanupStack::PushL( factory );
+
+    MXIMPIdentity* currentGrId = factory->NewIdentityLC();
+    currentGrId->SetIdentityL( KGroupId );
+
+    // create group to all connections
+    CXIMPTestContextWrapper* wrapper = iWrapperMgr->GetWrapperL( 0 );
+
+    // ------------------------------------------------------
+    // some startup stuff
+    MXIMPContext* context = wrapper->GetContext();
+    CXIMPTestMessenger* messenger = wrapper->GetMessenger();
+
+    // Get the interfaces
+    MPresenceFeatures* presFeat = wrapper->GetPresenceFeatures();
+    MPresentityGroups& presGroup = presFeat->PresentityGroups();
+
+    CXIMPTestListener* listener = CXIMPTestListener::NewL( context );
+    CleanupStack::PushL( listener );
+    // ------------------------------------------------------
+
+    // Tell the protocol it should act normally
+    wrapper->GetMessenger()->SetNoError();
+
+    // ------------------------------------------------------
+    // create presentity group
+    //
+    // expect events:
+    // - request complete.
+    // NOTE: no presentitygrouplistevent as we've not subscribed the group lists
+
+    // normal request complete
+    TXIMPRequestId reqIdDummy;  // not checked
+    CXIMPRequestCompleteEventImp* evReqComplete = CXIMPRequestCompleteEventImp::NewLC( reqIdDummy );
+
+    // identity + displayname
+    CPresentityGroupInfoImp* infoImp = CPresentityGroupInfoImp::NewLC( *currentGrId, KGroupDisplayName );
+    evReqComplete->AppendParamL( infoImp );
+    CleanupStack::Pop( infoImp );
+
+    listener->ExpectL( evReqComplete );
+    CleanupStack::Pop( evReqComplete );
+
+    TXIMPRequestId reqId = presGroup.CreatePresentityGroupL( *currentGrId, KGroupDisplayName );
+
+    // and wait
+    EUNIT_ASSERT_DESC( KErrNone == listener->WaitAndAssertL(), "CreatePresentityGroupL failed" );
+
+    // verify that create was called
+    messenger->AssertCreatePresentityGroupCalled( ETrue );
+
+    // ------------------------------------------------------
+    // subscribe presentity group CONTENT
+    //
+    // expect events:
+    // - request complete
+    evReqComplete = CXIMPRequestCompleteEventImp::NewLC( reqIdDummy );
+    listener->ExpectL( evReqComplete );
+    CleanupStack::Pop( evReqComplete );
+
+    // do the call
+    reqId = presGroup.SubscribePresentityGroupContentL( *currentGrId );
+
+    // and wait
+    EUNIT_ASSERT_DESC( KErrNone == listener->WaitAndAssertL(), "SubscribePresentityGroupContentL failed" );
+
+    // verify that subscribe was called
+    messenger->AssertSubscribePresentityGroupContentCalled( ETrue );
+
+    // ------------------------------------------------------
+    // subscribe presentity group content, making a REFRESH case
+    // with multiple contexts
+    //
+    // expect events:
+    // - request complete
+    // - group content event
+
+    evReqComplete = CXIMPRequestCompleteEventImp::NewLC( reqIdDummy );
+    listener->ExpectL( evReqComplete );
+    CleanupStack::Pop( evReqComplete );
+
+    CPresentityGroupContentEventImp* groupCntEvent =
+        XIMPTestEventFactory::CreateGroupContentEventLCX(
+                KGroupId,
+                KNullDesC,
+                KNullDesC,
+                XIMPTestEventFactory::ETestPGLCntUpdated,
+                KNullDesC,
+                KNullDesC,
+                MXIMPDataSubscriptionState::ESubscriptionActive,
+                MXIMPDataSubscriptionState::EDataUnavailable
+                );
+
+    listener->ExpectL( groupCntEvent );
+    CleanupStack::Pop( groupCntEvent ); // 5 more items in cleanupstack
+
+    // do the call
+    reqId = presGroup.SubscribePresentityGroupContentL( *currentGrId );
+
+    // and wait
+    EUNIT_ASSERT_DESC( KErrNone == listener->WaitAndAssertL(), "SubscribePresentityGroupContentL failed" );
+
+    CleanupStack::PopAndDestroy( 5 ); // rest of group the content event
+
+    // verify that subscribe was called
+    messenger->AssertSubscribePresentityGroupContentCalled( ETrue );
+
+    // ------------------------------------------------------
+    // unsubscribe presentity group content
+    //
+    // expect events:
+    // - request complete
+    // - presentity group content event
+
+    evReqComplete = CXIMPRequestCompleteEventImp::NewLC( reqIdDummy );
+    listener->ExpectL( evReqComplete );
+    CleanupStack::Pop( evReqComplete );
+
+    groupCntEvent =
+        XIMPTestEventFactory::CreateGroupContentEventLCX(
+                KGroupId,
+                KNullDesC,
+                KNullDesC,
+                XIMPTestEventFactory::ETestPGLCntRemoved,
+                KNullDesC,
+                KNullDesC,
+                MXIMPDataSubscriptionState::ESubscriptionInactive,
+                MXIMPDataSubscriptionState::EDataUnavailable
+                );
+
+    listener->ExpectL( groupCntEvent );
+    CleanupStack::Pop( groupCntEvent ); // 5 more items in cleanupstack
+
+    // do the call
+    reqId = presGroup.UnsubscribePresentityGroupContentL( *currentGrId );
+
+    // and wait
+    EUNIT_ASSERT_DESC( KErrNone == listener->WaitAndAssertL(), "UnsubscribePresentityGroupContentL failed" );
+    CleanupStack::PopAndDestroy( 5 ); // lists
+
+    // verify that unsubscribe was called
+    // unsubscribe really called only on the last one
+    messenger->AssertUnsubscribePresentityGroupContentCalled( ETrue );
+
+    // ------------------------------------------------------
+    // delete presentity group
+    //
+    // expect events:
+    // - request complete
+    // NO presentity group content event as we've just unsubscribed it.
+
+    evReqComplete = CXIMPRequestCompleteEventImp::NewLC( reqIdDummy );
+    listener->ExpectL( evReqComplete );
+    CleanupStack::Pop( evReqComplete );
+
+    // do the call
+    reqId = presGroup.DeletePresentityGroupL( *currentGrId );
+
+    // and wait
+    EUNIT_ASSERT_DESC( KErrNone == listener->WaitAndAssertL(), "DeletePresentityGroupL failed" );
+
+    // ------------------------------------------------------
+
+    CleanupStack::PopAndDestroy( 3 ); // listener, currentGrId, factory
+
+    UnbindAllL();
+
+    TeardownTestSupport();
+    }
+
+// Unsubscribe non-subscribed
+void T_PresenceGroupMemberManagement::T_UnsubscribeNonSubscribed_L()
+    {
+    CXIMPTestContextWrapper* wrapper = iWrapperMgr->GetWrapperL( 0 );
+    wrapper->BindL( 0 );
+
+    // ------------------------------------------------------
+    // some startup stuff
+    MXIMPContext* context = wrapper->GetContext();
+    CXIMPTestMessenger* messenger = wrapper->GetMessenger();
+
+    // Get the interfaces
+    MPresenceFeatures* presFeat = wrapper->GetPresenceFeatures();
+    MPresentityGroups& presGroup = presFeat->PresentityGroups();
+
+    iListener2 = CXIMPTestListener::NewL( context );
+    // ------------------------------------------------------
+
+    // Tell the protocol it should act normally
+    wrapper->GetMessenger()->SetNoError();
+
+    iCurrentGrId = context->ObjectFactory().NewIdentityLC();
+    CleanupStack::Pop(); // iCurrentGrId
+    iCurrentGrId->SetIdentityL( KGroupId );
+
+    // ------------------------------------------------------
+    // create presentity group
+    //
+    // expect events:
+    // - request complete.
+    // NOTE: no presentitygrouplistevent as we've not subscribed the group lists
+
+    // normal request complete
+    TXIMPRequestId reqIdDummy;  // not checked
+    CXIMPRequestCompleteEventImp* evReqComplete = CXIMPRequestCompleteEventImp::NewLC( reqIdDummy );
+
+    // identity + displayname
+    CPresentityGroupInfoImp* infoImp = CPresentityGroupInfoImp::NewLC( *iCurrentGrId, KGroupDisplayName );
+    evReqComplete->AppendParamL( infoImp );
+    CleanupStack::Pop( infoImp );
+
+    iListener2->ExpectL( evReqComplete );
+    CleanupStack::Pop( evReqComplete );
+
+    TXIMPRequestId reqId = presGroup.CreatePresentityGroupL( *iCurrentGrId, KGroupDisplayName );
+
+    // and wait
+    EUNIT_ASSERT_DESC( KErrNone == iListener2->WaitAndAssertL(), "CreatePresentityGroupL failed" );
+    messenger->AssertCreatePresentityGroupCalled( ETrue );
+
+    // ------------------------------------------------------
+    // unsubscribe presentity group content
+    //
+    // expect events:
+    // - request complete
+    // - presentity group content event
+
+    evReqComplete = CXIMPRequestCompleteEventImp::NewLC( reqIdDummy );
+    iListener2->ExpectL( evReqComplete );
+    CleanupStack::Pop( evReqComplete );
+
+    CPresentityGroupContentEventImp* groupCntEvent =
+        XIMPTestEventFactory::CreateGroupContentEventLCX(
+                KGroupId,
+                KNullDesC,
+                KNullDesC,
+                XIMPTestEventFactory::ETestPGLCntRemoved,
+                KNullDesC,
+                KNullDesC,
+                MXIMPDataSubscriptionState::ESubscriptionInactive,
+                MXIMPDataSubscriptionState::EDataUnavailable
+                );
+
+    iListener2->ExpectL( groupCntEvent );
+    CleanupStack::Pop( groupCntEvent ); // 5 more items in cleanupstack
+
+    // do the call
+    reqId = presGroup.UnsubscribePresentityGroupContentL( *iCurrentGrId );
+
+    // and wait
+    EUNIT_ASSERT_DESC( KErrNone == iListener2->WaitAndAssertL(), "UnsubscribePresentityGroupContentL failed" );
+
+    CleanupStack::PopAndDestroy( 5 ); // lists
+
+    // verify that unsubscribe was not called, not subscribed, so won't
+    // unsubscribe
+    messenger->AssertUnsubscribePresentityGroupContentCalled( EFalse );
+
+    // make sure the new listener is not listening for events!
+    iListener2->SetEventSourceL( NULL );
+
+    wrapper->UnbindL();
+
+    TeardownTestSupport();
+    }
+
+// ===========================================================================
+// SETUP HELPERS FOR THE LISTENER
+// ===========================================================================
+//
+void T_PresenceGroupMemberManagement::SetupListenerReqCompleteL( CXIMPTestContextWrapper* aWrapper, TXIMPTestStatusEventTemplate aEventType )
+    {
+    RArray< TInt32 > array;
+    CleanupClosePushL( array );
+    array.Append( MXIMPContextStateEvent::KInterfaceId );
+    array.Append( MPresentityGroupListEvent::KInterfaceId );
+    aWrapper->SetupListenerReqCompleteL( aEventType, &array );
+    CleanupStack::PopAndDestroy(); // array
+    }
+
+void T_PresenceGroupMemberManagement::SetupListenerReqCompleteAllowEventsL(  CXIMPTestContextWrapper* aWrapper, TXIMPTestStatusEventTemplate aEventType )
+    {
+    RArray< TInt32 > array;
+    CleanupClosePushL( array );
+    array.AppendL( MXIMPRequestCompleteEvent::KInterfaceId );
+    array.AppendL( MXIMPContextStateEvent::KInterfaceId );
+    array.Append( MPresentityGroupListEvent::KInterfaceId );
+    array.Append( MXIMPContextStateEvent::KInterfaceId );
+    array.Append( MPresentityGroupListEvent::KInterfaceId );
+    array.Append( MPresentityGroupContentEvent::KInterfaceId );
+    aWrapper->SetupListenerReqCompleteL( aEventType, &array );
+    CleanupStack::PopAndDestroy(); // array
+    }
+
+// ===========================================================================
+// TEST CASE TABLE
+// ===========================================================================
+//
+EUNIT_BEGIN_TEST_TABLE(
+        T_PresenceGroupMemberManagement,
+        "XIMP presence group member management tests",
+        "MODULE" )
+
+PRFW_DECORATED_TEST(
+        "Subscribe and unsubscribe presentity group content",
+        "",
+        "",
+        "FUNCTIONALITY",
+        Setup_L,
+        T_SubUnsubGroupContent_Single_L,
+        Teardown )
+
+PRFW_DECORATED_TEST(
+        "Subscribe and unsubscribe multiple",
+        "",
+        "",
+        "FUNCTIONALITY",
+        SetupMultiple_L,
+        T_SubUnsubGroupContent_Multi_L,
+        Teardown )
+
+PRFW_DECORATED_TEST(
+        "Refresh subscription for one, multiple",
+        "",
+        "",
+        "FUNCTIONALITY",
+        SetupMultiple_L,
+        T_SubUnsubGroupContent_One_Multi_L,
+        Teardown )
+
+PRFW_DECORATED_TEST(
+        "Refresh subscription for all, multiple",
+        "",
+        "",
+        "FUNCTIONALITY",
+        SetupMultiple_L,
+        T_SubUnsubGroupContent_All_Multi_L,
+        Teardown )
+
+PRFW_DECORATED_TEST(
+        "Subscribe content and receive altered id",
+        "",
+        "",
+        "FUNCTIONALITY",
+        Setup_L,
+        T_SubUnsubGroupContent_Altered_Single_L,
+        Teardown )
+
+PRFW_DECORATED_TEST(
+        "Subscribe content and receive altered but same id",
+        "",
+        "",
+        "FUNCTIONALITY",
+        Setup_L,
+        T_SubUnsubGroupContent_AlteredSame_Single_L,
+        Teardown )
+
+PRFW_DECORATED_TEST(
+        "Unsubscribe non-subscribed",
+        "",
+        "",
+        "FUNCTIONALITY",
+        Setup_L,
+        T_UnsubscribeNonSubscribed_L,
+        Teardown )
+
+PRFW_DECORATED_TEST(
+        "Add members to group",
+        "",
+        "",
+        "FUNCTIONALITY",
+        Setup_L,
+        T_AddGroupMembers_Single_L,
+        Teardown )
+
+PRFW_DECORATED_TEST(
+        "Remove members from group",
+        "",
+        "",
+        "FUNCTIONALITY",
+        Setup_L,
+        T_RemoveGroupMembers_Single_L,
+        Teardown )
+
+PRFW_DECORATED_TEST(
+        "Remove members from unsubscribed group",
+        "",
+        "",
+        "FUNCTIONALITY",
+        Setup_L,
+        T_RemoveGroupMembers_NonSub_Single_L,
+        Teardown )
+
+PRFW_DECORATED_TEST(
+        "Remove nonexisting member from group",
+        "",
+        "",
+        "FUNCTIONALITY",
+        Setup_L,
+        T_RemoveGroupMembers_NonExist_Single_L,
+        Teardown )
+
+PRFW_DECORATED_TEST(
+        "Updated members from group",
+        "",
+        "",
+        "FUNCTIONALITY",
+        Setup_L,
+        T_UpdateGroupMembers_Single_L,
+        Teardown )
+
+PRFW_DECORATED_TEST(
+        "Updated members from nonsubscribed group",
+        "",
+        "",
+        "FUNCTIONALITY",
+        Setup_L,
+        T_UpdateGroupMembers_NonSub_Single_L,
+        Teardown )
+
+PRFW_DECORATED_TEST(
+        "Updated nonexisting member of group",
+        "",
+        "",
+        "FUNCTIONALITY",
+        Setup_L,
+        T_UpdateGroupMembers_NonExist_Single_L,
+        Teardown )
+
+PRFW_DECORATED_TEST(
+        "Expire non-subscribed data",
+        "",
+        "",
+        "FUNCTIONALITY",
+        Setup_L,
+        T_ExpireNonSubscribedData_L,
+        Teardown )
+
+PRFW_DECORATED_TEST(
+        "Expire non-subscribed data. Update multiple times",
+        "",
+        "",
+        "FUNCTIONALITY",
+        Setup_L,
+        T_ExpireNonSubscribedDataUpdateMultiple_L,
+        Teardown )
+
+
+EUNIT_END_TEST_TABLE
+
+
+// ===========================================================================
+// TEST SUITE CONSTRUCTION
+// ===========================================================================
+//
+EXPORT_C MEUnitTest* CreateTestSuiteL()
+    {
+    return T_PresenceGroupMemberManagement::NewL();
+    }
+
+// TODO implement this (split this file to multiple parts):
+/*
+// ===========================================================================
+// TEST SUITE CONSTRUCTION
+// ===========================================================================
+//
+EXPORT_C MEUnitTest* CreateTestSuiteL()
+    {
+    CEUnitTestSuite* suiteCollection = CEUnitTestSuite::NewLC( _L("XIMP group list management tests") );
+
+    CEUnitTestSuite* suite = T_PresenceGroupListManagement::NewL();
+    CleanupStack::PushL( suite );
+    suiteCollection->AddL( suite );
+    CleanupStack::Pop( suite );
+
+    suite = T_xxx::NewL();
+    CleanupStack::PushL( suite );
+    suiteCollection->AddL( suite );
+    CleanupStack::Pop( suite );
+
+    CleanupStack::Pop( suiteCollection );
+    return suiteCollection;
+    }
+
+*/
+
+
+
+// ===========================================================================
+// MISC
+// ===========================================================================
+//
+//Exception handler function
+void MyExceptionHandler( TExcType /*aType*/ )
+    {
+    __BREAKPOINT();
+    }
+
+void T_PresenceGroupMemberManagement::UseMyOwnExceptionHandler()
+    {
+    //Register exeption handler
+    TInt r = User::SetExceptionHandler( MyExceptionHandler, 0xFFFFFFFF );
+    if (r != KErrNone)
+        {
+        User::Panic( _L("MyExHandler"), 1 );
+        }
+    }
+
+
+// end of file