symbianunittestfw/sutfw/sutfwcore/sutfwtestrunner/src/symbianunittestrunner.cpp
changeset 0 20abbd395761
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/symbianunittestfw/sutfw/sutfwcore/sutfwtestrunner/src/symbianunittestrunner.cpp	Wed Aug 25 15:52:14 2010 +0300
@@ -0,0 +1,377 @@
+/*
+* Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description:  
+*
+*/
+
+#include "symbianunittestrunner.h"
+#include "symbianunittestuicallback.h"
+#include "symbianunittestoutputformatter.h"
+#include "symbianunittestoutputfactory.h"
+#include "symbianunittestresult.h"
+#include "symbianunittestversion.h"
+#include "sutlogger.h"
+#include "symbianunittestlddctl.h"
+#include <symbianunittestinterface.h>
+#include <e32uid.h>
+
+
+// Failures while loading dll:
+_LIT( KFailedToFindDll, "Failed to find DLL:\n\"%S\"\n" );
+_LIT( KFailedToLoadLDD, "Failed to load LDD:\n\"%S\"\n" );
+_LIT( KFailedToRunLDD, "Failed to run LDD tests:\n\"%S\"\n" );
+_LIT( KNonCompatibleUIDs, "Cannot use DLL with non-compatible UIDs!\n" );
+_LIT( KExportFuncNotFound, "Cannot find EXPORT function from test DLL!\n" );
+_LIT( KLogVersion, "SymbianUnitTest v%d.%d.%d" );
+_LIT( KLogFinish, "SymbianUnitTest finished" );
+
+// -----------------------------------------------------------------------------
+//
+// -----------------------------------------------------------------------------
+//
+EXPORT_C CSymbianUnitTestRunner* CSymbianUnitTestRunner::NewLC( 
+    MSymbianUnitTestUiCallBack& aUiCallBack )
+    {
+    CSymbianUnitTestRunner* self = 
+        new( ELeave )CSymbianUnitTestRunner( aUiCallBack );
+    CleanupStack::PushL( self );
+    self->ConstructL();
+    return self;
+    }
+
+// -----------------------------------------------------------------------------
+//
+// -----------------------------------------------------------------------------
+//
+EXPORT_C CSymbianUnitTestRunner* CSymbianUnitTestRunner::NewL( 
+    MSymbianUnitTestUiCallBack& aUiCallBack )
+    {
+    CSymbianUnitTestRunner* self = CSymbianUnitTestRunner::NewLC( aUiCallBack );
+    CleanupStack::Pop( self );
+    return self;
+    }
+
+// -----------------------------------------------------------------------------
+//
+// -----------------------------------------------------------------------------
+//
+CSymbianUnitTestRunner::CSymbianUnitTestRunner( 
+    MSymbianUnitTestUiCallBack& aUiCallBack )
+    : iUiCallBack( aUiCallBack )
+    {
+    }
+
+// -----------------------------------------------------------------------------
+//
+// -----------------------------------------------------------------------------
+//
+void CSymbianUnitTestRunner::ConstructL()
+    {
+    iResult = CSymbianUnitTestResult::NewL();
+    //init logger
+    TBuf<50> version;
+    version.Format(KLogVersion, SUT_MAJOR_VERSION, SUT_MINOR_VERSION, SUT_BUILD_VERSION);
+    SUT_LOG_START(version);
+    }
+
+// -----------------------------------------------------------------------------
+//
+// -----------------------------------------------------------------------------
+//
+EXPORT_C CSymbianUnitTestRunner::~CSymbianUnitTestRunner()
+    {
+    delete iResult;
+    }
+
+// -----------------------------------------------------------------------------
+// From MSymbianUnitTestObserver
+// -----------------------------------------------------------------------------
+//
+void CSymbianUnitTestRunner::TestPass(const TDesC& aTestCaseName)
+    {
+    iUiCallBack.TestPass(aTestCaseName);
+    }
+
+// -----------------------------------------------------------------------------
+// From MSymbianUnitTestObserver
+// -----------------------------------------------------------------------------
+//
+void CSymbianUnitTestRunner::TestFailed(const TDesC& aTestCaseName, const TDesC8& aErrMsg)
+    {
+    iUiCallBack.TestFailed(aTestCaseName, aErrMsg);
+    }
+
+// -----------------------------------------------------------------------------
+//
+// -----------------------------------------------------------------------------
+//
+EXPORT_C TInt CSymbianUnitTestRunner::TestCount()
+    {
+    return iTestCount;
+    }
+
+EXPORT_C TInt CSymbianUnitTestRunner::TestCountL(const MDesCArray& aTestDllNames, const MDesCArray& aTestCaseNames)
+    {
+    TInt dllCnt = aTestDllNames.MdcaCount(); 
+    if (dllCnt == 0)
+        {
+        return 0;
+        }
+    TInt caseCnt = aTestCaseNames.MdcaCount();
+    if (caseCnt != 0)
+        {
+        return caseCnt;
+        }
+    else
+        {
+        for ( TInt i = 0; i < dllCnt; i++)
+            {
+            CDesCArray* testCaseNames = new (ELeave) CDesCArrayFlat(1);
+            CleanupStack::PushL(testCaseNames);
+            this->TestCaseNamesL(aTestDllNames.MdcaPoint(i), *testCaseNames);
+            caseCnt += testCaseNames->Count();
+            CleanupStack::PopAndDestroy(testCaseNames);
+            }
+        return caseCnt;
+        }
+    }
+
+// -----------------------------------------------------------------------------
+//
+// -----------------------------------------------------------------------------
+//
+EXPORT_C void CSymbianUnitTestRunner::ExecuteTestsL(
+    const MDesCArray& aTestDllNames,
+    TBool aMemoryAllocationFailureSimulation,
+    const TDesC& aOutputFileName,
+    const TDesC& aOutputFormat,
+    const CDesCArray& aTestCaseNames,
+    TInt  aTimeout )
+    {
+    iTestCount = 0;
+    
+    MSymbianUnitTestInterface::TFailureSimulation failureSimulation = 
+        MSymbianUnitTestInterface::ENoFailureSimulation;
+    if ( aMemoryAllocationFailureSimulation )
+        {
+        failureSimulation = 
+            MSymbianUnitTestInterface::EMemAllocFailureSimulation;
+        }
+    
+    for ( TInt i = 0; i < aTestDllNames.MdcaCount(); i++ )
+        {
+        TPtrC16 testDllName( aTestDllNames.MdcaPoint( i ) );
+        if (testDllName.Find(_L(".ldd"))>0)
+            {
+            ExecuteLddTestsL(testDllName, aTestCaseNames, aTimeout);
+            }
+        else
+            {
+            //it is dll test
+            ExecuteDllTestsL(testDllName, failureSimulation, aTestCaseNames, aTimeout);
+            }
+        }
+    
+    CSymbianUnitTestOutputFormatter* outputFormatter = 
+        SymbianUnitTestOutputFactory::CreateOutputLC( 
+            aOutputFileName, aOutputFormat );
+    outputFormatter->PrintL( *iResult );
+    CleanupStack::PopAndDestroy( outputFormatter );    
+    SUT_LOG_INFO(KLogFinish);
+    }
+
+// -----------------------------------------------------------------------------
+//
+// -----------------------------------------------------------------------------
+//
+EXPORT_C TInt CSymbianUnitTestRunner::FailedTestCount()
+    {
+    return iResult->Failures().Count();
+    }
+
+
+// -----------------------------------------------------------------------------
+//
+// -----------------------------------------------------------------------------
+//
+EXPORT_C void CSymbianUnitTestRunner::TestCaseNamesL(
+    const TDesC& aTestDllName, CDesCArray& aTestCaseNames)
+    {
+    
+    if (aTestDllName.Find(_L(".ldd"))>0)
+        {
+        //it is kernel ldd test
+        return GetLddTestCaseNamesL(aTestDllName, aTestCaseNames);
+        }
+    else
+        {
+        //it is dll test
+        return GetDllTestCaseNamesL(aTestDllName, aTestCaseNames);
+        }
+    }
+
+// -----------------------------------------------------------------------------
+// 
+// -----------------------------------------------------------------------------
+//
+void CSymbianUnitTestRunner::GetDllTestCaseNamesL(
+        const TDesC& aTestDllName, CDesCArray& aTestCaseNames)
+    {
+    RLibrary library;
+    TInt ret;
+    ret = library.Load(aTestDllName);
+    if (ret != KErrNone)
+        {
+        iUiCallBack.InfoMsg(KFailedToFindDll, aTestDllName);
+        SUT_LOG_FORMAT(KFailedToFindDll, &aTestDllName);
+        User::Leave(ret);
+        }
+    CleanupClosePushL(library);
+    // The second UID of the dll to be used must be compatible
+    if (library.Type()[1] != KSymbianUnitTestDllUid)
+        {
+        iUiCallBack.InfoMsg(KNonCompatibleUIDs);
+        User::Leave(KErrNotFound);
+        }
+    TLibraryFunction entryFunction = library.Lookup(1);
+    if (!entryFunction)
+        {
+        iUiCallBack.InfoMsg(KExportFuncNotFound);
+        User::Leave(KErrNotFound);
+        }
+
+    MSymbianUnitTestInterface* test =
+            reinterpret_cast<MSymbianUnitTestInterface*> (entryFunction());
+    
+    TCleanupItem cleanupItem(DeleteTest, test);
+    CleanupStack::PushL(cleanupItem);
+    
+    test->TestCaseNamesL(aTestCaseNames);
+    CleanupStack::Pop(); // cleanupItem
+    CleanupStack::PopAndDestroy(&library);
+  
+    }
+
+// -----------------------------------------------------------------------------
+// 
+// -----------------------------------------------------------------------------
+//
+void CSymbianUnitTestRunner::GetLddTestCaseNamesL(
+        const TDesC& aTestLddName, CDesCArray& aTestCaseNames)
+    {
+    CSymbianUnitTestLddCtl* lddCtl = CSymbianUnitTestLddCtl::NewLC(
+            aTestLddName);
+    TInt ret = lddCtl->LoadDriver();
+    if (ret != KErrNone)
+        {
+        iUiCallBack.InfoMsg(KFailedToLoadLDD, aTestLddName);
+        SUT_LOG_FORMAT(KFailedToLoadLDD, &aTestLddName);
+        User::Leave(ret);
+        }
+
+    ret = lddCtl->GetTestCaseNames(aTestCaseNames); 
+    if (ret != KErrNone)
+        {
+        iUiCallBack.InfoMsg(KFailedToRunLDD, aTestLddName);
+        SUT_LOG_FORMAT(KFailedToRunLDD, &aTestLddName);
+        User::Leave(ret);
+        }
+    lddCtl->FreeDriver();
+    CleanupStack::PopAndDestroy(lddCtl);
+    SUT_LOG_FORMAT(_L(" case name count:%d\n"), aTestCaseNames.Length());
+    for (TInt i = 0; i < aTestCaseNames.Length(); i++)
+        {
+            SUT_LOG_FORMAT(_L(" case:%S\n"), &aTestCaseNames[i]);
+        }
+    }
+
+// -----------------------------------------------------------------------------
+// 
+// -----------------------------------------------------------------------------
+//
+void CSymbianUnitTestRunner::DeleteTest( TAny* aTest )
+    {
+    MSymbianUnitTestInterface* test = 
+        reinterpret_cast< MSymbianUnitTestInterface* >( aTest );
+    delete test;
+    }
+
+// -----------------------------------------------------------------------------
+//
+// -----------------------------------------------------------------------------
+//
+void CSymbianUnitTestRunner::ExecuteDllTestsL(const TDesC& aTestDllName, MSymbianUnitTestInterface::TFailureSimulation aFailureSimulation,
+        const CDesCArray& aTestCaseNames, TInt  aTimeout)
+    {
+    RLibrary library;
+    TInt ret;
+    ret = library.Load(aTestDllName);
+    if (ret != KErrNone)
+        {
+        iUiCallBack.InfoMsg(KFailedToFindDll, aTestDllName);
+        SUT_LOG_FORMAT(KFailedToFindDll, &aTestDllName);
+        User::Leave(ret);
+        }
+    CleanupClosePushL(library);
+    // The second UID of the dll to be used must be compatible
+    if (library.Type()[1] != KSymbianUnitTestDllUid)
+        {
+        iUiCallBack.InfoMsg(KNonCompatibleUIDs);
+        User::Leave(KErrNotFound);
+        }
+    TLibraryFunction entryFunction = library.Lookup(1);
+    if (!entryFunction)
+        {
+        iUiCallBack.InfoMsg(KExportFuncNotFound);
+        User::Leave(KErrNotFound);
+        }
+
+    MSymbianUnitTestInterface* test =
+            reinterpret_cast<MSymbianUnitTestInterface*> (entryFunction());
+    TCleanupItem cleanupItem(DeleteTest, test);
+    CleanupStack::PushL(cleanupItem);
+    iTestCount += test->TestCaseCount();
+    test->ExecuteL(*this, *iResult, aFailureSimulation, aTestCaseNames,
+            aTimeout);
+    CleanupStack::Pop(); // cleanupItem
+    CleanupStack::PopAndDestroy(&library);
+    }
+
+
+// -----------------------------------------------------------------------------
+//
+// -----------------------------------------------------------------------------
+//
+void CSymbianUnitTestRunner::ExecuteLddTestsL(const TDesC& aTestLddName, const CDesCArray& /*aTestCaseNames*/,
+        TInt  /*aTimeout*/)
+    {
+    CSymbianUnitTestLddCtl* lddCtl = CSymbianUnitTestLddCtl::NewLC( aTestLddName );
+    TInt ret = lddCtl->LoadDriver();
+    if (ret != KErrNone)
+        {
+        iUiCallBack.InfoMsg(KFailedToLoadLDD, aTestLddName);
+        SUT_LOG_FORMAT(KFailedToLoadLDD, &aTestLddName);
+        User::Leave(ret);
+        }
+    
+    ret = lddCtl->ExecuteLddTests(*this, *iResult);
+    if (ret != KErrNone)
+            {
+            iUiCallBack.InfoMsg(KFailedToRunLDD, aTestLddName);
+            SUT_LOG_FORMAT(KFailedToRunLDD, &aTestLddName);
+            User::Leave(ret);
+            }
+    lddCtl->FreeDriver();
+    CleanupStack::PopAndDestroy( lddCtl );
+    }