sl@0: // Copyright (c) 2007-2009 Nokia Corporation and/or its subsidiary(-ies). sl@0: // All rights reserved. sl@0: // This component and the accompanying materials are made available sl@0: // under the terms of "Eclipse Public License v1.0" sl@0: // which accompanies this distribution, and is available sl@0: // at the URL "http://www.eclipse.org/legal/epl-v10.html". sl@0: // sl@0: // Initial Contributors: sl@0: // Nokia Corporation - initial contribution. sl@0: // sl@0: // Contributors: sl@0: // sl@0: // Description: sl@0: // sl@0: sl@0: #include "testrendererneg.h" sl@0: #include "videoframebuffer.h" sl@0: #include "resourcefilereader.h" sl@0: #include "testgceharness.h" sl@0: sl@0: RTestRendererCreateSurfaceStep* RTestRendererCreateSurfaceStep::NewL(const TDesC& aStepName, sl@0: TInt aExpectedError, sl@0: TRgbFormat aRgbFormat, sl@0: TSize aSize, sl@0: TInt aNumBuffers) sl@0: { sl@0: RTestRendererCreateSurfaceStep* self = new (ELeave) RTestRendererCreateSurfaceStep(aStepName, sl@0: aExpectedError, sl@0: aRgbFormat, sl@0: aSize, sl@0: aNumBuffers); sl@0: return self; sl@0: } sl@0: sl@0: RTestRendererCreateSurfaceStep::RTestRendererCreateSurfaceStep(const TDesC& aStepName, sl@0: TInt aExpectedError, sl@0: TRgbFormat aRgbFormat, sl@0: TSize aSize, sl@0: TInt aNumBuffers) : sl@0: RTestRendererStep(aStepName, EFalse), sl@0: iExpectedError(aExpectedError), sl@0: iNumBuffers(aNumBuffers) sl@0: { sl@0: iVideoFormat.iRgbFormat = aRgbFormat; sl@0: iSize = aSize; sl@0: } sl@0: sl@0: TVerdict RTestRendererCreateSurfaceStep::DoTestStepL() sl@0: { sl@0: __UHEAP_MARK; sl@0: sl@0: CTestGCEHarness::NewL(iNumBuffers); sl@0: iVideoRenderer = CVideoRenderer::NewL(*this, iTimed); sl@0: TRAPD(err, iVideoRenderer->CreateSurfaceL(iSize, iNumBuffers, iVideoFormat, iSurfaceId)); sl@0: INFO_PRINTF3(_L("Expected error code=%d, received error code=%d"), iExpectedError, err); sl@0: TESTL(err == iExpectedError); sl@0: sl@0: delete iVideoRenderer; sl@0: iVideoRenderer = NULL; sl@0: sl@0: // cleanup test harness sl@0: CTestGCEHarness::Remove(); sl@0: sl@0: __UHEAP_MARKEND; sl@0: sl@0: return iTestStepResult; sl@0: } sl@0: sl@0: sl@0: RTestRendererUpdateTwiceStep* RTestRendererUpdateTwiceStep::NewL(const TDesC& aStepName, TBool aTimed) sl@0: { sl@0: RTestRendererUpdateTwiceStep* self = new (ELeave) RTestRendererUpdateTwiceStep(aStepName, aTimed); sl@0: return self; sl@0: } sl@0: sl@0: RTestRendererUpdateTwiceStep::RTestRendererUpdateTwiceStep(const TDesC& aStepName, TBool aTimed) : sl@0: RTestRendererStep(aStepName, aTimed) sl@0: { sl@0: } sl@0: sl@0: void RTestRendererUpdateTwiceStep::FsmL(TTestRendererEvents aEventCode) sl@0: { sl@0: switch (aEventCode) sl@0: { sl@0: case EStartTest: sl@0: iFsmState = EStateCreate; sl@0: CreateRendererAndSurfaceL(1); sl@0: break; sl@0: case EBufferAvailable: sl@0: iBuffAvailCallback++; sl@0: if (iFsmState == EStateCreate && iBuffAvailCallback == 1) sl@0: { sl@0: iFsmState = EStateUpdate; sl@0: sl@0: // received the first callback, map surface to display sl@0: TInt err = SetBackgroundSurface(iSurfaceId); sl@0: if (err != KErrNone) sl@0: { sl@0: ERR_PRINTF2(_L("RWindow::SetBackgroundSurface() returned %d"), err); sl@0: iTestStepResult = EFail; sl@0: break; sl@0: } sl@0: sl@0: // send the first buffer sl@0: TTime presentationTime(0); sl@0: sl@0: INFO_PRINTF1(_L("iVideoRenderer->NextBuffer()")); sl@0: TVideoFrameBuffer* buffer; sl@0: buffer = iVideoRenderer->NextBuffer(); sl@0: TESTL(buffer != NULL); sl@0: TESTL(buffer->BufferId() == 0); sl@0: sl@0: TInt bufSize = buffer->Stride() * iSize.iHeight; sl@0: Mem::Fill(buffer->Buffer(), bufSize, KRgbGreen.Internal()); sl@0: INFO_PRINTF1(_L("iVideoRenderer->UpdateBuffer()")); sl@0: iVideoRenderer->UpdateBuffer(buffer, presentationTime); sl@0: sl@0: // send the same buffer again sl@0: TESTL(buffer != NULL); sl@0: TESTL(buffer->BufferId() == 0); sl@0: iVideoRenderer->UpdateBuffer(buffer, presentationTime); sl@0: } sl@0: else if (iFsmState == EStateUpdate) sl@0: { sl@0: // buffer is available again after update sl@0: if (iBuffAvailCallback == 2 && iBuffDisplayCallback == 1) sl@0: { sl@0: // all available callback and display callback have been received, complete test with pass sl@0: EndTest(EPass); sl@0: } sl@0: } sl@0: else sl@0: { sl@0: // unexpected state, fail test sl@0: ERR_PRINTF2(_L("State %d was not expected when handling buffer available event."), iFsmState); sl@0: EndTest(EFail); sl@0: } sl@0: sl@0: break; sl@0: case EBufferDisplayed: sl@0: iBuffDisplayCallback++; sl@0: if (iFsmState == EStateUpdate && iBuffDisplayCallback == 1 && iBufferId == 0) sl@0: { sl@0: // receive the first display callback, the buffer id is 0 (first buffer) sl@0: if (iBuffAvailCallback == 2) sl@0: { sl@0: // received all bufAvailable callback after buffer displayed, test complete with pass sl@0: EndTest(EPass); sl@0: } sl@0: // otherwise, haven't received all bufAvailable callback yet, continue waiting sl@0: } sl@0: else sl@0: { sl@0: // received unexpected event sl@0: ERR_PRINTF2(_L("State %d was not expected when handling buffer displayed event."), iFsmState); sl@0: EndTest(EFail); sl@0: } sl@0: break; sl@0: default: sl@0: // unexpected event sl@0: ERR_PRINTF2(_L("Unexpected event code %d in RTestRendererUpdateTwiceStep::FsmL"), aEventCode); sl@0: EndTest(EFail); sl@0: break; sl@0: } sl@0: } sl@0: sl@0: sl@0: RTestRendererReleaseTwiceStep* RTestRendererReleaseTwiceStep::NewL(const TDesC& aStepName, TBool aTimed) sl@0: { sl@0: RTestRendererReleaseTwiceStep* self = new (ELeave) RTestRendererReleaseTwiceStep(aStepName, aTimed); sl@0: return self; sl@0: } sl@0: sl@0: RTestRendererReleaseTwiceStep::RTestRendererReleaseTwiceStep(const TDesC& aStepName, TBool aTimed) : sl@0: RTestRendererStep(aStepName, aTimed) sl@0: { sl@0: } sl@0: sl@0: TVerdict RTestRendererReleaseTwiceStep::DoTestStepL() sl@0: { sl@0: __UHEAP_MARK; sl@0: sl@0: // Call the state handler from IDLE state, don't need to start active scheduler sl@0: TRAPD(err, FsmL(EStartTest)); sl@0: if (err != KErrNone) sl@0: { sl@0: ERR_PRINTF2(_L("FsmL(EStartTest) leave with %d"), err); sl@0: iTestStepResult = EFail; sl@0: } sl@0: sl@0: delete iVideoRenderer; sl@0: iVideoRenderer = NULL; sl@0: sl@0: // cleanup test harness sl@0: CTestGCEHarness::Remove(); sl@0: sl@0: __UHEAP_MARKEND; sl@0: sl@0: return iTestStepResult; sl@0: } sl@0: sl@0: void RTestRendererReleaseTwiceStep::FsmL(TTestRendererEvents aEventCode) sl@0: { sl@0: switch (aEventCode) sl@0: { sl@0: case EStartTest: sl@0: iFsmState = EStateCreate; sl@0: CreateRendererAndSurfaceL(1); sl@0: break; sl@0: case EBufferAvailable: sl@0: iBuffAvailCallback++; sl@0: if (iFsmState == EStateCreate && iBuffAvailCallback == 1) sl@0: { sl@0: // buffer is available after surface create sl@0: iFsmState = EStateReleaseBuffer; sl@0: sl@0: INFO_PRINTF1(_L("iVideoRenderer->NextBuffer()")); sl@0: iBuffer = iVideoRenderer->NextBuffer(); sl@0: TESTL(iBuffer != NULL); sl@0: TESTL(iBuffer->BufferId() == 0); sl@0: sl@0: INFO_PRINTF1(_L("iVideoRenderer->ReleaseBuffer()")); sl@0: iVideoRenderer->ReleaseBuffer(iBuffer); sl@0: } sl@0: else if (iFsmState == EStateReleaseBuffer && iBuffAvailCallback == 2) sl@0: { sl@0: // buffer is available again after update sl@0: // check that buffer still point to the same buffer sl@0: TESTL(iBuffer != NULL); sl@0: TESTL(iBuffer->BufferId() == 0); sl@0: sl@0: // call release buffer again, expect no error and no extra callback sl@0: INFO_PRINTF1(_L("iVideoRenderer->ReleaseBuffer()")); sl@0: iVideoRenderer->ReleaseBuffer(iBuffer); sl@0: } sl@0: else sl@0: { sl@0: // unexpected state, fail test sl@0: ERR_PRINTF2(_L("State %d was not expected when handling buffer available event."), iFsmState); sl@0: iTestStepResult = EFail; sl@0: } sl@0: sl@0: break; sl@0: default: sl@0: // unexpected event sl@0: ERR_PRINTF2(_L("Unexpected event code %d in RTestRendererReleaseTwiceStep::FsmL"), aEventCode); sl@0: iTestStepResult = EFail; sl@0: break; sl@0: } sl@0: } sl@0: sl@0: sl@0: RTestRendererDestroySurfaceStep* RTestRendererDestroySurfaceStep::NewL(const TDesC& aStepName, TBool aTimed) sl@0: { sl@0: RTestRendererDestroySurfaceStep* self = new (ELeave) RTestRendererDestroySurfaceStep(aStepName, aTimed); sl@0: return self; sl@0: } sl@0: sl@0: RTestRendererDestroySurfaceStep::RTestRendererDestroySurfaceStep(const TDesC& aStepName, TBool aTimed) : sl@0: RTestRendererReleaseTwiceStep(aStepName, aTimed) sl@0: { sl@0: } sl@0: sl@0: void RTestRendererDestroySurfaceStep::FsmL(TTestRendererEvents aEventCode) sl@0: { sl@0: switch (aEventCode) sl@0: { sl@0: case EStartTest: sl@0: iFsmState = EStateCreate; sl@0: CreateRendererAndSurfaceL(1); sl@0: break; sl@0: case EBufferAvailable: sl@0: iBuffAvailCallback++; sl@0: if (iFsmState == EStateCreate && iBuffAvailCallback == 1) sl@0: { sl@0: // buffer is available after surface create sl@0: iFsmState = EStateReleaseBuffer; sl@0: sl@0: INFO_PRINTF1(_L("iVideoRenderer->NextBuffer()")); sl@0: iBuffer = iVideoRenderer->NextBuffer(); sl@0: TESTL(iBuffer != NULL); sl@0: TESTL(iBuffer->BufferId() == 0); sl@0: sl@0: INFO_PRINTF1(_L("iVideoRenderer->DestroySurface()")); sl@0: iVideoRenderer->DestroySurface(iSurfaceId); sl@0: sl@0: // check that iBuffer is not null sl@0: TESTL(iBuffer != NULL); sl@0: sl@0: // submit update, expect no callback and no error sl@0: TTime presentationTime(0); sl@0: INFO_PRINTF1(_L("iVideoRenderer->UpdateBuffer()")); sl@0: iVideoRenderer->UpdateBuffer(iBuffer, presentationTime); sl@0: sl@0: // release buffer, expect no callback and no error sl@0: INFO_PRINTF1(_L("iVideoRenderer->ReleaseBuffer()")); sl@0: iVideoRenderer->ReleaseBuffer(iBuffer); sl@0: sl@0: // try to get the next buffer after surface destroyed, expect null sl@0: INFO_PRINTF1(_L("iVideoRenderer->NextBuffer()")); sl@0: iBuffer = iVideoRenderer->NextBuffer(); sl@0: TESTL(iBuffer == NULL); sl@0: } sl@0: else sl@0: { sl@0: // unexpected state, fail test sl@0: ERR_PRINTF2(_L("State %d was not expected when handling buffer available event."), iFsmState); sl@0: iTestStepResult = EFail; sl@0: } sl@0: sl@0: break; sl@0: default: sl@0: // unexpected event sl@0: ERR_PRINTF2(_L("Unexpected event code %d in RTestRendererDestroySurfaceStep::FsmL"), aEventCode); sl@0: iTestStepResult = EFail; sl@0: break; sl@0: } sl@0: } sl@0: sl@0: sl@0: RTestRendererUpdateAndDestroyStep* RTestRendererUpdateAndDestroyStep::NewL(const TDesC& aStepName, TBool aTimed) sl@0: { sl@0: RTestRendererUpdateAndDestroyStep* self = new (ELeave) RTestRendererUpdateAndDestroyStep(aStepName, aTimed); sl@0: return self; sl@0: } sl@0: sl@0: RTestRendererUpdateAndDestroyStep::RTestRendererUpdateAndDestroyStep(const TDesC& aStepName, TBool aTimed) : sl@0: RTestRendererStep(aStepName, aTimed) sl@0: { sl@0: } sl@0: sl@0: TVerdict RTestRendererUpdateAndDestroyStep::DoTestStepPreambleL() sl@0: { sl@0: TVerdict result = RTestRendererStep::DoTestStepPreambleL(); sl@0: sl@0: TCallBack callback(TimerCallbackFunc, this); sl@0: iCallbackTimer = CCallBackTimer::NewL(callback); sl@0: sl@0: return result; sl@0: } sl@0: sl@0: TVerdict RTestRendererUpdateAndDestroyStep::DoTestStepPostambleL() sl@0: { sl@0: delete iCallbackTimer; sl@0: return RTestRendererStep::DoTestStepPostambleL(); sl@0: } sl@0: sl@0: TInt RTestRendererUpdateAndDestroyStep::TimerCallbackFunc(TAny *aPtr) sl@0: { sl@0: RTestRendererDelayStep* teststep = static_cast(aPtr); sl@0: TRAP_IGNORE(teststep->FsmL(ETimerExpired)); // ETimerExpired state does not leave sl@0: sl@0: return KErrNone; sl@0: } sl@0: sl@0: void RTestRendererUpdateAndDestroyStep::FsmL(TTestRendererEvents aEventCode) sl@0: { sl@0: switch (aEventCode) sl@0: { sl@0: case EStartTest: sl@0: iFsmState = EStateCreate; sl@0: CreateRendererAndSurfaceL(1); sl@0: break; sl@0: case EBufferAvailable: sl@0: iBuffAvailCallback++; sl@0: if (iFsmState == EStateCreate && iBuffAvailCallback == 1) sl@0: { sl@0: iFsmState = EStateUpdate; sl@0: sl@0: // received callback, map surface to display sl@0: TInt err = SetBackgroundSurface(iSurfaceId); sl@0: TESTL(err == KErrNone); sl@0: sl@0: // send the buffer sl@0: TTime nowTime; sl@0: nowTime.UniversalTime(); sl@0: TTimeIntervalMicroSeconds delay1(500000); // use half second delay sl@0: TTime presentationTime1 = nowTime + delay1; sl@0: GetNextBufferAndSubmitUpdateL(0, KRgbGreen, presentationTime1); sl@0: sl@0: // destroy surface sl@0: INFO_PRINTF1(_L("iVideoRenderer->DestroySurface()")); sl@0: iVideoRenderer->DestroySurface(iSurfaceId); sl@0: sl@0: // wait for a second for ensure that timed mode is ok, expect nothing sl@0: TTimeIntervalMicroSeconds32 oneSecond(1000000); sl@0: iCallbackTimer->After(oneSecond); sl@0: } sl@0: else sl@0: { sl@0: // unexpected state, test failed sl@0: ERR_PRINTF2(_L("State %d was not expected when handling buffer available event."), iFsmState); sl@0: EndTest(EFail); sl@0: } sl@0: break; sl@0: case ETimerExpired: sl@0: // timer expired, stop active scheduler, heap check marco will check for any leak sl@0: CActiveScheduler::Stop(); sl@0: break; sl@0: default: sl@0: // unexpected event sl@0: ERR_PRINTF2(_L("Unexpected event code %d in RTestRendererUpdateAndDestroyStep::FsmL"), aEventCode); sl@0: EndTest(EFail); sl@0: break; sl@0: } sl@0: } sl@0: sl@0: sl@0: RTestRendererUpdateAndDeleteStep* RTestRendererUpdateAndDeleteStep::NewL(const TDesC& aStepName, TBool aTimed) sl@0: { sl@0: RTestRendererUpdateAndDeleteStep* self = new (ELeave) RTestRendererUpdateAndDeleteStep(aStepName, aTimed); sl@0: return self; sl@0: } sl@0: sl@0: RTestRendererUpdateAndDeleteStep::RTestRendererUpdateAndDeleteStep(const TDesC& aStepName, TBool aTimed) : sl@0: RTestRendererReleaseTwiceStep(aStepName, aTimed) sl@0: { sl@0: } sl@0: sl@0: void RTestRendererUpdateAndDeleteStep::FsmL(TTestRendererEvents aEventCode) sl@0: { sl@0: switch (aEventCode) sl@0: { sl@0: case EStartTest: sl@0: iFsmState = EStateCreate; sl@0: CreateRendererAndSurfaceL(1); sl@0: break; sl@0: case EBufferAvailable: sl@0: iBuffAvailCallback++; sl@0: if (iFsmState == EStateCreate && iBuffAvailCallback == 1) sl@0: { sl@0: iFsmState = EStateUpdate; sl@0: sl@0: // received callback, map surface to display sl@0: TInt err = SetBackgroundSurface(iSurfaceId); sl@0: TESTL(err == KErrNone); sl@0: sl@0: // send the buffer sl@0: TTime nowTime; sl@0: nowTime.UniversalTime(); sl@0: TTimeIntervalMicroSeconds delay1(500000); // use half second delay sl@0: TTime presentationTime1 = nowTime + delay1; sl@0: GetNextBufferAndSubmitUpdateL(0, KRgbGreen, presentationTime1); sl@0: sl@0: // delete renderer sl@0: INFO_PRINTF1(_L("delete iVideoRenderer")); sl@0: delete iVideoRenderer; sl@0: iVideoRenderer = 0; sl@0: sl@0: // wait for a second for ensure that timed mode is ok, expect nothing sl@0: TTimeIntervalMicroSeconds32 oneSecond(1000000); sl@0: User::After(oneSecond); sl@0: } sl@0: else sl@0: { sl@0: // unexpected state, test failed sl@0: ERR_PRINTF2(_L("State %d was not expected when handling buffer available event."), iFsmState); sl@0: iTestStepResult = EFail; sl@0: } sl@0: break; sl@0: default: sl@0: // unexpected event sl@0: ERR_PRINTF2(_L("Unexpected event code %d in RTestRendererUpdateAndDeleteStep::FsmL"), aEventCode); sl@0: iTestStepResult = EFail; sl@0: break; sl@0: } sl@0: } sl@0: sl@0: sl@0: RTestRendererUpdateInvalidStep* RTestRendererUpdateInvalidStep::NewL(const TDesC& aStepName, TBool aTimed) sl@0: { sl@0: RTestRendererUpdateInvalidStep* self = new (ELeave) RTestRendererUpdateInvalidStep(aStepName, aTimed); sl@0: return self; sl@0: } sl@0: sl@0: RTestRendererUpdateInvalidStep::RTestRendererUpdateInvalidStep(const TDesC& aStepName, TBool aTimed) : sl@0: RTestRendererReleaseTwiceStep(aStepName, aTimed) sl@0: { sl@0: } sl@0: sl@0: void RTestRendererUpdateInvalidStep::FsmL(TTestRendererEvents aEventCode) sl@0: { sl@0: switch (aEventCode) sl@0: { sl@0: case EStartTest: sl@0: iFsmState = EStateCreate; sl@0: CreateRendererAndSurfaceL(1); sl@0: break; sl@0: case EBufferAvailable: sl@0: iBuffAvailCallback++; sl@0: if (iFsmState == EStateCreate && iBuffAvailCallback == 1) sl@0: { sl@0: iFsmState = EStateUpdate; sl@0: sl@0: // received callback, map surface to display sl@0: TInt err = SetBackgroundSurface(iSurfaceId); sl@0: TESTL(err == KErrNone); sl@0: sl@0: // get a buffer sl@0: TVideoFrameBuffer* buffer; sl@0: buffer = iVideoRenderer->NextBuffer(); sl@0: TESTL(buffer != NULL); sl@0: TESTL(buffer->Format() == iVideoFormat); sl@0: TESTL(buffer->Stride() == iSize.iWidth * 4); // 4 bite per pixel for ERgb32bit888 sl@0: TESTL(buffer->BufferId() == 0); sl@0: TESTL(buffer->Buffer() != NULL); sl@0: sl@0: // create a local buffer with same parameters sl@0: TVideoFrameBuffer localBuffer(buffer->Format(), sl@0: buffer->Stride(), sl@0: buffer->BufferId(), sl@0: buffer->Chunk(), sl@0: 0); sl@0: sl@0: TInt bufSize = buffer->Stride() * iSize.iHeight; sl@0: Mem::Fill(buffer->Buffer(), bufSize, KRgbGreen.Internal()); sl@0: TTime time(0); sl@0: INFO_PRINTF1(_L("iVideoRenderer->UpdateBuffer()")); sl@0: iVideoRenderer->UpdateBuffer(&localBuffer, time); sl@0: } sl@0: else sl@0: { sl@0: // unexpected state, test failed sl@0: ERR_PRINTF2(_L("State %d was not expected when handling buffer available event."), iFsmState); sl@0: iTestStepResult = EFail; sl@0: } sl@0: break; sl@0: default: sl@0: // unexpected event sl@0: ERR_PRINTF2(_L("Unexpected event code %d in RTestRendererUpdateInvalidStep::FsmL"), aEventCode); sl@0: iTestStepResult = EFail; sl@0: break; sl@0: } sl@0: } sl@0: sl@0: RTestRendererCreateTwiceStep* RTestRendererCreateTwiceStep::NewL(const TDesC& aStepName, TBool aTimed) sl@0: { sl@0: RTestRendererCreateTwiceStep* self = new (ELeave) RTestRendererCreateTwiceStep(aStepName, aTimed); sl@0: return self; sl@0: } sl@0: sl@0: RTestRendererCreateTwiceStep::RTestRendererCreateTwiceStep(const TDesC& aStepName, TBool aTimed) : sl@0: RTestRendererReleaseTwiceStep(aStepName, aTimed) sl@0: { sl@0: } sl@0: sl@0: void RTestRendererCreateTwiceStep::FsmL(TTestRendererEvents aEventCode) sl@0: { sl@0: switch (aEventCode) sl@0: { sl@0: case EStartTest: sl@0: iFsmState = EStateCreate; sl@0: CreateRendererAndSurfaceL(1); sl@0: break; sl@0: case EBufferAvailable: sl@0: iBuffAvailCallback++; sl@0: if (iFsmState == EStateCreate && iBuffAvailCallback == 1) sl@0: { sl@0: // Create surface again sl@0: TRAPD(err, CreateSurfaceL(1)); sl@0: INFO_PRINTF3(_L("Expected error code=%d, received error code=%d"), KErrInUse, err); sl@0: TESTL(err == KErrInUse); sl@0: } sl@0: else sl@0: { sl@0: // unexpected state, test failed sl@0: ERR_PRINTF2(_L("State %d was not expected when handling buffer available event."), iFsmState); sl@0: iTestStepResult = EFail; sl@0: } sl@0: break; sl@0: default: sl@0: // unexpected event sl@0: ERR_PRINTF2(_L("Unexpected event code %d in RTestRendererCreateTwiceStep::FsmL"), aEventCode); sl@0: iTestStepResult = EFail; sl@0: break; sl@0: } sl@0: } sl@0: sl@0: RTestRendererDestroyInvalidStep* RTestRendererDestroyInvalidStep::NewL(const TDesC& aStepName, TBool aTimed) sl@0: { sl@0: RTestRendererDestroyInvalidStep* self = new (ELeave) RTestRendererDestroyInvalidStep(aStepName, aTimed); sl@0: return self; sl@0: } sl@0: sl@0: RTestRendererDestroyInvalidStep::RTestRendererDestroyInvalidStep(const TDesC& aStepName, TBool aTimed) : sl@0: RTestRendererReleaseTwiceStep(aStepName, aTimed) sl@0: { sl@0: } sl@0: sl@0: void RTestRendererDestroyInvalidStep::FsmL(TTestRendererEvents aEventCode) sl@0: { sl@0: switch (aEventCode) sl@0: { sl@0: case EStartTest: sl@0: iFsmState = EStateCreate; sl@0: CreateRendererAndSurfaceL(1); sl@0: break; sl@0: case EBufferAvailable: sl@0: iBuffAvailCallback++; sl@0: if (iFsmState == EStateCreate && iBuffAvailCallback == 1) sl@0: { sl@0: // create a surface id that is not the same as iSurfaceId sl@0: TSurfaceId invalidId = iSurfaceId; sl@0: invalidId.iInternal[0] += 1; sl@0: invalidId.iInternal[1] += 1; sl@0: invalidId.iInternal[2] += 1; sl@0: invalidId.iInternal[3] += 1; sl@0: sl@0: // Destory surface with invalid id sl@0: iVideoRenderer->DestroySurface(invalidId); sl@0: sl@0: // Destory surface twice, the second call is ignored sl@0: iVideoRenderer->DestroySurface(iSurfaceId); sl@0: iVideoRenderer->DestroySurface(iSurfaceId); sl@0: sl@0: // Destory surface with invalid id after the surface is destroyed sl@0: iVideoRenderer->DestroySurface(invalidId); sl@0: } sl@0: else sl@0: { sl@0: // unexpected state, test failed sl@0: ERR_PRINTF2(_L("State %d was not expected when handling buffer available event."), iFsmState); sl@0: iTestStepResult = EFail; sl@0: } sl@0: break; sl@0: default: sl@0: // unexpected event sl@0: ERR_PRINTF2(_L("Unexpected event code %d in RTestRendererDestroyInvalidStep::FsmL"), aEventCode); sl@0: iTestStepResult = EFail; sl@0: break; sl@0: } sl@0: } sl@0: sl@0: RTestResourceFileReaderStep* RTestResourceFileReaderStep::NewL(const TDesC& aStepName, const TDesC& aFileName, TInt aExpectedFormatErr, TInt aExpectedTimerErr, TInt64 aExpectedDefaultDelay, TInt64 aExpectedDelay) sl@0: { sl@0: RTestResourceFileReaderStep* self = new (ELeave) RTestResourceFileReaderStep(aStepName, aFileName, aExpectedFormatErr, aExpectedTimerErr, aExpectedDefaultDelay, aExpectedDelay); sl@0: return self; sl@0: } sl@0: sl@0: RTestResourceFileReaderStep::RTestResourceFileReaderStep(const TDesC& aStepName, const TDesC& aFileName, TInt aExpectedFormatErr, TInt aExpectedTimerErr, TInt64 aExpectedDefaultDelay, TInt64 aExpectedDelay) sl@0: { sl@0: iTestStepName = aStepName; sl@0: iFileName = aFileName; sl@0: iExpectedFormatErr = aExpectedFormatErr; sl@0: iExpectedTimerErr = aExpectedTimerErr; sl@0: iExpectedDefaultDelay = aExpectedDefaultDelay; sl@0: iExpectedMaxDelay = aExpectedDelay; sl@0: } sl@0: sl@0: TVerdict RTestResourceFileReaderStep::DoTestStepL() sl@0: { sl@0: INFO_PRINTF1(_L("Check Resource file reader")); sl@0: sl@0: __UHEAP_MARK; sl@0: sl@0: RArray supportedFormat; sl@0: CleanupClosePushL(supportedFormat); sl@0: CResourceFileReader* reader = CResourceFileReader::NewLC(iFileName); sl@0: TRAPD(err, reader->ReadSupportedFormatL(supportedFormat)); sl@0: if (err != iExpectedFormatErr) sl@0: { sl@0: iTestStepResult = EFail; sl@0: ERR_PRINTF3(_L("Expected error code=%d, received error code=%d"), iExpectedFormatErr, err); sl@0: } sl@0: TInt64 defaultDelay; sl@0: TInt64 maxDelay; sl@0: TRAP(err, reader->ReadTimerInfoL(defaultDelay, maxDelay)); sl@0: if (err != iExpectedTimerErr) sl@0: { sl@0: iTestStepResult = EFail; sl@0: ERR_PRINTF3(_L("Expected error code=%d, received error code=%d"), iExpectedTimerErr, err); sl@0: } sl@0: else if (defaultDelay != iExpectedDefaultDelay || maxDelay != iExpectedMaxDelay) sl@0: { sl@0: iTestStepResult = EFail; sl@0: ERR_PRINTF3(_L("Expected default delay=%d, received default delay=%d"), iExpectedDefaultDelay, defaultDelay); sl@0: ERR_PRINTF3(_L("Expected max delay=%d, received max delay=%d"), iExpectedMaxDelay, maxDelay); sl@0: } sl@0: sl@0: CleanupStack::PopAndDestroy(2, &supportedFormat); sl@0: sl@0: __UHEAP_MARKEND; sl@0: sl@0: return iTestStepResult; sl@0: } sl@0: sl@0: sl@0: RTestRendererDelayStep* RTestRendererDelayStep::NewL(const TDesC& aStepName) sl@0: { sl@0: RTestRendererDelayStep* self = new (ELeave) RTestRendererDelayStep(aStepName); sl@0: return self; sl@0: } sl@0: sl@0: RTestRendererDelayStep::RTestRendererDelayStep(const TDesC& aStepName) : sl@0: RTestRendererUpdateAndDestroyStep(aStepName, ETrue) sl@0: { sl@0: } sl@0: sl@0: void RTestRendererDelayStep::FsmL(TTestRendererEvents aEventCode) sl@0: { sl@0: switch (aEventCode) sl@0: { sl@0: case EStartTest: sl@0: iFsmState = EStateCreate; sl@0: CreateRendererAndSurfaceL(1); sl@0: break; sl@0: case EBufferAvailable: sl@0: iBuffAvailCallback++; sl@0: if (iFsmState == EStateCreate && iBuffAvailCallback == 1) sl@0: { sl@0: iFsmState = EStateUpdate; sl@0: sl@0: // send the buffer without set background surface sl@0: TTime nowTime; sl@0: nowTime.UniversalTime(); sl@0: TTimeIntervalMicroSeconds delay1(500000); // use half second delay sl@0: TTime presentationTime1 = nowTime + delay1; sl@0: GetNextBufferAndSubmitUpdateL(0, KRgbGreen, presentationTime1); sl@0: sl@0: iCallbackTimer->AtUTC(presentationTime1); sl@0: } sl@0: else if (iFsmState == EStateUpdate) sl@0: { sl@0: // buffer is available again after update sl@0: if (iBuffAvailCallback == 2 && iBuffSkipCallback == 1) sl@0: { sl@0: // all callbacks have been received, complete test with pass sl@0: EndTest(EPass); sl@0: } sl@0: } sl@0: else sl@0: { sl@0: // unexpected state, fail test sl@0: EndTest(EFail); sl@0: } sl@0: sl@0: break; sl@0: case ETimerExpired: sl@0: { sl@0: // received the first callback, map surface to display sl@0: INFO_PRINTF1(_L("Timer expired event receibed")); sl@0: sl@0: TInt err = SetBackgroundSurface(iSurfaceId); sl@0: TESTL(err == KErrNone); sl@0: sl@0: if (iBuffAvailCallback == 2 && iBuffSkipCallback == 1) sl@0: { sl@0: // all callbacks have been received, complete test with pass sl@0: EndTest(EPass); sl@0: } sl@0: break; sl@0: } sl@0: case EBufferSkipped: sl@0: iBuffSkipCallback++; sl@0: // expect 1 buffer skipped callback at fsm state EStateUpdate for bufferId 0 sl@0: if (iFsmState != EStateUpdate || iBuffSkipCallback != 1 || iBufferId != 0) sl@0: { sl@0: EndTest(EFail); sl@0: } sl@0: break; sl@0: default: sl@0: // unexpected state sl@0: EndTest(EFail); sl@0: break; sl@0: } sl@0: }