authorisation/userpromptservice/database/test/tupsdb/source/tupsdbperformance.cpp
author Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
Tue, 27 Apr 2010 18:28:15 +0300
branchRCL_3
changeset 47 b54b58ee9d58
parent 8 35751d3474b7
permissions -rw-r--r--
Revision: 201017 Kit: 201017

/*
* Copyright (c) 2007-2010 Nokia Corporation and/or its subsidiary(-ies).
* All rights reserved.
* This component and the accompanying materials are made available
* under the terms of the License "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: 
* Performs UPS Database Performance Tests
*
*/


/**
 @file
 @test
*/

#include "tupsdbstep.h"
#include <test/testexecutelog.h>

using namespace UserPromptService;

//
// The rest of the code 
	
	
CUpsDbStepPerformance::CUpsDbStepPerformance()
	{
     // Destructor Code
    delete iWaiter;
	delete iScheduler;
	}
	
CUpsDbStepPerformance::~CUpsDbStepPerformance()
	{
	//Constructor Code
	} 
	
TVerdict CUpsDbStepPerformance::doTestStepPreambleL()
	{
	TBuf<KUpsDescriptionLength> keyNotFound;
	ReadConfigurationFile(keyNotFound);
	
	if(keyNotFound.Length())
    	{
    	ERR_PRINTF2(_L("Failed to read '%S' key of configuration"),&keyNotFound);
    	SetTestStepResult(EFail);
    	User::Leave(KErrNotFound);	
    	}
           		
      //Create a database name
     User::LeaveIfError(iFs.Connect());
	 User::LeaveIfError(iFs.CreatePrivatePath(EDriveC));
	 User::LeaveIfError(iFs.PrivatePath(iDbLocation));
	 iPerformanceLog.Copy(iDbLocation);
	 iDbLocation.Append(KDbName);
	 iPerformanceLog.Append(KLogName);
	 
	 //Delete the database if left from previous execution
	iFs.Delete(iDbLocation);
	
	//Open the log file where the performance results are written in CSV format
	TInt err = iFile.Open(iFs,iPerformanceLog,EFileWrite);
	if(KErrNotFound == err)
		{
		User::LeaveIfError(iFile.Replace(iFs,iPerformanceLog,EFileWrite));
		//Write the column headers to the log file
		PrintHeader();
		}
	else if(KErrNone != err)
		{
		User::Leave(err);
		}
		
	TInt pos = 0;
	iFile.Seek(ESeekEnd, pos);
	iLog = ETrue;
	
	//Create and install active scheduler 
	iScheduler = new(ELeave) CActiveScheduler;
	CActiveScheduler::Install(iScheduler);
	iWaiter = new(ELeave)CActiveWaiter(Logger());
		
     return TestStepResult();
	}
	
TVerdict CUpsDbStepPerformance::doTestStepL()
	{
    INFO_PRINTF1(_L("Running Step: Measuring Database Performance"));
	
	//Create a decision database
	CDecisionDbW* decisionDb = CreateDatabaseLC(iDbLocation, iFs);
	
	//Fill the table with decision records	
	FillTableL(*decisionDb,iRecordNum,iClientNum,iServiceNum,iServerNum,iEvaluatorNum);
	
	//Get a set of decision records with ClientSid
	TUid clientId = TUid::Uid(iRetrieveNum%iClientNum + iRecordNum);
	CDecisionFilter* filter = CDecisionFilter::NewLC();
	filter->SetClientSid(clientId,EEqual);
	
	INFO_PRINTF2(_L("Lookup for ClientSid=%d"),clientId.iUid);
	RPointerArray<CDecisionRecord> recordList;
	CleanupResetAndDestroyPushL(recordList);

	GetDecisionsL(*decisionDb, *filter, EFalse, recordList);	
	CleanupStack::PopAndDestroy(2, filter);
	
	//Get a set of decision records with EvaluatorId
	TUid evaluatorId = TUid::Uid(iRetrieveNum%iEvaluatorNum + 1000000 + iRecordNum);
	filter = CDecisionFilter::NewLC();
	filter->SetEvaluatorId(evaluatorId,EEqual);
	CleanupResetAndDestroyPushL(recordList);
	INFO_PRINTF2(_L("Lookup for EvaluatorId=%d"),evaluatorId.iUid);
	
	GetDecisionsL(*decisionDb, *filter, EFalse, recordList);
	CleanupStack::PopAndDestroy(2, filter);
	
	//Get a set of decision records with ServiceId
	TUid serviceId = TUid::Uid(iRetrieveNum%iServiceNum + 10000 + iRecordNum);
	filter = CDecisionFilter::NewLC();
	filter->SetServiceId(serviceId,EEqual);
	CleanupResetAndDestroyPushL(recordList);
	INFO_PRINTF2(_L("Lookup for ServiceId=%d"),serviceId.iUid);
	
	GetDecisionsL(*decisionDb, *filter, EFalse, recordList);
	CleanupStack::PopAndDestroy(2, filter);
	
	//Get a set of decision records with ServerSid
	TUid serverId = TUid::Uid(iRetrieveNum%iServerNum + 100000 + iRecordNum);
	filter = CDecisionFilter::NewLC();
	filter->SetServerSid(serverId,EEqual);
	CleanupResetAndDestroyPushL(recordList);
	INFO_PRINTF2(_L("Lookup for ServerSid=%d"),serverId.iUid);
	
	GetDecisionsL(*decisionDb, *filter, EFalse, recordList);
	CleanupStack::PopAndDestroy(2, filter);
	
	//Lookup for Fingerprint
	TBuf8<KDbMaxName>bufFP;
	CMD5* md5FP = CMD5::NewL();
	CleanupStack::PushL(md5FP);
	
	bufFP.AppendFormat(KFingerprint,iRetrieveNum);
	filter = CDecisionFilter::NewLC();
		
	filter->SetFingerprintL(md5FP->Hash(bufFP),EEqual);
	CleanupResetAndDestroyPushL(recordList);
	INFO_PRINTF1(_L("Lookup for a Fingerprint"));
	
	GetDecisionsL(*decisionDb, *filter, EFalse, recordList);
	CleanupStack::PopAndDestroy(2, filter);
	
	//Lookup for ClientEntity
	TBuf8<KDbMaxName>bufCE;
	CMD5* md5CE = CMD5::NewL();
	CleanupStack::PushL(md5CE);
	
	bufCE.AppendFormat(KClientEntity,iRetrieveNum);
	filter = CDecisionFilter::NewLC();
	
	filter->SetClientEntityL(md5CE->Hash(bufCE),EEqual);
	CleanupResetAndDestroyPushL(recordList);
	INFO_PRINTF1(_L("Lookup for a ClientEntity"));
	
	GetDecisionsL(*decisionDb, *filter, EFalse, recordList);
	CleanupStack::PopAndDestroy(2, filter);
	
	//Get a single record
	md5FP->Reset();
	md5CE->Reset();
	filter = CDecisionFilter::NewLC(clientId,evaluatorId,serviceId,serverId,md5FP->Hash(bufFP),md5CE->Hash(bufCE),2);
	
	INFO_PRINTF1(_L("Lookup for a single,unique record"));
	
	CDecisionRecord *retRecord (0); 
	retRecord = GetDecisionLC(*decisionDb,*filter);
	CleanupStack::PopAndDestroy(retRecord);
	CleanupStack::PopAndDestroy(filter);
	
	//Delete a set of records with ClientSid
	filter = CDecisionFilter::NewLC();
	filter->SetClientSid(clientId,EEqual);
	
	INFO_PRINTF2(_L("Delete a set of records where ClientSid=%d"),clientId.iUid);
	
	RemoveDecisionsL(*decisionDb,*filter);
	CleanupStack::PopAndDestroy(filter);
	
	//Delete a set of records with ServiceId
	filter = CDecisionFilter::NewLC();
	filter->SetServiceId(serviceId,EEqual);
	
	INFO_PRINTF2(_L("Delete a set of records where ServiceId=%d"),serviceId.iUid);
	
	RemoveDecisionsL(*decisionDb,*filter);
	CleanupStack::PopAndDestroy(filter);
	
	//Delete a set of records with ServerSid
	filter = CDecisionFilter::NewLC();
	filter->SetServerSid(serverId,EEqual);
	
	INFO_PRINTF2(_L("Delete a set of records where ServerSid=%d"),serverId.iUid);
	
	RemoveDecisionsL(*decisionDb,*filter);
	CleanupStack::PopAndDestroy(filter);
	
	//Insert a record
	TBuf<KDbMaxName>bufDes;
	bufDes.AppendFormat(KDescription,iRetrieveNum);
	CDecisionRecord* record = CDecisionRecord::NewLC(clientId,evaluatorId,serviceId,serverId,md5FP->Hash(bufFP),md5CE->Hash(bufCE),bufDes,1,2,0);
	
	INFO_PRINTF1(_L("Insert a decision record"));
	
	InsertRecordL(*decisionDb,*record);
	CleanupStack::PopAndDestroy(record);
	
	//Delete All Records
	INFO_PRINTF1(_L("Delete all decision records"));
	RemoveAllDecisionsL(*decisionDb, iFs);
	
	CleanupStack::PopAndDestroy(3,decisionDb);//md5FP, MD5CE & decisionDb
	
	iFile.Write(_L8("\n"));
	
    return TestStepResult();
    }
      
TVerdict CUpsDbStepPerformance::doTestStepPostambleL()
	{
	iFile.Close();
	iFs.Close();
      // Override base class virtual function
	return TestStepResult();
	}

void CUpsDbStepPerformance::PrintHeader()
	{
	iFile.Write(_L8("\"Create Database\";"));
	iFile.Write(_L8("\"Lookup with ClientSid\";"));
	iFile.Write(_L8("\"Lookup with EvaluatorId\";"));
	iFile.Write(_L8("\"Lookup with ServiceId\";"));
	iFile.Write(_L8("\"Lookup with ServerSid\";"));
	iFile.Write(_L8("\"Lookup with Fingerprint\";"));
	iFile.Write(_L8("\"Lookup with ClientEntity\";"));
	iFile.Write(_L8("\"Lookup Single Record\";"));
	iFile.Write(_L8("\"Delete with ClientSid\";"));
	iFile.Write(_L8("\"Delete with ServiceId\";"));
	iFile.Write(_L8("\"Delete with ServerSid\";"));
	iFile.Write(_L8("\"Insert A Record\";"));
	iFile.Write(_L8("\"Delete All Records\";"));
	iFile.Write(_L8("\n"));
	}