diff -r 5cc91383ab1e -r 7333d7932ef7 appinstall_plat/sifui_api/tsrc/src/sifuitestcases.cpp --- /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 // CDesCArray, StifUnitMacros.h needs this +#include // STIF_ASSERT_NULL, STIF_ASSERT_NOT_NULL +#include // CSifUi +#include // CSifUiAppInfo +#include // CSifUiCertificateInfo +#include // RFileReadStream +#include // RDesReadStream +#include // RApaLsSession +#include // 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( 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 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 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 ); + } +