appinstall_plat/sifui_api/tsrc/src/sifuitestcases.cpp
branchRCL_3
changeset 25 7333d7932ef7
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/appinstall_plat/sifui_api/tsrc/src/sifuitestcases.cpp	Tue Aug 31 15:21:33 2010 +0300
@@ -0,0 +1,641 @@
+/*
+* Copyright (c) 2010 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: This file contains hardcoded module implementation.
+*
+*/
+
+#include <badesca.h>                    // CDesCArray, StifUnitMacros.h needs this
+#include <StifUnitMacros.h>             // STIF_ASSERT_NULL, STIF_ASSERT_NOT_NULL
+#include <sifui.h>                      // CSifUi
+#include <sifuiappinfo.h>               // CSifUiAppInfo
+#include <sifuicertificateinfo.h>       // CSifUiCertificateInfo
+#include <s32file.h>                    // RFileReadStream
+#include <s32mem.h>                     // RDesReadStream
+#include <apgcli.h>                     // RApaLsSession
+#include <swi/msisuihandlers.h>         // Swi::CCertificateInfo
+#include "sifuitest.h"                  // CSifUiTest
+#include "sifuitestcleanuputils.h"      // CleanupResetAndDestroyPushL
+
+_LIT( KX509TestCertFile, "\\testing\\data\\test_x509_cert.cer" );
+
+_LIT( KEnter, "Enter" );
+_LIT( KStepFormat, "Step %d" );
+_LIT( KExit, "Exit" );
+
+const TInt KBufferGranularity = 1024;
+
+
+// Internal structure containing test case name and pointer to test function
+class TCaseInfoInternal
+    {
+    public:
+        const TText*    iCaseName;
+        TestFunction    iMethod;
+        TBool           iIsOOMTest;
+        TInt            iFirstMemoryAllocation;
+        TInt            iLastMemoryAllocation;
+    };
+
+
+// ======== MEMBER FUNCTIONS ========
+
+// -----------------------------------------------------------------------------
+// CSifUiTest::Case
+// 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.
+// -----------------------------------------------------------------------------
+//
+const TCaseInfo CSifUiTest::Case ( const TInt aCaseNumber ) const
+     {
+    /**
+    * When adding new test cases, implement new test case function and add new
+    * line to KCases array specifing the name of the case and the function.
+    *
+    * 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.
+    *
+    */
+
+    static TCaseInfoInternal const KCases[] =
+        {
+        ENTRY( "CreateLowMemTest", CSifUiTest::CreateLowMemTest ),
+        ENTRY( "MemorySelectionTest", CSifUiTest::MemorySelectionTest ),
+        ENTRY( "CertificateInfoTest", CSifUiTest::CertificateInfoTest ),
+        ENTRY( "AppInfoTest", CSifUiTest::AppInfoTest ),
+        ENTRY( "ProgressDialogsTest", CSifUiTest::ProgressDialogsTest )
+        };
+
+    if( (TUint) aCaseNumber >= sizeof( KCases ) / sizeof( TCaseInfoInternal ) )
+        {
+        TCaseInfo emptyObject( KNullDesC );
+        emptyObject.iMethod = NULL;
+        emptyObject.iIsOOMTest = EFalse;
+        emptyObject.iFirstMemoryAllocation = 0;
+        emptyObject.iLastMemoryAllocation = 0;
+        return emptyObject;
+        }
+
+    TPtrC caseName( static_cast<const TUint16*>( KCases[ aCaseNumber ].iCaseName ) );
+    TCaseInfo caseInfo( caseName );
+    caseInfo.iMethod = KCases[ aCaseNumber ].iMethod;
+    caseInfo.iIsOOMTest = KCases[ aCaseNumber ].iIsOOMTest;
+    caseInfo.iFirstMemoryAllocation = KCases[ aCaseNumber ].iFirstMemoryAllocation;
+    caseInfo.iLastMemoryAllocation = KCases[ aCaseNumber ].iLastMemoryAllocation;
+    return caseInfo;
+    }
+
+// -----------------------------------------------------------------------------
+// CSifUiTest::ReadCertificateL()
+// -----------------------------------------------------------------------------
+//
+CX509Certificate* CSifUiTest::ReadCertificateL( const TDesC& aFileName )
+    {
+    TFindFile findFile( iFs );
+    User::LeaveIfError( findFile.FindByDir( aFileName, KNullDesC ) );
+
+    RFile file;
+    User::LeaveIfError( file.Open( iFs, findFile.File(), EFileRead ) );
+    CleanupClosePushL( file );
+
+    TInt fileSize = 0;
+    User::LeaveIfError( file.Size( fileSize ) );
+
+    HBufC8* buffer = HBufC8::NewLC( fileSize );
+    TPtr8 ptr( buffer->Des() );
+    User::LeaveIfError( file.Read( ptr ) );
+
+    CX509Certificate* x509cert = CX509Certificate::NewL( *buffer );
+
+    CleanupStack::PopAndDestroy( buffer );
+    CleanupStack::PopAndDestroy( &file );
+    return x509cert;
+    }
+
+// -----------------------------------------------------------------------------
+// CSifUiTest::CreateTest()
+// -----------------------------------------------------------------------------
+//
+TInt CSifUiTest::CreateLowMemTest( TTestResult& aResult )
+    {
+    _LIT( KTestName, "CreateLowMemTest" );
+    TestModuleIf().Printf( 0, KTestName, KEnter );
+
+    TInt count = 0;
+    TInt error = KErrNoMemory;
+    CSifUi* sifUi = NULL;
+    while( error == KErrNoMemory )
+        {
+        User::__DbgSetAllocFail( EFalse, RHeap::EDeterministic, ++count );
+        TRAP( error, sifUi = CSifUi::NewL() );
+        User::__DbgSetAllocFail( EFalse, RHeap::ENone, count );
+        if( !error )
+            {
+            delete sifUi;
+            sifUi = NULL;
+            }
+        }
+    TestModuleIf().Printf( 1, KTestName, _L("count %d, last error %d"), count, error );
+    SetResult( aResult, error );
+
+    TestModuleIf().Printf( 0, KTestName, KExit );
+    return KErrNone;
+    }
+
+// -----------------------------------------------------------------------------
+// CSifUiTest::MemorySelectionTest()
+// -----------------------------------------------------------------------------
+//
+TInt CSifUiTest::MemorySelectionTest( TTestResult& aResult )
+    {
+    TRAPD( result, DoMemorySelectionTestL( aResult ) );
+    SetResult( aResult, result );
+    return KErrNone;
+    }
+
+// -----------------------------------------------------------------------------
+// CSifUiTest::DoMemorySelectionTestL()
+// -----------------------------------------------------------------------------
+//
+void CSifUiTest::DoMemorySelectionTestL( TTestResult& aResult )
+    {
+    _LIT( KTestName, "MemorySelectionTest" );
+    TestModuleIf().Printf( 0, KTestName, KEnter );
+
+    enum TTestSteps
+        {
+        EFirstStep,
+        EGetSelectedWhenNotSet,
+        ESetNoDrivesStep,
+        ESetThreeDriveStep,
+        ESetOneDriveStep,
+        EGetSelectedWhenSetButNotAskedStep,
+        ELastStep,
+        EAllDone
+        };
+
+    CSifUi* sifUi = NULL;
+    RArray<TInt> driveNumbers;
+    CleanupClosePushL( driveNumbers );
+    TInt drive = 0;
+    TInt errorCode = KErrNone;
+
+    TInt error = KErrNone;
+    for( TInt step = EFirstStep; step < EAllDone && !error; ++step )
+        {
+        TestModuleIf().Printf( 1, KTestName, KStepFormat, step );
+        switch( step )
+            {
+            case EFirstStep:
+                STIF_ASSERT_NULL( sifUi );
+                TRAP( error, sifUi = CSifUi::NewL() );
+                if( !error )
+                    {
+                    CleanupStack::PushL( sifUi );
+                    }
+                break;
+
+            case EGetSelectedWhenNotSet:
+                STIF_ASSERT_NOT_NULL( sifUi );
+                TRAP( error, errorCode = sifUi->SelectedDrive( drive ) );
+                if( error == KErrNone && errorCode == KErrNotFound )
+                    {
+                    error = KErrNone;
+                    }
+                else
+                    {
+                    error = KErrGeneral;
+                    }
+                break;
+
+            case ESetNoDrivesStep:
+                STIF_ASSERT_NOT_NULL( sifUi );
+                TRAP( error, sifUi->SetMemorySelectionL( driveNumbers ) );
+                break;
+
+            case ESetThreeDriveStep:
+                STIF_ASSERT_NOT_NULL( sifUi );
+                driveNumbers.Append( EDriveC );
+                driveNumbers.Append( EDriveE );
+                driveNumbers.Append( EDriveF );
+                TRAP( error, sifUi->SetMemorySelectionL( driveNumbers ) );
+                break;
+
+            case ESetOneDriveStep:
+                STIF_ASSERT_NOT_NULL( sifUi );
+                driveNumbers.Append( EDriveC );
+                TRAP( error, sifUi->SetMemorySelectionL( driveNumbers ) );
+                break;
+
+            case EGetSelectedWhenSetButNotAskedStep:
+                STIF_ASSERT_NOT_NULL( sifUi );
+                TRAP( error, errorCode = sifUi->SelectedDrive( drive ) );
+                if( error == KErrNone && errorCode == KErrNotFound )
+                    {
+                    error = KErrNone;
+                    }
+                else
+                    {
+                    error = KErrGeneral;
+                    }
+                break;
+
+            case ELastStep:
+                STIF_ASSERT_NOT_NULL( sifUi );
+                CleanupStack::PopAndDestroy( sifUi );
+                sifUi = NULL;
+                break;
+
+            default:
+                User::Leave( KErrGeneral );
+                break;
+            }
+        }
+    User::LeaveIfError( error );
+
+    CleanupStack::PopAndDestroy( &driveNumbers );
+    TestModuleIf().Printf( 0, KTestName, KExit );
+    }
+
+// -----------------------------------------------------------------------------
+// CSifUiTest::CertificateInfoTest()
+// -----------------------------------------------------------------------------
+//
+TInt CSifUiTest::CertificateInfoTest( TTestResult& aResult )
+    {
+    TRAPD( result, DoCertificateInfoTestL( aResult ) );
+    SetResult( aResult, result );
+    return KErrNone;
+    }
+
+// -----------------------------------------------------------------------------
+// CSifUiTest::DoCertificateInfoTestL()
+// -----------------------------------------------------------------------------
+//
+void CSifUiTest::DoCertificateInfoTestL( TTestResult& aResult )
+    {
+    _LIT( KTestName, "CertificateInfoTest" );
+    TestModuleIf().Printf( 0, KTestName, KEnter );
+
+    enum TTestSteps
+        {
+        EFirstStep,
+        ESetNoCertificates,
+        EReadAndSetCertificate,
+        ELastStep,
+        EAllDone
+        };
+
+    CSifUi* sifUi = NULL;
+    RPointerArray<CSifUiCertificateInfo> certificates;
+    CleanupResetAndDestroyPushL( certificates );
+
+    TInt error = KErrNone;
+    for( TInt step = EFirstStep; step < EAllDone && !error; ++step )
+        {
+        TestModuleIf().Printf( 1, KTestName, KStepFormat, step );
+        switch( step )
+            {
+            case EFirstStep:
+                STIF_ASSERT_NULL( sifUi );
+                TRAP( error, sifUi = CSifUi::NewL() );
+                if( !error )
+                    {
+                    CleanupStack::PushL( sifUi );
+                    }
+                break;
+
+            case ESetNoCertificates:
+                STIF_ASSERT_NOT_NULL( sifUi );
+                TRAP( error, sifUi->SetCertificateInfoL( certificates ) );
+                break;
+
+            case EReadAndSetCertificate:
+                {
+                STIF_ASSERT_NOT_NULL( sifUi );
+                CX509Certificate* x509cert = ReadCertificateL( KX509TestCertFile );
+                CleanupStack::PushL( x509cert );
+
+                Swi::CCertificateInfo* swiCert = Swi::CCertificateInfo::NewLC( *x509cert );
+                CSifUiCertificateInfo* testCert = CSifUiCertificateInfo::NewLC( *swiCert );
+
+                CBufBase* buf = CBufFlat::NewL( KBufferGranularity );
+                CleanupStack::PushL( buf );
+                RBufWriteStream writeStream( *buf );
+                CleanupClosePushL( writeStream );
+                STIF_ASSERT_TRUE( buf->Size() == 0 );
+                testCert->ExternalizeL( writeStream );
+                STIF_ASSERT_TRUE( buf->Size() > 0 );
+                CleanupStack::PopAndDestroy( 2, buf );      // writeStream, buf
+
+                CleanupStack::PopAndDestroy( testCert );
+                testCert = NULL;
+
+                testCert = CSifUiCertificateInfo::NewL( *swiCert );
+                CleanupStack::PushL( testCert );
+                certificates.AppendL( testCert );
+                CleanupStack::Pop( testCert );
+                TRAP( error, sifUi->SetCertificateInfoL( certificates ) );
+
+                CleanupStack::PopAndDestroy( 2, x509cert );     // swiCert, x509cert
+                }
+                break;
+
+            case ELastStep:
+                STIF_ASSERT_NOT_NULL( sifUi );
+                CleanupStack::PopAndDestroy( sifUi );
+                sifUi = NULL;
+                break;
+
+            default:
+                User::Leave( KErrGeneral );
+                break;
+            }
+        }
+    User::LeaveIfError( error );
+
+    CleanupStack::PopAndDestroy( &certificates );
+    TestModuleIf().Printf( 0, KTestName, KExit );
+    }
+
+// -----------------------------------------------------------------------------
+// CSifUiTest::AppInfoTest()
+// -----------------------------------------------------------------------------
+//
+TInt CSifUiTest::AppInfoTest( TTestResult& aResult )
+    {
+    TRAPD( result, DoAppInfoTestL( aResult ) );
+    SetResult( aResult, result );
+    return KErrNone;
+    }
+
+// -----------------------------------------------------------------------------
+// CSifUiTest::DoAppInfoTestL()
+// -----------------------------------------------------------------------------
+//
+void CSifUiTest::DoAppInfoTestL( TTestResult& aResult )
+    {
+    _LIT( KTestName, "AppInfoTest" );
+    TestModuleIf().Printf( 0, KTestName, KEnter );
+
+    enum TTestSteps
+        {
+        EFirstStep,
+        EAppInfoTests,
+        EAppInfoIconTest,
+        EShowConfirmation,
+        EShowError,
+        ELastStep,
+        EAllDone
+        };
+
+    CSifUi* sifUi = NULL;
+
+    _LIT( KAppName, "TestApplication" );
+    _LIT( KAppVendor, "TestSupplier" );
+    const TVersion KAppVersion( 1, 2, 3 );
+    const TInt KAppSize = 0x1234;
+
+    TInt error = KErrNone;
+    for( TInt step = EFirstStep; step < EAllDone && !error; ++step )
+        {
+        TestModuleIf().Printf( 1, KTestName, KStepFormat, step );
+        switch( step )
+            {
+            case EFirstStep:
+                STIF_ASSERT_NULL( sifUi );
+                TRAP( error, sifUi = CSifUi::NewL() );
+                if( !error )
+                    {
+                    CleanupStack::PushL( sifUi );
+                    }
+                break;
+
+            case EAppInfoTests:
+                {
+                STIF_ASSERT_NOT_NULL( sifUi );
+                CSifUiAppInfo* appInfo = NULL;
+                appInfo = CSifUiAppInfo::NewLC( KAppName, KAppVendor, KAppVersion, KAppSize, NULL );
+
+                STIF_ASSERT_TRUE( appInfo->Name().Compare( KAppName ) == 0 );
+                STIF_ASSERT_TRUE( appInfo->Vendor().Compare( KAppVendor ) == 0 );
+
+                STIF_ASSERT_TRUE( appInfo->Version().iMajor == KAppVersion.iMajor );
+                STIF_ASSERT_TRUE( appInfo->Version().iMinor == KAppVersion.iMinor );
+                STIF_ASSERT_TRUE( appInfo->Version().iBuild == KAppVersion.iBuild );
+
+                STIF_ASSERT_TRUE( appInfo->Size() == KAppSize );
+                STIF_ASSERT_TRUE( appInfo->Bitmaps() == NULL );
+
+                CBufBase* buf = CBufFlat::NewL( KBufferGranularity );
+                CleanupStack::PushL( buf );
+                RBufWriteStream writeStream( *buf );
+                CleanupClosePushL( writeStream );
+                STIF_ASSERT_TRUE( buf->Size() == 0 );
+                appInfo->ExternalizeL( writeStream );
+                STIF_ASSERT_TRUE( buf->Size() > 0 );
+                CleanupStack::PopAndDestroy( &writeStream );
+                CleanupStack::PopAndDestroy( buf );
+
+                CleanupStack::PopAndDestroy( appInfo );
+                }
+                break;
+
+            case EAppInfoIconTest:
+                {
+                STIF_ASSERT_NOT_NULL( sifUi );
+                CSifUiAppInfo* appInfo = NULL;
+
+                // TODO: proper icon test needed
+                CApaMaskedBitmap* appBitmap = NULL;
+                appInfo = CSifUiAppInfo::NewLC( KAppName, KAppVendor, KAppVersion, KAppSize, appBitmap );
+
+                CBufBase* buf = CBufFlat::NewL( KBufferGranularity );
+                CleanupStack::PushL( buf );
+                RBufWriteStream writeStream( *buf );
+                CleanupClosePushL( writeStream );
+                STIF_ASSERT_TRUE( buf->Size() == 0 );
+                appInfo->ExternalizeL( writeStream );
+                STIF_ASSERT_TRUE( buf->Size() > 0 );
+                CleanupStack::PopAndDestroy( &writeStream );
+                CleanupStack::PopAndDestroy( buf );
+
+                CleanupStack::PopAndDestroy( appInfo );
+                }
+                break;
+
+            case EShowConfirmation:
+                {
+                STIF_ASSERT_NOT_NULL( sifUi );
+                CSifUiAppInfo* appInfo = NULL;
+                appInfo = CSifUiAppInfo::NewL( KAppName, KAppVendor, KAppVersion, KAppSize, NULL );
+                CleanupStack::PushL( appInfo );
+
+                CBufBase* buf = CBufFlat::NewL( KBufferGranularity );
+                CleanupStack::PushL( buf );
+                RBufWriteStream writeStream( *buf );
+                CleanupClosePushL( writeStream );
+                STIF_ASSERT_TRUE( buf->Size() == 0 );
+                appInfo->ExternalizeL( writeStream );
+                STIF_ASSERT_TRUE( buf->Size() > 0 );
+                CleanupStack::PopAndDestroy( &writeStream );
+                CleanupStack::PopAndDestroy( buf );
+
+                TBool result = EFalse;
+                // TODO: how to close opened dialog automatically?
+                TRAP( error, result = sifUi->ShowConfirmationL( *appInfo ) );
+                if( result )
+                    {
+                    _LIT( KAccepted, "Accepted" );
+                    TestModuleIf().Printf( 1, KTestName, KAccepted );
+                    }
+                else
+                    {
+                    _LIT( KCancelled, "Cancelled" );
+                    TestModuleIf().Printf( 1, KTestName, KCancelled );
+                    }
+                CleanupStack::PopAndDestroy( appInfo );
+                }
+                break;
+
+            case EShowError:
+                {
+                STIF_ASSERT_NOT_NULL( sifUi );
+                _LIT( KErrorMessage, "Test error" );
+                _LIT( KErrorDetails, "Test error details" );
+                // TODO: how to close opened dialog automatically?
+                TRAP( error, sifUi->ShowFailedL( KErrNotFound, KErrorMessage, KErrorDetails ) );
+                }
+                break;
+
+            case ELastStep:
+                STIF_ASSERT_NOT_NULL( sifUi );
+                CleanupStack::PopAndDestroy( sifUi );
+                sifUi = NULL;
+                break;
+
+            default:
+                User::Leave( KErrGeneral );
+                break;
+            }
+        }
+    User::LeaveIfError( error );
+
+    TestModuleIf().Printf( 0, KTestName, KExit );
+    }
+
+// -----------------------------------------------------------------------------
+// CSifUiTest::ProgressDialogsTest()
+// -----------------------------------------------------------------------------
+//
+TInt CSifUiTest::ProgressDialogsTest( TTestResult& aResult )
+    {
+    TRAPD( result, DoProgressDialogsTestL( aResult ) );
+    SetResult( aResult, result );
+    return KErrNone;
+    }
+
+// -----------------------------------------------------------------------------
+// CSifUiTest::DoProgressDialogsTestL()
+// -----------------------------------------------------------------------------
+//
+void CSifUiTest::DoProgressDialogsTestL( TTestResult& aResult )
+    {
+    _LIT( KTestName, "ProgressDlgsTest" );
+    TestModuleIf().Printf( 0, KTestName, KEnter );
+
+    enum TTestSteps
+        {
+        EFirstStep,
+        EShowProgress,
+        EUpdateProgress,
+        EShowComplete,
+        ELastStep,
+        EAllDone
+        };
+
+    CSifUi* sifUi = NULL;
+
+    _LIT( KAppName, "NoitaCilppa" );
+    _LIT( KAppVendor, "Rodnev" );
+    const TVersion KAppVersion( 3, 2, 1 );
+    const TInt KAppSize = 0x4321;
+
+    const TInt KMaxProgress = 150;
+    const TInt KUpdateStarts = -10;
+    const TInt KUpdateEnds = KMaxProgress + 10;
+    const TInt KUpdateStep = 4;
+
+    TInt error = KErrNone;
+    for( TInt step = EFirstStep; step < EAllDone && !error; ++step )
+        {
+        TestModuleIf().Printf( 1, KTestName, KStepFormat, step );
+        switch( step )
+            {
+            case EFirstStep:
+                STIF_ASSERT_NULL( sifUi );
+                TRAP( error, sifUi = CSifUi::NewL() );
+                if( !error )
+                    {
+                    CleanupStack::PushL( sifUi );
+                    }
+                break;
+
+            case EShowProgress:
+                {
+                STIF_ASSERT_NOT_NULL( sifUi );
+                CSifUiAppInfo* appInfo = NULL;
+                appInfo = CSifUiAppInfo::NewL( KAppName, KAppVendor, KAppVersion, KAppSize, NULL );
+                CleanupStack::PushL( appInfo );
+                TRAP( error, sifUi->ShowProgressL( *appInfo, KMaxProgress ) );
+                CleanupStack::PopAndDestroy( appInfo );
+                }
+                break;
+
+            case EUpdateProgress:
+                {
+                STIF_ASSERT_NOT_NULL( sifUi );
+                for( TInt i = KUpdateStarts; i < KUpdateEnds; i += KUpdateStep )
+                    {
+                    TRAP( error, sifUi->IncreaseProgressBarValueL( KUpdateStep ) );
+                    }
+                }
+                break;
+
+            case EShowComplete:
+                STIF_ASSERT_NOT_NULL( sifUi );
+                TRAP( error, sifUi->ShowCompleteL() );
+                break;
+
+            case ELastStep:
+                STIF_ASSERT_NOT_NULL( sifUi );
+                CleanupStack::PopAndDestroy( sifUi );
+                sifUi = NULL;
+                break;
+
+            default:
+                User::Leave( KErrGeneral );
+                break;
+            }
+        }
+    User::LeaveIfError( error );
+
+    TestModuleIf().Printf( 0, KTestName, KExit );
+    }
+