searcher/searchserver/inc/searchservertesting.h
changeset 0 671dee74050a
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/searcher/searchserver/inc/searchservertesting.h	Mon Apr 19 14:40:16 2010 +0300
@@ -0,0 +1,278 @@
+/*
+* 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: 
+*
+*/
+
+#ifndef SEARCHSERVERTESTING_H_
+#define SEARCHSERVERTESTING_H_
+
+#include "SearchServerConfiguration.h"
+#include <indevicecfg.h>
+#include <e32base.h>
+#include <e32cmn.h>
+#include <f32file.h>
+
+#ifdef PROVIDE_TESTING_UTILITY
+
+class TPerformanceRecord
+{
+public: 
+	
+	TPerformanceRecord();
+
+	void ToStringL( TDes& aString, const TDesC& aUnit, TInt aScale );
+	
+	void Record( TInt aValue );
+
+	void Record( TPerformanceRecord& aRecord );
+
+	TInt iMinimum;
+	TReal iAverage;
+	/** Estimation for variance. Not statistically correct variance. */
+	TReal iVarEst;
+	TInt iPeak;
+	TInt iSampleCount;
+};
+
+
+class MemoryRecorder 
+	{
+public: // Constructors & Destructors
+
+	static MemoryRecorder* NewL(); 
+
+	~MemoryRecorder();
+
+private:
+
+	MemoryRecorder();
+
+	void ConstructL();
+	
+public: // API 
+
+	void StartL( TInt aRecordingIntervalMs );
+
+	TBool IsActive(); 
+	
+	TPerformanceRecord* Finish();
+	
+private: // Internal
+
+	void Record();
+	
+	void Work();
+	
+	static TInt ThreadFunction(void *aThis);
+	
+private: // state 
+
+	RSemaphore iSemaphore; 
+	
+	RThread iWorkerThread; 
+	
+	TBool iAbandon; 
+	
+	TPerformanceRecord* iRecord; 
+	
+	TInt iIntervalMs;
+	
+private: // InstanceCount
+	
+	static TInt iInstances; 
+	}; 
+
+
+
+#ifdef LOG_PERIODIC_MEMORY_USAGE
+
+const TInt KMemoryLoggingIntervalMs = 3 * 1000; 
+
+class CMemoryLogger : public CBase 
+	{
+public: // Constructors & destructors
+	
+	CMemoryLogger();
+
+	~CMemoryLogger();
+	
+public: // API 
+	
+	void StartL();
+
+	void Stop();
+	
+private: // Internal 
+	
+	void RunL();
+
+	static TInt RunThisL(void *aThis);
+
+private: // State 
+	
+	CPeriodic* iPeriodic;
+	
+	RMemoryRecorder* iRecorder;
+	
+	};
+
+#endif // LOG_PERIODIC_MEMORY_USAGE
+
+#endif // RECORD_MEMORY_USAGE
+
+
+#ifdef LOG_EXECUTION_MEMORY_USAGE
+
+#define RECORDED_EXECUTION_MEMORY_USAGE_BEGIN 			  	   	\
+	{ 													  		\
+	RMemoryRecorder* memoryRecorder_ = RMemoryRecorder::NewL(); \
+	CleanupClosePushL( *memoryRecorder_ ); 					  	\
+	memoryRecorder_->StartL( 1 ); 
+
+#define RECORDED_EXECUTION_MEMORY_USAGE_END(x)   	  \
+	TPerformanceRecord* r = memoryRecorder_->Finish(); 	  \
+	CleanupStack::PopAndDestroy( memoryRecorder_ );  \
+	CSearchServerTesting::Instance()->FunctionEntry( _L( x ) ).iMemory.Record( *r ); \
+	delete r; 										 \
+	}												  
+
+#else // LOG_EXECUTION_MEMORY_USAGE
+
+#define RECORDED_EXECUTION_MEMORY_USAGE_BEGIN
+#define RECORDED_EXECUTION_MEMORY_USAGE_END(x) 
+
+#endif // LOG_EXECUTION_MEMORY_USAGE
+
+#ifdef LOG_EXECUTION_TIMES
+
+#define RECORDED_EXECUTION_TIME_BEGIN				  \
+	{											  \
+	int beginMs_ = User::NTickCount(); 				  
+
+#define RECORDED_EXECUTION_TIME_END(x)				  \
+	int endMs_ = User::NTickCount(); 				  \
+	CSearchServerTesting::Instance()->FunctionEntry( _L( x ) ).iTime.Record( endMs_ - beginMs_ ); \
+	}
+
+#else // LOG_EXECUTION_PERFORMANCE_TIME
+
+#define RECORDED_EXECUTION_TIME_BEGIN
+#define RECORDED_EXECUTION_TIME_END(x)
+
+#endif // LOG_EXECUTION_PERFORMANCE_TIME
+
+//
+// NOTE: Watch, when you use these macros !
+// They are most approriate in the beginning of block and in the end of one 
+// 
+
+#define RECORDED_EXECUTION_BEGIN RECORDED_EXECUTION_MEMORY_USAGE_BEGIN \
+ 								 RECORDED_EXECUTION_TIME_BEGIN 
+
+#define RECORDED_EXECUTION_END(x) RECORDED_EXECUTION_TIME_END(x) \
+								  RECORDED_EXECUTION_MEMORY_USAGE_END(x)
+
+
+#ifdef PROVIDE_TESTING_UTILITY
+
+class TFunctionPerformanceEntry 
+	{
+public: 
+	TFunctionPerformanceEntry( const TDesC& aId ); 
+public:
+	
+	TBuf<32> iId; 
+	TPerformanceRecord iMemory; 
+	TPerformanceRecord iTime; 
+	};
+
+_LIT( KShutdownSignalFile, 			CPIX_INDEVICE_SERVERIO L"\\shutdown.txt" );
+_LIT( KStartRecordingSignalFile, 	CPIX_INDEVICE_SERVERIO L"\\start_recording.txt" );
+_LIT( KStopRecordingSignalFile, 	CPIX_INDEVICE_SERVERIO L"\\stop_recording.txt" );
+_LIT( KDumpRecordSignalFile, 		CPIX_INDEVICE_SERVERIO L"\\dump_record.txt" );
+_LIT( KServerRecordFile, 			CPIX_INDEVICE_SERVERIO L"\\record.csv" );
+
+const TInt TSignalCheckIntervalMs = 500; 
+const TInt KMemoryRecordingIntervalMs = 50; 
+
+class CSearchServer; 
+
+class CSearchServerTesting : public CBase
+	{
+public: 
+
+	static CSearchServerTesting* Instance(); 
+	
+	/**
+	 * Registers oneself automatically as an instance
+	 */
+	CSearchServerTesting(); 
+	
+	void ConstructL(); 
+
+	/**
+	 * Cleans the instance reference
+	 */
+	~CSearchServerTesting(); 
+	
+	void SetServer( CSearchServer* aServer );
+	
+public:
+
+	void Reset(); 
+	
+	TFunctionPerformanceEntry & FunctionEntry( const TDesC& aEntry );
+	
+public: 
+	
+	void StartL();
+
+	void Stop();
+	
+protected: // Internal 
+	
+	void RunL();
+	
+	static TInt RunThisL(void *aThis);
+
+private: // Functionality
+	
+	void ShutdownL(); 
+	
+	void StartRecordingL(); 
+
+	void StopRecording(); 
+	
+	void DumpRecordL(); 
+
+private: 
+	
+	MemoryRecorder* iRecorder;
+
+	CSearchServer* iServer;
+	
+	CPeriodic* iPeriodic;
+	
+	RArray<TFunctionPerformanceEntry > iEntries; 
+	
+	RFs iFs;
+	
+	static CSearchServerTesting* iInstance; 
+	
+	};
+
+#endif // PROVIDE_TESTING_UTILITY
+
+#endif /*SEARCHSERVERTESTING_H_*/