emailservices/emailstore/tsrc/message_store_test/src/DbCorruptTests.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/DbCorruptTests.cpp	Thu Jan 07 12:38:38 2010 +0200
@@ -0,0 +1,265 @@
+/*
+* 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 <S32FILE.H>
+#include <D32DBMS.H>
+#include "DbCorruptTests.h"
+#include <EmailStoreUids.hrh>
+
+//these must match those defined in ContainerStoreDefs.
+_LIT( KDbFilename, "message_store.db" );
+_LIT( KGeneralTableName,                      "G001" );
+_LIT( KGeneralTableDbSchemaVersionCol,        "G002" );
+
+// ============================ MEMBER FUNCTIONS ===============================
+
+CDbCorruptTests* CDbCorruptTests::NewL( CStifLogger* aLog )
+    {
+    CDbCorruptTests* self = new(ELeave) CDbCorruptTests( aLog );
+    CleanupStack::PushL( self );
+    self->ConstructL();
+    CleanupStack::Pop( self );
+    return self;
+    }
+
+// -----------------------------------------------------------------------------
+// Constructor
+// -----------------------------------------------------------------------------
+CDbCorruptTests::CDbCorruptTests( CStifLogger* aLog ) : CAsyncTestCaseBase( aLog ) 
+    {
+    }
+
+// -----------------------------------------------------------------------------
+// Destructor
+// -----------------------------------------------------------------------------
+CDbCorruptTests::~CDbCorruptTests()
+    {
+    }
+
+// -----------------------------------------------------------------------------
+// 2nd phase constructor
+// -----------------------------------------------------------------------------
+void CDbCorruptTests::ConstructL()
+    {
+    CAsyncTestCaseBase::ConstructL();
+    }
+
+// -----------------------------------------------------------------------------
+// ExecuteL : start executing the test case
+// -----------------------------------------------------------------------------
+TBool CDbCorruptTests::ExecuteL()
+    {
+    LogHeader( _L("Database Corruption") );
+    
+    RFs                         fs;
+    RFile                       file;
+    CPermanentFileStore*        fileStore;
+    CMsgStorePropertyContainer* properties;
+    RDbStoreDatabase            database;
+    RDbTable                    table;
+    CDbColSet*                  colSet;
+    TUint                       unreadCount;
+    TUint                       totalCount;
+    TInt                        result;
+    TFileName                   dbFileName;
+    
+    User::LeaveIfError( fs.Connect() );
+
+    properties = CMsgStorePropertyContainer::NewL();
+
+    iLog->Log( _L("Case %d: Database file exists but is empty"), iCaseId++ );
+    
+    iLog->Log( _L("  Shutdown the server") );
+    //shutdown the server
+    ShutdownServerL();    
+    
+    // The file cannot be opened until the server has shut down, so keep trying until it is possible.
+    result = KErrInUse;
+    while( result == KErrInUse )
+        {       
+        Yield( 100000 );
+        dbFileName.Format( _L("C:\\private\\%x\\%S"), KUidMessageStoreExe, &KDbFilename );
+        result = file.Replace( fs, dbFileName, EFileWrite );
+        }
+        
+    file.Close();       
+    
+    CMsgStore* session = CMsgStore::NewL( ETrue );
+    CleanupStack::PushL( session );                                           //+1
+    
+    iLog->Log( _L("Case %d: Create Mailbox"), iCaseId++ );
+    CMsgStoreAccount* account1 = CMsgStoreAccount::NewLC( 1234, KNullDesC );   //+2
+    CMsgStoreMailBox* mailbox1 = session->CreateAccountL( *account1 );
+    CleanupStack::PushL( mailbox1 );                                           //+3
+    
+    iLog->Log( _L("Case %d: Message counts are 0"), iCaseId++ );
+    mailbox1->TotalMessageCountsL( totalCount, unreadCount );
+    CheckCondition( _L("no crash, counts are zero"), totalCount == 0 && unreadCount == 0 );
+    
+    iLog->Log( _L("Case %d: Create Folder"), iCaseId++ );
+    TMsgStoreId inbox1Id = mailbox1->CreateFolderL( mailbox1->Id(), *properties );
+    CMsgStoreFolder* inbox1 = mailbox1->FolderL( inbox1Id );
+    CleanupStack::PushL( inbox1 );                                             //+4
+    
+    iLog->Log( _L("Case %d: Create Message"), iCaseId++ );
+    CMsgStoreMessage* msg = mailbox1->CreateMessageL( inbox1Id, *properties );
+    delete msg;
+    
+    CleanupStack::PopAndDestroy(4);
+
+    //shutdown the server again
+    iLog->Log( _L("  Shutdown the server again") );
+    ShutdownServerL();    
+    
+    iLog->Log( _L("Case %d: Database file exists but contains bad content"), iCaseId++ );
+    result = KErrInUse;
+    while( result == KErrInUse )
+        {       
+        Yield( 100000 );
+        result = file.Replace( fs, dbFileName, EFileWrite );
+        }
+    
+    file.Write( _L8("RANDOM CONTENT") );
+    file.Close();       
+    
+    session = CMsgStore::NewL( ETrue );
+    CleanupStack::PushL( session );                                            //+1
+    
+    iLog->Log( _L("Case %d: Create Mailbox"), iCaseId++ );
+    account1 = CMsgStoreAccount::NewLC( 1234, KNullDesC );   //+2
+    mailbox1 = session->CreateAccountL( *account1 );
+    CleanupStack::PushL( mailbox1 );                                           //+3
+    
+    iLog->Log( _L("Case %d: Message counts are 0"), iCaseId++ );
+    mailbox1->TotalMessageCountsL( totalCount, unreadCount );
+    CheckCondition( _L("no crash, counts are zero"), totalCount == 0 && unreadCount == 0 );
+    
+    iLog->Log( _L("Case %d: Create Folder"), iCaseId++ );
+    inbox1Id = mailbox1->CreateFolderL( mailbox1->Id(), *properties );
+    inbox1 = mailbox1->FolderL( inbox1Id );
+    CleanupStack::PushL( inbox1 );                                             //+4
+    
+    iLog->Log( _L("Case %d: Create Message"), iCaseId++ );
+    msg = mailbox1->CreateMessageL( inbox1Id, *properties );
+
+    delete msg;
+    CleanupStack::PopAndDestroy(4);
+    
+    //shutdown the server again
+    iLog->Log( _L("  Shutdown the server again") );
+    ShutdownServerL();
+    
+    iLog->Log( _L("Case %d: Database file exists and contains an empty database"), iCaseId++ );
+
+    result = KErrInUse;
+    while( result == KErrInUse )
+        {       
+        Yield( 100000 );
+        TRAP( result, fileStore = CPermanentFileStore::ReplaceL( fs, dbFileName, EFileRead|EFileWrite ) );
+        }
+    
+    fileStore->SetTypeL( fileStore->Layout() );     
+    TStreamId id = database.CreateL( fileStore );   
+    fileStore->SetRootL( id );  
+    fileStore->CommitL();
+    database.Close();
+    delete fileStore;
+
+    session = CMsgStore::NewL( ETrue );
+    CleanupStack::PushL( session );                                            //+1
+    
+    iLog->Log( _L("Case %d: Create Mailbox"), iCaseId++ );
+    
+    account1 = CMsgStoreAccount::NewLC( 1234, KNullDesC );   //+2
+    mailbox1 = session->CreateAccountL( *account1 );
+    CleanupStack::PushL( mailbox1 );                                           //+3
+    
+    iLog->Log( _L("Case %d: Message counts are 0"), iCaseId++ );
+    mailbox1->TotalMessageCountsL( totalCount, unreadCount );
+    CheckCondition( _L("no crash, counts are zero"), totalCount == 0 && unreadCount == 0 );
+    
+    iLog->Log( _L("Case %d: Create Folder"), iCaseId++ );
+    inbox1Id = mailbox1->CreateFolderL( mailbox1->Id(), *properties );
+    inbox1 = mailbox1->FolderL( inbox1Id );
+    CleanupStack::PushL( inbox1 );                                             //+4
+    
+    iLog->Log( _L("Case %d: Create Message"), iCaseId++ );
+    msg = mailbox1->CreateMessageL( inbox1Id, *properties );
+    delete msg;
+    
+    CleanupStack::PopAndDestroy(4);    
+    
+    //shutdown the server again
+    iLog->Log( _L("  Shutdown the server again") );
+    ShutdownServerL();
+    
+    iLog->Log( _L("Case %d: Database schema mismatch"), iCaseId++ );
+
+    result = KErrInUse;
+    while( result == KErrInUse )
+        {       
+        Yield( 100000 );
+        TRAP( result, fileStore = CPermanentFileStore::OpenL( fs, dbFileName, EFileRead|EFileWrite ) );
+        }
+
+    database.OpenL( fileStore, fileStore->Root() );     
+    User::LeaveIfError( table.Open( database, KGeneralTableName ) );  
+    colSet = table.ColSetL();
+    TUint schemaVersionColNum = colSet->ColNo( KGeneralTableDbSchemaVersionCol );
+    delete colSet;  
+    table.FirstL();
+    table.UpdateL();
+    table.SetColL( schemaVersionColNum, 0 );
+    table.PutL();
+    table.Close();
+    database.Close();
+    delete fileStore;
+
+    session = CMsgStore::NewL( ETrue );
+    CleanupStack::PushL( session );                                            //+1
+    
+    iLog->Log( _L("Case %d: Create Mailbox"), iCaseId++ );
+    account1 = CMsgStoreAccount::NewLC( 1234, KNullDesC );                     //+2
+    mailbox1 = session->CreateAccountL( *account1 );
+    CleanupStack::PushL( mailbox1 );                                           //+3
+    
+    iLog->Log( _L("Case %d: Message counts are 0"), iCaseId++ );
+    mailbox1->TotalMessageCountsL( totalCount, unreadCount );
+    CheckCondition( _L("no crash, counts are zero"), totalCount == 0 && unreadCount == 0 );
+    
+    iLog->Log( _L("Case %d: Create Folder"), iCaseId++ );
+    inbox1Id = mailbox1->CreateFolderL( mailbox1->Id(), *properties );
+    inbox1 = mailbox1->FolderL( inbox1Id );
+    CleanupStack::PushL( inbox1 );                                             //+4
+    
+    iLog->Log( _L("Case %d: Create Message"), iCaseId++ );
+    msg = mailbox1->CreateMessageL( inbox1Id, *properties );
+
+    delete msg;
+    CleanupStack::PopAndDestroy(4);
+    
+    delete properties;      
+    fs.Close();
+    
+    //we are done 
+    return ETrue;
+    }
+
+
+//  End of File