phonebookengines_old/contactsmodel/tsrc/t_database_killer.cpp
changeset 40 b46a585f6909
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/phonebookengines_old/contactsmodel/tsrc/t_database_killer.cpp	Fri Jun 11 13:29:23 2010 +0300
@@ -0,0 +1,470 @@
+// Copyright (c) 2002-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 <e32std.h>
+#include <e32test.h>
+#include <cntdb.h>
+#include <cntitem.h>
+#include <cntfldst.h>
+#include "t_utils2.h"
+#include "t_database_killer.h"
+
+
+// Test Macro
+LOCAL_D RTest test(_L("T_DATABASE_KILLER"));
+
+_LIT(KTestName,"@SYMTESTCaseID:PIM-T-DATABASE-KILLER-0001 t_database_killer");
+_LIT(KLogFileName,"t_database_killer.log");
+
+_LIT(KDbFileName,"c:t_database_killer.cdb");
+
+const TInt KNumSmsContacts=5;
+const TInt KNumWorkEmailContacts=4;
+const TInt KNumHomeEmailContacts=4;
+const TInt KNumLandlineContacts=10;
+const TInt KNumFaxContacts=4;
+
+CTestConductor* CTestConductor::NewL(TBool aKillFourTimes)
+	{
+	CTestConductor* self=new(ELeave) CTestConductor(aKillFourTimes);
+	CleanupStack::PushL(self);
+	self->ConstructL();
+	self->RunTestsL();
+	CleanupStack::Pop();
+	return self;
+	}
+
+CTestConductor::~CTestConductor()
+	{
+	delete iLog;
+	delete iDb;
+	delete iTempFiles;
+	iFs.Close();
+	}
+
+CTestConductor::CTestConductor(TBool aKillFourTimes)
+	{
+	iKillFourTimes = aKillFourTimes;
+	}
+
+void CTestConductor::ConstructL()
+	{
+	User::LeaveIfError(iFs.Connect());
+	iTempFiles=CTestRegister::NewLC();
+	CleanupStack::Pop(iTempFiles);
+	iTempFiles->RegisterL(KDbFileName, EFileTypeCnt);
+	iLog=CLog::NewL(test,KLogFileName);
+	iDb=CContactDatabase::ReplaceL(KDbFileName);
+	}
+
+
+void CTestConductor::RunTestsL()
+	{
+	CDatabaseTester* tester=CDatabaseTester::NewL(*iLog,*iDb,this, iKillFourTimes);
+	CleanupStack::PushL(tester);
+	CActiveScheduler::Start();
+	CleanupStack::Pop(tester);
+	// error from CDatabaseTester ?
+	User::LeaveIfError(iTestError);
+	}
+
+void CTestConductor::SetTestError(TInt aTestError)
+	{
+	iTestError = aTestError;
+	}
+
+//
+// CDatabaseTester.
+//
+
+CDatabaseTester* CDatabaseTester::NewL(CLog& aLog,CContactDatabase& aDb,CTestConductor* aTestConductor, TBool aKillFourTimes)
+	{
+	CDatabaseTester* self=new(ELeave) CDatabaseTester(aLog,aDb,aTestConductor, aKillFourTimes);
+	CleanupStack::PushL(self);
+	self->ConstructL();
+	CleanupStack::Pop();
+	return self;
+	}
+
+CDatabaseTester::~CDatabaseTester()
+	{
+	delete iRandomGenerator;
+
+	DeleteProcess();
+
+	}
+
+CDatabaseTester::CDatabaseTester(CLog& aLog,CContactDatabase& aDb,CTestConductor* aTestConductor, TBool aKillFourTimes)
+	: CActive(EPriorityStandard),iLog(aLog),iDb(aDb),iCurrentTest(EInitialisingTests),iTestConductor(aTestConductor)
+	{
+	CActiveScheduler::Add(this);
+	iTotalContacts = 0;
+	iKillFourTimes = aKillFourTimes;
+	}
+
+void CDatabaseTester::ConstructL()
+	{
+	iRandomGenerator=CRandomContactGenerator::NewL();
+	iRandomGenerator->SetDbL(iDb);
+	NextTest();
+	}
+
+void CDatabaseTester::RunL()
+	{
+	CContactIdArray* arrayOfContacts = NULL;
+	TInt num = 0;
+	TInt counter = 0;
+	TInt halfOfAllContacts = 0;
+	switch (iCurrentTest)
+		{
+		case EAddContacts:
+			iLog.LogLine(_L("=== Add Contacts to DB"));
+			AddContactsL();
+			NextTest();
+			break;
+
+		case EKillThreadFirstTime:
+			iLog.LogLine(_L("=== Kill Server 1st Time"));
+			arrayOfContacts = iDb.FindLC(_L(""), NULL);
+			num = arrayOfContacts->Count();
+			test(num == iTotalContacts);
+			FindServerAndKillItL(2000);
+			NextTest();
+			break;
+
+		case ERemoveContacts:
+			iLog.LogLine(_L("==== Remove Some Contacts"));
+			arrayOfContacts = iDb.FindLC(_L(""), NULL);
+			num = arrayOfContacts->Count();
+			test(num == iTotalContacts);
+
+			halfOfAllContacts = num / 2;
+			for ( counter = 0; counter < halfOfAllContacts; counter++)
+				{
+				iDb.DeleteContactL((*arrayOfContacts)[counter]);
+				iTotalContacts--;
+				}
+			CleanupStack::PopAndDestroy(arrayOfContacts);
+			arrayOfContacts = iDb.FindLC(_L(""), NULL);
+			num = arrayOfContacts->Count();
+			test(num == iTotalContacts);
+			NextTest();
+			break;
+
+		case EKillThreadSecondTime:
+			iLog.LogLine(_L("=== Kill Server 2nd Time"));
+			arrayOfContacts = iDb.FindLC(_L(""), NULL);
+			num = arrayOfContacts->Count();
+			test(num == iTotalContacts);
+			FindServerAndKillItL(2000);
+			NextTest();
+			break;
+
+		case EAddMoreContacts:
+			iLog.LogLine(_L("=== Add More Contacts to DB"));
+			AddContactsL();
+			NextTest();
+			break;
+
+		case EKillThreadThirdTime:
+			iLog.LogLine(_L("=== Kill Server 3rd Time"));
+			arrayOfContacts = iDb.FindLC(_L(""), NULL);
+			num = arrayOfContacts->Count();
+			test(num == iTotalContacts);
+			FindServerAndKillItL(2000);
+			NextTest();
+			break;
+
+		case ERemoveMoreContacts:
+			iLog.LogLine(_L("==== Remove Some More Contacts"));
+			arrayOfContacts = iDb.FindLC(_L(""), NULL);
+			num = arrayOfContacts->Count();
+			test(num == iTotalContacts);
+
+			halfOfAllContacts = num / 2;
+			for ( counter = 0; counter < halfOfAllContacts; counter++)
+				{
+				iDb.DeleteContactL((*arrayOfContacts)[counter]);
+				iTotalContacts--;
+				}
+			CleanupStack::PopAndDestroy(arrayOfContacts);
+			arrayOfContacts = iDb.FindLC(_L(""), NULL);
+			num = arrayOfContacts->Count();
+			test(num == iTotalContacts);
+			NextTest();
+			break;
+
+		case EKillThreadForthTime:
+			if (iKillFourTimes)
+				{
+				iLog.LogLine(_L("=== Kill Server 4th Time"));
+				arrayOfContacts = iDb.FindLC(_L(""), NULL);
+				num = arrayOfContacts->Count();
+				test(num == iTotalContacts);
+				FindServerAndKillItL(2000);
+				}
+			else
+				{
+				iLog.LogLine(_L("=== Skipping : Kill Server 4th Time"));
+				}
+			NextTest();
+			break;
+
+		case ENumTests:
+			iLog.LogLine(_L("==== Filter View Finished"));
+			arrayOfContacts = iDb.FindLC(_L(""), NULL);
+			num = arrayOfContacts->Count();
+			test(num == iTotalContacts);
+			CActiveScheduler::Stop();
+			delete this;
+			break;
+
+		default:
+			ASSERT(EFalse);
+			break;
+		}
+
+	if (arrayOfContacts != NULL)
+		{
+		CleanupStack::PopAndDestroy(arrayOfContacts);
+		}
+	}
+
+
+TInt CDatabaseTester::RunError(TInt aError)
+	{
+	// propagate error back to CTestConductor
+	iTestConductor->SetTestError(aError);
+
+	// some diagnostic info on where the test failed
+	switch (iCurrentTest)
+		{
+		case EAddContacts: test.Printf(_L("Failed at test step AddContacts (%i) error %i"), iCurrentTest, aError); break;
+		case EKillThreadFirstTime: test.Printf(_L("Failed at test step KillThreadFirstTime (%i) error %i"), iCurrentTest, aError); break;
+		case ERemoveContacts: test.Printf(_L("Failed at test step RemoveContacts (%i) error %i"), iCurrentTest, aError); break;
+		case EKillThreadSecondTime: test.Printf(_L("Failed at test step KillThreadSecondTime (%i) error %i"), iCurrentTest, aError); break;
+		case EAddMoreContacts: test.Printf(_L("Failed at test step AddMoreContacts (%i) error %i"), iCurrentTest, aError); break;
+		case EKillThreadThirdTime: test.Printf(_L("Failed at test step KillThreadThirdTime (%i) error %i"), iCurrentTest, aError); break;
+		case ERemoveMoreContacts: test.Printf(_L("Failed at test step RemoveMoreContacts (%i) error %i"), iCurrentTest, aError); break;
+		case EKillThreadForthTime: test.Printf(_L("Failed at test step KillThreadForthTime (%i) error %i"), iCurrentTest, aError); break;
+
+		case ENumTests: test.Printf(_L("Failed at test step NumTests (%i) error %i"), iCurrentTest, aError); break;
+
+		default: test.Printf(_L("Failed at test step %i error %i"), iCurrentTest, aError); break;
+		}
+
+	// stop test
+	CActiveScheduler::Stop();
+
+	return KErrNone;
+	}
+
+
+void CDatabaseTester::NextTest()
+	{
+	iCurrentTest = static_cast<TTest>( static_cast<TInt>(iCurrentTest) + 1 );
+	TRequestStatus *pS=&iStatus;
+	User::RequestComplete(pS,KErrNone);
+	SetActive();
+	}
+
+
+
+void CDatabaseTester::DoCancel()
+	{
+	}
+
+void CDatabaseTester::FindServerAndKillItL(TInt aDelay)
+	{
+	if (aDelay > 0) User::After(aDelay);
+	SetupProcessL();
+	OpenAndKillProcess();
+	WaitForServerToClose();
+	}
+
+void CDatabaseTester::AddContactsL()
+	{
+	test.Printf(_L("Adding "));
+	TInt ii;
+	for (ii=0;ii<KNumSmsContacts;ii++)
+		{
+		TInt bit=0;
+		bit |= CContactDatabase::ESmsable;
+		iRandomGenerator->AddTypicalContactForFilterL(bit);
+		iTotalContacts++;
+		}
+	for (ii=0;ii<KNumWorkEmailContacts;ii++)
+		{
+		TInt bit=0;
+		bit |= CContactDatabase::EMailable;
+		iRandomGenerator->AddTypicalContactForFilterL(bit);
+		iTotalContacts++;
+		}
+	for (ii=0;ii<KNumHomeEmailContacts;ii++)
+		{
+		TInt bit=0;
+		bit |= CContactDatabase::EMailable;
+		bit |= CContactDatabase::EHome;
+		iRandomGenerator->AddTypicalContactForFilterL(bit);
+		iTotalContacts++;
+		}
+	for (ii=0;ii<KNumLandlineContacts;ii++)
+		{
+		TInt bit=0;
+		bit |= CContactDatabase::ELandLine;
+		iRandomGenerator->AddTypicalContactForFilterL(bit);
+		iTotalContacts++;
+		}
+	for (ii=0;ii<KNumFaxContacts;ii++)
+		{
+		TInt bit=0;
+		bit |= CContactDatabase::EFaxable;
+		iRandomGenerator->AddTypicalContactForFilterL(bit);
+		iTotalContacts++;
+		}
+	}
+
+void CDatabaseTester::OpenAndKillProcess()
+	{
+	iLog.LogLine(_L("==== Open and Kill Process"));
+	/*TInt retVal = */iProcessOrThread.iProcess.iExecution->Open(iProcessOrThreadFullName);
+	iProcessOrThread.iProcess.iExecution->Kill(KErrNone);
+	}
+
+void CDatabaseTester::OpenAndKillThread()
+	{
+	iLog.LogLine(_L("==== Open and Kill Thread"));
+	iProcessOrThread.iThread.iExecution->Open(iProcessOrThreadFullName);
+	iProcessOrThread.iThread.iExecution->Kill(KErrNone);
+	}
+
+void CDatabaseTester::WaitForServerToClose()
+	{
+	const TInt KRetryPeriod(100000);
+	const TInt KMaxRetries(50);
+	
+	TInt attempts = 0;
+	do
+		{
+		// Attempt to find the server process
+		TRAPD(err, SetupProcessL());
+		if (err == KErrNotFound)
+			{
+			// Server not found - it has closed
+			return;
+			}
+		
+		
+		// Not found, wait then try again
+		User::After(KRetryPeriod);
+		
+		_LIT(KRetryReportFormat, "Close server attempt %d failed\n");
+		test.Printf(KRetryReportFormat, attempts + 1);
+		++attempts;
+		
+		} while (attempts < KMaxRetries);
+	
+	// Failed to close contacts server
+	_LIT(KServerCloseFailed, "Warning: Unable to verify contacts server has closed\n");
+	test.Printf(KServerCloseFailed);
+	}
+
+void CDatabaseTester::SetupThreadL()
+	{
+	DeleteThread();
+	iProcessOrThread.iThread.iFind = new (ELeave) TFindThread(_L("CntLockServer*"));
+	iProcessOrThread.iThread.iExecution = new (ELeave) RThread();
+	iProcessOrThread.iThread.iFind->Next(iProcessOrThreadFullName);
+	}
+
+void CDatabaseTester::SetupProcessL()
+	{
+	DeleteProcess();
+	iProcessOrThread.iProcess.iFind = new (ELeave) TFindProcess(_L("CNTSRV*"));
+	iProcessOrThread.iProcess.iExecution = new (ELeave) RProcess();
+	User::LeaveIfError(iProcessOrThread.iProcess.iFind->Next(iProcessOrThreadFullName));
+	}
+
+void CDatabaseTester::DeleteThread()
+	{
+	delete iProcessOrThread.iThread.iFind;
+	if (iProcessOrThread.iThread.iExecution != NULL) iProcessOrThread.iThread.iExecution->Close();
+	delete iProcessOrThread.iThread.iExecution;
+
+	iProcessOrThread.iThread.iFind = NULL;
+	iProcessOrThread.iThread.iExecution = NULL;
+	}
+
+void CDatabaseTester::DeleteProcess()
+	{
+	delete iProcessOrThread.iProcess.iFind;
+	if (iProcessOrThread.iProcess.iExecution != NULL) iProcessOrThread.iProcess.iExecution->Close();
+	delete iProcessOrThread.iProcess.iExecution;
+
+	iProcessOrThread.iProcess.iFind = NULL;
+	iProcessOrThread.iProcess.iExecution = NULL;
+	}
+
+void CDatabaseTester::AddContactL(TInt aBitwiseFilterType)
+	{
+	test.Printf(_L("Adding Contact"));
+	iRandomGenerator->AddTypicalContactForFilterL(aBitwiseFilterType);
+	iTotalContacts++;
+	}
+
+//
+// Main.
+//
+
+/**
+
+@SYMTestCaseID     PIM-T-DATABASE-KILLER-0001
+
+*/
+
+GLDEF_C TInt E32Main()
+	{
+	TInt error = KErrNone;
+	__UHEAP_MARK;
+	CActiveScheduler* scheduler=new CActiveScheduler;
+	if (scheduler)
+		{
+		CActiveScheduler::Install(scheduler);
+		CTrapCleanup* cleanup=CTrapCleanup::New();
+		if (cleanup)
+			{
+			CTestConductor* testConductor=NULL;
+			// NEWL parameters :
+			//  EFalse - kill the server 3 times
+			//  ETrue  - kill the server 4 times
+			//
+			// - The client should keep track of the number of times the server is restarted.
+			// - restarting the server more than 3 times should result in the client being paniced.
+			// - this has been tested, and the ability to test for this has been included for completeness.
+			test.Start(KTestName);
+
+			TRAP(error,testConductor=CTestConductor::NewL(EFalse));
+			RDebug::Print(_L("T_database_killer test completed \n"));
+			test(error == KErrNone);
+			test.End();
+			delete testConductor;
+			test.Close();
+			delete cleanup;
+			}
+		delete scheduler;
+		}
+	__UHEAP_MARKEND;
+	return KErrNone;
+    }