--- /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 );
+ }
+