contextframework/cfw/tsrc/public/basic/MT_CFScriptEngine/MT_CFScriptEngine.cpp
changeset 0 2e3d3ce01487
child 19 924385140d98
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/contextframework/cfw/tsrc/public/basic/MT_CFScriptEngine/MT_CFScriptEngine.cpp	Tue Feb 02 10:12:00 2010 +0200
@@ -0,0 +1,2159 @@
+/*
+* 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:
+*
+*/
+
+
+//  CLASS HEADER
+#include "MT_CFScriptEngine.h"
+
+//  EXTERNAL INCLUDES
+#include <EUnitMacros.h>
+#include <ECom/ECom.h>
+#include <bautils.h>
+
+#include "CFContextSubscription.h"
+#include "CFContextSubscriptionImpl.h"
+#include "CFContextObject.h"
+#include "CFContextObjectImpl.h"
+#include "CFScriptHandler.h"
+
+//  INTERNAL INCLUDES
+#include "CFTestDelay.h"
+#include "cffakeenv.h"
+#include "ScriptEventNotifierSession.h"
+#include "basicoperationspluginconst.hrh"
+#include "cfcommon.h"
+#include "cfenvutils.h"
+
+// CONSTANTS
+
+const TUid KMT_CfScriptEngineUid = {0x7E577E57};
+const TUid KMT_CfScriptEngineOtherUid = {0x074E074E};
+const TUid KCFServerUid = {0x10282BC4};
+
+_LIT( KCFPrivateFolder, "c:\\private\\10282BC4\\rules\\" );
+
+// CONSTRUCTION
+MT_CFScriptEngine* MT_CFScriptEngine::NewL()
+    {
+    MT_CFScriptEngine* self = MT_CFScriptEngine::NewLC();
+    CleanupStack::Pop();
+
+    return self;
+    }
+
+MT_CFScriptEngine* MT_CFScriptEngine::NewLC()
+    {
+    MT_CFScriptEngine* self = new( ELeave ) MT_CFScriptEngine();
+    CleanupStack::PushL( self );
+
+    self->ConstructL();
+
+    return self;
+    }
+
+// Destructor (virtual by CBase)
+MT_CFScriptEngine::~MT_CFScriptEngine()
+    {
+    // Enable screen saver
+    CFEnvUtils::EnableScreenSaver( ETrue );
+    }
+
+// Default constructor
+MT_CFScriptEngine::MT_CFScriptEngine()
+    {
+    }
+
+// Second phase construct
+void MT_CFScriptEngine::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_CFScriptEngine::SetupEmptyL(  )
+    {
+    User::LeaveIfError( iFs.Connect() );
+    BaflUtils::EnsurePathExistsL( iFs, KCFPrivateFolder );
+    iFileMan = CFileMan::NewL( iFs );
+    iTestDelay = CCFTestDelay::NewL();
+    }
+
+void MT_CFScriptEngine::SetupL(  )
+    {
+    SetupEmptyL();
+
+    iDummyScriptEngineSession = CScriptEventNotifierSession::NewL();
+
+    iCFFakeEnv = CCFFakeEnv::NewL();    
+    }
+
+void MT_CFScriptEngine::Teardown(  )
+    {
+    TeardownNoFinalClose();
+    
+#ifdef __WINS__
+    REComSession::FinalClose();
+#endif
+    }
+
+void MT_CFScriptEngine::TeardownNoFinalClose(  )
+    {    
+    iTestDelay->Start(100000); // 0.1 seconds
+
+    delete iDummyScriptEngineSession;
+    iDummyScriptEngineSession = NULL;
+
+    iTestDelay->Start(100000); // 0.1 seconds
+    delete iTestDelay;
+    iTestDelay = NULL;
+
+    delete iCFFakeEnv;
+    iCFFakeEnv = NULL;
+
+    CleanupSystemDrive();
+    delete iFileMan;
+    
+    iFs.Close();
+    }
+
+// -----------------------------------------------------------------------------
+// MT_CFScriptEngine::LoadScriptFromFile
+// -----------------------------------------------------------------------------
+//
+HBufC8* MT_CFScriptEngine::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;
+                    }
+                }
+            }
+        }
+
+    // Cleanup
+    file.Close();
+    return script;
+    }
+
+
+TInt MT_CFScriptEngine::FindParameter(const RKeyValueArray& aArray,
+    const TDesC& aKey, const TDesC& aValue)
+    {
+    TInt index = KErrNotFound;
+    TBool found = EFalse;
+    for (TInt i = 0; i < aArray.Count(); i++)
+        {
+        if ( aArray[i]->Key() == aKey )
+            {
+            if ( index == KErrNotFound )
+                {
+                index = i;
+                if ( aArray[i]->Value() == aValue )
+                    {
+                    found = ETrue;
+                    }
+                else
+                    {
+                    return -3; // found but wrong value!
+                    }
+                }
+            else
+                {
+                index = -2; // Duplicate found!
+                }
+            }
+        }
+    if (found)
+        {
+        return index;
+        }
+    return KErrNotFound;
+    }
+
+
+TInt MT_CFScriptEngine::FindIndex( const RArray<TInt>& aArray, TInt aIndex )
+    {
+    TInt index = KErrNotFound;
+    TBool found = EFalse;
+    for (TInt i = 0; i < aArray.Count(); i++)
+        {
+        if ( aArray[i] == aIndex )
+            {
+            if ( index == KErrNotFound )
+                {
+                index = i;
+                found = ETrue;
+                }
+            else
+                {
+                index = -2; // Duplicate found!
+                }
+            }
+        }
+    if (found)
+        {
+        return index;
+        }
+    return KErrNotFound;
+    }
+
+
+void MT_CFScriptEngine::CleanupSystemDrive()
+    {
+    iFileMan->RmDir( KCFPrivateFolder );
+    }
+
+
+void MT_CFScriptEngine::MT_CCFScriptEvent_NewLL(  )
+    {
+    EUNIT_ASSERT_DESC( EFalse, "Test case not implemented!" );
+    }
+
+void MT_CFScriptEngine::MT_CCFScriptEvent_ScriptIdL(  )
+    {
+    EUNIT_ASSERT_DESC( EFalse, "Test case not implemented!" );
+    }
+
+void MT_CFScriptEngine::MT_CCFScriptEvent_IdentifierL(  )
+    {
+    EUNIT_ASSERT_DESC( EFalse, "Test case not implemented!" );
+    }
+
+void MT_CFScriptEngine::MT_CCFScriptEvent_ParametersL(  )
+    {
+    EUNIT_ASSERT_DESC( EFalse, "Test case not implemented!" );
+    }
+
+void MT_CFScriptEngine::MT_CCFScriptHandler_NewLL(  )
+    {
+    // below                                        // CLEANUP<< fakeEnv
+    CCFFakeEnv* fakeEnv = CCFFakeEnv::NewLC();
+
+    CCFScriptHandler* instance
+        = CCFScriptHandler::NewL( *fakeEnv, iFs, *fakeEnv, *fakeEnv );
+    CleanupStack::PushL ( instance );
+    EUNIT_ASSERT_DESC ( instance, "CCFScriptHandler not created!" );
+
+    CleanupStack::PopAndDestroy( instance );
+    CleanupStack::PopAndDestroy( fakeEnv );         // CLEANUP<< fakeEnv
+    }
+
+void MT_CFScriptEngine::MT_CCFScriptHandler_NewLCL(  )
+    {
+    // below                                        // CLEANUP<< fakeEnv
+    CCFFakeEnv* fakeEnv = CCFFakeEnv::NewLC();
+
+    CCFScriptHandler* instance
+        = CCFScriptHandler::NewLC( *fakeEnv, iFs, *fakeEnv, *fakeEnv );
+    EUNIT_ASSERT_DESC ( instance, "CCFScriptHandler not created!" );
+
+    MCFStarterObserver* observer = (MCFStarterObserver*) instance;
+    observer->InitializePhaseL( CCFPhaseBase::ECFDeviceStarting );
+    observer->InitializePhaseL( CCFPhaseBase::ECFDeviceStarted );
+    observer->InitializePhaseL( CCFPhaseBase::ECFStartEnd );
+
+    CleanupStack::PopAndDestroy( instance );
+    CleanupStack::PopAndDestroy( fakeEnv );         // CLEANUP<< fakeEnv
+    }
+
+
+void MT_CFScriptEngine::MT_CCFScriptHandler_RemoveScriptByIdL(  )
+    {
+    RThread thread;
+    CleanupClosePushL(thread);
+
+    // Define context
+    CCFContextObject* co = CCFContextObject::NewLC();
+    static _LIT_SECURITY_POLICY_PASS( alwaysPass );
+    co->SetSourceL(_L("t"));
+    co->SetTypeL(_L("t.p.app"));
+    TInt err = iCFFakeEnv->DefineContext( co->Source(),
+            co->Type(), alwaysPass, alwaysPass );
+    EUNIT_ASSERT_DESC( err == KErrNone, "DefineContext failed!" );
+
+    // load script
+    HBufC8* script = LoadScriptFromFile(_L("test-equals.xml"));
+    TInt id = iCFFakeEnv->AddScript(
+            _L("test-equals.xml"), *script, thread.SecureId(), thread);
+    EUNIT_ASSERT_DESC( id >= 0, "Parse error!" );
+    delete script;
+
+    // CONTEXT 1
+    co->SetValueL(_L("ok"));
+    iCFFakeEnv->ClearFireClientEvent();
+    err = iCFFakeEnv->PublishContext( *co, thread );
+    EUNIT_ASSERT_DESC( err == KErrNone, "PublishContext failed!" );
+    EUNIT_ASSERT_DESC( iCFFakeEnv->ClientEventFired(), "Script did not fire event!" );
+    EUNIT_ASSERT_DESC( iCFFakeEnv->ScriptEventScriptId() == id,
+         "Script ID does not match!" );
+    EUNIT_ASSERT_DESC( iCFFakeEnv->ScriptEventIdentifier() == _L("startApp"),
+        "Identifier does not match!" );
+
+    err = iCFFakeEnv->RemoveScriptById( id, thread );
+    EUNIT_ASSERT( err == KErrNone );
+
+    // Check that original script does not cause events anymore
+    co->SetValueL(_L("notok"));
+    iCFFakeEnv->ClearFireClientEvent();
+    err = iCFFakeEnv->PublishContext( *co, thread );
+    EUNIT_ASSERT_DESC( err == KErrNone, "PublishContext failed!" );
+    EUNIT_ASSERT_DESC( !iCFFakeEnv->ClientEventFired(),
+         "Script did fired although wrong context value!" );
+
+    co->SetValueL(_L("ok"));
+    iCFFakeEnv->ClearFireClientEvent();
+    err = iCFFakeEnv->PublishContext( *co, thread );
+    EUNIT_ASSERT_DESC( err == KErrNone, "PublishContext failed!" );
+    EUNIT_ASSERT_DESC( !iCFFakeEnv->ClientEventFired(),
+         "Script did fire event!" );
+
+    CleanupStack::PopAndDestroy( co );
+    CleanupStack::PopAndDestroy( &thread );
+    }
+
+
+void MT_CFScriptEngine::MT_CCFScriptHandler_RemoveScriptsBySessionL(  )
+    {
+    RThread thread;
+    CleanupClosePushL(thread);
+
+    // Define and publish context
+    static _LIT_SECURITY_POLICY_PASS( alwaysPass );
+    TInt err = iCFFakeEnv->DefineContext( _L("t"),
+            _L("t.p.app"), alwaysPass, alwaysPass );
+    EUNIT_ASSERT_DESC( err == KErrNone, "DefineContext failed!" );
+
+    HBufC8* script = LoadScriptFromFile(_L("test-equals.xml"));
+    TInt id1 = iCFFakeEnv->AddScript(
+            _L("test-equals.xml"), *script, KMT_CfScriptEngineUid, thread);
+    EUNIT_ASSERT_DESC( id1 >= 0, "Parse error!" );
+    delete script;
+
+    // Define context
+    err = iCFFakeEnv->DefineContext( _L("Sensor"),
+            _L("X.RawValue"), alwaysPass, alwaysPass );
+    EUNIT_ASSERT_DESC( err == KErrNone, "DefineContext failed!" );
+
+    script = LoadScriptFromFile(_L("test-greater.xml"));
+    TInt id2 = iCFFakeEnv->AddScript(
+        _L("test-greater.xml"), *script, KMT_CfScriptEngineOtherUid, thread,
+        *iDummyScriptEngineSession, NULL );
+    EUNIT_ASSERT_DESC( id2 >= 0, "Parse error!" );
+    delete script;
+
+    // Define contexts
+    err = iCFFakeEnv->DefineContext( _L("Application.State"),
+            _L("Foreground.Application"), alwaysPass, alwaysPass );
+    EUNIT_ASSERT_DESC( err == KErrNone, "DefineContext failed!" );
+    err = iCFFakeEnv->DefineContext( _L("Application.State"),
+            _L("Foreground.View"), alwaysPass, alwaysPass );
+    EUNIT_ASSERT_DESC( err == KErrNone, "DefineContext failed!" );
+
+    script = LoadScriptFromFile(_L("test-and.xml"));
+    TInt id3 = iCFFakeEnv->AddScript(
+            _L("test-and.xml"),*script, KMT_CfScriptEngineUid, thread);
+    EUNIT_ASSERT_DESC( id3 >= 0, "Parse error!" );
+    delete script;
+
+    TInt numRemoved = iCFFakeEnv->RemoveScriptsBySession( *iCFFakeEnv );
+
+    const RArray<TInt>& scriptIds = iCFFakeEnv->GetEveryScriptId();
+    EUNIT_ASSERT_DESC( scriptIds.Count() == 1,
+        "Wrong count of Ids in array!" );
+
+    // Check that all Ids are found
+    EUNIT_ASSERT ( FindIndex( scriptIds, id2 ) >= 0 );
+
+    CleanupStack::PopAndDestroy( &thread );
+    }
+
+
+void MT_CFScriptEngine::MT_CCFScriptHandler_RemoveScriptByNameL()
+    {
+    _LIT( KScriptName1, "test-and.xml" );
+    _LIT( KScriptName2, "test-or.xml" );
+    HBufC8* script1 = LoadScriptFromFile( KScriptName1 );
+    HBufC8* script2 = LoadScriptFromFile( KScriptName2 );
+    EUNIT_ASSERT_DESC( script1 && script2, "Scripts not loaded" );
+    if( script1 && script2 )
+        {
+        CleanupStack::PushL( script1 );
+        CleanupStack::PushL( script2 );
+        
+        const TUid KClient1Uid = {0x12340001};
+        const TUid KClient2Uid = {0x12340002};
+
+        // Define needed contexts for scripts
+        static _LIT_SECURITY_POLICY_PASS( alwaysPass );
+        TInt err = iCFFakeEnv->DefineContext( _L("Application.State"),
+            _L("Foreground.Application"), alwaysPass, alwaysPass );
+        EUNIT_ASSERT_DESC( err == KErrNone, "DefineContext failed!" );
+        err = iCFFakeEnv->DefineContext( _L("Application.State"),
+            _L("Foreground.View"), alwaysPass, alwaysPass );
+        EUNIT_ASSERT_DESC( err == KErrNone, "DefineContext failed!" );
+        
+        // Test data
+        RThread thread;
+        CleanupClosePushL( thread );
+        TInt id = 0;
+        TInt scriptCount = 0;
+        
+        // Add script 1 from client 1
+        id = iCFFakeEnv->AddScript( KScriptName1, *script1,
+            KClient1Uid, thread );
+        EUNIT_ASSERT_DESC( id >= 0, "Add script failed" );
+        scriptCount = iCFFakeEnv->NumberOfScripts();
+        EUNIT_ASSERT_DESC( scriptCount == id, "Invalid number of scripts" );
+        
+        // Add script 2 from client 1
+        id = iCFFakeEnv->AddScript( KScriptName2, *script2,
+            KClient1Uid, thread );
+        EUNIT_ASSERT_DESC( id >= 0, "Add script failed" );
+        scriptCount = iCFFakeEnv->NumberOfScripts();
+        EUNIT_ASSERT_DESC( scriptCount == id, "Invalid number of scripts" );
+        
+        // Add script 1 from client 2
+        id = iCFFakeEnv->AddScript( KScriptName1, *script1,
+            KClient2Uid, thread );
+        EUNIT_ASSERT_DESC( id >= 0, "Add script failed" );
+        scriptCount = iCFFakeEnv->NumberOfScripts();
+        EUNIT_ASSERT_DESC( scriptCount == id, "Invalid number of scripts" );
+        
+        // Add script 2 from client 2
+        id = iCFFakeEnv->AddScript( KScriptName2, *script1,
+            KClient2Uid, thread );
+        EUNIT_ASSERT_DESC( id >= 0, "Add script failed" );
+        scriptCount = iCFFakeEnv->NumberOfScripts();
+        EUNIT_ASSERT_DESC( scriptCount == id, "Invalid number of scripts" );
+        
+        // Remove script 1 by name from client 1
+        err = iCFFakeEnv->RemoveScriptByName( KScriptName1, KClient1Uid );
+        EUNIT_ASSERT_DESC( err == KErrNone, "Invalid return value" );
+        scriptCount = iCFFakeEnv->NumberOfScriptsByOwner( KClient1Uid );
+        EUNIT_ASSERT_DESC( scriptCount == 1, "Invalid number of scripts" );
+        
+        // Remove script 1 by name from client 2
+        err = iCFFakeEnv->RemoveScriptByName( KScriptName1, KClient2Uid );
+        EUNIT_ASSERT_DESC( err == KErrNone, "Invalid return value" );
+        scriptCount = iCFFakeEnv->NumberOfScriptsByOwner( KClient2Uid );
+        EUNIT_ASSERT_DESC( scriptCount == 1, "Invalid number of scripts" );
+        
+        // Remove script 2 by name from client 1
+        err = iCFFakeEnv->RemoveScriptByName( KScriptName2, KClient1Uid );
+        EUNIT_ASSERT_DESC( err == KErrNone, "Invalid return value" );
+        scriptCount = iCFFakeEnv->NumberOfScriptsByOwner( KClient1Uid );
+        EUNIT_ASSERT_DESC( scriptCount == 0, "Invalid number of scripts" );
+        
+        // Remove script 2 by name from client 2
+        err = iCFFakeEnv->RemoveScriptByName( KScriptName2, KClient2Uid );
+        EUNIT_ASSERT_DESC( err == KErrNone, "Invalid return value" );
+        scriptCount = iCFFakeEnv->NumberOfScriptsByOwner( KClient2Uid );
+        EUNIT_ASSERT_DESC( scriptCount == 0, "Invalid number of scripts" );
+        
+        // Clean up
+        CleanupStack::PopAndDestroy( &thread );
+        CleanupStack::PopAndDestroy( script2 );
+        CleanupStack::PopAndDestroy( script1 );
+        }
+    }
+
+
+void MT_CFScriptEngine::MT_CCFScriptHandler_RemoveScriptByUidL()
+    {
+    _LIT( KScriptName1, "test-and.xml" );
+    _LIT( KScriptName2, "test-or.xml" );
+    HBufC8* script1 = LoadScriptFromFile( KScriptName1 );
+    HBufC8* script2 = LoadScriptFromFile( KScriptName2 );
+    EUNIT_ASSERT_DESC( script1 && script2, "Scripts not loaded" );
+    if( script1 && script2 )
+        {
+        CleanupStack::PushL( script1 );
+        CleanupStack::PushL( script2 );
+        
+        // Define needed contexts for scripts
+        static _LIT_SECURITY_POLICY_PASS( alwaysPass );
+        TInt err = iCFFakeEnv->DefineContext( _L("Application.State"),
+            _L("Foreground.Application"), alwaysPass, alwaysPass );
+        EUNIT_ASSERT_DESC( err == KErrNone, "DefineContext failed!" );
+        err = iCFFakeEnv->DefineContext( _L("Application.State"),
+            _L("Foreground.View"), alwaysPass, alwaysPass );
+        EUNIT_ASSERT_DESC( err == KErrNone, "DefineContext failed!" );
+        
+        // Test data
+        RThread thread;
+        CleanupClosePushL( thread );
+        TInt id = 0;
+        TInt scriptCount = 0;
+        const TUid KUid1 = {0x12340000};
+        const TUid KUid2 = {0x12340001};
+        
+        // Add script 1 twice
+        TInt count = 0;
+        for( TInt i = 0; i < 2; i++ )
+            {
+            id = iCFFakeEnv->AddScript( KScriptName1, *script1,
+                KUid1, thread );
+            count++;
+            EUNIT_ASSERT_DESC( id >= 0, "Add script failed" );
+            scriptCount = iCFFakeEnv->NumberOfScripts();
+            EUNIT_ASSERT_DESC( scriptCount == count, "Invalid number of scripts" );
+            }
+        
+        // Add script 2 three times
+        for( TInt i = 0; i < 3; i++ )
+            {
+            id = iCFFakeEnv->AddScript( KScriptName2, *script2,
+                KUid2, thread );
+            count++;
+            EUNIT_ASSERT_DESC( id >= 0, "Add script failed" );
+            scriptCount = iCFFakeEnv->NumberOfScripts();
+            EUNIT_ASSERT_DESC( scriptCount == count, "Invalid number of scripts" );
+            }
+        
+        // Remove scripts by uid1
+        err = iCFFakeEnv->RemoveScriptByUid( KUid1 );
+        EUNIT_ASSERT_DESC( err == KErrNone, "RemoveScriptByUid failed" );
+        scriptCount = iCFFakeEnv->NumberOfScripts();
+        EUNIT_ASSERT_DESC( scriptCount == 3, "Invalid number of scripts" );
+        scriptCount = iCFFakeEnv->NumberOfScriptsByOwner( KUid1 );
+        EUNIT_ASSERT_DESC( scriptCount == 0, "Invalid number of scripts" );
+
+        // Remove scripts by uid2
+        err = iCFFakeEnv->RemoveScriptByUid( KUid2 );
+        EUNIT_ASSERT_DESC( err == KErrNone, "RemoveScriptByUid failed" );
+        scriptCount = iCFFakeEnv->NumberOfScripts();
+        EUNIT_ASSERT_DESC( scriptCount == 0, "Invalid number of scripts" );
+        scriptCount = iCFFakeEnv->NumberOfScriptsByOwner( KUid2 );
+        EUNIT_ASSERT_DESC( scriptCount == 0, "Invalid number of scripts" );
+
+        // Clean up
+        CleanupStack::PopAndDestroy( &thread );
+        CleanupStack::PopAndDestroy( script2 );
+        CleanupStack::PopAndDestroy( script1 );
+        }
+    }
+
+
+void MT_CFScriptEngine::MT_CCFScriptHandler_NumberOfScriptsL(  )
+    {
+    RThread thread;
+    CleanupClosePushL(thread);
+
+    EUNIT_ASSERT_DESC( iCFFakeEnv->NumberOfScripts() == 0,
+            "Wrong number of scripts returned!" );
+
+    // Define and publish context
+    static _LIT_SECURITY_POLICY_PASS( alwaysPass );
+    TInt err = iCFFakeEnv->DefineContext( _L("t"),
+            _L("t.p.app"), alwaysPass, alwaysPass );
+    EUNIT_ASSERT_DESC( err == KErrNone, "DefineContext failed!" );
+
+    HBufC8* script = LoadScriptFromFile(_L("test-equals.xml"));
+    TInt id = iCFFakeEnv->AddScript(
+            _L("test-equals.xml"),*script, KMT_CfScriptEngineUid, thread);
+    EUNIT_ASSERT_DESC( id >= 0, "Parse error!" );
+    delete script;
+
+    EUNIT_ASSERT_DESC( iCFFakeEnv->NumberOfScripts() == 1,
+            "Wrong number of scripts returned!" );
+
+    // Define context
+    err = iCFFakeEnv->DefineContext( _L("Sensor"),
+            _L("X.RawValue"), alwaysPass, alwaysPass );
+    EUNIT_ASSERT_DESC( err == KErrNone, "DefineContext failed!" );
+
+    script = LoadScriptFromFile(_L("test-greater.xml"));
+    id = iCFFakeEnv->AddScript(_L("test-greater.xml"),
+            *script, KMT_CfScriptEngineOtherUid, thread);
+    EUNIT_ASSERT_DESC( id >= 0, "Parse error!" );
+    delete script;
+
+    EUNIT_ASSERT_DESC( iCFFakeEnv->NumberOfScripts() == 2,
+            "Wrong number of scripts returned!" );
+
+    CleanupStack::PopAndDestroy( &thread );
+    }
+
+
+void MT_CFScriptEngine::MT_CCFScriptHandler_ScriptLengthL(  )
+    {
+    RThread thread;
+    CleanupClosePushL(thread);
+
+    // Define and publish context
+    static _LIT_SECURITY_POLICY_PASS( alwaysPass );
+    TInt err = iCFFakeEnv->DefineContext( _L("t"),
+            _L("t.p.app"), alwaysPass, alwaysPass );
+    EUNIT_ASSERT_DESC( err == KErrNone, "DefineContext failed!" );
+
+    HBufC8* script = LoadScriptFromFile(_L("test-equals.xml"));
+    TInt id1 = iCFFakeEnv->AddScript(
+            _L("test-equals.xml"), *script, KMT_CfScriptEngineUid, thread);
+    EUNIT_ASSERT_DESC( id1 >= 0, "Parse error!" );
+
+    TInt origLength = script->Length();
+    delete script;
+
+    EUNIT_ASSERT( iCFFakeEnv->ScriptLength( id1 ) == origLength);
+
+    CleanupStack::PopAndDestroy( &thread );
+    }
+
+
+void MT_CFScriptEngine::MT_CCFScriptHandler_NumberOfScriptsByOwnerL(  )
+    {
+    RThread thread;
+    CleanupClosePushL(thread);
+
+    EUNIT_ASSERT_DESC(
+            iCFFakeEnv->NumberOfScriptsByOwner(KMT_CfScriptEngineUid) == 0,
+            "Wrong number of scripts returned!" );
+
+    // Define and publish context
+    static _LIT_SECURITY_POLICY_PASS( alwaysPass );
+    TInt err = iCFFakeEnv->DefineContext( _L("t"),
+            _L("t.p.app"), alwaysPass, alwaysPass );
+    EUNIT_ASSERT_DESC( err == KErrNone, "DefineContext failed!" );
+
+    HBufC8* script = LoadScriptFromFile(_L("test-equals.xml"));
+    TInt id = iCFFakeEnv->AddScript(
+            _L("test-equals.xml"), *script, KMT_CfScriptEngineUid, thread);
+    EUNIT_ASSERT_DESC( id >= 0, "Parse error!" );
+    delete script;
+
+    EUNIT_ASSERT_DESC(
+            iCFFakeEnv->NumberOfScriptsByOwner(KMT_CfScriptEngineUid) == 1,
+            "Wrong number of scripts returned!" );
+
+    // Define context for test-greater.xml
+    err = iCFFakeEnv->DefineContext( _L("Sensor"),
+            _L("X.RawValue"), alwaysPass, alwaysPass );
+    EUNIT_ASSERT_DESC( err == KErrNone, "DefineContext failed!" );
+
+    script = LoadScriptFromFile(_L("test-greater.xml"));
+    id = iCFFakeEnv->AddScript(_L("test-greater.xml"),
+            *script, KMT_CfScriptEngineOtherUid, thread);
+    EUNIT_ASSERT_DESC( id >= 0, "Parse error!" );
+    delete script;
+
+    EUNIT_ASSERT_DESC(
+            iCFFakeEnv->NumberOfScriptsByOwner(KMT_CfScriptEngineUid) == 1,
+            "Wrong number of scripts returned!" );
+
+    // Define contexts test-and.xml -script
+    err = iCFFakeEnv->DefineContext( _L("Application.State"),
+            _L("Foreground.Application"), alwaysPass, alwaysPass );
+    EUNIT_ASSERT_DESC( err == KErrNone, "DefineContext failed!" );
+    err = iCFFakeEnv->DefineContext( _L("Application.State"),
+            _L("Foreground.View"), alwaysPass, alwaysPass );
+    EUNIT_ASSERT_DESC( err == KErrNone, "DefineContext failed!" );
+
+    script = LoadScriptFromFile(_L("test-and.xml"));
+    id = iCFFakeEnv->AddScript(
+            _L("test-and.xml"), *script, KMT_CfScriptEngineUid, thread);
+    EUNIT_ASSERT_DESC( id >= 0, "Parse error!" );
+    delete script;
+
+    EUNIT_ASSERT_DESC(
+            iCFFakeEnv->NumberOfScriptsByOwner(KMT_CfScriptEngineUid) == 2,
+            "Wrong number of scripts returned!" );
+
+    CleanupStack::PopAndDestroy( &thread );
+    }
+
+void MT_CFScriptEngine::MT_CCFScriptHandler_GetEveryScriptIdL(  )
+    {
+    RThread thread;
+    CleanupClosePushL(thread);
+
+    // Define context for test-equals.xml
+    static _LIT_SECURITY_POLICY_PASS( alwaysPass );
+    TInt err = iCFFakeEnv->DefineContext( _L("t"),
+            _L("t.p.app"), alwaysPass, alwaysPass );
+    EUNIT_ASSERT_DESC( err == KErrNone, "DefineContext failed!" );
+
+    HBufC8* script = LoadScriptFromFile(_L("test-equals.xml"));
+    TInt id1 = iCFFakeEnv->AddScript(
+            _L("test-equals.xml"), *script, KMT_CfScriptEngineUid, thread);
+    EUNIT_ASSERT_DESC( id1 >= 0, "Parse error!" );
+    delete script;
+
+    // Define context for test-greater.xml
+    err = iCFFakeEnv->DefineContext( _L("Sensor"),
+            _L("X.RawValue"), alwaysPass, alwaysPass );
+    EUNIT_ASSERT_DESC( err == KErrNone, "DefineContext failed!" );
+
+    script = LoadScriptFromFile(_L("test-greater.xml"));
+    TInt id2 = iCFFakeEnv->AddScript(_L("test-greater.xml"),
+            *script, KMT_CfScriptEngineOtherUid, thread);
+    EUNIT_ASSERT_DESC( id2 >= 0, "Parse error!" );
+    delete script;
+
+
+    // Define contexts test-and.xml -script
+    err = iCFFakeEnv->DefineContext( _L("Application.State"),
+            _L("Foreground.Application"), alwaysPass, alwaysPass );
+    EUNIT_ASSERT_DESC( err == KErrNone, "DefineContext failed!" );
+    err = iCFFakeEnv->DefineContext( _L("Application.State"),
+            _L("Foreground.View"), alwaysPass, alwaysPass );
+    EUNIT_ASSERT_DESC( err == KErrNone, "DefineContext failed!" );
+
+    script = LoadScriptFromFile(_L("test-and.xml"));
+    TInt id3 = iCFFakeEnv->AddScript(
+            _L("test-and.xml"), *script, KMT_CfScriptEngineUid, thread);
+    EUNIT_ASSERT_DESC( id3 >= 0, "Parse error!" );
+    delete script;
+
+    const RArray<TInt>& scriptIds = iCFFakeEnv->GetEveryScriptId();
+    EUNIT_ASSERT_DESC( scriptIds.Count() == 3, "Wrong count of Ids in array!" );
+
+    // Check that all Ids are found
+    EUNIT_ASSERT ( FindIndex( scriptIds, id1 ) >= 0 );
+    EUNIT_ASSERT ( FindIndex( scriptIds, id2 ) >= 0 );
+    EUNIT_ASSERT ( FindIndex( scriptIds, id3 ) >= 0 );
+
+    CleanupStack::PopAndDestroy( &thread );
+    }
+
+
+void MT_CFScriptEngine::MT_CCFScriptHandler_GetEveryScriptIdByOwnerL(  )
+    {
+    RThread thread;
+    CleanupClosePushL(thread);
+
+    // Define context for test-equals.xml
+    static _LIT_SECURITY_POLICY_PASS( alwaysPass );
+    TInt err = iCFFakeEnv->DefineContext( _L("t"),
+            _L("t.p.app"), alwaysPass, alwaysPass );
+    EUNIT_ASSERT_DESC( err == KErrNone, "DefineContext failed!" );
+
+    HBufC8* script = LoadScriptFromFile(_L("test-equals.xml"));
+    TInt id1 = iCFFakeEnv->AddScript(
+            _L("test-equals.xml"), *script, KMT_CfScriptEngineUid, thread);
+    EUNIT_ASSERT_DESC( id1 >= 0, "Parse error!" );
+    delete script;
+
+    // Define context for test-greater.xml
+    err = iCFFakeEnv->DefineContext( _L("Sensor"),
+            _L("X.RawValue"), alwaysPass, alwaysPass );
+    EUNIT_ASSERT_DESC( err == KErrNone, "DefineContext failed!" );
+
+    script = LoadScriptFromFile(_L("test-greater.xml"));
+    TInt id2 = iCFFakeEnv->AddScript(_L("test-greater.xml"),
+            *script, KMT_CfScriptEngineOtherUid, thread);
+    EUNIT_ASSERT_DESC( id2 >= 0, "Parse error!" );
+    delete script;
+
+    // Define contexts test-and.xml -script
+    err = iCFFakeEnv->DefineContext( _L("Application.State"),
+            _L("Foreground.Application"), alwaysPass, alwaysPass );
+    EUNIT_ASSERT_DESC( err == KErrNone, "DefineContext failed!" );
+    err = iCFFakeEnv->DefineContext( _L("Application.State"),
+            _L("Foreground.View"), alwaysPass, alwaysPass );
+    EUNIT_ASSERT_DESC( err == KErrNone, "DefineContext failed!" );
+
+    script = LoadScriptFromFile(_L("test-and.xml"));
+    TInt id3 = iCFFakeEnv->AddScript(
+            _L("test-and.xml"), *script, KMT_CfScriptEngineUid, thread);
+    EUNIT_ASSERT_DESC( id3 >= 0, "Parse error!" );
+    delete script;
+
+    const RArray<TInt>& scriptIds
+        = iCFFakeEnv->GetEveryScriptIdByOwner(KMT_CfScriptEngineUid);
+    EUNIT_ASSERT_DESC( scriptIds.Count() == 2,
+        "Wrong count of Ids in array!" );
+
+    EUNIT_ASSERT ( FindIndex( scriptIds, id1 ) >= 0 );
+    EUNIT_ASSERT ( FindIndex( scriptIds, id3 ) >= 0 );
+
+    CleanupStack::PopAndDestroy( &thread );
+    }
+
+
+void MT_CFScriptEngine::MT_CCFScriptHandler_UpdateScriptL(  )
+    {
+    RThread thread;
+    CleanupClosePushL(thread);
+
+    // Define and publish context
+    static _LIT_SECURITY_POLICY_PASS( alwaysPass );
+    CCFContextObject* co = CCFContextObject::NewLC();
+    co->SetSourceL(_L("t"));
+    co->SetTypeL(_L("t.p.app"));
+    TInt err = iCFFakeEnv->DefineContext( co->Source(),
+            co->Type(), alwaysPass, alwaysPass );
+    EUNIT_ASSERT_DESC( err == KErrNone, "DefineContext failed!" );
+
+    // load script
+    HBufC8* script = LoadScriptFromFile(_L("test-equals.xml"));
+    TInt id = iCFFakeEnv->AddScript(
+            _L("test-equals.xml"), *script, KMT_CfScriptEngineUid, thread);
+    EUNIT_ASSERT_DESC( id >= 0, "Parse error!" );
+    delete script;
+
+    // CONTEXT 1
+    co->SetValueL(_L("ok"));
+    iCFFakeEnv->ClearFireClientEvent();
+    err = iCFFakeEnv->PublishContext( *co, thread );
+    EUNIT_ASSERT_DESC( err == KErrNone, "PublishContext failed!" );
+    EUNIT_ASSERT_DESC( iCFFakeEnv->ClientEventFired(), "Script did not fire event!" );
+    EUNIT_ASSERT_DESC( iCFFakeEnv->ScriptEventScriptId() == id,
+         "Script ID does not match!" );
+    EUNIT_ASSERT_DESC( iCFFakeEnv->ScriptEventIdentifier() == _L("startApp"),
+        "Identifier does not match!" );
+
+    // Define context
+    CCFContextObject* co2 = CCFContextObject::NewLC();
+    co2->SetSourceL(_L("Sensor"));
+    co2->SetTypeL(_L("X.RawValue"));
+    err = iCFFakeEnv->DefineContext( co2->Source(),
+            co2->Type(), alwaysPass, alwaysPass );
+    EUNIT_ASSERT_DESC( err == KErrNone, "DefineContext failed!" );
+
+    // update script
+    HBufC8* updatedScript = LoadScriptFromFile(_L("test-less.xml"));
+    err = iCFFakeEnv->UpdateScript(id,  thread,  *updatedScript, NULL );
+    EUNIT_ASSERT_DESC( err == KErrNone, "Update error!" );
+    delete updatedScript;
+
+    // TEST 1: Should fire event if value < 150
+    co2->SetValueL(_L("149")); // value in script: 150
+    err = iCFFakeEnv->PublishContext( *co2, thread );
+    EUNIT_ASSERT_DESC( err == KErrNone, "PublishContext failed!" );
+    EUNIT_ASSERT_DESC( iCFFakeEnv->ClientEventFired(), "Script did not fire event!" );
+    EUNIT_ASSERT_DESC( iCFFakeEnv->ScriptEventScriptId() == id,
+         "Script ID does not match!" );
+    EUNIT_ASSERT_DESC( iCFFakeEnv->ScriptEventIdentifier() == _L("startApp"),
+        "Identifier does not match!" );
+
+    // Check that original script does not cause events anymore
+    co->SetValueL(_L("notok"));
+    iCFFakeEnv->ClearFireClientEvent();
+    err = iCFFakeEnv->PublishContext( *co, thread );
+    EUNIT_ASSERT_DESC( err == KErrNone, "PublishContext failed!" );
+    EUNIT_ASSERT_DESC( !iCFFakeEnv->ClientEventFired(), "Script did fire event!" );
+
+    co->SetValueL(_L("ok"));
+    iCFFakeEnv->ClearFireClientEvent();
+    err = iCFFakeEnv->PublishContext( *co, thread );
+    EUNIT_ASSERT_DESC( err == KErrNone, "PublishContext failed!" );
+    EUNIT_ASSERT_DESC( !iCFFakeEnv->ClientEventFired(), "Script did fire event!" );
+
+    CleanupStack::PopAndDestroy( co2 );
+    CleanupStack::PopAndDestroy( co );
+    CleanupStack::PopAndDestroy( &thread );
+    }
+
+
+void MT_CFScriptEngine::MT_CCFScriptHandler_SaveScriptL()
+    {    
+    // Change timestamp to yesterday
+    TTime time;
+    time.UniversalTime();
+    TDateTime dateTime = time.DateTime();
+    dateTime.SetHour( dateTime.Hour() - 1 );
+    
+    // Update new time
+    TTime entryTime( dateTime );
+
+    // Load script
+    HBufC8* script1 = LoadScriptFromFile( _L( "test-saveScript.xml" ) );
+    EUNIT_ASSERT_DESC( script1 , "Scripts not loaded" );
+    if( script1 )
+        {
+        CleanupStack::PushL( script1 );
+        const TUid KUidClient1 = {0x12340001};
+        const TUid KUidClient2 = {0x12340002};
+        TInt err = KErrNone;
+        TInt scriptId = 0;
+        TBool exists = EFalse;
+        _LIT( KClient1Path1, "c:\\private\\10282BC4\\rules\\12340001\\script1.rul" );
+        _LIT( KClient1Path2, "c:\\private\\10282BC4\\rules\\12340001\\script2.rul" );
+        _LIT( KClient2Path1, "c:\\private\\10282BC4\\rules\\12340002\\script1.rul" );
+        _LIT( KClient2Path2, "c:\\private\\10282BC4\\rules\\12340002\\script2.rul" );
+        _LIT( KUpgradePath, "c:\\private\\10282BC4\\rules\\scriptupgrade.rul" );
+        RThread client;
+        CleanupClosePushL( client );
+        
+        // Define needed contexts for scripts
+        static _LIT_SECURITY_POLICY_PASS( alwaysPass );
+        CCFContextObject* co = CCFContextObject::NewLC();
+        co->SetSourceL( _L("test") );
+        co->SetTypeL( _L("save.script") );
+        err = iCFFakeEnv->DefineContext( co->Source(), co->Type(), alwaysPass, alwaysPass );
+        EUNIT_ASSERT_DESC( err == KErrNone, "DefineContext failed!" );
+
+        // Test script saving from different clients
+        const TInt KCount = 5;
+        for( TInt i = 0; i < KCount; i++ )
+            {
+            TPtrC fullPath( KNullDesC );
+            TUid uid = {0x00000000};
+            switch( i )
+                {
+                case 0:
+                    {
+                    fullPath.Set( KClient1Path1 );
+                    uid = KUidClient1;
+                    break;
+                    }
+                case 1:
+                    {
+                    fullPath.Set( KClient1Path2 );
+                    uid = KUidClient1;
+                    break;
+                    }
+                case 2:
+                    {
+                    fullPath.Set( KClient2Path1 );
+                    uid = KUidClient2;
+                    break;
+                    }
+                case 3:
+                    {
+                    fullPath.Set( KClient2Path2 );
+                    uid = KUidClient2;
+                    break;
+                    }
+                case 4:
+                    {
+                    fullPath.Set( KUpgradePath );
+                    uid = KCFServerUid;
+                    break;
+                    }
+                default:
+                    {
+                    break;
+                    }
+                }
+            TParsePtrC parse( fullPath );
+            scriptId = iCFFakeEnv->AddScript( parse.Name(), *script1, uid,
+                client );
+            EUNIT_ASSERT_DESC( scriptId == i + 1, "Invalid script id" );
+            err = iCFFakeEnv->SaveScript( *script1, scriptId, uid );
+            EUNIT_ASSERT_DESC( err == KErrNone, "SaveScript failed" );
+            exists = BaflUtils::FolderExists( iFs, parse.DriveAndPath() );
+            EUNIT_ASSERT_DESC( exists, "Folder not created" );
+            exists = BaflUtils::FileExists( iFs, parse.FullName() );
+            EUNIT_ASSERT_DESC( exists, "File not created" );
+            
+            err = iFs.SetModified( fullPath, entryTime );
+            EUNIT_ASSERT_DESC( err == KErrNone, "Failed to set modified time" );
+            TEntry oldEntry;
+            err = iFs.Entry( fullPath, oldEntry );
+            EUNIT_ASSERT_DESC( err == KErrNone, "Failed to get file entry" );
+            
+            // Save script again and check that it has been replaced
+            User::After( 100000 );
+            err = iCFFakeEnv->SaveScript( *script1, scriptId, uid );
+            EUNIT_ASSERT_DESC( err == KErrNone, "SaveScript failed" );
+            TEntry newEntry;
+            err = iFs.Entry( fullPath, newEntry );
+            EUNIT_ASSERT_DESC( err == KErrNone, "Failed to get file entry" );
+            EUNIT_ASSERT_DESC( oldEntry.iModified < newEntry.iModified,
+                "Saved script not updated" );
+            }
+        
+        // Try to save a script from with a wrong owner UID
+        scriptId = iCFFakeEnv->AddScript( _L( "test" ), *script1, KUidClient1,   
+            client );
+        err = iCFFakeEnv->SaveScript( *script1, scriptId, KUidClient2 );
+        EUNIT_ASSERT_DESC( err == KErrAccessDenied,
+            "Allowed to save script with a wrong client uid" );
+        
+        // Check that the saved script are loaded when script engine
+        // is initialized
+        delete iCFFakeEnv;
+        iCFFakeEnv = NULL;
+        iCFFakeEnv = CCFFakeEnv::NewL();
+        iCFFakeEnv->InitAllPhasesL();
+        TInt numOfScripts = iCFFakeEnv->NumberOfScriptsByOwner( KUidClient1 );
+        EUNIT_ASSERT_DESC( numOfScripts == 2, "Invalid number of scripts" );
+        numOfScripts = iCFFakeEnv->NumberOfScriptsByOwner( KUidClient2 );
+        EUNIT_ASSERT_DESC( numOfScripts == 2, "Invalid number of scripts" );
+
+        co->SetSourceL( _L("test") );
+        co->SetTypeL( _L("save.script") );
+        err = iCFFakeEnv->DefineContext( co->Source(), co->Type(), alwaysPass, alwaysPass );
+        EUNIT_ASSERT_DESC( err == KErrNone, "DefineContext failed!" );
+        co->SetValueL( _L("true") );
+        err = iCFFakeEnv->PublishContext( *co, client );
+        EUNIT_ASSERT_DESC( err == KErrNone, "Publish context failed" );
+        
+        TBool eventFired = iCFFakeEnv->ClientEventFired();
+        EUNIT_ASSERT_DESC( eventFired, "Event not fired" );
+        TPtrC actionId( iCFFakeEnv->ScriptEventIdentifier() );
+        EUNIT_ASSERT_DESC( actionId == _L("saveScript"), "Incorrect action id" );
+        const RKeyValueArray& params = iCFFakeEnv->ScriptEventParameters();
+        EUNIT_ASSERT_DESC( params[0]->Key() == _L("id"), "Incorrect action id" );
+        EUNIT_ASSERT_DESC( params[0]->Value() == _L("triggered"), "Incorrect action id value" );
+        
+        // Clean up
+        CleanupStack::PopAndDestroy( co );
+        CleanupStack::PopAndDestroy( &client );
+        CleanupStack::PopAndDestroy( script1 );
+        }
+    }
+
+
+void MT_CFScriptEngine::MT_CCFScriptHandler_DeleteScriptByNameL()
+    {
+    // Load script
+    HBufC8* script = LoadScriptFromFile( _L( "test-and.xml" ) );
+    EUNIT_ASSERT_DESC( script , "Scripts not loaded" );
+    User::LeaveIfNull( script );
+    CleanupStack::PushL( script );
+    RThread client;
+    CleanupClosePushL( client );
+    
+    // Test data
+    const TUid KUidClient1 = {0x12340001};
+    const TUid KUidClient2 = {0x12340002};
+    _LIT( KClient1Path1, "c:\\private\\10282BC4\\rules\\12340001\\script1.rul" );
+    _LIT( KClient1Path2, "c:\\private\\10282BC4\\rules\\12340001\\script2.rul" );
+    _LIT( KClient2Path1, "c:\\private\\10282BC4\\rules\\12340002\\script1.rul" );
+    _LIT( KClient2Path2, "c:\\private\\10282BC4\\rules\\12340002\\script2.rul" );
+
+    TInt err = KErrNone;
+    TInt scriptId = 0;
+    TBool exists = EFalse;        
+    
+    // Define needed contexts for scripts
+    static _LIT_SECURITY_POLICY_PASS( alwaysPass );
+    err = iCFFakeEnv->DefineContext( _L("Application.State"),
+        _L("Foreground.Application"), alwaysPass, alwaysPass );
+    EUNIT_ASSERT_DESC( err == KErrNone, "DefineContext failed!" );
+    err = iCFFakeEnv->DefineContext( _L("Application.State"),
+        _L("Foreground.View"), alwaysPass, alwaysPass );
+    EUNIT_ASSERT_DESC( err == KErrNone, "DefineContext failed!" );
+
+    // Add and save scripts
+    const TInt KCount = 4;
+    for( TInt i = 0; i < KCount; i++ )
+        {
+        TPtrC fullPath( KNullDesC );
+        TUid uid = {0x00000000};
+        switch( i )
+            {
+            case 0:
+                {
+                fullPath.Set( KClient1Path1 );
+                uid = KUidClient1;
+                break;
+                }
+            case 1:
+                {
+                fullPath.Set( KClient1Path2 );
+                uid = KUidClient1;
+                break;
+                }
+            case 2:
+                {
+                fullPath.Set( KClient2Path1 );
+                uid = KUidClient2;
+                break;
+                }
+            case 3:
+                {
+                fullPath.Set( KClient2Path2 );
+                uid = KUidClient2;
+                break;
+                }
+            default:
+                {
+                break;
+                }
+            }
+        TParsePtrC parse( fullPath );
+        scriptId = iCFFakeEnv->AddScript( parse.Name(), *script, uid,
+            client );
+        EUNIT_ASSERT_DESC( scriptId == i + 1, "Invalid script id" );
+        err = iCFFakeEnv->SaveScript( *script, scriptId, uid );
+        EUNIT_ASSERT_DESC( err == KErrNone, "SaveScript failed" );
+        }
+    
+    // Delete and check scripts
+    for( TInt i = 0; i < KCount; i++ )
+        {
+        switch( i )
+            {
+            case 0:
+                {
+                err = iCFFakeEnv->DeleteScriptByName( KClient1Path1, KUidClient1 );
+                EUNIT_ASSERT_DESC( err == KErrNone, "Delete script failed" );
+                exists = BaflUtils::FileExists( iFs, KClient1Path1 );
+                EUNIT_ASSERT_DESC( !exists, "Script not deleted" );
+                
+                err = iCFFakeEnv->RemoveScriptByName( KClient1Path1, KUidClient1 );
+                EUNIT_ASSERT_DESC( err == KErrNone, "Remove script by name failed" );
+                break;
+                }
+            case 1:
+                {
+                err = iCFFakeEnv->DeleteScriptByName( KClient1Path2, KUidClient1 );
+                EUNIT_ASSERT_DESC( err == KErrNone, "Delete script failed" );
+                exists = BaflUtils::FileExists( iFs, KClient1Path2 );
+                EUNIT_ASSERT_DESC( !exists, "Script not deleted" );
+                
+                err = iCFFakeEnv->RemoveScriptByName( KClient1Path2, KUidClient1 );
+                EUNIT_ASSERT_DESC( err == KErrNone, "Remove script by name failed" );
+                
+                // Check that folder is deleted
+                TParsePtrC parse( KClient1Path1 );
+                exists = BaflUtils::FolderExists( iFs, parse.DriveAndPath() );
+                EUNIT_ASSERT_DESC( !exists, "Folder not deleted" );
+                break;
+                }
+            case 2:
+                {
+                err = iCFFakeEnv->RemoveScriptByName( KClient2Path1, KUidClient2 );
+                EUNIT_ASSERT_DESC( err == KErrNone, "Remove script by name failed" );
+
+                err = iCFFakeEnv->DeleteScriptByName( KClient2Path1, KUidClient2 );
+                EUNIT_ASSERT_DESC( err == KErrDeregisterNotNeeded, "Delete script failed" );
+                exists = BaflUtils::FileExists( iFs, KClient2Path1 );
+                EUNIT_ASSERT_DESC( !exists, "Script not deleted" );
+                break;
+                }
+            case 3:
+                {
+                err = iCFFakeEnv->RemoveScriptByName( KClient2Path2, KUidClient2 );
+                EUNIT_ASSERT_DESC( err == KErrNone, "Remove script by name failed" );
+
+                err = iCFFakeEnv->DeleteScriptByName( KClient2Path2, KUidClient2 );
+                EUNIT_ASSERT_DESC( err == KErrDeregisterNotNeeded, "Delete script failed" );
+                exists = BaflUtils::FileExists( iFs, KClient2Path2 );
+                EUNIT_ASSERT_DESC( !exists, "Script not deleted" );
+                
+                // Check that folder is deleted
+                TParsePtrC parse( KClient2Path1 );
+                exists = BaflUtils::FolderExists( iFs, parse.DriveAndPath() );
+                EUNIT_ASSERT_DESC( !exists, "Folder not deleted" );
+                break;
+                }
+            default:
+                {
+                break;
+                }
+            }
+        }
+    
+    // Try to delete a script which does not exist
+    err = iCFFakeEnv->DeleteScriptByName( _L( "notfound.rul" ), KUidClient1 );
+    EUNIT_ASSERT_DESC( err == KErrNotFound, "Delete script failed" );
+    
+    // x. Clean up
+    // -------------------------------------------------------------------------
+    CleanupStack::PopAndDestroy( &client );
+    CleanupStack::PopAndDestroy( script );
+    }
+
+
+void MT_CFScriptEngine::MT_CCFScriptHandler_DeleteScriptByName2L()
+    {
+    // Preconditions
+    // -------------------------------------------------------------------------
+    HBufC8* script = LoadScriptFromFile( _L("test-countRepeatingWithValuePersistent.xml") );
+    EUNIT_ASSERT_DESC( script , "Scripts not loaded" );
+    User::LeaveIfNull( script );
+    CleanupStack::PushL( script );
+    RThread client;
+    CleanupClosePushL( client );    
+    CCFContextObject* co = CCFContextObject::NewLC();
+
+    const TUid KClientUid = {0x12340001};
+    _LIT( KScript,
+        "c:\\private\\10282BC4\\rules\\12340001\\test-countRepeatingWithValuePersistent.rul" );
+    _LIT( KScriptPresistencyFile,
+        "c:\\private\\10282BC4\\rules\\12340001\\test-countRepeatingWithValuePersistent-testCountPersistency.dat" );
+
+    // Define needed contexts
+    static _LIT_SECURITY_POLICY_PASS( alwaysPass );
+    TInt err = iCFFakeEnv->DefineContext( _L("Test"), _L("Counting"), alwaysPass, alwaysPass );
+    EUNIT_ASSERT_DESC( err == KErrNone, "Define context failed" );
+    err = iCFFakeEnv->DefineContext( _L("Test"), _L("Control"), alwaysPass, alwaysPass );
+    EUNIT_ASSERT_DESC( err == KErrNone, "Define context failed" );
+
+    // Add script and save it
+    // -------------------------------------------------------------------------
+    TInt scriptId = iCFFakeEnv->AddScript( KScript, *script, KClientUid, client );
+    EUNIT_ASSERT_DESC( scriptId > 0, "Add script failed" );
+    err = iCFFakeEnv->SaveScript( *script, scriptId, KClientUid );
+    EUNIT_ASSERT_DESC( err == KErrNone, "Save script failed" );
+
+    // Publish context so that persistent data file is created
+    // -------------------------------------------------------------------------
+    co->SetSourceL( _L("Test") );
+    co->SetTypeL( _L("Counting") );
+    co->SetValueL( _L("A") );
+    err = iCFFakeEnv->PublishContext( *co, client );
+    EUNIT_ASSERT_DESC( err == KErrNone, "Publish context failed" );
+    TBool exists = BaflUtils::FileExists( iFs, KScriptPresistencyFile );
+    EUNIT_ASSERT_DESC( exists, "Persistency file not created" );
+    
+    // Remove script by name and delete script by name
+    // -------------------------------------------------------------------------
+    err = iCFFakeEnv->RemoveScriptByName( KScript, KClientUid );
+    EUNIT_ASSERT_DESC( err == KErrNone, "Remove script by name failed" );
+    err = iCFFakeEnv->DeleteScriptByName( KScript, KClientUid );
+    EUNIT_ASSERT_DESC( err == KErrDeregisterNotNeeded, "Delete script by name failed" );
+    
+    // Check that script file and persistency file are removed
+    exists = BaflUtils::FileExists( iFs, KScript );
+    EUNIT_ASSERT_DESC( !exists, "Script file not deleted" );
+    exists = BaflUtils::FileExists( iFs, KScriptPresistencyFile );
+    EUNIT_ASSERT_DESC( !exists, "Script persistency file not deleted" );
+    exists = BaflUtils::FolderExists( iFs, KScript );
+    EUNIT_ASSERT_DESC( !exists, "Client rule folder not removed" );
+
+    // Clean up
+    // -------------------------------------------------------------------------
+    CleanupStack::PopAndDestroy( co );
+    CleanupStack::PopAndDestroy( &client );
+    CleanupStack::PopAndDestroy( script );
+    }
+
+
+void MT_CFScriptEngine::MT_CCFScriptHandler_DeleteScriptByUidL()
+    {
+    // Load script
+    HBufC8* script = LoadScriptFromFile( _L( "test-and.xml" ) );
+    EUNIT_ASSERT_DESC( script , "Scripts not loaded" );
+    if( script )
+        {
+        CleanupStack::PushL( script );
+        RThread client;
+        CleanupClosePushL( client );
+        
+        // Test data
+        const TUid KUidClient1 = {0x12340001};
+        const TUid KUidClient2 = {0x12340002};
+        _LIT( KClient1Path1, "c:\\private\\10282BC4\\rules\\12340001\\script1.rul" );
+        _LIT( KClient1Path2, "c:\\private\\10282BC4\\rules\\12340001\\script2.rul" );
+        _LIT( KClient2Path1, "c:\\private\\10282BC4\\rules\\12340002\\script1.rul" );
+        _LIT( KClient2Path2, "c:\\private\\10282BC4\\rules\\12340002\\script2.rul" );
+
+        TInt err = KErrNone;
+        TInt scriptId = 0;
+        TBool exists = EFalse;        
+        
+        // Define needed contexts for scripts
+        static _LIT_SECURITY_POLICY_PASS( alwaysPass );
+        err = iCFFakeEnv->DefineContext( _L("Application.State"),
+            _L("Foreground.Application"), alwaysPass, alwaysPass );
+        EUNIT_ASSERT_DESC( err == KErrNone, "DefineContext failed!" );
+        err = iCFFakeEnv->DefineContext( _L("Application.State"),
+            _L("Foreground.View"), alwaysPass, alwaysPass );
+        EUNIT_ASSERT_DESC( err == KErrNone, "DefineContext failed!" );
+
+        // Add and save scripts
+        const TInt KCount = 4;
+        for( TInt i = 0; i < KCount; i++ )
+            {
+            TPtrC fullPath( KNullDesC );
+            TUid uid = {0x00000000};
+            switch( i )
+                {
+                case 0:
+                    {
+                    fullPath.Set( KClient1Path1 );
+                    uid = KUidClient1;
+                    break;
+                    }
+                case 1:
+                    {
+                    fullPath.Set( KClient1Path2 );
+                    uid = KUidClient1;
+                    break;
+                    }
+                case 2:
+                    {
+                    fullPath.Set( KClient2Path1 );
+                    uid = KUidClient2;
+                    break;
+                    }
+                case 3:
+                    {
+                    fullPath.Set( KClient2Path2 );
+                    uid = KUidClient2;
+                    break;
+                    }
+                default:
+                    {
+                    break;
+                    }
+                }
+            TParsePtrC parse( fullPath );
+            scriptId = iCFFakeEnv->AddScript( parse.Name(), *script, uid,
+                client );
+            EUNIT_ASSERT_DESC( scriptId == i + 1, "Invalid script id" );
+            err = iCFFakeEnv->SaveScript( *script, scriptId, uid );
+            EUNIT_ASSERT_DESC( err == KErrNone, "SaveScript failed" );
+            }
+        
+        // Delete and check scripts - test 1
+        err = iCFFakeEnv->DeleteScriptByUid( KUidClient1 );
+        EUNIT_ASSERT_DESC( err == KErrNone, "Delete script by uid failed" );
+        exists = BaflUtils::FileExists( iFs, KClient1Path1 );
+        EUNIT_ASSERT_DESC( !exists, "Script not deleted" );
+        exists = BaflUtils::FileExists( iFs, KClient1Path2 );
+        EUNIT_ASSERT_DESC( !exists, "Script not deleted" );
+        TParsePtrC parse1( KClient1Path1 );
+        exists = BaflUtils::FolderExists( iFs, parse1.DriveAndPath() );
+        EUNIT_ASSERT_DESC( !exists, "Folder not removed" );
+        
+        // Remove, delete and check scripts - test 2
+        err = iCFFakeEnv->RemoveScriptByUid( KUidClient2 );
+        EUNIT_ASSERT_DESC( err == KErrNone, "Remove script by uid failed" );
+        err = iCFFakeEnv->DeleteScriptByUid( KUidClient2 );
+        EUNIT_ASSERT_DESC( err == KErrDeregisterNotNeeded, "Delete script by uid failed" );
+        exists = BaflUtils::FileExists( iFs, KClient2Path1 );
+        EUNIT_ASSERT_DESC( !exists, "Script not deleted" );
+        exists = BaflUtils::FileExists( iFs, KClient2Path2 );
+        EUNIT_ASSERT_DESC( !exists, "Script not deleted" );
+        TParsePtrC parse2( KClient2Path1 );
+        exists = BaflUtils::FolderExists( iFs, parse2.DriveAndPath() );
+        EUNIT_ASSERT_DESC( !exists, "Folder not removed" );
+        
+        // Delete scripts form a client which does not own any scripts
+        err = iCFFakeEnv->DeleteScriptByUid( KUidClient2 );
+        EUNIT_ASSERT_DESC( err == KErrNotFound || err == KErrPathNotFound,
+            "Delete script by uid failed" );
+        
+        // Clean up
+        CleanupStack::PopAndDestroy( &client );
+        CleanupStack::PopAndDestroy( script );
+        }
+    }
+
+
+void MT_CFScriptEngine::MT_CCFScriptHandler_AlreadyExistsL()
+    {
+    // Load script
+    HBufC8* script = LoadScriptFromFile( _L( "test-and.xml" ) );
+    EUNIT_ASSERT_DESC( script , "Scripts not loaded" );
+    if( script )
+        {
+        CleanupStack::PushL( script );
+        RThread client;
+        CleanupClosePushL( client );
+
+        // Test data
+        const TUid KUidClient1 = {0x12340001};
+        const TUid KUidClient2 = {0x12340002};
+        _LIT( KClient1Path1, "c:\\private\\10282BC4\\rules\\12340001\\script1.rul" );
+        _LIT( KClient1Path2, "c:\\private\\10282BC4\\rules\\12340001\\script2.rul" );
+        _LIT( KClient2Path1, "c:\\private\\10282BC4\\rules\\12340002\\script1.rul" );
+        _LIT( KClient2Path2, "c:\\private\\10282BC4\\rules\\12340002\\script2.rul" );
+
+        TInt err = KErrNone;
+        TInt scriptId = 0;
+        TBool exists = EFalse;        
+
+        // Define needed contexts for scripts
+        static _LIT_SECURITY_POLICY_PASS( alwaysPass );
+        err = iCFFakeEnv->DefineContext( _L("Application.State"),
+            _L("Foreground.Application"), alwaysPass, alwaysPass );
+        EUNIT_ASSERT_DESC( err == KErrNone, "DefineContext failed!" );
+        err = iCFFakeEnv->DefineContext( _L("Application.State"),
+            _L("Foreground.View"), alwaysPass, alwaysPass );
+        EUNIT_ASSERT_DESC( err == KErrNone, "DefineContext failed!" );
+
+        // Add and save scripts
+        const TInt KCount = 4;
+        for( TInt i = 0; i < KCount; i++ )
+            {
+            TPtrC fullPath( KNullDesC );
+            TUid uid = {0x00000000};
+            switch( i )
+                {
+                case 0:
+                    {
+                    fullPath.Set( KClient1Path1 );
+                    uid = KUidClient1;
+                    break;
+                    }
+                case 1:
+                    {
+                    fullPath.Set( KClient1Path2 );
+                    uid = KUidClient1;
+                    break;
+                    }
+                case 2:
+                    {
+                    fullPath.Set( KClient2Path1 );
+                    uid = KUidClient2;
+                    break;
+                    }
+                case 3:
+                    {
+                    fullPath.Set( KClient2Path2 );
+                    uid = KUidClient2;
+                    break;
+                    }
+                default:
+                    {
+                    break;
+                    }
+                }
+            TParsePtrC parse( fullPath );
+            scriptId = iCFFakeEnv->AddScript( parse.Name(), *script, uid,
+                client );
+            EUNIT_ASSERT_DESC( scriptId == i + 1, "Invalid script id" );
+            err = iCFFakeEnv->SaveScript( *script, scriptId, uid );
+            EUNIT_ASSERT_DESC( err == KErrNone, "SaveScript failed" );
+            exists = iCFFakeEnv->AlreadyExists( parse.Name(), uid, scriptId );
+            EUNIT_ASSERT_DESC( exists, "Already exists failed" );
+            }
+        
+        // Check script which has not been added
+        scriptId = KErrNotFound;
+        exists = iCFFakeEnv->AlreadyExists( _L( "notadded.rul" ), KUidClient1, scriptId );
+        EUNIT_ASSERT_DESC( !exists, "Already exists failed" );
+        EUNIT_ASSERT_DESC( scriptId == KErrNotFound, "Invalid script id" );
+
+        // Clean up
+        CleanupStack::PopAndDestroy( &client );
+        CleanupStack::PopAndDestroy( script );
+        }
+    }
+
+
+void MT_CFScriptEngine::MT_CCFScriptHandler_CleanupPersistentDataByNameL()
+    {
+    // Load script
+    HBufC8* script = LoadScriptFromFile( _L("test-countRepeatingWithValuePersistent.xml") );
+    EUNIT_ASSERT_DESC( script , "Scripts not loaded" );
+    if( script )
+        {
+        CleanupStack::PushL( script );
+        RThread client;
+        CleanupClosePushL( client );
+        
+        // Test data
+        const TUid KUidClient1 = {0x12340001};
+        const TUid KUidClient2 = {0x12340002};
+        _LIT( KClient1Path,
+            "c:\\private\\10282BC4\\rules\\12340001\\test-countRepeatingWithValuePersistent.rul" );
+        _LIT( KClient2Path,
+            "c:\\private\\10282BC4\\rules\\12340002\\test-countRepeatingWithValuePersistent.rul" );
+        _LIT( KClient1PresistencyFile,
+            "c:\\private\\10282BC4\\rules\\12340001\\test-countRepeatingWithValuePersistent-testCountPersistency.dat" );
+        _LIT( KClient2PresistencyFile,
+            "c:\\private\\10282BC4\\rules\\12340002\\test-countRepeatingWithValuePersistent-testCountPersistency.dat" );
+        
+        // Define needed contexts
+        static _LIT_SECURITY_POLICY_PASS( alwaysPass );
+        TInt err = iCFFakeEnv->DefineContext( _L("Test"), _L("Counting"),
+            alwaysPass, alwaysPass );
+        EUNIT_ASSERT_DESC( err == KErrNone, "Define context failed" );
+        err = iCFFakeEnv->DefineContext( _L("Test"), _L("Control"),
+            alwaysPass, alwaysPass );
+        EUNIT_ASSERT_DESC( err == KErrNone, "Define context failed" );
+        
+        // Add scripts
+        const TInt KCount = 2;
+        for( TInt i = 0; i < KCount; i++ )
+            {
+            TPtrC fullPath( KNullDesC );
+            TUid uid = {0x0};
+            switch( i )
+                {
+                case 0:
+                    {
+                    fullPath.Set( KClient1Path );
+                    uid = KUidClient1;
+                    break;
+                    }
+                case 1:
+                    {
+                    fullPath.Set( KClient2Path );
+                    uid = KUidClient2;
+                    break;
+                    }
+                default:
+                    {
+                    break;
+                    }
+                }
+            TParsePtrC parse( fullPath );
+            TInt scriptId = iCFFakeEnv->AddScript( parse.Name(), *script, uid,
+                client );
+            EUNIT_ASSERT_DESC( err == KErrNone, "Add script failed" );
+            }
+        
+        // Publish new context for Test, Counting
+        CCFContextObject* context = CCFContextObject::NewLC(
+            _L("Test"), _L("Counting"), _L("A") );
+        err = iCFFakeEnv->PublishContext( *context, client );
+        EUNIT_ASSERT_DESC( err == KErrNone, "Publish context failed" );
+        
+        // check that persistency files exists
+        TBool exists = BaflUtils::FileExists( iFs, KClient1PresistencyFile );
+        EUNIT_ASSERT_DESC( exists, "Persistency file not created" );
+        exists = BaflUtils::FileExists( iFs, KClient2PresistencyFile );
+        EUNIT_ASSERT_DESC( exists, "Persistency file not created" );
+        
+        // Cleanup persistent data
+        for( TInt i = 0; i < KCount; i++ )
+            {
+            TPtrC scriptFilePath( KNullDesC );
+            TPtrC presistencyFilePath( KNullDesC );
+            TUid uid = {0x0};
+            switch( i )
+                {
+                case 0:
+                    {
+                    scriptFilePath.Set( KClient1Path );
+                    presistencyFilePath.Set( KClient1PresistencyFile );
+                    uid = KUidClient1;
+                    break;
+                    }
+                case 1:
+                    {
+                    scriptFilePath.Set( KClient2Path );
+                    presistencyFilePath.Set( KClient2PresistencyFile );
+                    uid = KUidClient2;
+                    break;
+                    }
+                default:
+                    {
+                    break;
+                    }
+                }
+            TParsePtrC parse( scriptFilePath );
+            iCFFakeEnv->CleanupPersistentDataByName( parse.Name(), uid );
+            exists = BaflUtils::FileExists( iFs, presistencyFilePath );
+            EUNIT_ASSERT_DESC( !exists, "Cleanup persistent data by name failed" );
+            }
+
+        // Clean up
+        CleanupStack::PopAndDestroy( context );
+        CleanupStack::PopAndDestroy( &client );
+        CleanupStack::PopAndDestroy( script );
+        }
+    }
+
+
+void MT_CFScriptEngine::MT_CCFScriptHandler_CleanupPersistentDataByUidL()
+    {
+    // Load script
+    HBufC8* script1 = LoadScriptFromFile( _L("test-countRepeatingWithValuePersistent.xml") );
+    EUNIT_ASSERT_DESC( script1 , "Script1 not loaded" );
+    CleanupStack::PushL( script1 );
+    
+    HBufC8* script2 = LoadScriptFromFile( _L("test-countRepeatingWithValuePersistent2.xml") );
+    EUNIT_ASSERT_DESC( script2 , "Script2 not loaded" );
+    CleanupStack::PushL( script2 );
+
+    RThread client;
+    CleanupClosePushL( client );
+    
+    // Test data
+    const TUid KUidClient1 = {0x12340001};
+    const TUid KUidClient2 = {0x12340002};
+    _LIT( KClient1Path,
+        "c:\\private\\10282BC4\\rules\\12340001\\test-countRepeatingWithValuePersistent.rul" );
+    _LIT( KClient1Path2,
+        "c:\\private\\10282BC4\\rules\\12340001\\test-countRepeatingWithValuePersistent2.rul" );
+    _LIT( KClient1PresistencyFile,
+        "c:\\private\\10282BC4\\rules\\12340001\\test-countRepeatingWithValuePersistent-testCountPersistency.dat" );
+    _LIT( KClient1PresistencyFile2,
+        "c:\\private\\10282BC4\\rules\\12340001\\test-countRepeatingWithValuePersistent2-testCountPersistency2.dat" );
+    _LIT( KClient2Path,
+        "c:\\private\\10282BC4\\rules\\12340002\\test-countRepeatingWithValuePersistent.rul" );
+    _LIT( KClient2PresistencyFile,
+        "c:\\private\\10282BC4\\rules\\12340002\\test-countRepeatingWithValuePersistent-testCountPersistency.dat" );
+    
+    // Define needed contexts
+    static _LIT_SECURITY_POLICY_PASS( alwaysPass );
+    TInt err = iCFFakeEnv->DefineContext( _L("Test"), _L("Counting"),
+        alwaysPass, alwaysPass );
+    EUNIT_ASSERT_DESC( err == KErrNone, "Define context failed" );
+    err = iCFFakeEnv->DefineContext( _L("Test"), _L("Control"),
+        alwaysPass, alwaysPass );
+    EUNIT_ASSERT_DESC( err == KErrNone, "Define context failed" );
+    
+    // Add scripts
+    const TInt KCount = 3;
+    for( TInt i = 0; i < KCount; i++ )
+        {
+        TPtrC fullPath( KNullDesC );
+        TUid uid = {0x0};
+        TPtrC8 script( KNullDesC8 );
+        switch( i )
+            {
+            case 0:
+                {
+                fullPath.Set( KClient1Path );
+                uid = KUidClient1;
+                script.Set( *script1 );
+                break;
+                }
+            case 1:
+                {
+                fullPath.Set( KClient1Path2 );
+                uid = KUidClient1;
+                script.Set( *script2 );
+                break;
+                }
+            case 2:
+                {
+                fullPath.Set( KClient2Path );
+                uid = KUidClient2;
+                script.Set( *script1 );
+                break;
+                }
+            default:
+                {
+                break;
+                }
+            }
+        TParsePtrC parse( fullPath );
+        TInt scriptId = iCFFakeEnv->AddScript( parse.Name(), script, uid,
+            client );
+        EUNIT_ASSERT_DESC( err == KErrNone, "Add script failed" );
+        }
+    
+    // Publish new context for Test, Counting
+    CCFContextObject* context = CCFContextObject::NewLC(
+        _L("Test"), _L("Counting"), _L("A") );
+    err = iCFFakeEnv->PublishContext( *context, client );
+    EUNIT_ASSERT_DESC( err == KErrNone, "Publish context failed" );
+    
+    // check that persistency files exists
+    TBool exists = BaflUtils::FileExists( iFs, KClient1PresistencyFile );
+    EUNIT_ASSERT_DESC( exists, "Persistency file not created" );
+    exists = BaflUtils::FileExists( iFs, KClient1PresistencyFile2 );
+    EUNIT_ASSERT_DESC( exists, "Persistency file not created" );
+    exists = BaflUtils::FileExists( iFs, KClient2PresistencyFile );
+    EUNIT_ASSERT_DESC( exists, "Persistency file not created" );
+    
+    // Cleanup persistent data
+    iCFFakeEnv->CleanupPersistentDataByUid( KUidClient1 );
+    exists = BaflUtils::FileExists( iFs, KClient1PresistencyFile );
+    EUNIT_ASSERT_DESC( !exists, "Persistency file not created" );
+    exists = BaflUtils::FileExists( iFs, KClient1PresistencyFile2 );
+    EUNIT_ASSERT_DESC( !exists, "Persistency file not created" );
+
+    iCFFakeEnv->CleanupPersistentDataByUid( KUidClient2 );
+    exists = BaflUtils::FileExists( iFs, KClient2PresistencyFile );
+    EUNIT_ASSERT_DESC( !exists, "Persistency file not created" );
+
+    // Clean up
+    CleanupStack::PopAndDestroy( context );
+    CleanupStack::PopAndDestroy( &client );
+    CleanupStack::PopAndDestroy( script2 );
+    CleanupStack::PopAndDestroy( script1 );
+    }
+
+
+void MT_CFScriptEngine::MT_CCFScriptHandler_RestoreRomScriptL()
+    {
+    // Load script
+    HBufC8* script = LoadScriptFromFile( _L("test-scriptUpgradeRom.xml") );
+    EUNIT_ASSERT_DESC( script , "Scripts not loaded" );
+    if( script )
+        {
+        CleanupStack::PushL( script );
+        RThread client;
+        CleanupClosePushL( client );
+        CCFContextObject* context = CCFContextObject::NewLC(
+            _L("test"), _L("upgrade"), _L("false") );
+        
+        // Define needed contexts
+        static _LIT_SECURITY_POLICY_PASS( alwaysPass );
+        TInt err = iCFFakeEnv->DefineContext( context->Source(), context->Type(),
+            alwaysPass, alwaysPass );
+        EUNIT_ASSERT_DESC( err == KErrNone, "Define context failed" );
+
+        // Initialize script engine and test that rom script is used
+        iCFFakeEnv->InitAllPhasesL();
+        context->SetValueL( _L("false") );
+        err = iCFFakeEnv->PublishContext( *context, client );
+        EUNIT_ASSERT_DESC( err == KErrNone, "Publish context failed" );
+        TBool eventFired = iCFFakeEnv->ClientEventFired();
+        EUNIT_ASSERT_DESC( eventFired, "Action not fired" );
+        TPtrC actionId = iCFFakeEnv->ScriptEventIdentifier();
+        EUNIT_ASSERT_DESC( actionId == _L("romUpgrade"), "Invalid action id" );
+        const RKeyValueArray& params = iCFFakeEnv->ScriptEventParameters();
+        EUNIT_ASSERT_DESC( params[0]->Key() == _L("id"), "Invalid action attribute" );
+        EUNIT_ASSERT_DESC( params[0]->Value() == _L("false"), "Invalid action attribute value" );
+        
+        // Upgrade rom script and test upgrade is used
+        TInt scriptId = 0;
+        TBool exists = iCFFakeEnv->AlreadyExists( _L("test-scriptUpgradeRom"),
+            KCFServerUid, scriptId );
+        EUNIT_ASSERT_DESC( exists, "Already exists failed" );
+        EUNIT_ASSERT_DESC( scriptId > 0, "Invalid script id" );
+        err = iCFFakeEnv->UpdateScript( scriptId, client, *script, NULL );
+        EUNIT_ASSERT_DESC( err == KErrNone, "Update script failed" );
+        err = iCFFakeEnv->SaveScript( *script, scriptId, KCFServerUid );
+        EUNIT_ASSERT_DESC( err == KErrNone, "Save script failed" );
+        
+        context->SetValueL( _L("true") );
+        err = iCFFakeEnv->PublishContext( *context, client );
+        EUNIT_ASSERT_DESC( err == KErrNone, "Publish context failed" );
+        eventFired = iCFFakeEnv->ClientEventFired();
+        EUNIT_ASSERT_DESC( eventFired, "Action not fired" );
+        actionId.Set( iCFFakeEnv->ScriptEventIdentifier() );
+        EUNIT_ASSERT_DESC( actionId == _L("romUpgrade"), "Invalid action id" );
+        const RKeyValueArray& params1 = iCFFakeEnv->ScriptEventParameters();
+        EUNIT_ASSERT_DESC( params1[0]->Key() == _L("id"), "Invalid action attribute" );
+        EUNIT_ASSERT_DESC( params1[0]->Value() == _L("true"), "Invalid action attribute value" );
+        
+        // Delete script engine and initialize it again
+        // Check that rom upgrade is used instead of original rom script
+        delete iCFFakeEnv;
+        iCFFakeEnv = NULL;
+        iCFFakeEnv = CCFFakeEnv::NewL();
+        iCFFakeEnv->InitAllPhasesL();
+
+        err = iCFFakeEnv->DefineContext( context->Source(), context->Type(),
+            alwaysPass, alwaysPass );
+        EUNIT_ASSERT_DESC( err == KErrNone, "Define context failed" );
+
+        context->SetValueL( _L("true") );
+        err = iCFFakeEnv->PublishContext( *context, client );
+        EUNIT_ASSERT_DESC( err == KErrNone, "Publish context failed" );
+        eventFired = iCFFakeEnv->ClientEventFired();
+        EUNIT_ASSERT_DESC( eventFired, "Action not fired" );
+        actionId.Set( iCFFakeEnv->ScriptEventIdentifier() );
+        EUNIT_ASSERT_DESC( actionId == _L("romUpgrade"), "Invalid action id" );
+        const RKeyValueArray& params2 = iCFFakeEnv->ScriptEventParameters();
+        EUNIT_ASSERT_DESC( params2[0]->Key() == _L("id"), "Invalid action attribute" );
+        EUNIT_ASSERT_DESC( params2[0]->Value() == _L("true"), "Invalid action attribute value" );
+        
+        // Restore rom script and check that rom script is used again
+        exists = iCFFakeEnv->AlreadyExists( _L("test-scriptUpgradeRom"),
+            KCFServerUid, scriptId );
+        EUNIT_ASSERT_DESC( exists, "Already exists failed" );
+        EUNIT_ASSERT_DESC( scriptId > 0, "Invalid script id" );
+        err = iCFFakeEnv->RestoreRomScript( scriptId, KCFServerUid, client );
+        EUNIT_ASSERT_DESC( err == KErrNone, "Restore script failed" );
+        
+        context->SetValueL( _L("false") );
+        err = iCFFakeEnv->PublishContext( *context, client );
+        EUNIT_ASSERT_DESC( err == KErrNone, "Publish context failed" );
+        eventFired = iCFFakeEnv->ClientEventFired();
+        EUNIT_ASSERT_DESC( eventFired, "Action not fired" );
+        actionId.Set( iCFFakeEnv->ScriptEventIdentifier() );
+        EUNIT_ASSERT_DESC( actionId == _L("romUpgrade"), "Invalid action id" );
+        const RKeyValueArray& params3 = iCFFakeEnv->ScriptEventParameters();
+        EUNIT_ASSERT_DESC( params3[0]->Key() == _L("id"), "Invalid action attribute" );
+        EUNIT_ASSERT_DESC( params3[0]->Value() == _L("false"), "Invalid action attribute value" );
+
+        // Clean up
+        CleanupStack::PopAndDestroy( context );
+        CleanupStack::PopAndDestroy( &client );
+        CleanupStack::PopAndDestroy( script );
+        }
+    }
+
+
+void MT_CFScriptEngine::MT_CCFScriptHandler_InitAllPhasesL()
+    {
+    // Just check that script loading don't leak memory
+    iCFFakeEnv->InitAllPhasesL();
+    }
+
+
+void MT_CFScriptEngine::MT_CCFScriptHandler_IsUpgradeAllowedL()
+    {
+    HBufC8* script = LoadScriptFromFile(
+        _L("test-scriptUpgradeRom.xml") );
+    EUNIT_ASSERT_DESC( script, "Failed to load script" );
+    CleanupStack::PushL( script );
+    
+    HBufC8* scriptMissingCaps = LoadScriptFromFile(
+        _L("test-scriptUpgradeRomCapabilitiesMissing.xml") );
+    EUNIT_ASSERT_DESC( scriptMissingCaps, "Failed to load script" );
+    CleanupStack::PushL( scriptMissingCaps );
+    
+    HBufC8* scriptNoCapsSet = LoadScriptFromFile(
+        _L("test-scriptUpgradeRomNoUpgradeSecurity.xml") );
+    EUNIT_ASSERT_DESC( scriptNoCapsSet, "Failed to load script" );
+    CleanupStack::PushL( scriptNoCapsSet );
+    
+    HBufC8* scriptClientMissingCaps = LoadScriptFromFile(
+        _L("test-scriptUpgradeRomClientMissingCapability.xml") );
+    EUNIT_ASSERT_DESC( scriptClientMissingCaps, "Failed to load script" );
+    CleanupStack::PushL( scriptClientMissingCaps );
+    
+    RThread client;
+    CleanupClosePushL( client );
+    
+    // Preconditions
+    // -------------------------------------------------------------------------
+    static _LIT_SECURITY_POLICY_PASS( alwaysPass );
+    CCFContextObject* co = CCFContextObject::NewLC();
+    co->SetSourceL( _L("test") );
+    co->SetTypeL( _L("upgrade") );
+    TInt err = iCFFakeEnv->DefineContext( co->Source(), co->Type(),
+        alwaysPass, alwaysPass );
+    EUNIT_ASSERT_DESC( err == KErrNone, "Define context failed" );
+    
+    // Load all scripts found
+    iCFFakeEnv->InitAllPhasesL();
+    
+    // x. Check that upgrade is allowed with correct script
+    // -------------------------------------------------------------------------
+    err = iCFFakeEnv->IsUpgradeAllowed( _L("test-scriptUpgradeRom"),
+        *script, KCFServerUid, client, *iCFFakeEnv );
+    EUNIT_ASSERT_DESC( err == KErrNone, "Is upgrade allowed failed" );
+    
+    // x. Check that upgrade is not allowed -
+    //    Cabability missing from upgrade script
+    // -------------------------------------------------------------------------
+    err = iCFFakeEnv->IsUpgradeAllowed( _L("test-scriptUpgradeRom"),
+        *scriptMissingCaps, KCFServerUid, client, *iCFFakeEnv );
+    EUNIT_ASSERT_DESC( err == KErrAccessDenied, "Is upgrade allowed failed" );
+
+    // x. Check that upgrade is not allowed -
+    //    Capabilities not set in the script (using default AllFiles)
+    // -------------------------------------------------------------------------
+    err = iCFFakeEnv->IsUpgradeAllowed( _L("test-scriptUpgradeRom"),
+        *scriptNoCapsSet, KCFServerUid, client, *iCFFakeEnv );
+    EUNIT_ASSERT_DESC( err == KErrAccessDenied, "Is upgrade allowed failed" );
+
+    // x. Check that upgrade is not allowed -
+    //    Client does not have the required capability set
+    // -------------------------------------------------------------------------
+    err = iCFFakeEnv->IsUpgradeAllowed( _L("test-scriptUpgradeRomClientMissingCapability"),
+        *scriptNoCapsSet, KCFServerUid, client, *iCFFakeEnv );
+    EUNIT_ASSERT_DESC( err == KErrAccessDenied, "Is upgrade allowed failed" );
+
+    // Cleanup
+    CleanupStack::PopAndDestroy( co );
+    CleanupStack::PopAndDestroy( &client );
+    CleanupStack::PopAndDestroy( scriptClientMissingCaps );
+    CleanupStack::PopAndDestroy( scriptNoCapsSet );
+    CleanupStack::PopAndDestroy( scriptMissingCaps );
+    CleanupStack::PopAndDestroy( script );
+    }
+
+
+void MT_CFScriptEngine::MT_CCFScriptHandler_RemoveScriptByProviderUidL()
+    {
+    // x. Remove all scripts which have dependency to basic operations plugin
+    //--------------------------------------------------------------------------
+    iCFFakeEnv->InitAllPhasesL();
+    
+    // Get script count
+    TInt count = iCFFakeEnv->NumberOfScripts();
+    EUNIT_PRINT( _L("NumberOfScripts: count = %d"), count );
+    
+    // Get script ids
+    const RArray<TInt>& tempScriptIds = iCFFakeEnv->GetEveryScriptId();
+    RArray<TInt> scriptIds;
+    CleanupClosePushL( scriptIds );
+    for( TInt i = 0; i < tempScriptIds.Count(); i++ )
+        {
+        scriptIds.AppendL( tempScriptIds[i] );
+        }
+    
+    // Remove scripts byt provider uid KBasicOperationsPluginImplementationUid
+    TInt err = iCFFakeEnv->RemoveScriptByProviderUid(
+        TUid::Uid( KBasicOperationsPluginImplementationUid ), ETrue );
+    EUNIT_PRINT( _L("RemoveScriptByProviderUid: err = %d"), err );
+    EUNIT_ASSERT_DESC( err == KErrNone, "Remove script by provider uid failed" );
+
+    // x. Rollback all scripts and check
+    //--------------------------------------------------------------------------
+    iCFFakeEnv->RollbackScripts();
+    TInt newCount = iCFFakeEnv->NumberOfScripts();
+    EUNIT_PRINT( _L("NumberOfScripts: newCount = %d"), newCount );
+    EUNIT_ASSERT_DESC( count == newCount, "Rollback scripts failed" );
+    
+    // Get script ids again, should match
+    const RArray<TInt>& tempNewScriptIds = iCFFakeEnv->GetEveryScriptId();
+    RArray<TInt> newScriptIds;
+    CleanupClosePushL( newScriptIds );
+    for( TInt i = 0; i < tempNewScriptIds.Count(); i++ )
+        {
+        newScriptIds.AppendL( tempScriptIds[i] );
+        }
+    EUNIT_ASSERT_DESC( scriptIds.Count() == newScriptIds.Count(), "Incorrect script ids count" );
+    for( TInt i = 0; i < scriptIds.Count(); i++ )
+        {
+        TInt id = KErrNotFound;
+        for( TInt y = 0; y < newScriptIds.Count(); y++ )
+            {
+            id = newScriptIds[y];
+            if( id == scriptIds[i] )
+                {
+                id = KErrNone;
+                break;
+                }
+            }
+        EUNIT_ASSERT_DESC( id == KErrNone, "Script ids does not match" );
+        }
+
+    // x. Check from a rom script test-rollbackRom.xml that actions are fired
+    //--------------------------------------------------------------------------
+    static _LIT_SECURITY_POLICY_PASS( alwaysPass );
+    CCFContextObject* co = CCFContextObject::NewLC();
+    RThread client;
+    CleanupClosePushL( client );
+    
+    // Define context
+    co->SetSourceL( _L("rollback") );
+    co->SetTypeL( _L("rollback.status") );
+    err = iCFFakeEnv->DefineContext( co->Source(), co->Type(), alwaysPass, alwaysPass );
+    EUNIT_ASSERT_DESC( err == KErrNone, "Define context failed" );
+    
+    // Publish context
+    iCFFakeEnv->ClearFireClientEvent();
+    iCFFakeEnv->ClearFireClientEventCount();
+    co->SetValueL( _L("ok") );
+    err = iCFFakeEnv->PublishContext( *co, client );
+    
+    // Clean up
+    CleanupStack::PopAndDestroy( &client );
+    CleanupStack::PopAndDestroy( co );
+    EUNIT_ASSERT_DESC( err == KErrNone, "Publish context failed" );
+    
+    // Check that action is fired
+    TBool eventFired = iCFFakeEnv->ClientEventFired();
+    EUNIT_ASSERT_DESC( eventFired, "Action not fired" );
+    
+    TPtrC actionId( KNullDesC );
+    actionId.Set( iCFFakeEnv->ScriptEventIdentifier() );
+    EUNIT_ASSERT_DESC( actionId == _L("rollback"), "Invalid action id" );
+
+    const RKeyValueArray& params = iCFFakeEnv->ScriptEventParameters();
+    EUNIT_ASSERT_DESC( params[0]->Key() == _L("status"), "Invalid action attribute" );
+    EUNIT_ASSERT_DESC( params[0]->Value() == _L("ok"), "Invalid action attribute value" );
+
+    // x. clean up
+    //--------------------------------------------------------------------------
+    CleanupStack::PopAndDestroy( &newScriptIds );
+    CleanupStack::PopAndDestroy( &scriptIds );
+    }
+
+
+//  TEST TABLE
+
+EUNIT_BEGIN_TEST_TABLE(
+    MT_CFScriptEngine,
+    "CFScriptEngine module test.",
+    "MODULE" )
+
+EUNIT_TEST(
+    "NewL - test ",
+    "CCFScriptHandler",
+    "NewL",
+    "FUNCTIONALITY",
+    SetupEmptyL, MT_CCFScriptHandler_NewLL, TeardownNoFinalClose)
+
+EUNIT_TEST(
+    "NewLC - test ",
+    "CCFScriptHandler",
+    "NewLC",
+    "FUNCTIONALITY",
+    SetupEmptyL, MT_CCFScriptHandler_NewLCL, Teardown)
+
+EUNIT_TEST(
+    "RemoveScriptById - test ",
+    "MCFScriptEngineInterface",
+    "Parameters",
+    "FUNCTIONALITY",
+    SetupL, MT_CCFScriptHandler_RemoveScriptByIdL, Teardown)
+
+EUNIT_TEST(
+    "RemoveScriptsBySession - test ",
+    "MCFScriptEngineInterface",
+    "Parameters",
+    "FUNCTIONALITY",
+    SetupL, MT_CCFScriptHandler_RemoveScriptsBySessionL, Teardown)
+
+EUNIT_TEST(
+    "RemoveScriptByName - test ",
+    "MCFScriptEngineInterface",
+    "Parameters",
+    "FUNCTIONALITY",
+    SetupL, MT_CCFScriptHandler_RemoveScriptByNameL, Teardown)
+
+EUNIT_TEST(
+    "RemoveScriptByUid - test ",
+    "MCFScriptEngineInterface",
+    "Parameters",
+    "FUNCTIONALITY",
+    SetupL, MT_CCFScriptHandler_RemoveScriptByUidL, Teardown)
+
+EUNIT_TEST(
+    "NumberOfScripts - test ",
+    "MCFScriptEngineInterface",
+    "Parameters",
+    "FUNCTIONALITY",
+    SetupL, MT_CCFScriptHandler_NumberOfScriptsL, Teardown)
+
+EUNIT_TEST(
+    "ScriptLength - test ",
+    "MCFScriptEngineInterface",
+    "Parameters",
+    "FUNCTIONALITY",
+    SetupL, MT_CCFScriptHandler_ScriptLengthL, Teardown)
+
+EUNIT_TEST(
+    "NumberOfScriptsByOwner - test ",
+    "MCFScriptEngineInterface",
+    "Parameters",
+    "FUNCTIONALITY",
+    SetupL, MT_CCFScriptHandler_NumberOfScriptsByOwnerL, Teardown)
+
+EUNIT_TEST(
+    "GetEveryScriptIdL - test ",
+    "MCFScriptEngineInterface",
+    "Parameters",
+    "FUNCTIONALITY",
+    SetupL, MT_CCFScriptHandler_GetEveryScriptIdL, Teardown)
+
+EUNIT_TEST(
+    "GetEveryScriptIdByOwnerL - test ",
+    "MCFScriptEngineInterface",
+    "Parameters",
+    "FUNCTIONALITY",
+    SetupL, MT_CCFScriptHandler_GetEveryScriptIdByOwnerL, Teardown)
+
+EUNIT_TEST(
+    "UpdateScriptL - test ",
+    "MCFScriptEngineInterface",
+    "Parameters",
+    "FUNCTIONALITY",
+    SetupL, MT_CCFScriptHandler_UpdateScriptL, Teardown)
+
+EUNIT_TEST(
+    "SaveScript - test ",
+    "MCFScriptEngineInterface",
+    "Parameters",
+    "FUNCTIONALITY",
+    SetupL, MT_CCFScriptHandler_SaveScriptL, Teardown)
+
+EUNIT_TEST(
+    "DeleteScriptByName - test ",
+    "MCFScriptEngineInterface",
+    "Parameters",
+    "FUNCTIONALITY",
+    SetupL, MT_CCFScriptHandler_DeleteScriptByNameL, Teardown)
+
+EUNIT_TEST(
+    "DeleteScriptByName 2 - test",
+    "MCFScriptEngineInterface",
+    "Parameters",
+    "FUNCTIONALITY",
+    SetupL, MT_CCFScriptHandler_DeleteScriptByName2L, Teardown)
+
+EUNIT_TEST(
+    "DeleteScriptByUid - test ",
+    "MCFScriptEngineInterface",
+    "Parameters",
+    "FUNCTIONALITY",
+    SetupL, MT_CCFScriptHandler_DeleteScriptByUidL, Teardown)
+
+EUNIT_TEST(
+    "AlreadyExists - test ",
+    "MCFScriptEngineInterface",
+    "Parameters",
+    "FUNCTIONALITY",
+    SetupL, MT_CCFScriptHandler_AlreadyExistsL, Teardown)
+
+EUNIT_TEST(
+    "CleanupPersistentDataByName - test ",
+    "MCFScriptEngineInterface",
+    "Parameters",
+    "FUNCTIONALITY",
+    SetupL, MT_CCFScriptHandler_CleanupPersistentDataByNameL, Teardown)
+
+EUNIT_TEST(
+    "CleanupPersistentDataByUid - test ",
+    "MCFScriptEngineInterface",
+    "Parameters",
+    "FUNCTIONALITY",
+    SetupL, MT_CCFScriptHandler_CleanupPersistentDataByUidL, Teardown)
+
+EUNIT_TEST(
+    "RestoreRomScript - test ",
+    "MCFScriptEngineInterface",
+    "Parameters",
+    "FUNCTIONALITY",
+    SetupL, MT_CCFScriptHandler_RestoreRomScriptL, Teardown)
+
+EUNIT_TEST(
+    "Init all phases - test ",
+    "MCFScriptEngineInterface",
+    "Parameters",
+    "FUNCTIONALITY",
+    SetupL, MT_CCFScriptHandler_InitAllPhasesL, Teardown)
+
+EUNIT_TEST(
+    "IsUpgradeAllowed - test ",
+    "MCFScriptEngineInterface",
+    "IsUpgradeAllowed",
+    "FUNCTIONALITY",
+    SetupL, MT_CCFScriptHandler_IsUpgradeAllowedL, Teardown)
+
+EUNIT_TEST(
+    "RemoveScriptByProviderUid - test ",
+    "MCFScriptEngineInterface",
+    "RemoveScriptByProviderUid",
+    "FUNCTIONALITY",
+    SetupL, MT_CCFScriptHandler_RemoveScriptByProviderUidL, Teardown)
+
+EUNIT_END_TEST_TABLE
+
+//  END OF FILE