persistentstorage/sql/TEST/t_sqlstartup.cpp
branchRCL_3
changeset 8 fa9941cf3867
child 9 667e88a979d7
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/persistentstorage/sql/TEST/t_sqlstartup.cpp	Fri Mar 12 15:51:02 2010 +0200
@@ -0,0 +1,365 @@
+// 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:
+//
+
+#include <e32test.h>
+#include <bautils.h>
+#include "SqlSrvMain.h"
+#include "SqlSrvStartup.h"
+#include "SqlSrvUtil.h"
+
+///////////////////////////////////////////////////////////////////////////////////////
+
+RTest TheTest(_L("t_sqlstartup test"));
+
+static TInt TheProcessHandleCount = 0;
+static TInt TheThreadHandleCount = 0;
+static TInt TheAllocatedCellsCount = 0;
+
+#ifdef _DEBUG
+static const TInt KBurstRate = 20;
+#endif
+
+///////////////////////////////////////////////////////////////////////////////////////
+
+void DeleteTestFiles()
+	{
+	}
+
+///////////////////////////////////////////////////////////////////////////////////////
+///////////////////////////////////////////////////////////////////////////////////////
+//Test macros and functions
+void Check(TInt aValue, TInt aLine)
+	{
+	if(!aValue)
+		{
+		DeleteTestFiles();
+		RDebug::Print(_L("*** Expresssion evaluated to false\r\n"));
+		TheTest(EFalse, aLine);
+		}
+	}
+void Check(TInt aValue, TInt aExpected, TInt aLine)
+	{
+	if(aValue != aExpected)
+		{
+		DeleteTestFiles();
+		RDebug::Print(_L("*** Expected error: %d, got: %d\r\n"), aExpected, aValue);
+		TheTest(EFalse, aLine);
+		}
+	}
+#define TEST(arg) ::Check((arg), __LINE__)
+#define TEST2(aValue, aExpected) ::Check(aValue, aExpected, __LINE__)
+
+////////////////////////////////////////////////////////////////////////////////////////////////////////////
+
+static void MarkHandles()
+    {
+    RThread().HandleCount(TheProcessHandleCount, TheThreadHandleCount);
+    }
+
+static void MarkAllocatedCells()
+    {
+    TheAllocatedCellsCount = User::CountAllocCells();
+    }
+
+static void CheckAllocatedCells()
+    {
+    TInt allocatedCellsCount = User::CountAllocCells();
+    TEST2(allocatedCellsCount, TheAllocatedCellsCount);
+    }
+
+static void CheckHandles()
+    {
+    TInt endProcessHandleCount;
+    TInt endThreadHandleCount;
+    
+    RThread().HandleCount(endProcessHandleCount, endThreadHandleCount);
+
+    TEST2(TheProcessHandleCount, endProcessHandleCount);
+    TEST2(TheThreadHandleCount, endThreadHandleCount);
+    }
+
+static void OomPreStep(TInt
+#ifdef _DEBUG        
+    aFailingAllocationNo
+#endif
+                      )
+    {
+    MarkHandles();
+    MarkAllocatedCells();
+    __UHEAP_MARK;
+    __UHEAP_SETBURSTFAIL(RAllocator::EBurstFailNext, aFailingAllocationNo, KBurstRate);
+    }
+
+static void OomPostStep()
+    {
+    __UHEAP_RESET;
+    __UHEAP_MARKEND;
+    CheckAllocatedCells();
+    CheckHandles();
+    }
+
+////////////////////////////////////////////////////////////////////////////////////////////////////////////
+////////////////////////////////////////////////////////////////////////////////////////////////////////////
+
+static void CreateAndDestroySqlServerL()
+    {
+    CSqlServer* server = CSqlServer::NewLC();
+    CleanupStack::PopAndDestroy(server);
+    }
+
+static CSqlServer* CreateSqlServerL()
+    {
+    CSqlServer* server = CSqlServer::NewLC();
+    CleanupStack::Pop(server);
+    return server;
+    }
+
+/**
+@SYMTestCaseID          PDS-SQL-UT-4159
+@SYMTestCaseDesc        SQL server startup OOM test
+@SYMTestPriority        High
+@SYMTestActions         Runs the SQL server startup code in an OOM loop.
+@SYMTestExpectedResults Test must not fail
+@SYMDEF                 DEF144096
+*/  
+void SqlServerStartupOomTest()
+    {
+    TInt err = KErrNoMemory;
+    TInt failingAllocationNo = 0;
+    TheTest.Printf(_L("Iteration:\r\n"));
+    while(err == KErrNoMemory)
+        {
+        TheTest.Printf(_L(" %d"), ++failingAllocationNo);
+        OomPreStep(failingAllocationNo);
+        TRAP(err, CreateAndDestroySqlServerL());
+        OomPostStep();
+        }
+    if(err != KErrNoMemory)
+        {
+        TEST2(err, KErrNone);   
+        }
+    TheTest.Printf(_L("\r\n===OOM test succeeded at heap failure rate of %d ===\r\n"), failingAllocationNo);
+    }
+
+/**
+@SYMTestCaseID          PDS-SQL-UT-4160
+@SYMTestCaseDesc        CSqlServer::GetBackUpListL() OOM test
+@SYMTestPriority        High
+@SYMTestActions         Calls CSqlServer::GetBackUpListL() in an OOM loop.
+@SYMTestExpectedResults Test must not fail
+@SYMDEF                 DEF144096
+*/  
+void GetBackupListOomTest()
+    {
+    CSqlServer* server = NULL;
+    TRAPD(err, server = CreateSqlServerL());
+    TEST2(err, KErrNone);
+  
+    TInt fileCnt = 0;
+    err = KErrNoMemory;
+    TInt failingAllocationNo = 0;
+    TheTest.Printf(_L("Iteration:\r\n"));
+    while(err == KErrNoMemory)
+        {
+        TheTest.Printf(_L(" %d"), ++failingAllocationNo);
+        OomPreStep(failingAllocationNo);
+        const TUid KDbUd = {0x98765432};
+        RArray<TParse> files;
+        TRAP(err, server->GetBackUpListL(KDbUd, files));
+        fileCnt = files.Count(); 
+        files.Close();
+        OomPostStep();
+        }
+    
+    delete server;
+    
+    if(err != KErrNoMemory)
+        {
+        TEST2(err, KErrNone);   
+        }
+    TheTest.Printf(_L("\r\n===OOM test succeeded at heap failure rate of %d ===\r\nFile count: %d\r\n"), failingAllocationNo, fileCnt);
+    }
+
+/**
+@SYMTestCaseID          PDS-SQL-UT-4161
+@SYMTestCaseDesc        SQL server startup file I/O error simulation test
+@SYMTestPriority        High
+@SYMTestActions         Runs the SQL server startup code in a file I/O error simulation loop.
+@SYMTestExpectedResults Test must not fail
+@SYMDEF                 DEF144096
+*/  
+void SqlServerStartupFileIoErrorTest()
+    {
+    RFs fs;
+    TInt err = fs.Connect();
+    TEST2(err, KErrNone);
+    
+    for(TInt fsError=KErrNotFound;fsError>=KErrBadName;--fsError)
+        {
+        TheTest.Printf(_L("===Simulated error: %d\r\nIteration: "), fsError);
+        err = KErrNotFound;
+        TInt cnt=1;
+        while(err<KErrNone)
+            {
+            TheTest.Printf(_L("%d "), cnt);
+            (void)fs.SetErrorCondition(fsError, cnt);
+            TRAP(err, CreateAndDestroySqlServerL());
+            (void)fs.SetErrorCondition(KErrNone);
+            if(err != KErrNone)
+                {
+                ++cnt;
+                }
+            }
+        TEST2(err, KErrNone);
+        TheTest.Printf(_L("\r\n===File I/O error simulation test succeeded on iteration %d===\r\n"), cnt);
+        }
+
+    fs.Close();
+    }
+
+/**
+@SYMTestCaseID          PDS-SQL-UT-4162
+@SYMTestCaseDesc        CSqlServer::GetBackUpListL() file I/O error simulation test
+@SYMTestPriority        High
+@SYMTestActions         Calls CSqlServer::GetBackUpListL() in a file I/O error simulation loop.
+@SYMTestExpectedResults Test must not fail
+@SYMDEF                 DEF144096
+*/  
+void GetBackupListFileIoErrorTest()
+    {
+    CSqlServer* server = NULL;
+    TRAPD(err, server = CreateSqlServerL());
+    TEST2(err, KErrNone);
+
+    for(TInt fsError=KErrNotFound;fsError>=KErrBadName;--fsError)
+        {
+        TheTest.Printf(_L("===Simulated error: %d\r\nIteration: "), fsError);
+        err = KErrNotFound;
+        TInt fileCnt = 0;
+        TInt cnt=1;
+        while(err<KErrNone)
+            {
+            TheTest.Printf(_L("%d "), cnt);
+            (void)server->Fs().SetErrorCondition(fsError, cnt);
+            const TUid KDbUd = {0x98765432};
+            RArray<TParse> files;
+            TRAP(err, server->GetBackUpListL(KDbUd, files));
+            fileCnt = files.Count(); 
+            files.Close();
+            (void)server->Fs().SetErrorCondition(KErrNone);
+            if(err != KErrNone)
+                {
+                ++cnt;
+                }
+            }
+        TEST2(err, KErrNone);
+        TheTest.Printf(_L("\r\n===File I/O error simulation test succeeded on iteration %d===\r\nFile count: %d\r\n"), cnt, fileCnt);
+        }
+        
+    delete server;
+    }
+
+/**
+@SYMTestCaseID          PDS-SQL-UT-4163
+@SYMTestCaseDesc        Test for DEF144196: SQL, server code coverage can be improved
+@SYMTestPriority        High
+@SYMTestActions         Tests the UTF conversion functions implemented in SqlSrvUtil.cpp.
+@SYMTestExpectedResults Test must not fail
+@SYMDEF                 DEF144196
+*/  
+void UtfConversionTest()
+    {
+    /////////       UTF16ToUTF8()       ///////////////////////
+    _LIT(KStr16, "abcd");
+    _LIT8(KStr8, "abcd");
+    TBuf8<KMaxFileName + 1> bufout;
+    TBool rc = UTF16ToUTF8(KStr16, bufout);
+    TEST(rc);
+    TEST(bufout == KStr8);
+    //Test where the input buffer contains non-convertible characters
+    TBuf<2> name2;
+    name2.SetLength(2);
+    name2[0] = TChar(0xD800); 
+    name2[1] = TChar(0xFC00); 
+    rc = UTF16ToUTF8(name2, bufout);
+    TEST(!rc);
+    /////////       UTF16ToUTF8Z()       ///////////////////////
+    _LIT8(KStr8Z, "abcd\x0");
+    rc = UTF16ToUTF8Z(KStr16, bufout);
+    TEST(rc);
+    TEST(bufout == KStr8Z);
+    //Test where the input buffer contains non-convertible characters
+    rc = UTF16ToUTF8Z(name2, bufout);
+    TEST(!rc);
+    /////////       UTF16ZToUTF8Z()       ///////////////////////
+    _LIT(KStr16Z, "abcd\x0");
+    rc = UTF16ZToUTF8Z(KStr16Z, bufout);
+    TEST(rc);
+    TEST(bufout == KStr8Z);
+    //Test where the input buffer contains non-convertible characters
+    TBuf<3> name3;
+    name3.SetLength(3);
+    name3[0] = TChar(0xD800); 
+    name3[1] = TChar(0xFC00); 
+    name3[2] = TChar(0x0000); 
+    rc = UTF16ZToUTF8Z(name3, bufout);
+    TEST(!rc);
+    }
+
+void DoTests()
+	{
+    CActiveScheduler* scheduler = new CActiveScheduler;
+    TEST(scheduler != NULL);
+    CActiveScheduler::Install(scheduler);
+	
+    TheTest.Start(_L(" @SYMTestCaseID:PDS-SQL-UT-4159 SQL server startup OOM test"));
+    SqlServerStartupOomTest();
+
+    TheTest.Next (_L(" @SYMTestCaseID:PDS-SQL-UT-4160 CSqlServer::GetBackUpListL() OOM test"));
+    GetBackupListOomTest();
+
+    TheTest.Next (_L(" @SYMTestCaseID:PDS-SQL-UT-4161 SQL server startup file I/O error simulation test"));
+    SqlServerStartupFileIoErrorTest();
+    
+    TheTest.Next (_L(" @SYMTestCaseID:PDS-SQL-UT-4162 CSqlServer::GetBackUpListL() file I/O error simulation test"));
+    GetBackupListFileIoErrorTest();
+
+    TheTest.Next (_L(" @SYMTestCaseID:PDS-SQL-UT-4163 SQL server, UTF conversion test"));
+    UtfConversionTest();
+
+    delete scheduler;
+	}
+
+TInt E32Main()
+	{
+	TheTest.Title();
+	
+	CTrapCleanup* tc = CTrapCleanup::New();
+	
+	__UHEAP_MARK;
+	
+	DoTests();
+	DeleteTestFiles();
+
+	__UHEAP_MARKEND;
+	
+	TheTest.End();
+	TheTest.Close();
+	
+	delete tc;
+
+	User::Heap().Check();
+	return KErrNone;
+	}