Revision: 201015 RCL_3 PDK_3.0.i
authorDremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
Tue, 27 Apr 2010 18:14:33 +0300
branchRCL_3
changeset 10 381827f66490
parent 9 7e287c5c61f0
child 12 d27dfa8884ad
Revision: 201015 Kit: 201017
stif/ATSInterface/src/ATSInterface.cpp
stif/StifTFwIf/src/UIEngineContainer.cpp
stif/TestCombiner/inc/TestCombiner.h
stif/TestCombiner/src/TestCombiner.cpp
stif/TestEngine/inc/TestEngine.h
stif/TestEngine/inc/TestReport.h
stif/TestEngine/src/TestCaseController.cpp
stif/TestEngine/src/TestEngine.cpp
stif/TestEngine/src/TestModuleController.cpp
stif/TestEngine/src/TestReport.cpp
stif/TestInterface/src/TestInterface.cpp
stif/TestServer/inc/TestServer.h
stif/TestServer/src/TestExecutionThread.cpp
stif/TestServer/src/TestModuleContainer.cpp
stif/TestServer/src/Testserversession.cpp
stif/TestServerStarter/src/TestServerStarter.cpp
stif/group/ReleaseNote.txt
stif/inc/TestServerModuleIf.h
stif/inc/version.h
stif/sis/Stif_31.sis
--- a/stif/ATSInterface/src/ATSInterface.cpp	Wed Apr 14 17:35:04 2010 +0300
+++ b/stif/ATSInterface/src/ATSInterface.cpp	Tue Apr 27 18:14:33 2010 +0300
@@ -561,12 +561,12 @@
     _LIT( KEngineIniFile, "-engineini" );
     _LIT( KModuleIniFile, "-moduleini" );
 
-	const TInt length = User().CommandLineLength();
+	const TInt length = User::CommandLineLength();
 
     HBufC* cmdLine = HBufC::NewLC( length );
     TPtr ptr = cmdLine->Des();
 
-	User().CommandLine( ptr );
+	User::CommandLine( ptr );
 
     TBool moduleFound( EFalse );
     TLex lex( ptr );
--- a/stif/StifTFwIf/src/UIEngineContainer.cpp	Wed Apr 14 17:35:04 2010 +0300
+++ b/stif/StifTFwIf/src/UIEngineContainer.cpp	Tue Apr 27 18:14:33 2010 +0300
@@ -480,7 +480,6 @@
         {
         // Call TestExecuted of CUIEngine interface
         iUIEngine->TestExecuted(this, iRunner->FullResult() );
-        iState = EFinished;
         }
     }
     
--- a/stif/TestCombiner/inc/TestCombiner.h	Wed Apr 14 17:35:04 2010 +0300
+++ b/stif/TestCombiner/inc/TestCombiner.h	Tue Apr 27 18:14:33 2010 +0300
@@ -655,6 +655,10 @@
         RTimer                      iPauseTimer;
         TName                       iPausedTestCase;
         TInt                        iPauseTime;
+        
+        // Pause combiner timer
+        RTimer                      iPauseCombTimer;
+        TInt                        iPauseCombRemainingTime;
 
         // Temporary line buffer 
         HBufC*                      iLine;
--- a/stif/TestCombiner/src/TestCombiner.cpp	Wed Apr 14 17:35:04 2010 +0300
+++ b/stif/TestCombiner/src/TestCombiner.cpp	Tue Apr 27 18:14:33 2010 +0300
@@ -2445,8 +2445,21 @@
 */
 void CTestRunner::ConstructL()
     {
-    
-    iPauseTimer.CreateLocal();
+    TInt ret;
+    
+    ret = iPauseTimer.CreateLocal();
+    if(ret != KErrNone)
+        {
+        __TRACE( KError, (_L("Unable to create RTimer: iPauseTimer [%d] "), ret));
+        User::Leave(ret);
+        }
+        
+    ret = iPauseCombTimer.CreateLocal();
+    if(ret != KErrNone)
+        {
+        __TRACE( KError, (_L("Unable to create RTimer: iPauseCombTimer [%d] "), ret));
+        User::Leave(ret);
+        }
     
     iRemoteTimer = CRemoteTimer::NewL( iTestCombiner );
     
@@ -2515,6 +2528,8 @@
     iLine = 0;
     
     iPauseTimer.Close();
+    
+    iPauseCombTimer.Close();
          
     }
 
@@ -2550,8 +2565,34 @@
         User::Leave( KErrGeneral );
         }
         
-    TBool continueTask = EFalse; 
+    TBool continueTask = EFalse;
+    
+    // Check if there is still some time for combiner pause and we need to 
+    // continue pausing
+    if(iPauseCombRemainingTime > 0)
+        {           
+        // Maximum time for one RTimer::After request                   
+        TInt maximumTime = KMaxTInt / 1000;                       
+        
+        __TRACE( KMessage, (_L("CTestRunner::RunL: Going to reissue PauseCombiner request ") ) );           
+        __TRACE( KMessage, (_L("CTestRunner::RunL: iRemainingTimeValue = %d"), iPauseCombRemainingTime ) );        
         
+        if( iPauseCombRemainingTime < maximumTime )
+            {                           
+            iPauseCombTimer.After(iStatus, (iPauseCombRemainingTime * 1000));
+            iPauseCombRemainingTime = 0;
+            }
+        else
+            {            
+            iPauseCombRemainingTime -= maximumTime;
+            iPauseCombTimer.After(iStatus, (maximumTime * 1000));        
+            }     
+            
+        SetActive();
+        return;
+        }     
+ 
+    // Handling runner states
     switch( iState )
         {
         case ERunnerWaitTimeout:
@@ -2695,6 +2736,8 @@
     __TRACE( KMessage, (_L("CTestRunner::DoCancel")));
     iTestCombiner->TestModuleIf().Printf( KPrintPriLow, _L("Runner"), _L("DoCancel"));
     
+    iPauseCombTimer.Cancel();
+    
     switch( iState )
         {
         case ERunnerWaitTimeout:
@@ -3397,7 +3440,7 @@
 	_LIT( KErrMsgPauseTimeoutNotDefined, "PauseCombiner : No timeout value given or value has invalid format" );
 	_LIT( KErrMsgPauseTimeoutNotPositive, "PauseCombiner : Timeout value can't be <0" );
 
-    TBool continueTask = ETrue;
+    TBool continueTask = EFalse;
     TInt pauseTime;
     TInt ret = KErrNone;
     
@@ -3416,12 +3459,31 @@
         User::Leave( KErrArgument );
         }    
     
-    //Time given by End User should be given in miliseconds
-    pauseTime*=1000;
-
-    __TRACE( KMessage, (_L("time=%d"), pauseTime ) );
-
-    User::After( pauseTime );
+    
+    // Maximum time for one RTimer::After request
+    TInt maximumTime = KMaxTInt / 1000;
+
+    // Check if pause value is suitable for RTimer::After
+    if(pauseTime < maximumTime)
+        {
+        iPauseCombTimer.After(iStatus, pauseTime * 1000);
+        iPauseCombRemainingTime = 0;
+        }
+    else
+        {
+        // Given pause value after multiplication with 1000 is
+        // larger than KMaxTInt, so we need to split it and 
+        // re-request After with remaining value from RunL
+
+        iPauseCombRemainingTime = pauseTime - maximumTime;
+        iPauseCombTimer.After(iStatus, maximumTime * 1000);
+        }
+
+    SetActive();
+
+    __TRACE(KMessage, (_L("Executing pause, time=[%d]"), pauseTime));
+    
+    iState = ERunnerRunning;
     
     return continueTask;
 }
--- a/stif/TestEngine/inc/TestEngine.h	Wed Apr 14 17:35:04 2010 +0300
+++ b/stif/TestEngine/inc/TestEngine.h	Tue Apr 27 18:14:33 2010 +0300
@@ -59,20 +59,25 @@
     };
 
 // Struct to Test report settings
-class TTestReportSettings
+NONSHARABLE_CLASS(CTestReportSettings)
+	:public CBase
     {
     public:
+    
+        /**
+        * NewL is two-phased constructor.
+        */
+        static CTestReportSettings* NewL();
 
-        TTestReportSettings(){ iCreateTestReport = ETrue;
-                                iPath = NULL;
-                                iName = NULL;
-                                iFormat = CStifLogger::ETxt;
-                                iOutput = CStifLogger::EFile;
-                                iOverwrite = ETrue; 
-                                iXML = EFalse;
-                             }
 
-       ~TTestReportSettings(){ delete iPath; delete iName; }
+       ~CTestReportSettings();
+       
+    private:
+       CTestReportSettings();
+       /**
+       * By default Symbian OS constructor is private.
+       */
+       void ConstructL();
 
     public:
 
@@ -231,7 +236,7 @@
 
     public:     // Data
         // Test report settings
-        TTestReportSettings     iTestReportSettings;
+        CTestReportSettings*     iTestReportSettings;
 
         // Logger overwrite settings
         TLoggerSettings         iLoggerSettings;
--- a/stif/TestEngine/inc/TestReport.h	Wed Apr 14 17:35:04 2010 +0300
+++ b/stif/TestEngine/inc/TestReport.h	Tue Apr 27 18:14:33 2010 +0300
@@ -156,7 +156,7 @@
         /**
         * Two-phased constructor.
         */
-        static CTestReport* NewL( TTestReportSettings& aTestReportSettings,
+        static CTestReport* NewL( CTestReportSettings& aTestReportSettings,
                                   const TTestReportMode aReportMode );
         
         /**
@@ -199,7 +199,7 @@
         /**
         * By default Symbian OS constructor is private.
         */
-        void ConstructL(  TTestReportSettings& aTestReportSettings );
+        void ConstructL(  CTestReportSettings& aTestReportSettings );
 
         /**
         * Default C++ constructor.
--- a/stif/TestEngine/src/TestCaseController.cpp	Wed Apr 14 17:35:04 2010 +0300
+++ b/stif/TestEngine/src/TestCaseController.cpp	Tue Apr 27 18:14:33 2010 +0300
@@ -2567,18 +2567,7 @@
         __TRACE( KInit, (  _L("Loaded reset module[%S]"), &dllName ) );
         }
 
-    // Verify the UID
-    TUid KUidTestModule = TUid::Uid ( 0x101FB3E7 );
-    TUidType requiredUID( KDynamicLibraryUid, KSharedLibraryUid, KUidTestModule );
-
-    TUidType moduleUID = resetModule.Type();    
-    if ( moduleUID != requiredUID )
-        {
-        // New instance can't be created
-        RDebug::Print( ( _L("STIF TF: Reset module has invalid UID. Aborting loading!") ) );
-        __TRACE ( KError, ( CStifLogger::EError, _L("Reset module has invalid UID. Aborting loading!" ) ) );
-        return KErrNotSupported;
-        }
+    
 
     // Get pointer to first exported function
     CTestInterfaceFactory libEntry;
--- a/stif/TestEngine/src/TestEngine.cpp	Wed Apr 14 17:35:04 2010 +0300
+++ b/stif/TestEngine/src/TestEngine.cpp	Tue Apr 27 18:14:33 2010 +0300
@@ -411,6 +411,8 @@
 */
 void CTestEngineServer::ConstructL()
     {
+    // Create report setting
+    iTestReportSettings = CTestReportSettings::NewL();
     // Create container
     iContainerIndex = CObjectConIx::NewL();
 
@@ -505,6 +507,8 @@
     __TRACE(KAlways, ( _L( "---------------- Log Ended ----------------" ) ) );
     delete iLogger;
 
+    delete iTestReportSettings;
+    iTestReportSettings = NULL;
     }
 
 /*
@@ -881,6 +885,7 @@
         iTestCases = NULL;
         }
     
+    iTestCaseArray.Close();    
     delete iTestEngineSubSessions;
     iTestEngineSubSessions = NULL;
 
@@ -1234,14 +1239,18 @@
 void CTestEngine::InitTestReportAndLoggerVarL()
     {
     // Test report settings initialization
-    iTestEngineServer->iTestReportSettings.iCreateTestReport = ETrue;
+    iTestEngineServer->iTestReportSettings->iCreateTestReport = ETrue;
     _LIT( path, "C:\\LOGS\\TestFramework\\");
     _LIT( name, "TestReport");
-    iTestEngineServer->iTestReportSettings.iPath = path().AllocL();
-    iTestEngineServer->iTestReportSettings.iName = name().AllocL();
-    iTestEngineServer->iTestReportSettings.iFormat = CStifLogger::ETxt;
-    iTestEngineServer->iTestReportSettings.iOutput = CStifLogger::EFile;
-    iTestEngineServer->iTestReportSettings.iOverwrite = ETrue;
+    delete iTestEngineServer->iTestReportSettings->iPath;
+    iTestEngineServer->iTestReportSettings->iPath = NULL;
+    iTestEngineServer->iTestReportSettings->iPath = path().AllocL();
+    delete iTestEngineServer->iTestReportSettings->iName;
+    iTestEngineServer->iTestReportSettings->iName = NULL;
+    iTestEngineServer->iTestReportSettings->iName = name().AllocL();
+    iTestEngineServer->iTestReportSettings->iFormat = CStifLogger::ETxt;
+    iTestEngineServer->iTestReportSettings->iOutput = CStifLogger::EFile;
+    iTestEngineServer->iTestReportSettings->iOverwrite = ETrue;
 
     // Initializations to indicator is setting in use
     iTestEngineServer->iLoggerSettings.iIsDefined.iCreateLogDir = EFalse;
@@ -1370,10 +1379,10 @@
     Logger()->WriteDelimiter();
     
     // Create Test Reporter if allowed
-    if ( iTestEngineServer->iTestReportSettings.iCreateTestReport )
+    if ( iTestEngineServer->iTestReportSettings->iCreateTestReport )
         {
         TRAPD(err, iTestReport = 
-            CTestReport::NewL( iTestEngineServer->iTestReportSettings, 
+            CTestReport::NewL( *(iTestEngineServer->iTestReportSettings), 
                                ( CTestReport::TTestReportMode ) iReportMode ));
         if(err!=KErrNone)
             {
@@ -1476,7 +1485,7 @@
         if ( get_ret == KErrNone )
             {
             __TRACE( KInit,( _L( "Test report creation indicator: %d"), createTestReport ) );
-            iTestEngineServer->iTestReportSettings.iCreateTestReport = createTestReport;
+            iTestEngineServer->iTestReportSettings->iCreateTestReport = createTestReport;
             }
         else
             {
@@ -1484,7 +1493,7 @@
             }
 
         // Get Test report path settings
-        if ( iTestEngineServer->iTestReportSettings.iCreateTestReport )
+        if ( iTestEngineServer->iTestReportSettings->iCreateTestReport )
             {
             __TRACE( KInit,( _L( "Parsing Test report path" ) ) );
             TPtrC path;
@@ -1494,9 +1503,9 @@
                 {
                 __TRACE( KInit,( _L( "Test report path: %S"), &path ) );
                 // Delete old one before setting new one
-                delete iTestEngineServer->iTestReportSettings.iPath;
-				iTestEngineServer->iTestReportSettings.iPath = NULL;
-                iTestEngineServer->iTestReportSettings.iPath = path.AllocL();
+                delete iTestEngineServer->iTestReportSettings->iPath;
+				iTestEngineServer->iTestReportSettings->iPath = NULL;
+                iTestEngineServer->iTestReportSettings->iPath = path.AllocL();
                 }
             else
                 {
@@ -1505,7 +1514,7 @@
             }
 
         // Get Test report name settings
-        if ( iTestEngineServer->iTestReportSettings.iCreateTestReport )
+        if ( iTestEngineServer->iTestReportSettings->iCreateTestReport )
             {
             __TRACE( KInit,( _L( "Parsing Test report filename" ) ) );
             TPtrC name;
@@ -1515,9 +1524,9 @@
                 {
                 __TRACE( KInit,( _L( "Test report filename: %S"), &name ) );
                 // Delete old one before setting new one
-                delete iTestEngineServer->iTestReportSettings.iName;
-				iTestEngineServer->iTestReportSettings.iName = NULL;
-                iTestEngineServer->iTestReportSettings.iName = name.AllocL();
+                delete iTestEngineServer->iTestReportSettings->iName;
+				iTestEngineServer->iTestReportSettings->iName = NULL;
+                iTestEngineServer->iTestReportSettings->iName = name.AllocL();
                 }
             else
                 {
@@ -1526,7 +1535,7 @@
             }
 
         // Get Test report format settings
-        if ( iTestEngineServer->iTestReportSettings.iCreateTestReport )
+        if ( iTestEngineServer->iTestReportSettings->iCreateTestReport )
             {
             __TRACE( KInit,( _L( "Parsing Test report format" ) ) );
             CStifLogger::TLoggerType type;
@@ -1536,8 +1545,8 @@
             if ( get_ret == KErrNone )
                 {
                 __TRACE( KInit,( _L( "Test report format: %d, xml: %d"), type, xml ) );
-                iTestEngineServer->iTestReportSettings.iFormat = type;
-                iTestEngineServer->iTestReportSettings.iXML = xml;
+                iTestEngineServer->iTestReportSettings->iFormat = type;
+                iTestEngineServer->iTestReportSettings->iXML = xml;
                 }
             else
                 {
@@ -1546,7 +1555,7 @@
             }
 
         // Get Test report output settings
-        if ( iTestEngineServer->iTestReportSettings.iCreateTestReport )
+        if ( iTestEngineServer->iTestReportSettings->iCreateTestReport )
             {
             __TRACE( KInit,( _L( "Parsing Test report output" ) ) );
             CStifLogger::TOutput output;
@@ -1555,7 +1564,7 @@
             if ( get_ret == KErrNone )
                 {
                 __TRACE( KInit,( _L( "Test report output: %d"), output ) );
-                iTestEngineServer->iTestReportSettings.iOutput = output;
+                iTestEngineServer->iTestReportSettings->iOutput = output;
                 }
             else
                 {
@@ -1564,7 +1573,7 @@
             }
 
         // Get Test report file creation mode (overwrite settings)
-        if ( iTestEngineServer->iTestReportSettings.iCreateTestReport )
+        if ( iTestEngineServer->iTestReportSettings->iCreateTestReport )
             {
             __TRACE( KInit,( _L( "Parsing Test report file writing mode" ) ) );
             TBool overwrite;
@@ -1573,7 +1582,7 @@
             if ( get_ret == KErrNone )
                 {
                 __TRACE( KInit,( _L( "Test report file creation mode: %d"), overwrite ) );
-                iTestEngineServer->iTestReportSettings.iOverwrite = overwrite;
+                iTestEngineServer->iTestReportSettings->iOverwrite = overwrite;
                 }
             else
                 {
@@ -5570,6 +5579,74 @@
 
     DESCRIPTION
 
+    Default constructor
+
+-------------------------------------------------------------------------------
+*/
+CTestReportSettings::CTestReportSettings()
+    {
+    iCreateTestReport = ETrue;
+    iPath = NULL;
+    iName = NULL;
+    iFormat = CStifLogger::ETxt;
+    iOutput = CStifLogger::EFile;
+    iOverwrite = ETrue; 
+    iXML = EFalse;
+    }
+
+/*
+-------------------------------------------------------------------------------
+
+    DESCRIPTION
+
+    Two-phased constructor.
+
+-------------------------------------------------------------------------------
+*/
+CTestReportSettings* CTestReportSettings::NewL()
+    {
+    CTestReportSettings* self = new ( ELeave ) CTestReportSettings();
+    CleanupStack::PushL( self );
+    self->ConstructL();
+    CleanupStack::Pop();
+    return self;
+    }
+
+/*
+-------------------------------------------------------------------------------
+
+    DESCRIPTION
+
+    Symbian OS second phase constructor
+
+-------------------------------------------------------------------------------
+*/
+void CTestReportSettings::ConstructL()
+    {
+    
+    }
+/*
+-------------------------------------------------------------------------------
+
+    DESCRIPTION
+
+    Destructor
+
+-------------------------------------------------------------------------------
+*/
+CTestReportSettings::~CTestReportSettings()
+    { 
+    delete iPath; 
+    iPath = NULL;
+    delete iName;
+    iName = NULL;
+    } 
+
+/*
+-------------------------------------------------------------------------------
+
+    DESCRIPTION
+
     This module contains implementation of CRebootParams class member functions.
 
 -------------------------------------------------------------------------------
--- a/stif/TestEngine/src/TestModuleController.cpp	Wed Apr 14 17:35:04 2010 +0300
+++ b/stif/TestEngine/src/TestModuleController.cpp	Tue Apr 27 18:14:33 2010 +0300
@@ -393,10 +393,11 @@
     iTestCaseArray.Close();
 
     // Release the config file array
+    iConfigFiles.ResetAndDestroy();
     iConfigFiles.Close();
 
     // Release the config file array
-    iFailedEnumerateConfig.Reset();
+    iFailedEnumerateConfig.ResetAndDestroy();
     iFailedEnumerateConfig.Close();
     
     // Release the children array
--- a/stif/TestEngine/src/TestReport.cpp	Wed Apr 14 17:35:04 2010 +0300
+++ b/stif/TestEngine/src/TestReport.cpp	Tue Apr 27 18:14:33 2010 +0300
@@ -194,7 +194,7 @@
 
 -------------------------------------------------------------------------------
 */
-void CTestReport::ConstructL( TTestReportSettings& aTestReportSettings )
+void CTestReport::ConstructL( CTestReportSettings& aTestReportSettings )
     {
     // Create summary for all test cases
     _LIT( KName, "All test cases" );
@@ -307,7 +307,7 @@
 
 -------------------------------------------------------------------------------
 */
-CTestReport* CTestReport::NewL( TTestReportSettings& aTestReportSettings,
+CTestReport* CTestReport::NewL( CTestReportSettings& aTestReportSettings,
                                 const TTestReportMode aReportMode )
     {
     CTestReport* self = new ( ELeave ) CTestReport( aReportMode );
@@ -339,6 +339,9 @@
 */
 CTestReport::~CTestReport()
     {
+    iTestModulesVersionsInfo.ResetAndDestroy();
+    iTestModulesVersionsInfo.Close();
+        
     // Reset and destroy arrays
     iTestSummaries.ResetAndDestroy();
     delete iTotalSummary;
--- a/stif/TestInterface/src/TestInterface.cpp	Wed Apr 14 17:35:04 2010 +0300
+++ b/stif/TestInterface/src/TestInterface.cpp	Tue Apr 27 18:14:33 2010 +0300
@@ -418,7 +418,7 @@
     //__UHEAP_MARK;
 
     // Get module name from command line
-	const TInt length = User().CommandLineLength();
+	const TInt length = User::CommandLineLength();
     HBufC* cmdLine = HBufC::New( length );
     
     if ( cmdLine == NULL )
@@ -428,7 +428,7 @@
         }
 
     TPtr moduleName = cmdLine->Des();
-    User().CommandLine( moduleName );
+    User::CommandLine( moduleName );
 
     RDebug::Print(_L("StartSession() Received data [%S]"), &moduleName);
 
--- a/stif/TestServer/inc/TestServer.h	Wed Apr 14 17:35:04 2010 +0300
+++ b/stif/TestServer/inc/TestServer.h	Tue Apr 27 18:14:33 2010 +0300
@@ -703,7 +703,64 @@
 
     };
 
+// DESCRIPTION
+// CTestCasesList is a class, which contains list of test cases assosiated with
+// specified config file.
+NONSHARABLE_CLASS( CTestCasesList ): public CBase
+    {
+public:
+    /**
+    * NewL is first phase of two-phased constructor.
+    */
+    static CTestCasesList* NewL( const TDesC& aConfigFileName );
+public:
+    /**
+    * Destructor of CTestServer.
+    */
+    ~CTestCasesList();
 
+    /**
+     * Appends test case.
+     */
+    void AppendTestCaseL( const TDesC& aTestCaseTitle );
+    
+    /**
+     * Returns specified test case title.
+     */
+    const TDesC& GetTestCaseTitleL( TInt aIndex ) const;
+    
+    /**
+     * Returns config file name.
+     */
+    const TDesC& GetConfigFileName() const;
+    
+    /**
+     * Returns count of test cases.
+     */
+    TInt Count() const;
+    
+    /**
+     * Resets list of test cases.
+     */
+    void ResetAndDestroy();
+private:
+    /** 
+    * C++ default constructor.
+    */
+    CTestCasesList();
+    
+    /**
+    * By default Symbian OS constructor is private.
+    */
+    void ConstructL( const TDesC& aConfigFileName );
+private:
+    // Config file name
+    HBufC* iConfigFileName;
+    // List of test cases
+    RPointerArray<HBufC> iTestCases;
+    };
+
+        
 // DESCRIPTION
 // CTestModule is a session class.
 // Session for the CTestServer server, to a single client-side session
@@ -844,7 +901,7 @@
         /**
         * Get title of currently running test case
         */ 
-        void GetTestCaseTitleL(TInt aTestCaseNumber, TDes& aTestCaseTitle);
+        void GetTestCaseTitleL(TInt aTestCaseNumber, const TDesC& aConfigFile, TDes& aTestCaseTitle);
 
         /**
          * Get pointer to test server
@@ -901,7 +958,7 @@
 
         TBool iErrorMessageAvailable;            // Error message available?
         
-        RPointerArray<TDesC> iTestCaseTitles;    //Test case titles
+        RPointerArray<CTestCasesList> iTestCaseTitlesMap;    //Test case titles
         
     public:     // Friend classes
         // None
--- a/stif/TestServer/src/TestExecutionThread.cpp	Wed Apr 14 17:35:04 2010 +0300
+++ b/stif/TestServer/src/TestExecutionThread.cpp	Tue Apr 27 18:14:33 2010 +0300
@@ -272,22 +272,7 @@
         __TRACEI (KInit, (  _L("Loaded test module[%S]"), &moduleName ) );
         }
 
-    // Verify the UID
-    TUid KUidTestModule = TUid::Uid ( 0x101FB3E7 );
-    TUidType requiredUID( KDynamicLibraryUid, KSharedLibraryUid, KUidTestModule );
-
-    TUidType moduleUID = aModule.Type();    
-    if ( moduleUID != requiredUID )
-        {
-        // New instance can't be created
-        RDebug::Print( ( _L("STIF TF: Test module has invalid UID. Aborting loading!") ) );
-        __TRACEI (KError, ( CStifLogger::EError, _L("Test module has invalid UID. Aborting loading!")));
-        tmpBuffer.Format(_L("Module [%S] has invalid UID"), &moduleName);
-        ErrorPrint( 1, tmpBuffer ); 
-        ModuleContainer().OperationErrorResult() = KErrNotSupported;
-        return KErrNotSupported;
-        }
-
+    
     // Get pointer to first exported function
     ModuleContainer().OperationText() = _L("1st EXPORTED function");
     CTestInterfaceFactory libEntry;
--- a/stif/TestServer/src/TestModuleContainer.cpp	Wed Apr 14 17:35:04 2010 +0300
+++ b/stif/TestServer/src/TestModuleContainer.cpp	Tue Apr 27 18:14:33 2010 +0300
@@ -1747,19 +1747,7 @@
         __TRACE( KInit, (  _L("Loaded test module[%S]"), &dllName ) );
         }
 
-    // Verify the UID
-    TUid KUidTestModule = TUid::Uid ( 0x101FB3E7 );
-    TUidType requiredUID( KDynamicLibraryUid, KSharedLibraryUid, KUidTestModule );
-
-    TUidType moduleUID = testModule.Type();    
-    if ( moduleUID != requiredUID )
-        {
-        // New instance can't be created
-        RDebug::Print( ( _L("STIF TF: Test module has invalid UID. Aborting loading!") ) );
-        __TRACE ( KError, ( CStifLogger::EError, _L("Test module has invalid UID. Aborting loading!" ) ) );
-        testModule.Close();
-        return KErrNotSupported;
-        }
+    
 
     CTestInterfaceFactoryTestModule libEntry = NULL;
     
@@ -1973,7 +1961,10 @@
 */
 void CTestModuleContainer::GetTestCaseTitleL(TDes& aTestCaseTitle)
     {
-    iCTestModule->GetTestCaseTitleL(iOperationIntBuffer, aTestCaseTitle); //currently run test case stored in the iOperationIntBuffer variable 
+    //currently run test case stored in the iOperationIntBuffer variable
+    iCTestModule->GetTestCaseTitleL( iOperationIntBuffer, 
+                                     iCTestExecution->GetConfigFileName(),
+                                    aTestCaseTitle);  
     }
 
 
--- a/stif/TestServer/src/Testserversession.cpp	Wed Apr 14 17:35:04 2010 +0300
+++ b/stif/TestServer/src/Testserversession.cpp	Tue Apr 27 18:14:33 2010 +0300
@@ -55,6 +55,234 @@
 
 // ================= MEMBER FUNCTIONS =========================================
 
+/*
+-------------------------------------------------------------------------------
+
+    Class: CTestCasesList
+
+    Method: NewL
+
+    Description: Create new test cases list    
+
+    Parameters: const TDesC& aConfigFileName :in:  Config file name
+
+    Return Values: CTestCasesList* Pointer to new test cases list
+
+    Errors/Exceptions: Leaves if memory allocation fails or ConstructL leaves.
+
+    Status: Approved
+
+-------------------------------------------------------------------------------
+*/
+CTestCasesList* CTestCasesList::NewL( const TDesC& aConfigFileName )
+    {    
+    CTestCasesList* self = new(ELeave)CTestCasesList;
+    CleanupStack::PushL( self );
+    self->ConstructL( aConfigFileName );
+    CleanupStack::Pop( self );
+    return self;
+    }
+
+/*
+-------------------------------------------------------------------------------
+
+    Class: CTestCasesList
+
+    Method: ~CTestCasesList
+
+    Description: Destructor    
+
+    Parameters: 
+
+    Return Values: 
+
+    Errors/Exceptions: 
+
+    Status: Approved
+
+-------------------------------------------------------------------------------
+*/
+CTestCasesList::~CTestCasesList()
+    {
+    delete iConfigFileName;
+    iConfigFileName = NULL;
+    iTestCases.ResetAndDestroy();
+    iTestCases.Close();
+    }
+
+/*
+-------------------------------------------------------------------------------
+
+    Class: CTestCasesList
+
+    Method: AppendTestCaseL
+
+    Description: Appends test case.
+
+    Parameters: const TDesC& aTestCaseTitle  in: Test case title
+
+    Return Values: 
+
+    Errors/Exceptions: Leaves if memory allocation fails
+
+    Status: Approved
+
+-------------------------------------------------------------------------------
+*/
+void CTestCasesList::AppendTestCaseL( const TDesC& aTestCaseTitle )
+    {
+    HBufC* testCaseTitle = aTestCaseTitle.AllocL();
+    CleanupStack::PushL( testCaseTitle );
+    iTestCases.AppendL( testCaseTitle );
+    CleanupStack::Pop( testCaseTitle );
+    }
+
+/*
+-------------------------------------------------------------------------------
+
+    Class: CTestCasesList
+
+    Method: GetTestCaseTitleL
+
+    Description: Returns specified test case title  
+
+    Parameters: TInt aIndex: in: Requested test case index. 
+
+    Return Values: Test case title.
+
+    Errors/Exceptions: Leaves if test case index is invalid
+
+    Status: Approved
+
+-------------------------------------------------------------------------------
+*/
+const TDesC& CTestCasesList::GetTestCaseTitleL( TInt aIndex ) const
+    {    
+    if ( ( aIndex < 0 ) || ( aIndex >= iTestCases.Count() ) )
+        {
+        User::Leave( KErrNotFound );
+        }
+    return *iTestCases[ aIndex ];
+    }
+
+/*
+-------------------------------------------------------------------------------
+
+    Class: CTestCasesList
+
+    Method: GetConfigFileName
+
+    Description: Returns config file name  
+
+    Parameters: 
+
+    Return Values: Config file name.
+
+    Errors/Exceptions: 
+
+    Status: Approved
+
+-------------------------------------------------------------------------------
+*/
+const TDesC& CTestCasesList::GetConfigFileName() const
+    {    
+    return *iConfigFileName;
+    }
+
+/*
+-------------------------------------------------------------------------------
+
+    Class: CTestCasesList
+
+    Method: Count
+
+    Description: Returns count of test cases.    
+
+    Parameters: 
+
+    Return Values: Test cases count.
+
+    Errors/Exceptions: 
+
+    Status: Approved
+
+-------------------------------------------------------------------------------
+*/
+TInt CTestCasesList::Count() const
+    {
+    return iTestCases.Count();
+    }
+
+/*
+-------------------------------------------------------------------------------
+
+    Class: CTestCasesList
+
+    Method: ResetAndDestroy
+
+    Description: Resets list of test cases.    
+
+    Parameters: 
+
+    Return Values: 
+
+    Errors/Exceptions: 
+
+    Status: Approved
+
+-------------------------------------------------------------------------------
+*/
+void CTestCasesList::ResetAndDestroy()
+    {    
+    iTestCases.ResetAndDestroy();
+    }
+
+/*
+-------------------------------------------------------------------------------
+
+    Class: CTestCasesList
+
+    Method: ~CTestCasesList
+
+    Description: Destructor    
+
+    Parameters: 
+
+    Return Values: 
+
+    Errors/Exceptions: 
+
+    Status: Approved
+
+-------------------------------------------------------------------------------
+*/
+CTestCasesList::CTestCasesList()
+    {
+    }
+
+/*
+-------------------------------------------------------------------------------
+
+    Class: CTestCasesList
+
+    Method: ~CTestCasesList
+
+    Description: Destructor    
+
+    Parameters: 
+
+    Return Values: 
+
+    Errors/Exceptions: 
+
+    Status: Approved
+
+-------------------------------------------------------------------------------
+*/
+void CTestCasesList::ConstructL( const TDesC& aConfigFileName )
+    {
+    iConfigFileName = aConfigFileName.AllocL();
+    }
 
 /*
 -------------------------------------------------------------------------------
@@ -188,8 +416,8 @@
     iIniBuffer = NULL;
 
     // Delete array of test case titles
-    iTestCaseTitles.ResetAndDestroy();
-    iTestCaseTitles.Close();
+    iTestCaseTitlesMap.ResetAndDestroy();
+    iTestCaseTitlesMap.Close();
     }
 
 /*
@@ -690,18 +918,34 @@
         User::Leave( KErrGeneral );
         }
     
+    CTestCasesList* testCasesList = NULL;
+    for ( TInt i = 0; i < iTestCaseTitlesMap.Count(); i++ )
+        {
+        if ( iTestCaseTitlesMap[ i ]->GetConfigFileName() == config )
+            {
+            testCasesList = iTestCaseTitlesMap[ i ];
+            break;
+            }
+        }
+    if ( testCasesList == NULL )
+        {
+        testCasesList = CTestCasesList::NewL( config );
+        CleanupStack::PushL( testCasesList );
+        iTestCaseTitlesMap.AppendL( testCasesList );
+        CleanupStack::Pop( testCasesList );
+        }
+    
     // Store titles (for further use, i.e. when asked for title from the interface via CTestModuleIf->CTestThreadContainer->CTestModuleContainer)
-    iTestCaseTitles.ResetAndDestroy();
+    testCasesList->ResetAndDestroy();
     TInt i;
     for(i = 0; i < testCases->Count(); i++)
         {
         //Handle situation when test cases are enumerated not as 0-based (testscripter, ...)
         if(i == 0 && (*testCases)[i]->iCaseNumber > 0)
             {
-            iTestCaseTitles.Append(NULL);
+            testCasesList->AppendTestCaseL( KNullDesC );
             }
-        HBufC* title = (*testCases)[i]->iTitle.AllocL();
-        iTestCaseTitles.Append(title);
+        testCasesList->AppendTestCaseL( (*testCases)[i]->iTitle );
         }
     
     TPckgBuf<TInt> countPckg( testCases->Count() );
@@ -1380,10 +1624,25 @@
     
 -------------------------------------------------------------------------------
 */
-void CTestModule::GetTestCaseTitleL(TInt aTestCaseNumber, TDes& aTestCaseTitle)
+void CTestModule::GetTestCaseTitleL(TInt aTestCaseNumber, const TDesC& aConfigFile,TDes& aTestCaseTitle)
     {
-    RDebug::Print(_L("Trying to get test case title from module. Index=%d, count=%d"), aTestCaseNumber, iTestCaseTitles.Count());
-    aTestCaseTitle.Copy(*(iTestCaseTitles[aTestCaseNumber]));
+    CTestCasesList* testCasesList = NULL;
+    for ( TInt i = 0; i < iTestCaseTitlesMap.Count(); i++ )
+        {
+        if ( iTestCaseTitlesMap[ i ]->GetConfigFileName() == aConfigFile )
+            {
+            testCasesList = iTestCaseTitlesMap[ i ];
+            break;
+            }
+        }
+    if ( testCasesList == NULL )
+        {
+        User::Leave( KErrNotFound );
+        }
+    
+    RDebug::Print(_L("Trying to get test case title from module. Index=%d, count=%d"), aTestCaseNumber, testCasesList->Count() );
+    
+    aTestCaseTitle.Copy( testCasesList->GetTestCaseTitleL( aTestCaseNumber ) );
     }
 
 
--- a/stif/TestServerStarter/src/TestServerStarter.cpp	Wed Apr 14 17:35:04 2010 +0300
+++ b/stif/TestServerStarter/src/TestServerStarter.cpp	Tue Apr 27 18:14:33 2010 +0300
@@ -53,7 +53,7 @@
     RDebug::Print(_L("STIF: New process starting"));
 
     // Get module name from command line
-	const TInt length = User().CommandLineLength();
+	const TInt length = User::CommandLineLength();
 
     HBufC* cmdLine = HBufC::New( length );
     
@@ -64,7 +64,7 @@
 
     TPtr moduleName = cmdLine->Des();
 
-	User().CommandLine( moduleName );
+	User::CommandLine( moduleName );
 
     RDebug::Print(_L("STIF: Received data [%S]"), &moduleName);
 
--- a/stif/group/ReleaseNote.txt	Wed Apr 14 17:35:04 2010 +0300
+++ b/stif/group/ReleaseNote.txt	Tue Apr 27 18:14:33 2010 +0300
@@ -1,5 +1,5 @@
 ========================================================================
-RELEASE NOTE FOR STIF - STIF_201012 (7.3.29)
+RELEASE NOTE FOR STIF - STIF_201014 (7.3.30)
 SUPPORTING SERIES 60 3.0 ->
 ========================================================================
 
--- a/stif/inc/TestServerModuleIf.h	Wed Apr 14 17:35:04 2010 +0300
+++ b/stif/inc/TestServerModuleIf.h	Tue Apr 27 18:14:33 2010 +0300
@@ -470,6 +470,7 @@
         */
         TInt TestThreadMutexHandle() { return iTestThreadMutex.Handle(); };
 
+        const TDesC& GetConfigFileName() const { return iConfig; }
     public: // Functions from base classes
         // None
 
--- a/stif/inc/version.h	Wed Apr 14 17:35:04 2010 +0300
+++ b/stif/inc/version.h	Tue Apr 27 18:14:33 2010 +0300
@@ -20,9 +20,9 @@
 
 #define STIF_MAJOR_VERSION 7
 #define STIF_MINOR_VERSION 3
-#define STIF_BUILD_VERSION 29
+#define STIF_BUILD_VERSION 30
 
-#define STIF_REL_DATE "23th Mar 2010"
+#define STIF_REL_DATE "06th Apr 2010"
 
 #define TO_UNICODE(text) _L(text) 
 
Binary file stif/sis/Stif_31.sis has changed