Added new smoketest
authorMaciej Seroka <maciejs@symbian.org>
Thu, 12 Nov 2009 14:45:32 +0000
changeset 756 736214c0060b
parent 755 cdb4af7acafc
child 759 862cab47b1ba
Added new smoketest
common/tools/ats/smoketest/Group/bld.inf
common/tools/ats/smoketest/Group/smoketest.pl
common/tools/ats/smoketest/Group/smoketest.xml
common/tools/ats/smoketest/IM/BWINS/DEMOMODULEU.DEF
common/tools/ats/smoketest/IM/EABI/DemomoduleU.def
common/tools/ats/smoketest/IM/group/Bld.inf
common/tools/ats/smoketest/IM/group/IMApiTest.mmp
common/tools/ats/smoketest/IM/inc/IMApiMTHandlers.h
common/tools/ats/smoketest/IM/inc/IMApiTest.h
common/tools/ats/smoketest/IM/inc/ParserUtils.h
common/tools/ats/smoketest/IM/inc/TestRunner.h
common/tools/ats/smoketest/IM/init/TestFramework.ini
common/tools/ats/smoketest/IM/init/imapitest.ini
common/tools/ats/smoketest/IM/src/IMApiMTHandlers.cpp
common/tools/ats/smoketest/IM/src/IMApiTest.cpp
common/tools/ats/smoketest/IM/src/IMApiTestcases.cpp
common/tools/ats/smoketest/IM/src/ParserUtils.cpp
common/tools/ats/smoketest/IM/src/TestRunner.cpp
--- a/common/tools/ats/smoketest/Group/bld.inf	Thu Nov 12 12:06:34 2009 +0000
+++ b/common/tools/ats/smoketest/Group/bld.inf	Thu Nov 12 14:45:32 2009 +0000
@@ -28,3 +28,4 @@
 #include "../appinstall/group/Bld.inf"
 #include "../lbs/group/bld.inf"
 #include "../uiresources/group/bld.inf"
+#include "../IM/group/bld.inf"
--- a/common/tools/ats/smoketest/Group/smoketest.pl	Thu Nov 12 12:06:34 2009 +0000
+++ b/common/tools/ats/smoketest/Group/smoketest.pl	Thu Nov 12 14:45:32 2009 +0000
@@ -65,5 +65,7 @@
 copy($epoc . "release/winscw/udeb/testsdkskins.dll",				"temp/smoketest/winscw_udeb/testsdkskins.dll");
 copy($epoc . "data/c/smoketest/smoketest_uiresources.cfg",			"temp/smoketest/general/smoketest_uiresources.cfg");
 copy($epoc . "data/c/smoketest/ui_testsdkskinsu.cfg",				"temp/smoketest/general/ui_testsdkskinsu.cfg");
+copy($epoc . "release/winscw/udeb/IMApiTest.dll",					"temp/smoketest/winscw_udeb/IMApiTest.dll");
+copy($epoc . "data/c/smoketest/imapitest.ini",						"temp/smoketest/general/imapitest.ini");
 
 system("7z a -tzip smoketest.zip ./temp/*");
--- a/common/tools/ats/smoketest/Group/smoketest.xml	Thu Nov 12 12:06:34 2009 +0000
+++ b/common/tools/ats/smoketest/Group/smoketest.xml	Thu Nov 12 14:45:32 2009 +0000
@@ -410,6 +410,24 @@
 							<param component-path="smoketest" />
 						</params>
 					</step>
+					<step id="" name="IMApiTest.dll (install)" harness="ATSINTERFACE" enabled="true" passrate="100" significant="false">
+						<command>install</command>
+						<params>
+							<param type="binary"/>
+							<param src="IMApiTest.dll"/>
+							<param dst="c:\sys\bin\IMApiTest.dll"/>
+							<param component-path="smoketest" />
+						</params>
+					</step>
+                    <step id="" name="imapitest.ini (install)" harness="ATSINTERFACE" enabled="true" passrate="100" significant="false">
+						<command>install</command>
+						<params>
+							<param type="data"/>
+							<param src="imapitest.ini"/>
+							<param dst="c:\smoketest\imapitest.ini"/>
+							<param component-path="smoketest" />
+						</params>
+					</step>
 					<step id="" name="ProfileSmokeTestModule (execute)" harness="ATSINTERFACE" enabled="true" passrate="100" significant="true">
 						<command>execute</command>
 						<params>
@@ -446,6 +464,15 @@
 							<param timeout="600"/>
 						</params>
 					</step>
+					<step id="" name="IMApiTest (execute)" harness="ATSINTERFACE" enabled="true" passrate="100" significant="true">
+						<command>execute</command>
+						<params>
+							<param file="atsinterface.exe"/>
+							<param parameters="-testmodule IMApiTest"/>
+							<param result-file="c:\spd_logs\xml\imapitest.xml"/>
+							<param timeout="600"/>
+						</params>
+					</step>
                 </case>
             </set>
 		</session>
@@ -498,5 +525,7 @@
 		<file>smoketest/winscw_udeb/testsdkskins.dll</file>		
 		<file>smoketest/general/smoketest_uiresources.cfg</file>
 		<file>smoketest/general/ui_testsdkskinsu.cfg</file>
+		<file>smoketest/winscw_udeb/IMApiTest.dll</file>		
+		<file>smoketest/general/imapitest.ini</file>
 	</files>
 </test>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/common/tools/ats/smoketest/IM/BWINS/DEMOMODULEU.DEF	Thu Nov 12 14:45:32 2009 +0000
@@ -0,0 +1,6 @@
+EXPORTS
+	?LibEntryL@@YAPAVCTestModuleBase@@XZ @ 1 NONAME ; class CTestModuleBase * __cdecl LibEntryL(void)
+	?SetRequirements@@YAHAAPAVCTestModuleParam@@AAK@Z @ 2 NONAME ; int __cdecl SetRequirements(class CTestModuleParam * &,unsigned long &)
+	?Log@CTestLogger1@@SAXV?$TRefByValue@$$CBVTDesC16@@@@ZZ @ 3 NONAME ; void CTestLogger1::Log(class TRefByValue<class TDesC16 const >, ...)
+	?Log@CTestLogger@@SAXV?$TRefByValue@$$CBVTDesC16@@@@ZZ @ 4 NONAME ; void CTestLogger::Log(class TRefByValue<class TDesC16 const >, ...)
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/common/tools/ats/smoketest/IM/EABI/DemomoduleU.def	Thu Nov 12 14:45:32 2009 +0000
@@ -0,0 +1,16 @@
+EXPORTS
+	_Z9LibEntryLv @ 1 NONAME
+	_Z15SetRequirementsRP16CTestModuleParamRm @ 2 NONAME
+	_ZN11CTestLogger3LogE11TRefByValueIK7TDesC16Ez @ 3 NONAME
+	_ZN12CTestLogger13LogE11TRefByValueIK7TDesC16Ez @ 4 NONAME
+	_ZTI11CTestRunner @ 5 NONAME ; #<TI>#
+	_ZTI14CTestScheduler @ 6 NONAME ; #<TI>#
+	_ZTI19CConnectionObserver @ 7 NONAME ; #<TI>#
+	_ZTI19CIMApiClientHandler @ 8 NONAME ; #<TI>#
+	_ZTV11CTestRunner @ 9 NONAME ; #<VT>#
+	_ZTV14CTestScheduler @ 10 NONAME ; #<VT>#
+	_ZTV19CConnectionObserver @ 11 NONAME ; #<VT>#
+	_ZTV19CIMApiClientHandler @ 12 NONAME ; #<VT>#
+	_ZTI16CImpsSettingFile @ 13 NONAME ; #<TI>#
+	_ZTV16CImpsSettingFile @ 14 NONAME ; #<VT>#
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/common/tools/ats/smoketest/IM/group/Bld.inf	Thu Nov 12 14:45:32 2009 +0000
@@ -0,0 +1,75 @@
+/*
+* Copyright (c) 2002 Nokia Corporation and/or its subsidiary(-ies). 
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of the License "Symbian Foundation License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.symbianfoundation.org/legal/sfl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description:  STIF TestFramework's IMApiTest
+*
+*
+*/
+
+
+
+/*
+-------------------------------------------------------------------------------
+
+    DESCRIPTION
+
+    Build information for STIF Test Framework's IMApiTest.
+
+-------------------------------------------------------------------------------
+*/
+
+
+PRJ_PLATFORMS
+// specify the platforms your component needs to be built for here
+// defaults to WINS MARM so you can ignore this if you just build these
+DEFAULT
+
+PRJ_TESTEXPORTS
+// NOTE: If using ARS requirements all export operations should be done under this.
+// 'abld test export'
+../init/imapitest.ini c:/smoketest/imapitest.ini
+//../init/TestFramework.ini /epoc32/winscw/c/TestFramework/TestFramework_im.ini
+
+PRJ_EXPORTS
+// Specify the source file followed by its destination here
+// copy will be used to copy the source file to its destination
+// If there's no destination then the source file will be copied
+// to the same name in /epoc32/include
+// Example: 
+/*
+/agnmodel/inc/AGMCOMON.H
+*/
+
+PRJ_TESTMMPFILES
+// NOTE: If using ARS requirements .mmp file operation should be done under this.
+// 'abld test build'
+IMApiTest.mmp
+
+
+PRJ_MMPFILES
+// Specify the .mmp files required for building the important component
+// releasables.
+//
+// Specify "tidy" if the component you need to build doesn't need to be
+// released. Specify "ignore" if the MMP file exists but should be
+// ignored.
+// Example:
+/*
+/agnmodel/group/agnmodel.mmp
+#ifndef __WINS__
+/agnmodel/group/agsvexe.mmp
+#endif
+*/
+
+
+//  End of File
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/common/tools/ats/smoketest/IM/group/IMApiTest.mmp	Thu Nov 12 14:45:32 2009 +0000
@@ -0,0 +1,74 @@
+/*
+* Copyright (c) 2002 Nokia Corporation and/or its subsidiary(-ies). 
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of the License "Symbian Foundation License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.symbianfoundation.org/legal/sfl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description:  STIF TestFramework's IMApiTest
+*
+*
+*/
+
+
+
+/*
+-------------------------------------------------------------------------------
+
+    DESCRIPTION
+
+    MMP file for STIF Test Framework's IMApiTest.
+
+-------------------------------------------------------------------------------
+*/
+#if defined(__S60_)
+    //To get the OS_LAYER_SYSTEMINCLUDE-definition
+    #include <platform_paths.hrh>
+#endif
+
+TARGET      IMApiTest.dll
+TARGETTYPE  dll
+DEFFILE     Demomodule.def
+
+CAPABILITY	ALL -TCB
+VENDORID 	0x101FB657
+SECUREID        0x102073DB
+
+LIBRARY     commdb.lib 
+LIBRARY     euser.lib
+LIBRARY     stiftestinterface.lib
+LIBRARY       ECom.lib
+LIBRARY       bafl.lib
+LIBRARY       cntmodel.lib 
+LIBRARY       flogger.lib
+LIBRARY       efsrv.lib
+LIBRARY       estor.lib       // ReadStream
+
+
+SOURCEPATH      ../src
+SOURCE          IMApiTest.cpp
+SOURCE          IMApiTestCases.cpp
+SOURCE          IMApiMTHandlers.cpp
+SOURCE          TestRunner.cpp
+SOURCE          ParserUtils.cpp
+
+
+USERINCLUDE     ../inc 
+//USERINCLUDE     ../../inc
+
+#if defined(__S60_)
+    APP_LAYER_SYSTEMINCLUDE
+#else
+   	SYSTEMINCLUDE   /epoc32/include/ecom
+#endif
+
+
+// First UID is DLL UID, Second UID is STIF Test Framework UID
+UID             0x1000008D 0x101FB3E7
+// End of File
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/common/tools/ats/smoketest/IM/inc/IMApiMTHandlers.h	Thu Nov 12 14:45:32 2009 +0000
@@ -0,0 +1,112 @@
+/*
+* Copyright (c) 2002 Nokia Corporation and/or its subsidiary(-ies). 
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of the License "Symbian Foundation License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.symbianfoundation.org/legal/sfl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description: Handler class
+*
+*/
+
+
+#ifndef TESTHANDLERS_H
+#define TESTHANDLERS_H
+
+
+#include <e32base.h>
+#include "imconnection.h"
+#include "imclient.h"
+#include "imerrors.h"
+#include    <flogger.h>
+// FORWARD Declarations
+
+// CLASS DECLARATIONS
+
+//*************************************************************************************
+// CIMApiClientHandler
+//*************************************************************************************
+class CIMApiClientHandler : public MImObserver, public CBase
+    {
+    public:
+        static CIMApiClientHandler* NewL( TRequestStatus& aStatus );
+        virtual ~CIMApiClientHandler();
+
+        void HandleRegisterL(
+            const TInt aErrorCode );
+
+        void HandleMessageSentL(
+            const TInt aOpCode,
+            const TInt aErrorCode );
+
+        void HandleNewPToPMessageL(
+            const TInt aErrorCode,
+            const TContactItemId  aContactId,
+            const TDesC& aUserId,
+            const TDesC& aMessageType,
+            const TDesC8& aContent );
+
+        void HandleNewPToPMessageL(
+            const TInt aErrorCode,
+            const TContactItemId  aContactId,
+            const TDesC& aUserId,
+            const TDesC& aMessageType,
+            const TDesC16& aContent );
+
+        void HandleSendErrorL(
+            const TInt aOpCode,
+            const TInt aErrorCode,
+            MImClientDetailedError* aDetailedError );
+
+//    protected:
+        void TimedOut();
+
+    private:
+        CIMApiClientHandler( TRequestStatus& aStatus );
+        void ConstructL();
+
+    private:
+        TRequestStatus&      iStatus;
+
+    };
+
+
+class CConnectionObserver : public CBase,
+            public MImConnectionObserver
+    {
+    public:
+        static CConnectionObserver* NewL( TRequestStatus& aStatus );
+        virtual ~CConnectionObserver();
+
+        void HandleConnectL( const TInt aErrorCode );
+        void HandleDisconnectL();
+
+        void HandleLoginL( const TInt aErrorCode );
+        void HandleCancelLoginL( const TInt aErrorCode );
+        void HandleLogoutL( const TInt aErrorCode );
+
+    private:
+        CConnectionObserver( TRequestStatus& aStatus );
+        void ConstructL();
+
+    private:
+        TRequestStatus&     iStatus;
+    };
+
+class CTestLogger : public CBase
+    {
+    public:
+        //IMPORT_C static void CTestLogger::Log(TRefByValue<const TDesC> aFmt,...);
+        IMPORT_C static void Log( TRefByValue<const TDesC> aFmt, ... );
+    };
+
+
+
+
+#endif
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/common/tools/ats/smoketest/IM/inc/IMApiTest.h	Thu Nov 12 14:45:32 2009 +0000
@@ -0,0 +1,330 @@
+/*
+* Copyright (c) 2002 Nokia Corporation and/or its subsidiary(-ies). 
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of the License "Symbian Foundation License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.symbianfoundation.org/legal/sfl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description: This class contains all test framework related parts of
+    this test module.
+*
+*
+*/
+
+
+
+/*
+-------------------------------------------------------------------------------
+
+    DESCRIPTION
+
+    This file contains the header file of IMApiTest of
+    STIF TestFramework.
+
+-------------------------------------------------------------------------------
+*/
+#ifndef IMApiTest_H
+#define IMApiTest_H
+
+// INCLUDES
+#include "StifTestModule.h"
+#include <StifLogger.h>
+#include "IMApiMTHandlers.h"
+#include "imerrors.h"
+#include "imconnection.h"
+#include "imclient.h"
+#include "TestRunner.h"
+
+// CONSTANTS
+// None
+
+// MACROS
+// None
+
+// Logging path
+_LIT( KIMApiTestLogPath, "\\logs\\testframework\\IMApiTest\\" );
+// Log file
+_LIT( KIMApiTestLogFile, "IMApiTest.txt" );
+
+// Function pointer related internal definitions
+
+#define GETPTR &
+#define ENTRY(str,func) {_S(str), GETPTR func,0,0,0}
+#define FUNCENTRY(func) {_S(#func), GETPTR func,0,0,0}
+#define OOM_ENTRY(str,func,a,b,c) {_S(str), GETPTR func,a,b,c}
+#define OOM_FUNCENTRY(func,a,b,c) {_S(#func), GETPTR func,a,b,c}
+
+// FUNCTION PROTOTYPES
+// None
+
+// FORWARD DECLARATIONS
+class CIMApiTest;
+
+// DATA TYPES
+// None
+
+// A typedef for function that does the actual testing,
+// function is a type
+// TInt CIMApiTest::<NameOfFunction> ( TTestResult& aResult )
+typedef TInt ( CIMApiTest::* TestFunction )( TTestResult& );
+
+// CLASS DECLARATION
+
+/**
+*  An internal structure containing a test case name and
+*  the pointer to function doing the test
+*
+*  @lib ?library
+*  @since ?Series60_version
+*/
+class TCaseInfoInternal
+    {
+    public:
+        const TText* iCaseName;
+        TestFunction iMethod;
+        TBool           iIsOOMTest;
+        TInt            iFirstMemoryAllocation;
+        TInt            iLastMemoryAllocation;
+    };
+
+// CLASS DECLARATION
+
+/**
+*  A structure containing a test case name and
+*  the pointer to function doing the test
+*
+*  @lib ?library
+*  @since ?Series60_version
+*/
+class TCaseInfo
+    {
+    public:
+        TPtrC iCaseName;
+        TestFunction iMethod;
+        TBool           iIsOOMTest;
+        TInt            iFirstMemoryAllocation;
+        TInt            iLastMemoryAllocation;
+
+        TCaseInfo( const TText* a ) : iCaseName( ( TText* ) a )
+            {
+            };
+
+    };
+
+
+// CLASS DECLARATION
+
+/**
+*  This a IMApiTest class.
+*  ?other_description_lines
+*
+*  @lib ?library
+*  @since ?Series60_version
+*/
+NONSHARABLE_CLASS( CIMApiTest ) : public CTestModuleBase
+    {
+public:  // Constructors and destructor
+
+
+    /**
+    * Two-phased constructor.
+    */
+    static CIMApiTest* NewL();
+
+    /**
+    * Destructor.
+    */
+    virtual ~CIMApiTest();
+
+public: // New functions
+    // None
+
+public: // Functions from base classes
+
+    /**
+    * From CTestModuleBase InitL is used to initialize the
+    *       IMApiTest. It is called once for every instance of
+    *       TestModuleIMApiTest after its creation.
+    * @since ?Series60_version
+    * @param aIniFile Initialization file for the test module (optional)
+    * @param aFirstTime Flag is true when InitL is executed for first
+    *               created instance of IMApiTest.
+    * @return Symbian OS error code
+    */
+    TInt InitL( TFileName& aIniFile, TBool aFirstTime );
+
+    /**
+    * From CTestModuleBase GetTestCasesL is used to inquiry test cases
+    *   from IMApiTest.
+    * @since ?Series60_version
+    * @param aTestCaseFile Test case file (optional)
+    * @param aTestCases  Array of TestCases returned to test framework
+    * @return Symbian OS error code
+    */
+    TInt GetTestCasesL( const TFileName& aTestCaseFile,
+                        RPointerArray<TTestCaseInfo>& aTestCases );
+
+    /**
+    * From CTestModuleBase RunTestCaseL is used to run an individual
+    *   test case.
+    * @since ?Series60_version
+    * @param aCaseNumber Test case number
+    * @param aTestCaseFile Test case file (optional)
+    * @param aResult Test case result returned to test framework (PASS/FAIL)
+    * @return Symbian OS error code (test case execution error, which is
+    *           not reported in aResult parameter as test case failure).
+    */
+    TInt RunTestCaseL( const TInt aCaseNumber,
+                       const TFileName& aTestCaseFile,
+                       TTestResult& aResult );
+
+    /**
+    * From CTestModuleBase; OOMTestQueryL is used to specify is particular
+    * test case going to be executed using OOM conditions
+    * @param aTestCaseFile Test case file (optional)
+    * @param aCaseNumber Test case number (optional)
+    * @param aFailureType OOM failure type (optional)
+    * @param aFirstMemFailure The first heap memory allocation failure value (optional)
+    * @param aLastMemFailure The last heap memory allocation failure value (optional)
+    * @return TBool
+    */
+    virtual TBool OOMTestQueryL( const TFileName& /* aTestCaseFile */,
+                                 const TInt /* aCaseNumber */,
+                                 TOOMFailureType& aFailureType,
+                                 TInt& /* aFirstMemFailure */,
+                                 TInt& /* aLastMemFailure */ );
+
+    /**
+    * From CTestModuleBase; OOMTestInitializeL may be used to initialize OOM
+    * test environment
+    * @param aTestCaseFile Test case file (optional)
+    * @param aCaseNumber Test case number (optional)
+    * @return None
+    */
+    virtual void OOMTestInitializeL( const TFileName& /* aTestCaseFile */,
+                                     const TInt /* aCaseNumber */ );
+    /**
+    * From CTestModuleBase; OOMTestFinalizeL may be used to finalize OOM
+    * test environment
+    * @param aTestCaseFile Test case file (optional)
+    * @param aCaseNumber Test case number (optional)
+    * @return None
+    */
+    virtual void OOMTestFinalizeL( const TFileName& /* aTestCaseFile */,
+                                   const TInt /* aCaseNumber */ );
+
+    /**
+    * From CTestModuleBase; OOMHandleWarningL
+    * @param aTestCaseFile Test case file (optional)
+    * @param aCaseNumber Test case number (optional)
+    * @param aFailNextValue FailNextValue for OOM test execution (optional)
+    * @return None
+    */
+    virtual void OOMHandleWarningL( const TFileName& /* aTestCaseFile */,
+                                    const TInt /* aCaseNumber */,
+                                    TInt& /* aFailNextValue */ );
+protected:  // New functions
+    // None
+
+protected:  // Functions from base classes
+    // None
+
+private:
+
+    /**
+    * C++ default constructor.
+    */
+    CIMApiTest();
+
+    /**
+    * By default Symbian 2nd phase constructor is private.
+    */
+    void ConstructL();
+
+    // Prohibit copy constructor if not deriving from CBase.
+    // ?classname( const ?classname& );
+    // Prohibit assigment operator if not deriving from CBase.
+    // ?classname& operator=( const ?classname& );
+
+    /**
+    * Function returning test case name and pointer to test case function.
+    * @since ?Series60_version
+    * @param aCaseNumber test case number
+    * @return TCaseInfo
+    */
+    const TCaseInfo Case ( const TInt aCaseNumber ) const;
+
+    /**
+    * Printing loop test case.
+    * @since ?Series60_version
+    * @param aResult Test case result (PASS/FAIL)
+    * @return Symbian OS error code (test case execution error
+    *   that is not returned as test case result in aResult)
+    */
+    TInt CreateImClientL( TTestResult& aResult );
+	TInt InvalidLoginL( TTestResult& aResult );
+    TInt LoginL( TTestResult& aResult );
+    TInt SendPToPValidUserIDL( TTestResult& aResult );
+    TInt SendPToPValidTwoUserIDL( TTestResult& aResult );
+    TInt SendPToPValidContactL( TTestResult& aResult );
+    TInt SendPToPValidTwoContactL( TTestResult& aResult );
+    TInt SendPToPContactContentTypeL( TTestResult& aResult );
+    TInt SendPToPUserIDContentTypeL( TTestResult& aResult );
+    TInt LogoutL( TTestResult& aResult );
+    TInt CancelLoginL( TTestResult& aResult );
+
+public:     // Data
+    // None
+
+protected:  // Data
+    // None
+
+private:    // Data
+    // Pointer to test (function) to be executed
+    TestFunction iMethod;
+
+    // Pointer to logger
+    CStifLogger * iLog;
+    CTestRunner*   iRunner;
+
+    CIMApiClientHandler*     iImObserver;
+    CConnectionObserver*    iConnObserver;
+    CImConnection*          iOpenApi;
+    MImClient*              iImClient;
+    CConsoleBase*           iConsole;
+    TBool                   iRepeat;
+
+    /*TInt      iAP;
+    TBuf<50>  iUser;
+    TBuf<50>  iPwd;
+    TBuf<50>  iRecipient;
+    TBuf<50>  iRecipient1;
+    TBuf<50>  iMySapAp;
+    TBuf<50>  iClientId;
+    */
+    // ?one_line_short_description_of_data
+    //?data_declaration;
+
+    // Reserved pointer for future extension
+    //TAny* iReserved;
+
+public:     // Friend classes
+    // None
+    friend class CTestRunner;
+protected:  // Friend classes
+    // None
+
+private:    // Friend classes
+    // None
+
+    };
+
+#endif      // IMApiTest_H
+
+// End of File
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/common/tools/ats/smoketest/IM/inc/ParserUtils.h	Thu Nov 12 14:45:32 2009 +0000
@@ -0,0 +1,63 @@
+/*
+* Copyright (c) 2002 Nokia Corporation and/or its subsidiary(-ies). 
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of the License "Symbian Foundation License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.symbianfoundation.org/legal/sfl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description:  The class handles IMPS Setting file reading.
+*
+*/
+
+
+#include <f32file.h>
+#include <s32file.h>
+
+// FORWARD DECLARATION
+
+//**********************************
+// CImpsSettingFile
+//**********************************
+// Read key-value pairs from ASCII file
+class CImpsSettingFile: public CBase
+    {
+    public:
+        /**
+        * Constructor.
+        */
+        static CImpsSettingFile* NewL(
+            RFs& aFs );
+
+        ~CImpsSettingFile();
+
+        /**
+        * Opens a file. It is closed in destructor!
+        */
+        void OpenL( TDesC& aResFile );
+
+        /**
+        * Get the key value. Leave with KErrNotFound if not found.
+        */
+        TPtrC8 KeyValueL( const TDesC8& aKey );
+
+    private:
+        CImpsSettingFile( RFs& aFs );
+
+        void ReadRowL( TPtrC8& aKey, TPtrC8& aValue );
+    private:
+        // Data
+        RFs& iFs;
+        RFileReadStream iReader;
+        TBuf8<128> iRowBuffer;
+        TFileName iFileName;
+        TBool     iOpen;
+
+    };
+
+// End of File
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/common/tools/ats/smoketest/IM/inc/TestRunner.h	Thu Nov 12 14:45:32 2009 +0000
@@ -0,0 +1,183 @@
+/*
+* Copyright (c) 2002 Nokia Corporation and/or its subsidiary(-ies). 
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of the License "Symbian Foundation License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.symbianfoundation.org/legal/sfl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description: The class handles the test case running.
+*
+*/
+
+
+#ifndef TESTRUNNER_H
+#define TESTRUNNER_H
+
+// INCLUDES
+#include <f32file.h>
+#include <e32test.h>
+#include "IMApiMTHandlers.h"
+#include "StifTestModule.h"
+#include <StifLogger.h>
+#include <badesca.h>
+
+#include <cntdb.h>
+#include <cntfield.h>
+#include <cntfldst.h>
+#include <cntitem.h>
+#include <commdb.h>
+
+
+
+// FORWARD DECLARATIONS
+class CTestRunner;
+
+// FORWARD DECLARATIONS
+class CErrorHandler;
+class CAccessHandler;
+class CTestIdleTimer;
+class CTestTimer;
+class CPureHandler;
+
+// ENUMS
+
+enum TWhichCase
+    {
+    InvalidLogin = 1,
+    Login,
+    SendMessageValidUserId,
+    SendMessageValidTwoUserId,
+    SendMessageValidContact,
+    SendMessageValidTwoContact,
+    SendPToPContactContentType,
+    SendPToPUserIDContentType,
+    Logout,
+    CancelLogin,
+    Finish,
+	CreateImClient
+    };
+
+
+// CONSTANTS
+const TInt KImpsMaxLen       = 100;
+const TInt KImpsMaxSapLen       = 100;
+const TInt KImpsMaxUserIdLen    =  50;
+const TInt KImpsMaxClientIdLen 	= 64;  // maximum Client ID, this is not sure!
+
+
+// CLASS DECLARATIONS
+
+
+class CTestRunner : public CActive
+    {
+    public:
+        /**
+        * Static factory method,
+        *
+        * Entry point into Symbian's 2 phase construction pattern.
+        */
+        static CTestRunner* NewL();
+
+        /**
+        * Destructor.
+        */
+        virtual ~CTestRunner();
+
+        /**
+        * Start the execution.
+        */
+        void StartRunL( TWhichCase aCase );
+
+        CContactIdArray* GetWVContactIdsLC();
+
+        /**
+        * Symbian's 2 phase construction pattern.
+        */
+        void ConstructL( );
+
+        TInt CreateInstanceL();
+        TInt RegisterConnObserverL();
+        TInt LoadIMInterfaceL();
+        TInt IMRegisterL();
+        TInt LoginL( const TDesC& aUserID );
+        TInt SendPToPValidUserIDL();
+        TInt SendPToPValidTwoUserIDL();
+        TInt SendPToPValidContactL();
+        TInt SendPToPValidTwoContactL();
+        TInt SendPToPContactContentTypeL();
+        TInt SendPToPUserIDContentTypeL();
+        TInt QueryIMConnectionStatusL();
+        TInt CancelLoginL();
+
+        void GetDefaultAccessPoint();
+
+        void ReadIniFileL();
+        TBuf<KImpsMaxSapLen> iSapValue;
+        TBuf<KImpsMaxUserIdLen> iUserIdValue;
+        TBuf<KImpsMaxLen> iPassword;
+        TBuf<KImpsMaxClientIdLen>  iClientId;  // 1.3 Client ID Implementation
+        TBuf<KImpsMaxLen> iUserId1;
+        TBuf<KImpsMaxLen> iUserId2;
+        TInt iIAP;
+
+    public: // Functions from base classes
+
+        /**
+        * Active object completion
+        */
+        void RunL();
+        /**
+        * Active object cancellation
+        */
+        void DoCancel();
+
+    private:
+
+        // By default, prohibit copy constructor
+        CTestRunner( const CTestRunner& );
+
+        // Prohibit assigment operator
+        CTestRunner& operator= ( const CTestRunner& );
+
+        /**
+        * C-style constructor.
+        */
+        CTestRunner();
+
+        // actual runner, that is leave trapped
+        void DoRunL();
+
+    private:    // Data
+
+        TWhichCase				iCase;
+        CIMApiClientHandler*     iImObserver; //earlier code
+        //MImObserver*     iImObserver;
+        CConnectionObserver*    iConnObserver;
+        CImConnection*          iOpenApi;
+        MImClient*              iImClient;
+        CStifLogger*			iLog;
+        CContactDatabase*       iDatabase;
+    };
+
+
+
+class CTestScheduler : public CActiveScheduler
+    {
+    public:
+        void Error ( TInt aError ) const;
+    };
+
+class CTestLogger1 : public CBase
+    {
+    public:
+        //IMPORT_C static void CTestLogger::Log(TRefByValue<const TDesC> aFmt,...);
+        IMPORT_C static void Log( TRefByValue<const TDesC> aFmt, ... );
+    };
+
+#endif
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/common/tools/ats/smoketest/IM/init/TestFramework.ini	Thu Nov 12 14:45:32 2009 +0000
@@ -0,0 +1,192 @@
+#
+# This is STIFTestFramework initialization file
+# Comment lines start with '#'-character.
+# See STIF TestFramework users guide.doc for instructions
+
+# -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
+# Set following test engine settings:
+#	- Set Test Reporting mode. TestReportMode's possible values are:
+#		+ 'Summary': Summary of the tested test cases.
+#		+ 'Environment': Hardware and software info.
+#		+ 'TestCases': Test case report.
+#		+ 'FullReport': Set of all above ones.
+#		+ Example 'TestReportMode= Summary TestCases'
+#
+# 	- CreateTestReport setting controls report creation mode
+#		+ YES, Test report will created.
+#		+ NO, No Test report.
+#
+# 	- File path indicates the base path of the test report.
+# 	- File name indicates the name of the test report.
+#
+# 	- File format indicates the type of the test report.
+#		+ TXT, Test report file will be txt type, for example 'TestReport.txt'.
+#		+ HTML, Test report will be html type, for example 'TestReport.html'.
+#
+# 	- File output indicates output source of the test report.
+#		+ FILE, Test report logging to file.
+#		+ RDEBUG, Test report logging to using rdebug.
+#
+# 	- File Creation Mode indicates test report overwriting if file exist.
+#		+ OVERWRITE, Overwrites if the Test report file exist.
+#		+ APPEND, Continue logging after the old Test report information if
+#                 report exist.
+# 	- Sets a device reset module's dll name(Reboot).
+#		+ If Nokia specific reset module is not available or it is not correct one
+#		  StifHWResetStub module may use as a template for user specific reset
+#		  module.
+# 	- Sets STIF test measurement disable options. e.g. pluging1 and pluging2 disablation
+#		DisableMeasurement= stifmeasurementplugin01 stifmeasurementplugin02
+#
+
+[Engine_Defaults]
+
+TestReportMode= FullReport		# Possible values are: 'Empty', 'Summary', 'Environment',
+                                                               'TestCases' or 'FullReport'
+
+CreateTestReport= YES			# Possible values: YES or NO
+
+TestReportFilePath= C:\LOGS\TestFramework\
+TestReportFileName= TestReport
+
+TestReportFormat= TXT			# Possible values: TXT or HTML
+TestReportOutput= FILE			# Possible values: FILE or RDEBUG
+TestReportFileCreationMode= OVERWRITE	# Possible values: OVERWRITE or APPEND
+
+DeviceResetDllName= StifResetForNokia.dll # e.g. 'StifHWResetStub.dll' for user specific reseting
+
+DisableMeasurement= stifmeasurementdisablenone	# Possible values are:
+						# 'stifmeasurementdisablenone', 'stifmeasurementdisableall'
+					  	# 'stifmeasurementplugin01', 'stifmeasurementplugin02',
+					  	# 'stifmeasurementplugin03', 'stifmeasurementplugin04',
+					  	# 'stifmeasurementplugin05' or 'stifbappeaprofiler'
+
+[End_Defaults]
+# -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
+
+
+
+# -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
+# Module configurations start
+# Modules are added between module tags
+# tags. Module name is specified after ModuleName= tag, like
+# ModuleName= XXXXXXXXX
+# Modules might have initialisation file, specified as
+# IniFile= c:\testframework\YYYYYY
+# Modules might have several configuration files, like
+# TestCaseFile= c:\testframework\NormalCases.txt
+# TestCaseFile= c:\testframework\SmokeCases.txt
+# TestCaseFile= c:\testframework\ManualCases.txt
+
+# (TestCaseFile is synonym for old term ConfigFile)
+
+# Following case specifies demo module settings. Demo module
+# does not read any settings from file, so tags 
+# IniFile and TestCaseFile are not used.
+# In the simplest case it is enough to specify only the
+# name of the test module when adding new test module
+[New_Module]
+ModuleName= IMApiTest
+[End_Module]
+
+# Load testmoduleXXX, optionally with initialization file and/or test case files
+#[New_Module]
+#ModuleName= testmodulexxx
+
+#TestModuleXXX used initialization file
+#IniFile= c:\testframework\init.txt
+
+#TestModuleXXX used configuration file(s)
+#TestCaseFile= c:\testframework\testcases1.cfg
+#TestCaseFile= c:\testframework\testcases2.cfg
+#TestCaseFile= c:\testframework\manualtestcases.cfg
+
+#[End_Module]
+# -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
+
+
+
+# -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
+# Set STIFTestFramework logging overwrite parameters for Logger.
+# 	Hardware and emulator environment logging path and styles can
+# 	be configured from here to overwrite the Logger's implemented values.
+#	
+#	Settings description:
+#	- Indicates option for creation log directory/directories. If log directory/directories
+#         is/are not created by user they will make by software.
+#		+ YES, Create log directory/directories if not allready exist.
+#		+ NO, Log directory/directories not created. Only created one is used.
+#
+#	- Overwrite emulator path setting.
+#		+ Example: If 'EmulatorBasePath= C:\LOGS\TestFramework\' and in code is defined 
+#		           Logger's path 'D:\\LOGS\\Module\\' with those definition the path
+#		           will be 'C:\LOGS\TestFramework\LOGS\Module\'
+#
+#	- Overwrite emulator's logging format.
+#		+ TXT, Log file(s) will be txt type(s), for example 'Module.txt'.
+#		+ HTML, Log file(s) will be html type(s), for example 'Module.html'.
+#
+#	- Overwrited emulator logging output source.
+#		+ FILE, Logging to file(s).
+#		+ RDEBUG, Logging to using rdebug(s).
+#
+#	- Overwrite hardware path setting (Same description as above in emulator path).
+#	- Overwrite hardware's logging format(Same description as above in emulator format).
+#	- Overwrite hardware's logging output source(Same description as above in emulator output).
+#
+#	- File Creation Mode indicates file overwriting if file exist.
+#		+ OVERWRITE, Overwrites if file(s) exist.
+#		+ APPEND, Continue logging after the old logging information if file(s) exist.
+#
+#	- Will thread id include to the log filename.
+#		+ YES, Thread id to log file(s) name, Example filename 'Module_b9.txt'.
+#		+ NO, No thread id to log file(s), Example filename 'Module.txt'.
+#
+#	- Will time stamps include the to log file.
+#		+ YES, Time stamp added to each line in log file(s). Time stamp is 
+#                 for example'12.Nov.2003 115958    LOGGING INFO'
+#		+ NO, No time stamp(s).
+#
+#	- Will line breaks include to the log file.
+#		+ YES, Each logging event includes line break and next log event is in own line.
+#		+ NO, No line break(s).
+#
+#	- Will event ranking include to the log file.
+#		+ YES, Event ranking number added to each line in log file(s). Ranking number
+#                 depends on environment's tics, for example(includes time stamp also)
+#                 '012   12.Nov.2003 115958    LOGGING INFO'
+#		+ NO, No event ranking.
+#
+#	- Will write log file in unicode format.
+#		+ YES, Log file will be written in unicode format
+#		+ NO, Log will be written as normal, not unicode, file.
+#
+
+[Logger_Defaults]
+
+#NOTE: If you want to set Logger using next setting(s) remove comment(s)'#'
+#NOTE: TestEngine and TestServer logging settings cannot change here
+
+#CreateLogDirectories= YES		# Possible values: YES or NO
+
+#EmulatorBasePath= C:\LOGS\TestFramework\
+#EmulatorFormat= HTML			# Possible values: TXT or HTML
+#EmulatorOutput= FILE			# Possible values: FILE or RDEBUG
+
+#HardwareBasePath= D:\LOGS\TestFramework\
+#HardwareFormat= HTML			# Possible values: TXT or HTML
+#HardwareOutput= FILE			# Possible values: FILE or RDEBUG
+
+#FileCreationMode= OVERWRITE		# Possible values: OVERWRITE or APPEND
+
+#ThreadIdToLogFile= YES			# Possible values: YES or NO
+#WithTimeStamp= YES			# Possible values: YES or NO
+#WithLineBreak= YES			# Possible values: YES or NO
+#WithEventRanking= YES			# Possible values: YES or NO
+
+#FileUnicode= YES			# Possible values: YES or NO
+
+[End_Logger_Defaults]
+# -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
+
+# End of file
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/common/tools/ats/smoketest/IM/init/imapitest.ini	Thu Nov 12 14:45:32 2009 +0000
@@ -0,0 +1,33 @@
+# IMPS Engine IM SDK API test module static settings
+# Copy this file to %epocroot%\testframework
+
+# SAP
+# Service Access Point for Presence services
+SAP=http://195.134.231.100/wv
+
+# Userid
+# UserId of the SIM registered at SAP
+Userid=test
+
+# Password
+# password for accessing SAP
+password=test
+
+# Clientid
+# no need to modify this
+clientid=apiclient@imps.org
+
+# IAP
+# If run on emulator, IAP=11
+# If run on HW, IAP is ID of Access Point using the SIM Operator's GPRS network, This can be found from "Access point" settings on Phone
+IAP=13
+
+# userid1
+# Any other userid
+userid1=bc2
+
+#userid2
+# Any other userid
+userid2=bc3
+
+# end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/common/tools/ats/smoketest/IM/src/IMApiMTHandlers.cpp	Thu Nov 12 14:45:32 2009 +0000
@@ -0,0 +1,300 @@
+/*
+* Copyright (c) 2002 Nokia Corporation and/or its subsidiary(-ies). 
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of the License "Symbian Foundation License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.symbianfoundation.org/legal/sfl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description: Handler class
+*
+*
+*/
+
+
+// INCLUDE FILES
+#include    <apparc.h>
+#include    <e32std.h>
+#include    "IMApiMTHandlers.h"
+#include    "TestRunner.h"
+
+/******************************************************************************
+*
+* CIMApiClientHandler
+*
+******************************************************************************/
+
+//////////////////////////////////////////////////////////////////////////
+// Handler class
+CIMApiClientHandler* CIMApiClientHandler::NewL( TRequestStatus& aStatus )
+    {
+    CIMApiClientHandler* self = new( ELeave ) CIMApiClientHandler( aStatus );
+    CleanupStack::PushL( self );
+    self->ConstructL();
+    CleanupStack::Pop();
+    return self;
+    }
+
+void CIMApiClientHandler::ConstructL()
+    {
+    }
+
+CIMApiClientHandler::CIMApiClientHandler( TRequestStatus& aStatus )
+        : iStatus( aStatus )
+    {
+    }
+
+CIMApiClientHandler::~CIMApiClientHandler()
+    {
+    }
+
+
+void CIMApiClientHandler::HandleMessageSentL( const TInt aOpCode,
+                                              const TInt aErrorCode )
+    {
+    TRequestStatus* s = &iStatus;
+    CTestLogger::Log( _L( "HandleMessageSentL Passed - aErrorCode=%d" ), aErrorCode );
+
+    if ( aErrorCode == 0 || aErrorCode == KImApiErrInvalidUserId || aErrorCode == KImApiErrNotLogged || aErrorCode == KImApiErrPartialSuccess  )
+        {
+        if ( aErrorCode == 0 )
+            {
+            User::RequestComplete( s, KErrNone ); // OK
+            }
+        else if ( aErrorCode == KImApiErrInvalidUserId )
+            {
+            User::RequestComplete( s, KErrNone ); // OK
+            }
+        else if ( aErrorCode == KImApiErrPartialSuccess )
+            {
+            User::RequestComplete( s, KErrNone ); // OK
+            }
+        else
+            {
+            User::RequestComplete( s, KErrNone );
+            }
+        }
+    else
+        {
+        User::RequestComplete( s, aErrorCode ); // FAILED
+        }
+    }
+
+void CIMApiClientHandler::HandleSendErrorL( const TInt aOpCode,
+                                            const TInt aErrorCode,
+                                            MImClientDetailedError* aDetailedError )
+
+    {
+    TRequestStatus* s = &iStatus;
+    TBuf<500> buffer;
+
+    CTestLogger::Log( _L( "HandleSendErrorL - aErrorCode=%d" ), aErrorCode );
+    if ( aErrorCode == 0 || aErrorCode == KImApiErrInvalidUserId || aErrorCode == KImApiErrNotLogged || aErrorCode == KImApiErrPartialSuccess  )
+        {
+        if ( aErrorCode == 0 )
+            {
+            User::RequestComplete( s, KErrNone ); // OK
+            }
+        else if ( aErrorCode == KImApiErrInvalidUserId )
+            {
+            User::RequestComplete( s, KErrNone ); // OK
+            }
+        else if ( aErrorCode == KImApiErrPartialSuccess )
+            {
+            for ( TInt i = 0; i < aDetailedError->Count(); i++ )
+                {
+                buffer.Copy( aDetailedError->UserId( i ) );
+                }
+            User::RequestComplete( s, KErrNone ); // OK
+            }
+        else
+            {
+            User::RequestComplete( s, KErrNone );
+            }
+        }
+    else
+        {
+        User::RequestComplete( s, KErrNone ); // PASSED sad but true
+        }
+    }
+
+
+void CIMApiClientHandler::HandleNewPToPMessageL( const TInt aErrorCode,
+                                                 const TContactItemId aContactId,
+                                                 const TDesC& aUserId,
+                                                 const TDesC& aMessageType,
+                                                 const TDesC16& aContent )
+    {
+    TRequestStatus* s = &iStatus;
+    CTestLogger::Log( _L( "HandleNewPToPMessageL Passed - aErrorCode=%d" ), aErrorCode );
+
+    if ( aErrorCode == 0 )
+        {
+        User::RequestComplete( s, KErrNone );
+        }
+    else
+        {
+        User::RequestComplete( s, aErrorCode );
+        }
+    }
+
+void CIMApiClientHandler::HandleNewPToPMessageL( const TInt aErrorCode,
+                                                 const TContactItemId aContactId,
+                                                 const TDesC& aUserId,
+                                                 const TDesC& aMessageType,
+                                                 const TDesC8& aContent )
+    {
+    TRequestStatus* s = &iStatus;
+    CTestLogger::Log( _L( "HandleNewPToPMessageL Passed - aErrorCode=%d" ), aErrorCode );
+    if ( aErrorCode == 0 )
+        {
+        User::RequestComplete( s, KErrNone );
+        }
+    else
+        {
+        User::RequestComplete( s, aErrorCode );
+        }
+    }
+
+
+void CIMApiClientHandler::TimedOut()
+    {
+    TRequestStatus* s = &iStatus;
+    User::RequestComplete( s, KErrTimedOut );
+    }
+
+
+
+//////////////////////////////////////////////////////////////////////////
+
+CConnectionObserver* CConnectionObserver::NewL( TRequestStatus& aStatus )
+    {
+    CConnectionObserver* self = new( ELeave ) CConnectionObserver( aStatus );
+    CleanupStack::PushL( self );
+    self->ConstructL();
+    CleanupStack::Pop();
+    return self;
+    }
+
+void CConnectionObserver::ConstructL()
+    {
+    }
+
+CConnectionObserver::CConnectionObserver( TRequestStatus& aStatus )
+        : iStatus( aStatus )
+    {
+    }
+
+CConnectionObserver::~CConnectionObserver()
+    {
+    }
+
+
+void CConnectionObserver::HandleConnectL( const TInt aErrorCode )
+    {
+    TRequestStatus* s = &iStatus;
+    CTestLogger::Log( _L( "HandleConnectL Passed - aErrorCode=%d" ), aErrorCode );
+
+    if ( aErrorCode == 0 )
+        {
+        User::RequestComplete( s, KErrNone ); // OK
+        }
+    else if ( aErrorCode == KImApiErrInvalidUserId )
+        {
+        User::RequestComplete( s, KErrNone ); // OK
+        }
+    else if ( aErrorCode == -33 )
+        {
+        User::RequestComplete( s, aErrorCode ); // FAILED
+        }
+    else if ( aErrorCode == -4154 )
+        {
+        User::RequestComplete( s, aErrorCode );   // FAILED
+        }
+    else if ( aErrorCode == -16 )
+        {
+        User::RequestComplete( s, KErrNone );  // OK IN IMAPI POINT OF WIEV
+        }
+    else if ( aErrorCode == KImApiErrLoginInProgress )
+        {
+        User::RequestComplete( s, KErrNone );  // OK IN IMAPI POINT OF WIEV
+        }
+    else
+        {
+        User::RequestComplete( s, aErrorCode );// FAILED
+        }
+    }
+
+void CConnectionObserver::HandleDisconnectL()
+    {
+    TRequestStatus* s = &iStatus;
+    CTestLogger::Log( _L( " HandleDisconnectL " ) );
+    User::RequestComplete( s, KErrNone ); //OK
+    }
+
+void CConnectionObserver::HandleLoginL( const TInt aErrorCode )
+    {
+    CTestLogger::Log( _L( "HandleLoginL Passed - aErrorCode=%d" ), aErrorCode );
+
+    TRequestStatus* s = &iStatus;
+    if ( aErrorCode == 0 )
+        {
+        User::RequestComplete( s, KErrNone );
+        }
+    else
+        {
+        User::RequestComplete( s, aErrorCode );
+        }
+    }
+
+void CConnectionObserver::HandleCancelLoginL( const TInt aErrorCode )
+    {
+    CTestLogger::Log( _L( "HandleCancelLoginL Passed - aErrorCode=%d" ), aErrorCode );
+    TRequestStatus* s = &iStatus;
+    if ( aErrorCode == 0 )
+        {
+        User::RequestComplete( s, KErrNone );
+        }
+    else
+        {
+        User::RequestComplete( s, aErrorCode );
+        }
+    }
+
+void CConnectionObserver::HandleLogoutL( const TInt aErrorCode )
+    {
+    CTestLogger::Log( _L( "HandleLogoutL Passed-  aErrorCode=%d" ), aErrorCode );
+    CActiveScheduler::Stop();
+    }
+
+
+
+//**********************************
+// CImpsClientLogger
+//**********************************
+const TInt KLogBufferLength = 256;
+_LIT( KLogDir, "impsc" );
+_LIT( KLogFile, "IMAPIHandlersLog.txt" );
+
+EXPORT_C void CTestLogger::Log( TRefByValue<const TDesC> aFmt, ... )
+    {
+    VA_LIST list;
+    VA_START( list, aFmt );
+
+    // Print to log file
+    TBuf<KLogBufferLength> buf;
+    buf.FormatList( aFmt, list );
+
+    // Write to log file
+    RFileLogger::Write( KLogDir, KLogFile, EFileLoggingModeAppend, buf );
+    }
+
+void CTestScheduler::Error( TInt /*anError */ ) const
+    {
+    CTestLogger::Log( _L( "ClientTester RunL ERROR RECEIVED" ) );
+    }
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/common/tools/ats/smoketest/IM/src/IMApiTest.cpp	Thu Nov 12 14:45:32 2009 +0000
@@ -0,0 +1,547 @@
+/*
+* Copyright (c) 2002 Nokia Corporation and/or its subsidiary(-ies). 
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of the License "Symbian Foundation License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.symbianfoundation.org/legal/sfl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description: This class contains all test framework related parts of
+    this test module.
+*
+*
+*/
+
+
+
+// INCLUDE FILES
+#include <Stiftestinterface.h>
+#include "IMApiTest.h"
+#include <e32math.h>
+
+// EXTERNAL DATA STRUCTURES
+// None
+
+// EXTERNAL FUNCTION PROTOTYPES
+// None
+
+// CONSTANTS
+// None
+
+// MACROS
+// None
+
+// LOCAL CONSTANTS AND MACROS
+// None
+
+// MODULE DATA STRUCTURES
+// None
+
+// LOCAL FUNCTION PROTOTYPES
+// None
+
+// FORWARD DECLARATIONS
+// None
+
+// ==================== LOCAL FUNCTIONS =======================================
+
+
+/*
+-------------------------------------------------------------------------------
+
+    DESCRIPTION
+
+    This file (IMApiTest.cpp) contains all test framework related parts of
+    this test module. Actual test cases are implemented in file
+    IMApiTestCases.cpp.
+
+    CIMApiTest is an example of test module implementation. This example
+    uses hard coded test cases (i.e it does not have any test case
+    configuration file).
+
+    Example uses function pointers to call test cases. This provides an easy
+    method to add new test cases.
+
+    See function Cases in file IMApiTestCases.cpp for instructions how to
+    add new test cases. It is not necessary to modify this file when adding
+    new test cases.
+
+    To take this module into use, add following lines to test framework
+    initialisation file:
+
+# Demo module
+[New_Module]
+ModuleName= IMApiTest
+[End_Module]
+
+-------------------------------------------------------------------------------
+*/
+
+// ================= MEMBER FUNCTIONS =========================================
+
+/*
+-------------------------------------------------------------------------------
+
+    Class: CIMApiTest
+
+    Method: CIMApiTest
+
+    Description: C++ default constructor can NOT contain any code, that
+    might leave.
+
+    Parameters: None
+
+    Return Values: None
+
+    Errors/Exceptions: None
+
+    Status: Approved
+
+-------------------------------------------------------------------------------
+*/
+CIMApiTest::CIMApiTest()
+    {
+    }
+
+/*
+-------------------------------------------------------------------------------
+
+    Class: CIMApiTest
+
+    Method: ConstructL
+
+    Description: Symbian 2nd phase constructor that can leave.
+
+    Note: If OOM test case uses STIF Logger, then STIF Logger must be created
+    with static buffer size parameter (aStaticBufferSize). Otherwise Logger
+    allocates memory from heap and therefore causes error situations with OOM
+    testing. For more information about STIF Logger construction, see STIF
+    Users Guide.
+
+    Parameters: None
+
+    Return Values: None
+
+    Errors/Exceptions: None
+
+    Status: Approved
+
+-------------------------------------------------------------------------------
+*/
+void CIMApiTest::ConstructL()
+    {
+    // Constructing static buffer size logger, needed with OOM testing because
+    // normally logger allocates memory from heap!
+    iLog = CStifLogger::NewL( KIMApiTestLogPath,
+                              KIMApiTestLogFile,
+                              CStifLogger::ETxt,
+                              CStifLogger::EFile,
+                              ETrue,
+                              ETrue,
+                              ETrue,
+                              EFalse,
+                              ETrue,
+                              EFalse,
+                              100 );
+
+    // Sample how to use logging
+    _LIT( KLogInfo, "IMApiTest logging starts!" );
+    iLog->Log( KLogInfo );
+    iRunner = CTestRunner::NewL();
+    }
+
+/*
+-------------------------------------------------------------------------------
+
+    Class: CIMApiTest
+
+    Method: NewL
+
+    Description: Two-phased constructor. Constructs new CIMApiTest
+    instance and returns pointer to it.
+
+    Parameters:    None
+
+    Return Values: CIMApiTest*: new object.
+
+    Errors/Exceptions: Leaves if memory allocation fails or ConstructL leaves.
+
+    Status: Approved
+
+-------------------------------------------------------------------------------
+*/
+CIMApiTest* CIMApiTest::NewL()
+    {
+    CIMApiTest* self = new ( ELeave ) CIMApiTest;
+
+    CleanupStack::PushL( self );
+    self->ConstructL();
+    CleanupStack::Pop();
+
+    return self;
+    }
+
+/*
+-------------------------------------------------------------------------------
+
+    Class: CIMApiTest
+
+    Method: ~CIMApiTest
+
+    Description: Destructor.
+
+    Parameters:    None
+
+    Return Values: None
+
+    Errors/Exceptions: None
+
+    Status: Approved
+
+-------------------------------------------------------------------------------
+*/
+CIMApiTest::~CIMApiTest()
+    {
+    delete iLog;
+    if ( iRunner )
+        delete iRunner;
+    }
+
+/*
+-------------------------------------------------------------------------------
+    Class: CIMApiTest
+
+    Method: InitL
+
+    Description: Method for test case initialization
+
+    Parameters: None
+
+    Return Values: None
+
+    Errors/Exceptions: None
+
+    Status: Approved
+-------------------------------------------------------------------------------
+*/
+TInt CIMApiTest::InitL( TFileName& /*aIniFile*/,
+                        TBool /*aFirstTime*/ )
+    {
+    return KErrNone;
+
+    }
+
+/*
+-------------------------------------------------------------------------------
+
+    Class: CIMApiTest
+
+    Method: GetTestCases
+
+    Description: GetTestCases is used to inquire test cases
+    from the test module. Because this test module has hard coded test cases
+    (i.e cases are not read from file), paramter aConfigFile is not used.
+
+    This function loops through all cases defined in Cases() function and
+    adds corresponding items to aTestCases array.
+
+    Parameters: const TFileName&  : in: Configuration file name. Not used
+                RPointerArray<TTestCaseInfo>& aTestCases: out:
+                      Array of TestCases.
+
+    Return Values: KErrNone: No error
+
+    Errors/Exceptions: Function leaves if any memory allocation operation fails
+
+    Status: Proposal
+
+-------------------------------------------------------------------------------
+*/
+TInt CIMApiTest::GetTestCasesL( const TFileName& /*aConfig*/,
+                                RPointerArray<TTestCaseInfo>& aTestCases )
+    {
+    // Loop through all test cases and create new
+    // TTestCaseInfo items and append items to aTestCase array
+    for ( TInt i = 0; Case( i ).iMethod != NULL; i++ )
+        {
+        // Allocate new TTestCaseInfo from heap for a testcase definition.
+        TTestCaseInfo* newCase = new( ELeave ) TTestCaseInfo();
+
+        // PushL TTestCaseInfo to CleanupStack.
+        CleanupStack::PushL( newCase );
+
+        // Set number for the testcase.
+        // When the testcase is run, this comes as a parameter to RunTestCaseL.
+        newCase->iCaseNumber = i;
+
+        // Set title for the test case. This is shown in UI to user.
+        newCase->iTitle.Copy( Case( i ).iCaseName );
+
+        // Append TTestCaseInfo to the testcase array. After appended
+        // successfully the TTestCaseInfo object is owned (and freed)
+        // by the TestServer.
+        User::LeaveIfError( aTestCases.Append ( newCase ) );
+
+        // Pop TTestCaseInfo from the CleanupStack.
+        CleanupStack::Pop( newCase );
+        }
+
+    return KErrNone;
+
+    }
+
+/*
+-------------------------------------------------------------------------------
+
+    Class: CIMApiTest
+
+    Method: RunTestCase
+
+    Description: Run a specified testcase.
+
+    Function runs a test case specified by test case number. Test case file
+    parameter is not used.
+
+    If case number is valid, this function runs a test case returned by
+    function Cases().
+
+    Parameters: const TInt aCaseNumber: in: Testcase number
+                const TFileName& : in: Configuration file name. Not used
+                TTestResult& aResult: out: Testcase result
+
+    Return Values: KErrNone: Testcase ran.
+                   KErrNotFound: Unknown testcase
+
+    Errors/Exceptions: None
+
+    Status: Proposal
+
+-------------------------------------------------------------------------------
+*/
+TInt CIMApiTest::RunTestCaseL( const TInt aCaseNumber,
+                               const TFileName& /* aConfig */,
+                               TTestResult& aResult )
+    {
+    // Return value
+    TInt execStatus = KErrNone;
+
+    // Get the pointer to test case function
+    TCaseInfo tmp = Case ( aCaseNumber );
+
+    TestModuleIf().SetBehavior( CTestModuleIf::ETestLeaksRequests );
+    TestModuleIf().SetBehavior( CTestModuleIf::ETestLeaksHandles );
+
+    _LIT( KLogInfo, "Starting testcase [%S]" );
+    iLog->Log( KLogInfo, &tmp.iCaseName );
+
+    // Check that case number was valid
+    if ( tmp.iMethod != NULL )
+        {
+        // Valid case was found, call it via function pointer
+        iMethod = tmp.iMethod;
+        execStatus  = ( this->*iMethod )( aResult );
+        }
+    else
+        {
+        // Valid case was not found, return error.
+        execStatus = KErrNotFound;
+        }
+
+    // Return case execution status (not the result of the case execution)
+    return execStatus;
+
+    }
+
+/*
+-------------------------------------------------------------------------------
+
+    Class: CIMApiTest
+
+    Method: OOMTestQueryL
+
+    Description: Checks test case information for OOM execution.
+
+    Return Values: TBool
+
+    Errors/Exceptions: None
+
+    Status: Proposal
+
+-------------------------------------------------------------------------------
+*/
+TBool CIMApiTest::OOMTestQueryL( const TFileName& /* aTestCaseFile */,
+                                 const TInt aCaseNumber,
+                                 TOOMFailureType& /* aFailureType */,
+                                 TInt& aFirstMemFailure,
+                                 TInt& aLastMemFailure )
+    {
+    _LIT( KLogInfo, "CIMApiTest::OOMTestQueryL" );
+    iLog->Log( KLogInfo );
+
+    aFirstMemFailure = Case( aCaseNumber ).iFirstMemoryAllocation;
+    aLastMemFailure = Case( aCaseNumber ).iLastMemoryAllocation;
+
+    return Case( aCaseNumber ).iIsOOMTest;
+    }
+
+/*
+-------------------------------------------------------------------------------
+
+    Class: CIMApiTest
+
+    Method: OOMTestInitializeL
+
+    Description: Used to perform the test environment setup for a particular
+    OOM test case. Test Modules may use the initialization file to read
+    parameters for Test Module initialization but they can also have their own
+    configure file or some other routine to initialize themselves.
+
+    NOTE: User may add implementation for OOM test environment initialization.
+    Usually no implementation is required.
+
+    Return Values: None
+
+    Errors/Exceptions: None
+
+    Status: Proposal
+
+-------------------------------------------------------------------------------
+*/
+void CIMApiTest::OOMTestInitializeL( const TFileName& /* aTestCaseFile */,
+                                     const TInt /* aCaseNumber */ )
+    {
+    _LIT( KLogInfo, "CIMApiTest::OOMTestInitializeL" );
+    iLog->Log( KLogInfo );
+
+    }
+
+/*
+-------------------------------------------------------------------------------
+
+    Class: CIMApiTest
+
+    Method: OOMHandleWarningL
+
+    Description: Used in OOM testing to provide a way to the derived TestModule
+    to handle warnings related to non-leaving or TRAPped allocations.
+
+    In some cases the allocation should be skipped, either due to problems in
+    the OS code or components used by the code being tested, or even inside the
+    tested components which are implemented this way on purpose (by design), so
+    it is important to give the tester a way to bypass allocation failures.
+
+    NOTE: User may add implementation for OOM test warning handling. Usually no
+    implementation is required.
+
+    Return Values: None
+
+    Errors/Exceptions: None
+
+    Status: Proposal
+
+-------------------------------------------------------------------------------
+*/
+void CIMApiTest::OOMHandleWarningL( const TFileName& /* aTestCaseFile */,
+                                    const TInt /* aCaseNumber */,
+                                    TInt& /* aFailNextValue */ )
+    {
+    _LIT( KLogInfo, "CIMApiTest::OOMHandleWarningL" );
+    iLog->Log( KLogInfo );
+
+    }
+
+/*
+-------------------------------------------------------------------------------
+
+    Class: CIMApiTest
+
+    Method: OOMTestFinalizeL
+
+    Description: Used to perform the test environment cleanup for a particular OOM
+    test case.
+
+    NOTE: User may add implementation for OOM test environment finalization.
+    Usually no implementation is required.
+
+    Return Values: None
+
+    Errors/Exceptions: None
+
+    Status: Proposal
+
+-------------------------------------------------------------------------------
+*/
+void CIMApiTest::OOMTestFinalizeL( const TFileName& /* aTestCaseFile */,
+                                   const TInt /* aCaseNumber */ )
+    {
+    _LIT( KLogInfo, "CIMApiTest::OOMTestFinalizeL" );
+    iLog->Log( KLogInfo );
+
+    }
+
+// ========================== OTHER EXPORTED FUNCTIONS =========================
+
+// -----------------------------------------------------------------------------
+// LibEntryL is a polymorphic Dll entry point
+// Returns: CTestModuleBase*: Pointer to Test Module object
+// -----------------------------------------------------------------------------
+//
+EXPORT_C CTestModuleBase* LibEntryL()
+    {
+    return CIMApiTest::NewL();
+
+    }
+
+// -----------------------------------------------------------------------------
+// SetRequirements handles test module parameters(implements evolution
+// version 1 for test module's heap and stack sizes configuring).
+// Returns: TInt: Symbian error code.
+// -----------------------------------------------------------------------------
+//
+EXPORT_C TInt SetRequirements( CTestModuleParam*& /*aTestModuleParam*/,
+                               TUint32& /*aParameterValid*/ )
+    {
+
+    /* --------------------------------- NOTE ---------------------------------
+    USER PANICS occurs in test thread creation when:
+    1) "The panic occurs when the value of the stack size is negative."
+    2) "The panic occurs if the minimum heap size specified is less
+       than KMinHeapSize".
+       KMinHeapSize: "Functions that require a new heap to be allocated will
+       either panic, or will reset the required heap size to this value if
+       a smaller heap size is specified".
+    3) "The panic occurs if the minimum heap size specified is greater than
+       the maximum size to which the heap can grow".
+    Other:
+    1) Make sure that your hardware or Symbian OS is supporting given sizes.
+       e.g. Hardware might support only sizes that are divisible by four.
+    ------------------------------- NOTE end ------------------------------- */
+
+    // Normally STIF uses default heap and stack sizes for test thread, see:
+    // KTestThreadMinHeap, KTestThreadMinHeap and KStackSize.
+    // If needed heap and stack sizes can be configured here by user. Remove
+    // comments and define sizes.
+
+    /*
+        aParameterValid = KStifTestModuleParameterChanged;
+
+        CTestModuleParamVer01* param = CTestModuleParamVer01::NewL();
+        // Stack size
+        param->iTestThreadStackSize= 16384; // 16K stack
+        // Heap sizes
+        param->iTestThreadMinHeap = 4096;   // 4K heap min
+        param->iTestThreadMaxHeap = 1048576;// 1M heap max
+
+        aTestModuleParam = param;
+    */
+    return KErrNone;
+
+    }
+
+
+//  End of File
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/common/tools/ats/smoketest/IM/src/IMApiTestcases.cpp	Thu Nov 12 14:45:32 2009 +0000
@@ -0,0 +1,297 @@
+/*
+* Copyright (c) 2002 Nokia Corporation and/or its subsidiary(-ies). 
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of the License "Symbian Foundation License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.symbianfoundation.org/legal/sfl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description: This module contains the implementation of CIMApiTest class
+    member functions that does the actual tests.
+*
+*
+*/
+
+
+
+// INCLUDE FILES
+#include <e32math.h>
+#include "IMApiTest.h"
+
+// EXTERNAL DATA STRUCTURES
+// None
+
+// EXTERNAL FUNCTION PROTOTYPES
+// None
+
+// CONSTANTS
+// None
+
+// MACROS
+// None
+
+// LOCAL CONSTANTS AND MACROS
+// None
+
+// MODULE DATA STRUCTURES
+// None
+
+// LOCAL FUNCTION PROTOTYPES
+// None
+
+// FORWARD DECLARATIONS
+// None
+
+// ==================== LOCAL FUNCTIONS =======================================
+
+/*
+-------------------------------------------------------------------------------
+
+    DESCRIPTION
+
+    This module contains the implementation of CIMApiTest class
+    member functions that does the actual tests.
+
+-------------------------------------------------------------------------------
+*/
+
+// ============================ MEMBER FUNCTIONS ===============================
+
+/*
+-------------------------------------------------------------------------------
+
+    Class: CIMApiTest
+
+    Method: Case
+
+    Description: Returns a test case by number.
+
+    This function contains an array of all available test cases
+    i.e pair of case name and test function. If case specified by parameter
+    aCaseNumber is found from array, then that item is returned.
+
+    The reason for this rather complicated function is to specify all the
+    test cases only in one place. It is not necessary to understand how
+    function pointers to class member functions works when adding new test
+    cases. See function body for instructions how to add new test case.
+
+    Parameters:    const TInt aCaseNumber :in:      Test case number
+
+    Return Values: const TCaseInfo Struct containing case name & function
+
+    Errors/Exceptions: None
+
+    Status: Proposal
+
+-------------------------------------------------------------------------------
+*/
+const TCaseInfo CIMApiTest::Case (
+    const TInt aCaseNumber ) const
+    {
+
+    /*
+    * To add new test cases, implement new test case function and add new
+    * line to KCases array specify the name of the case and the function
+    * doing the test case
+    * In practice, do following
+    *
+    * 1) Make copy of existing test case function and change its name
+    *    and functionality. Note that the function must be added to
+    *    OOMHard.cpp file and to OOMHard.h
+    *    header file.
+    *
+    * 2) Add entry to following KCases array either by using:
+    *
+    * 2.1: FUNCENTRY or ENTRY macro
+    * ENTRY macro takes two parameters: test case name and test case
+    * function name.
+    *
+    * FUNCENTRY macro takes only test case function name as a parameter and
+    * uses that as a test case name and test case function name.
+    *
+    * Or
+    *
+    * 2.2: OOM_FUNCENTRY or OOM_ENTRY macro. Note that these macros are used
+    * only with OOM (Out-Of-Memory) testing!
+    *
+    * OOM_ENTRY macro takes five parameters: test case name, test case
+    * function name, TBool which specifies is method supposed to be run using
+    * OOM conditions, TInt value for first heap memory allocation failure and
+    * TInt value for last heap memory allocation failure.
+    *
+    * OOM_FUNCENTRY macro takes test case function name as a parameter and uses
+    * that as a test case name, TBool which specifies is method supposed to be
+    * run using OOM conditions, TInt value for first heap memory allocation
+    * failure and TInt value for last heap memory allocation failure.
+    */
+
+    static TCaseInfoInternal const KCases[] =
+        {
+        // To add new test cases, add new items to this array
+
+        // NOTE: When compiled to GCCE, there must be Classname::
+        // declaration in front of the method name, e.g.
+        // CIMApiTest::PrintTest. Otherwise the compiler
+        // gives errors.
+
+		ENTRY( "Create IM Client", CIMApiTest::CreateImClientL ),
+//        ENTRY( "Invalid Login", CIMApiTest::InvalidLoginL ),
+//        ENTRY( "Login", CIMApiTest::LoginL ),
+//        ENTRY( "Send P To P ValidUserID", CIMApiTest::SendPToPValidUserIDL ),
+//        ENTRY( "Send P To P ValidTvoUserID", CIMApiTest::SendPToPValidTwoUserIDL ),
+//        ENTRY( "Send P To P ValidContact", CIMApiTest::SendPToPValidContactL ),
+//        ENTRY( "Send P To P ValidTwoContact", CIMApiTest::SendPToPValidTwoContactL ),
+//        ENTRY( "Send P To P ContactContentType", CIMApiTest::SendPToPContactContentTypeL ),
+//        ENTRY( "Send P To P UserIDContentType", CIMApiTest::SendPToPUserIDContentTypeL ),
+//        ENTRY( "Logout", CIMApiTest::LogoutL ),
+//        ENTRY( "Cancel Login", CIMApiTest::CancelLoginL ),
+        };
+
+    // Verify that case number is valid
+    if ( ( TUint ) aCaseNumber >= sizeof( KCases ) /
+         sizeof( TCaseInfoInternal ) )
+        {
+
+        // Invalid case, construct empty object
+        TCaseInfo null( ( const TText* ) L"" );
+        null.iMethod = NULL;
+        null.iIsOOMTest = EFalse;
+        null.iFirstMemoryAllocation = 0;
+        null.iLastMemoryAllocation = 0;
+        return null;
+
+        }
+
+    // Construct TCaseInfo object and return it
+    TCaseInfo tmp ( KCases[ aCaseNumber ].iCaseName );
+    tmp.iMethod = KCases[ aCaseNumber ].iMethod;
+    tmp.iIsOOMTest = KCases[ aCaseNumber ].iIsOOMTest;
+    tmp.iFirstMemoryAllocation = KCases[ aCaseNumber ].iFirstMemoryAllocation;
+    tmp.iLastMemoryAllocation = KCases[ aCaseNumber ].iLastMemoryAllocation;
+    return tmp;
+
+    }
+
+TInt CIMApiTest::CreateImClientL( TTestResult& aResult )
+    {
+    iRunner->StartRunL( CreateImClient );
+    // Sets test case result and description(Maximum size is KStifMaxResultDes)
+    _LIT( KDescription, "CreateImClientL Passed" );
+    aResult.SetResult( KErrNone, KDescription );
+    // Case was executed
+    return KErrNone;
+
+    }
+	
+TInt CIMApiTest::InvalidLoginL( TTestResult& aResult )
+    {
+    iRunner->StartRunL( InvalidLogin );
+    // Sets test case result and description(Maximum size is KStifMaxResultDes)
+    _LIT( KDescription, "LoginL Passed" );
+    aResult.SetResult( KErrNone, KDescription );
+    // Case was executed
+    return KErrNone;
+
+    }
+
+TInt CIMApiTest::LoginL( TTestResult& aResult )
+    {
+    iRunner->StartRunL( Login );
+    // Sets test case result and description(Maximum size is KStifMaxResultDes)
+    _LIT( KDescription, "LoginL Passed" );
+    aResult.SetResult( KErrNone, KDescription );
+    // Case was executed
+    return KErrNone;
+    }
+
+
+TInt CIMApiTest::SendPToPValidUserIDL( TTestResult& aResult )
+    {
+    iRunner->StartRunL( SendMessageValidUserId );
+    // Sets test case result and description(Maximum size is KStifMaxResultDes)
+    _LIT( KDescription, "SendPToPValidUserIDL Passed" );
+    aResult.SetResult( KErrNone, KDescription );
+    // Case was executed
+    return KErrNone;
+    }
+
+
+TInt CIMApiTest::SendPToPValidTwoUserIDL( TTestResult& aResult )
+    {
+    iRunner->StartRunL( SendMessageValidTwoUserId );
+    // Sets test case result and description(Maximum size is KStifMaxResultDes)
+    _LIT( KDescription, "SendPToPValidTwoUserIDL Passed" );
+    aResult.SetResult( KErrNone, KDescription );
+    // Case was executed
+    return KErrNone;
+    }
+
+
+TInt CIMApiTest::SendPToPValidContactL( TTestResult& aResult )
+    {
+    iRunner->StartRunL( SendMessageValidContact );
+    // Sets test case result and description(Maximum size is KStifMaxResultDes)
+    _LIT( KDescription, "SendPToPValidContactL Passed" );
+    aResult.SetResult( KErrNone, KDescription );
+    // Case was executed
+    return KErrNone;
+    }
+
+
+TInt CIMApiTest::SendPToPValidTwoContactL( TTestResult& aResult )
+    {
+    iRunner->StartRunL( SendMessageValidTwoContact );
+    // Sets test case result and description(Maximum size is KStifMaxResultDes)
+    _LIT( KDescription, "SendPToPValidTwoContactL Passed" );
+    aResult.SetResult( KErrNone, KDescription );
+    // Case was executed
+    return KErrNone;
+    }
+
+TInt CIMApiTest::SendPToPContactContentTypeL( TTestResult& aResult )
+    {
+    iRunner->StartRunL( SendPToPContactContentType );
+    // Sets test case result and description(Maximum size is KStifMaxResultDes)
+    _LIT( KDescription, "SendPToPContactContentTypeL Passed" );
+    aResult.SetResult( KErrNone, KDescription );
+    // Case was executed
+    return KErrNone;
+    }
+
+TInt CIMApiTest::SendPToPUserIDContentTypeL( TTestResult& aResult )
+    {
+    iRunner->StartRunL( SendPToPUserIDContentType );
+    // Sets test case result and description(Maximum size is KStifMaxResultDes)
+    _LIT( KDescription, "SendPToPUserIDContentTypeL Passed" );
+    aResult.SetResult( KErrNone, KDescription );
+    // Case was executed
+    return KErrNone;
+    }
+
+TInt CIMApiTest::LogoutL( TTestResult& aResult )
+    {
+    iRunner->StartRunL( Logout );
+    // Sets test case result and description(Maximum size is KStifMaxResultDes)
+    _LIT( KDescription, "LogoutL Passed" );
+    aResult.SetResult( KErrNone, KDescription );
+    // Case was executed
+    return KErrNone;
+    }
+
+
+TInt CIMApiTest::CancelLoginL( TTestResult& aResult )
+    {
+    iRunner->StartRunL( CancelLogin );
+    // Sets test case result and description(Maximum size is KStifMaxResultDes)
+    _LIT( KDescription, "CancelLoginL Passed" );
+    aResult.SetResult( KErrNone, KDescription );
+    // Case was executed
+    return KErrNone;
+    }
+
+// End of File
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/common/tools/ats/smoketest/IM/src/ParserUtils.cpp	Thu Nov 12 14:45:32 2009 +0000
@@ -0,0 +1,122 @@
+/*
+* Copyright (c) 2002-2005 Nokia Corporation and/or its subsidiary(-ies). 
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of the License "Symbian Foundation License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.symbianfoundation.org/legal/sfl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description: The class handles IMPS Setting file reading.
+*
+*
+*/
+
+
+// INCLUDE FILES
+#include    <e32std.h>
+#ifdef _DEBUG
+#include    <flogger.h>
+#endif
+#include "ParserUtils.h"
+
+// ================= MEMBER FUNCTIONS =======================
+
+
+
+//**********************************
+// CImpsSettingFile
+//**********************************
+
+CImpsSettingFile* CImpsSettingFile::NewL(
+    RFs& aFs )
+    {
+    CImpsSettingFile* self = new ( ELeave ) CImpsSettingFile( aFs );
+    return self;
+    }
+
+CImpsSettingFile::~CImpsSettingFile()
+    {
+    if ( iOpen )
+        {
+        iReader.Close();
+        }
+    iOpen = EFalse;
+    }
+
+CImpsSettingFile::CImpsSettingFile( RFs& aFs )
+        : iFs( aFs ),
+        iOpen( EFalse )
+    {
+
+    }
+
+void CImpsSettingFile::OpenL( TDesC& aResFile )
+    {
+    // open a file
+    iFileName = aResFile;
+
+    TInt myError = iReader.Open( iFs,
+                                 iFileName,
+                                 EFileShareReadersOnly );
+
+    User::LeaveIfError( myError );
+    iOpen = ETrue;
+
+    }
+
+TPtrC8 CImpsSettingFile::KeyValueL( const TDesC8& aKey )
+    {
+
+    TPtrC8 myKey;
+    TPtrC8 myValue;
+    TBool getIt( EFalse );
+    TInt err = 0;
+
+    // Reset the reader
+    OpenL( iFileName );
+
+    // Start to search
+    while ( !getIt )
+        {
+        TRAP ( err, ReadRowL( myKey, myValue ) );
+        if ( err != KErrNone )
+            {
+            User::Leave( KErrNotFound );
+            }
+        if ( !myKey.CompareF( aKey ) )
+            {
+            return myValue;
+            }
+        }
+    return TPtrC8();
+    }
+
+void CImpsSettingFile::ReadRowL( TPtrC8& aKey, TPtrC8& aValue )
+    {
+    // READ ONE ROW
+    TChar delim( 10 );
+    iReader.ReadL( iRowBuffer, delim );
+    TInt length = iRowBuffer.Length();
+    if ( length > 2 )
+        {
+        // DROP CR+LF FROM THE END OF LINE
+        iRowBuffer.Delete( length - 2, 2 );
+
+        TInt pos = 0;
+        pos = iRowBuffer.Find( _L8( "=" ) );
+        if ( pos > 0 )
+            {
+            aKey.Set( iRowBuffer.Left( pos ) );
+            // Cut off separator
+            aValue.Set( iRowBuffer.Mid( pos + 1 ) );
+            }
+        }
+    }
+
+//  End of File
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/common/tools/ats/smoketest/IM/src/TestRunner.cpp	Thu Nov 12 14:45:32 2009 +0000
@@ -0,0 +1,701 @@
+/*
+* Copyright (c) 2002-2005 Nokia Corporation and/or its subsidiary(-ies). 
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of the License "Symbian Foundation License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.symbianfoundation.org/legal/sfl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description: The class handles the test case running.
+*
+*
+*/
+
+
+
+// INCLUDE FILES
+#include    <e32std.h>
+#include    <flogger.h>
+#include 	"imerrors.h"
+#include    <CNTDEF.H>
+#include    "IMApiMTHandlers.h"
+#include    "TestRunner.h"
+#include 	"IMApiTest.h"
+#include 	"ParserUtils.h"
+
+_LIT( KImpsIMApiMTIniFile, "c:\\smoketest\\imapitest.ini" );
+_LIT8( KImpsSAP, "SAP" );
+_LIT8( KImpsUserID, "Userid" );
+_LIT8( KImpsPassword, "password" );
+_LIT8( KImpsClientid, "clientid" );
+_LIT8( KImpsIAP, "IAP" );
+_LIT8( KImpsUserid1, "userid1" );
+_LIT8( KImpsUserid2, "userid2" );
+
+void SetupSchedulerL()
+    {
+    // Create a scheduler
+    CTestScheduler* scheduler = new( ELeave )CTestScheduler;
+    CleanupStack::PushL( scheduler );
+    CActiveScheduler::Install( scheduler );
+    CleanupStack::Pop(); // scheduler
+    }
+
+void CTestRunner::ReadIniFileL()
+    {
+    RFs myFs;
+    TInt err = 0;
+    TUint32 myTime = 0;
+    TLex lex;
+    err = myFs.Connect();
+    //CleanupClosePushL( myFs );
+    CImpsSettingFile* configFile = CImpsSettingFile::NewL( myFs );
+    CleanupStack::PushL( configFile );
+    TFileName fileN( KImpsIMApiMTIniFile );
+    // Open config file
+    TRAP( err, configFile->OpenL( fileN ) );
+    User::LeaveIfError( err );
+
+    TBuf<KImpsMaxSapLen> myPtr;
+    TRAP( err, myPtr.Copy( configFile->KeyValueL( KImpsSAP ) ) );
+    if ( !err )
+        {
+        iSapValue.Copy( myPtr );
+        }
+    TRAP( err, myPtr.Copy( configFile->KeyValueL( KImpsUserID ) ) );
+    if ( !err )
+        {
+        iUserIdValue.Copy( myPtr );
+        }
+    TRAP( err, myPtr.Copy( configFile->KeyValueL( KImpsPassword ) ) );
+    if ( !err )
+        {
+        iPassword.Copy( myPtr );
+        }
+    TRAP( err, myPtr.Copy( configFile->KeyValueL( KImpsClientid ) ) );
+    if ( !err )
+        {
+        iClientId.Copy( myPtr );
+        }
+    TRAP( err, myPtr.Copy( configFile->KeyValueL( KImpsIAP ) ) );
+    if ( !err )
+        {
+        lex.Assign( myPtr );
+        lex.Val( myTime, EDecimal );
+        iIAP = ( TInt ) myTime;
+        }
+    TRAP( err, myPtr.Copy( configFile->KeyValueL( KImpsUserid1 ) ) );
+    if ( !err )
+        {
+        iUserId1.Copy( myPtr );
+        }
+    TRAP( err, myPtr.Copy( configFile->KeyValueL( KImpsUserid2 ) ) );
+    if ( !err )
+        {
+        iUserId2.Copy( myPtr );
+        }
+    CleanupStack::PopAndDestroy( 1 );  // configFile
+    }
+
+
+
+CTestRunner* CTestRunner::NewL()
+    {
+    CTestRunner* self = new ( ELeave ) CTestRunner();
+    CleanupStack::PushL( self );
+    self->ConstructL();
+    CleanupStack::Pop(); //self
+    return self;
+    }
+
+void CTestRunner::ConstructL()
+    {
+    SetupSchedulerL();
+    iCase = Login;
+    iDatabase = CContactDatabase::OpenL();
+    iImObserver = CIMApiClientHandler::NewL( iStatus );
+    iConnObserver = CConnectionObserver::NewL( iStatus );
+    ReadIniFileL();
+
+    CActiveScheduler::Add( this );
+    }
+
+CTestRunner::~CTestRunner()
+    {
+
+    if ( iOpenApi != NULL )
+        {
+        iOpenApi->UnregisterObserver();
+        }
+    CTestLogger1::Log( _L( "Test Case Number #16" ) );
+    CTestLogger1::Log( _L( "CImConnection::UnregisterObserver" ) );
+    if ( iOpenApi != NULL )
+        {
+        delete iOpenApi;
+        iOpenApi = NULL;
+        }
+    if ( iImClient != NULL )
+        {
+        delete iImClient;
+        iImClient = NULL;
+        }
+    if ( iConnObserver != NULL )
+        {
+        delete iConnObserver;
+        iConnObserver = NULL;
+        }
+    if ( iImObserver != NULL )
+        {
+        delete iImObserver;
+        iImObserver = NULL;
+        }
+    if ( iDatabase != NULL )
+        {
+        delete iDatabase;
+        iDatabase = NULL;
+        }
+
+    }
+
+
+
+void CTestRunner::DoCancel()
+    {
+    // Complete the request with error
+    TRequestStatus* s = &iStatus;
+    User::RequestComplete( s, KErrCancel );
+    }
+
+
+CTestRunner::CTestRunner()
+        : CActive( 0 )
+    {
+    }
+
+
+void CTestRunner::StartRunL( TWhichCase aCase )
+    {
+    iCase = aCase;
+    SetActive();
+    TRequestStatus *s = &iStatus;
+    User::RequestComplete( s, KErrNone );
+    CActiveScheduler::Start();
+    }
+
+void CTestRunner::RunL()
+    {
+    TInt errxx = 0;
+    TRAP( errxx, DoRunL() );
+    if ( errxx < 0 )
+        {
+        CActiveScheduler::Stop();
+        }
+    }
+
+
+void CTestRunner::DoRunL()
+    {
+    if ( iCase >= Finish )
+        {
+        Cancel();
+        CActiveScheduler::Stop();
+        return;
+        }
+
+    if ( iStatus != KErrNone )
+        {
+        Cancel();
+        CActiveScheduler::Stop();
+        return;
+        }
+    switch ( iCase )
+        {
+        case CreateImClient:
+            {
+            CreateInstanceL();			//NewL - instantiate the object
+            RegisterConnObserverL();	//RegisterObserverL - register the observer methods
+            LoadIMInterfaceL();			//CreateImClientL - get the IM interface
+            }
+        break;
+        case InvalidLogin:
+            {
+            CreateInstanceL();
+            RegisterConnObserverL();
+            LoadIMInterfaceL();
+            IMRegisterL();
+            LoginL( _L( "InvalidUser" ) );
+            }
+        break;
+        case Login:
+            {
+            CreateInstanceL();
+            RegisterConnObserverL();
+            LoadIMInterfaceL();
+            IMRegisterL();
+            LoginL( iUserIdValue );
+            }
+        break;
+        case SendMessageValidUserId:
+            {
+            SendPToPValidUserIDL();
+            }
+        break;
+        case SendMessageValidTwoUserId:
+            {
+            SendPToPValidTwoUserIDL();
+            }
+        break;
+        case SendMessageValidContact:
+            {
+            SendPToPValidContactL();
+            }
+        break;
+        case SendMessageValidTwoContact:
+            {
+            SendPToPValidTwoContactL();
+            }
+        break;
+        case SendPToPContactContentType:
+            {
+            SendPToPContactContentTypeL();
+            }
+        break;
+        case SendPToPUserIDContentType:
+            {
+            SendPToPUserIDContentTypeL();
+            }
+        break;
+
+        case Logout:
+            {
+            QueryIMConnectionStatusL();
+            }
+        break;
+        case CancelLogin:
+            {
+            CancelLoginL();
+            }
+        break;
+        }
+
+    iCase = Finish;
+
+    return;
+    }
+
+
+CContactIdArray* CTestRunner::GetWVContactIdsLC( )
+    {
+    _LIT( KWVStart, "" );
+    // Specify in which fields search should be performed
+    CContactItemFieldDef* fieldToSearchIn = new ( ELeave ) CContactItemFieldDef();
+    CleanupStack::PushL( fieldToSearchIn );
+    fieldToSearchIn->AppendL( KUidContactFieldVCardMapWV );
+
+    // search in contact database
+    CContactIdArray *array = iDatabase->FindLC( KWVStart, fieldToSearchIn );
+    CleanupStack::Pop(); //>> array
+    CleanupStack::PopAndDestroy(); //>> fieldToSearchIn
+    CleanupStack::PushL( array );
+
+    return array;
+    }
+
+
+
+TInt CTestRunner::RegisterConnObserverL()
+    {
+    CTestLogger1::Log( _L( "Test Case Number #2" ) );
+    TRAPD( err, iOpenApi->RegisterObserverL( iConnObserver ) );
+    // Catch errors
+    if ( err == KImApiGeneralError ) // -30133
+        {
+        iStatus = err; // Failed
+        CTestLogger1::Log( _L( "CImConnection::RegisterObserverL - err=%d" ), err );
+        }
+    else
+        {
+        iStatus = KErrNone; //OK
+        CTestLogger1::Log( _L( "CImConnection::RegisterObserverL - err=%d" ), err );
+        }
+    }
+
+
+TInt CTestRunner::CreateInstanceL()
+    {
+    CTestLogger1::Log( _L( "Test Case Number #1" ) );
+    iOpenApi = CImConnection::NewL( iClientId );
+    CTestLogger1::Log( _L( "CImConnection::NewL" ) );
+    return KErrNone; //OK
+    }
+
+
+TInt CTestRunner::LoadIMInterfaceL()
+    {
+    CTestLogger1::Log( _L( "Test Case Number #3" ) );
+    TRAPD( err, iImClient = iOpenApi->CreateImClientL() );
+    // Catch errrors
+    if ( err == 0 )
+        {
+        iStatus = KErrNone; // OK
+        CTestLogger1::Log( _L( "CreateImClientL - err=%d" ), err );
+        }
+    else
+        {
+        iStatus = err; // Failed
+        CTestLogger1::Log( _L( "CreateImClientL - err=%d" ), err );
+        }
+    }
+
+
+TInt CTestRunner::IMRegisterL()
+    {
+    CTestLogger1::Log( _L( "Test Case Number #4" ) );
+    TRAPD( err, iImClient -> RegisterObserverL( iImObserver ) );
+    // Catch errors
+    if ( err == KImApiGeneralError ) //- 30133
+        {
+        iStatus = err; // Failes
+        CTestLogger1::Log( _L( "MImClient::RegisterObserverL - err=%d" ), err );
+        }
+    else
+        {
+        iStatus = KErrNone; //OK
+        CTestLogger1::Log( _L( "MImClient::RegisterObserverL - err=%d" ), err );
+        }
+    }
+
+TInt CTestRunner::LoginL( const TDesC& aUserID )
+    {
+    if ( aUserID.Compare( _L( "InvalidUser" ) ) )
+        CTestLogger1::Log( _L( "Test Case Number #6" ) );
+    else
+        {
+        CTestLogger1::Log( _L( "Invalid Login" ) );
+        CTestLogger1::Log( _L( "Test Case Number #5" ) );
+        }
+
+    if ( iSapValue.Size() == 0 || iPassword.Size() == 0 || aUserID.Size() == 0 )
+        {
+        iStatus = KErrNone;
+        CTestLogger1::Log( _L( "Invalid login parametres" ) );
+        Cancel();
+        CActiveScheduler::Stop();
+        return KErrNone;
+        }
+
+    TRAPD( err, iOpenApi->LoginL( iSapValue, aUserID, iPassword, iIAP ) );
+    // Catch errors
+    if ( err )
+        {
+        iStatus = err; // Failes
+        CTestLogger1::Log( _L( "LoginL - err=%d" ), err );
+        return err;
+        }
+    else
+        {
+        iStatus = KRequestPending;
+        CTestLogger1::Log( _L( "LoginL - err=%d" ), err );
+        SetActive();
+        return KErrNone;
+        }
+    }
+
+TInt CTestRunner::SendPToPValidUserIDL()
+    {
+    CTestLogger1::Log( _L( "Test Case Number #7" ) );
+    if ( iUserId1.Length() == 0 )
+        {
+        CTestLogger1::Log( _L( "SendPToPMessageL(ValidUserId) UserID1 is NULL " ) );
+        iStatus = KErrNone;
+        Cancel();
+        CActiveScheduler::Stop();
+        return KErrNone;
+        }
+    CDesCArray* userIds = new( ELeave ) CDesCArrayFlat( 1 ); // Create user list
+    CleanupStack::PushL( userIds );
+    userIds->AppendL( iUserId1 ); // Add one user
+
+    _LIT( KContentType, "text/plain" ); // Message type
+    _LIT( KMessage, "5. Hello In One Time Valid UserId" ); // Message
+    TInt OpId = 0;
+    // Send message
+    TRAPD ( err, OpId = iImClient->SendPToPMessageL( iUserId1, KMessage ) );
+    // Catch errors
+    if ( err == KImApiErrInvalidUserId && OpId == 0 ) // KImApiErrInvalidUserId
+        {
+        CTestLogger1::Log( _L( "SendPToPMessageL(ValidUserId) - err=%d" ), err );
+        CleanupStack::PopAndDestroy(); // userIds
+        iStatus = err;
+        return err;
+        }
+    else if ( err == KImApiGeneralError && OpId == 0 ) // General ImApi errror
+        {
+        CTestLogger1::Log( _L( "SendPToPMessageL(ValidUserId) - err=%d" ), err );
+        CleanupStack::PopAndDestroy(); // userIds
+        iStatus = err;
+        return err;
+        }
+    else
+        {
+        CTestLogger1::Log( _L( "SendPToPMessageL(ValidUserId) - err=%d" ), err );
+        CleanupStack::PopAndDestroy(); // userIds
+        iStatus = KRequestPending;
+        SetActive();
+        return KErrNone;
+        }
+    }
+
+
+TInt CTestRunner::SendPToPValidTwoUserIDL()
+    {
+    CTestLogger1::Log( _L( "Test Case Number #8" ) );
+    CDesCArray* userIds = new( ELeave ) CDesCArrayFlat( 2 ); // Create new user list
+    CleanupStack::PushL( userIds );
+    userIds->AppendL( iUserId1 ); // Add user 0 nok3
+    userIds->AppendL( iUserId2 ); // Add user 1 nok5
+
+    _LIT( KContentType, "text/plain" );
+    _LIT( KMessage, "6. Hello In Two Times Valid UserId" );
+    TInt OpId = 0;
+    // Send Message
+    TRAPD ( err, OpId = iImClient->SendPToPMessageL( *userIds, KMessage ) );
+    // Catch errors
+    if ( err == KImApiErrInvalidUserId && OpId == 0 ) // KImApiErrInvalidUserId
+        {
+        CTestLogger1::Log( _L( "SendPToPMessageL(ValidTwoUserIds) - err=%d" ), err );
+        CleanupStack::PopAndDestroy(); // userIds
+        iStatus = err;
+        return err;
+        }
+    else if ( err == KImApiGeneralError && OpId == 0 ) // General ImApi errror
+        {
+        CTestLogger1::Log( _L( "SendPToPMessageL(ValidTwoUserIds) - err=%d" ), err );
+        CleanupStack::PopAndDestroy(); // userIds
+        iStatus = err;
+        return err;
+        }
+    else
+        {
+        CTestLogger1::Log( _L( "SendPToPMessageL(ValidTwoUserIds) - err=%d" ), err );
+        CleanupStack::PopAndDestroy(); // userIds
+        iStatus = KRequestPending;
+        SetActive();
+        return KErrNone;
+        }
+    }
+
+
+TInt CTestRunner::SendPToPValidContactL()
+    {
+    CTestLogger1::Log( _L( "Test Case Number #9" ) );
+    CContactIdArray* contactIDArray = GetWVContactIdsLC();
+    if ( contactIDArray->Count() == 0 )
+        {
+        CTestLogger1::Log( _L( "Can not find WvContact ID" ) );
+        CleanupStack::PopAndDestroy();
+        iStatus = KErrNone;
+        Cancel();
+        CActiveScheduler::Stop();
+        return KErrNone;
+        }
+    TInt OpId = 0;
+    // Be sure that two contact is real WV contact
+    // Select first contact
+    TContactItemId& OmaContact = ( *contactIDArray )[0];
+
+    //Add first contact
+    CContactIdArray* myContactIds = CContactIdArray::NewL();
+    myContactIds->AddL( OmaContact );
+
+    // Check that we have only one contact
+    TInt nuberofcontacts = myContactIds->Count();
+    //CTestLogger1::Log( _L("nuberofcontacts =%d"), nuberofcontacts );
+    //Send message to myContacts
+    TRAPD( err, OpId = iImClient->SendPToPMessageL( OmaContact/*myContactIds*/, _L( "12. Hello One Valid Contact" ) ) );
+    // Just checking return value
+    if ( err == KImApiErrInvalidContactId && OpId == 0 ) // KImApiErrInvalidContactId and OperationId is 0
+        {
+        CTestLogger1::Log( _L( "SendPToPMessageL(ValidContact) - err=%d" ), err );
+        CleanupStack::PopAndDestroy();
+        iStatus = KErrNone;
+        Cancel();
+        CActiveScheduler::Stop();
+        return err;
+        }
+    else if ( err == KImApiGeneralError && OpId == 0 ) // General ImApi error
+        {
+        CTestLogger1::Log( _L( "SendPToPMessageL(ValidContact) - err=%d" ), err );
+        CleanupStack::PopAndDestroy(); // userIds
+        iStatus = err;
+        return err;
+        }
+    else
+        {
+        CTestLogger1::Log( _L( "SendPToPMessageL(ValidContact) - err=%d" ), err );
+        CleanupStack::PopAndDestroy();
+        iStatus = KRequestPending;
+        SetActive();
+        return KErrNone; //OpId;
+        }
+    }
+
+
+TInt CTestRunner::SendPToPValidTwoContactL()
+    {
+    CTestLogger1::Log( _L( "Test Case Number #10" ) );
+    CContactIdArray* contactIDArray = GetWVContactIdsLC();
+    TInt OpId = 0;
+    // Be sure that two contact is real WV contact
+    //Is there three contacts
+    TInt nuberofcontacts = contactIDArray->Count();
+    if ( contactIDArray->Count() == 0 )
+        {
+        CTestLogger1::Log( _L( "Can not find WvContact ID" ) );
+        CleanupStack::PopAndDestroy();
+        iStatus = KErrNone;
+        Cancel();
+        CActiveScheduler::Stop();
+        return KErrNone;
+        }
+    // Remove third contact
+    // Never commit the reset
+    if ( contactIDArray->Count() >= 3 )
+        {
+        contactIDArray->Remove( 2 );
+        }
+
+
+    // Check if Remove is OK
+    TRAPD( err1, OpId = iImClient->SendPToPMessageL( *contactIDArray, _L( "text/plain" ), _L8( "Hello All" ) ) );
+
+    //Send message
+    TRAPD( err, OpId = iImClient->SendPToPMessageL( *contactIDArray, _L( "13. Hello In Two Times Valid Contact" ) ) );
+
+    // Just checking return value
+    if ( err == KImApiErrInvalidContactId && OpId == 0 ) // KImApiErrInvalidContactId and OperationId is 0
+        {
+        CTestLogger1::Log( _L( "SendPToPMessageL(ValidTwoContact) - err=%d" ), err );
+        CleanupStack::PopAndDestroy();
+        iStatus = KErrNone;
+        Cancel();
+        CActiveScheduler::Stop();
+        return err;
+        }
+    else if ( err == KImApiGeneralError && OpId == 0 ) // General ImApi error
+        {
+        CTestLogger1::Log( _L( "SendPToPMessageL(ValidTwoContact) - err=%d" ), err );
+        CleanupStack::PopAndDestroy(); // userIds
+        iStatus = err;
+        return err;
+        }
+    else
+        {
+        CTestLogger1::Log( _L( "SendPToPMessageL(ValidTwoContact) - err=%d" ), err );
+        CleanupStack::PopAndDestroy();
+        iStatus = KRequestPending;
+        SetActive();
+        return KErrNone; // OpId;
+        }
+    }
+
+TInt CTestRunner::SendPToPContactContentTypeL()
+    {
+    //This SDK API is not supported. Test case is added to increase the code coverage
+    CTestLogger1::Log( _L( "Test Case Number #11" ) );
+    CTestLogger1::Log( _L( "SendPToPContactContentTypeL" ) );
+    TInt OpId = 0;
+    CContactIdArray* contactIDArray = GetWVContactIdsLC();
+    if ( contactIDArray->Count() == 0 )
+        {
+        CTestLogger1::Log( _L( "Can not find WvContact ID" ) );
+        CleanupStack::PopAndDestroy();
+        iStatus = KErrNone;
+        Cancel();
+        CActiveScheduler::Stop();
+        return KErrNone;
+        }
+    TRAPD( err, OpId = iImClient->SendPToPMessageL( *contactIDArray, _L( "text/plain" ), _L8( "Hello All" ) ) );
+    CleanupStack::PopAndDestroy(); // userIds
+    iStatus = err;
+    Cancel();
+    CActiveScheduler::Stop();
+    return err;
+    }
+
+TInt CTestRunner::SendPToPUserIDContentTypeL()
+    {
+    //This SDK API is not supported. Test case is added to increase the code coverage
+    CTestLogger1::Log( _L( "Test Case Number #12" ) );
+    CTestLogger1::Log( _L( "SendPToPUserIDContentTypeL" ) );
+    TInt OpId = 0;
+    CDesCArray* userIds = new( ELeave ) CDesCArrayFlat( 2 );
+    CleanupStack::PushL( userIds );
+
+    TRAPD( err, OpId = iImClient->SendPToPMessageL( *userIds, _L( "text/plain" ), _L8( "Hello All" ) ) );
+    CleanupStack::PopAndDestroy(); // userIds
+    iStatus = err;
+    Cancel();
+    CActiveScheduler::Stop();
+    return err;
+    }
+
+
+TInt CTestRunner::QueryIMConnectionStatusL()
+    {
+    CTestLogger1::Log( _L( "Test Case Number #13" ) );
+    TInt ret = iOpenApi->ImConnectionStatus();
+    // Check returnvalue
+    if ( ret == 0 ) // iLoggedIn
+        {
+        CTestLogger1::Log( _L( "LogoutL" ) );
+        iOpenApi->LogoutL();
+        iStatus = KErrNone;
+        return 0;
+        }
+    else // 1
+        {
+        iStatus = KErrNone;
+        Cancel();
+        CActiveScheduler::Stop();
+        return ret;
+        }
+    }
+
+
+TInt CTestRunner::CancelLoginL()
+    {
+    CTestLogger1::Log( _L( "Test Case Number #14" ) );
+    LoginL( iUserIdValue );
+    TRAPD ( err, iOpenApi->CancelLoginL() );
+    CTestLogger1::Log( _L( "CancelLoginL - err=%d" ), err );
+    iImClient->UnregisterObserver();
+    CTestLogger1::Log( _L( "Test Case Number #15" ) );
+    CTestLogger1::Log( _L( "CImClient::UnregisterObserver" ) );
+    }
+
+//**********************************
+// Logger
+//**********************************
+const TInt KLogBufferLength = 256;
+_LIT( KLogDir, "impsc" );
+_LIT( KLogFile, "IMAPITestCaseLog.txt" );
+
+EXPORT_C void CTestLogger1::Log( TRefByValue<const TDesC> aFmt, ... )
+    {
+    VA_LIST list;
+    VA_START( list, aFmt );
+
+    // Print to log file
+    TBuf<KLogBufferLength> buf;
+    buf.FormatList( aFmt, list );
+
+    // Write to log file
+    RFileLogger::Write( KLogDir, KLogFile, EFileLoggingModeAppend, buf );
+    }
+