emailservices/emailstore/tsrc/message_store_test/src/EncryptionTests.cpp
changeset 1 12c456ceeff2
child 8 e1b6206813b4
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/emailservices/emailstore/tsrc/message_store_test/src/EncryptionTests.cpp	Thu Jan 07 12:38:38 2010 +0200
@@ -0,0 +1,421 @@
+/*
+* Copyright (c) 2002 - 2007 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:  Base class for all test cases class member functions
+*
+*/
+
+
+//#include <BAUTILS.H>
+#include "EncryptionTests.h"
+//#include <ismsgstorepropertykeys.h>
+//#include "messagestoreclientserver.h"
+
+// This must match that's defined in ContainerStoreDefs.h
+enum TEncryptionState
+{
+    EMsgStoreESIdle,
+    EMsgStoreESEncrypting,
+    EMsgStoreESDecrypting
+}; // end TEncryptionState
+
+// ============================ MEMBER FUNCTIONS ===============================
+
+CEncryptionTests* CEncryptionTests::NewL( CStifLogger* aLog )
+    {
+    CEncryptionTests* self = new(ELeave) CEncryptionTests( aLog );
+    CleanupStack::PushL( self );
+    self->ConstructL();
+    CleanupStack::Pop( self );
+    return self;
+    }
+
+// -----------------------------------------------------------------------------
+// Constructor
+// -----------------------------------------------------------------------------
+CEncryptionTests::CEncryptionTests( CStifLogger* aLog ) : CAsyncTestCaseBase( aLog ) 
+    {
+    }
+
+// -----------------------------------------------------------------------------
+// Destructor
+// -----------------------------------------------------------------------------
+CEncryptionTests::~CEncryptionTests()
+    {
+    iTestContentArray.Reset();
+    }
+
+// -----------------------------------------------------------------------------
+// 2nd phase constructor
+// -----------------------------------------------------------------------------
+void CEncryptionTests::ConstructL()
+    {
+    CAsyncTestCaseBase::ConstructL();
+    iTestContentArray.AppendL( _L8("This is the first test content!") );
+    iTestContentArray.AppendL( _L8("This is the second test content!") );
+    iTestContentArray.AppendL( _L8("This is the first test content!") );
+    iTestContentArray.AppendL( _L8("What-ever!!!!") );
+    iTestContentArray.AppendL( _L8("ok fine!!!") );
+    iTestContentArray.AppendL( _L8("Here is a long content (>300 bytes).   Here is a long content.  Here is a long content.  Here is a long content.  Here is a long content.  Here is a long content.  Here is a long content.  Here is a long content.  Here is a long content.  Here is a long content.  Here is a long content.  Here is a long content.") );
+    iTestContentArray.AppendL( _L8("Is that long enough") );
+    iTestContentArray.AppendL( _L8("aaaaaaaaaabbbbbbbbbbccccccccccddddddddddeeeeeeeeeeffffffffff") );
+    iTestContentArray.AppendL( _L8("Here is a >300 unicode characters (> 600 bytes).   Here is a long content.  Here is a long content.  Here is a long content.  Here is a long content.  Here is a long content.  Here is a long content.  Here is a long content.  Here is a long content.  Here is a long content.  Here is a long content.  Here is a long content.") );
+    iTestContentArray.AppendL( _L8("Hi") );
+    iTestContentArray.AppendL( _L8("") );
+    iTestContentArray.AppendL( _L8("This is another test content") );
+    iTestContentArray.AppendL( _L8("How many more?") );
+    iTestContentArray.AppendL( _L8("Six more contents to go") );
+    iTestContentArray.AppendL( _L8("Five more contents to go") );
+    iTestContentArray.AppendL( _L8("     ") );
+    iTestContentArray.AppendL( _L8("Three more...") );
+    iTestContentArray.AppendL( _L8("Two more...") );
+    iTestContentArray.AppendL( _L8("One more...") );
+    iTestContentArray.AppendL( _L8("Last one! We are done") );
+    }
+
+// -----------------------------------------------------------------------------
+// ExecuteL : start executing the test case
+// -----------------------------------------------------------------------------
+TBool CEncryptionTests::ExecuteL()
+    {
+    LogHeader( _L("Encryption") );
+    
+    iLog->Log( _L("Case %d: Testing SetPasswordL()"), iCaseId++ );
+    iMsgStore->SetPasswordL( _L("mypassword") );
+    
+    iLog->Log( _L("Case %d: Testing AuthenticatedL()"), iCaseId++ );
+    CheckCondition( _L("AuthenticatedL() is TRUE"), iMsgStore->AuthenticatedL() );
+    
+    iLog->Log( _L("Case %d: Testing HasPasswordL()"), iCaseId++ );
+    CheckCondition( _L("HasPasswordL() is TRUE"), iMsgStore->HasPasswordL() );
+    
+    iLog->Log( _L("Case %d: Create Mailboxes"), iCaseId++ );
+    RPointerArray<CMsgStoreAccount> accountArray;
+    CMsgStoreAccount* account1 = CMsgStoreAccount::NewL(1234, _L("Account 1") );
+    accountArray.Append( account1 );                                            
+    
+    CMsgStoreAccount* account2 = CMsgStoreAccount::NewL(1234, _L("") );
+    accountArray.Append( account2 );                                            
+    
+    CMsgStoreAccount* account3 = CMsgStoreAccount::NewL(5678, _L("Account 3") );
+    accountArray.Append( account3 );                                            
+    
+    CMsgStoreMailBox* mailBox1 = iMsgStore->CreateAccountL( *account1 );
+    CleanupStack::PushL( mailBox1 );                                            //+1
+    
+    CMsgStoreMailBox* mailBox2 = iMsgStore->CreateAccountL( *account2 );
+    CleanupStack::PushL( mailBox2 );                                            //+2
+    
+    CMsgStoreMailBox* mailBox3 = iMsgStore->CreateAccountL( *account3 );
+    CleanupStack::PushL( mailBox3 );                                            //+3
+    
+    CMsgStorePropertyContainer* properties = CMsgStorePropertyContainer::NewL();
+    CleanupStack::PushL( properties );                                          //+4
+    
+    properties->AddPropertyL( _L8("1"), _L("PROPERTY 1") );
+    properties->AddPropertyL( _L8("2"), 12345 );
+    properties->AddPropertyL( _L8("3"), _L8("ANOTHER PROPERTY") );
+    
+    iLog->Log( _L("Case %d: Create Folders"), iCaseId++ );
+    
+    TMsgStoreId inbox1Id = mailBox1->CreateFolderL( mailBox1->Id(), *properties );
+    TMsgStoreId sentFolderId = mailBox2->CreateFolderL( mailBox2->Id(), *properties );
+    TMsgStoreId deletedFolderId = mailBox3->CreateFolderL( mailBox3->Id(), *properties );
+    
+    iLog->Log( _L("  inbox=%x, sent=%x, deleted=%x"), inbox1Id, sentFolderId, deletedFolderId  );
+    
+    TInt msgCountPerFolder = 20;
+    
+    iLog->Log( _L("Case %d: Create messages in Inbox"), iCaseId++ );
+    //keep ids, message ids will be stored in iMatches
+    CreateRandomMessagesL( mailBox1, inbox1Id, msgCountPerFolder, ETrue ); 
+    
+    iLog->Log( _L("Case %d: Create messages in Sent folder"), iCaseId++ );
+    CreateRandomMessagesL( mailBox2, sentFolderId, msgCountPerFolder );
+    
+    iLog->Log( _L("Case %d: Create messages in Deleted folder"), iCaseId++ );
+    CreateRandomMessagesL( mailBox3, deletedFolderId, msgCountPerFolder );
+    
+    iLog->Log( _L("Case %d: Set msg contents and store them for comparison"), iCaseId++ );
+    for ( TInt i = 0 ; i < iMatches.Count() ; i++ )
+        {
+        CMsgStoreMessage* msg = mailBox1->FetchMessageL( iMatches[i], inbox1Id );
+        SetMessageContentL( msg, iTestContentArray[i] );
+        iMessages.Append( msg );
+        }
+
+    iLog->Log( _L("Case %d: Store Msg Ids Sorted by Subject and Sender for comparison"), iCaseId++ );
+    RArray<TMsgStoreId> idsSortdBySubject;
+    GetSortedIdsL( mailBox2, sentFolderId, EMsgStoreSortBySubject, msgCountPerFolder, idsSortdBySubject );
+    
+    RArray<TMsgStoreId> idsSortdByFrom;
+    GetSortedIdsL( mailBox3, deletedFolderId, EMsgStoreSortBySender, msgCountPerFolder, idsSortdByFrom );
+    
+    iLog->Log( _L("Case %d: Start Encryption"), iCaseId++ );
+    iMsgStore->EnableEncryptionL();
+    
+    iLog->Log( _L("  Wait until Encryption completes") );
+    WaitUntilEncryptDecryptCompleteL( EMsgStoreESEncrypting, mailBox1 );
+    
+    iLog->Log( _L("  Encryption completed") );
+    
+    iLog->Log( _L("Case %d: Comparing messages"), iCaseId++ );
+    CompareMessagesL( mailBox1 );
+    
+    iLog->Log( _L("Case %d: Comparing Accounts"), iCaseId++ );
+    CompareAccountsL( iMsgStore, accountArray );
+
+    iLog->Log( _L("Case %d: Comparing msg IDs sorted by Subject"), iCaseId++ );
+    RArray<TMsgStoreId> aSortedIds;
+    GetSortedIdsL( mailBox2, sentFolderId, EMsgStoreSortBySubject, msgCountPerFolder, aSortedIds );
+    CompareSortedIdArraysL( aSortedIds, idsSortdBySubject );
+    aSortedIds.Reset();
+    
+    iLog->Log( _L("Case %d: Comparing msg IDs sorted by Sender"), iCaseId++ );
+    GetSortedIdsL( mailBox3, deletedFolderId, EMsgStoreSortBySender, msgCountPerFolder, aSortedIds );
+    CompareSortedIdArraysL( aSortedIds, idsSortdByFrom );
+    aSortedIds.Reset();
+    
+    iLog->Log( _L("Case %d: Start Decryption"), iCaseId++ );
+    
+    iMsgStore->DisableEncryptionL();
+    
+    iLog->Log( _L("  Wait until Decryption completes") );
+    
+    WaitUntilEncryptDecryptCompleteL( EMsgStoreESDecrypting, mailBox1 );
+    
+    iLog->Log( _L("  Decryption completed") );
+    
+    iLog->Log( _L("Case %d: Comparing messages"), iCaseId++ );
+    CompareMessagesL( mailBox1 );
+    
+    iLog->Log( _L("Case %d: Comparing Accounts"), iCaseId++ );
+    CompareAccountsL( iMsgStore, accountArray );
+    
+    iLog->Log( _L("Case %d: Comparing msg IDs sorted by Subject"), iCaseId++ );
+    GetSortedIdsL( mailBox2, sentFolderId, EMsgStoreSortBySubject, msgCountPerFolder, aSortedIds );
+    CompareSortedIdArraysL( aSortedIds, idsSortdBySubject );
+    aSortedIds.Reset();
+    
+    iLog->Log( _L("Case %d: Comparing msg IDs sorted by Sender"), iCaseId++ );
+    GetSortedIdsL( mailBox3, deletedFolderId, EMsgStoreSortBySender, msgCountPerFolder, aSortedIds );
+    CompareSortedIdArraysL( aSortedIds, idsSortdByFrom );
+    aSortedIds.Reset();
+    
+    idsSortdBySubject.Close();
+    idsSortdByFrom.Close();
+    accountArray.ResetAndDestroy();
+    iMatches.Reset();
+    iMessages.ResetAndDestroy();
+    
+    CleanupStack::PopAndDestroy( 4 );
+    
+    //test authentication
+    iLog->Log( _L("Case %d: Test AuthenticateL"), iCaseId++ );
+    TRAPD(err, iMsgStore->AuthenticateL( _L("mypassword")) );
+    CheckCondition( _L("AuthenticateL successful"), err == KErrNone );
+    
+    iLog->Log( _L("Case %d: Test ChangePasswordL"), iCaseId++ );
+    TRAP(err, iMsgStore->ChangePasswordL( _L("mypassword"), _L("newpassword") ) );
+    CheckCondition( _L("ChangePasswordL successful"), err == KErrNone );
+        
+    iLog->Log( _L("Case %d: Test ClearAuthenticationL"), iCaseId++ );
+    TRAP(err, iMsgStore->ClearAuthenticationL() );
+    CheckCondition( _L("ClearAuthenticationL successful"), err == KErrNone );
+    
+    //we are done 
+    return ETrue;
+    }
+
+
+void CEncryptionTests::WaitUntilEncryptDecryptCompleteL( TInt aCurrentState, CMsgStoreMailBox* aMailBox )
+    {
+    RDebugSession debugSession;
+    User::LeaveIfError( debugSession.Connect() );
+    
+    TInt encryptionState = aCurrentState; 
+    TInt loopCount = 0;
+    TMsgStoreId folderId;
+    while( encryptionState !=  EMsgStoreESIdle && loopCount < 4000 )
+        {
+        Yield( 20000 );
+        loopCount++;
+        if ( loopCount % 20 == 0 )
+            {
+            encryptionState = debugSession.GetEncryptionStateL();
+            }
+        
+        if ( loopCount == 2 && encryptionState == aCurrentState )
+            {
+            iLog->Log( _L("Case %d: Testing fetch msgs while encryption/decription is in progress"), iCaseId++ );
+            CompareMessagesL( aMailBox );
+            }
+        
+        if ( loopCount == 5 && encryptionState == aCurrentState )
+            {
+            iLog->Log( _L("Case %d: Testing create msgs while encryption/decription is in progress"), iCaseId++ );
+            CMsgStorePropertyContainer* properties = CMsgStorePropertyContainer::NewL();
+            folderId = aMailBox->CreateFolderL( aMailBox->Id(), *properties);
+            delete properties;
+            CreateRandomMessagesL(aMailBox, folderId, 5);
+            }
+        
+        if ( loopCount == 8 && encryptionState == aCurrentState )
+            {
+            iLog->Log( _L("Case %d: Testing delete folder while encryption/decription is in progress"), iCaseId++ );
+            aMailBox->DeleteFolderL(folderId);
+            }
+        
+        if ( encryptionState != aCurrentState && encryptionState != EMsgStoreESIdle )
+            {
+            break;
+            }
+        }
+    
+    debugSession.Close();
+    if ( encryptionState != EMsgStoreESIdle )
+        {
+        iLog->Log( _L("  Encryption did NOT complete") );
+        User::Leave( KErrCancel );
+        }
+    }
+
+void CEncryptionTests::CompareMessagesL( CMsgStoreMailBox* aMailBox )
+    {
+    iLog->Log( _L("  >> CompareMessagesL") );
+    
+    RBuf8 contentBuf;
+    contentBuf.Create( 1024 );
+    contentBuf.CleanupClosePushL();
+    
+    for( TInt i = 0 ; i < iMessages.Count() ; i++ )
+        {
+        CMsgStoreMessage* msg = aMailBox->FetchMessageL( iMessages[i]->Id(), KMsgStoreInvalidId );
+        CleanupStack::PushL( msg );                               //+1
+        
+        ComparePropertiesL( *msg, *(iMessages[i]) );
+        
+        iLog->Log( _L("   Comparing contents...") );
+        
+        RPointerArray<CMsgStoreMessagePart> parts;
+        msg->ChildPartsL( parts );
+        CMsgStoreMessagePart* part =parts[0];
+        
+        RPointerArray<CMsgStoreMessagePart> childParts;
+        part->ChildPartsL( childParts );
+        CMsgStoreMessagePart* plain_text_part = childParts[0];
+        
+        plain_text_part->FetchContentToBufferL( contentBuf );
+        if ( contentBuf == iTestContentArray[i] )
+            {
+            iLog->Log( _L("   Contents match!") );
+            }
+        else
+            {
+            iLog->Log( _L("   Error: Contents don't match! index=%d"), i );
+            User::Leave( KErrNotFound );
+            }
+
+        childParts.ResetAndDestroy();
+        parts.ResetAndDestroy();
+        CleanupStack::PopAndDestroy( msg );
+        }
+    CleanupStack::PopAndDestroy( &contentBuf );
+    
+    iLog->Log( _L("  << CompareMessagesL - PASSED") );
+    }
+
+void CEncryptionTests::CompareAccountsL( CMsgStore* aSession, RPointerArray<CMsgStoreAccount>& aAccounts )
+    {
+    iLog->Log( _L("  >> CompareAccountsL") );
+    
+    RPointerArray<CMsgStoreAccount> accs;
+    aSession->AccountsL( accs );
+
+    CheckCondition( _L("Counts match"), accs.Count() == aAccounts.Count() );
+    
+    for ( TInt i = 0 ; i < accs.Count() ; i++ )
+        {
+        CMsgStoreAccount* acc = accs[i];
+        TBool found = EFalse;
+        for (TInt j = 0 ; !found && j < aAccounts.Count() ; j++ )
+            {
+            CMsgStoreAccount* acc2 = aAccounts[j];
+            if ( acc->Owner() == acc2->Owner() && acc->Name() == acc2->Name() )
+                {
+                found = ETrue;
+                }
+            }
+        if ( !found )
+            {
+            iLog->Log( _L("  Account:%X %S not found!"), acc->Owner(), &( acc->Name() ) );
+            User::Leave(KErrNotFound);
+            }
+        }
+    
+    accs.ResetAndDestroy();
+    
+    iLog->Log( _L("  << CompareAccountsL - PASSED") );
+    }
+
+void CEncryptionTests::GetSortedIdsL( CMsgStoreMailBox* aMailBox, TMsgStoreId aFolderId, TMsgStoreSortByField aSortedBy, TInt aCount, RArray<TMsgStoreId>& aSortedIds )
+    {
+    iLog->Log( _L("  >> GetSortedIdsL") );
+    
+    RMsgStoreSortCriteria criteria;
+    CleanupClosePushL( criteria );
+    
+    criteria.iFolderId = aFolderId;
+    criteria.AddResultPropertyL( KMsgStorePropertyFrom );
+    criteria.AddResultPropertyL( KMsgStorePropertySubject );
+    criteria.iSortBy   = aSortedBy;
+    criteria.iSortOrder = EMsgStoreSortDescending;
+    
+    CMsgStoreSortResultIterator* iterator = aMailBox->SortL( criteria ); 
+    CleanupStack::PushL( iterator );
+    
+    RPointerArray<CMsgStorePropertyContainer> results;
+    
+    iterator->NextL( KMsgStoreSortResultTop, aCount, results );
+    for ( TInt i = 0 ; i < results.Count() ; i++ )
+        {
+        TMsgStoreId msgId = results[i]->Id();
+        aSortedIds.Append( msgId );
+        }
+
+    results.ResetAndDestroy();
+    CleanupStack::PopAndDestroy( iterator );
+    CleanupStack::PopAndDestroy( &criteria );
+    
+    iLog->Log( _L("  << GetSortedIdsL") );
+    }
+
+void CEncryptionTests::CompareSortedIdArraysL( RArray<TMsgStoreId>& aIDs1, RArray<TMsgStoreId>& aIDs2 )
+    {
+    iLog->Log( _L("  >> CompareSortedIdArraysL") );
+    
+    CheckCondition(_L("Counts match"), aIDs1.Count() == aIDs2.Count() );
+    
+    for ( TInt i = 0 ; i < aIDs1.Count() ; i++ )
+        {
+        if ( aIDs1[i] != aIDs2[i] )
+            {
+            iLog->Log( _L("  Arrays don't match. Index=%d, val1=%u, val2=%u") , i, aIDs1[i], aIDs2[i] );
+            User::Leave( KErrNotFound );
+            }
+        }
+    
+    iLog->Log( _L("  << CompareSortedIdArraysL - PASSED") );
+    }
+
+//  End of File