contextframework/cfw/tsrc/public/basic/MT_CFClient/MT_CFClient.cpp
changeset 0 2e3d3ce01487
child 28 b0b858956ed5
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/contextframework/cfw/tsrc/public/basic/MT_CFClient/MT_CFClient.cpp	Tue Feb 02 10:12:00 2010 +0200
@@ -0,0 +1,5478 @@
+/*
+* Copyright (c) 2007 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:
+*
+*/
+
+
+// INCLUDES
+#include "MT_CFClient.h"
+
+#include <EUnitMacros.h>
+#include <cfclient.h>
+#include <cfcontextsubscription.h>
+#include <cfcontextindication.h>
+#include <cfactionsubscription.h>
+#include <cfactionindication.h>
+#include <cfcontextsourcecommand.h>
+#include <f32file.h>
+#include <S32MEM.h>
+#include <e32property.h>
+#include <BAUTILS.H>
+
+#include "cfcommon.h"
+#include "testcontextdata.h"
+#include "cfcontextobjectimpl.h"
+#include "testcontextsourceplugin.h"
+#include "testcontextsourcepluginconst.hrh"
+#include "CFTestDelay.h"
+#include "cfenvutils.h"
+
+// CONSTANTS
+
+_LIT_SECURITY_POLICY_PASS( KPassSec );
+_LIT_SECURITY_POLICY_FAIL( KFailSec );
+
+_LIT( KContextSourceA, "TestSourceA" );
+_LIT( KContextTypeA, "TestTypeA" );
+_LIT( KContextValueA, "TestValueA" );
+_LIT( KContextValueB, "TestValueB" );
+
+_LIT( KContextSourceFormatWild, "Source" );
+_LIT( KContextTypeFormatWild, "Type" );
+_LIT( KContextSourceFormat, "Source.%d" );
+_LIT( KContextTypeFormat, "Type.%d" );
+_LIT( KContextValueFormat, "Value.%d" );
+
+_LIT( KActionIdFormat, "AcionId.%d" );
+
+_LIT( KActionA, "TestActionA" );
+_LIT( KActionAParamA1, "ParamA1" );
+_LIT( KActionAValueA1, "ValueA1" );
+
+_LIT( KActionB, "TestActionB" );
+_LIT( KActionBParamB1, "ParamB1" );
+_LIT( KActionBValueB1, "ValueB1" );
+_LIT( KActionBParamB2, "ParamB2" );
+_LIT( KActionBValueB2, "ValueB2" );
+
+_LIT( KActionC, "TestActionC" );
+
+_LIT( KTestContextSource, "TestContextSource" );
+_LIT( KTestContextType, "SubsNoSubsTest" );
+_LIT( KTestContextType2, "SubsNoSubsTest2" );
+_LIT( KTestContextValueType, "TestValue" );
+_LIT( KTestContextValueSubsOk, "SubsOk" );
+_LIT( KTestContextValueNosubsOk, "NoSubsOk" );
+_LIT( KTestContextValueNok, "Nok" );
+
+const TUid KTestContextSourcePluginImplUid =
+    {
+        KTestContextSourcePluginImplementationUid
+    };
+const TUid KBogusContextSourcePluginImplUid =
+    {
+        0xBAD50BAD
+    };
+
+const TInt KSecond = 1000000;
+
+_LIT( KSourceCommandId, "sourceCommand" );
+_LIT( KSourceCommandUidId, "uid" );
+_LIT( KSourceCommandParamCmd, "cmd" );
+_LIT( KSourceCommandParamCmdParam, "cmdParam" );
+_LIT( KSourceCommandParamCmdInfo, "cmdInfo" );
+_LIT( KSourceCommandParamModifiers, "modifiers" );
+_LIT( KSourceCommandAttributeType, "type" );
+_LIT( KSourceCommandAttributeMode, "mode" );
+_LIT( KSourceCommandAttributeOverride, "override" );
+_LIT( KSourceCommandAttributeText, "text" );
+_LIT( KSourceCommandAttributeValueText, "activate from really clean state" );
+_LIT( KSourceCommandAttributeValue, "value" );
+_LIT( KSourceCommandAttributeValueYes, "yes" );
+_LIT( KSourceCommandAttributeValueActivate, "Activate" );
+_LIT( KSourceCommandAttributeValueDeactivate, "Deactivate" );
+_LIT( KSourceCommandAttributeValueClean, "clean" );
+_LIT( KSourceCommandAttributeValueReally, "really" );
+_LIT( KSourceCommandAttributeValueFull, "full" );
+_LIT( KSourceCommandAttributeValueNoException, "noException" );
+
+_LIT( KSourceCommandPluginScriptContextSource, "TestSourcePlugIn" );
+_LIT( KSourceCommandClientScriptContextSource, "TestSourceClient" );
+_LIT( KSourceCommandScriptContextType, "SendSourceCommand" );
+_LIT( KSourceCommandScript1ContextValueActivate, "A" );
+_LIT( KSourceCommandScript1ContextValueDeactivate, "B" );
+_LIT( KSourceCommandScript2ContextValueActivate, "A2" );
+_LIT( KSourceCommandScript2ContextValueDeactivate, "B2" );
+
+_LIT( KSourceCommandSignalContextSource, "TestSourcePlugin" );
+_LIT( KSourceCommandSignalContextType, "SourceCommand" );
+_LIT( KSourceCommandSignalContextValueActivated, "Activated" );
+_LIT( KSourceCommandSignalContextValueDeactivated, "Deactivated" );
+_LIT( KSourceCommandSignalContextValueActiveReqActivate, "ActiveReqActivate" );
+_LIT( KSourceCommandSignalContextValueActiveReqDeactivate, "ActiveReqDeactivate" );
+_LIT( KSourceCommandSignalContextValueDeactiveReqDeactivate, "DeactiveReqDeactivate" );
+_LIT( KSourceCommandSignalContextValueError, "Error" );
+
+_LIT( KContextValueTriggerForSourceCommandClient, "SourceCommandClient" );
+
+_LIT( KReservedActionPublishContext, "publishContext" );
+_LIT( KReservedActionPublishContext2, "PUBLISHCONTEXT" );
+_LIT( KReservedActionSourceCommand, "sourceCommand" );
+_LIT( KReservedActionSourceCommand2, "SOURCECOMMAND" );
+
+_LIT( KRomScriptAutoDefineContextSource, "RomScript" );
+_LIT( KRomScriptAutoDefineContextType, "NewContext" );
+_LIT( KRomScriptAutoDefineContextValue, "AutoDefined" );
+_LIT( KRomScriptTriggerAutoDefineContextSource, "TestRomScript" );
+_LIT( KRomScriptTriggerAutoDefineContextType, "PublishContext" );
+_LIT( KRomScriptTriggerAutoDefineContextValue, "AutoDefine" );
+
+_LIT( KRomScriptDetectedAutoDefinedContextSource, "AutoDefined" );
+_LIT( KRomScriptDetectedAutoDefinedContextType, "RomScriptContext" );
+_LIT( KRomScriptDetectedAutoDefinedContextValue, "Detected" );
+
+// LOCAL DEFINITIONS
+
+/**
+ * Clean up item for RContextObjectArray
+ */
+LOCAL_C void CleanupContextObjectArray( TAny* aArray )
+    {
+    RContextObjectArray* array = static_cast<RContextObjectArray*>( aArray );
+    array->ResetAndDestroy();
+    }
+
+/**
+ * Clean up function for RContextObjectArray
+ */
+LOCAL_C void CleanupResetAndDestroyPushL( RContextObjectArray& aArray )
+    {
+    TCleanupItem item( CleanupContextObjectArray, &aArray );
+    CleanupStack::PushL( item );
+    }
+
+/**
+ * Clean up item for RContextQueryArray
+ */
+LOCAL_C void CleanupContextQueryArray( TAny* aArray )
+    {
+    RContextQueryArray* array = static_cast<RContextQueryArray*>( aArray );
+    array->ResetAndDestroy();
+    }
+
+/**
+ * Clean up function for RContextQueryArray
+ */
+LOCAL_C void CleanupResetAndDestroyPushL( RContextQueryArray& aArray )
+    {
+    TCleanupItem item( CleanupContextQueryArray, &aArray );
+    CleanupStack::PushL( item );
+    }
+
+/**
+ * Wait info.
+ */
+NONSHARABLE_CLASS( TWaitInfo )
+    {
+public:
+
+    CPeriodic* iPeriodic;
+    CActiveSchedulerWait* iWait;
+    };
+
+/**
+ * Call back method when we need to stop active scheduler wait.
+ */
+LOCAL_C TInt WaitCallBack( TAny* aSelf )
+    {
+    if( aSelf )
+        {
+        TWaitInfo* info = static_cast<TWaitInfo*>( aSelf );
+        if( info->iPeriodic )
+            {
+            info->iPeriodic->Cancel();
+            }
+        if( info->iWait )
+            {
+            if( info->iWait->IsStarted() )
+                {
+                info->iWait->AsyncStop();
+                }
+            }
+        }
+
+    return KErrNone;
+    }
+
+/**
+ * Helper method to wait current scheduler before teardown is completed.
+ */
+LOCAL_C void Wait( TInt aIntervalInMicorseconds )
+    {
+    TWaitInfo info;
+
+    // Construct periodic
+    CPeriodic* periodic = CPeriodic::NewL( CActive::EPriorityStandard );
+    CleanupStack::PushL( periodic );
+    info.iPeriodic = periodic;
+
+    // Construct active scheduler wait
+    CActiveSchedulerWait* wait = new( ELeave ) CActiveSchedulerWait;
+    CleanupStack::PushL( wait );
+    info.iWait = wait;
+
+    // Start timer and wait
+    TCallBack cb( WaitCallBack, &info );
+    periodic->Start( aIntervalInMicorseconds, aIntervalInMicorseconds, cb );
+    wait->Start();
+
+    // Cleanup
+    CleanupStack::PopAndDestroy( wait );
+    CleanupStack::PopAndDestroy( periodic );
+    }
+
+const TInt KDelay = 2000000; // 2 seconds
+const TInt KConfigDelay = 4000;
+
+/**
+ * Orders source command sender identities.
+ * @param aFirst First source command sender id.
+ * @param aSecond Second source command sender id.
+ * @return Zero if the uid and the script id of the first and second are equal.
+ *   Negative value if the uid of the first is less than the uid of the second
+ *   or script id of the first is less than second's when uid are equal.
+ *   Positive value if the uid of the first is greater than the uid of the
+ *   second or script id of the first is greater than second's when uid are
+ *   equal.
+ */
+ LOCAL_C TInt SourceCommandSenderIdOrder(
+     const TCFSourceCommandSenderId& aFirst,
+     const TCFSourceCommandSenderId& aSecond )
+     {
+     TInt orderValue = 1;
+
+     if ( aFirst.iSender == aSecond.iSender )
+         {
+         if ( aFirst.iScriptId == aSecond.iScriptId )
+             {
+             orderValue = 0;
+             }
+         else if ( aFirst.iScriptId < aSecond.iScriptId )
+             {
+             orderValue = -1;
+             }
+         }
+     else if ( aFirst.iSender < aSecond.iSender )
+         {
+         orderValue = -1;
+         }
+
+     return orderValue;
+     }
+
+
+// CONSTRUCTION
+MT_CFClient* MT_CFClient::NewL( )
+    {
+    MT_CFClient* self = MT_CFClient::NewLC ( );
+    CleanupStack::Pop ( );
+
+    return self;
+    }
+
+MT_CFClient* MT_CFClient::NewLC( )
+    {
+    MT_CFClient* self = new( ELeave ) MT_CFClient();
+    CleanupStack::PushL ( self );
+
+    self->ConstructL ( );
+
+    return self;
+    }
+
+// Destructor (virtual by CBase)
+MT_CFClient::~MT_CFClient( )
+    {
+    Teardown();
+
+    // Enable screen saver
+    CFEnvUtils::EnableScreenSaver( ETrue );
+    }
+
+// Default constructor
+MT_CFClient::MT_CFClient( )
+    {
+    }
+
+// Second phase construct
+void MT_CFClient::ConstructL( )
+    {
+    // The ConstructL from the base class CEUnitTestSuiteClass must be called.
+    // It generates the test case table.
+    CEUnitTestSuiteClass::ConstructL ( );
+
+    // Disable screen saver
+    CFEnvUtils::EnableScreenSaver( EFalse );
+    }
+
+//  METHODS
+
+void MT_CFClient::ContextIndicationL(const CCFContextIndication& aChangedContext )
+    {
+    if ( iCheckContextData )
+        {
+        CheckContextDataIndicationL ( aChangedContext );
+        }
+    else
+        {
+        CheckContextIndicationL ( aChangedContext );
+        }
+
+    // Common for both indications
+    if ( iWait && !iCheckA && !iCheckB )
+        {
+        if ( iWait->IsStarted ( ) )
+            {
+            iWait->AsyncStop ( );
+            }
+        }
+    if ( iDeleteClient )
+        {
+        delete iClient;
+        iClient = NULL;
+        iDeleteClient = EFalse;
+        }
+    }
+
+void MT_CFClient::ActionIndicationL(const CCFActionIndication& aActionToExecute )
+    {
+    TPtrC actionId( aActionToExecute.Identifier() );
+    if ( iLastActionId )
+        {
+        delete iLastActionId;
+        iLastActionId = NULL;
+        }
+    iLastActionId = actionId.AllocL();
+
+    if ( iCheckA )
+        {
+        const RKeyValueArray& params = aActionToExecute.Parameters ( );
+        EUNIT_ASSERT_DESC( actionId == KActionA,
+            "Incorrect action identifier!" );
+        EUNIT_ASSERT_DESC( params.Count() == 1,
+            "Incorrect action param count!" )
+        EUNIT_ASSERT_DESC( params[0]->Key() == KActionAParamA1,
+            "Incorrect action param count!" )
+        EUNIT_ASSERT_DESC( params[0]->Value() == KActionAValueA1,
+            "Incorrect action param count!" )
+        if ( iCountActionAIndications )
+            {
+            --iExpectedActionAIndicationCount;
+            if ( !iExpectedActionAIndicationCount )
+                {
+                iCheckA = EFalse;
+                }
+            }
+        else
+            {
+            iCheckA = EFalse;
+            }
+        }
+    else if ( iCheckB )
+        {
+        const RKeyValueArray& params = aActionToExecute.Parameters ( );
+        EUNIT_ASSERT_DESC( actionId == KActionB,
+            "Incorrect action identifier!" );
+        EUNIT_ASSERT_DESC( params.Count() == 2,
+            "Incorrect action param count!" )
+        EUNIT_ASSERT_DESC( params[0]->Key() == KActionBParamB1,
+            "Incorrect action param count!" )
+        EUNIT_ASSERT_DESC( params[0]->Value() == KActionBValueB1,
+            "Incorrect action param count!" )
+        EUNIT_ASSERT_DESC( params[1]->Key() == KActionBParamB2,
+            "Incorrect action param count!" )
+        EUNIT_ASSERT_DESC( params[1]->Value() == KActionBValueB2,
+            "Incorrect action param count!" )
+        iCheckB = EFalse;
+        }
+    else if ( iCheckRegisterScriptAction )
+        {
+        const RKeyValueArray& params = aActionToExecute.Parameters ( );
+        EUNIT_ASSERT_DESC( actionId == _L("RegisterScriptAction"),
+            "Incorrect action identifier!" );
+        EUNIT_ASSERT_DESC( params.Count() == 1,
+            "Incorrect action param count!" )
+        EUNIT_ASSERT_DESC( params[0]->Key() == _L("ParamA1"),
+            "Incorrect action param count!" )
+        EUNIT_ASSERT_DESC( params[0]->Value() == _L("ValueA1"),
+            "Incorrect action param count!" )
+        iCheckRegisterScriptAction = EFalse;
+        }
+    else if ( iCheckCustomAction )
+        {
+        EUNIT_ASSERT_DESC( iCustomActionId == actionId,
+            "Incorrect action id" );
+        const RKeyValueArray
+            & params = aActionToExecute.Parameters ( );
+        EUNIT_ASSERT_DESC( params.Count() == iCustomActionParams.Count(),
+            "Invalid amount of action parameters" );
+        for (TInt i = 0; i < iCustomActionParams.Count ( ); i++ )
+            {
+            CCFKeyValuePair* pair1 = iCustomActionParams[i];
+            CCFKeyValuePair* pair2 = params[i];
+            EUNIT_ASSERT_DESC( pair2->Key() == pair1->Key(),
+                "Invalid key" );
+            EUNIT_ASSERT_DESC( pair2->Value() == pair1->Value(),
+                "Invalid value" );
+            }
+        iCheckCustomAction = EFalse;
+        iCustomActionId.Zero ( );
+        iCustomActionParams.ResetAndDestroy ( );
+        }
+
+    if ( iWait && !iCheckA && !iCheckB && !iCheckRegisterScriptAction &&!iCheckCustomAction )
+        {
+        if ( iWait->IsStarted ( ) )
+            {
+            iWait->AsyncStop ( );
+            }
+        }
+
+    if ( iDeleteClient )
+        {
+        delete iClient;
+        iClient = NULL;
+        iDeleteClient = EFalse;
+        }
+    }
+
+void MT_CFClient::HandleContextFrameworkError( TCFError aError,
+    const TDesC& aSource, const TDesC& aType )
+    {
+    if ( iCheckB )
+        {
+        EUNIT_ASSERT_DESC( aError == MCFListener::ESecurityCheckErrorForContextSubscription,
+            "Incorrect HandleContextFrameworkError error code!" );
+        EUNIT_ASSERT_DESC( aSource == iContextB->Source(),
+            "Incorrect HandleContextFrameworkError context source!" );
+        EUNIT_ASSERT_DESC( aType == iContextB->Type(),
+            "Incorrect HandleContextFrameworkError context type!" );
+        iCheckB = EFalse;
+        }
+    else if ( iCheckC )
+        {
+        EUNIT_ASSERT_DESC( aError == MCFListener::ESecurityCheckErrorForContextSubscription,
+            "Incorrect HandleContextFrameworkError error code!" );
+        EUNIT_ASSERT_DESC( aSource == iContextC->Source(),
+            "Incorrect HandleContextFrameworkError context source!" );
+        EUNIT_ASSERT_DESC( aType == iContextC->Type(),
+            "Incorrect HandleContextFrameworkError context type!" );
+        iCheckC = EFalse;
+        }
+    else if ( iCheckRomScriptContextAutoDefine )
+        {
+        EUNIT_ASSERT_DESC( aError == MCFListener::ESecurityCheckErrorForContextSubscription,
+            "Incorrect HandleContextFrameworkError error code!" );
+        EUNIT_ASSERT_DESC( aSource == KRomScriptAutoDefineContextSource,
+            "Incorrect HandleContextFrameworkError context source!" );
+        EUNIT_ASSERT_DESC( aType == KRomScriptAutoDefineContextType,
+            "Incorrect HandleContextFrameworkError context type!" );
+        iCheckRomScriptContextAutoDefine = EFalse;
+        if ( iTestDelay )
+            {
+            iTestDelay->Stop();
+            }
+        }
+
+    if ( iWait && !iCheckA && !iCheckB && !iCheckC && !iCheckRomScriptContextAutoDefine )
+        {
+        if ( iWait->IsStarted ( ) )
+            {
+            iWait->AsyncStop ( );
+            }
+        }
+    }
+
+TAny* MT_CFClient::Extension( const TUid& aExtensionUid ) const
+    {
+    switch ( aExtensionUid.iUid )
+        {
+        case KCFContextSourceInterfaceUidValue:
+            {
+            if ( iReturnContextSourceInterface )
+                {
+                MCFContextSource* csinterface = (MCFContextSource*) this;
+                return (TAny*) csinterface;
+                }
+            break;
+            }
+        default:
+            {
+            return NULL;
+            }
+        }
+    return NULL;
+    }
+
+// from MCFContextSource
+void MT_CFClient::Subscribers( const TDesC& aContextSource,
+    const TDesC& aContextType )
+    {
+    if ( iCheckSubscribersNoSubscribersCalled )
+        {
+        iCheckSubscribersNoSubscribersCalled = EFalse;
+        iSubscribersCalled = ETrue;
+        EUNIT_ASSERT_DESC(
+                iExpectedSubscribersSource.Compare( aContextSource ) == 0,
+                "No expected source");
+        EUNIT_ASSERT_DESC(
+                iExpectedSubscribersType.Compare( aContextType ) == 0,
+                "No expected type");
+
+        if ( iWait )
+            {
+            if ( iWait->IsStarted ( ) )
+                {
+                iWait->AsyncStop ( );
+                }
+            }
+        }
+    }
+
+// from MCFContextSource
+void MT_CFClient::NoSubscribers( const TDesC& aContextSource,
+    const TDesC& aContextType )
+    {
+    if ( iCheckSubscribersNoSubscribersCalled )
+        {
+        iCheckSubscribersNoSubscribersCalled = EFalse;
+        iNoSubscribersCalled = ETrue;
+        EUNIT_ASSERT_DESC(
+                iExpectedSubscribersSource.Compare( aContextSource ) == 0,
+                "No expected source");
+        EUNIT_ASSERT_DESC(
+                iExpectedSubscribersType.Compare( aContextType ) == 0,
+                "No expected type");
+
+        if ( iWait )
+            {
+            if ( iWait->IsStarted ( ) )
+                {
+                iWait->AsyncStop ( );
+                }
+            }
+        }
+    }
+
+// from MCFContextSource
+void MT_CFClient::HandleCommand( const CCFContextSourceCommand& aCommand )
+    {
+    TPtrC id( aCommand.Name() );
+    EUNIT_ASSERT_DESC( id.CompareF( KSourceCommandId ) == 0,
+            "No expected source command id" );
+
+    // Parse context source command
+    const RKeyValueArray& attributes = aCommand.Attributes();
+    EUNIT_ASSERT_DESC( attributes.Count() == 1, "No expected attribute count" );
+
+    TUid sourceUid = aCommand.SourceUid();
+    RThread thread;
+    EUNIT_ASSERT_DESC( sourceUid == thread.SecureId(), "No expected uid" );
+    thread.Close();
+
+    const RSourceCommandParameterArray& params = aCommand.Parameters();
+    EUNIT_ASSERT_DESC( params.Count() >= 1, "No expected parameter count" );
+
+    TPtrC paramName( params[ 0 ]->Name() );
+    EUNIT_ASSERT_DESC( paramName.CompareF( KSourceCommandParamCmd ) == 0,
+            "No expected param name" );
+
+    const RKeyValueArray& paramAttributes = params[ 0 ]->Attributes();
+    EUNIT_ASSERT_DESC( paramAttributes.Count() == 1, "No expected parameter attribute count" );
+
+    CCFKeyValuePair* keyValuePair = paramAttributes[ 0 ];
+    EUNIT_ASSERT_DESC( keyValuePair->Key().CompareF(
+            KSourceCommandAttributeType ) == 0,
+            "Type attribute expected" );
+
+    TLinearOrder< TCFSourceCommandSenderId > cmdSenderOrder(
+            SourceCommandSenderIdOrder );
+    TCFSourceCommandSenderId sender = aCommand.Sender();
+    TInt pos = iActiveRequests.FindInOrder( sender, cmdSenderOrder );
+
+    TPtrC cmdType( keyValuePair->Value() );
+    if ( cmdType.CompareF( KSourceCommandAttributeValueActivate ) == 0 )
+        {
+        if ( pos == KErrNotFound )
+            {
+            iActiveRequests.InsertInOrder( sender, cmdSenderOrder );
+            }
+        CheckActivateSourceCommandParams( params );
+        }
+    else if ( cmdType.CompareF( KSourceCommandAttributeValueDeactivate ) == 0 )
+        {
+        if ( pos != KErrNotFound )
+            {
+            iActiveRequests.Remove( pos );
+            }
+        CheckDeactivateSourceCommandParams( params );
+        }
+    else
+        {
+        EUNIT_ASSERT_DESC( EFalse, "WRONG type attribute value" );
+        }
+
+    iHandleCommandCalled = ETrue;
+
+    if ( iWait && iWait->IsStarted() )
+        {
+        iWait->AsyncStop ( );
+        }
+    }
+
+void MT_CFClient::CheckActivateSourceCommandParams(
+    const RSourceCommandParameterArray& aParams )
+    {
+    EUNIT_ASSERT_DESC( aParams.Count() == 2, "No expected param count" );
+
+    // Check 1. param
+    CCFContextSourceCommandParameter* param = aParams[ 0 ];
+    TPtrC paramName( param->Name() );
+    EUNIT_ASSERT_DESC( paramName.CompareF( KSourceCommandParamCmd ) == 0,
+            "No expected param name" );
+
+    // Check 1. param attributes
+    const RKeyValueArray& attributes = param->Attributes();
+    EUNIT_ASSERT_DESC( attributes.Count() == 1, "No expected attribute count" );
+    CCFKeyValuePair* keyValuePair = attributes[ 0 ];
+    EUNIT_ASSERT_DESC( keyValuePair->Key().CompareF(
+            KSourceCommandAttributeType ) == 0,
+            "Type attribute expected" );
+    EUNIT_ASSERT_DESC( keyValuePair->Value().CompareF(
+            KSourceCommandAttributeValueActivate ) == 0,
+            "No expected type attribute value" );
+
+    // Check 1. param nested params
+    const RSourceCommandParameterArray& nestedParams = param->Parameters();
+    EUNIT_ASSERT_DESC( nestedParams.Count() == 2, "No expected nested parameter count" );
+
+    // Check 1. param 1. nested params attributes
+    CCFContextSourceCommandParameter* nestedParam = nestedParams[ 0 ];
+    EUNIT_ASSERT_DESC( nestedParam->Name().CompareF(
+            KSourceCommandParamCmdParam ) == 0,
+            "Parameter cmdParam expected" );
+    const RKeyValueArray& nestedParamAttributes = nestedParam->Attributes();
+    EUNIT_ASSERT_DESC( nestedParamAttributes.Count() == 1,
+            "No expected nested parameter attribute count" );
+    keyValuePair = nestedParamAttributes[ 0 ];
+    EUNIT_ASSERT_DESC( keyValuePair->Key().CompareF(
+            KSourceCommandAttributeMode ) == 0,
+            "Mode attribute expected" );
+    EUNIT_ASSERT_DESC( keyValuePair->Value().CompareF(
+            KSourceCommandAttributeValueClean ) == 0,
+            "No expected mode attribute value" );
+
+    // Check 1. param 1. nested params parameters
+    const RSourceCommandParameterArray& nested2Params = nestedParam->Parameters();
+    EUNIT_ASSERT_DESC( nested2Params.Count() == 1, "No expected nested parameter count" );
+
+    // Check 1. param 1. nested params parameters attributes
+    nestedParam = nested2Params[ 0 ];
+    EUNIT_ASSERT_DESC( nestedParam->Name().CompareF(
+            KSourceCommandParamModifiers ) == 0,
+            "Modifiers param expected" );
+    const RKeyValueArray& nested2ParamAttributes = nestedParam->Attributes();
+    EUNIT_ASSERT_DESC( nested2ParamAttributes.Count() == 1,
+            "No expected nested parameter attribute count" );
+    keyValuePair = nested2ParamAttributes[ 0 ];
+    EUNIT_ASSERT_DESC( keyValuePair->Key().CompareF(
+            KSourceCommandAttributeValue ) == 0,
+            "Value attribute expected" );
+    EUNIT_ASSERT_DESC( keyValuePair->Value().CompareF(
+            KSourceCommandAttributeValueReally ) == 0,
+            "No expected value attribute value" );
+
+    const RSourceCommandParameterArray& nested3Params = nestedParam->Parameters();
+    EUNIT_ASSERT_DESC( nested3Params.Count() == 0, "No expected nested parameter count" );
+
+    // Check 1. param 2. nested params attributes
+    nestedParam = nestedParams[ 1 ];
+    EUNIT_ASSERT_DESC( nestedParam->Name().CompareF(
+            KSourceCommandParamCmdParam ) == 0,
+            "Parameter cmdParam expected" );
+    const RKeyValueArray& nested3ParamAttributes = nestedParam->Attributes();
+    EUNIT_ASSERT_DESC( nested3ParamAttributes.Count() == 1,
+            "No expected nested parameter attribute count" );
+    keyValuePair = nested3ParamAttributes[ 0 ];
+    EUNIT_ASSERT_DESC( keyValuePair->Key().CompareF(
+            KSourceCommandAttributeOverride ) == 0,
+            "Override attribute expected" );
+    EUNIT_ASSERT_DESC( keyValuePair->Value().CompareF(
+            KSourceCommandAttributeValueYes ) == 0,
+            "No expected override attribute value" );
+
+    const RSourceCommandParameterArray& nested4Params = nestedParam->Parameters();
+    EUNIT_ASSERT_DESC( nested4Params.Count() == 0, "No expected nested parameter count" );
+
+    // Check 2. param
+    param = aParams[ 1 ];
+    paramName.Set( param->Name() );
+    EUNIT_ASSERT_DESC( paramName.CompareF( KSourceCommandParamCmdInfo ) == 0,
+            "No expected param name" );
+
+    // Check 2. param attributes
+    const RKeyValueArray& attributes2 = param->Attributes();
+    EUNIT_ASSERT_DESC( attributes2.Count() == 1, "No expected attribute count" );
+    keyValuePair = attributes2[ 0 ];
+    EUNIT_ASSERT_DESC( keyValuePair->Key().CompareF(
+            KSourceCommandAttributeType ) == 0,
+            "Type attribute expected" );
+    EUNIT_ASSERT_DESC( keyValuePair->Value().CompareF(
+            KSourceCommandAttributeValueActivate ) == 0,
+            "No expected type attribute value" );
+
+    // Check 2. param nested params
+    const RSourceCommandParameterArray& nestedParams2 = param->Parameters();
+    EUNIT_ASSERT_DESC( nestedParams2.Count() == 1, "No expected nested parameter count" );
+
+    // Check 2. param nested params attributes
+    nestedParam = nestedParams2[ 0 ];
+    EUNIT_ASSERT_DESC( nestedParam->Name().CompareF(
+            KSourceCommandParamCmdParam ) == 0,
+            "Parameter cmdParam expected" );
+    const RKeyValueArray& nestedParamAttributes2 = nestedParam->Attributes();
+    EUNIT_ASSERT_DESC( nestedParamAttributes2.Count() == 1,
+            "No expected nested parameter attribute count" );
+    keyValuePair = nestedParamAttributes2[ 0 ];
+    EUNIT_ASSERT_DESC( keyValuePair->Key().CompareF(
+            KSourceCommandAttributeText ) == 0,
+            "Text attribute expected" );
+    EUNIT_ASSERT_DESC( keyValuePair->Value().CompareF(
+            KSourceCommandAttributeValueText ) == 0,
+            "No expected text attribute value" );
+
+    // Check 2. param 1. nested params parameters
+    const RSourceCommandParameterArray& nested2Params2 = nestedParam->Parameters();
+    EUNIT_ASSERT_DESC( nested2Params2.Count() == 0, "No expected nested parameter count" );
+    }
+
+void MT_CFClient::CheckDeactivateSourceCommandParams(
+    const RSourceCommandParameterArray& aParams )
+    {
+    EUNIT_ASSERT_DESC( aParams.Count() == 1, "No expected param count" );
+
+    // Check param
+    CCFContextSourceCommandParameter* param = aParams[ 0 ];
+    TPtrC paramName( param->Name() );
+    EUNIT_ASSERT_DESC( paramName.CompareF( KSourceCommandParamCmd ) == 0,
+            "No expected param name" );
+
+    // Check param attributes
+    const RKeyValueArray& attributes = param->Attributes();
+    EUNIT_ASSERT_DESC( attributes.Count() == 1, "No expected attribute count" );
+    CCFKeyValuePair* keyValuePair = attributes[ 0 ];
+    EUNIT_ASSERT_DESC( keyValuePair->Key().CompareF(
+            KSourceCommandAttributeType ) == 0,
+            "Type attribute expected" );
+    EUNIT_ASSERT_DESC( keyValuePair->Value().CompareF(
+            KSourceCommandAttributeValueDeactivate ) == 0,
+            "No expected type attribute value" );
+
+    // Check param nested params
+    const RSourceCommandParameterArray& nestedParams = param->Parameters();
+    EUNIT_ASSERT_DESC( nestedParams.Count() == 1, "No expected nested parameter count" );
+
+    // Check param nested params attributes
+    CCFContextSourceCommandParameter* nestedParam = nestedParams[ 0 ];
+    EUNIT_ASSERT_DESC( nestedParam->Name().CompareF(
+            KSourceCommandParamCmdParam ) == 0,
+            "Parameter cmdParam expected" );
+    const RKeyValueArray& nestedParamAttributes = nestedParam->Attributes();
+    EUNIT_ASSERT_DESC( nestedParamAttributes.Count() == 1,
+            "No expected nested parameter attribute count" );
+    keyValuePair = nestedParamAttributes[ 0 ];
+    EUNIT_ASSERT_DESC( keyValuePair->Key().CompareF(
+            KSourceCommandAttributeMode ) == 0,
+            "Mode attribute expected" );
+    EUNIT_ASSERT_DESC( keyValuePair->Value().CompareF(
+            KSourceCommandAttributeValueFull ) == 0,
+            "No expected mode attribute value" );
+
+    // Check param nested params parameters
+    const RSourceCommandParameterArray& nested2Params = nestedParam->Parameters();
+    EUNIT_ASSERT_DESC( nested2Params.Count() == 1, "No expected nested parameter count" );
+
+    // Check param nested params parameters attributes
+    nestedParam = nested2Params[ 0 ];
+    EUNIT_ASSERT_DESC( nestedParam->Name().CompareF(
+            KSourceCommandParamModifiers ) == 0,
+            "Modifiers param expected" );
+    const RKeyValueArray& nested2ParamAttributes = nestedParam->Attributes();
+    EUNIT_ASSERT_DESC( nested2ParamAttributes.Count() == 1,
+            "No expected nested parameter attribute count" );
+    keyValuePair = nested2ParamAttributes[ 0 ];
+    EUNIT_ASSERT_DESC( keyValuePair->Key().CompareF(
+            KSourceCommandAttributeValue ) == 0,
+            "Value attribute expected" );
+    EUNIT_ASSERT_DESC( keyValuePair->Value().CompareF(
+            KSourceCommandAttributeValueNoException ) == 0,
+            "No expected value attribute value" );
+
+    const RSourceCommandParameterArray& nested3Params = nestedParam->Parameters();
+    EUNIT_ASSERT_DESC( nested3Params.Count() == 0, "No expected nested parameter count" );
+    }
+
+
+void MT_CFClient::SetupL( )
+    {
+    }
+
+void MT_CFClient::SetupClientL( )
+    {
+    User::LeaveIfError ( iFs.Connect ( ) );
+    iClient = CCFClient::NewL ( *this );
+    iAnotherClient = CCFClient::NewL ( *this );
+    iContextA = CCFContextObject::NewL ( );
+    iContextB = CCFContextObject::NewL ( );
+    iContextC = CCFContextObject::NewL ( );
+    iWait = new( ELeave ) CActiveSchedulerWait;
+    iContextDataA = CTestContextData::NewL ( _L("Key_A"), _L("Value_A") );
+    iContextDataB = CTestContextData::NewL ( _L("Key_B"), _L("Value_B") );
+    }
+
+void MT_CFClient::SetupNewClientL( )
+    {
+    iReturnContextSourceInterface = ETrue;
+    iTestDelay = CCFTestDelay::NewL ( );
+    SetupClientL ( );
+    }
+
+void MT_CFClient::SetupSourceSettingTestClientL( )
+    {
+    iTestDelay = CCFTestDelay::NewL ( );
+    SetupClientL ( );
+    }
+
+void MT_CFClient::Teardown( )
+    {
+    if ( iWait )
+        {
+        if ( iWait->IsStarted ( ) )
+            {
+            iWait->AsyncStop ( );
+            }
+        delete iWait;
+        iWait = NULL;
+        }
+
+    delete iClient;
+    iClient = NULL;
+
+    delete iAnotherClient;
+    iAnotherClient = NULL;
+
+    delete iContextA;
+    iContextA = NULL;
+
+    delete iContextB;
+    iContextB = NULL;
+
+    delete iContextC;
+    iContextC = NULL;
+    iFs.Close ( );
+
+    delete iContextDataA;
+    iContextDataA = NULL;
+
+    delete iContextDataB;
+    iContextDataB = NULL;
+
+    iReturnContextSourceInterface = EFalse;
+
+    iCustomActionParams.ResetAndDestroy();
+
+    delete iLastActionId;
+    iLastActionId = NULL;
+
+    iActiveRequests.Close();
+
+    if ( iTestDelay )
+        {
+        // Give some time for everything to be cleaned up.
+        iTestDelay->Start ( 100000 ); // 100 ms
+        }
+
+    delete iTestDelay;
+    iTestDelay = NULL;
+    }
+
+void MT_CFClient::TeardownAndScriptCleanup( )
+    {
+    iClient->DeleteScripts ( );
+    iClient->RestoreRomScript ( _L("test-scriptUpgradeRom") );
+    iClient->RestoreRomScript ( _L("test-scriptUpgradeRomClientMissingCapability") );
+    Teardown ( );
+    }
+
+void MT_CFClient::CheckContextIndicationL(
+    const CCFContextIndication& aChangedContext )
+    {
+    if ( iCheckA )
+        {
+        const CCFContextObject& co = aChangedContext.Context ( );
+        EUNIT_ASSERT_DESC( co.Source() == iContextA->Source(),
+            "Incorrect context source in context indication!" );
+        EUNIT_ASSERT_DESC( co.Type() == iContextA->Type(),
+            "Incorrect context type in context indication!" );
+        EUNIT_ASSERT_DESC( co.Value() == iContextA->Value(),
+            "Incorrect context value in context indication!" );
+        iCheckA = EFalse;
+        }
+    else if ( iCheckB )
+        {
+        const CCFContextObject& co = aChangedContext.Context ( );
+        EUNIT_ASSERT_DESC( co.Source() == iContextB->Source(),
+            "Incorrect context source in context indication!" );
+        EUNIT_ASSERT_DESC( co.Type() == iContextB->Type(),
+            "Incorrect context type in context indication!" );
+        EUNIT_ASSERT_DESC( co.Value() == iContextB->Value(),
+            "Incorrect context value in context indication!" );
+        iCheckB = EFalse;
+        }
+    else if ( iCheckPluginSubscribersCalled )
+        {
+        const CCFContextObject& co = aChangedContext.Context ( );
+        EUNIT_ASSERT_DESC( iExpectedSubscribersSource == co.Source(),
+            "No expected plugin subscriber source");
+        EUNIT_ASSERT_DESC( iExpectedSubscribersType == co.Type(),
+            "No expected plugin subscriber type");
+        EUNIT_ASSERT_DESC( iExpectedSubscribersValue == co.Value(),
+            "No expected plugin subscriber value");
+
+        iPluginSubscribersCalled = ETrue;
+        iCheckPluginSubscribersCalled = EFalse;
+
+        if ( iWait && iWait->IsStarted ( ) )
+            {
+            iWait->AsyncStop ( );
+            }
+        }
+    else if ( iCheckSourceCommandHandled )
+        {
+        const CCFContextObject& co = aChangedContext.Context ( );
+        EUNIT_ASSERT_DESC( iExpectedSubscribersSource == co.Source(),
+            "No expected source command signal context source");
+        EUNIT_ASSERT_DESC( iExpectedSubscribersType == co.Type(),
+            "No expected source command signal context type");
+        EUNIT_ASSERT_DESC( iExpectedSubscribersValue == co.Value(),
+            "No expected source command signal context value");
+
+        iSourceCommandHandled = ETrue;
+        iCheckSourceCommandHandled = EFalse;
+
+        if ( iWait && iWait->IsStarted ( ) )
+            {
+            iWait->AsyncStop ( );
+            }
+        }
+    else if ( iCheckRomScriptContextAutoDefineDetected )
+        {
+        const CCFContextObject& co = aChangedContext.Context ( );
+        EUNIT_ASSERT_DESC( iExpectedSubscribersSource == co.Source(),
+            "No expected source command signal context source");
+        EUNIT_ASSERT_DESC( iExpectedSubscribersType == co.Type(),
+            "No expected source command signal context type");
+        EUNIT_ASSERT_DESC( iExpectedSubscribersValue == co.Value(),
+            "No expected source command signal context value");
+
+        iCheckRomScriptContextAutoDefineDetected = EFalse;
+
+        if ( iWait && iWait->IsStarted ( ) )
+            {
+            iWait->AsyncStop ( );
+            }
+        }
+    }
+
+void MT_CFClient::CheckContextDataIndicationL(
+    const CCFContextIndication& aChangedContext )
+    {
+    if ( iCheckA )
+        {
+        // Check context
+        const CCFContextObject& co = aChangedContext.Context ( );
+        EUNIT_ASSERT_DESC( co.Source() == iContextA->Source(),
+            "Incorrect context source in context indication!" );
+        EUNIT_ASSERT_DESC( co.Type() == iContextA->Type(),
+            "Incorrect context type in context indication!" );
+        EUNIT_ASSERT_DESC( co.Value() == iContextA->Value(),
+            "Incorrect context value in context indication!" );
+
+        // Check data object
+        EUNIT_ASSERT_DESC( aChangedContext.Uid() == KTestContextDataUid,
+            "Incorrect context data UID!" );
+        if ( aChangedContext.Uid ( )== KTestContextDataUid )
+            {
+            CCFContextIndication
+                & indication =const_cast<CCFContextIndication&>( aChangedContext );
+            CTestContextData* contextData =CTestContextData::NewLC ( KNullDesC,
+                KNullDesC );
+            indication.CreateDataObjectL ( *contextData );
+            EUNIT_ASSERT_DESC( contextData->Key() == iContextDataA->Key(),
+                "Incorrect context data object comparison!" );
+            EUNIT_ASSERT_DESC( contextData->Value() == iContextDataA->Value(),
+                "Incorrect context data object comparison!" );
+            CleanupStack::PopAndDestroy ( contextData );
+            }
+        iCheckA = EFalse;
+        }
+    else if ( iCheckB )
+        {
+        // Check context
+        const CCFContextObject& co = aChangedContext.Context ( );
+        EUNIT_ASSERT_DESC( co.Source() == iContextB->Source(),
+            "Incorrect context source in context indication!" );
+        EUNIT_ASSERT_DESC( co.Type() == iContextB->Type(),
+            "Incorrect context type in context indication!" );
+        EUNIT_ASSERT_DESC( co.Value() == iContextB->Value(),
+            "Incorrect context value in context indication!" );
+
+        // Check data object
+        EUNIT_ASSERT_DESC( aChangedContext.Uid() == KTestContextDataUid,
+            "Incorrect context data UID!" );
+        if ( aChangedContext.Uid ( )== KTestContextDataUid )
+            {
+            CCFContextIndication
+                & indication =const_cast<CCFContextIndication&>( aChangedContext );
+            CTestContextData* contextData =CTestContextData::NewLC (
+                KNullDesC, KNullDesC );
+            indication.CreateDataObjectL ( *contextData );
+            EUNIT_ASSERT_DESC( contextData->Key() == iContextDataB->Key(),
+                "Incorrect context data object comparison!" );
+            EUNIT_ASSERT_DESC( contextData->Value() == iContextDataB->Value(),
+                "Incorrect context data object comparison!" );
+            CleanupStack::PopAndDestroy ( contextData );
+            }
+        iCheckB = EFalse;
+        }
+    }
+
+void MT_CFClient::ConfigureContextL( CCFContextObject& aContext )
+    {
+    Wait ( KConfigDelay );
+
+    TBuf<256> buf( KNullDesC );
+    TTime time;
+    time.HomeTime ( );
+
+    buf.Format ( KContextSourceFormat, time.Int64 ( ) );
+    aContext.SetSourceL ( buf );
+
+    buf.Format ( KContextTypeFormat, time.Int64 ( ) );
+    aContext.SetTypeL ( buf );
+
+    buf.Format ( KContextValueFormat, time.Int64 ( ) );
+    aContext.SetValueL ( buf );
+    }
+
+void MT_CFClient::UpdateContextValueL( CCFContextObject& aContext )
+    {
+    Wait ( KConfigDelay );
+
+    TBuf<256> buf( KNullDesC );
+    TTime time;
+    time.HomeTime ( );
+
+    buf.Format ( KContextValueFormat, time.Int64 ( ) );
+    aContext.SetValueL ( buf );
+    }
+
+void MT_CFClient::UpdateContextTypeL( CCFContextObject& aContext )
+    {
+    Wait ( KConfigDelay );
+
+    TBuf<256> buf( KNullDesC );
+    TTime time;
+    time.HomeTime ( );
+
+    buf.Format ( KContextTypeFormat, time.Int64 ( ) );
+    aContext.SetTypeL ( buf );
+    }
+
+HBufC* MT_CFClient::ConfigureActionIdLC( )
+    {
+    Wait ( KConfigDelay );
+
+    TTime time;
+    time.HomeTime ( );
+    HBufC* actionId = HBufC::NewLC ( 256 );
+    TPtr actionIdPtr = actionId->Des ( );
+    actionIdPtr.Format ( KActionIdFormat, time.Int64 ( ) );
+
+    return actionId;
+    }
+
+HBufC8* MT_CFClient::LoadScriptFromFile( const TDesC& aFilePath )
+    {
+    HBufC8* script=  NULL;
+    RFile file;
+    TFileName fileName;
+    fileName.Copy (_L("z:\\data\\cftestdata\\testscripts\\") );
+    fileName.Append (aFilePath );
+    TInt err = file.Open ( iFs, fileName, EFileRead );
+    if ( err == KErrNone )
+        {
+        TInt size = 0;
+        err = file.Size ( size );
+        if ( err == KErrNone )
+            {
+            script = HBufC8::New ( size );
+            if ( script )
+                {
+                TPtr8 scriptPtr = script->Des ( );
+                err = file.Read ( scriptPtr );
+                if ( err == KErrNone )
+                    {
+                    // Strip all unnecassary data from script
+                    TInt pos = scriptPtr.FindF ( KScriptStartTag );
+                    if ( pos != KErrNotFound )
+                        {
+                        scriptPtr.Copy ( scriptPtr.MidTPtr ( pos ) );
+                        }
+                    else
+                        {
+                        // Incorrect script
+                        delete script;
+                        script = NULL;
+                        }
+                    }
+                else
+                    {
+                    delete script;
+                    script = NULL;
+                    }
+                }
+            }
+        }
+    else
+        {
+        EUNIT_PRINT( _L("MT_CFClient::LoadScriptFromFile - Loading file [%S] failed with code = %d"),
+                &fileName, err );
+        }
+
+    // Cleanup
+    file.Close ( );
+    return script;
+    }
+
+void MT_CFClient::ResetCustomAction()
+    {
+    iCheckCustomAction = EFalse;
+    iCustomActionId.Zero();
+    iCustomActionParams.ResetAndDestroy();
+    }
+
+TBool MT_CFClient::LastActionIdEquals( const TDesC& aId )
+    {
+    if ( iLastActionId )
+        {
+        return ( *iLastActionId == aId );
+        }
+    else
+        {
+        return EFalse;
+        }
+    }
+
+void MT_CFClient::DeleteLastActionId()
+    {
+    delete iLastActionId;
+    iLastActionId = NULL;
+    }
+
+//-----------------------------------------------------------------------------
+// CFClient module tests
+//-----------------------------------------------------------------------------
+//
+void MT_CFClient::MT_CCFClient_NewLL( )
+    {
+    CCFClient* client = CCFClient::NewL ( *this );
+    CleanupStack::PushL ( client );
+
+    EUNIT_ASSERT_DESC( client, "CCFClient class instance not created!" );
+
+    CleanupStack::PopAndDestroy ( client );
+    }
+
+void MT_CFClient::MT_CCFClient_NewLCL( )
+    {
+    CCFClient* client = CCFClient::NewLC ( *this );
+
+    EUNIT_ASSERT_DESC( client, "CCFClient class instance not created!" );
+
+    CleanupStack::PopAndDestroy ( client );
+    }
+
+void MT_CFClient::MT_CCFClient_DefineContextL( )
+    {
+    CCFContextObject* context = CCFContextObject::NewLC ( );
+    TInt err = KErrNone;
+
+    // x. Define context from two different clients when context onwer is set
+    //--------------------------------------------------------------------------
+    iReturnContextSourceInterface = ETrue;
+    CCFClient* client = CCFClient::NewLC ( *this );
+    CCFClient* client2 = CCFClient::NewLC ( *this );
+    ConfigureContextL ( *context );
+    err = client->DefineContext ( context->Source ( ), context->Type ( ),
+        KPassSec );
+    EUNIT_ASSERT_DESC( err == KErrNone, "Incorrect DefineContext return value! " );
+    err = client->DefineContext ( context->Source ( ), context->Type ( ),
+        KFailSec );
+    EUNIT_ASSERT_DESC( err == KErrNone, "Incorrect DefineContext return value! " );
+    err = client2->DefineContext ( context->Source ( ), context->Type ( ),
+        KFailSec );
+    EUNIT_ASSERT_DESC( err == KErrAlreadyExists, "Incorrect DefineContext return value! " );
+    CleanupStack::PopAndDestroy ( client2 );
+    CleanupStack::PopAndDestroy ( client );
+
+    // x. Define context, delete client and redefine context
+    //--------------------------------------------------------------------------
+    iReturnContextSourceInterface = ETrue;
+    ConfigureContextL ( *context );
+    client = CCFClient::NewLC ( *this );
+    err = client->DefineContext ( context->Source ( ), context->Type ( ),
+        KPassSec );
+    EUNIT_ASSERT_DESC( err == KErrNone, "Incorrect DefineContext return value! " );
+    CleanupStack::PopAndDestroy ( client );
+
+    client = CCFClient::NewLC ( *this );
+    err = client->DefineContext ( context->Source ( ), context->Type ( ),
+        KFailSec );
+    EUNIT_ASSERT_DESC( err == KErrNone, "Incorrect DefineContext return value! " );
+    err = client->DefineContext ( context->Source ( ), KNullDesC, KFailSec );
+    CleanupStack::PopAndDestroy ( client );
+
+    // x. Define context, delete client and redefine context
+    //--------------------------------------------------------------------------
+    client = CCFClient::NewLC ( *this );
+    err = client->DefineContext ( context->Source(), KNullDesC, KFailSec );
+    EUNIT_ASSERT_DESC( err == KErrArgument, "Incorrect DefineContext return value! " );
+    err = client->DefineContext ( KNullDesC, context->Type ( ), KFailSec );
+    EUNIT_ASSERT_DESC( err == KErrArgument, "Incorrect DefineContext return value! " );
+    CleanupStack::PopAndDestroy ( client );
+
+    // Clean up
+    CleanupStack::PopAndDestroy ( context );
+    }
+
+void MT_CFClient::MT_CCFClient_SubscribersNosubscribersL( )
+    {
+    TInt err = KErrNone;
+
+    // Define context
+    ConfigureContextL ( *iContextA );
+    err = iClient->DefineContext ( iContextA->Source ( ), iContextA->Type ( ),
+        KPassSec, KPassSec );
+    EUNIT_ASSERT_DESC( err == KErrNone, "Incorrect DefineContext return value! " );
+
+    // Delete & re-create client causing de-registering of publisher.
+    delete iClient;
+    iClient = NULL;
+    iClient = CCFClient::NewL ( *this );
+
+    // in this case redefine should work (same client)
+    err = iClient->DefineContext ( iContextA->Source ( ), iContextA->Type ( ),
+        KPassSec, KPassSec );
+    EUNIT_ASSERT_DESC( err == KErrNone, "Incorrect DefineContext return value! " );
+
+    // Test if we get Subscribers() callback if we add subscription
+    iCheckSubscribersNoSubscribersCalled = ETrue;
+    iSubscribersCalled = EFalse;
+    iExpectedSubscribersSource.Copy ( iContextA->Source ( ) );
+    iExpectedSubscribersType.Copy ( iContextA->Type ( ) );
+
+    CCFContextSubscription* subscription=  NULL;
+    // Define a context and subscribe it
+    subscription = CCFContextSubscription::NewLC ( );
+    subscription->SetContextSourceL ( iContextA->Source ( ) );
+    subscription->SetContextTypeL ( iContextA->Type ( ) );
+    err = iClient->SubscribeContext ( *subscription );
+    EUNIT_ASSERT_DESC( err == KErrNone, "Incorrect SubscribeContext return value!" );
+    CleanupStack::PopAndDestroy ( subscription );
+
+    iWait->Start ( );
+    EUNIT_ASSERT_DESC( iSubscribersCalled, "MCFContextSource::Subscribers not called" );
+    EUNIT_ASSERT_DESC( !iCheckSubscribersNoSubscribersCalled, "Subscribers not called" );
+
+    // Test if we get NoSubsscribers() callback if we remove subscription
+    iCheckSubscribersNoSubscribersCalled = ETrue;
+    iSubscribersCalled = EFalse;
+    iNoSubscribersCalled = EFalse;
+    iExpectedSubscribersSource.Copy ( iContextA->Source ( ) );
+    iExpectedSubscribersType.Copy ( iContextA->Type ( ) );
+
+    // Define a context and subscribe it
+    subscription = CCFContextSubscription::NewLC ( );
+    subscription->SetContextSourceL ( iContextA->Source ( ) );
+    subscription->SetContextTypeL ( iContextA->Type ( ) );
+    err = iClient->UnsubscribeContext ( *subscription );
+    EUNIT_ASSERT_DESC( err == KErrNone, "Incorrect SubscribeContext return value!" );
+    CleanupStack::PopAndDestroy ( subscription );
+
+    iWait->Start();
+    EUNIT_ASSERT_DESC( iNoSubscribersCalled, "MCFContextSource::NoSubscribers not called" );
+    EUNIT_ASSERT_DESC( !iCheckSubscribersNoSubscribersCalled, "Subscribers not called" );
+    }
+
+void MT_CFClient::MT_CCFClient_SubscribersNosubscribersPluginL( )
+    {
+    TInt err = KErrNone;
+
+    // Subscribe to value context signalling plugin "reactions".
+    // below                                        // CLEANUP<< valueSub
+    CCFContextSubscription* valueSub = CCFContextSubscription::NewLC ( );
+    valueSub->SetContextSourceL ( KTestContextSource );
+    valueSub->SetContextTypeL ( KTestContextValueType );
+    err = iClient->SubscribeContext ( *valueSub );
+    EUNIT_ASSERT_DESC( err == KErrNone, "Incorrect SubscribeContext return value!" );
+
+    // Test if plugin gets Subscribers() callback if we add subscription
+    iExpectedSubscribersSource.Copy ( KTestContextSource );
+    iExpectedSubscribersType.Copy ( KTestContextValueType );
+    iExpectedSubscribersValue.Copy ( KTestContextValueSubsOk );
+
+    // 1.Subscription
+    iCheckPluginSubscribersCalled = ETrue;
+    iPluginSubscribersCalled = EFalse;
+    // below                                        // CLEANUP<< pluginSub1
+    CCFContextSubscription* pluginSub1 = CCFContextSubscription::NewLC ( );
+    pluginSub1->SetContextSourceL ( KTestContextSource );
+    pluginSub1->SetContextTypeL ( KTestContextType );
+    err = iClient->SubscribeContext ( *pluginSub1 );
+    EUNIT_ASSERT_DESC( err == KErrNone, "Incorrect SubscribeContext return value!" );
+
+    // Wait for correct context as answer.
+    iTestDelay->Start ( 250000 ); // 250 ms
+    EUNIT_ASSERT_DESC( iPluginSubscribersCalled, "SubscribeContext was not detected by plugin" );
+
+    // 2.Subscription via iAnotherClient
+    iCheckPluginSubscribersCalled = ETrue;
+    iPluginSubscribersCalled = EFalse;
+    // below                                        // CLEANUP<< pluginSub2
+    CCFContextSubscription* pluginSub2 = CCFContextSubscription::NewLC ( );
+    pluginSub2->SetContextSourceL ( KTestContextSource );
+    pluginSub2->SetContextTypeL ( KTestContextType );
+    err = iAnotherClient->SubscribeContext ( *pluginSub2 );
+    EUNIT_ASSERT_DESC( err == KErrNone, "Incorrect SubscribeContext return value!" );
+
+    // Wait and no answer expected.
+    iTestDelay->Start ( 500000 ); // 0.5 s
+    EUNIT_ASSERT_DESC( iCheckPluginSubscribersCalled, "SubscribeContext was detected by plugin" );
+    EUNIT_ASSERT_DESC( !iPluginSubscribersCalled, "SubscribeContext was detected by plugin" );
+
+    // Unsubscribe 2.Subscription via iAnotherClient
+    iCheckPluginSubscribersCalled = ETrue;
+    iPluginSubscribersCalled = EFalse;
+    err = iAnotherClient->UnsubscribeContext ( *pluginSub2 );
+    EUNIT_ASSERT_DESC( err == KErrNone, "Incorrect UnsubscribeContext return value!" );
+
+    // Wait and no answer expected.
+    iTestDelay->Start ( 250000 ); // 250 ms
+    EUNIT_ASSERT_DESC( iCheckPluginSubscribersCalled, "UnsubscribeContext was detected by plugin" );
+    EUNIT_ASSERT_DESC( !iPluginSubscribersCalled, "UnsubscribeContext was detected by plugin" );
+
+    // Test if plugin gets NoSubscribers() callback if we remove last subscription
+    iExpectedSubscribersSource.Copy ( KTestContextSource );
+    iExpectedSubscribersType.Copy ( KTestContextValueType );
+    iExpectedSubscribersValue.Copy ( KTestContextValueNosubsOk );
+
+    // Unsubscribe 1.Subscription
+    iCheckPluginSubscribersCalled = ETrue;
+    iPluginSubscribersCalled = EFalse;
+    err = iClient->UnsubscribeContext ( *pluginSub1 );
+    EUNIT_ASSERT_DESC( err == KErrNone, "Incorrect UnsubscribeContext return value!" );
+
+    // Wait for correct context as answer.
+    iTestDelay->Start ( 500000 ); // 0.5 s
+    EUNIT_ASSERT_DESC( iPluginSubscribersCalled, "UnsubscribeContext was not detected by plugin" );
+
+    err = iClient->UnsubscribeContext ( *valueSub );
+    EUNIT_ASSERT_DESC( err == KErrNone, "Incorrect UnsubscribeContext return value!" );
+
+    CleanupStack::PopAndDestroy ( pluginSub2 ); //CLEANUP>> pluginSub2
+    CleanupStack::PopAndDestroy ( pluginSub1 ); //CLEANUP>> pluginSub1
+    CleanupStack::PopAndDestroy ( valueSub ); //CLEANUP>> valueSub
+    }
+
+void MT_CFClient::MT_CCFClient_SubscribersNosubscribersPlugin2L( )
+    {
+    TInt err = KErrNone;
+
+    // Subscribe to value context signalling plugin "reactions".
+    // below                                        // CLEANUP<< valueSub
+    CCFContextSubscription* valueSub = CCFContextSubscription::NewLC ( );
+    valueSub->SetContextSourceL ( KTestContextSource );
+    valueSub->SetContextTypeL ( KTestContextValueType );
+    err = iClient->SubscribeContext ( *valueSub );
+    EUNIT_ASSERT_DESC( err == KErrNone, "Incorrect SubscribeContext return value!" );
+
+    // Test if plugin gets Subscribers() callback if we add subscription
+    iExpectedSubscribersSource.Copy ( KTestContextSource );
+    iExpectedSubscribersType.Copy ( KTestContextValueType );
+    iExpectedSubscribersValue.Copy ( KTestContextValueSubsOk );
+
+    // 1.Subscription
+    iCheckPluginSubscribersCalled = ETrue;
+    iPluginSubscribersCalled = EFalse;
+    // below                                        // CLEANUP<< pluginSub1
+    CCFContextSubscription* pluginSub1 = CCFContextSubscription::NewLC ( );
+    pluginSub1->SetContextSourceL ( KTestContextSource );
+    pluginSub1->SetContextTypeL ( KTestContextType );
+    err = iClient->SubscribeContext ( *pluginSub1 );
+    EUNIT_ASSERT_DESC( err == KErrNone, "Incorrect SubscribeContext return value!" );
+
+    // Wait for correct context as answer.
+    iTestDelay->Start ( 250000 ); // 250 ms
+    EUNIT_ASSERT_DESC( !iCheckPluginSubscribersCalled, "SubscribeContext was not detected by plugin" );
+    EUNIT_ASSERT_DESC( iPluginSubscribersCalled, "SubscribeContext was not detected by plugin" );
+
+    // 2.Subscription
+    iCheckPluginSubscribersCalled = ETrue;
+    iPluginSubscribersCalled = EFalse;
+    // below                                        // CLEANUP<< pluginSub2
+    CCFContextSubscription* pluginSub2 = CCFContextSubscription::NewLC ( );
+    pluginSub2->SetContextSourceL ( KTestContextSource );
+    pluginSub2->SetContextTypeL ( KTestContextType2 );
+    err = iAnotherClient->SubscribeContext ( *pluginSub2 );
+    EUNIT_ASSERT_DESC( err == KErrNone, "Incorrect SubscribeContext return value!" );
+
+    // Wait and no answer expected.
+    iTestDelay->Start ( 500000 ); // 0.5 s
+    EUNIT_ASSERT_DESC( !iCheckPluginSubscribersCalled, "SubscribeContext was not detected by plugin" );
+    EUNIT_ASSERT_DESC( iPluginSubscribersCalled, "SubscribeContext was not detected by plugin" );
+
+    // 3.Subscription dummy
+    // below                                        // CLEANUP<< dummySub
+    CCFContextSubscription* dummySub = CCFContextSubscription::NewLC();
+    dummySub->SetContextSourceL( _L( "jusTaDummySubSource" ) );
+    dummySub->SetContextTypeL( _L( "jusTaDummySubType" ) );
+    err = iClient->SubscribeContext( *dummySub );
+    EUNIT_ASSERT_DESC( err == KErrNone, "Incorrect SubscribeContext return value!" );
+
+    // Test if plugin gets NoSubscribers() callback if we remove last subscription
+    iExpectedSubscribersSource.Copy ( KTestContextSource );
+    iExpectedSubscribersType.Copy ( KTestContextValueType );
+    iExpectedSubscribersValue.Copy ( KTestContextValueNosubsOk );
+
+    // Unsubscribe 1.Subscription
+    iCheckPluginSubscribersCalled = ETrue;
+    iPluginSubscribersCalled = EFalse;
+    err = iClient->UnsubscribeContext ( *pluginSub1 );
+    EUNIT_ASSERT_DESC( err == KErrNone, "Incorrect UnsubscribeContext return value!" );
+
+    // Wait and no answer expected.
+    iTestDelay->Start ( 500000 ); // 500 ms
+    EUNIT_ASSERT_DESC( !iCheckPluginSubscribersCalled, "UnsubscribeContext was not detected by plugin" );
+    EUNIT_ASSERT_DESC( iPluginSubscribersCalled, "UnsubscribeContext was not detected by plugin" );
+
+    // Test if plugin gets NoSubscribers() callback if we remove last subscription
+    iExpectedSubscribersSource.Copy ( KTestContextSource );
+    iExpectedSubscribersType.Copy ( KTestContextValueType );
+    iExpectedSubscribersValue.Copy ( KTestContextValueNosubsOk );
+
+    // Unsubscribe 2.Subscription
+    iCheckPluginSubscribersCalled = ETrue;
+    iPluginSubscribersCalled = EFalse;
+    err = iAnotherClient->UnsubscribeContext ( *pluginSub2 );
+    EUNIT_ASSERT_DESC( err == KErrNone, "Incorrect UnsubscribeContext return value!" );
+
+    // Wait for correct context as answer.
+    iTestDelay->Start ( 500000 ); // 0.5 s
+    EUNIT_ASSERT_DESC( !iCheckPluginSubscribersCalled, "UnsubscribeContext was not detected by plugin" );
+    EUNIT_ASSERT_DESC( iPluginSubscribersCalled, "UnsubscribeContext was not detected by plugin" );
+
+    // Unsubscribe 3.Subscription dummy
+    err = iClient->UnsubscribeContext( *dummySub );
+    EUNIT_ASSERT_DESC( err == KErrNone, "Incorrect UnsubscribeContext return value!" );
+
+    err = iClient->UnsubscribeContext ( *valueSub );
+    EUNIT_ASSERT_DESC( err == KErrNone, "Incorrect UnsubscribeContext return value!" );
+
+    CleanupStack::PopAndDestroy ( dummySub );   //CLEANUP>> dummySub
+    CleanupStack::PopAndDestroy ( pluginSub2 ); //CLEANUP>> pluginSub2
+    CleanupStack::PopAndDestroy ( pluginSub1 ); //CLEANUP>> pluginSub1
+    CleanupStack::PopAndDestroy ( valueSub ); //CLEANUP>> valueSub
+    }
+
+void MT_CFClient::MT_CCFClient_SubscribersNosubscribersPlugin3L()
+    {
+    TInt err = KErrNone;
+
+    // Subscribe to value context signalling plugin "reactions".
+    // below                                        // CLEANUP<< valueSub
+    CCFContextSubscription* valueSub = CCFContextSubscription::NewLC ( );
+    valueSub->SetContextSourceL ( KTestContextSource );
+    valueSub->SetContextTypeL ( KTestContextValueType );
+    err = iClient->SubscribeContext ( *valueSub );
+    EUNIT_ASSERT_DESC( err == KErrNone, "Incorrect SubscribeContext return value!" );
+
+    // Test if plugin gets Subscribers() callback if we add subscription
+    iExpectedSubscribersSource.Copy ( KTestContextSource );
+    iExpectedSubscribersType.Copy ( KTestContextValueType );
+    iExpectedSubscribersValue.Copy ( KTestContextValueSubsOk );
+
+    // 1.Subscription
+    iCheckPluginSubscribersCalled = ETrue;
+    iPluginSubscribersCalled = EFalse;
+    // below                                        // CLEANUP<< pluginSub1
+    CCFContextSubscription* pluginSub1 = CCFContextSubscription::NewLC ( );
+    pluginSub1->SetContextSourceL ( KTestContextSource );
+    pluginSub1->SetContextTypeL ( KTestContextType );
+    err = iClient->SubscribeContext ( *pluginSub1 );
+    EUNIT_ASSERT_DESC( err == KErrNone, "Incorrect SubscribeContext return value!" );
+
+    // Wait for correct context as answer.
+    iTestDelay->Start ( 250000 ); // 250 ms
+    EUNIT_ASSERT_DESC( !iCheckPluginSubscribersCalled, "SubscribeContext was not detected by plugin" );
+    EUNIT_ASSERT_DESC( iPluginSubscribersCalled, "SubscribeContext was not detected by plugin" );
+
+    // 2.Subscription
+    iCheckPluginSubscribersCalled = ETrue;
+    iPluginSubscribersCalled = EFalse;
+    // below                                        // CLEANUP<< pluginSub2
+    CCFContextSubscription* pluginSub2 = CCFContextSubscription::NewLC ( );
+    pluginSub2->SetContextSourceL ( KTestContextSource );
+    pluginSub2->SetContextTypeL ( KTestContextType2 );
+    err = iAnotherClient->SubscribeContext ( *pluginSub2 );
+    EUNIT_ASSERT_DESC( err == KErrNone, "Incorrect SubscribeContext return value!" );
+
+    // Wait and no answer expected.
+    iTestDelay->Start ( 500000 ); // 0.5 s
+    EUNIT_ASSERT_DESC( !iCheckPluginSubscribersCalled, "SubscribeContext was not detected by plugin" );
+    EUNIT_ASSERT_DESC( iPluginSubscribersCalled, "SubscribeContext was not detected by plugin" );
+
+    // 3.Subscription dummy
+    // below                                        // CLEANUP<< dummySub
+    CCFContextSubscription* dummySub = CCFContextSubscription::NewLC();
+    dummySub->SetContextSourceL( _L( "jusTaDummySubSource" ) );
+    dummySub->SetContextTypeL( _L( "jusTaDummySubType" ) );
+    err = iClient->SubscribeContext( *dummySub );
+    EUNIT_ASSERT_DESC( err == KErrNone, "Incorrect SubscribeContext return value!" );
+
+    // Unsubscribe Subscriptions by deleting the client
+    delete iClient;
+    iClient = NULL;
+    delete iAnotherClient;
+    iAnotherClient = NULL;
+
+    CleanupStack::PopAndDestroy ( dummySub );   //CLEANUP>> dummySub
+    CleanupStack::PopAndDestroy ( pluginSub2 ); //CLEANUP>> pluginSub2
+    CleanupStack::PopAndDestroy ( pluginSub1 ); //CLEANUP>> pluginSub1
+    CleanupStack::PopAndDestroy ( valueSub ); //CLEANUP>> valueSub
+    }
+
+void MT_CFClient::MT_CCFClient_ContextSourceCommandPluginL( )
+    {
+    TInt err = KErrNone;
+
+    // Subscribe to value context signalling plugin "reactions".
+    // below                                    // CLEANUP<< sourceCmdSignalSub
+    CCFContextSubscription* sourceCmdSignalSub = CCFContextSubscription::NewLC();
+    sourceCmdSignalSub->SetContextSourceL( KSourceCommandSignalContextSource );
+    sourceCmdSignalSub->SetContextTypeL( KSourceCommandSignalContextType );
+    err = iClient->SubscribeContext( *sourceCmdSignalSub );
+    EUNIT_ASSERT_DESC( err == KErrNone, "Incorrect SubscribeContext return value!" );
+
+    // Define context                           // CLEANUP<< context
+    CCFContextObject* context = CCFContextObject::NewLC(
+            KSourceCommandPluginScriptContextSource,
+            KSourceCommandScriptContextType,
+            KSourceCommandScript1ContextValueDeactivate );
+    err = iClient->DefineContext( context->Source(), context->Type(),
+        KPassSec, KPassSec );
+    EUNIT_ASSERT_DESC( err == KErrNone, "Incorrect DefineContext return value! " );
+
+    // Registering scripts with context source command as action
+    HBufC8* script = LoadScriptFromFile(_L("test-sourceCommandPlugIn.xml") );
+    TInt scriptId( -1 );
+    err = iClient->RegisterScript( _L("test-sourceCommandPlugIn.xml"),
+            *script,
+            scriptId );
+    EUNIT_ASSERT_DESC( err == KErrNone, "Error when registering script!" );
+    delete script;
+    script = NULL;
+
+    script = LoadScriptFromFile(_L("test-sourceCommandPlugIn2.xml") );
+    TInt scriptId2( -1 );
+    err = iClient->RegisterScript( _L("test-sourceCommandPlugIn2.xml"),
+            *script,
+            scriptId2 );
+    EUNIT_ASSERT_DESC( err == KErrNone, "Error when registering script!" );
+    delete script;
+    script = NULL;
+
+    // 1. Publish script1 deactivate
+    // Test values that plugin responds correctly to source command
+    iExpectedSubscribersSource.Copy( KSourceCommandSignalContextSource );
+    iExpectedSubscribersType.Copy( KSourceCommandSignalContextType );
+    iExpectedSubscribersValue.Copy( KSourceCommandSignalContextValueDeactiveReqDeactivate );
+    iCheckSourceCommandHandled = ETrue;
+    iSourceCommandHandled = EFalse;
+    context->SetValueL( KSourceCommandScript1ContextValueDeactivate );
+    err = iClient->PublishContext( *context );
+    EUNIT_ASSERT_DESC( err == KErrNone, "Incorrect PublishContext return value!" );
+    // Wait for correct context as answer.
+    iWait->Start();
+    EUNIT_ASSERT_DESC( !iCheckSourceCommandHandled, "Source command was not checked" );
+    EUNIT_ASSERT_DESC( iSourceCommandHandled, "Source command was not detected by plugin" );
+
+    // 2. Publish script2 deactivate
+    iExpectedSubscribersValue.Copy( KSourceCommandSignalContextValueDeactiveReqDeactivate );
+    iCheckSourceCommandHandled = ETrue;
+    iSourceCommandHandled = EFalse;
+    context->SetValueL( KSourceCommandScript2ContextValueDeactivate );
+    err = iClient->PublishContext( *context );
+    EUNIT_ASSERT_DESC( err == KErrNone, "Incorrect PublishContext return value!" );
+    // Wait for correct context as answer.
+    iWait->Start();
+    EUNIT_ASSERT_DESC( !iCheckSourceCommandHandled, "Source command was not checked" );
+    EUNIT_ASSERT_DESC( iSourceCommandHandled, "Source command was not detected by plugin" );
+
+    // 3. Publish script1 activate
+    iExpectedSubscribersValue.Copy( KSourceCommandSignalContextValueActivated );
+    iCheckSourceCommandHandled = ETrue;
+    iSourceCommandHandled = EFalse;
+    context->SetValueL( KSourceCommandScript1ContextValueActivate );
+    err = iClient->PublishContext( *context );
+    EUNIT_ASSERT_DESC( err == KErrNone, "Incorrect PublishContext return value!" );
+    // Wait for correct context as answer.
+    iWait->Start();
+    EUNIT_ASSERT_DESC( !iCheckSourceCommandHandled, "Source command was not checked" );
+    EUNIT_ASSERT_DESC( iSourceCommandHandled, "Source command was not detected by plugin" );
+
+    // 4. Publish script1 activate
+    iExpectedSubscribersValue.Copy( KSourceCommandSignalContextValueActiveReqActivate );
+    iCheckSourceCommandHandled = ETrue;
+    iSourceCommandHandled = EFalse;
+    context->SetValueL( KSourceCommandScript1ContextValueActivate );
+    err = iClient->PublishContext( *context );
+    EUNIT_ASSERT_DESC( err == KErrNone, "Incorrect PublishContext return value!" );
+    // Wait for correct context as answer.
+    iWait->Start();
+    EUNIT_ASSERT_DESC( !iCheckSourceCommandHandled, "Source command was not checked" );
+    EUNIT_ASSERT_DESC( iSourceCommandHandled, "Source command was not detected by plugin" );
+
+    // 5. Publish script2 activate
+    iExpectedSubscribersValue.Copy( KSourceCommandSignalContextValueActiveReqActivate );
+    iCheckSourceCommandHandled = ETrue;
+    iSourceCommandHandled = EFalse;
+    context->SetValueL( KSourceCommandScript2ContextValueActivate );
+    err = iClient->PublishContext( *context );
+    EUNIT_ASSERT_DESC( err == KErrNone, "Incorrect PublishContext return value!" );
+    // Wait for correct context as answer.
+    iWait->Start();
+    EUNIT_ASSERT_DESC( !iCheckSourceCommandHandled, "Source command was not checked" );
+    EUNIT_ASSERT_DESC( iSourceCommandHandled, "Source command was not detected by plugin" );
+
+    // 6. Publish script2 deactivate
+    iExpectedSubscribersValue.Copy( KSourceCommandSignalContextValueActiveReqDeactivate );
+    iCheckSourceCommandHandled = ETrue;
+    iSourceCommandHandled = EFalse;
+    context->SetValueL( KSourceCommandScript2ContextValueDeactivate );
+    err = iClient->PublishContext( *context );
+    EUNIT_ASSERT_DESC( err == KErrNone, "Incorrect PublishContext return value!" );
+    // Wait for correct context as answer.
+    iWait->Start();
+    EUNIT_ASSERT_DESC( !iCheckSourceCommandHandled, "Source command was not checked" );
+    EUNIT_ASSERT_DESC( iSourceCommandHandled, "Source command was not detected by plugin" );
+
+    // 7. Publish script2 deactivate
+    iExpectedSubscribersValue.Copy( KSourceCommandSignalContextValueActiveReqDeactivate );
+    iCheckSourceCommandHandled = ETrue;
+    iSourceCommandHandled = EFalse;
+    context->SetValueL( KSourceCommandScript2ContextValueDeactivate );
+    err = iClient->PublishContext( *context );
+    EUNIT_ASSERT_DESC( err == KErrNone, "Incorrect PublishContext return value!" );
+    // Wait for correct context as answer.
+    iWait->Start();
+    EUNIT_ASSERT_DESC( !iCheckSourceCommandHandled, "Source command was not checked" );
+    EUNIT_ASSERT_DESC( iSourceCommandHandled, "Source command was not detected by plugin" );
+
+    // 8. Publish script1 deactivate
+    iExpectedSubscribersValue.Copy( KSourceCommandSignalContextValueDeactivated );
+    iCheckSourceCommandHandled = ETrue;
+    iSourceCommandHandled = EFalse;
+    context->SetValueL( KSourceCommandScript1ContextValueDeactivate );
+    err = iClient->PublishContext( *context );
+    EUNIT_ASSERT_DESC( err == KErrNone, "Incorrect PublishContext return value!" );
+    // Wait for correct context as answer.
+    iWait->Start();
+    EUNIT_ASSERT_DESC( !iCheckSourceCommandHandled, "Source command was not checked" );
+    EUNIT_ASSERT_DESC( iSourceCommandHandled, "Source command was not detected by plugin" );
+
+    // 9. Publish script2 deactivate
+    iExpectedSubscribersValue.Copy( KSourceCommandSignalContextValueDeactiveReqDeactivate );
+    iCheckSourceCommandHandled = ETrue;
+    iSourceCommandHandled = EFalse;
+    context->SetValueL( KSourceCommandScript2ContextValueDeactivate );
+    err = iClient->PublishContext( *context );
+    EUNIT_ASSERT_DESC( err == KErrNone, "Incorrect PublishContext return value!" );
+    // Wait for correct context as answer.
+    iWait->Start();
+    EUNIT_ASSERT_DESC( !iCheckSourceCommandHandled, "Source command was not checked" );
+    EUNIT_ASSERT_DESC( iSourceCommandHandled, "Source command was not detected by plugin" );
+
+    err = iClient->UnsubscribeContext( *sourceCmdSignalSub );
+    EUNIT_ASSERT_DESC( err == KErrNone, "Incorrect UnsubscribeContext return value!" );
+
+    err = iClient->DeregisterScript( scriptId );
+    EUNIT_ASSERT_DESC( err == KErrNone, "Error when de-registering script!" );
+    err = iClient->DeregisterScript( scriptId2 );
+    EUNIT_ASSERT_DESC( err == KErrNone, "Error when de-registering script!" );
+
+    CleanupStack::PopAndDestroy( context );     // CLEANUP>> context
+    CleanupStack::PopAndDestroy( sourceCmdSignalSub );//CLEANUP>> sourceCmdSignalSub
+    }
+
+void MT_CFClient::MT_CCFClient_ContextSourceCommandClientL( )
+    {
+    TInt err = KErrNone;
+
+    // Define context                           // CLEANUP<< context
+    CCFContextObject* context = CCFContextObject::NewLC(
+            KSourceCommandClientScriptContextSource,
+            KSourceCommandScriptContextType,
+            KSourceCommandScript1ContextValueDeactivate );
+    err = iClient->DefineContext( context->Source(), context->Type(),
+        KPassSec, KPassSec );
+    EUNIT_ASSERT_DESC( err == KErrNone, "Incorrect DefineContext return value! " );
+
+    // Registering scripts with context source command as action
+    HBufC8* script = LoadScriptFromFile(_L("test-sourceCommand.xml") );
+    TInt scriptId( -1 );
+    err = iClient->RegisterScript( _L("test-sourceCommand.xml"),
+            *script,
+            scriptId );
+    EUNIT_ASSERT_DESC( err == KErrNone, "Error when registering script!" );
+    delete script;
+    script = NULL;
+
+    script = LoadScriptFromFile(_L("test-sourceCommand2.xml") );
+    TInt scriptId2( -1 );
+    err = iClient->RegisterScript( _L("test-sourceCommand2.xml"),
+            *script,
+            scriptId2 );
+    EUNIT_ASSERT_DESC( err == KErrNone, "Error when registering script!" );
+    delete script;
+    script = NULL;
+
+    // 1. Publish script1 deactivate
+    iHandleCommandCalled = EFalse;
+    context->SetValueL( KSourceCommandScript1ContextValueDeactivate );
+    err = iClient->PublishContext( *context );
+    EUNIT_ASSERT_DESC( err == KErrNone, "Incorrect PublishContext return value!" );
+    // Wait for call to handle command.
+    iWait->Start();
+    EUNIT_ASSERT_DESC( iHandleCommandCalled, "Source command was not detected by client" );
+    EUNIT_ASSERT_DESC( iActiveRequests.Count() == 0, "Client source active request count error" );
+
+    // 2. Publish script2 deactivate
+    iHandleCommandCalled = EFalse;
+    context->SetValueL( KSourceCommandScript2ContextValueDeactivate );
+    err = iClient->PublishContext( *context );
+    EUNIT_ASSERT_DESC( err == KErrNone, "Incorrect PublishContext return value!" );
+    // Wait for call to handle command.
+    iWait->Start();
+    EUNIT_ASSERT_DESC( iHandleCommandCalled, "Source command was not detected by client" );
+    EUNIT_ASSERT_DESC( iActiveRequests.Count() == 0, "Client source active request count error" );
+
+    // 3. Publish script1 activate
+    iHandleCommandCalled = EFalse;
+    context->SetValueL( KSourceCommandScript1ContextValueActivate );
+    err = iClient->PublishContext( *context );
+    EUNIT_ASSERT_DESC( err == KErrNone, "Incorrect PublishContext return value!" );
+    // Wait for call to handle command.
+    iWait->Start();
+    EUNIT_ASSERT_DESC( iHandleCommandCalled, "Source command was not detected by client" );
+    EUNIT_ASSERT_DESC( iActiveRequests.Count() == 1, "Client source active request count error" );
+
+    // 4. Publish script1 activate
+    iHandleCommandCalled = EFalse;
+    context->SetValueL( KSourceCommandScript1ContextValueActivate );
+    err = iClient->PublishContext( *context );
+    EUNIT_ASSERT_DESC( err == KErrNone, "Incorrect PublishContext return value!" );
+    // Wait for call to handle command.
+    iWait->Start();
+    EUNIT_ASSERT_DESC( iHandleCommandCalled, "Source command was not detected by client" );
+    EUNIT_ASSERT_DESC( iActiveRequests.Count() == 1, "Client source active request count error" );
+
+    // 5. Publish script2 activate
+    iHandleCommandCalled = EFalse;
+    context->SetValueL( KSourceCommandScript2ContextValueActivate );
+    err = iClient->PublishContext( *context );
+    EUNIT_ASSERT_DESC( err == KErrNone, "Incorrect PublishContext return value!" );
+    // Wait for call to handle command.
+    iWait->Start();
+    EUNIT_ASSERT_DESC( iHandleCommandCalled, "Source command was not detected by client" );
+    EUNIT_ASSERT_DESC( iActiveRequests.Count() == 2, "Client source active request count error" );
+
+    // 6. Publish script2 deactivate
+    iHandleCommandCalled = EFalse;
+    context->SetValueL( KSourceCommandScript2ContextValueDeactivate );
+    err = iClient->PublishContext( *context );
+    EUNIT_ASSERT_DESC( err == KErrNone, "Incorrect PublishContext return value!" );
+    // Wait for call to handle command.
+    iWait->Start();
+    EUNIT_ASSERT_DESC( iHandleCommandCalled, "Source command was not detected by client" );
+    EUNIT_ASSERT_DESC( iActiveRequests.Count() == 1, "Client source active request count error" );
+
+    // 7. Publish script2 deactivate
+    iHandleCommandCalled = EFalse;
+    context->SetValueL( KSourceCommandScript2ContextValueDeactivate );
+    err = iClient->PublishContext( *context );
+    EUNIT_ASSERT_DESC( err == KErrNone, "Incorrect PublishContext return value!" );
+    // Wait for call to handle command.
+    iWait->Start();
+    EUNIT_ASSERT_DESC( iHandleCommandCalled, "Source command was not detected by client" );
+    EUNIT_ASSERT_DESC( iActiveRequests.Count() == 1, "Client source active request count error" );
+
+    // 8. Publish script1 deactivate
+    iHandleCommandCalled = EFalse;
+    context->SetValueL( KSourceCommandScript1ContextValueDeactivate );
+    err = iClient->PublishContext( *context );
+    EUNIT_ASSERT_DESC( err == KErrNone, "Incorrect PublishContext return value!" );
+    // Wait for call to handle command.
+    iWait->Start();
+    EUNIT_ASSERT_DESC( iHandleCommandCalled, "Source command was not detected by client" );
+    EUNIT_ASSERT_DESC( iActiveRequests.Count() == 0, "Client source active request count error" );
+
+    // 9. Publish script2 deactivate
+    iHandleCommandCalled = EFalse;
+    context->SetValueL( KSourceCommandScript2ContextValueDeactivate );
+    err = iClient->PublishContext( *context );
+    EUNIT_ASSERT_DESC( err == KErrNone, "Incorrect PublishContext return value!" );
+    // Wait for call to handle command.
+    iWait->Start();
+    EUNIT_ASSERT_DESC( iHandleCommandCalled, "Source command was not detected by client" );
+    EUNIT_ASSERT_DESC( iActiveRequests.Count() == 0, "Client source active request count error" );
+
+    err = iClient->DeregisterScript( scriptId );
+    EUNIT_ASSERT_DESC( err == KErrNone, "Error when de-registering script!" );
+    err = iClient->DeregisterScript( scriptId2 );
+    EUNIT_ASSERT_DESC( err == KErrNone, "Error when de-registering script!" );
+
+    CleanupStack::PopAndDestroy( context );     // CLEANUP>> context
+    }
+
+void MT_CFClient::MT_CCFClient_PublishContextL( )
+    {
+    CCFContextObject* context = CCFContextObject::NewLC ( );
+    CCFClient* client = CCFClient::NewLC ( *this );
+    TInt err = KErrNone;
+
+    // Try to publish context which has not been defined
+    ConfigureContextL ( *context );
+    err = client->PublishContext ( *context );
+    EUNIT_ASSERT_DESC( err == KErrNotFound, "Incorrect PublishContext return value!" );
+
+    // Define context and publish it
+    err = client->DefineContext ( context->Source ( ), context->Type ( ),
+        KPassSec );
+    EUNIT_ASSERT_DESC( err == KErrNone, "Incorrect DefineContext return value!" );
+    err = client->PublishContext ( *context );
+    EUNIT_ASSERT_DESC( err == KErrNone, "Incorrect PublishContext return value!" );
+
+    // Delete client and publish same context
+    CleanupStack::PopAndDestroy ( client );
+    client = CCFClient::NewLC ( *this );
+    err = client->PublishContext ( *context );
+    EUNIT_ASSERT_DESC( err == KErrNone, "Incorrect PublishContext return value!" );
+
+    // Define a new context and publish it
+    ConfigureContextL ( *context );
+    err = client->DefineContext ( context->Source ( ), context->Type ( ),
+        KPassSec );
+    EUNIT_ASSERT_DESC( err == KErrNone, "Incorrect DefineContext return value!" );
+    err = client->PublishContext ( *context );
+    EUNIT_ASSERT_DESC( err == KErrNone, "Incorrect PublishContext return value!" );
+
+    // Test incorrect context values
+    context->SetSourceL ( KNullDesC );
+    err = client->PublishContext ( *context );
+    EUNIT_ASSERT_DESC( err == KErrArgument, "Incorrect PublishContext return value!" );
+    context->SetTypeL ( KNullDesC );
+    err = client->PublishContext ( *context );
+    EUNIT_ASSERT_DESC( err == KErrArgument, "Incorrect PublishContext return value!" );
+    context->SetValueL ( KNullDesC );
+    err = client->PublishContext ( *context );
+    EUNIT_ASSERT_DESC( err == KErrArgument, "Incorrect PublishContext return value!" );
+
+    // Define context where we do not have access
+    ConfigureContextL ( *context );
+    err = client->DefineContext ( context->Source ( ), context->Type ( ),
+        KFailSec );
+    EUNIT_ASSERT_DESC( err == KErrNone, "Incorrect DefineContext return value!" );
+    err = client->PublishContext ( *context );
+    EUNIT_ASSERT_DESC( err == KErrAccessDenied, "Incorrect PublishContext return value!" );
+
+    // Clean up
+    CleanupStack::PopAndDestroy ( client );
+    CleanupStack::PopAndDestroy ( context );
+    }
+
+void MT_CFClient::MT_CCFClient_PublishContextWithDataL( )
+    {
+    _LIT( KKey, "Key" );
+    _LIT( KValue, "Value" );
+
+    CTestContextData* contextData = CTestContextData::NewLC ( KKey, KValue );
+    CCFContextObject* context = CCFContextObject::NewLC ( );
+    CCFClient* client = CCFClient::NewLC ( *this );
+    TInt err = KErrNone;
+
+    // Try to publish context which has not been defined
+    ConfigureContextL ( *context );
+    err = client->PublishContext ( *context, *contextData );
+    EUNIT_ASSERT_DESC( err == KErrNotFound, "Incorrect PublishContext return value!" );
+
+    // Define context and publish it
+    err = client->DefineContext ( context->Source ( ), context->Type ( ),
+        KPassSec );
+    EUNIT_ASSERT_DESC( err == KErrNone, "Incorrect DefineContext return value!" );
+    err = client->PublishContext ( *context, *contextData );
+    EUNIT_ASSERT_DESC( err == KErrNone, "Incorrect PublishContext return value!" );
+
+    // Delete client and publish same context
+    CleanupStack::PopAndDestroy ( client );
+    client = CCFClient::NewLC ( *this );
+    err = client->PublishContext ( *context, *contextData );
+    EUNIT_ASSERT_DESC( err == KErrNone, "Incorrect PublishContext return value!" );
+
+    // Define a new context and publish it
+    ConfigureContextL ( *context );
+    err = client->DefineContext ( context->Source ( ), context->Type ( ),
+        KPassSec );
+    EUNIT_ASSERT_DESC( err == KErrNone, "Incorrect DefineContext return value!" );
+    err = client->PublishContext ( *context, *contextData );
+    EUNIT_ASSERT_DESC( err == KErrNone, "Incorrect PublishContext return value!" );
+
+    // Test incorrect context values
+    context->SetSourceL ( KNullDesC );
+    err = client->PublishContext ( *context, *contextData );
+    EUNIT_ASSERT_DESC( err == KErrArgument, "Incorrect PublishContext return value!" );
+    context->SetTypeL ( KNullDesC );
+    err = client->PublishContext ( *context, *contextData );
+    EUNIT_ASSERT_DESC( err == KErrArgument, "Incorrect PublishContext return value!" );
+    context->SetValueL ( KNullDesC );
+    err = client->PublishContext ( *context, *contextData );
+    EUNIT_ASSERT_DESC( err == KErrArgument, "Incorrect PublishContext return value!" );
+
+    // Define context where we do not have access
+    ConfigureContextL ( *context );
+    err = client->DefineContext ( context->Source ( ), context->Type ( ),
+        KFailSec );
+    EUNIT_ASSERT_DESC( err == KErrNone, "Incorrect DefineContext return value!" );
+    err = client->PublishContext ( *context, *contextData );
+    EUNIT_ASSERT_DESC( err == KErrAccessDenied, "Incorrect PublishContext return value!" );
+
+    // Publish context data with invalid UID
+    ConfigureContextL ( *context );
+    contextData->SetUid ( KNullUid );
+    err = client->DefineContext ( context->Source ( ), context->Type ( ),
+        KFailSec );
+    EUNIT_ASSERT_DESC( err == KErrNone, "Incorrect DefineContext return value!" );
+    err = client->PublishContext ( *context, *contextData );
+    EUNIT_ASSERT_DESC( err == KErrNotSupported, "Incorrect PublishContext return value!" );
+
+    // Publish too big context data
+    const TInt length = 16*1024;
+    HBufC* data = HBufC::NewLC ( length );
+    TPtr dataPtr( data->Des ( ));
+    dataPtr.Fill ( 'z', length );
+    contextData->SetKeyL ( dataPtr );
+    contextData->SetValueL ( dataPtr );
+    contextData->SetUid ( KTestContextDataUid );
+    CleanupStack::PopAndDestroy ( data );
+    ConfigureContextL ( *context );
+    err = client->DefineContext ( context->Source ( ), context->Type ( ),
+        KPassSec );
+    EUNIT_ASSERT_DESC( err == KErrNone, "Incorrect DefineContext return value!" );
+    err = client->PublishContext ( *context, *contextData );
+    EUNIT_ASSERT_DESC( err == KErrTooBig, "Incorrect PublishContext return value!" );
+
+    // Clean up
+    CleanupStack::PopAndDestroy ( client );
+    CleanupStack::PopAndDestroy ( context );
+    CleanupStack::PopAndDestroy ( contextData );
+    }
+
+void MT_CFClient::MT_CCFClient_SubscribeContext1L( )
+    {
+    CCFContextSubscription* subscription=  NULL;
+    TInt err = KErrNone;
+
+    // Define a context and subscribe it
+    ConfigureContextL ( *iContextA );
+    err = iClient->DefineContext ( iContextA->Source ( ), iContextA->Type ( ),
+        KPassSec );
+    EUNIT_ASSERT_DESC( err == KErrNone, "Incorrect DefineContext return value!" );
+    subscription = CCFContextSubscription::NewLC ( );
+    subscription->SetContextSourceL ( iContextA->Source ( ) );
+    subscription->SetContextTypeL ( iContextA->Type ( ) );
+    err = iClient->SubscribeContext ( *subscription );
+    EUNIT_ASSERT_DESC( err == KErrNone, "Incorrect SubscribeContext return value!" );
+    CleanupStack::PopAndDestroy ( subscription );
+
+    // Publish a new context value and wait for context indication
+    UpdateContextValueL ( *iContextA );
+    err = iClient->PublishContext ( *iContextA );
+    EUNIT_ASSERT_DESC( err == KErrNone, "Incorrect PublishContext return value!" );
+    iCheckA = ETrue;
+    iWait->Start ( );
+
+    // Publish a new context value and wait for context indication
+    UpdateContextValueL ( *iContextA );
+    err = iClient->PublishContext ( *iContextA );
+    EUNIT_ASSERT_DESC( err == KErrNone, "Incorrect PublishContext return value!" );
+    iCheckA = ETrue;
+    iWait->Start ( );
+    }
+
+void MT_CFClient::MT_CCFClient_SubscribeContext2L( )
+    {
+    CCFContextSubscription* subscription=  NULL;
+    TInt err = KErrNone;
+
+    // Define a new context with no access and wait for error message
+    ConfigureContextL ( *iContextB );
+    err = iClient->DefineContext ( iContextB->Source ( ), iContextB->Type ( ),
+        KFailSec );
+    EUNIT_ASSERT_DESC( err == KErrNone, "Incorrect DefineContext return value!" );
+    subscription = CCFContextSubscription::NewLC ( );
+    subscription->SetContextSourceL ( iContextB->Source ( ) );
+    subscription->SetContextTypeL ( iContextB->Type ( ) );
+    err = iClient->SubscribeContext ( *subscription );
+    EUNIT_ASSERT_DESC( err == KErrNone, "Incorrect SubscribeContext return value!" );
+    CleanupStack::PopAndDestroy ( subscription );
+    iCheckB = ETrue;
+    iWait->Start ( );
+    }
+
+void MT_CFClient::MT_CCFClient_SubscribeContext3L( )
+    {
+    CCFContextSubscription* subscription=  NULL;
+    TInt err = KErrNone;
+
+    // Define two contexts with access and subscribe both of them
+    ConfigureContextL ( *iContextA );
+    err = iClient->DefineContext ( iContextA->Source ( ), iContextA->Type ( ),
+        KPassSec );
+    EUNIT_ASSERT_DESC( err == KErrNone, "Incorrect DefineContext return value!" );
+    ConfigureContextL ( *iContextB );
+    err = iClient->DefineContext ( iContextB->Source ( ), iContextB->Type ( ),
+        KPassSec );
+    EUNIT_ASSERT_DESC( err == KErrNone, "Incorrect DefineContext return value!" );
+
+    subscription = CCFContextSubscription::NewLC ( );
+    subscription->SetContextSourceL ( iContextA->Source ( ) );
+    subscription->SetContextTypeL ( iContextA->Type ( ) );
+    err = iClient->SubscribeContext ( *subscription );
+    EUNIT_ASSERT_DESC( err == KErrNone, "Incorrect SubscribeContext return value!" );
+    CleanupStack::PopAndDestroy ( subscription );
+
+    subscription = CCFContextSubscription::NewLC ( );
+    subscription->SetContextSourceL ( iContextB->Source ( ) );
+    subscription->SetContextTypeL ( iContextB->Type ( ) );
+    err = iClient->SubscribeContext ( *subscription );
+    EUNIT_ASSERT_DESC( err == KErrNone, "Incorrect SubscribeContext return value!" );
+    CleanupStack::PopAndDestroy ( subscription );
+
+    // Publish both context at the same time and wait for two indications
+    UpdateContextValueL ( *iContextA );
+    err = iClient->PublishContext ( *iContextA );
+    EUNIT_ASSERT_DESC( err == KErrNone, "Incorrect PublishContext return value!" );
+    iCheckA = ETrue;
+    UpdateContextValueL ( *iContextB );
+    err = iClient->PublishContext ( *iContextB );
+    EUNIT_ASSERT_DESC( err == KErrNone, "Incorrect PublishContext return value!" );
+    iCheckB = ETrue;
+    iWait->Start ( );
+
+    // Publish both context at the same time and wait for two indications
+    UpdateContextValueL ( *iContextA );
+    err = iClient->PublishContext ( *iContextA );
+    EUNIT_ASSERT_DESC( err == KErrNone, "Incorrect PublishContext return value!" );
+    iCheckA = ETrue;
+    UpdateContextValueL ( *iContextB );
+    err = iClient->PublishContext ( *iContextB );
+    EUNIT_ASSERT_DESC( err == KErrNone, "Incorrect PublishContext return value!" );
+    iCheckB = ETrue;
+    iWait->Start ( );
+    }
+
+void MT_CFClient::MT_CCFClient_SubscribeContext4L( )
+    {
+    CCFContextSubscription* subscription=  NULL;
+    TInt err = KErrNone;
+
+    // Define two context where other we have access and other we don't
+    // Subscribe both contexts
+    ConfigureContextL ( *iContextA );
+    err = iClient->DefineContext ( iContextA->Source ( ), iContextA->Type ( ),
+        KPassSec );
+    EUNIT_ASSERT_DESC( err == KErrNone, "Incorrect DefineContext return value!" );
+    ConfigureContextL ( *iContextB );
+    err = iClient->DefineContext ( iContextB->Source ( ), iContextB->Type ( ),
+        KFailSec );
+    EUNIT_ASSERT_DESC( err == KErrNone, "Incorrect DefineContext return value!" );
+
+    subscription = CCFContextSubscription::NewLC ( );
+    subscription->SetContextSourceL ( iContextA->Source ( ) );
+    subscription->SetContextTypeL ( iContextA->Type ( ) );
+    err = iClient->SubscribeContext ( *subscription );
+    EUNIT_ASSERT_DESC( err == KErrNone, "Incorrect SubscribeContext return value!" );
+    CleanupStack::PopAndDestroy ( subscription );
+
+    subscription = CCFContextSubscription::NewLC ( );
+    subscription->SetContextSourceL ( iContextB->Source ( ) );
+    subscription->SetContextTypeL ( iContextB->Type ( ) );
+    err = iClient->SubscribeContext ( *subscription );
+    EUNIT_ASSERT_DESC( err == KErrNone, "Incorrect SubscribeContext return value!" );
+    CleanupStack::PopAndDestroy ( subscription );
+
+    // Publish both context at the same time and wait for two indications
+    iCheckA = ETrue;
+    iCheckB = ETrue;
+
+    UpdateContextValueL ( *iContextA );
+    err = iClient->PublishContext ( *iContextA );
+    EUNIT_ASSERT_DESC( err == KErrNone, "Incorrect PublishContext return value!" );
+    UpdateContextValueL ( *iContextB );
+    err = iClient->PublishContext ( *iContextB );
+    EUNIT_ASSERT_DESC( err == KErrAccessDenied, "Incorrect PublishContext return value!" );
+    if ( iCheckA || iCheckB )
+        {
+        iWait->Start ( );
+        }
+    }
+
+void MT_CFClient::MT_CCFClient_SubscribeContext5L( )
+    {
+    CCFContextSubscription* subscription=  NULL;
+    TInt err = KErrNone;
+
+    // First subscribe a context
+    ConfigureContextL ( *iContextA );
+    subscription = CCFContextSubscription::NewLC ( );
+    subscription->SetContextSourceL ( iContextA->Source ( ) );
+    subscription->SetContextTypeL ( iContextA->Type ( ) );
+    err = iClient->SubscribeContext ( *subscription );
+    EUNIT_ASSERT_DESC( err == KErrNone, "Incorrect SubscribeContext return value!" );
+    CleanupStack::PopAndDestroy ( subscription );
+
+    // Define the context with access
+    err = iClient->DefineContext ( iContextA->Source ( ), iContextA->Type ( ),
+        KPassSec );
+    EUNIT_ASSERT_DESC( err == KErrNone, "Incorrect DefineContext return value!" );
+
+    // Publish new context value and wait for indication
+    UpdateContextValueL ( *iContextA );
+    err = iClient->PublishContext ( *iContextA );
+    EUNIT_ASSERT_DESC( err == KErrNone, "Incorrect PublishContext return value!" );
+    iCheckA = ETrue;
+    iWait->Start ( );
+    }
+
+void MT_CFClient::MT_CCFClient_SubscribeContext6L( )
+    {
+    CCFContextSubscription* subscription=  NULL;
+    TInt err = KErrNone;
+
+    // First subscribe a context
+    ConfigureContextL ( *iContextB );
+    subscription = CCFContextSubscription::NewLC ( );
+    subscription->SetContextSourceL ( iContextB->Source ( ) );
+    subscription->SetContextTypeL ( iContextB->Type ( ) );
+    err = iClient->SubscribeContext ( *subscription );
+    EUNIT_ASSERT_DESC( err == KErrNone, "Incorrect SubscribeContext return value!" );
+    CleanupStack::PopAndDestroy ( subscription );
+
+    // Define the context with no access and wait for error
+    err = iClient->DefineContext ( iContextB->Source ( ), iContextB->Type ( ),
+        KFailSec );
+    EUNIT_ASSERT_DESC( err == KErrNone, "Incorrect DefineContext return value!" );
+    iCheckB = ETrue;
+    iWait->Start ( );
+    }
+
+void MT_CFClient::MT_CCFClient_SubscribeContext7L( )
+    {
+    CCFContextSubscription* subscription=  NULL;
+    TInt err = KErrNone;
+
+    // Define two contexts with no access
+    ConfigureContextL ( *iContextB );
+    err = iClient->DefineContext ( iContextB->Source ( ), iContextB->Type ( ),
+        KFailSec );
+    EUNIT_ASSERT_DESC( err == KErrNone, "Incorrect DefineContext return value!" );
+    ConfigureContextL ( *iContextC );
+    err = iClient->DefineContext ( iContextC->Source ( ), iContextC->Type ( ),
+        KFailSec );
+    EUNIT_ASSERT_DESC( err == KErrNone, "Incorrect DefineContext return value!" );
+
+    // subscribe both contexts and wait for errors
+    subscription = CCFContextSubscription::NewLC ( );
+    subscription->SetContextSourceL ( iContextB->Source ( ) );
+    subscription->SetContextTypeL ( iContextB->Type ( ) );
+    err = iClient->SubscribeContext ( *subscription );
+    EUNIT_ASSERT_DESC( err == KErrNone, "Incorrect SubscribeContext return value!" );
+    CleanupStack::PopAndDestroy ( subscription );
+
+    subscription = CCFContextSubscription::NewLC ( );
+    subscription->SetContextSourceL ( iContextC->Source ( ) );
+    subscription->SetContextTypeL ( iContextC->Type ( ) );
+    err = iClient->SubscribeContext ( *subscription );
+    EUNIT_ASSERT_DESC( err == KErrNone, "Incorrect SubscribeContext return value!" );
+    CleanupStack::PopAndDestroy ( subscription );
+    iCheckB = ETrue;
+    iCheckC = ETrue;
+    iWait->Start ( );
+    }
+
+void MT_CFClient::MT_CCFClient_SubscribeContext8L( )
+    {
+    CCFContextSubscription* subscription=  NULL;
+    TInt err = KErrNone;
+
+    // Define two contexts
+    ConfigureContextL ( *iContextA );
+    iContextA->SetTypeL ( KContextTypeFormatWild );
+    err = iClient->DefineContext ( iContextA->Source ( ), iContextA->Type ( ),
+        KPassSec );
+    EUNIT_ASSERT_DESC( err == KErrNone, "Incorrect DefineContext return value!" );
+    iContextB->CopyL ( *iContextA );
+    UpdateContextTypeL ( *iContextB );
+    err = iClient->DefineContext ( iContextB->Source ( ), iContextB->Type ( ),
+        KPassSec );
+    EUNIT_ASSERT_DESC( err == KErrNone, "Incorrect DefineContext return value!" );
+
+    // Subscribe with sub type match
+    subscription = CCFContextSubscription::NewLC ( );
+    subscription->SetContextSourceL ( iContextA->Source ( ) );
+    subscription->SetContextTypeL ( iContextA->Type ( ) );
+    subscription->SetSubTypeMatch ( ETrue );
+    err = iClient->SubscribeContext ( *subscription );
+    EUNIT_ASSERT_DESC( err == KErrNone, "Incorrect SubscribeContext return value!" );
+    CleanupStack::PopAndDestroy ( subscription );
+
+    // Publish contextB and wait for indication
+    UpdateContextValueL ( *iContextB );
+    err = iClient->PublishContext ( *iContextB );
+    EUNIT_ASSERT_DESC( err == KErrNone, "Incorrect PublishContext return value!" );
+    iCheckB = ETrue;
+    iWait->Start ( );
+
+    // Publish contextA and wait for indication
+    UpdateContextValueL ( *iContextA );
+    err = iClient->PublishContext ( *iContextA );
+    EUNIT_ASSERT_DESC( err == KErrNone, "Incorrect PublishContext return value!" );
+    iCheckA = ETrue;
+    iWait->Start ( );
+    }
+
+void MT_CFClient::MT_CCFClient_SubscribeContext9L( )
+    {
+    CCFContextSubscription* subscription=  NULL;
+    TInt err = KErrNone;
+
+    // Run this set twice to get regression
+    static const TInt KCount = 2;
+    for (TInt i = 0; i < KCount; i++ )
+        {
+        // Define a context
+        ConfigureContextL ( *iContextA );
+        err = iClient->DefineContext ( iContextA->Source ( ),
+            iContextA->Type ( ), KPassSec );
+        EUNIT_ASSERT_DESC( err == KErrNone, "Incorrect DefineContext return value!" );
+
+        // Subscribe context but indicate only changes
+        subscription = CCFContextSubscription::NewLC ( );
+        subscription->SetContextSourceL ( iContextA->Source ( ) );
+        subscription->SetContextTypeL ( iContextA->Type ( ) );
+        subscription->SetOnlyChangesIndicated ( ETrue );
+        err = iClient->SubscribeContext ( *subscription );
+        EUNIT_ASSERT_DESC( err == KErrNone, "Incorrect SubscribeContext return value!" );
+        CleanupStack::PopAndDestroy ( subscription );
+
+        // Update context value, Publish context and wait for indication
+        UpdateContextValueL ( *iContextA );
+        err = iClient->PublishContext ( *iContextA );
+        EUNIT_ASSERT_DESC( err == KErrNone, "Incorrect PublishContext return value!" );
+        iCheckA = ETrue;
+        iWait->Start ( );
+
+        // Publish same context, context indication should not happen
+        err = iClient->PublishContext ( *iContextA );
+        EUNIT_ASSERT_DESC( err == KErrNone, "Incorrect PublishContext return value!" );
+        iCheckA = ETrue;
+        Wait ( KDelay );
+        EUNIT_ASSERT_DESC( iCheckA, "Context should not have been indicated!" );
+        iCheckA = EFalse;
+
+        // Define a context
+        ConfigureContextL ( *iContextA );
+        err = iClient->DefineContext ( iContextA->Source ( ),
+            iContextA->Type ( ), KPassSec );
+        EUNIT_ASSERT_DESC( err == KErrNone, "Incorrect DefineContext return value!" );
+
+        // Subscribe context but indicate only changes
+        subscription = CCFContextSubscription::NewLC ( );
+        subscription->SetContextSourceL ( iContextA->Source ( ) );
+        subscription->SetContextTypeL ( iContextA->Type ( ) );
+        subscription->SetOnlyChangesIndicated ( EFalse );
+        err = iClient->SubscribeContext ( *subscription );
+        EUNIT_ASSERT_DESC( err == KErrNone, "Incorrect SubscribeContext return value!" );
+        CleanupStack::PopAndDestroy ( subscription );
+
+        // Publish context and wait for indication
+        UpdateContextValueL ( *iContextA );
+        err = iClient->PublishContext ( *iContextA );
+        EUNIT_ASSERT_DESC( err == KErrNone, "Incorrect PublishContext return value!" );
+        iCheckA = ETrue;
+        iWait->Start ( );
+
+        // Publish context and wait for indication
+        UpdateContextValueL ( *iContextA );
+        err = iClient->PublishContext ( *iContextA );
+        EUNIT_ASSERT_DESC( err == KErrNone, "Incorrect PublishContext return value!" );
+        iCheckA = ETrue;
+        iDeleteClient = ETrue;
+        iWait->Start ( );
+
+        EUNIT_ASSERT_DESC( !iClient, "Client not deleted!" );
+        iClient = CCFClient::NewL ( *this );
+        }
+    }
+
+void MT_CFClient::MT_CCFClient_SubscribeContextFromDifferentClientsL( )
+    {
+    CCFContextSubscription* subscription=  NULL;
+    TInt err = KErrNone;
+
+    // Define two contexts with access and subscribe both of them
+    ConfigureContextL ( *iContextA );
+    err = iClient->DefineContext ( iContextA->Source ( ), iContextA->Type ( ),
+        KPassSec );
+    EUNIT_ASSERT_DESC( err == KErrNone, "Incorrect DefineContext return value!" );
+    ConfigureContextL ( *iContextB );
+    err = iAnotherClient->DefineContext ( iContextB->Source ( ),
+        iContextB->Type ( ), KPassSec );
+    EUNIT_ASSERT_DESC( err == KErrNone, "Incorrect DefineContext return value!" );
+
+    subscription = CCFContextSubscription::NewLC ( );
+    subscription->SetContextSourceL ( iContextA->Source ( ) );
+    subscription->SetContextTypeL ( iContextA->Type ( ) );
+    err = iClient->SubscribeContext ( *subscription );
+    EUNIT_ASSERT_DESC( err == KErrNone, "Incorrect SubscribeContext return value!" );
+    CleanupStack::PopAndDestroy ( subscription );
+
+    subscription = CCFContextSubscription::NewLC ( );
+    subscription->SetContextSourceL ( iContextB->Source ( ) );
+    subscription->SetContextTypeL ( iContextB->Type ( ) );
+    err = iAnotherClient->SubscribeContext ( *subscription );
+    EUNIT_ASSERT_DESC( err == KErrNone, "Incorrect SubscribeContext return value!" );
+    CleanupStack::PopAndDestroy ( subscription );
+
+    // Publish both context at the same time and wait for two indications
+    UpdateContextValueL ( *iContextA );
+    err = iClient->PublishContext ( *iContextA );
+    EUNIT_ASSERT_DESC( err == KErrNone, "Incorrect PublishContext return value!" );
+    iCheckA = ETrue;
+    UpdateContextValueL ( *iContextB );
+    err = iAnotherClient->PublishContext ( *iContextB );
+    EUNIT_ASSERT_DESC( err == KErrNone, "Incorrect PublishContext return value!" );
+    iCheckB = ETrue;
+    iWait->Start ( );
+
+    // Publish both context at the same time and wait for two indications
+    UpdateContextValueL ( *iContextA );
+    err = iAnotherClient->PublishContext ( *iContextA );
+    EUNIT_ASSERT_DESC( err == KErrNone, "Incorrect PublishContext return value!" );
+    iCheckA = ETrue;
+    UpdateContextValueL ( *iContextB );
+    err = iClient->PublishContext ( *iContextB );
+    EUNIT_ASSERT_DESC( err == KErrNone, "Incorrect PublishContext return value!" );
+    iCheckB = ETrue;
+    iWait->Start ( );
+    }
+
+void MT_CFClient::MT_CCFClient_SubscribeContextCombinedL( )
+    {
+    MT_CCFClient_SubscribeContext1L ( );
+    Wait ( 5000 );
+    MT_CCFClient_SubscribeContext2L ( );
+    Wait ( 5000 );
+    MT_CCFClient_SubscribeContext3L ( );
+    Wait ( 5000 );
+    MT_CCFClient_SubscribeContext4L ( );
+    Wait ( 5000 );
+    MT_CCFClient_SubscribeContext5L ( );
+    Wait ( 5000 );
+    MT_CCFClient_SubscribeContext6L ( );
+    Wait ( 5000 );
+    MT_CCFClient_SubscribeContext7L ( );
+    Wait ( 5000 );
+    MT_CCFClient_SubscribeContext8L ( );
+    Wait ( 5000 );
+    MT_CCFClient_SubscribeContext9L ( );
+    }
+
+void MT_CFClient::MT_CCFClient_SubscribeContextData1L( )
+    {
+    iCheckContextData = ETrue;
+    CCFContextSubscription* subscription=  NULL;
+    TInt err = KErrNone;
+
+    // Define a context
+    // Subscribe the context with data
+    // Publish new context value with data
+    ConfigureContextL ( *iContextA );
+    err = iClient->DefineContext ( iContextA->Source ( ), iContextA->Type ( ),
+        KPassSec );
+    EUNIT_ASSERT_DESC( err == KErrNone, "Incorrect DefineContext return value!" );
+
+    subscription = CCFContextSubscription::NewLC ( );
+    subscription->SetDataObjectEnabled ( ETrue );
+    subscription->SetContextSourceL ( iContextA->Source ( ) );
+    subscription->SetContextTypeL ( iContextA->Type ( ) );
+    err = iClient->SubscribeContext ( *subscription );
+    EUNIT_ASSERT_DESC( err == KErrNone, "Incorrect SubscribeContext return value!" );
+
+    UpdateContextValueL ( *iContextA );
+    err = iClient->PublishContext ( *iContextA, *iContextDataA );
+    EUNIT_ASSERT_DESC( err == KErrNone, "Incorrect PublishContext return value!" );
+    iCheckA = ETrue;
+    iWait->Start ( );
+
+    // Unsubscribe context
+    // Publish new context value, context indication should not happen
+    err = iClient->UnsubscribeContext ( *subscription );
+    EUNIT_ASSERT_DESC( err == KErrNone, "Incorrect UnsubscribeContext return value!" );
+    CleanupStack::PopAndDestroy ( subscription );
+
+    UpdateContextValueL ( *iContextA );
+    err = iClient->PublishContext ( *iContextA, *iContextDataA );
+    EUNIT_ASSERT_DESC( err == KErrNone, "Incorrect PublishContext return value!" );
+    iCheckA = ETrue;
+    Wait ( KDelay );
+    EUNIT_ASSERT_DESC( iCheckA, "Context should not have been indicated!" );
+    }
+
+void MT_CFClient::MT_CCFClient_SubscribeContextData2L( )
+    {
+    iCheckContextData = ETrue;
+    CCFContextSubscription* subscriptionA=  NULL;
+    CCFContextSubscription* subscriptionB=  NULL;
+    TInt err = KErrNone;
+
+    // Define two contexts
+    // Subscribe the contexts with datas
+    // Publish new context values with datas
+    ConfigureContextL ( *iContextA );
+    err = iClient->DefineContext ( iContextA->Source ( ), iContextA->Type ( ),
+        KPassSec );
+    EUNIT_ASSERT_DESC( err == KErrNone, "Incorrect DefineContext return value!" );
+    ConfigureContextL ( *iContextB );
+    err = iClient->DefineContext ( iContextB->Source ( ), iContextB->Type ( ),
+        KPassSec );
+    EUNIT_ASSERT_DESC( err == KErrNone, "Incorrect DefineContext return value!" );
+
+    subscriptionA = CCFContextSubscription::NewLC ( );
+    subscriptionA->SetDataObjectEnabled ( ETrue );
+    subscriptionA->SetContextSourceL ( iContextA->Source ( ) );
+    subscriptionA->SetContextTypeL ( iContextA->Type ( ) );
+    err = iClient->SubscribeContext ( *subscriptionA );
+    EUNIT_ASSERT_DESC( err == KErrNone, "Incorrect SubscribeContext return value!" );
+    CleanupStack::PopAndDestroy ( subscriptionA );
+    subscriptionB = CCFContextSubscription::NewLC ( );
+    subscriptionB->SetDataObjectEnabled ( ETrue );
+    subscriptionB->SetContextSourceL ( iContextB->Source ( ) );
+    subscriptionB->SetContextTypeL ( iContextB->Type ( ) );
+    err = iClient->SubscribeContext ( *subscriptionB );
+    EUNIT_ASSERT_DESC( err == KErrNone, "Incorrect SubscribeContext return value!" );
+    CleanupStack::PopAndDestroy ( subscriptionB );
+
+    UpdateContextValueL ( *iContextA );
+    err = iClient->PublishContext ( *iContextA, *iContextDataA );
+    EUNIT_ASSERT_DESC( err == KErrNone, "Incorrect PublishContext return value!" );
+    iCheckA = ETrue;
+    UpdateContextValueL ( *iContextB );
+    err = iClient->PublishContext ( *iContextB, *iContextDataB );
+    EUNIT_ASSERT_DESC( err == KErrNone, "Incorrect PublishContext return value!" );
+    iCheckB = ETrue;
+    iWait->Start ( );
+    }
+
+void MT_CFClient::MT_CCFClient_SubscribeContextData3L( )
+    {
+    iCheckContextData = ETrue;
+    CCFContextSubscription* subscriptionA=  NULL;
+    CCFContextSubscription* subscriptionB=  NULL;
+    TInt err = KErrNone;
+
+    // Define two contexts from different clients
+    // Subscribe the contexts with datas from different clients
+    // Publish new context values with datas from different clients
+    ConfigureContextL ( *iContextA );
+    err = iClient->DefineContext ( iContextA->Source ( ), iContextA->Type ( ),
+        KPassSec );
+    EUNIT_ASSERT_DESC( err == KErrNone, "Incorrect DefineContext return value!" );
+    ConfigureContextL ( *iContextB );
+    err = iAnotherClient->DefineContext ( iContextB->Source ( ),
+        iContextB->Type ( ), KPassSec );
+    EUNIT_ASSERT_DESC( err == KErrNone, "Incorrect DefineContext return value!" );
+
+    subscriptionA = CCFContextSubscription::NewLC ( );
+    subscriptionA->SetDataObjectEnabled ( ETrue );
+    subscriptionA->SetContextSourceL ( iContextA->Source ( ) );
+    subscriptionA->SetContextTypeL ( iContextA->Type ( ) );
+    err = iClient->SubscribeContext ( *subscriptionA );
+    EUNIT_ASSERT_DESC( err == KErrNone, "Incorrect SubscribeContext return value!" );
+    CleanupStack::PopAndDestroy ( subscriptionA );
+    subscriptionB = CCFContextSubscription::NewLC ( );
+    subscriptionB->SetDataObjectEnabled ( ETrue );
+    subscriptionB->SetContextSourceL ( iContextB->Source ( ) );
+    subscriptionB->SetContextTypeL ( iContextB->Type ( ) );
+    err = iAnotherClient->SubscribeContext ( *subscriptionB );
+    EUNIT_ASSERT_DESC( err == KErrNone, "Incorrect SubscribeContext return value!" );
+    CleanupStack::PopAndDestroy ( subscriptionB );
+
+    UpdateContextValueL ( *iContextA );
+    err = iClient->PublishContext ( *iContextA, *iContextDataA );
+    EUNIT_ASSERT_DESC( err == KErrNone, "Incorrect PublishContext return value!" );
+    iCheckA = ETrue;
+    UpdateContextValueL ( *iContextB );
+    err = iAnotherClient->PublishContext ( *iContextB, *iContextDataB );
+    EUNIT_ASSERT_DESC( err == KErrNone, "Incorrect PublishContext return value!" );
+    iCheckB = ETrue;
+    iWait->Start ( );
+    }
+
+void MT_CFClient::MT_CCFClient_SubscribeContextData4L( )
+    {
+    iCheckContextData = ETrue;
+    CCFContextSubscription* subscription=  NULL;
+    TInt err = KErrNone;
+
+    // Define a context
+    // Subscribe the context
+    // Publish new context value from context source plug-in
+    ConfigureContextL ( *iContextA );
+    err = iClient->DefineContext ( iContextA->Source ( ), iContextA->Type ( ),
+        KPassSec );
+    EUNIT_ASSERT_DESC( err == KErrNone, "Incorrect DefineContext return value!" );
+
+    subscription = CCFContextSubscription::NewLC ( );
+    subscription->SetDataObjectEnabled ( ETrue );
+    subscription->SetContextSourceL ( iContextA->Source ( ) );
+    subscription->SetContextTypeL ( iContextA->Type ( ) );
+    err = iClient->SubscribeContext ( *subscription );
+    EUNIT_ASSERT_DESC( err == KErrNone, "Incorrect SubscribeContext return value!" );
+    CleanupStack::PopAndDestroy ( subscription );
+
+    CCFContextObjectImpl* contextImpl = static_cast<CCFContextObjectImpl*>( iContextA );
+    UpdateContextValueL ( *iContextA );
+    HBufC8* buf = HBufC8::NewLC ( contextImpl->Size ( ) );
+    TPtr8 bufPtr( buf->Des ( ));
+    RDesWriteStream stream( bufPtr);
+    stream.PushL ( );
+    contextImpl->ExternalizeL ( stream );
+    err = RProperty::Set ( KContextSourceTestCategory, KPublishContextKey,
+        bufPtr );
+    EUNIT_ASSERT_DESC( err == KErrNone, "Failed to set property!" );
+    CleanupStack::PopAndDestroy ( &stream );
+    CleanupStack::PopAndDestroy ( buf );
+    iCheckA = ETrue;
+    iWait->Start ( );
+    }
+
+void MT_CFClient::MT_CCFClient_SubscribeContextDataCombinedL( )
+    {
+    MT_CCFClient_SubscribeContextData1L ( );
+    Wait ( 5000 );
+    MT_CCFClient_SubscribeContextData2L ( );
+    Wait ( 5000 );
+    MT_CCFClient_SubscribeContextData3L ( );
+    Wait ( 5000 );
+    MT_CCFClient_SubscribeContextData4L ( );
+    }
+
+void MT_CFClient::MT_CCFClient_UnsubscribeContext1L( )
+    {
+    iCheckContextData = EFalse;
+    CCFContextSubscription* subscription=  NULL;
+    TInt err = KErrNone;
+
+    // Define a context
+    ConfigureContextL ( *iContextA );
+    err = iClient->DefineContext ( iContextA->Source ( ), iContextA->Type ( ),
+        KPassSec );
+    EUNIT_ASSERT_DESC( err == KErrNone, "Incorrect DefineContext return value!" );
+
+    // Subscribe context
+    subscription = CCFContextSubscription::NewLC ( );
+    subscription->SetContextSourceL ( iContextA->Source ( ) );
+    subscription->SetContextTypeL ( iContextA->Type ( ) );
+    err = iClient->SubscribeContext ( *subscription );
+    EUNIT_ASSERT_DESC( err == KErrNone, "Incorrect SubscribeContext return value!" );
+
+    // Publish context and wait for indication
+    iCheckA = ETrue;
+    UpdateContextValueL ( *iContextA );
+    err = iClient->PublishContext ( *iContextA );
+    EUNIT_ASSERT_DESC( err == KErrNone, "Incorrect PublishContext return value!" );
+    if ( iCheckA )
+        {
+        iWait->Start ( );
+        }
+
+    // Unsubscribe context
+    err = iClient->UnsubscribeContext ( *subscription );
+    EUNIT_ASSERT_DESC( err == KErrNone, "Incorrect UnsubscribeContext return value!" );
+    CleanupStack::PopAndDestroy ( subscription );
+
+    // Publish context, context indication should not happen
+    iCheckA = ETrue;
+    UpdateContextValueL ( *iContextA );
+    err = iClient->PublishContext ( *iContextA );
+    EUNIT_ASSERT_DESC( err == KErrNone, "Incorrect PublishContext return value!" );
+    Wait ( KDelay );
+    EUNIT_ASSERT_DESC( iCheckA, "Context should not have been indicated!" );
+    iCheckA = EFalse;
+    }
+
+void MT_CFClient::MT_CCFClient_UnsubscribeContext2L( )
+    {
+    CCFContextSubscription* subscription=  NULL;
+    TInt err = KErrNone;
+
+    // Define a context
+    ConfigureContextL ( *iContextA );
+    err = iClient->DefineContext ( iContextA->Source ( ), iContextA->Type ( ),
+        KPassSec );
+    EUNIT_ASSERT_DESC( err == KErrNone, "Incorrect DefineContext return value!" );
+
+    // Subscribe context
+    subscription = CCFContextSubscription::NewLC ( );
+    subscription->SetContextSourceL ( iContextA->Source ( ) );
+    subscription->SetContextTypeL ( iContextA->Type ( ) );
+    err = iClient->SubscribeContext ( *subscription );
+    EUNIT_ASSERT_DESC( err == KErrNone, "Incorrect SubscribeContext return value!" );
+    CleanupStack::PopAndDestroy ( subscription );
+
+    // Publish context and wait for indication
+    UpdateContextValueL ( *iContextA );
+    err = iClient->PublishContext ( *iContextA );
+    EUNIT_ASSERT_DESC( err == KErrNone, "Incorrect PublishContext return value!" );
+    iCheckA = ETrue;
+    iWait->Start ( );
+
+    // Delete client
+    delete iClient;
+    iClient = NULL;
+    iClient = CCFClient::NewL ( *this );
+
+    // Publish context, context indication should not happen
+    UpdateContextValueL ( *iContextA );
+    err = iClient->PublishContext ( *iContextA );
+    EUNIT_ASSERT_DESC( err == KErrNone, "Incorrect PublishContext return value!" );
+    iCheckA = ETrue;
+    Wait ( KDelay );
+    EUNIT_ASSERT_DESC( iCheckA, "Context should not have been indicated!" );
+    iCheckA = EFalse;
+
+    // Define a context
+    ConfigureContextL ( *iContextA );
+    err = iClient->DefineContext ( iContextA->Source ( ), iContextA->Type ( ),
+        KPassSec );
+    EUNIT_ASSERT_DESC( err == KErrNone, "Incorrect DefineContext return value!" );
+
+    // Subscribe context
+    subscription = CCFContextSubscription::NewLC ( );
+    subscription->SetContextSourceL ( iContextA->Source ( ) );
+    subscription->SetContextTypeL ( iContextA->Type ( ) );
+    err = iClient->SubscribeContext ( *subscription );
+    EUNIT_ASSERT_DESC( err == KErrNone, "Incorrect SubscribeContext return value!" );
+    CleanupStack::PopAndDestroy ( subscription );
+
+    // Publish context and wait for indication
+    UpdateContextValueL ( *iContextA );
+    err = iClient->PublishContext ( *iContextA );
+    EUNIT_ASSERT_DESC( err == KErrNone, "Incorrect PublishContext return value!" );
+    iCheckA = ETrue;
+    iWait->Start ( );
+    }
+
+void MT_CFClient::MT_CCFClient_UnsubscribeContextCombinedL( )
+    {
+    MT_CCFClient_UnsubscribeContext1L ( );
+    Wait ( 5000 );
+    MT_CCFClient_UnsubscribeContext2L ( );
+    }
+
+void MT_CFClient::MT_CCFClient_RequestContext1L( )
+    {
+    CCFContextQuery* query=  NULL;
+    TInt err = KErrNone;
+
+    // Define a context
+    ConfigureContextL ( *iContextA );
+    err = iClient->DefineContext ( iContextA->Source ( ), iContextA->Type ( ),
+        KPassSec );
+    EUNIT_ASSERT_DESC( err == KErrNone, "Incorrect DefineContext return value!" );
+
+    // Publish new context value
+    err = iClient->PublishContext ( *iContextA );
+    EUNIT_ASSERT_DESC( err == KErrNone, "Incorrect PublishContext return value!" );
+
+    // Configure query to match published context and request context
+    query = CCFContextQuery::NewLC ( iContextA->Source ( ), iContextA->Type ( ) );
+    RContextObjectArray array;
+    CleanupResetAndDestroyPushL ( array );
+    err = iClient->RequestContext ( *query, array );
+    EUNIT_ASSERT_DESC( err == KErrNone, "Incorrect RequestContext return value!" );
+    EUNIT_ASSERT_DESC( array.Count() == 1, "Incorrect result array count!" );
+    EUNIT_ASSERT_DESC( array[0]->Source() == iContextA->Source(), "Incorrect context source!" );
+    EUNIT_ASSERT_DESC( array[0]->Type() == iContextA->Type(), "Incorrect context type!" );
+
+    // Request same context again
+    array.ResetAndDestroy ( );
+    err = iClient->RequestContext ( *query, array );
+    EUNIT_ASSERT_DESC( err == KErrNone, "Incorrect RequestContext return value!" );
+    EUNIT_ASSERT_DESC( array.Count() == 1, "Incorrect result array count!" );
+    EUNIT_ASSERT_DESC( array[0]->Source() == iContextA->Source(), "Incorrect context source!" );
+    EUNIT_ASSERT_DESC( array[0]->Type() == iContextA->Type(), "Incorrect context type!" );
+
+    // Define a context
+    ConfigureContextL ( *iContextA );
+    err = iClient->DefineContext ( iContextA->Source ( ), iContextA->Type ( ),
+        KPassSec );
+    EUNIT_ASSERT_DESC( err == KErrNone, "Incorrect DefineContext return value!" );
+
+    // Publish new context value
+    err = iClient->PublishContext ( *iContextA );
+    EUNIT_ASSERT_DESC( err == KErrNone, "Incorrect PublishContext return value!" );
+
+    // Configure query to match published context and request context
+    query->SetSourceL ( iContextA->Source ( ) );
+    query->SetTypeL ( iContextA->Type ( ) );
+    array.ResetAndDestroy ( );
+    err = iClient->RequestContext ( *query, array );
+    EUNIT_ASSERT_DESC( err == KErrNone, "Incorrect RequestContext return value!" );
+    EUNIT_ASSERT_DESC( array.Count() == 1, "Incorrect result array count!" );
+    EUNIT_ASSERT_DESC( array[0]->Source() == iContextA->Source(), "Incorrect context source!" );
+    EUNIT_ASSERT_DESC( array[0]->Type() == iContextA->Type(), "Incorrect context type!" );
+
+    // Clean up
+    CleanupStack::PopAndDestroy ( &array );
+    CleanupStack::PopAndDestroy ( query );
+    }
+
+void MT_CFClient::MT_CCFClient_RequestContext2L( )
+    {
+    CCFContextQuery* query=  NULL;
+    TInt err = KErrNone;
+
+    // Define a context where we have no access
+    ConfigureContextL ( *iContextA );
+    err = iClient->DefineContext ( iContextA->Source ( ), iContextA->Type ( ),
+        KFailSec );
+    EUNIT_ASSERT_DESC( err == KErrNone, "Incorrect DefineContext return value!" );
+
+    // Configure query to match the defined context and request context
+    query = CCFContextQuery::NewLC ( iContextA->Source ( ), iContextA->Type ( ) );
+    RContextObjectArray array;
+    CleanupResetAndDestroyPushL ( array );
+    err = iClient->RequestContext ( *query, array );
+    EUNIT_ASSERT_DESC( err == KErrNone, "Incorrect RequestContext return value!" );
+    EUNIT_ASSERT_DESC( array.Count() == 0, "Incorrect result array count!" );
+
+    // Define a context where we have no access
+    ConfigureContextL ( *iContextA );
+    err = iClient->DefineContext ( iContextA->Source ( ), iContextA->Type ( ),
+        KFailSec );
+    EUNIT_ASSERT_DESC( err == KErrNone, "Incorrect DefineContext return value!" );
+
+    // Configure query to match the defined context and request context
+    query->SetSourceL ( iContextA->Source ( ) );
+    query->SetTypeL ( iContextA->Type ( ) );
+    array.ResetAndDestroy ( );
+    err = iClient->RequestContext ( *query, array );
+    EUNIT_ASSERT_DESC( err == KErrNone, "Incorrect RequestContext return value!" );
+    EUNIT_ASSERT_DESC( array.Count() == 0, "Incorrect result array count!" );
+
+    // Clean up
+    CleanupStack::PopAndDestroy ( &array );
+    CleanupStack::PopAndDestroy ( query );
+    }
+
+void MT_CFClient::MT_CCFClient_RequestContext3L( )
+    {
+    CCFContextQuery* query=  NULL;
+    TInt err = KErrNone;
+
+    // Define a contextA
+    ConfigureContextL ( *iContextA );
+    err = iClient->DefineContext ( iContextA->Source ( ), iContextA->Type ( ),
+        KPassSec );
+    EUNIT_ASSERT_DESC( err == KErrNone, "Incorrect DefineContext return value!" );
+
+    // Publish new contextA value
+    err = iClient->PublishContext ( *iContextA );
+    EUNIT_ASSERT_DESC( err == KErrNone, "Incorrect PublishContext return value!" );
+
+    // Define a contextB
+    iContextB->CopyL ( *iContextA );
+    UpdateContextTypeL ( *iContextB );
+    UpdateContextValueL ( *iContextB );
+    err = iClient->DefineContext ( iContextB->Source ( ), iContextB->Type ( ),
+        KPassSec );
+    EUNIT_ASSERT_DESC( err == KErrNone, "Incorrect DefineContext return value!" );
+
+    // Publish new contextB value
+    err = iClient->PublishContext ( *iContextB );
+    EUNIT_ASSERT_DESC( err == KErrNone, "Incorrect PublishContext return value!" );
+
+    // Define a contextC
+    iContextC->CopyL ( *iContextA );
+    UpdateContextTypeL ( *iContextC );
+    err = iClient->DefineContext ( iContextC->Source ( ), iContextC->Type ( ),
+        KFailSec );
+    EUNIT_ASSERT_DESC( err == KErrNone, "Incorrect DefineContext return value!" );
+
+    // Configure query to match the defined contexts and request contexts
+    query = CCFContextQuery::NewLC ( iContextA->Source ( ),
+        KContextTypeFormatWild );
+    query->SetSubTypeMatch ( ETrue );
+    RContextObjectArray array;
+    CleanupResetAndDestroyPushL ( array );
+    err = iClient->RequestContext ( *query, array );
+    TInt count = array.Count ( );
+    EUNIT_ASSERT_DESC( err == KErrNone, "Incorrect RequestContext return value!" );
+    EUNIT_ASSERT_DESC( count == 2, "Incorrect result array count!" );
+    CCFContextObject* context=  NULL;
+    for (TInt i = 0; i < count; i++ )
+        {
+        context = array[i];
+        EUNIT_ASSERT_DESC( context->Source() == iContextA->Source() ||
+            context->Source() == iContextB->Source(),
+            "Incorrect context source!" );
+        EUNIT_ASSERT_DESC( context->Type() == iContextA->Type() ||
+            context->Type() == iContextB->Type(),
+            "Incorrect context type!" );
+        EUNIT_ASSERT_DESC( context->Type() != iContextC->Type(),
+            "Incorrect context type!" );
+        }
+
+    // Clean up
+    CleanupStack::PopAndDestroy ( &array );
+    CleanupStack::PopAndDestroy ( query );
+    }
+
+void MT_CFClient::MT_CCFClient_RequestContextSetL( )
+    {
+    CCFContextQuery* query=  NULL;
+    TInt err = KErrNone;
+
+    // Define a contextA
+    ConfigureContextL ( *iContextA );
+    err = iClient->DefineContext ( iContextA->Source ( ), iContextA->Type ( ),
+        KPassSec );
+    EUNIT_ASSERT_DESC( err == KErrNone, "Incorrect DefineContext return value!" );
+
+    // Publish new contextA value
+    err = iClient->PublishContext ( *iContextA );
+    EUNIT_ASSERT_DESC( err == KErrNone, "Incorrect PublishContext return value!" );
+
+    // Define a contextB
+    iContextB->CopyL ( *iContextA );
+    UpdateContextTypeL ( *iContextB );
+    UpdateContextValueL ( *iContextB );
+    err = iClient->DefineContext ( iContextB->Source ( ), iContextB->Type ( ),
+        KPassSec );
+    EUNIT_ASSERT_DESC( err == KErrNone, "Incorrect DefineContext return value!" );
+
+    // Publish new contextB value
+    err = iClient->PublishContext ( *iContextB );
+    EUNIT_ASSERT_DESC( err == KErrNone, "Incorrect PublishContext return value!" );
+
+    // Define a contextC
+    iContextC->CopyL ( *iContextA );
+    UpdateContextTypeL ( *iContextC );
+    err = iClient->DefineContext ( iContextC->Source ( ), iContextC->Type ( ),
+        KFailSec );
+    EUNIT_ASSERT_DESC( err == KErrNone, "Incorrect DefineContext return value!" );
+
+    // Configure three queries to match the defined contexts and request contexts
+    RContextQueryArray queryArray;
+    CleanupResetAndDestroyPushL ( queryArray );
+    query = CCFContextQuery::NewLC ( iContextA->Source ( ), iContextA->Type ( ) );
+    queryArray.AppendL ( query );
+    CleanupStack::Pop ( query );
+
+    query = CCFContextQuery::NewLC ( iContextB->Source ( ), iContextB->Type ( ) );
+    queryArray.AppendL ( query );
+    CleanupStack::Pop ( query );
+
+    query = CCFContextQuery::NewLC ( iContextC->Source ( ), iContextC->Type ( ) );
+    queryArray.AppendL ( query );
+    CleanupStack::Pop ( query );
+
+    // Request context and check results
+    RContextObjectArray resultArray;
+    CleanupResetAndDestroyPushL ( resultArray );
+    err = iClient->RequestContextSet ( queryArray, resultArray );
+    TInt count = resultArray.Count ( );
+    EUNIT_ASSERT_DESC( err == KErrNone, "Incorrect RequestContext return value!" );
+    EUNIT_ASSERT_DESC( count == 2, "Incorrect result array count!" );
+    CCFContextObject* context=  NULL;
+    for (TInt i = 0; i < count; i++ )
+        {
+        context = resultArray[i];
+        EUNIT_ASSERT_DESC( context->Source() == iContextA->Source() ||
+            context->Source() == iContextB->Source(),
+            "Incorrect context source!" );
+        EUNIT_ASSERT_DESC( context->Type() == iContextA->Type() ||
+            context->Type() == iContextB->Type(),
+            "Incorrect context type!" );
+        EUNIT_ASSERT_DESC( context->Type() != iContextC->Type(),
+            "Incorrect context type!" );
+        }
+
+    // Request same contexts again and check results
+    resultArray.ResetAndDestroy ( );
+    err = iClient->RequestContextSet ( queryArray, resultArray );
+    count = resultArray.Count ( );
+    EUNIT_ASSERT_DESC( err == KErrNone, "Incorrect RequestContext return value!" );
+    EUNIT_ASSERT_DESC( count == 2, "Incorrect result array count!" );
+    context = NULL;
+    for (TInt i = 0; i < count; i++ )
+        {
+        context = resultArray[i];
+        EUNIT_ASSERT_DESC( context->Source() == iContextA->Source() ||
+            context->Source() == iContextB->Source(),
+            "Incorrect context source!" );
+        EUNIT_ASSERT_DESC( context->Type() == iContextA->Type() ||
+            context->Type() == iContextB->Type(),
+            "Incorrect context type!" );
+        EUNIT_ASSERT_DESC( context->Type() != iContextC->Type(),
+            "Incorrect context type!" );
+        }
+
+    // Clean up
+    CleanupStack::PopAndDestroy ( &resultArray );
+    CleanupStack::PopAndDestroy ( &queryArray );
+    }
+
+void MT_CFClient::MT_CCFClient_RequestContextCombinedL( )
+    {
+    MT_CCFClient_RequestContext1L ( );
+    MT_CCFClient_RequestContext2L ( );
+    MT_CCFClient_RequestContext3L ( );
+    MT_CCFClient_RequestContextSetL ( );
+    }
+
+void MT_CFClient::MT_CCFClient_DefineActionL( )
+    {
+    TInt err = KErrNone;
+    HBufC* actionId=  NULL;
+
+    // Define action with access
+    actionId = ConfigureActionIdLC ( );
+    err = iClient->DefineAction ( *actionId, KPassSec );
+    EUNIT_ASSERT_DESC( err == KErrNone, "Incorrect DefineAction return value!" );
+    CleanupStack::PopAndDestroy ( actionId );
+
+    // Define another action with access
+    actionId = ConfigureActionIdLC ( );
+    err = iClient->DefineAction ( *actionId, KPassSec );
+    EUNIT_ASSERT_DESC( err == KErrNone, "Incorrect DefineAction return value!" );
+
+    // Try to define already defined action
+    err = iClient->DefineAction ( *actionId, KPassSec );
+    EUNIT_ASSERT_DESC( err == KErrAlreadyExists, "Incorrect DefineAction return value!" );
+
+    // Delete client, re-instantiate and define the same action than above
+    delete iClient;
+    iClient = NULL;
+    iClient = CCFClient::NewL( *this );
+    err = iClient->DefineAction ( *actionId, KPassSec );
+    EUNIT_ASSERT_DESC( err == KErrNone, "Incorrect DefineAction return value!" );
+    CleanupStack::PopAndDestroy ( actionId );
+
+    // Define action with no access
+    Wait ( KConfigDelay );
+    actionId = ConfigureActionIdLC ( );
+    err = iClient->DefineAction ( *actionId, KFailSec );
+    EUNIT_ASSERT_DESC( err == KErrNone, "Incorrect DefineAction return value!" );
+    CleanupStack::PopAndDestroy ( actionId );
+
+    // Try to define reserved action ids
+    err = iClient->DefineAction ( KReservedActionPublishContext, KPassSec );
+    EUNIT_ASSERT_DESC( err == KErrAlreadyExists, "Incorrect DefineAction return value!" );
+    err = iClient->DefineAction ( KReservedActionPublishContext2, KPassSec );
+    EUNIT_ASSERT_DESC( err == KErrAlreadyExists, "Incorrect DefineAction return value!" );
+    err = iClient->DefineAction ( KReservedActionSourceCommand, KPassSec );
+    EUNIT_ASSERT_DESC( err == KErrAlreadyExists, "Incorrect DefineAction return value!" );
+    err = iClient->DefineAction ( KReservedActionSourceCommand2, KPassSec );
+    EUNIT_ASSERT_DESC( err == KErrAlreadyExists, "Incorrect DefineAction return value!" );
+    }
+
+void MT_CFClient::MT_CCFClient_SubscribeAction1L( )
+    {
+    TInt err = KErrNone;
+    HBufC* actionId=  NULL;
+    CCFActionSubscription* subscription = CCFActionSubscription::NewLC ( );
+
+    // Define action with access and subscribe it
+    actionId = ConfigureActionIdLC ( );
+    err = iClient->DefineAction ( *actionId, KPassSec );
+    EUNIT_ASSERT_DESC( err == KErrNone, "Incorrect DefineAction return value!" );
+
+    subscription->SetActionIdentifierL ( *actionId );
+    err = iClient->SubscribeAction ( *subscription );
+    EUNIT_ASSERT_DESC( err == KErrNone, "Incorrect SubscribeAction return value!" );
+
+    // Delete client, re-define action and subscribe it
+    delete iClient;
+    iClient = NULL;
+    iClient = CCFClient::NewL( *this );
+
+    err = iClient->DefineAction ( *actionId, KPassSec );
+    EUNIT_ASSERT_DESC( err == KErrNone, "Incorrect DefineAction return value!" );
+
+    subscription->SetActionIdentifierL ( *actionId );
+    err = iClient->SubscribeAction ( *subscription );
+    EUNIT_ASSERT_DESC( err == KErrNone, "Incorrect SubscribeAction return value!" );
+    CleanupStack::PopAndDestroy ( actionId );
+
+    // Define action with no access and subscribe it
+    Wait ( KConfigDelay );
+    actionId = ConfigureActionIdLC ( );
+    err = iClient->DefineAction ( *actionId, KFailSec );
+    EUNIT_ASSERT_DESC( err == KErrNone, "Incorrect DefineAction return value!" );
+
+    subscription->SetActionIdentifierL ( *actionId );
+    err = iClient->SubscribeAction ( *subscription );
+    EUNIT_ASSERT_DESC( err == KErrAccessDenied, "Incorrect SubscribeAction return value!" );
+    CleanupStack::PopAndDestroy ( actionId );
+
+    // Try to subscribe an action which has not been defined
+    Wait ( KConfigDelay );
+    actionId = ConfigureActionIdLC ( );
+    subscription->SetActionIdentifierL ( *actionId );
+    err = iClient->SubscribeAction ( *subscription );
+    EUNIT_ASSERT_DESC( err == KErrNotFound, "Incorrect SubscribeAction return value!" );
+    CleanupStack::PopAndDestroy ( actionId );
+
+    // Clean up
+    CleanupStack::PopAndDestroy ( subscription );
+    }
+
+void MT_CFClient::MT_CCFClient_SubscribeAction2L( )
+    {
+    TInt err = KErrNone;
+    CCFActionSubscription* subscription = CCFActionSubscription::NewLC ( );
+    CCFContextObject* context = CCFContextObject::NewLC ( );
+
+    // Run following set twice to get regression
+    static const TInt KCount = 2;
+    for (TInt i = 0; i < KCount; i++ )
+        {
+        // Define actions used in test-cfclient.rul
+        iClient->DefineAction ( KActionA, KPassSec );
+        iClient->DefineAction ( KActionB, KPassSec );
+
+        // Define contexts used in test-cfclient.rul
+        iClient->DefineContext ( KContextSourceA, KContextTypeA, KPassSec );
+
+        // Subscribe both actions
+        subscription->SetActionIdentifierL ( KActionA );
+        err = iClient->SubscribeAction ( *subscription );
+        EUNIT_ASSERT_DESC( err == KErrNone, "Incorrect SubscribeAction return value!" );
+
+        subscription->SetActionIdentifierL ( KActionB );
+        err = iClient->SubscribeAction ( *subscription );
+        EUNIT_ASSERT_DESC( err == KErrNone, "Incorrect SubscribeAction return value!" );
+
+        // Publish context [SourceA: TypeA: ValueA] and wait for action indication
+        context->SetSourceL ( KContextSourceA );
+        context->SetTypeL ( KContextTypeA );
+        context->SetValueL ( KContextValueA );
+        err = iClient->PublishContext ( *context );
+        EUNIT_ASSERT_DESC( err == KErrNone, "Incorrect PublishContext return value!" );
+        iCheckA = ETrue;
+        iWait->Start ( );
+
+        // Publish context [SourceA: TypeA: ValueB] and wait for action indications
+        context->SetSourceL ( KContextSourceA );
+        context->SetTypeL ( KContextTypeA );
+        context->SetValueL ( KContextValueB );
+        err = iClient->PublishContext ( *context );
+        EUNIT_ASSERT_DESC( err == KErrNone, "Incorrect PublishContext return value!" );
+        iCheckA = ETrue;
+        iCheckB = ETrue;
+        iWait->Start ( );
+
+        // Publish context [SourceA: TypeA: ValueA] and wait for action indication
+        context->SetSourceL ( KContextSourceA );
+        context->SetTypeL ( KContextTypeA );
+        context->SetValueL ( KContextValueA );
+        err = iClient->PublishContext ( *context );
+        EUNIT_ASSERT_DESC( err == KErrNone, "Incorrect PublishContext return value!" );
+        iCheckA = ETrue;
+        iWait->Start ( );
+
+        // Publish context [SourceA: TypeA: ValueB] and wait for action indications
+        context->SetSourceL ( KContextSourceA );
+        context->SetTypeL ( KContextTypeA );
+        context->SetValueL ( KContextValueB );
+        err = iClient->PublishContext ( *context );
+        EUNIT_ASSERT_DESC( err == KErrNone, "Incorrect PublishContext return value!" );
+        iCheckA = ETrue;
+        iCheckB = ETrue;
+        iWait->Start ( );
+
+        // Publish context [SourceA: TypeA: ValueA] and wait for action indication
+        context->SetSourceL ( KContextSourceA );
+        context->SetTypeL ( KContextTypeA );
+        context->SetValueL ( KContextValueA );
+        err = iClient->PublishContext ( *context );
+        EUNIT_ASSERT_DESC( err == KErrNone, "Incorrect PublishContext return value!" );
+        iCheckA = ETrue;
+        iDeleteClient = ETrue;
+        iWait->Start ( );
+        EUNIT_ASSERT_DESC( !iClient, "Client instance not deleted!" );
+        iClient = CCFClient::NewL ( *this );
+        }
+
+    // Clean up
+    CleanupStack::PopAndDestroy ( context );
+    CleanupStack::PopAndDestroy ( subscription );
+    }
+
+void MT_CFClient::MT_CCFClient_SubscribeAction3L( )
+    {
+    // x. Preconditions
+    //--------------------------------------------------------------------------
+    TInt err = KErrNone;
+    CCFActionSubscription* subscription = CCFActionSubscription::NewLC( );
+    CCFContextObject* context = CCFContextObject::NewLC( );
+
+    // Define contexts used in test-cfclient.rul
+    iClient->DefineContext( KContextSourceA, KContextTypeA, KPassSec );
+
+    // Set context to "incorrect" state
+    context->SetSourceL( KContextSourceA );
+    context->SetTypeL( KContextTypeA );
+    context->SetValueL( KContextValueB );
+    err = iClient->PublishContext ( *context );
+    EUNIT_ASSERT_DESC( err == KErrNone, "Publish context failed" );
+
+    // x. Define action a and subscribe it, delete client and publish context
+    //--------------------------------------------------------------------------
+    err = iClient->DefineAction ( KActionA, KPassSec );
+    EUNIT_ASSERT_DESC( err == KErrNone, "Define action failed" );
+
+    subscription->SetActionIdentifierL( KActionA );
+    err = iClient->SubscribeAction( *subscription );
+    EUNIT_ASSERT_DESC( err == KErrNone, "Subscribe action failed" );
+
+    // Check that the action is indicatated
+    context->SetSourceL( KContextSourceA );
+    context->SetTypeL( KContextTypeA );
+    context->SetValueL( KContextValueA );
+    err = iClient->PublishContext ( *context );
+    EUNIT_ASSERT_DESC( err == KErrNone, "Publish context failed" );
+    iCheckA = ETrue;
+    iWait->Start();
+
+    // Reset context value
+    context->SetSourceL( KContextSourceA );
+    context->SetTypeL( KContextTypeA );
+    context->SetValueL( KContextValueB );
+    err = iClient->PublishContext ( *context );
+    EUNIT_ASSERT_DESC( err == KErrNone, "Publish context failed" );
+
+    // Delete client and publish context
+    delete iClient;
+    iClient = NULL;
+    iClient = CCFClient::NewL( *this );
+    context->SetSourceL( KContextSourceA );
+    context->SetTypeL( KContextTypeA );
+    context->SetValueL( KContextValueA );
+    err = iClient->PublishContext ( *context );
+    EUNIT_ASSERT_DESC( err == KErrNone, "Publish context failed" );
+    iCheckA = ETrue;
+    Wait( KSecond );
+    EUNIT_ASSERT_DESC( iCheckA, "Something went terribly wrong" );
+
+    // Reset context value
+    context->SetSourceL( KContextSourceA );
+    context->SetTypeL( KContextTypeA );
+    context->SetValueL( KContextValueB );
+    err = iClient->PublishContext ( *context );
+    EUNIT_ASSERT_DESC( err == KErrNone, "Publish context failed" );
+
+    // x. Re-define action a and subscribe it
+    //--------------------------------------------------------------------------
+    err = iClient->DefineAction ( KActionA, KPassSec );
+    EUNIT_ASSERT_DESC( err == KErrNone, "Define action failed" );
+
+    subscription->SetActionIdentifierL( KActionA );
+    err = iClient->SubscribeAction( *subscription );
+    EUNIT_ASSERT_DESC( err == KErrNone, "Subscribe action failed" );
+
+    // Check that the action is indicatated
+    context->SetSourceL( KContextSourceA );
+    context->SetTypeL( KContextTypeA );
+    context->SetValueL( KContextValueA );
+    err = iClient->PublishContext ( *context );
+    EUNIT_ASSERT_DESC( err == KErrNone, "Publish context failed" );
+    iCheckA = ETrue;
+    iWait->Start();
+
+    // x. Clean up
+    //--------------------------------------------------------------------------
+    CleanupStack::PopAndDestroy( context );
+    CleanupStack::PopAndDestroy( subscription );
+    }
+
+void MT_CFClient::MT_CCFClient_SubscribeAction4L( )
+    {
+    // x. Pre-conditions
+    // -------------------------------------------------------------------------
+    TInt err = KErrNone;
+    CCFActionSubscription* subscription = CCFActionSubscription::NewLC( );
+    CCFContextObject* context = CCFContextObject::NewLC( );
+
+    // Define contexts used in test-cfclient.rul
+    iClient->DefineContext( KContextSourceA, KContextTypeA, KPassSec );
+
+    // Set context to "incorrect" state
+    context->SetSourceL( KContextSourceA );
+    context->SetTypeL( KContextTypeA );
+    context->SetValueL( KContextValueB );
+    err = iClient->PublishContext ( *context );
+    EUNIT_ASSERT_DESC( err == KErrNone, "Publish context failed" );
+
+    // x. Define action
+    // -------------------------------------------------------------------------
+    err = iClient->DefineAction ( KActionA, KPassSec );
+    EUNIT_ASSERT_DESC( err == KErrNone, "Define action failed" );
+
+    // x. Delete client and re-initialize
+    // -------------------------------------------------------------------------
+    delete iClient;
+    iClient = NULL;
+    iClient = CCFClient::NewL( *this );
+
+    // x. Subscribe action
+    // -------------------------------------------------------------------------
+    subscription->SetActionIdentifierL( KActionA );
+    err = iClient->SubscribeAction( *subscription );
+    EUNIT_ASSERT_DESC( err == KErrNone, "Subscribe action failed" );
+
+    // x. Publish context and wait for action indication
+    // -------------------------------------------------------------------------
+    context->SetSourceL( KContextSourceA );
+    context->SetTypeL( KContextTypeA );
+    context->SetValueL( KContextValueA );
+    err = iClient->PublishContext ( *context );
+    EUNIT_ASSERT_DESC( err == KErrNone, "Publish context failed" );
+
+    // Wait for action indication
+    iCheckA = ETrue;
+    iWait->Start();
+
+    // x. Clean up
+    // -------------------------------------------------------------------------
+    CleanupStack::PopAndDestroy( context );
+    CleanupStack::PopAndDestroy( subscription );
+    }
+
+void MT_CFClient::MT_CCFClient_SubscribeActionFromDifferentClientsL( )
+    {
+    TInt err = KErrNone;
+    CCFActionSubscription* subscription = CCFActionSubscription::NewLC ( );
+    CCFContextObject* context = CCFContextObject::NewLC ( );
+
+    // Define actions used in test-cfclient.rul
+    iClient->DefineAction ( KActionA, KPassSec );
+    iClient->DefineAction ( KActionB, KPassSec );
+
+    // Define contexts used in test-cfclient.rul
+    iClient->DefineContext ( KContextSourceA, KContextTypeA, KPassSec );
+
+    // Subscribe both actions but from different clients
+    subscription->SetActionIdentifierL ( KActionA );
+    err = iClient->SubscribeAction ( *subscription );
+    EUNIT_ASSERT_DESC( err == KErrNone, "Incorrect SubscribeAction return value!" );
+
+    subscription->SetActionIdentifierL ( KActionB );
+    err = iAnotherClient->SubscribeAction ( *subscription );
+    EUNIT_ASSERT_DESC( err == KErrNone, "Incorrect SubscribeAction return value!" );
+
+    // Publish context [SourceA: TypeA: ValueA] and wait for action indication
+    context->SetSourceL ( KContextSourceA );
+    context->SetTypeL ( KContextTypeA );
+    context->SetValueL ( KContextValueA );
+    err = iClient->PublishContext ( *context );
+    EUNIT_ASSERT_DESC( err == KErrNone, "Incorrect PublishContext return value!" );
+    iCheckA = ETrue;
+    iWait->Start ( );
+
+    // Publish context [SourceA: TypeA: ValueB] and wait for action indications
+    context->SetSourceL ( KContextSourceA );
+    context->SetTypeL ( KContextTypeA );
+    context->SetValueL ( KContextValueB );
+    err = iAnotherClient->PublishContext ( *context );
+    EUNIT_ASSERT_DESC( err == KErrNone, "Incorrect PublishContext return value!" );
+    iCheckA = ETrue;
+    iCheckB = ETrue;
+    iWait->Start ( );
+
+    // Clean up
+    CleanupStack::PopAndDestroy ( context );
+    CleanupStack::PopAndDestroy ( subscription );
+    }
+
+void MT_CFClient::MT_CCFClient_SubscribeActionFromDifferentClients2L( )
+    {
+    TInt err = KErrNone;
+    CCFActionSubscription* subscription = CCFActionSubscription::NewLC ( );
+    CCFContextObject* context = CCFContextObject::NewLC ( );
+
+    // Define action used in test-cfclient.rul
+    iClient->DefineAction ( KActionA, KPassSec );
+
+    // Define contexts used in test-cfclient.rul
+    iClient->DefineContext ( KContextSourceA, KContextTypeA, KPassSec );
+
+    // Subscribe same action from different clients
+    subscription->SetActionIdentifierL ( KActionA );
+    err = iClient->SubscribeAction ( *subscription );
+    EUNIT_ASSERT_DESC( err == KErrNone, "Incorrect SubscribeAction return value!" );
+
+    err = iAnotherClient->SubscribeAction ( *subscription );
+    EUNIT_ASSERT_DESC( err == KErrNone, "Incorrect SubscribeAction return value!" );
+
+    iCheckB = EFalse;
+    iCountActionAIndications = ETrue;
+    iExpectedActionAIndicationCount = 2;
+    // Publish context [SourceA: TypeA: ValueA] and wait for action indications
+    context->SetSourceL ( KContextSourceA );
+    context->SetTypeL ( KContextTypeA );
+    context->SetValueL ( KContextValueA );
+    err = iClient->PublishContext ( *context );
+    EUNIT_ASSERT_DESC( err == KErrNone, "Incorrect PublishContext return value!" );
+    iCheckA = ETrue;
+    iWait->Start ( );
+    EUNIT_ASSERT_DESC( iExpectedActionAIndicationCount == 0, "Unexpected amount of action indications!" );
+    iCountActionAIndications = EFalse;
+
+    // Clean up
+    CleanupStack::PopAndDestroy ( context );
+    CleanupStack::PopAndDestroy ( subscription );
+    }
+
+void MT_CFClient::MT_CCFClient_SubscribeActionCombinedL( )
+    {
+    MT_CCFClient_SubscribeAction1L ( );
+    Wait( KSecond );
+    delete iClient;
+    iClient = NULL;
+    iClient = CCFClient::NewL( *this );
+
+    MT_CCFClient_SubscribeAction2L ( );
+    Wait( KSecond );
+    delete iClient;
+    iClient = NULL;
+    iClient = CCFClient::NewL( *this );
+
+    MT_CCFClient_SubscribeAction3L ( );
+    Wait( KSecond );
+    delete iClient;
+    iClient = NULL;
+    iClient = CCFClient::NewL( *this );
+
+    MT_CCFClient_SubscribeAction4L ( );
+    }
+
+void MT_CFClient::MT_CCFClient_UnsubscribeActionL( )
+    {
+    TInt err = KErrNone;
+    CCFActionSubscription* subscription = CCFActionSubscription::NewLC ( );
+    CCFContextObject* context = CCFContextObject::NewLC ( );
+
+    // Define actions used in test-cfclient.rul
+    iClient->DefineAction ( KActionA, KPassSec );
+    iClient->DefineAction ( KActionB, KPassSec );
+
+    // Define contexts used in test-cfclient.rul
+    iClient->DefineContext ( KContextSourceA, KContextTypeA, KPassSec );
+
+    // Subscribe both actions
+    subscription->SetActionIdentifierL ( KActionA );
+    err = iClient->SubscribeAction ( *subscription );
+    EUNIT_ASSERT_DESC( err == KErrNone, "Incorrect SubscribeAction return value!" );
+
+    subscription->SetActionIdentifierL ( KActionB );
+    err = iClient->SubscribeAction ( *subscription );
+    EUNIT_ASSERT_DESC( err == KErrNone, "Incorrect SubscribeAction return value!" );
+
+    // Publish context [SourceA: TypeA: ValueA] and wait for action indication
+    context->SetSourceL ( KContextSourceA );
+    context->SetTypeL ( KContextTypeA );
+    context->SetValueL ( KContextValueA );
+    err = iClient->PublishContext ( *context );
+    EUNIT_ASSERT_DESC( err == KErrNone, "Incorrect PublishContext return value!" );
+    iCheckA = ETrue;
+    iWait->Start ( );
+
+    // Publish context [SourceA: TypeA: ValueB] and wait for action indications
+    context->SetSourceL ( KContextSourceA );
+    context->SetTypeL ( KContextTypeA );
+    context->SetValueL ( KContextValueB );
+    err = iClient->PublishContext ( *context );
+    EUNIT_ASSERT_DESC( err == KErrNone, "Incorrect PublishContext return value!" );
+    iCheckA = ETrue;
+    iCheckB = ETrue;
+    iWait->Start ( );
+
+    // Unsubscribe actionA
+    subscription->SetActionIdentifierL ( KActionA );
+    err = iClient->UnsubscribeAction ( *subscription );
+    EUNIT_ASSERT_DESC( err == KErrNone, "Incorrect UnsubscribeAction return value!" );
+
+    // Publish context [SourceA: TypeA: ValueA], should not receive action indication
+    context->SetSourceL ( KContextSourceA );
+    context->SetTypeL ( KContextTypeA );
+    context->SetValueL ( KContextValueA );
+    err = iClient->PublishContext ( *context );
+    EUNIT_ASSERT_DESC( err == KErrNone, "Incorrect PublishContext return value!" );
+    iCheckA = ETrue;
+    Wait ( KDelay );
+    EUNIT_ASSERT_DESC( iCheckA, "Action indication received!" );
+    iCheckA = EFalse;
+
+    // Publish context [SourceA: TypeA: ValueB] and wait for action indication
+    context->SetSourceL ( KContextSourceA );
+    context->SetTypeL ( KContextTypeA );
+    context->SetValueL ( KContextValueB );
+    err = iClient->PublishContext ( *context );
+    EUNIT_ASSERT_DESC( err == KErrNone, "Incorrect PublishContext return value!" );
+    iCheckB = ETrue;
+    iWait->Start ( );
+
+    // Unsubscribe actionB
+    subscription->SetActionIdentifierL ( KActionB );
+    err = iClient->UnsubscribeAction ( *subscription );
+    EUNIT_ASSERT_DESC( err == KErrNone, "Incorrect UnsubscribeAction return value!" );
+
+    // Publish context [SourceA: TypeA: ValueB], should not reveice action indication
+    context->SetSourceL ( KContextSourceA );
+    context->SetTypeL ( KContextTypeA );
+    context->SetValueL ( KContextValueB );
+    err = iClient->PublishContext ( *context );
+    EUNIT_ASSERT_DESC( err == KErrNone, "Incorrect PublishContext return value!" );
+    iCheckB = ETrue;
+    Wait ( KDelay );
+    EUNIT_ASSERT_DESC( iCheckB, "Action indication received!" );
+    iCheckB = EFalse;
+
+    // subscribe actionA again
+    subscription->SetActionIdentifierL ( KActionA );
+    err = iClient->SubscribeAction ( *subscription );
+    EUNIT_ASSERT_DESC( err == KErrNone, "Incorrect SubscribeAction return value!" );
+
+    // Publish context [SourceA: TypeA: ValueA] and wait for action indication
+    context->SetSourceL ( KContextSourceA );
+    context->SetTypeL ( KContextTypeA );
+    context->SetValueL ( KContextValueA );
+    err = iClient->PublishContext ( *context );
+    EUNIT_ASSERT_DESC( err == KErrNone, "Incorrect PublishContext return value!" );
+    iCheckA = ETrue;
+    iWait->Start ( );
+
+    // subscribe actionB again
+    subscription->SetActionIdentifierL ( KActionB );
+    err = iClient->SubscribeAction ( *subscription );
+    EUNIT_ASSERT_DESC( err == KErrNone, "Incorrect SubscribeAction return value!" );
+
+    // Publish context [SourceA: TypeA: ValueB] and wait for action indications
+    context->SetSourceL ( KContextSourceA );
+    context->SetTypeL ( KContextTypeA );
+    context->SetValueL ( KContextValueB );
+    err = iClient->PublishContext ( *context );
+    EUNIT_ASSERT_DESC( err == KErrNone, "Incorrect PublishContext return value!" );
+    iCheckA = ETrue;
+    iCheckB = ETrue;
+    iWait->Start ( );
+
+    // Clean up
+    CleanupStack::PopAndDestroy ( context );
+    CleanupStack::PopAndDestroy ( subscription );
+    }
+
+void MT_CFClient::MT_CCFClient_RegisterScriptL( )
+    {
+    TInt err;
+
+    // Define context
+    CCFContextObject* co = CCFContextObject::NewLC ( );
+    co->SetSourceL (_L("RegisterScriptSource") );
+    co->SetTypeL (_L("RegisterScriptType") );
+    err = iClient->DefineContext ( co->Source ( ), co->Type ( ), KPassSec );
+    //EUNIT_ASSERT( err == KErrNone );
+
+    // define context with no access
+    err = iClient->DefineContext ( _L("RegisterScriptSource"),
+    _L("RegisterScriptTypeNoAccess"), KFailSec );
+    //EUNIT_ASSERT( err == KErrNone );
+
+    // Define action
+    iClient->DefineAction ( _L("RegisterScriptAction"), KPassSec );
+
+    // Define action with no access
+    iClient->DefineAction ( _L("RegisterScriptActionNoAccess"), KFailSec );
+
+    TInt scriptId;
+
+    // 1. registering script fails because no context defined
+    err = iClient->RegisterScript (
+    _L("z:\\data\\cftestdata\\testscripts\\test-registerscript-nocontextdefined.xml"),
+    scriptId );
+    EUNIT_ASSERT_DESC( err == KErrNotFound, "No error when registering script!" );
+
+    // 2. registering script fails because no action defined
+    err = iClient->RegisterScript (
+    _L("z:\\data\\cftestdata\\testscripts\\test-registerscript-noactiondefined.xml"),
+    scriptId );
+    EUNIT_ASSERT_DESC( err == KErrNotFound, "No error when registering script!" );
+
+    // 3. registering script fails because no capabilities
+    err = iClient->RegisterScript (
+    _L("z:\\data\\cftestdata\\testscripts\\test-registerscript-nocontextaccess.xml"),
+    scriptId );
+    EUNIT_ASSERT_DESC( err == KErrPermissionDenied, "No error when registering script!" );
+
+    // 4. registering script fails because no action defined
+    err = iClient->RegisterScript (
+    _L("z:\\data\\cftestdata\\testscripts\\test-registerscript-noactionaccess.xml"),
+    scriptId );
+    EUNIT_ASSERT_DESC( err == KErrPermissionDenied, "No error when registering script!" );
+
+    // 5. registering script succeeds
+    err = iClient->RegisterScript (
+    _L("z:\\data\\cftestdata\\testscripts\\test-registerscript.xml"),
+    scriptId );
+    EUNIT_ASSERT_DESC( err == KErrNone, "Error when registering script!" );
+
+    // Subscribe both actions
+    CCFActionSubscription* subscription = CCFActionSubscription::NewLC ( );
+    subscription->SetActionIdentifierL ( _L("RegisterScriptAction") );
+    err = iClient->SubscribeAction ( *subscription );
+    EUNIT_ASSERT_DESC( err == KErrNone,
+        "Incorrect SubscribeAction return value!" );
+
+    // 4. test that we will get action indications
+    co->SetValueL (_L("RegisterScriptValue") );
+    err = iClient->PublishContext ( *co );
+    EUNIT_ASSERT_DESC( err == KErrNone,
+        "Incorrect PublishContext return value!" );
+
+    iCheckRegisterScriptAction = ETrue;
+    iWait->Start ( );
+
+    CleanupStack::PopAndDestroy ( subscription );
+    CleanupStack::PopAndDestroy ( co );
+
+    // 6. Deregister script
+
+    err = iClient->DeregisterScript ( scriptId );
+    EUNIT_ASSERT_DESC( err == KErrNone, "Deregistering script caused error!" );
+
+    }
+
+void MT_CFClient::MT_CCFClient_RegisterScriptDesL( )
+    {
+    TInt err;
+
+    // Define context
+    CCFContextObject* co = CCFContextObject::NewLC ( );
+    co->SetSourceL (_L("RegisterScriptSource") );
+    co->SetTypeL (_L("RegisterScriptType") );
+    err = iClient->DefineContext ( co->Source ( ), co->Type ( ), KPassSec );
+    //EUNIT_ASSERT( err == KErrNone );
+
+    // define context with no access
+    err = iClient->DefineContext ( _L("RegisterScriptSource"),
+    _L("RegisterScriptTypeNoAccess"), KFailSec );
+    //EUNIT_ASSERT( err == KErrNone );
+
+    // Define action
+    iClient->DefineAction ( _L("RegisterScriptAction"), KPassSec );
+
+    // Define action with no access
+    iClient->DefineAction ( _L("RegisterScriptActionNoAccess"), KFailSec );
+
+    TInt scriptId;
+
+    // 1. registering script fails because no context defined
+    HBufC8* script = LoadScriptFromFile (_L("test-registerscript-nocontextdefined.xml") );
+    err = iClient->RegisterScript (
+    _L("test-registerscript-nocontextdefined.xml"), *script, scriptId );
+    EUNIT_ASSERT_DESC( err == KErrNotFound, "No error when registering script!" );
+    delete script;
+    script = NULL;
+
+    // 2. registering script fails because no action defined
+    script = LoadScriptFromFile (_L("test-registerscript-noactiondefined.xml") );
+    err = iClient->RegisterScript (
+    _L("test-registerscript-noactiondefined.xml"), *script, scriptId );
+    EUNIT_ASSERT_DESC( err == KErrNotFound, "No error when registering script!" );
+    delete script;
+    script = NULL;
+
+    // 3. registering script fails because no capabilities
+    script = LoadScriptFromFile (_L("test-registerscript-nocontextaccess.xml") );
+    err = iClient->RegisterScript (
+    _L("test-registerscript-nocontextaccess.xml"), *script, scriptId );
+    EUNIT_ASSERT_DESC( err == KErrPermissionDenied, "No error when registering script!" );
+    delete script;
+    script = NULL;
+
+    // 4. registering script fails because no action defined
+    script = LoadScriptFromFile (_L("test-registerscript-noactionaccess.xml") );
+    err = iClient->RegisterScript (
+    _L("test-registerscript-noactionaccess.xml"), *script, scriptId );
+    EUNIT_ASSERT_DESC( err == KErrPermissionDenied, "No error when registering script!" );
+    delete script;
+    script = NULL;
+
+    // 5. registering script succeeds
+    script = LoadScriptFromFile (_L("test-registerscript.xml") );
+    err = iClient->RegisterScript (
+    _L("test-registerscript.xml"), *script, scriptId );
+    EUNIT_ASSERT_DESC( err == KErrNone, "Error when registering script!" );
+    delete script;
+    script = NULL;
+
+    // Subscribe both actions
+    CCFActionSubscription* subscription = CCFActionSubscription::NewLC ( );
+    subscription->SetActionIdentifierL ( _L("RegisterScriptAction") );
+    err = iClient->SubscribeAction ( *subscription );
+    EUNIT_ASSERT_DESC( err == KErrNone,
+        "Incorrect SubscribeAction return value!" );
+
+    // 6. test that we will get action indications
+
+    co->SetValueL (_L("RegisterScriptValue") );
+    err = iClient->PublishContext ( *co );
+    EUNIT_ASSERT_DESC( err == KErrNone,
+        "Incorrect PublishContext return value!" );
+
+    iCheckRegisterScriptAction = ETrue;
+    iWait->Start ( );
+
+    CleanupStack::PopAndDestroy ( subscription );
+    CleanupStack::PopAndDestroy ( co );
+
+    // 7. Deregister script
+
+    err = iClient->DeregisterScript ( scriptId );
+    EUNIT_ASSERT_DESC( err == KErrNone, "Deregistering script caused error!" );
+    }
+
+void MT_CFClient::MT_CCFClient_DeregisterScriptL( )
+    {
+    // 1. Try to remove script we did not register -> should fail
+    TInt err = iClient->DeregisterScript ( 1 );
+    EUNIT_ASSERT_DESC( err != KErrNone,
+        "Succeeded to deregister script loaded by CF/registered by others" );
+    }
+
+void MT_CFClient::MT_CCFClient_SaveContextSourceSettingL( )
+    {
+    // 1. Install setting succeeds
+    TInt err = iClient->SaveContextSourceSetting (
+    _L("z:\\data\\cftestdata\\testsettings\\testcontextsourcesetting3.xml"),
+    KTestContextSourcePluginImplUid );
+    EUNIT_ASSERT_DESC( err == KErrNone, "Error when installing settings3!" );
+
+    TBool
+        fileExists = BaflUtils::FileExists (
+            iFs,
+            _L( "C:\\Private\\10282BC4\\Settings\\10002001\\20000fb1_testcontextsourcesetting3.xml" ) );
+    EUNIT_ASSERT_DESC( fileExists, "Error, cannot find settings3 file after install!" );
+
+    // 2. Uninstall setting succeeds
+    err = iClient->DeleteContextSourceSetting (
+    _L("testcontextsourcesetting3.xml"),
+    KTestContextSourcePluginImplUid );
+    EUNIT_ASSERT_DESC( err == KErrNone, "Error when uninstalling settings3!" );
+
+    fileExists = BaflUtils::FileExists (
+        iFs,
+        _L( "C:\\Private\\10282BC4\\Settings\\10002001\\20000fb1_testcontextsourcesetting3.xml" ) );
+    EUNIT_ASSERT_DESC( !fileExists, "Error, file settings3 still exists after uninstall!" );
+
+    if ( iTestDelay )
+        {
+        iTestDelay->Start ( 100000 ); // 100 ms
+        }
+    }
+
+void MT_CFClient::MT_CCFClient_SaveContextSourceSetting2L( )
+    {
+    // 1. Installing bogus setting file, fails
+    TInt
+        err = iClient->SaveContextSourceSetting (
+        _L("z:\\data\\cftestdata\\testsettings\\testcontext_source_setting_4.xml"),
+        KTestContextSourcePluginImplUid );
+    EUNIT_ASSERT_DESC( err == KErrNotFound, "Error when installing settings_4!" );
+
+    TBool
+        fileExists = BaflUtils::FileExists (
+            iFs,
+            _L( "C:\\Private\\10282BC4\\Settings\\10002001\\20000fb1_testcontext_source_setting_4.xml" ) );
+    EUNIT_ASSERT_DESC( !fileExists, "Error, settings_4 file exists after install!" );
+
+    // 2. Installing existing setting file not allowed by the plugin, fails
+    err = iClient->SaveContextSourceSetting (
+    _L("z:\\data\\cftestdata\\testsettings\\testcontextsourcesetting4.xml"),
+    KTestContextSourcePluginImplUid );
+    EUNIT_ASSERT_DESC( err == KErrPermissionDenied, "Error when installing settings4!" );
+
+    fileExists = BaflUtils::FileExists (
+        iFs,
+        _L( "C:\\Private\\10282BC4\\Settings\\10002001\\20000fb1_testcontextsourcesetting4.xml" ) );
+    EUNIT_ASSERT_DESC( !fileExists, "Error, settings4 file exists after install!" );
+
+    // 3. Installing existing setting file for bogus plugin, fails
+    err = iClient->SaveContextSourceSetting (
+    _L("z:\\data\\cftestdata\\testsettings\\testcontextsourcesetting4.xml"),
+    KBogusContextSourcePluginImplUid );
+    EUNIT_ASSERT_DESC( err == KErrBadHandle, "Error when installing settings4 for bogus source!" );
+
+    // 4. Installing setting passing from CheckValidity but leaving from
+    //    UpdateSettingsL because of invalid settings!
+    //    This should not happen for real source plugins.
+    err = iClient->SaveContextSourceSetting (
+    _L("z:\\data\\cftestdata\\testsettings\\testcontextsourcesetting7.xml"),
+    KTestContextSourcePluginImplUid );
+    EUNIT_ASSERT_DESC( err == KErrGeneral, "Error when installing settings7!" );
+
+    fileExists = BaflUtils::FileExists (
+        iFs,
+        _L( "C:\\Private\\10282BC4\\Settings\\10002001\\20000fb1_testcontextsourcesetting7.xml" ) );
+    EUNIT_ASSERT_DESC( fileExists, "Error, cannot find settings7 file after install!" );
+
+    // 5. Uninstall setting succeeds, must do this because setting file was
+    //    stored by the above failing call.
+    err = iClient->DeleteContextSourceSetting (
+    _L("testcontextsourcesetting7.xml"),
+    KTestContextSourcePluginImplUid );
+    EUNIT_ASSERT_DESC( err == KErrNone, "Error when uninstalling settings3!" );
+
+    fileExists = BaflUtils::FileExists (
+        iFs,
+        _L( "C:\\Private\\10282BC4\\Settings\\10002001\\20000fb1_testcontextsourcesetting7.xml" ) );
+    EUNIT_ASSERT_DESC( !fileExists, "Error, file settings3 still exists after uninstall!" );
+
+    if ( iTestDelay )
+        {
+        iTestDelay->Start ( 100000 ); // 100 ms
+        }
+    }
+
+void MT_CFClient::MT_CCFClient_DeleteContextSourceSettingL( )
+    {
+    // 1. Uninstall bogus setting, fails
+    TBool
+        fileExists = BaflUtils::FileExists (
+            iFs,
+            _L( "C:\\Private\\10282BC4\\Settings\\10002001\\20000fb1_testcontext_source_setting3.xml" ) );
+    EUNIT_ASSERT_DESC( !fileExists, "Error, file testcontext_source_setting3 exists!" );
+
+    TInt err = iClient->DeleteContextSourceSetting (
+    _L("testcontext_source_setting3.xml"),
+    KTestContextSourcePluginImplUid );
+    EUNIT_ASSERT_DESC( err == KErrNotFound, "Error when uninstalling bogus setting!" );
+
+    // 2. Uninstall setting from bogus source, fails
+    err = iClient->DeleteContextSourceSetting (
+    _L("testcontextsourcesetting3.xml"),
+    KBogusContextSourcePluginImplUid );
+    EUNIT_ASSERT_DESC( err == KErrBadHandle, "Error when uninstalling setting from bogus source!" );
+
+    if ( iTestDelay )
+        {
+        iTestDelay->Start ( 100000 ); // 100 ms
+        }
+    }
+
+void MT_CFClient::MT_CCFClient_DeleteContextSourceSetting2L( )
+    {
+    // 1. Install setting succeeds
+    TInt err = iClient->SaveContextSourceSetting (
+    _L("z:\\data\\cftestdata\\testsettings\\testcontextsourcesetting3.xml"),
+    KTestContextSourcePluginImplUid );
+    EUNIT_ASSERT_DESC( err == KErrNone, "Error when installing settings3!" );
+
+    TBool
+        fileExists = BaflUtils::FileExists (
+            iFs,
+            _L( "C:\\Private\\10282BC4\\Settings\\10002001\\20000fb1_testcontextsourcesetting3.xml" ) );
+    EUNIT_ASSERT_DESC( fileExists, "Error, cannot find settings3 file after install!" );
+
+    // 2. Install 2nd setting succeeds
+    err = iClient->SaveContextSourceSetting (
+    _L("z:\\data\\cftestdata\\testsettings\\testcontextsourcesetting5.xml"),
+    KTestContextSourcePluginImplUid );
+    EUNIT_ASSERT_DESC( err == KErrNone, "Error when installing settings5!" );
+
+    fileExists = BaflUtils::FileExists (
+        iFs,
+        _L( "C:\\Private\\10282BC4\\Settings\\10002001\\20000fb1_testcontextsourcesetting5.xml" ) );
+    EUNIT_ASSERT_DESC( fileExists, "Error, cannot find settings5 file after install!" );
+
+    // 3. Uninstall all client settings succeeds
+    err = iClient->DeleteContextSourceSettings (KTestContextSourcePluginImplUid );
+    EUNIT_ASSERT_DESC( err == KErrNone, "Error when uninstalling all client installed settings!" );
+
+    fileExists = BaflUtils::FileExists (
+        iFs,
+        _L( "C:\\Private\\10282BC4\\Settings\\10002001\\20000fb1_testcontextsourcesetting3.xml" ) );
+    EUNIT_ASSERT_DESC( !fileExists, "Error, file settings3 still exists after uninstall!" );
+
+    fileExists = BaflUtils::FileExists (
+        iFs,
+        _L( "C:\\Private\\10282BC4\\Settings\\10002001\\20000fb1_testcontextsourcesetting5.xml" ) );
+    EUNIT_ASSERT_DESC( !fileExists, "Error, file settings5 still exists after uninstall!" );
+
+    // 4. Uninstall all client settings, no exists, fails
+    err = iClient->DeleteContextSourceSettings (KTestContextSourcePluginImplUid );
+    EUNIT_ASSERT_DESC( err == KErrNotFound, "Error when uninstalling all client installed settings!" );
+
+    if ( iTestDelay )
+        {
+        iTestDelay->Start ( 100000 ); // 100 ms
+        }
+    }
+
+void MT_CFClient::MT_CCFClient_UpgradeContextSourceSettingL( )
+    {
+    // 1. Install setting succeeds
+    TInt err = iClient->SaveContextSourceSetting (
+    _L("z:\\data\\cftestdata\\testsettings\\testcontextsourcesetting3.xml"),
+    KTestContextSourcePluginImplUid );
+    EUNIT_ASSERT_DESC( err == KErrNone, "Error when installing settings3!" );
+
+    TBool
+        fileExists = BaflUtils::FileExists (
+            iFs,
+            _L( "C:\\Private\\10282BC4\\Settings\\10002001\\20000fb1_testcontextsourcesetting3.xml" ) );
+    EUNIT_ASSERT_DESC( fileExists, "Error, cannot find settings3 file after install!" );
+
+    // 2. Upgrade setting succeeds
+    err = iClient->SaveContextSourceSetting (
+    _L("z:\\data\\cftestdata\\testsettings\\settingupgrade\\testcontextsourcesetting3.xml"),
+    KTestContextSourcePluginImplUid );
+    EUNIT_ASSERT_DESC( err == KErrNone, "Error when upgrading settings3!" );
+
+    fileExists = BaflUtils::FileExists (
+        iFs,
+        _L( "C:\\Private\\10282BC4\\Settings\\10002001\\20000fb1_testcontextsourcesetting3.xml" ) );
+    EUNIT_ASSERT_DESC( fileExists, "Error, cannot find settings3 file after install!" );
+
+    // 3. Uninstall setting succeeds
+    err = iClient->DeleteContextSourceSetting (
+    _L("testcontextsourcesetting3.xml"),
+    KTestContextSourcePluginImplUid );
+    EUNIT_ASSERT_DESC( err == KErrNone, "Error when uninstalling settings3!" );
+
+    fileExists = BaflUtils::FileExists (
+        iFs,
+        _L( "C:\\Private\\10282BC4\\Settings\\10002001\\20000fb1_testcontextsourcesetting3.xml" ) );
+    EUNIT_ASSERT_DESC( !fileExists, "Error, file settings3 still exists after uninstall!" );
+
+    if ( iTestDelay )
+        {
+        iTestDelay->Start ( 100000 ); // 100 ms
+        }
+    }
+
+void MT_CFClient::MT_CCFClient_SaveScriptL( )
+    {
+    // Change timestamp to yesterday
+    TTime currentTime;
+    currentTime.UniversalTime();
+    TDateTime dateTime = currentTime.DateTime();
+    dateTime.SetHour( dateTime.Hour() - 1 );
+
+    // Update new time
+    TTime entryTime( dateTime );
+
+    CCFContextObject* co = CCFContextObject::NewLC ( );
+    CCFActionSubscription* actionSubscription = CCFActionSubscription::NewLC ( );
+
+    // Setup preconditions
+    // -------------------------------------------------------------------------
+    co->SetSourceL ( _L("test") );
+    co->SetTypeL (_L("save.script") );
+    TInt err = iClient->DefineContext ( co->Source ( ), co->Type ( ), KPassSec );
+    EUNIT_ASSERT_DESC( err == KErrNone || err == KErrAlreadyExists,
+        "Define context failed" );
+
+    co->SetSourceL ( _L("test") );
+    co->SetTypeL (_L("save.script.2") );
+    err = iClient->DefineContext ( co->Source ( ), co->Type ( ), KPassSec );
+    EUNIT_ASSERT_DESC( err == KErrNone || err == KErrAlreadyExists,
+        "Define context failed" );
+
+    err = iClient->DefineAction ( _L("saveScript"), KPassSec );
+    EUNIT_ASSERT_DESC( err == KErrNone || err == KErrAlreadyExists,
+        "Define action failed" );
+
+    actionSubscription->SetActionIdentifierL ( _L("saveScript") );
+    err = iClient->SubscribeAction ( *actionSubscription );
+    EUNIT_ASSERT_DESC( err == KErrNone, "Subscribe action failed" );
+
+    // x. Save script with full path
+    // -------------------------------------------------------------------------
+    TInt scriptId = KErrNotFound;
+    err = iClient->SaveScript (
+    _L("z:\\data\\cftestdata\\testscripts\\test-saveScript.xml"),
+    scriptId );
+    EUNIT_ASSERT_DESC( err == KErrNone, "Save script failed" );
+    EUNIT_ASSERT_DESC( scriptId > 0, "Script id incorrect" );
+    TBool exists = BaflUtils::FileExists ( iFs,
+    _L("c:\\private\\10282bc4\\rules\\20000fb1\\test-saveScript.rul") );
+    EUNIT_ASSERT_DESC( exists, "Script not saved" );
+
+    co->SetSourceL ( _L("test") );
+    co->SetTypeL (_L("save.script") );
+    co->SetValueL ( _L("trigger") );
+    err = iClient->PublishContext ( *co );
+    EUNIT_ASSERT_DESC( err == KErrNone, "Publish context failed" );
+    iCheckCustomAction = ETrue;
+    iCustomActionId = _L("saveScript" );
+    CCFKeyValuePair* keyValue = CCFKeyValuePair::NewLC (
+    _L("id"), _L("triggered") );
+    iCustomActionParams.AppendL ( keyValue );
+    CleanupStack::Pop ( keyValue );
+    iWait->Start ( );
+
+    // x. Save the same script and check that the time stamp changes
+    // -------------------------------------------------------------------------
+    err = iFs.SetModified(
+        _L("c:\\private\\10282bc4\\rules\\20000fb1\\test-saveScript.rul"), entryTime );
+    TEntry oldEntry;
+    err = iFs.Entry (
+        _L("c:\\private\\10282bc4\\rules\\20000fb1\\test-saveScript.rul"),
+        oldEntry );
+    EUNIT_ASSERT_DESC( err == KErrNone, "Entry get failed" );
+
+    User::After( 100000 );
+    err = iClient->SaveScript (
+        _L("z:\\data\\cftestdata\\testscripts\\test-saveScript.xml"),
+        scriptId );
+    EUNIT_ASSERT_DESC( err == KErrNone, "Save script failed" );
+    EUNIT_ASSERT_DESC( scriptId > 0, "Script id incorrect" );
+    exists = BaflUtils::FileExists ( iFs,
+        _L("c:\\private\\10282bc4\\rules\\20000fb1\\test-saveScript.rul") );
+    EUNIT_ASSERT_DESC( exists, "Script not saved" );
+
+    TEntry newEntry;
+    err = iFs.Entry (
+        _L("c:\\private\\10282bc4\\rules\\20000fb1\\test-saveScript.rul"),
+        newEntry );
+    EUNIT_ASSERT_DESC( err == KErrNone, "Entry get failed" );
+    EUNIT_ASSERT_DESC( oldEntry.iModified < newEntry.iModified,
+        "Script not updated" );
+
+    co->SetSourceL ( _L("test") );
+    co->SetTypeL (_L("save.script") );
+    co->SetValueL ( _L("trigger") );
+    err = iClient->PublishContext ( *co );
+    EUNIT_ASSERT_DESC( err == KErrNone, "Publish context failed" );
+    iCheckCustomAction = ETrue;
+    iCustomActionId = _L("saveScript" );
+    keyValue = CCFKeyValuePair::NewLC ( _L("id"), _L("triggered") );
+    iCustomActionParams.AppendL ( keyValue );
+    CleanupStack::Pop ( keyValue );
+    iWait->Start ( );
+
+    // x. Save a script update with the same name
+    // -------------------------------------------------------------------------
+    HBufC8* script = LoadScriptFromFile ( _L("test-saveScript2.xml") );
+    User::LeaveIfNull ( script );
+    CleanupStack::PushL ( script );
+
+    err = iClient->SaveScript ( _L("test-saveScript"), *script, scriptId );
+    EUNIT_ASSERT_DESC( err == KErrNone, "Save script failed" );
+
+    co->SetSourceL ( _L("test") );
+    co->SetTypeL (_L("save.script.2") );
+    co->SetValueL ( _L("trigger") );
+    err = iClient->PublishContext ( *co );
+    EUNIT_ASSERT_DESC( err == KErrNone, "Publish context failed" );
+    iCheckCustomAction = ETrue;
+    iCustomActionId = _L("saveScript" );
+    keyValue = CCFKeyValuePair::NewLC ( _L("id"), _L("updateTriggered") );
+    iCustomActionParams.AppendL ( keyValue );
+    CleanupStack::Pop ( keyValue );
+    iWait->Start ( );
+
+    CleanupStack::PopAndDestroy ( script );
+
+    // x. Save a script update with the same name (regression)
+    // -------------------------------------------------------------------------
+    script = LoadScriptFromFile ( _L("test-saveScript.xml") );
+    User::LeaveIfNull ( script );
+    CleanupStack::PushL ( script );
+
+    err = iClient->SaveScript ( _L("test-saveScript"), *script, scriptId );
+    EUNIT_ASSERT_DESC( err == KErrNone, "Save script failed" );
+
+    co->SetSourceL ( _L("test") );
+    co->SetTypeL (_L("save.script") );
+    co->SetValueL ( _L("trigger") );
+    err = iClient->PublishContext ( *co );
+    EUNIT_ASSERT_DESC( err == KErrNone, "Publish context failed" );
+    iCheckCustomAction = ETrue;
+    iCustomActionId = _L("saveScript" );
+    keyValue = CCFKeyValuePair::NewLC ( _L("id"), _L("triggered") );
+    iCustomActionParams.AppendL ( keyValue );
+    CleanupStack::Pop ( keyValue );
+    iWait->Start ( );
+
+    CleanupStack::PopAndDestroy ( script );
+
+    // x. Save a new script via full path
+    // -------------------------------------------------------------------------
+    scriptId = KErrNotFound;
+    err = iClient->SaveScript (
+        _L("z:\\data\\cftestdata\\testscripts\\test-saveScript2.xml"),
+        scriptId );
+    EUNIT_ASSERT_DESC( err == KErrNone, "Save script failed" );
+    EUNIT_ASSERT_DESC( scriptId > 0, "Script id incorrect" );
+    exists = BaflUtils::FileExists ( iFs,
+        _L("c:\\private\\10282bc4\\rules\\20000fb1\\test-saveScript2.rul") );
+    EUNIT_ASSERT_DESC( exists, "Script not saved" );
+
+    co->SetSourceL ( _L("test") );
+    co->SetTypeL (_L("save.script.2") );
+    co->SetValueL ( _L("trigger") );
+    err = iClient->PublishContext ( *co );
+    EUNIT_ASSERT_DESC( err == KErrNone, "Publish context failed" );
+    iCheckCustomAction = ETrue;
+    iCustomActionId = _L("saveScript" );
+    keyValue = CCFKeyValuePair::NewLC (
+    _L("id"), _L("updateTriggered") );
+    iCustomActionParams.AppendL ( keyValue );
+    CleanupStack::Pop ( keyValue );
+    iWait->Start ( );
+
+    // x. Save script with incorrect parameters
+    // -------------------------------------------------------------------------
+    err = iClient->SaveScript ( KNullDesC, scriptId );
+    EUNIT_ASSERT_DESC( err != KErrNone, "Save script failed" );
+    err = iClient->SaveScript ( KNullDesC, KNullDesC8, scriptId );
+    EUNIT_ASSERT_DESC( err != KErrNone, "Save script failed" );
+
+    // x. Delete all scripts, register script and then try to save the script
+    // -------------------------------------------------------------------------
+    err = iClient->DeleteScripts();
+    EUNIT_ASSERT_DESC( err == KErrNone, "Delete scripts failed" );
+    exists = BaflUtils::FolderExists( iFs,
+        _L("c:\\private\\10282bc4\\rules\\20000fb1\\") );
+    EUNIT_ASSERT_DESC( !exists, "Delete scripts failed" );
+
+    err = iClient->RegisterScript(
+        _L("z:\\data\\cftestdata\\testscripts\\test-saveScript.xml"),
+        scriptId );
+    EUNIT_ASSERT_DESC( err == KErrNone, "Register script failed" );
+    EUNIT_ASSERT_DESC( scriptId > 0, "Register script failed" );
+
+    TInt previousScriptId = scriptId;
+    err = iClient->SaveScript(
+        _L("z:\\data\\cftestdata\\testscripts\\test-saveScript.xml"),
+        scriptId );
+    EUNIT_ASSERT_DESC( err == KErrNone, "Save script failed" );
+    EUNIT_ASSERT_DESC( scriptId > 0, "Save script failed" );
+    EUNIT_ASSERT_DESC( scriptId == previousScriptId, "Save script failed" );
+
+    co->SetSourceL ( _L("test") );
+    co->SetTypeL (_L("save.script") );
+    co->SetValueL ( _L("trigger") );
+    err = iClient->PublishContext ( *co );
+    EUNIT_ASSERT_DESC( err == KErrNone, "Publish context failed" );
+    iCheckCustomAction = ETrue;
+    iCustomActionId = _L("saveScript" );
+    keyValue = CCFKeyValuePair::NewLC ( _L("id"), _L("triggered") );
+    iCustomActionParams.AppendL ( keyValue );
+    CleanupStack::Pop ( keyValue );
+    iWait->Start ( );
+
+    // Clean up
+    // -------------------------------------------------------------------------
+    CleanupStack::PopAndDestroy ( actionSubscription );
+    CleanupStack::PopAndDestroy ( co );
+    }
+
+void MT_CFClient::MT_CCFClient_DeleteScriptL( )
+    {
+    CCFContextObject* co = CCFContextObject::NewLC( );
+    CCFActionSubscription* actionSubscription = CCFActionSubscription::NewLC( );
+
+    // Setup preconditions
+    // -------------------------------------------------------------------------
+    co->SetSourceL ( _L("test") );
+    co->SetTypeL (_L("save.script") );
+    TInt err = iClient->DefineContext ( co->Source ( ), co->Type ( ), KPassSec );
+    EUNIT_ASSERT_DESC( err == KErrNone || err == KErrAlreadyExists,
+        "Define context failed" );
+
+    co->SetSourceL ( _L("test") );
+    co->SetTypeL (_L("save.script.2") );
+    err = iClient->DefineContext ( co->Source ( ), co->Type ( ), KPassSec );
+    EUNIT_ASSERT_DESC( err == KErrNone || err == KErrAlreadyExists,
+        "Define context failed" );
+
+    err = iClient->DefineAction ( _L("saveScript"), KPassSec );
+    EUNIT_ASSERT_DESC( err == KErrNone || err == KErrAlreadyExists,
+        "Define action failed" );
+
+    actionSubscription->SetActionIdentifierL ( _L("saveScript") );
+    err = iClient->SubscribeAction ( *actionSubscription );
+    EUNIT_ASSERT_DESC( err == KErrNone, "Subscribe action failed" );
+
+    TInt scriptId = KErrNotFound;
+    err = iClient->SaveScript (
+    _L("z:\\data\\cftestdata\\testscripts\\test-saveScript.xml"),
+    scriptId );
+    EUNIT_ASSERT_DESC( err == KErrNone, "Save script failed" );
+    TBool exists = BaflUtils::FileExists ( iFs,
+    _L("c:\\private\\10282bc4\\rules\\20000fb1\\test-saveScript.rul") );
+    EUNIT_ASSERT_DESC( exists, "Script not saved" );
+
+    err = iClient->SaveScript (
+    _L("z:\\data\\cftestdata\\testscripts\\test-saveScript2.xml"),
+    scriptId );
+    EUNIT_ASSERT_DESC( err == KErrNone, "Save script failed" );
+    exists = BaflUtils::FileExists ( iFs,
+    _L("c:\\private\\10282bc4\\rules\\20000fb1\\test-saveScript2.rul") );
+    EUNIT_ASSERT_DESC( exists, "Script not saved" );
+
+    // x. Delete script and check that action is not indicated
+    // -------------------------------------------------------------------------
+    err = iClient->DeleteScript ( _L("test-saveScript") );
+    EUNIT_ASSERT_DESC( err == KErrNone, "Delete script failed" );
+    exists = BaflUtils::FileExists ( iFs,
+    _L("c:\\private\\10282bc4\\rules\\20000fb1\\test-saveScript.rul") );
+    EUNIT_ASSERT_DESC( !exists, "Script not deleted" );
+
+    co->SetSourceL ( _L("test") );
+    co->SetTypeL (_L("save.script") );
+    co->SetValueL ( _L("trigger") );
+    err = iClient->PublishContext ( *co );
+    EUNIT_ASSERT_DESC( err == KErrNone, "Publish context failed" );
+    iCheckCustomAction = ETrue;
+    iCustomActionId = _L("saveScript" );
+    CCFKeyValuePair* keyValue = CCFKeyValuePair::NewLC ( _L("id"), _L("triggered") );
+    iCustomActionParams.AppendL ( keyValue );
+    CleanupStack::Pop ( keyValue );
+    Wait ( KDelay );
+    EUNIT_ASSERT_DESC( iCheckCustomAction, "Delete script failed" );
+
+    // x. Delete script and check that action is not indicated
+    // -------------------------------------------------------------------------
+    err = iClient->DeleteScript ( _L("test-saveScript2") );
+    EUNIT_ASSERT_DESC( err == KErrNone, "Delete script failed" );
+    exists = BaflUtils::FileExists ( iFs,
+    _L("c:\\private\\10282bc4\\rules\\20000fb1\\test-saveScript2.rul") );
+    EUNIT_ASSERT_DESC( !exists, "Script not deleted" );
+    exists = BaflUtils::FolderExists ( iFs, _L("c:\\private\\10282bc4\\rules\\20000fb1\\") );
+    EUNIT_ASSERT_DESC( !exists, "Delete script failed" );
+
+    co->SetSourceL ( _L("test") );
+    co->SetTypeL (_L("save.script.2") );
+    co->SetValueL ( _L("trigger") );
+    err = iClient->PublishContext ( *co );
+    EUNIT_ASSERT_DESC( err == KErrNone, "Publish context failed" );
+    iCheckCustomAction = ETrue;
+    iCustomActionId = _L("saveScript" );
+    keyValue = CCFKeyValuePair::NewLC ( _L("id"), _L("updateTriggered") );
+    iCustomActionParams.AppendL ( keyValue );
+    CleanupStack::Pop ( keyValue );
+    Wait ( KDelay );
+    EUNIT_ASSERT_DESC( iCheckCustomAction, "Delete script failed" );
+
+    // x. Delete script after a saved script has been deregistered
+    // -------------------------------------------------------------------------
+    scriptId = KErrNotFound;
+    err = iClient->SaveScript(
+        _L("z:\\data\\cftestdata\\testscripts\\test-saveScript.xml"),
+        scriptId );
+    EUNIT_ASSERT_DESC( err == KErrNone, "Save script failed" );
+    exists = BaflUtils::FileExists ( iFs,
+        _L("c:\\private\\10282bc4\\rules\\20000fb1\\test-saveScript.rul") );
+    EUNIT_ASSERT_DESC( exists, "Script not saved" );
+
+    err = iClient->DeregisterScript( scriptId );
+    EUNIT_ASSERT_DESC( err == KErrNone, "Deregister script failed" );
+
+    co->SetSourceL ( _L("test") );
+    co->SetTypeL (_L("save.script") );
+    co->SetValueL ( _L("trigger") );
+    err = iClient->PublishContext ( *co );
+    EUNIT_ASSERT_DESC( err == KErrNone, "Publish context failed" );
+    iCheckCustomAction = ETrue;
+    iCustomActionId = _L("saveScript" );
+    keyValue = CCFKeyValuePair::NewLC( _L("id"), _L("triggered") );
+    iCustomActionParams.AppendL ( keyValue );
+    CleanupStack::Pop ( keyValue );
+    Wait ( KDelay );
+    EUNIT_ASSERT_DESC( iCheckCustomAction, "Deregister script failed" );
+
+    err = iClient->DeleteScript ( _L("test-saveScript") );
+    EUNIT_ASSERT_DESC( err == KErrNone, "Delete script failed" );
+    exists = BaflUtils::FileExists ( iFs,
+        _L("c:\\private\\10282bc4\\rules\\20000fb1\\test-saveScript.rul") );
+    EUNIT_ASSERT_DESC( !exists, "Script not deleted" );
+
+    // x. Delete with incorrect parameters
+    // -------------------------------------------------------------------------
+    err = iClient->DeleteScript ( KNullDesC );
+    EUNIT_ASSERT_DESC( err == KErrArgument, "Delete script failed" );
+    err = iClient->DeleteScript ( _L("test-saveScript") );
+    EUNIT_ASSERT_DESC( err == KErrNotFound, "Delete script failed" );
+    err = iClient->DeleteScript ( _L("test-saveScript2") );
+    EUNIT_ASSERT_DESC( err == KErrNotFound, "Delete script failed" );
+    err = iClient->DeleteScript ( _L("dummyScript") );
+    EUNIT_ASSERT_DESC( err == KErrNotFound, "Delete script failed" );
+
+    // Clean up
+    // -------------------------------------------------------------------------
+    CleanupStack::PopAndDestroy ( actionSubscription );
+    CleanupStack::PopAndDestroy ( co );
+    }
+
+void MT_CFClient::MT_CCFClient_DeleteScriptsL( )
+    {
+    CCFContextObject* co = CCFContextObject::NewLC ( );
+    CCFActionSubscription* actionSubscription = CCFActionSubscription::NewLC ( );
+
+    // Setup preconditions
+    // -------------------------------------------------------------------------
+    co->SetSourceL ( _L("test") );
+    co->SetTypeL (_L("save.script") );
+    TInt err = iClient->DefineContext ( co->Source ( ), co->Type ( ), KPassSec );
+    EUNIT_ASSERT_DESC( err == KErrNone || err == KErrAlreadyExists,
+        "Define context failed" );
+
+    co->SetSourceL ( _L("test") );
+    co->SetTypeL (_L("save.script.2") );
+    err = iClient->DefineContext ( co->Source ( ), co->Type ( ), KPassSec );
+    EUNIT_ASSERT_DESC( err == KErrNone || err == KErrAlreadyExists,
+        "Define context failed" );
+
+    err = iClient->DefineAction ( _L("saveScript"), KPassSec );
+    EUNIT_ASSERT_DESC( err == KErrNone || err == KErrAlreadyExists,
+        "Define action failed" );
+
+    actionSubscription->SetActionIdentifierL ( _L("saveScript") );
+    err = iClient->SubscribeAction ( *actionSubscription );
+    EUNIT_ASSERT_DESC( err == KErrNone, "Subscribe action failed" );
+
+    TInt scriptId = KErrNotFound;
+    err = iClient->SaveScript (
+    _L("z:\\data\\cftestdata\\testscripts\\test-saveScript.xml"),
+    scriptId );
+    EUNIT_ASSERT_DESC( err == KErrNone, "Save script failed" );
+    TBool exists = BaflUtils::FileExists ( iFs,
+    _L("c:\\private\\10282bc4\\rules\\20000fb1\\test-saveScript.rul") );
+    EUNIT_ASSERT_DESC( exists, "Script not saved" );
+
+    err = iClient->SaveScript (
+    _L("z:\\data\\cftestdata\\testscripts\\test-saveScript2.xml"),
+    scriptId );
+    EUNIT_ASSERT_DESC( err == KErrNone, "Save script failed" );
+    exists = BaflUtils::FileExists ( iFs,
+    _L("c:\\private\\10282bc4\\rules\\20000fb1\\test-saveScript2.rul") );
+    EUNIT_ASSERT_DESC( exists, "Script not saved" );
+
+    // x. Delete all scripts by uid
+    // -------------------------------------------------------------------------
+    err = iClient->DeleteScripts ( );
+    EUNIT_ASSERT_DESC( err == KErrNone, "Delete scripts failed" );
+
+    exists = BaflUtils::FileExists ( iFs,
+    _L("c:\\private\\10282bc4\\rules\\20000fb1\\test-saveScript.rul") );
+    EUNIT_ASSERT_DESC( !exists, "Script not deleted" );
+    exists = BaflUtils::FileExists ( iFs,
+    _L("c:\\private\\10282bc4\\rules\\20000fb1\\test-saveScript2.rul") );
+    EUNIT_ASSERT_DESC( !exists, "Script not deleted" );
+    exists = BaflUtils::FolderExists ( iFs, _L("c:\\private\\10282bc4\\rules\\20000fb1\\") );
+    EUNIT_ASSERT_DESC( !exists, "Delete script failed" );
+
+    co->SetSourceL ( _L("test") );
+    co->SetTypeL (_L("save.script") );
+    co->SetValueL ( _L("trigger") );
+    err = iClient->PublishContext ( *co );
+    EUNIT_ASSERT_DESC( err == KErrNone, "Publish context failed" );
+    iCheckCustomAction = ETrue;
+    iCustomActionId = _L("saveScript" );
+    CCFKeyValuePair* keyValue = CCFKeyValuePair::NewLC ( _L("id"), _L("triggered") );
+    iCustomActionParams.AppendL ( keyValue );
+    CleanupStack::Pop ( keyValue );
+    Wait ( KDelay );
+    EUNIT_ASSERT_DESC( iCheckCustomAction, "Delete scripts failed" );
+
+    co->SetSourceL ( _L("test") );
+    co->SetTypeL (_L("save.script.2") );
+    co->SetValueL ( _L("trigger") );
+    err = iClient->PublishContext ( *co );
+    EUNIT_ASSERT_DESC( err == KErrNone, "Publish context failed" );
+    iCheckCustomAction = ETrue;
+    iCustomActionId = _L("saveScript" );
+    keyValue = CCFKeyValuePair::NewLC ( _L("id"), _L("updateTriggered") );
+    iCustomActionParams.AppendL ( keyValue );
+    CleanupStack::Pop ( keyValue );
+    Wait ( KDelay );
+    EUNIT_ASSERT_DESC( iCheckCustomAction, "Delete scripts failed" );
+
+    // x. Try to delete all scripts if none found
+    // -------------------------------------------------------------------------
+    err = iClient->DeleteScripts ( );
+    EUNIT_PRINT( _L("DeleteScrips: err = %d"), err );
+    EUNIT_ASSERT_DESC( err == KErrNotFound, "Delete scripts failed" );
+
+    // Clean up
+    // -------------------------------------------------------------------------
+    CleanupStack::PopAndDestroy ( actionSubscription );
+    CleanupStack::PopAndDestroy ( co );
+    }
+
+void MT_CFClient::MT_CCFClient_UpgradeRomScriptL( )
+    {
+    CCFContextObject* co = CCFContextObject::NewLC ( );
+    CCFActionSubscription* actionSubscription = CCFActionSubscription::NewLC ( );
+
+    // Setup preconditions
+    // -------------------------------------------------------------------------
+    co->SetSourceL ( _L("test") );
+    co->SetTypeL (_L("upgrade") );
+    TInt err = iClient->DefineContext ( co->Source ( ), co->Type ( ), KPassSec );
+    EUNIT_ASSERT_DESC( err == KErrNone || err == KErrAlreadyExists,
+        "Define context failed" );
+
+    err = iClient->DefineAction ( _L("romUpgrade"), KPassSec );
+    EUNIT_ASSERT_DESC( err == KErrNone || err == KErrAlreadyExists,
+        "Define action failed" );
+
+    actionSubscription->SetActionIdentifierL ( _L("romUpgrade") );
+    err = iClient->SubscribeAction ( *actionSubscription );
+    EUNIT_ASSERT_DESC( err == KErrNone, "Subscribe action failed" );
+
+    // x. Upgrade 'test-scriptUpgradeRom' script and check that the script
+    //    really is upgraded
+    // -------------------------------------------------------------------------
+
+    // Upgrade with file name
+    err = iClient->UpgradeRomScript (
+    _L("z:\\data\\cftestdata\\testscripts\\test-scriptUpgradeRom.xml") );
+    EUNIT_PRINT( _L("UpgradeRomScript: err = %d"), err );
+    EUNIT_ASSERT_DESC( err == KErrNone, "Upgrade rom script failed" );
+
+    co->SetValueL ( _L("true") );
+    err = iClient->PublishContext ( *co );
+    EUNIT_ASSERT_DESC( err == KErrNone, "Publish context failed" );
+    iCheckCustomAction = ETrue;
+    iCustomActionId = _L("romUpgrade" );
+    CCFKeyValuePair* keyValue = CCFKeyValuePair::NewLC (
+    _L("id"), _L("true") );
+    iCustomActionParams.AppendL ( keyValue );
+    CleanupStack::Pop ( keyValue );
+    iWait->Start ( );
+
+    // Restore original rom script
+    err = iClient->RestoreRomScript ( _L("test-scriptUpgradeRom") );
+    EUNIT_PRINT( _L("RestoreRomScript: err = %d"), err );
+    EUNIT_ASSERT_DESC( err == KErrNone, "Restore script failed" );
+
+    // Upgrade with file name and script
+    HBufC8* script = LoadScriptFromFile ( _L("test-scriptUpgradeRom.xml") );
+    EUNIT_ASSERT_DESC( script, "Script not loaded" );
+    CleanupStack::PushL ( script );
+
+    err = iClient->UpgradeRomScript ( _L("test-scriptUpgradeRom"), *script );
+    EUNIT_ASSERT_DESC( err == KErrNone, "Upgrade rom script failed" );
+
+    co->SetValueL ( _L("true") );
+    err = iClient->PublishContext ( *co );
+    EUNIT_ASSERT_DESC( err == KErrNone, "Publish context failed" );
+    iCheckCustomAction = ETrue;
+    iCustomActionId = _L("romUpgrade" );
+    keyValue = CCFKeyValuePair::NewLC ( _L("id"), _L("true") );
+    iCustomActionParams.AppendL ( keyValue );
+    CleanupStack::Pop ( keyValue );
+    iWait->Start ( );
+
+    CleanupStack::PopAndDestroy ( script );
+
+    // Restore original rom script
+    err = iClient->RestoreRomScript ( _L("test-scriptUpgradeRom") );
+    EUNIT_ASSERT_DESC( err == KErrNone, "Restore script failed" );
+
+    co->SetValueL ( _L("false") );
+    err = iClient->PublishContext ( *co );
+    EUNIT_ASSERT_DESC( err == KErrNone, "Publish context failed" );
+    iCheckCustomAction = ETrue;
+    iCustomActionId = _L("romUpgrade" );
+    keyValue = CCFKeyValuePair::NewLC ( _L("id"), _L("false") );
+    iCustomActionParams.AppendL ( keyValue );
+    CleanupStack::Pop ( keyValue );
+    iWait->Start ( );
+
+    // x. Upgrade 'test-scriptUpgradeRom' script and check that the upgrade
+    //    fails with KErrAccessDenied (script is missing capability)
+    // -------------------------------------------------------------------------
+    script = LoadScriptFromFile ( _L("test-scriptUpgradeRomCapabilitiesMissing.xml") );
+    EUNIT_ASSERT_DESC( script, "Script not loaded" );
+    CleanupStack::PushL ( script );
+
+    err = iClient->UpgradeRomScript ( _L("test-scriptUpgradeRom"), *script );
+    EUNIT_ASSERT_DESC( err == KErrAccessDenied, "Upgrade rom script failed" );
+
+    co->SetValueL ( _L("false") );
+    err = iClient->PublishContext ( *co );
+    EUNIT_ASSERT_DESC( err == KErrNone, "Publish context failed" );
+    iCheckCustomAction = ETrue;
+    iCustomActionId = _L("romUpgrade" );
+    keyValue = CCFKeyValuePair::NewLC ( _L("id"), _L("false") );
+    iCustomActionParams.AppendL ( keyValue );
+    CleanupStack::Pop ( keyValue );
+    iWait->Start ( );
+
+    CleanupStack::PopAndDestroy( script );
+
+    // x. Upgrade 'test-scriptUpgradeRom' script and check that the upgrade
+    //    fails with KErrAccessDenied (script is missing upgrade security)
+    // -------------------------------------------------------------------------
+    script = LoadScriptFromFile ( _L("test-scriptUpgradeRomNoUpgradeSecurity.xml") );
+    EUNIT_ASSERT_DESC( script, "Script not loaded" );
+    CleanupStack::PushL ( script );
+
+    err = iClient->UpgradeRomScript ( _L("test-scriptUpgradeRom"), *script );
+    EUNIT_ASSERT_DESC( err == KErrAccessDenied, "Upgrade rom script failed" );
+
+    co->SetValueL ( _L("false") );
+    err = iClient->PublishContext ( *co );
+    EUNIT_ASSERT_DESC( err == KErrNone, "Publish context failed" );
+    iCheckCustomAction = ETrue;
+    iCustomActionId = _L("romUpgrade" );
+    keyValue = CCFKeyValuePair::NewLC ( _L("id"), _L("false") );
+    iCustomActionParams.AppendL ( keyValue );
+    CleanupStack::Pop ( keyValue );
+    iWait->Start ( );
+
+    CleanupStack::PopAndDestroy( script );
+
+    // x. Upgrade 'test-scriptUpgradeRom' script and check that the upgrade
+    //    fails with KErrAccessDenied (client is missing capabilities)
+    // -------------------------------------------------------------------------
+    script = LoadScriptFromFile ( _L("test-scriptUpgradeRom.xml") );
+    EUNIT_ASSERT_DESC( script, "Script not loaded" );
+    CleanupStack::PushL ( script );
+
+    err = iClient->UpgradeRomScript (
+        _L("test-scriptUpgradeRomClientMissingCapability"), *script );
+    EUNIT_ASSERT_DESC( err == KErrAccessDenied, "Upgrade rom script failed" );
+
+    co->SetValueL ( _L("false") );
+    err = iClient->PublishContext ( *co );
+    EUNIT_ASSERT_DESC( err == KErrNone, "Publish context failed" );
+    iCheckCustomAction = ETrue;
+    iCustomActionId = _L("romUpgrade" );
+    keyValue = CCFKeyValuePair::NewLC ( _L("id"), _L("false") );
+    iCustomActionParams.AppendL ( keyValue );
+    CleanupStack::Pop ( keyValue );
+    iWait->Start ( );
+
+    CleanupStack::PopAndDestroy( script );
+
+    // Clean up
+    // -------------------------------------------------------------------------
+    CleanupStack::PopAndDestroy ( actionSubscription );
+    CleanupStack::PopAndDestroy ( co );
+    }
+
+void MT_CFClient::MT_CCFClient_RestoreRomScriptL( )
+    {
+    CCFContextObject* co = CCFContextObject::NewLC ( );
+    CCFActionSubscription* actionSubscription = CCFActionSubscription::NewLC ( );
+
+    // Setup preconditions
+    // -------------------------------------------------------------------------
+    co->SetSourceL ( _L("test") );
+    co->SetTypeL (_L("upgrade") );
+    TInt err = iClient->DefineContext ( co->Source ( ), co->Type ( ), KPassSec );
+    EUNIT_ASSERT_DESC( err == KErrNone || err == KErrAlreadyExists,
+        "Define context failed" );
+
+    err = iClient->DefineAction ( _L("romUpgrade"), KPassSec );
+    EUNIT_ASSERT_DESC( err == KErrNone || err == KErrAlreadyExists,
+        "Define action failed" );
+
+    actionSubscription->SetActionIdentifierL ( _L("romUpgrade") );
+    err = iClient->SubscribeAction ( *actionSubscription );
+    EUNIT_ASSERT_DESC( err == KErrNone, "Subscribe action failed" );
+
+    // x. Check that rom script is currently registered
+    // -------------------------------------------------------------------------
+    co->SetValueL ( _L("false") );
+    err = iClient->PublishContext ( *co );
+    EUNIT_ASSERT_DESC( err == KErrNone, "Publish context failed" );
+    iCheckCustomAction = ETrue;
+    iCustomActionId = _L("romUpgrade" );
+    CCFKeyValuePair* keyValue = CCFKeyValuePair::NewLC( _L("id"), _L("false") );
+    iCustomActionParams.AppendL ( keyValue );
+    CleanupStack::Pop ( keyValue );
+    iWait->Start ( );
+
+    // x. Upgrade rom script and check, restore rom script and check
+    // -------------------------------------------------------------------------
+    err = iClient->UpgradeRomScript (
+        _L("z:\\data\\cftestdata\\testscripts\\test-scriptUpgradeRom.xml") );
+    EUNIT_PRINT( _L("UpgradeRomScript: err = %d"), err );
+    EUNIT_ASSERT_DESC( err == KErrNone, "Upgrade rom script failed" );
+
+    co->SetValueL ( _L("true") );
+    err = iClient->PublishContext ( *co );
+    EUNIT_ASSERT_DESC( err == KErrNone, "Publish context failed" );
+    iCheckCustomAction = ETrue;
+    iCustomActionId = _L("romUpgrade" );
+    keyValue = CCFKeyValuePair::NewLC ( _L("id"), _L("true") );
+    iCustomActionParams.AppendL ( keyValue );
+    CleanupStack::Pop ( keyValue );
+    iWait->Start ( );
+
+    TBool exists = BaflUtils::FileExists ( iFs,
+        _L("c:\\private\\10282bc4\\rules\\test-scriptUpgradeRom.rul") );
+    EUNIT_ASSERT_DESC( exists, "Script upgrade not found" );
+
+    err = iClient->RestoreRomScript ( _L("test-scriptUpgradeRom") );
+    EUNIT_PRINT( _L("RestoreRomScript: err = %d"), err );
+    EUNIT_ASSERT_DESC( err == KErrNone, "Restore script failed" );
+    co->SetValueL ( _L("false") );
+    err = iClient->PublishContext ( *co );
+    EUNIT_ASSERT_DESC( err == KErrNone, "Publish context failed" );
+    iCheckCustomAction = ETrue;
+    iCustomActionId = _L("romUpgrade" );
+    keyValue = CCFKeyValuePair::NewLC ( _L("id"), _L("false") );
+    iCustomActionParams.AppendL ( keyValue );
+    CleanupStack::Pop ( keyValue );
+    iWait->Start ( );
+
+    exists = BaflUtils::FileExists ( iFs,
+        _L("c:\\private\\10282bc4\\rules\\test-scriptUpgradeRom.rul") );
+    EUNIT_ASSERT_DESC( !exists, "Script upgrade not deleted" );
+
+    // x. Try to restore a script which does not exist
+    // -------------------------------------------------------------------------
+    err = iClient->RestoreRomScript ( _L("dummyRomScript") );
+    EUNIT_ASSERT_DESC( err == KErrNotFound, "Restore script failed" );
+
+    // Clean up
+    // -------------------------------------------------------------------------
+    CleanupStack::PopAndDestroy ( actionSubscription );
+    CleanupStack::PopAndDestroy ( co );
+    }
+
+void MT_CFClient::MT_CCFClient_OperationUnsubscribingL()
+    {
+    // Define context
+    CCFContextObject* co1 = CCFContextObject::NewLC();
+    co1->SetSourceL(_L("Test"));
+    co1->SetTypeL(_L("Counting"));
+    TInt err = iClient->DefineContext( co1->Source(), co1->Type(), KPassSec );
+    EUNIT_ASSERT_DESC( ( err == KErrNone || err == KErrAlreadyExists ),
+        "DefineContext failed!" );
+
+    // Define actions
+    err = iClient->DefineAction( _L("testAction"), KPassSec );
+    EUNIT_ASSERT_DESC( ( err == KErrNone || err == KErrAlreadyExists ),
+        "Incorrect DefineAction return value!" );
+    err = iClient->DefineAction( _L("testAction2"), KPassSec );
+    EUNIT_ASSERT_DESC( ( err == KErrNone || err == KErrAlreadyExists ),
+        "Incorrect DefineAction return value!" );
+
+    // Subscribe both actions
+    CCFActionSubscription* actionSub = CCFActionSubscription::NewLC();
+    actionSub->SetActionIdentifierL ( _L("testAction") );
+    err = iClient->SubscribeAction ( *actionSub );
+    EUNIT_ASSERT_DESC( err == KErrNone, "Incorrect SubscribeAction return value!" );
+
+    CCFActionSubscription* actionSub2 = CCFActionSubscription::NewLC();
+    actionSub2->SetActionIdentifierL ( _L("testAction2") );
+    err = iClient->SubscribeAction ( *actionSub2 );
+    EUNIT_ASSERT_DESC( err == KErrNone, "Incorrect SubscribeAction return value!" );
+
+    DeleteLastActionId();
+
+    // Publish context before loading so that subscribing will find the initial
+    // value used to evaluate the operation
+    co1->SetValueL(_L("A"));
+    err = iClient->PublishContext( *co1 );
+    EUNIT_ASSERT_DESC( err == KErrNone, "PublishContext failed!" );
+
+    EUNIT_ASSERT_DESC( !iLastActionId, "Action received although script not registered!" );
+
+    // Register script1
+    TInt scriptId1;
+    err = iClient->RegisterScript (
+            _L("z:\\data\\cftestdata\\testscripts\\test-countOneShotWithoutValue.xml"),
+            scriptId1 );
+    EUNIT_ASSERT_DESC( err == KErrNone, "Error when registering script!" );
+    EUNIT_ASSERT_DESC( scriptId1 >= 0, "Parse error!" );
+
+    // Register script2
+    TInt scriptId2;
+    err = iClient->RegisterScript (
+            _L("z:\\data\\cftestdata\\testscripts\\test-countOneShotWithoutValue2.xml"),
+            scriptId2 );
+    EUNIT_ASSERT_DESC( err == KErrNone, "Error when registering script!" );
+    EUNIT_ASSERT_DESC( scriptId2 >= scriptId1, "Parse error!" );
+
+    EUNIT_ASSERT_DESC( !iLastActionId, "Action should not have been received!" );
+
+    // Publish COUNTED context, no event should come
+    co1->SetValueL(_L("B"));
+    err = iClient->PublishContext( *co1 );
+    EUNIT_ASSERT_DESC( err == KErrNone, "PublishContext failed!" );
+    EUNIT_ASSERT_DESC( !iLastActionId, "Action should not have been received!" );
+
+    // Publish COUNTED context, event MUST come
+    co1->SetValueL(_L("A"));
+    err = iClient->PublishContext( *co1 );
+    EUNIT_ASSERT_DESC( err == KErrNone, "PublishContext failed!" );
+    iWait->Start();
+    EUNIT_ASSERT_DESC( LastActionIdEquals( _L("testAction")),
+        "Script did not cause event!" );
+
+    DeleteLastActionId();
+
+    // Publish COUNTED context, event MUST come
+    co1->SetValueL(_L("B"));
+    err = iClient->PublishContext( *co1 );
+    EUNIT_ASSERT_DESC( err == KErrNone, "PublishContext failed!" );
+    iWait->Start();
+    EUNIT_ASSERT_DESC( LastActionIdEquals( _L("testAction2")),
+    "Script did not cause event!" );
+
+    DeleteLastActionId();
+
+    // Publish COUNTED context, no event should come
+    co1->SetValueL(_L("A"));
+    err = iClient->PublishContext( *co1 );
+    EUNIT_ASSERT_DESC( err == KErrNone, "PublishContext failed!" );
+    EUNIT_ASSERT_DESC( !iLastActionId, "Action should not have been received!" );
+
+    // Publish COUNTED context, no event should come
+    co1->SetValueL(_L("B"));
+    err = iClient->PublishContext( *co1 );
+    EUNIT_ASSERT_DESC( err == KErrNone, "PublishContext failed!" );
+    EUNIT_ASSERT_DESC( !iLastActionId, "Action should not have been received!" );
+
+    // Publish COUNTED context, no event should come
+    co1->SetValueL(_L("A"));
+    err = iClient->PublishContext( *co1 );
+    EUNIT_ASSERT_DESC( err == KErrNone, "PublishContext failed!" );
+    EUNIT_ASSERT_DESC( !iLastActionId, "Action should not have been received!" );
+
+    // Publish COUNTED context, no event should come
+    co1->SetValueL(_L("B"));
+    err = iClient->PublishContext( *co1 );
+    EUNIT_ASSERT_DESC( err == KErrNone, "PublishContext failed!" );
+    EUNIT_ASSERT_DESC( !iLastActionId, "Action should not have been received!" );
+
+    // Publish COUNTED context, no event should come
+    co1->SetValueL(_L("A"));
+    err = iClient->PublishContext( *co1 );
+    EUNIT_ASSERT_DESC( err == KErrNone, "PublishContext failed!" );
+    EUNIT_ASSERT_DESC( !iLastActionId, "Action should not have been received!" );
+
+    CleanupStack::PopAndDestroy( actionSub2 );
+    CleanupStack::PopAndDestroy( actionSub );
+    CleanupStack::PopAndDestroy( co1 );
+
+    err = iClient->DeregisterScript ( scriptId1 );
+    EUNIT_ASSERT_DESC( err == KErrNone, "Deregistering script caused error!" );
+    err = iClient->DeregisterScript ( scriptId2 );
+    EUNIT_ASSERT_DESC( err == KErrNone, "Deregistering script caused error!" );
+    }
+
+void MT_CFClient::MT_CCFClient_RomScriptContextAutoDefineL()
+    {
+    // x. Preconditions
+    //--------------------------------------------------------------------------
+    CCFContextObject* co = CCFContextObject::NewLC();
+    CCFContextSubscription* subscription = CCFContextSubscription::NewLC();
+    _LIT_SECURITY_POLICY_PASS( alwaysPass );
+
+    // x. Subscribe context which has not been defined and check
+    //    that a context indication is received.
+    //--------------------------------------------------------------------------
+    
+    // Subscribe context:
+    //      source.romPublishContext
+    //      type.romPublishContext.reply
+    subscription->SetContextSourceL( _L("source.romPublishContext") );
+    subscription->SetContextTypeL( _L("type.romPublishContext.reply") );
+    TInt err = iClient->SubscribeContext( *subscription );
+    EUNIT_ASSERT_DESC( err == KErrNone, "Subscribe context failed!" );
+    
+    // Define and publish context:
+    //      source.romPublishContext
+    //      type.romPublishContext
+    //      true
+    err = iClient->DefineContext(
+        _L("source.romPublishContext"),
+        _L("type.romPublishContext"),
+        alwaysPass );
+    EUNIT_ASSERT_DESC( err == KErrNone, "Define context failed!" );
+
+    co->SetSourceL( _L("source.romPublishContext") );
+    co->SetTypeL( _L("type.romPublishContext") );
+    co->SetValueL( _L("true") );
+    err = iClient->PublishContext( *co );
+    EUNIT_ASSERT_DESC( err == KErrNone, "Publish context failed!" );
+    
+    // Wait for context indication, this should not happen
+    iCheckA = ETrue;
+    iContextA->SetSourceL( _L("source.romPublishContext") );
+    iContextA->SetTypeL( _L("type.romPublishContext.reply") );
+    iContextA->SetValueL( _L("true") );
+    Wait( KSecond * 2 );
+    EUNIT_ASSERT_DESC( iCheckA, "Context indication received!" );
+    
+    // Double check that context is not defined:
+    //      source.romPublishContext
+    //      type.romPublishContext.reply
+    co->SetSourceL( _L("source.romPublishContext") );
+    co->SetTypeL( _L("type.romPublishContext.reply") );
+    co->SetValueL( _L("false") );
+    err = iClient->PublishContext( *co );
+    EUNIT_ASSERT_DESC( err == KErrNotFound, "Undefined context was published!" );
+
+    // x. Register script with auto define context, this should fail since the
+    //    context is not auto defined.
+    //--------------------------------------------------------------------------
+    HBufC8* script = LoadScriptFromFile( _L("test-romPublishContext.xml") );
+    EUNIT_ASSERT_DESC( script, "Unable to load script 'test-romPublishContext.xml'!" );
+    TInt scriptId( KErrNotFound );
+    err = iClient->RegisterScript( _L("client-test-romPublishContext.xml"),
+        *script, scriptId );
+    EUNIT_ASSERT_DESC( err == KErrNotFound, "Script register should fail with code KErrNotFound!" );
+    EUNIT_ASSERT_DESC( scriptId == KErrNotFound, "Incorrect script ID!" );
+    delete script;
+
+    // x. Clean up
+    //--------------------------------------------------------------------------
+    CleanupStack::PopAndDestroy( subscription );
+    CleanupStack::PopAndDestroy( co );
+    }
+
+void MT_CFClient::MT_CCFClient_RomScriptContextAutoDefine2L()
+    {
+    // x. Preconditions
+    //--------------------------------------------------------------------------
+    CCFContextObject* co = CCFContextObject::NewLC();
+    CCFContextSubscription* subscription = CCFContextSubscription::NewLC();
+    _LIT_SECURITY_POLICY_PASS( alwaysPass );
+
+    // x. Subscribe context which has not been defined and check
+    //    that a context indication is received.
+    //--------------------------------------------------------------------------
+    
+    // Subscribe context:
+    //      source.romPublishContext2
+    //      type.romPublishContext2.reply
+    subscription->SetContextSourceL( _L("source.romPublishContext2") );
+    subscription->SetContextTypeL( _L("type.romPublishContext2.reply") );
+    TInt err = iClient->SubscribeContext( *subscription );
+    EUNIT_ASSERT_DESC( err == KErrNone, "Subscribe context failed!" );
+    
+    // Define and publish context:
+    //      source.romPublishContext2
+    //      type.romPublishContext2
+    //      true
+    err = iClient->DefineContext(
+        _L("source.romPublishContext2"),
+        _L("type.romPublishContext2"),
+        alwaysPass );
+    EUNIT_ASSERT_DESC( err == KErrNone, "Define context failed!" );
+
+    co->SetSourceL( _L("source.romPublishContext2") );
+    co->SetTypeL( _L("type.romPublishContext2") );
+    co->SetValueL( _L("true") );
+    err = iClient->PublishContext( *co );
+    EUNIT_ASSERT_DESC( err == KErrNone, "Publish context failed!" );
+    
+    // Wait for context indication
+    iCheckA = ETrue;
+    iContextA->SetSourceL( _L("source.romPublishContext2") );
+    iContextA->SetTypeL( _L("type.romPublishContext2.reply") );
+    iContextA->SetValueL( _L("true") );
+    Wait( KSecond * 2 );
+    EUNIT_ASSERT_DESC( !iCheckA, "Context indication not received!" );
+    
+    // Double check that context is defined:
+    //      source.romPublishContext2
+    //      type.romPublishContext2.reply
+    err = iClient->DefineContext(
+        _L("source.romPublishContext2"),
+        _L("type.romPublishContext2.reply"),
+        alwaysPass );
+    EUNIT_ASSERT_DESC( err == KErrAlreadyExists, "Define context should fail with code KErrAlreadyExists!" );
+
+    // x. Register script with auto define context, this should fail with KErrPermissionDenied
+    //    since the client can only read (subscribe) the context which is auto defined.
+    //--------------------------------------------------------------------------
+    HBufC8* script = LoadScriptFromFile( _L("test-romPublishContext2.xml") );
+    CleanupStack::PushL( script );
+    EUNIT_ASSERT_DESC( script, "Unable to load script 'test-romPublishContext2.xml'!" );
+    TInt scriptId( KErrNotFound );
+    err = iClient->RegisterScript( _L("client-test-romPublishContext2.xml"),
+        *script, scriptId );
+    EUNIT_PRINT( _L("RegisterScript completed with code: %d"), err );
+    EUNIT_ASSERT_DESC( err == KErrPermissionDenied, "Script register should fail with code KErrPermissionDenied!" );
+    EUNIT_ASSERT_DESC( scriptId == KErrNotFound, "Incorrect script ID!" );
+    CleanupStack::PopAndDestroy( script );
+
+    // x. Clean up
+    //--------------------------------------------------------------------------
+    CleanupStack::PopAndDestroy( subscription );
+    CleanupStack::PopAndDestroy( co );
+    }
+
+void MT_CFClient::MT_CCFClient_RomScriptContextAutoDefine3L()
+    {
+    // x. Preconditions
+    //--------------------------------------------------------------------------
+    CCFContextObject* co = CCFContextObject::NewLC();
+    CCFContextSubscription* subscription = CCFContextSubscription::NewLC();
+    _LIT_SECURITY_POLICY_PASS( alwaysPass );
+
+    // x. Subscribe context which has not been defined and check
+    //    that a context indication is received.
+    //--------------------------------------------------------------------------
+    
+    // Subscribe context:
+    //      source.romPublishContext3
+    //      type.romPublishContext3.reply
+    subscription->SetContextSourceL( _L("source.romPublishContext3") );
+    subscription->SetContextTypeL( _L("type.romPublishContext3.reply") );
+    TInt err = iClient->SubscribeContext( *subscription );
+    EUNIT_ASSERT_DESC( err == KErrNone, "Subscribe context failed!" );
+    
+    // Define and publish context:
+    //      source.romPublishContext3
+    //      type.romPublishContext3
+    //      true
+    err = iClient->DefineContext(
+        _L("source.romPublishContext3"),
+        _L("type.romPublishContext3"),
+        alwaysPass );
+    EUNIT_ASSERT_DESC( err == KErrNone, "Define context failed!" );
+
+    co->SetSourceL( _L("source.romPublishContext3") );
+    co->SetTypeL( _L("type.romPublishContext3") );
+    co->SetValueL( _L("true") );
+    err = iClient->PublishContext( *co );
+    EUNIT_ASSERT_DESC( err == KErrNone, "Publish context failed!" );
+    
+    // Wait for context indication, this should not happen
+    iCheckA = ETrue;
+    iContextA->SetSourceL( _L("source.romPublishContext3") );
+    iContextA->SetTypeL( _L("type.romPublishContext3.reply") );
+    iContextA->SetValueL( _L("true") );
+    Wait( KSecond * 2 );
+    EUNIT_ASSERT_DESC( iCheckA, "Context indication received!" );
+    
+    // Double check that context is not defined:
+    //      source.romPublishContext3
+    //      type.romPublishContext3.reply
+    co->SetSourceL( _L("source.romPublishContext3") );
+    co->SetTypeL( _L("type.romPublishContext3.reply") );
+    co->SetValueL( _L("false") );
+    err = iClient->PublishContext( *co );
+    EUNIT_ASSERT_DESC( err == KErrNotFound, "Undefined context was published!" );
+    
+    // x. Register script with auto define context, this should fail since the
+    //    context is not auto defined.
+    //--------------------------------------------------------------------------
+    HBufC8* script = LoadScriptFromFile( _L("test-romPublishContext3.xml") );
+    CleanupStack::PushL( script );
+    EUNIT_ASSERT_DESC( script, "Unable to load script 'test-romPublishContext3.xml'!" );
+    TInt scriptId( KErrNotFound );
+    err = iClient->RegisterScript( _L("client-test-romPublishContext3.xml"),
+        *script, scriptId );
+    EUNIT_ASSERT_DESC( err == KErrNotFound, "Script register should fail with code KErrNotFound!" );
+    EUNIT_ASSERT_DESC( scriptId == KErrNotFound, "Incorrect script ID!" );
+    CleanupStack::PopAndDestroy( script );
+
+    // x. Clean up
+    //--------------------------------------------------------------------------
+    CleanupStack::PopAndDestroy( subscription );
+    CleanupStack::PopAndDestroy( co );
+    }
+
+void MT_CFClient::MT_CCFClient_RomScriptContextAutoDefine4L()
+    {
+    // x. Preconditions
+    //--------------------------------------------------------------------------
+    CCFContextObject* co = CCFContextObject::NewLC();
+    CCFContextSubscription* subscription = CCFContextSubscription::NewLC();
+    _LIT_SECURITY_POLICY_PASS( alwaysPass );
+    
+    // x. Publish a context which triggers a publishContext action from a test-romPublishContext4.xml
+    //    which will auto define a context. test-romPublishContext5.xml rule file
+    //    has subscribed to this context.
+    //    A new context is auto defined from test-romPublishContext4.xml
+    //    which is subscribed by this test case.
+    //    Check that the context indication is received.
+    //--------------------------------------------------------------------------
+    
+    // Subscribe context:
+    //      source.romPublishContext5
+    //      type.romPublishContext5.reply
+    subscription->SetContextSourceL( _L("source.romPublishContext5") );
+    subscription->SetContextTypeL( _L("type.romPublishContext5.reply") );
+    TInt err = iClient->SubscribeContext( *subscription );
+    EUNIT_ASSERT_DESC( err == KErrNone, "Subscribe context failed!" );
+    
+    // Define and publish context:
+    //      source.romPublishContext4
+    //      type.romPublishContext4
+    //      true
+    err = iClient->DefineContext( 
+        _L("source.romPublishContext4"),
+        _L("type.romPublishContext4"),
+        alwaysPass );
+    EUNIT_ASSERT_DESC( err == KErrNone || err == KErrAlreadyExists, "Define context failed!" );
+    
+    co->SetSourceL( _L("source.romPublishContext4") );
+    co->SetTypeL( _L("type.romPublishContext4") );
+    co->SetValueL( _L("true") );
+    err = iClient->PublishContext( *co );
+    EUNIT_ASSERT_DESC( err == KErrNone, "Define context failed!" );
+    
+    // Wait for context indication
+    iCheckA = ETrue;
+    iContextA->SetSourceL( _L("source.romPublishContext5") );
+    iContextA->SetTypeL( _L("type.romPublishContext5.reply") );
+    iContextA->SetValueL( _L("true") );
+    Wait( KSecond * 2 );
+    EUNIT_ASSERT_DESC( !iCheckA, "Context indication not received!" );
+    
+    // x. Register scripts with auto define context, this should fail since the
+    //    client can only read (subscribe) the auto defined context.
+    //--------------------------------------------------------------------------
+    HBufC8* script = LoadScriptFromFile( _L("test-romPublishContext4.xml") );
+    CleanupStack::PushL( script );
+    EUNIT_ASSERT_DESC( script, "Unable to load script 'test-romPublishContext4.xml'!" );
+    TInt scriptId( KErrNotFound );
+    err = iClient->RegisterScript( _L("client-test-romPublishContext4.xml"),
+        *script, scriptId );
+    EUNIT_ASSERT_DESC( err == KErrPermissionDenied, "Script register should fail with code KErrPermissionDenied!" );
+    EUNIT_ASSERT_DESC( scriptId == KErrNotFound, "Incorrect script ID!" );
+    CleanupStack::PopAndDestroy( script );
+
+    script = LoadScriptFromFile( _L("test-romPublishContext5.xml") );
+    CleanupStack::PushL( script );
+    EUNIT_ASSERT_DESC( script, "Unable to load script 'test-romPublishContext5.xml'!" );
+    scriptId = KErrNotFound;
+    err = iClient->RegisterScript( _L("client-test-romPublishContext5.xml"),
+        *script, scriptId );
+    EUNIT_ASSERT_DESC( err == KErrPermissionDenied, "Script register should fail with code KErrPermissionDenied!" );
+    EUNIT_ASSERT_DESC( scriptId == KErrNotFound, "Incorrect script ID!" );
+    CleanupStack::PopAndDestroy( script );
+
+    // x. Clean up
+    //--------------------------------------------------------------------------
+    CleanupStack::PopAndDestroy( subscription );
+    CleanupStack::PopAndDestroy( co );
+    }
+
+//  TEST TABLE
+
+EUNIT_BEGIN_TEST_TABLE(
+    MT_CFClient,
+    "CFClient module test.",
+    "MODULE" )
+
+EUNIT_TEST(
+    "NewL - test ",
+    "CCFClient",
+    "NewL",
+    "FUNCTIONALITY",
+    SetupL, MT_CCFClient_NewLL, Teardown)
+
+EUNIT_TEST(
+    "NewLC - test ",
+    "CCFClient",
+    "NewLC",
+    "FUNCTIONALITY",
+    SetupL, MT_CCFClient_NewLCL, Teardown)
+
+EUNIT_TEST(
+    "DefineContext - test ",
+    "CCFClient",
+    "DefineContext",
+    "FUNCTIONALITY",
+    SetupL, MT_CCFClient_DefineContextL, Teardown)
+
+EUNIT_TEST(
+    "Subscribers-NoSubscribers - test ",
+    "CCFClient",
+    "Subscribers-NoSubscribers",
+    "FUNCTIONALITY",
+    SetupNewClientL, MT_CCFClient_SubscribersNosubscribersL, Teardown)
+
+EUNIT_TEST(
+    "Subscribers-NoSubscribersPlugin - test ",
+    "CCFClient",
+    "Subscribers-NoSubscribers",
+    "FUNCTIONALITY",
+    SetupNewClientL, MT_CCFClient_SubscribersNosubscribersPluginL, Teardown)
+
+EUNIT_TEST(
+    "2 Subscribers-NoSubscribersPlugin - test ",
+    "CCFClient",
+    "Subscribers-NoSubscribers",
+    "FUNCTIONALITY",
+    SetupNewClientL, MT_CCFClient_SubscribersNosubscribersPlugin2L, Teardown)
+
+EUNIT_TEST(
+    "3 Subscribers-NoSubscribersPlugin - test ",
+    "CCFClient",
+    "Subscribers-NoSubscribers",
+    "FUNCTIONALITY",
+    SetupNewClientL, MT_CCFClient_SubscribersNosubscribersPlugin3L, Teardown)
+
+EUNIT_TEST(
+    "PluginHandleSourceCommand - test ",
+    "CCFClient",
+    "HandleCommand",
+    "FUNCTIONALITY",
+    SetupNewClientL, MT_CCFClient_ContextSourceCommandPluginL, Teardown)
+
+EUNIT_TEST(
+    "ClientHandleSourceCommand - test ",
+    "CCFClient",
+    "HandleCommand",
+    "FUNCTIONALITY",
+    SetupNewClientL, MT_CCFClient_ContextSourceCommandClientL, Teardown)
+
+EUNIT_TEST(
+    "PublishContext - test ",
+    "CCFClient",
+    "PublishContext",
+    "FUNCTIONALITY",
+    SetupL, MT_CCFClient_PublishContextL, Teardown)
+
+EUNIT_TEST(
+    "PublishContextWithData - test ",
+    "CCFClient",
+    "PublishContext",
+    "FUNCTIONALITY",
+    SetupL, MT_CCFClient_PublishContextWithDataL, Teardown)
+
+EUNIT_TEST(
+    "SubscribeContext 1 - test ",
+    "CCFClient",
+    "SubscribeContext",
+    "FUNCTIONALITY",
+    SetupClientL, MT_CCFClient_SubscribeContext1L, Teardown)
+
+EUNIT_TEST(
+    "SubscribeContext 2 - test ",
+    "CCFClient",
+    "SubscribeContext",
+    "FUNCTIONALITY",
+    SetupClientL, MT_CCFClient_SubscribeContext2L, Teardown)
+
+EUNIT_TEST(
+    "SubscribeContext 3 - test ",
+    "CCFClient",
+    "SubscribeContext",
+    "FUNCTIONALITY",
+    SetupClientL, MT_CCFClient_SubscribeContext3L, Teardown)
+
+EUNIT_TEST(
+    "SubscribeContext 4 - test ",
+    "CCFClient",
+    "SubscribeContext",
+    "FUNCTIONALITY",
+    SetupClientL, MT_CCFClient_SubscribeContext4L, Teardown)
+
+EUNIT_TEST(
+    "SubscribeContext 5 - test ",
+    "CCFClient",
+    "SubscribeContext",
+    "FUNCTIONALITY",
+    SetupClientL, MT_CCFClient_SubscribeContext5L, Teardown)
+
+EUNIT_TEST(
+    "SubscribeContext 6 - test ",
+    "CCFClient",
+    "SubscribeContext",
+    "FUNCTIONALITY",
+    SetupClientL, MT_CCFClient_SubscribeContext6L, Teardown)
+
+EUNIT_TEST(
+    "SubscribeContext 7 - test ",
+    "CCFClient",
+    "SubscribeContext",
+    "FUNCTIONALITY",
+    SetupClientL, MT_CCFClient_SubscribeContext7L, Teardown)
+
+EUNIT_TEST(
+    "SubscribeContext 8 - test ",
+    "CCFClient",
+    "SubscribeContext",
+    "FUNCTIONALITY",
+    SetupClientL, MT_CCFClient_SubscribeContext8L, Teardown)
+
+EUNIT_TEST(
+    "SubscribeContext 9 - test ",
+    "CCFClient",
+    "SubscribeContext",
+    "FUNCTIONALITY",
+    SetupClientL, MT_CCFClient_SubscribeContext9L, Teardown)
+
+EUNIT_TEST(
+    "SubscribeContext from separate clients - test ",
+    "CCFClient",
+    "SubscribeContext",
+    "FUNCTIONALITY",
+    SetupClientL, MT_CCFClient_SubscribeContextFromDifferentClientsL, Teardown)
+
+EUNIT_TEST(
+    "SubscribeContext combined - test ",
+    "CCFClient",
+    "SubscribeContext",
+    "FUNCTIONALITY",
+    SetupClientL, MT_CCFClient_SubscribeContextCombinedL, Teardown)
+
+EUNIT_TEST(
+    "SubscribeContext with data 1 - test ",
+    "CCFClient",
+    "SubscribeContext",
+    "FUNCTIONALITY",
+    SetupClientL, MT_CCFClient_SubscribeContextData1L, Teardown)
+
+EUNIT_TEST(
+    "SubscribeContext with data 2 - test ",
+    "CCFClient",
+    "SubscribeContext",
+    "FUNCTIONALITY",
+    SetupClientL, MT_CCFClient_SubscribeContextData2L, Teardown)
+
+EUNIT_TEST(
+    "SubscribeContext with data 3 - test ",
+    "CCFClient",
+    "SubscribeContext",
+    "FUNCTIONALITY",
+    SetupClientL, MT_CCFClient_SubscribeContextData3L, Teardown)
+
+EUNIT_TEST(
+    "SubscribeContext with data 4 - test ",
+    "CCFClient",
+    "SubscribeContext",
+    "FUNCTIONALITY",
+    SetupClientL, MT_CCFClient_SubscribeContextData4L, Teardown)
+
+EUNIT_TEST(
+    "SubscribeContext with data combined - test ",
+    "CCFClient",
+    "SubscribeContext",
+    "FUNCTIONALITY",
+    SetupClientL, MT_CCFClient_SubscribeContextDataCombinedL, Teardown)
+
+EUNIT_TEST(
+    "UnsubscribeContext 1 - test ",
+    "CCFClient",
+    "UnsubscribeContext",
+    "FUNCTIONALITY",
+    SetupClientL, MT_CCFClient_UnsubscribeContext1L, Teardown)
+
+EUNIT_TEST(
+    "UnsubscribeContext 2 - test ",
+    "CCFClient",
+    "UnsubscribeContext",
+    "FUNCTIONALITY",
+    SetupClientL, MT_CCFClient_UnsubscribeContext2L, Teardown)
+
+EUNIT_TEST(
+    "UnsubscribeContext combined - test ",
+    "CCFClient",
+    "UnsubscribeContext",
+    "FUNCTIONALITY",
+    SetupClientL, MT_CCFClient_UnsubscribeContextCombinedL, Teardown)
+
+EUNIT_TEST(
+    "RequestContext 1 - test ",
+    "CCFClient",
+    "RequestContext",
+    "FUNCTIONALITY",
+    SetupClientL, MT_CCFClient_RequestContext1L, Teardown)
+
+EUNIT_TEST(
+    "RequestContext 2 - test ",
+    "CCFClient",
+    "RequestContext",
+    "FUNCTIONALITY",
+    SetupClientL, MT_CCFClient_RequestContext2L, Teardown)
+
+EUNIT_TEST(
+    "RequestContext 3 - test ",
+    "CCFClient",
+    "RequestContext",
+    "FUNCTIONALITY",
+    SetupClientL, MT_CCFClient_RequestContext3L, Teardown)
+
+EUNIT_TEST(
+    "RequestContextSet - test ",
+    "CCFClient",
+    "RequestContextSet",
+    "FUNCTIONALITY",
+    SetupClientL, MT_CCFClient_RequestContextSetL, Teardown)
+
+EUNIT_TEST(
+    "RequestContext combined - test ",
+    "CCFClient",
+    "RequestContext",
+    "FUNCTIONALITY",
+    SetupClientL, MT_CCFClient_RequestContextCombinedL, Teardown)
+
+EUNIT_TEST(
+    "DefineAction - test ",
+    "CCFClient",
+    "DefineAction",
+    "FUNCTIONALITY",
+    SetupClientL, MT_CCFClient_DefineActionL, Teardown)
+
+EUNIT_TEST(
+    "SubscribeAction 1 - test ",
+    "CCFClient",
+    "SubscribeAction",
+    "FUNCTIONALITY",
+    SetupClientL, MT_CCFClient_SubscribeAction1L, Teardown)
+
+EUNIT_TEST(
+    "SubscribeAction 2 - test ",
+    "CCFClient",
+    "SubscribeAction",
+    "FUNCTIONALITY",
+    SetupClientL, MT_CCFClient_SubscribeAction2L, Teardown)
+
+EUNIT_TEST(
+    "SubscribeAction 3 - test ",
+    "CCFClient",
+    "SubscribeAction",
+    "FUNCTIONALITY",
+    SetupClientL, MT_CCFClient_SubscribeAction3L, Teardown)
+
+EUNIT_TEST(
+    "SubscribeAction 4 - test ",
+    "CCFClient",
+    "SubscribeAction",
+    "FUNCTIONALITY",
+    SetupClientL, MT_CCFClient_SubscribeAction4L, Teardown)
+
+EUNIT_TEST(
+    "SubscribeAction from different client - test ",
+    "CCFClient",
+    "SubscribeAction",
+    "FUNCTIONALITY",
+    SetupClientL, MT_CCFClient_SubscribeActionFromDifferentClientsL, Teardown)
+
+EUNIT_TEST(
+    "SubscribeAction (same) from different client 2 - test ",
+    "CCFClient",
+    "SubscribeAction",
+    "FUNCTIONALITY",
+    SetupClientL, MT_CCFClient_SubscribeActionFromDifferentClients2L, Teardown)
+
+EUNIT_TEST(
+    "SubscribeAction combined - test ",
+    "CCFClient",
+    "SubscribeAction",
+    "FUNCTIONALITY",
+    SetupClientL, MT_CCFClient_SubscribeActionCombinedL, Teardown)
+
+EUNIT_TEST(
+    "UnsubscribeAction - test ",
+    "CCFClient",
+    "UnsubscribeAction",
+    "FUNCTIONALITY",
+    SetupClientL, MT_CCFClient_UnsubscribeActionL, Teardown)
+
+EUNIT_TEST(
+    "RegisterScript - test ",
+    "CCFClient",
+    "RegisterScript",
+    "FUNCTIONALITY",
+    SetupClientL, MT_CCFClient_RegisterScriptL, Teardown)
+
+EUNIT_TEST(
+    "RegisterScript - test ",
+    "CCFClient",
+    "RegisterScript",
+    "FUNCTIONALITY",
+    SetupClientL, MT_CCFClient_RegisterScriptL, Teardown)
+
+EUNIT_TEST(
+    "DeregisterScript - test ",
+    "CCFClient",
+    "DeregisterScript",
+    "FUNCTIONALITY",
+    SetupClientL, MT_CCFClient_DeregisterScriptL, Teardown)
+
+EUNIT_TEST(
+    "SaveContextSourceSetting - test ",
+    "CCFClient",
+    "SaveContextSourceSetting",
+    "FUNCTIONALITY",
+    SetupSourceSettingTestClientL, MT_CCFClient_SaveContextSourceSettingL, Teardown)
+
+EUNIT_TEST(
+    "SaveContextSourceSetting - test2 ",
+    "CCFClient",
+    "SaveContextSourceSetting",
+    "FUNCTIONALITY",
+    SetupSourceSettingTestClientL, MT_CCFClient_SaveContextSourceSetting2L, Teardown)
+
+EUNIT_TEST(
+    "DeleteContextSourceSetting - test ",
+    "CCFClient",
+    "DeleteContextSourceSetting",
+    "FUNCTIONALITY",
+    SetupSourceSettingTestClientL, MT_CCFClient_DeleteContextSourceSettingL, Teardown)
+
+EUNIT_TEST(
+    "DeleteContextSourceSetting - test2 ",
+    "CCFClient",
+    "DeleteContextSourceSetting",
+    "FUNCTIONALITY",
+    SetupSourceSettingTestClientL, MT_CCFClient_DeleteContextSourceSetting2L, Teardown)
+
+EUNIT_TEST(
+    "UpgradeContextSourceSetting - test ",
+    "CCFClient",
+    "SaveContextSourceSetting",
+    "FUNCTIONALITY",
+    SetupSourceSettingTestClientL, MT_CCFClient_UpgradeContextSourceSettingL, Teardown)
+
+EUNIT_TEST(
+    "SaveScript - test ",
+    "CCFClient",
+    "SaveScript",
+    "FUNCTIONALITY",
+    SetupClientL, MT_CCFClient_SaveScriptL, TeardownAndScriptCleanup)
+
+EUNIT_TEST(
+    "DeleteScript - test ",
+    "CCFClient",
+    "DeleteScript",
+    "FUNCTIONALITY",
+    SetupClientL, MT_CCFClient_DeleteScriptL, TeardownAndScriptCleanup)
+
+EUNIT_TEST(
+    "DeleteScripts - test ",
+    "CCFClient",
+    "DeleteScripts",
+    "FUNCTIONALITY",
+    SetupClientL, MT_CCFClient_DeleteScriptsL, TeardownAndScriptCleanup)
+
+EUNIT_TEST(
+    "UpgradeRomScript - test ",
+    "CCFClient",
+    "UpgradeRomScript",
+    "FUNCTIONALITY",
+    SetupClientL, MT_CCFClient_UpgradeRomScriptL, TeardownAndScriptCleanup)
+
+EUNIT_TEST(
+    "RestoreRomScript - test ",
+    "CCFClient",
+    "RestoreRomScript",
+    "FUNCTIONALITY",
+    SetupClientL, MT_CCFClient_RestoreRomScriptL, TeardownAndScriptCleanup)
+
+EUNIT_TEST(
+    "Count op unsubscribing - test with two scripts without value",
+    "CCFClient",
+    "UnsubscribeContext",
+    "FUNCTIONALITY",
+    SetupClientL, MT_CCFClient_OperationUnsubscribingL, Teardown)
+
+EUNIT_TEST(
+    "RomRule AutoDef - test rom script context auto define",
+    "CCFClient",
+    "DefineContext",
+    "FUNCTIONALITY",
+    SetupNewClientL, MT_CCFClient_RomScriptContextAutoDefineL, Teardown)
+
+EUNIT_TEST(
+    "RomRul AutoDef 2 - test rom script context auto define",
+    "CCFClient",
+    "DefineContext",
+    "FUNCTIONALITY",
+    SetupNewClientL, MT_CCFClient_RomScriptContextAutoDefine2L, Teardown)
+
+EUNIT_TEST(
+    "RomRul AutoDef 3 - test rom script context auto define",
+    "CCFClient",
+    "DefineContext",
+    "FUNCTIONALITY",
+    SetupNewClientL, MT_CCFClient_RomScriptContextAutoDefine3L, Teardown)
+
+EUNIT_TEST(
+    "RomRul AutoDef 4 - test rom script context auto define",
+    "CCFClient",
+    "DefineContext",
+    "FUNCTIONALITY",
+    SetupNewClientL, MT_CCFClient_RomScriptContextAutoDefine4L, Teardown)
+
+EUNIT_END_TEST_TABLE
+
+//  END OF FILE