os/mm/mmlibs/mmfw/tsrc/mmfunittest/videorenderer/src/testgceharness.cpp
author sl@SLION-WIN7.fritz.box
Fri, 15 Jun 2012 03:10:57 +0200
changeset 0 bde4ae8d615e
permissions -rw-r--r--
First public contribution.
sl@0
     1
// Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
sl@0
     2
// All rights reserved.
sl@0
     3
// This component and the accompanying materials are made available
sl@0
     4
// under the terms of "Eclipse Public License v1.0"
sl@0
     5
// which accompanies this distribution, and is available
sl@0
     6
// at the URL "http://www.eclipse.org/legal/epl-v10.html".
sl@0
     7
//
sl@0
     8
// Initial Contributors:
sl@0
     9
// Nokia Corporation - initial contribution.
sl@0
    10
//
sl@0
    11
// Contributors:
sl@0
    12
//
sl@0
    13
// Description:
sl@0
    14
//
sl@0
    15
sl@0
    16
#include "testgceharness.h"
sl@0
    17
sl@0
    18
static TAny* globalGCEHarness = NULL;
sl@0
    19
sl@0
    20
CTestGCEHarness* CTestGCEHarness::NewL(TInt aNumBuffers)
sl@0
    21
	{
sl@0
    22
	CTestGCEHarness* self = static_cast <CTestGCEHarness*>(globalGCEHarness);
sl@0
    23
	if(!self)
sl@0
    24
		{
sl@0
    25
		self = new (ELeave) CTestGCEHarness;
sl@0
    26
		CleanupStack::PushL(self);
sl@0
    27
		self->ConstructL(aNumBuffers);
sl@0
    28
		globalGCEHarness = self;
sl@0
    29
		CleanupStack::Pop(self);
sl@0
    30
		}
sl@0
    31
	return self;
sl@0
    32
	}
sl@0
    33
sl@0
    34
void CTestGCEHarness::Remove()
sl@0
    35
	{
sl@0
    36
	CTestGCEHarness* self = static_cast <CTestGCEHarness*>(globalGCEHarness);
sl@0
    37
	if(self)
sl@0
    38
		{
sl@0
    39
		delete self;
sl@0
    40
		globalGCEHarness = NULL;
sl@0
    41
		}
sl@0
    42
	}
sl@0
    43
sl@0
    44
/* Use with care. Will leak memory if use inappropriately. Only use if objected pointed to has been
sl@0
    45
 * deleted ro otherwise removed. Required for panic testing where pointer is left hanging when thread
sl@0
    46
 * terminates.
sl@0
    47
 */
sl@0
    48
void CTestGCEHarness::ResetGlobalPointer()
sl@0
    49
	{
sl@0
    50
	globalGCEHarness = NULL;
sl@0
    51
	}
sl@0
    52
sl@0
    53
void CTestGCEHarness::SetBufferEventProcessingDelay(TRendererEvent aEventType, TTimeIntervalMicroSeconds32 aDelay)
sl@0
    54
	{
sl@0
    55
	CTestGCEHarness* self = static_cast <CTestGCEHarness*>(globalGCEHarness);
sl@0
    56
	if(!self)
sl@0
    57
		{
sl@0
    58
		return;
sl@0
    59
		}
sl@0
    60
	
sl@0
    61
	TInt count = self->iUpdateArray.Count();
sl@0
    62
	if(count == 0)
sl@0
    63
		{
sl@0
    64
		return;
sl@0
    65
		}
sl@0
    66
	
sl@0
    67
	// Get current value of buffers.
sl@0
    68
	// Processing delays are for all buffers. This function will need to change
sl@0
    69
	// if delays are to be set on a per buffer basis.
sl@0
    70
	TTimeIntervalMicroSeconds32 displayDelay = self->iUpdateArray[0].iDisplayedProcessingDelay;
sl@0
    71
	TTimeIntervalMicroSeconds32 availableDelay = self->iUpdateArray[0].iAvailableProcessingDelay;
sl@0
    72
sl@0
    73
	// set new values for delay
sl@0
    74
	if(aEventType == EEventDisplayed || aEventType == EEventAll)
sl@0
    75
		{
sl@0
    76
		displayDelay = aDelay;
sl@0
    77
		}
sl@0
    78
	
sl@0
    79
	if(aEventType == EEventAvailable || aEventType == EEventAll)
sl@0
    80
		{
sl@0
    81
		availableDelay = aDelay;
sl@0
    82
		}
sl@0
    83
sl@0
    84
	for(TInt i=0; i < count; i++)
sl@0
    85
		{
sl@0
    86
		self->iUpdateArray[i].iDisplayedProcessingDelay = displayDelay;
sl@0
    87
		self->iUpdateArray[i].iAvailableProcessingDelay = availableDelay;
sl@0
    88
		}
sl@0
    89
	}
sl@0
    90
sl@0
    91
/*
sl@0
    92
 * Use with care. It results in a reset of the harness on the next
sl@0
    93
 * call to RetrieveL(). This is necessary when the Video Renderer is in timed mode. i.e.
sl@0
    94
 * The thread that creates an AO must also delete it. 
sl@0
    95
 */
sl@0
    96
void CTestGCEHarness::ResetBuffersL(TInt aNumBuffers)
sl@0
    97
	{
sl@0
    98
	CTestGCEHarness* self = static_cast <CTestGCEHarness*>(globalGCEHarness);
sl@0
    99
	if(!self)
sl@0
   100
		{
sl@0
   101
		User::Leave(KErrNotReady);
sl@0
   102
		}
sl@0
   103
	
sl@0
   104
	self->iResetBuffers = aNumBuffers;
sl@0
   105
	}
sl@0
   106
sl@0
   107
CTestGCEHarness* CTestGCEHarness::RetrieveL()
sl@0
   108
	{
sl@0
   109
	CTestGCEHarness* self = static_cast <CTestGCEHarness*>(globalGCEHarness);
sl@0
   110
	if(!self)
sl@0
   111
		{
sl@0
   112
		User::Leave(KErrNotReady);
sl@0
   113
		}
sl@0
   114
	
sl@0
   115
	// This code is necessary for the replace tests as the timer active objects must be
sl@0
   116
	// created and deleted in the same thread, which is not always the test thread. When the
sl@0
   117
	// Video Renderer is in timed mode the thread the harness is executed in is not
sl@0
   118
	// the same as the test thread.
sl@0
   119
	if(self->iResetBuffers)
sl@0
   120
		{
sl@0
   121
		TInt buffers = self->iResetBuffers;
sl@0
   122
		self->Close(); // resets self->iResetBuffers
sl@0
   123
		self->ConstructL(buffers);
sl@0
   124
		self->Connect();
sl@0
   125
		}
sl@0
   126
	return self;
sl@0
   127
	}
sl@0
   128
sl@0
   129
TInt CTestGCEHarness::Connect()
sl@0
   130
	{
sl@0
   131
	CTestGCEHarness* self = static_cast <CTestGCEHarness*>(globalGCEHarness);
sl@0
   132
	if(!self)
sl@0
   133
		{
sl@0
   134
		return KErrNotReady;
sl@0
   135
		}
sl@0
   136
	
sl@0
   137
	TInt count = self->iUpdateArray.Count();
sl@0
   138
	for(TInt i=0; i < count; i++)
sl@0
   139
		{
sl@0
   140
		if(self->iUpdateArray[i].iAvailableTimer == NULL)
sl@0
   141
			{
sl@0
   142
			self->iUpdateArray[i].iAvailableTimer = CTestTimer::NewL(*self, i, EEventAvailable);
sl@0
   143
			}
sl@0
   144
		if(self->iUpdateArray[i].iDisplayedTimer == NULL)
sl@0
   145
			{
sl@0
   146
			self->iUpdateArray[i].iDisplayedTimer = CTestTimer::NewL(*self, i, EEventDisplayed);
sl@0
   147
			}
sl@0
   148
		}
sl@0
   149
	return KErrNone;
sl@0
   150
	}
sl@0
   151
sl@0
   152
void CTestGCEHarness::Close()
sl@0
   153
	{
sl@0
   154
	CTestGCEHarness* self = static_cast <CTestGCEHarness*>(globalGCEHarness);
sl@0
   155
	if(!self)
sl@0
   156
		{
sl@0
   157
		return;
sl@0
   158
		}
sl@0
   159
	
sl@0
   160
	TInt count = self->iUpdateArray.Count();
sl@0
   161
	for(TInt i=0; i < count; i++)
sl@0
   162
		{
sl@0
   163
		if(self->iUpdateArray[i].iAvailableTimer != NULL)
sl@0
   164
			{
sl@0
   165
			self->iUpdateArray[i].iAvailableTimer->Cancel();
sl@0
   166
			delete self->iUpdateArray[i].iAvailableTimer;
sl@0
   167
			self->iUpdateArray[i].iAvailableTimer = NULL;
sl@0
   168
			}
sl@0
   169
		if(self->iUpdateArray[i].iDisplayedTimer != NULL)
sl@0
   170
			{
sl@0
   171
			self->iUpdateArray[i].iDisplayedTimer->Cancel();
sl@0
   172
			delete self->iUpdateArray[i].iDisplayedTimer;
sl@0
   173
			self->iUpdateArray[i].iDisplayedTimer = NULL;
sl@0
   174
			}
sl@0
   175
		}
sl@0
   176
	self->iUpdateArray.Reset();
sl@0
   177
	self->iLastPosted = -1;
sl@0
   178
	self->iResetBuffers = 0;
sl@0
   179
	}
sl@0
   180
sl@0
   181
void CTestGCEHarness::CancelAllNotifications()
sl@0
   182
	{
sl@0
   183
	CTestGCEHarness* self = static_cast <CTestGCEHarness*>(globalGCEHarness);
sl@0
   184
	if(!self)
sl@0
   185
		{
sl@0
   186
		return;
sl@0
   187
		}
sl@0
   188
	
sl@0
   189
	if(self->iStatusDisplayed)
sl@0
   190
		{
sl@0
   191
		User::RequestComplete(self->iStatusDisplayed, KErrCancel);
sl@0
   192
		self->iStatusDisplayed = NULL;
sl@0
   193
		}
sl@0
   194
	
sl@0
   195
	TInt count = self->iUpdateArray.Count();
sl@0
   196
	for(TInt i=0; i < count; i++)
sl@0
   197
		{
sl@0
   198
		if(self->iUpdateArray[i].iAvailableTimer != NULL)
sl@0
   199
			{
sl@0
   200
			self->iUpdateArray[i].iAvailableTimer->Cancel();
sl@0
   201
			}
sl@0
   202
		if(self->iUpdateArray[i].iDisplayedTimer != NULL)
sl@0
   203
			{
sl@0
   204
			self->iUpdateArray[i].iDisplayedTimer->Cancel();
sl@0
   205
			}
sl@0
   206
		if(self->iUpdateArray[i].iStatusAvailable)
sl@0
   207
			{
sl@0
   208
			User::RequestComplete(self->iUpdateArray[i].iStatusAvailable, KErrCancel);
sl@0
   209
			self->iUpdateArray[i].iStatusAvailable = NULL;
sl@0
   210
			}
sl@0
   211
		}
sl@0
   212
	}
sl@0
   213
sl@0
   214
CTestGCEHarness::CTestGCEHarness()
sl@0
   215
: iLastPosted(-1)
sl@0
   216
	{
sl@0
   217
	}
sl@0
   218
sl@0
   219
CTestGCEHarness::~CTestGCEHarness()
sl@0
   220
	{
sl@0
   221
	iUpdateArray.Close();
sl@0
   222
	}
sl@0
   223
sl@0
   224
void CTestGCEHarness::ConstructL(TInt aNumBuffers)
sl@0
   225
	{
sl@0
   226
	TBufferUpdateData data;
sl@0
   227
	for(TInt i=0; i < aNumBuffers; i++)
sl@0
   228
		{
sl@0
   229
		iUpdateArray.AppendL(data);
sl@0
   230
		iUpdateArray[i].iAvailableProcessingDelay = KDefaultAvailableProcessingDelay;
sl@0
   231
		iUpdateArray[i].iDisplayedProcessingDelay = KDefaultDisplayedProcessingDelay;
sl@0
   232
		iUpdateArray[i].iDisplayedCompleteReason = KErrNone;
sl@0
   233
		iUpdateArray[i].iAvailableCompleteReason = KErrNone;
sl@0
   234
		iUpdateArray[i].iDisplayedInProgress = EFalse;
sl@0
   235
		iUpdateArray[i].iAvailableInProgress = EFalse;
sl@0
   236
		iUpdateArray[i].iAvailableTimer = NULL;
sl@0
   237
		iUpdateArray[i].iDisplayedTimer = NULL;
sl@0
   238
		iUpdateArray[i].iStatusAvailable = NULL;
sl@0
   239
		}
sl@0
   240
	}
sl@0
   241
sl@0
   242
TInt CTestGCEHarness::SubmitUpdate(TInt aBuffer)
sl@0
   243
	{
sl@0
   244
	if(aBuffer < 0 || aBuffer > iUpdateArray.Count()-1)
sl@0
   245
		{
sl@0
   246
		return KErrArgument;
sl@0
   247
		}
sl@0
   248
	
sl@0
   249
	if(iUpdateArray[aBuffer].iDisplayedInProgress || iUpdateArray[aBuffer].iAvailableInProgress)
sl@0
   250
		{
sl@0
   251
		return KErrInUse;
sl@0
   252
		}
sl@0
   253
sl@0
   254
	iUpdateArray[aBuffer].iDisplayedTimer->After(iUpdateArray[aBuffer].iDisplayedProcessingDelay);
sl@0
   255
	iUpdateArray[aBuffer].iDisplayedInProgress = ETrue;
sl@0
   256
	
sl@0
   257
	iUpdateArray[aBuffer].iStatusAvailable = iStatusAvailable;
sl@0
   258
	iStatusAvailable = NULL;
sl@0
   259
	
sl@0
   260
	if(iUpdateArray.Count() == 1)
sl@0
   261
		{
sl@0
   262
		// set off available timer - this buffer
sl@0
   263
		iUpdateArray[aBuffer].iAvailableTimer->After(iUpdateArray[aBuffer].iAvailableProcessingDelay);
sl@0
   264
		iUpdateArray[aBuffer].iAvailableInProgress = ETrue;
sl@0
   265
		}
sl@0
   266
	else if(iLastPosted > -1)
sl@0
   267
		{
sl@0
   268
		// set off available timer for iLastPosted
sl@0
   269
		iUpdateArray[iLastPosted].iAvailableTimer->After(iUpdateArray[iLastPosted].iAvailableProcessingDelay);
sl@0
   270
		iUpdateArray[iLastPosted].iAvailableInProgress = ETrue;
sl@0
   271
		// set last posted to this buffer so that it is kicked off on next submit
sl@0
   272
		iLastPosted = aBuffer;
sl@0
   273
		}
sl@0
   274
	else
sl@0
   275
		{
sl@0
   276
		iLastPosted = aBuffer;
sl@0
   277
		}
sl@0
   278
sl@0
   279
	return KErrNone;
sl@0
   280
	}
sl@0
   281
sl@0
   282
void CTestGCEHarness::NotifyWhenAvailable(TRequestStatus& aStatus)
sl@0
   283
	{
sl@0
   284
	iStatusAvailable = &aStatus;
sl@0
   285
	*iStatusAvailable = KRequestPending;
sl@0
   286
	}
sl@0
   287
sl@0
   288
void CTestGCEHarness::NotifyWhenDisplayed(TRequestStatus& aStatus, TTimeStamp& aTimeStamp)
sl@0
   289
	{
sl@0
   290
	iStatusDisplayed = &aStatus;
sl@0
   291
	iTimeStamp = &aTimeStamp;
sl@0
   292
	*iStatusDisplayed = KRequestPending;
sl@0
   293
	}
sl@0
   294
sl@0
   295
void CTestGCEHarness::OnTimer(TInt aBufferId, TRendererEvent aEvent)
sl@0
   296
	{
sl@0
   297
	if(aEvent == EEventDisplayed)
sl@0
   298
		{
sl@0
   299
		iUpdateArray[aBufferId].iDisplayedInProgress = EFalse;
sl@0
   300
		if(iStatusDisplayed)
sl@0
   301
			{
sl@0
   302
			*iTimeStamp = User::FastCounter();
sl@0
   303
			User::RequestComplete(iStatusDisplayed, iUpdateArray[aBufferId].iDisplayedCompleteReason);
sl@0
   304
			iTimeStamp = NULL;
sl@0
   305
			iStatusDisplayed = NULL;
sl@0
   306
			}
sl@0
   307
		}
sl@0
   308
	else if(aEvent == EEventAvailable)
sl@0
   309
		{
sl@0
   310
		iUpdateArray[aBufferId].iAvailableInProgress = EFalse;
sl@0
   311
		if(iUpdateArray[aBufferId].iStatusAvailable)
sl@0
   312
			{
sl@0
   313
			User::RequestComplete(iUpdateArray[aBufferId].iStatusAvailable, iUpdateArray[aBufferId].iAvailableCompleteReason);
sl@0
   314
			iUpdateArray[aBufferId].iStatusAvailable = NULL;
sl@0
   315
			}
sl@0
   316
		}
sl@0
   317
	}
sl@0
   318
sl@0
   319
CTestGCEHarness::CTestTimer*
sl@0
   320
CTestGCEHarness::CTestTimer::NewL(CTestGCEHarness& aContainer, TInt aBufferId, TRendererEvent aEvent)
sl@0
   321
	{
sl@0
   322
	CTestTimer* self = new(ELeave)CTestTimer(aContainer, aBufferId, aEvent);
sl@0
   323
 	CleanupStack::PushL(self);
sl@0
   324
 	self->ConstructL();
sl@0
   325
 	CleanupStack::Pop();
sl@0
   326
 	return self;
sl@0
   327
 	}
sl@0
   328
sl@0
   329