windowing/windowserver/test/t_stress/src/utils.cpp
changeset 0 5d03bc08d59c
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/windowing/windowserver/test/t_stress/src/utils.cpp	Tue Feb 02 01:47:50 2010 +0200
@@ -0,0 +1,359 @@
+// Copyright (c) 2008-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:
+//
+
+/**
+ @file
+ @test
+ @internalComponent
+*/
+  
+
+#include "utils.h"
+#include "panic.h"
+
+/*************************************************************************************
+ class TRnd
+ */
+
+/**
+Math::Rand() degenerates to approx seed*3.3+38 for the first numbers generated 
+with a low seed, which isn't very random. To illustrate: The random numbers generated 
+by the seeds {0..9} are {38, 41, 45, 48, 51, 54, 58, 61, 64, 68}.
+*/
+const TInt64 KMinSeed = 1000000000;
+
+TInt64 TRnd::iSeed = KMinSeed; // Need to change CComparison::StartL() to use this value
+
+CExecutionContext::CLogMediator* TRnd::iMediator 			= NULL;
+CExecutionContext* 				 TRnd::iExecutionContext	= NULL;
+
+TInt64 TRnd::Seed()
+	{
+	return iSeed;
+	}
+
+void TRnd::SetSeed(TInt64 aSeed)
+	{
+	iSeed = aSeed;
+	}
+
+void TRnd::SetLogMediator(CExecutionContext::CLogMediator* aMediator)
+	{
+	iMediator = aMediator;
+	}
+
+void TRnd::SetExecutionContext(CExecutionContext* aExecutionContext)
+	{
+	iExecutionContext = aExecutionContext;
+	}
+
+
+TInt TRnd::GenRand(TInt x)
+	{
+	TInt res = Math::Rand( iSeed );
+	if (x)
+		{
+		res = res % x;
+		}
+	return res;
+	}
+
+TInt TRnd::rnd(TInt x)
+	{
+	TInt res;
+	
+	switch ( iExecutionContext->ContextMode() )
+	{
+	case CExecutionContext::ECtxPlayback:	
+		res = iMediator->PlaybackInt();
+		break;
+		
+	case CExecutionContext::ECtxRandomAndRecord:
+		res = GenRand(x);
+		iMediator->RecordInt( res );
+		break;
+		
+	case CExecutionContext::ECtxRandom:		// fallthrough
+	default:
+		res = GenRand(x);
+		break;
+	}
+	
+	return res; 
+	}
+
+/*************************************************************************************
+ class CExecutionContext
+ */
+TInt CExecutionContext::CLogMediator::PlaybackInt()
+	{
+	
+	TInt res = 0;
+	
+	if ( !iStalled )
+		{
+	
+		TBool failed = ETrue;
+		
+		TBuf8<1024> logRec;
+	
+		TInt readRes;
+		
+		readRes = iLog.Read( logRec, 3 ); // 'Num'
+	
+		
+		
+		if ( readRes == KErrNone && logRec == _L8("Num") )
+			{
+			iLog.Read( logRec, 16 ); // EntryNo, 16 characters	
+			TLex8 strLex;		
+			strLex.Assign( logRec );		
+			TInt64 readVal64 = 0;		
+			readRes = strLex.Val( readVal64, EDecimal );		
+			if ( KErrNone == readRes && readVal64 == iEntryNo )
+				{
+							
+				readRes = iLog.Read( logRec, 3 ); // ' = '
+				
+				if ( readRes == KErrNone && logRec == _L8(" = ")  )
+					{
+	
+					readRes = iLog.Read( logRec, 13 ); // value 12 + eol
+					strLex.Assign( logRec );		
+					
+					TUint32 readVal32;
+	
+					readRes = strLex.Val( readVal32, EDecimal );		
+					
+					if ( KErrNone == readRes )
+						{  // finally we got a number
+						
+						res = (TInt) readVal32;
+						
+						failed = EFalse;
+						}
+					
+					}							
+				}
+			
+			}
+		
+		if ( failed )
+			{
+			iExecutionContext.MediatorEmptied( this );
+			res = 0;
+			iStalled = ETrue;
+			}
+		
+		}
+	
+	iEntryNo++;
+	
+	return res;
+	}
+
+void CExecutionContext::CLogMediator::RecordInt(TInt aIntToBeRecorded)
+	{
+	if ( !iStalled )
+		{
+		TBuf8<1024> logRec;
+		logRec.Format( _L8("Num%016Ld = %012d\n"), iEntryNo, aIntToBeRecorded );
+		iLog.Write( logRec );	
+		}
+	
+	iEntryNo++;
+	}
+
+CExecutionContext::CLogMediator::CLogMediator(CExecutionContext&	aExecutionContext):
+	iExecutionContext( aExecutionContext )
+	{ }
+
+CExecutionContext::CLogMediator::~CLogMediator()
+	{
+	iLog.Close();
+	iExecutionContext.MediatorDestroyed ( this );
+	}
+
+void CExecutionContext::CLogMediator::ConstructL( RFs& aFs, const TDesC& aFileName )
+	{
+	TInt fileErr;
+	
+	switch ( iExecutionContext.ContextMode() )
+	{
+	case CExecutionContext::ECtxPlayback:
+		fileErr = iLog.Open( aFs, aFileName, EFileRead );
+		break;
+	
+	case CExecutionContext::ECtxRandomAndRecord:
+		fileErr = iLog.Create( aFs, aFileName, EFileWrite );
+		if(fileErr == KErrAlreadyExists)
+			{
+			fileErr = iLog.Replace( aFs, aFileName, EFileWrite );		
+			}
+		else if(fileErr == KErrPathNotFound)
+			{
+			User::LeaveIfError(aFs.CreatePrivatePath(EDriveC));
+			fileErr = iLog.Create( aFs, aFileName, EFileWrite );
+			}
+		__ASSERT_ALWAYS(KErrNone == fileErr, User::Panic(_L("t_stress utils.cpp"), EPanic2));
+		break;
+	
+	default:										
+		fileErr = KErrGeneral;
+		break;
+	}
+	
+	User::LeaveIfError( fileErr );
+	
+	}
+		
+CExecutionContext::CLogMediator* CExecutionContext::CLogMediator::NewLC(CExecutionContext& aExecutionContext, RFs& aFs, const TDesC& aFileName )
+	{
+	CExecutionContext::CLogMediator* self = new (ELeave) CExecutionContext::CLogMediator( aExecutionContext );
+	CleanupStack::PushL ( self );
+	self->ConstructL( aFs, aFileName );
+	return self; 
+	}
+		
+CExecutionContext* CExecutionContext::NewL(CExecutionContext::TExecutionMode aExecutionMode, CTestExecWatchCat&	aWatchCat)
+	{
+	CExecutionContext* self = new (ELeave) CExecutionContext( aExecutionMode, aWatchCat );
+	CleanupStack::PushL ( self );
+	self->ConstructL( );
+	CleanupStack::Pop( self );
+	return self;
+	}
+	
+CExecutionContext::TExecutionMode CExecutionContext::ContextMode()
+	{
+	return iContextMode;
+	}
+
+CExecutionContext::CLogMediator&	CExecutionContext::CreateLogMediatorL(const TDesC& aLogName)
+	{
+	CExecutionContext::CLogMediator* mediator = CExecutionContext::CLogMediator::NewLC( *this, iFs, aLogName );
+	iMediators.AppendL( mediator );
+	CleanupStack::Pop(mediator);
+	return *mediator;
+	}
+
+void CExecutionContext::MediatorDestroyed(CLogMediator* aMediator)
+	{
+	TInt pos = iMediators.Find( aMediator );
+	iMediators.Remove ( pos );
+	}
+
+void CExecutionContext::MediatorEmptied(CLogMediator* aMediator)
+	{
+	(void)aMediator;
+	iWatchCat.ExecutionContextRunOut( this );
+	}
+
+
+void CExecutionContext::ConstructL()
+	{
+	TInt conResult = iFs.Connect();
+	User::LeaveIfError( conResult );	
+	}
+	
+
+CExecutionContext::CExecutionContext(CExecutionContext::TExecutionMode aExecutionMode, CTestExecWatchCat&	aWatchCat):
+	iWatchCat(aWatchCat),
+	iContextMode(aExecutionMode)
+	{ } // empty
+
+CExecutionContext::~CExecutionContext()
+	{
+	while ( iMediators.Count() > 0 )
+		{
+			delete iMediators[0]; // this will remove the mediator from the list
+		}
+	
+	iMediators.Close();
+	iFs.Close();
+	}
+
+/*************************************************************************************
+ class CTestExecWatchCat
+ */
+CTestExecWatchCat* CTestExecWatchCat::NewL(CExecutionContext::TExecutionMode aExecutionMode)
+	{
+	CTestExecWatchCat* self = new (ELeave) CTestExecWatchCat();
+	CleanupStack::PushL( self );	
+	self->ConstructL( aExecutionMode );
+	
+	// finally hook into TRnd
+	TRnd::SetExecutionContext(self->iExecutionContext);
+	
+	CleanupStack::Pop(self); 
+	return self;
+	}
+
+void CTestExecWatchCat::ConstructL( CExecutionContext::TExecutionMode aExecutionMode )
+	{
+	iExecutionContext = CExecutionContext::NewL( aExecutionMode, *this );
+	}
+
+
+CTestExecWatchCat::CTestExecWatchCat()
+	{ } // empty
+
+CTestExecWatchCat::~CTestExecWatchCat()
+	{
+	delete iExecutionContext;
+	}
+	
+void CTestExecWatchCat::ExecutionContextRunOut(CExecutionContext* /*aContext*/)
+	{ }
+
+/**
+ Sets the path where the logging file will be created, then constructs the mediator
+ */
+void CTestExecWatchCat::SetLoggingPathL(const TDesC& aPath)
+	{
+	RBuf path;
+	path.CleanupClosePushL();
+	path.CreateL(aPath.Length() + 16);
+	if (aPath.Length())
+		{
+		path.Copy(aPath);
+		if (aPath[aPath.Length()-1] != '\\')
+			{
+			path.Append('\\');
+			}
+		}
+	path.Append(KLogFileName);
+	// now construct log mediator
+	CExecutionContext::CLogMediator& mediator = iExecutionContext->CreateLogMediatorL( path );
+	TRnd::SetLogMediator(&mediator);
+	CleanupStack::PopAndDestroy(&path);
+	}
+
+/*************************************************************************************
+ class TTickUtils
+ */
+TUint32 TTickUtils::CalcTickDelta(TUint32 tick1, TUint32 tick2)
+	{
+	TInt32 res;
+	if ( tick1 > tick2 )
+		{
+		res = tick1 - tick2;
+		}
+	else
+		{
+		res = tick2 - tick1;		
+		}
+	return res;
+	}