email/pop3andsmtpmtm/imapservermtm/test/src/t_test_decode_step.cpp
changeset 25 84d9eb65b26f
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/email/pop3andsmtpmtm/imapservermtm/test/src/t_test_decode_step.cpp	Mon May 03 12:29:07 2010 +0300
@@ -0,0 +1,354 @@
+// Copyright (c) 2005-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 <testexecutelog.h>
+#include "t_test_decode_step.h"
+#include "MIUTMSG.H"
+#include <utf.h>
+
+RTest test(_L("Decode Test"));
+const TInt KImapPort = 143;
+
+ 
+CTestDecode::~CTestDecode()
+	{
+	delete iConsole;
+	delete iSpoofServer;	
+	delete iTestUtils;
+	delete iImapClient;	
+	delete iScheduler;
+	iSession->CloseMessageServer( );
+	delete iSession;
+	delete iSessionObserver;
+	
+	delete iExpectedPartsBuffer;
+	delete iActualPartsBuffer;
+	
+	iFs.Close( );
+	}
+
+CTestDecode::CTestDecode()
+	{
+	// Call base class method to set up the human readable name for logging
+	SetTestStepName( KTestDecode );
+	
+	iFs.Connect( );
+	}
+
+void CTestDecode::TestComplete( TInt aErrorCode )
+	{
+	CActiveScheduler::Stop();	
+	
+	if( aErrorCode != KErrNone && aErrorCode != KErrEof )
+		{
+		ERR_PRINTF2( _L( "Error: %d" ), aErrorCode );	
+		}
+	}
+	
+TBufferType CTestDecode::ConvertToBufferType(const TDesC& aBufferTypeDesc)
+	{
+	if ( aBufferTypeDesc.CompareF( _L( "TBufferType::EBodyBuffer" ) ) == KErrNone )
+		{
+		return ( TBufferType ) EBodyBuffer;
+		}
+	else if ( aBufferTypeDesc.CompareF( _L( "TBufferType::EAttachmentBuffer" ) ) == KErrNone )
+		{
+		return ( TBufferType ) EAttachmentBuffer;
+		}
+	return ( TBufferType ) EUndefinedBuffer;
+	}
+
+void CTestDecode::GetDetailsFromIniFileL()
+	{
+	
+	//get the script file path
+	if( !GetStringFromConfig( ConfigSection( ) , 
+							  _L( "ScriptFile" ),
+							  iScriptFile ) )
+		{
+		ERR_PRINTF1( _L( "Error reading script file path from ini file" ) );
+		User::Leave( KErrArgument );	
+		
+		}
+	
+	TPtrC parameter;
+
+	if( GetStringFromConfig( ConfigSection( ),
+							 _L( "BufferFile" ),
+							 parameter ) )
+		{
+		TLex parser( parameter );
+		parser.SkipSpace( );
+		
+		while ( !parser.Eos( ) )
+			{
+			TBuffer* buffer = new ( ELeave ) TBuffer();
+			CleanupStack::PushL( buffer );
+		
+			TPtrC arg;
+
+			parser.SkipSpace( );
+			
+			if (parser.Eos())
+				{
+				ERR_PRINTF1( _L( "Invalid Argument for BufferFile" ) );
+				User::Leave( KErrArgument );	
+				}
+			
+			arg.Set( parser.NextToken( ) );
+		
+			buffer->iBufferType = ConvertToBufferType( arg );
+
+			arg.Set( parser.NextToken( ) );
+
+			parser.SkipSpace( );
+		
+			User::LeaveIfError( parser.Val( buffer->iAllowJunkAtEnd ) );
+
+			RFile file;
+			file.Open( iFs, arg, EFileRead );
+			CleanupClosePushL( file );
+		
+			file.Read( buffer->iBuffer );
+			iExpectedPartsBuffer->AppendL( *buffer );
+		
+			CleanupStack::PopAndDestroy( 1 );	//file
+			CleanupStack::Pop( buffer );
+			
+			parser.SkipSpace( );
+			
+			}
+		}
+	else
+		{
+		ERR_PRINTF1( _L( "Error reading buffer file path from ini file" ) );
+		User::Leave( KErrArgument );
+		
+		}
+	
+	//get the script file path
+	if( !GetBoolFromConfig( ConfigSection( ),
+							_L( "FetchWholeMessage" ),
+							iFetchWholeMessage ) )
+		{
+		ERR_PRINTF1( _L( "Error reading \"FetchWholeMessage\"-argument from ini file" ) );
+		User::Leave( KErrArgument );
+		
+		}
+	}
+
+void CTestDecode::TraverseL( const TMsvId aTMsvId )
+	{
+	//open the entry, dont sort
+	TMsvSelectionOrdering ordering;	
+	ordering.SetSorting( EMsvSortByNone );
+	CMsvEntry* entry = CMsvEntry::NewL( *iSession, aTMsvId,ordering );
+	CleanupStack::PushL( entry );
+	
+	//retrieve the entries children
+	CMsvEntrySelection* msvEntrySelection;
+	msvEntrySelection=entry->ChildrenL( );
+	CleanupStack::PushL( msvEntrySelection );
+	TInt count = entry->Count( );
+	
+	CMsvEntry* child;
+	TMsvEntry childDetails;
+
+	//for each child test if its a message entry
+	for( TInt i = 0; i < count; i++ )
+		{
+		child=iSession->GetEntryL( ( *msvEntrySelection ) [ i ] );
+		CleanupStack::PushL( child );
+		childDetails=child->Entry( );
+		
+		if( childDetails.iType == KUidMsvMessageEntry )
+			{
+			//First Check the body
+			CParaFormatLayer* paraFormatLayer = CParaFormatLayer::NewL( );
+			CleanupStack::PushL( paraFormatLayer );
+			CCharFormatLayer* charFormatLayer = CCharFormatLayer::NewL( );
+			CleanupStack::PushL( charFormatLayer );
+			CRichText* richText = CRichText::NewL( paraFormatLayer, charFormatLayer );
+			CleanupStack::PushL( richText );
+
+			CImEmailMessage* emailMessage = CImEmailMessage::NewLC( *child );
+			
+			emailMessage->GetBodyTextL( child->EntryId( ), 
+										CImEmailMessage::EThisMessageOnly,
+										*richText, 
+										*paraFormatLayer, 
+										*charFormatLayer );
+										
+			emailMessage->GetAttachmentsListL( child->EntryId( ),
+											   CImEmailMessage::EAllAttachments,
+											   CImEmailMessage::EThisMessageOnly );
+
+			TDes* buffer16;
+			buffer16 = new( ELeave ) TBuf<5000>( );
+			CleanupStack::PushL( buffer16 );
+			richText->Extract( *buffer16, 0 );
+			TBuf8<KMaxBufferSize> buffer8;
+			TInt unconverted =  CnvUtfConverter::ConvertFromUnicodeToUtf8( buffer8, 
+																	   	   *buffer16 );
+			iActualPartsBuffer->AppendL( buffer8 );
+			CleanupStack::PopAndDestroy( buffer16 );
+
+			MMsvAttachmentManager& attachmentMgr = emailMessage->AttachmentManager();
+			RPointerArray<CMsvAttachment> attachmentInfoArray;
+			attachmentInfoArray.Reset();
+			CMsvAttachment* attachmentInfo;
+			
+			for (TInt i= 0; i< attachmentMgr.AttachmentCount();i++)
+				{
+				attachmentInfo = attachmentMgr.GetAttachmentInfoL(i);
+				attachmentInfoArray.Append(attachmentInfo);
+				
+				TDes8* buffer;									
+				buffer = new( ELeave ) TBuf8<5000>( );
+				CleanupStack::PushL( buffer );
+			
+				RFile file;
+				file.Open( iFs, attachmentInfo->FilePath( ), EFileRead );
+				CleanupClosePushL( file );
+		
+				file.Read( *buffer );
+				
+				iActualPartsBuffer->AppendL( *buffer );
+		
+				CleanupStack::PopAndDestroy( 2, buffer );	//file, buffer
+			
+			}
+			
+			//if this is the first timestamp the us iActualTimeStamp, else use iActualTimeStamp2
+			CleanupStack::PopAndDestroy( 4, paraFormatLayer );	
+
+			}
+
+		//recursive call
+		TraverseL( childDetails.Id( ) );
+		
+		CleanupStack::PopAndDestroy( child );
+		}
+			
+	CleanupStack::PopAndDestroy( msvEntrySelection );
+	CleanupStack::PopAndDestroy( entry );	
+	}
+
+
+TVerdict CTestDecode::doTestStepPreambleL( )
+	{
+	SetTestStepResult( EFail );
+	
+	iScheduler = new ( ELeave ) CActiveScheduler;
+	CActiveScheduler::Install( iScheduler );
+	
+	iTestUtils = CEmailTestUtils::NewL( test );
+	iTestUtils->FileSession( ).SetSessionPath( _L( "C:\\" ) );
+	iTestUtils->CleanMessageFolderL( );
+	iTestUtils->ClearEmailAccountsL( );
+	
+	iTestUtils->GoClientSideL( );
+	
+	//initialize the buffers
+	iExpectedPartsBuffer = new( ELeave) CArrayFixSeg< TBuffer >( 1 );	// granularity of 1, very often there 
+	iActualPartsBuffer = new( ELeave) CDesC8ArraySeg( 1 );				// will beonly 1 message part
+
+	//start the imap server
+	GetDetailsFromIniFileL( );
+	iConsole=Console::NewL( _L( "Decode Test" ),TSize( KConsFullScreen, KConsFullScreen ) );
+	iSpoofServer = CSpoofServer::NewL(*this,iScriptFile);
+	iSpoofServer->StartL(KImapPort);
+	//start the imap client
+	iImapClient = CActiveImapClient::NewL(this,iFetchWholeMessage);
+	iImapClient->StartL();
+	
+	CActiveScheduler::Start();
+	SetTestStepResult( EPass );
+	return TestStepResult();
+	}
+
+TVerdict CTestDecode::CheckBuffer( const TDesC8& aActualBuffer, 
+								   const TDesC8& aExpectedBuffer, 
+								   TBool aAllowJunkAtEnd )
+	{
+	TVerdict result = EFail;
+	
+	TInt compareResult = aExpectedBuffer.Compare( aActualBuffer );
+	if ( compareResult == 0)
+		{
+		INFO_PRINTF1( _L( "Decoded buffer does match reference file" ) );
+		result = EPass;
+		}
+	else if ( compareResult == aExpectedBuffer.Length( )-aActualBuffer.Length( ) &&
+			  aAllowJunkAtEnd )
+		{
+		WARN_PRINTF1( _L( "Decoded buffer math reference file, but contains extra \"junk\" at the end" ) );
+		result = EPass;
+		}
+	else
+		{
+		INFO_PRINTF1( _L( "Decoded buffer does not match reference file" ) );
+		}
+	
+	return result;
+	
+	}
+		
+TVerdict CTestDecode::doTestStepL( )
+	{
+
+	TVerdict result = EPass;
+
+	// Session observer. Needed to create a session
+	iSessionObserver = new (ELeave) TDummySessionObserver;
+	// Session. Needed to create a client registry.
+	iSession=CMsvSession::OpenSyncL(*iSessionObserver);
+	// Client registry. Needed to get the MTM component
+	TraverseL(iImapClient->GetAccount().iImapService);	
+
+	// Check every message-part (we expect them to be in the same order 
+	// as defined in the .ini configuration file)
+	TInt partsCount = iExpectedPartsBuffer->Count( );
+	if ( partsCount != iActualPartsBuffer->Count( ) )
+		{
+		ERR_PRINTF1( _L( "Number of expected parts does not mach actual number of parts" ) );
+		User::Leave( KErrGeneral );
+		}
+
+	// Stop as soon as a test fail, we don't care about the rest.
+	for ( TInt i=0; ( ( i < partsCount ) && ( result != EFail ) ); i++ )
+		{
+		TBuffer expectedPart = iExpectedPartsBuffer->At( i );
+		result = CheckBuffer( iActualPartsBuffer->MdcaPoint( i ), 
+							  expectedPart.iBuffer,
+							  expectedPart.iAllowJunkAtEnd );
+		
+		}
+	
+	SetTestStepResult( result );
+	return TestStepResult( );
+	
+	}
+	
+
+TVerdict CTestDecode::doTestStepPostambleL()
+	{
+	return TestStepResult( );
+	
+	}
+	
+	
+
+