/* ------------------------------------------------------------------
 * Copyright (C) 2008 PacketVideo
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
 * express or implied.
 * See the License for the specific language governing permissions
 * and limitations under the License.
 * -------------------------------------------------------------------
 */
#ifndef TEST_PV_PLAYER_ENGINE_TESTSET5_H_INCLUDED
#define TEST_PV_PLAYER_ENGINE_TESTSET5_H_INCLUDED

/**
 *  @file test_pv_player_engine_testset5.h
 *  @brief This file contains the class definitions for the fifth set of
 *         test cases for PVPlayerEngine - HTTP download tests (3GPP progressive and PV FastTrack)
 *
 */

#ifndef TEST_PV_PLAYER_ENGINE_H_INCLUDED
#include "test_pv_player_engine.h"
#endif

#ifndef TEST_PV_PLAYER_ENGINE_CONFIG_H_INCLUDED
#include "test_pv_player_engine_config.h"
#endif


#ifndef PVMF_CPMPLUGIN_FACTORY_REGISTRY_H_INCLUDED
#include "pvmf_cpmplugin_factory_registry.h"
#endif

class PVPlayerDataSourceURL;
class PVPlayerDataSinkFilename;
class PVLogger;
class PVMFDownloadDataSourceHTTP;
class PVMFSourceContextData;
class PvmiCapabilityAndConfig;
class PVMFJanusPluginFactory;
class WmDrmDeviceInfoFactory;
class PVWmdrmDeviceSystemClockFactory;

class pvplayer_async_test_downloadbase : public pvplayer_async_test_base
{
    public:
        pvplayer_async_test_downloadbase(PVPlayerAsyncTestParam aTestParam):
                pvplayer_async_test_base(aTestParam)
                , iPlayer(NULL)
                , iDataSource(NULL)
                , iDownloadContextData(NULL)
                , iDataSinkVideo(NULL)
                , iDataSinkAudio(NULL)
                , iIONodeVideo(NULL)
                , iIONodeAudio(NULL)
                , iMIOFileOutVideo(NULL)
                , iMIOFileOutAudio(NULL)
                , iCurrentCmdId(0)
                , iProtocolRollOver(false)
                , iRepositionAfterDownloadComplete(false)
                , iPauseAfterDownloadComplete(false)
                , iPlayUntilEOS(false)
                , iPauseResumeAfterUnderflow(false)
                , iProgPlayback(false)
                , iPlayStopPlay(false)
                , iSessionDuration(0)
                , iCancelAllCmdId(0)
        {
            iNumBufferingStart = iNumBufferingComplete = iNumUnderflow = iNumDataReady = iNumEOS = 0;
            iDownloadOnly = iDownloadThenPlay = false;
            iLastBufferingStatusVal = 0;
        }

        virtual ~pvplayer_async_test_downloadbase();

        void StartTest();
        void Run();

        virtual void CommandCompleted(const PVCmdResponse& aResponse);
        virtual void HandleErrorEvent(const PVAsyncErrorEvent& aEvent);
        virtual void HandleInformationalEvent(const PVAsyncInformationalEvent& aEvent);

        enum PVTestState
        {
            STATE_CREATE,
            STATE_QUERYINTERFACE,
            STATE_ADDDATASOURCE,
            STATE_CONFIGPARAMS,
            STATE_INIT,
            STATE_GETMETADATAKEYLIST,
            STATE_GETMETADATAVALUELIST,
            STATE_ADDDATASINK_VIDEO,
            STATE_ADDDATASINK_AUDIO,
            STATE_PREPARE,
            STATE_WAIT_FOR_DATAREADY,
            STATE_WAIT_FOR_BUFFCOMPLETE,
            STATE_CANCELALL,
            STATE_WAIT_FOR_CANCELALL,
            STATE_START,
            STATE_SETPLAYBACKRANGE,
            STATE_PAUSE,
            STATE_RESUME,
            STATE_EOSNOTREACHED,
            STATE_STOP,
            STATE_REMOVEDATASINK_VIDEO,
            STATE_REMOVEDATASINK_AUDIO,
            STATE_RESET,
            STATE_REMOVEDATASOURCE,
            STATE_WAIT_FOR_ERROR_HANDLING,
            STATE_CLEANUPANDCOMPLETE,
            STATE_PREPARE2,
            STATE_START2,
            STATE_STOP2
        };


        PVTestState iState;

        PVPlayerInterface* iPlayer;
        PVPlayerDataSourceURL* iDataSource;
        PVMFSourceContextData* iDownloadContextData;
        PVPlayerDataSink* iDataSinkVideo;
        PVPlayerDataSink* iDataSinkAudio;
        PVMFNodeInterface* iIONodeVideo;
        PVMFNodeInterface* iIONodeAudio;
        PvmiMIOControl* iMIOFileOutVideo;
        PvmiMIOControl* iMIOFileOutAudio;

        OSCL_wHeapString<OsclMemAllocator> iDownloadURL;
        OSCL_wHeapString<OsclMemAllocator> iDownloadFilename;
        OSCL_HeapString<OsclMemAllocator> iDownloadProxy;
        OSCL_wHeapString<OsclMemAllocator> iDownloadConfigFilename;

        PVCommandId iCurrentCmdId;
        PVLogger* iLogger;

        virtual void CreateDataSource() = 0;
        virtual void CreateDataSinkVideo() = 0;
        virtual void CreateDataSinkAudio() = 0;
        virtual void CleanupData() {}

        void PrintMetadata();
        PVPMetadataList iMetadataKeyList;
        Oscl_Vector<PvmiKvp, OsclMemAllocator> iMetadataValueList;
        int32 iNumValues;

        int32 iNumBufferingStart, iNumBufferingComplete, iNumUnderflow, iNumDataReady, iNumEOS;
        bool iDownloadOnly, iDownloadThenPlay;
        bool iContentTooLarge;

        void setProtocolRollOverMode()
        {
            iProtocolRollOver = true;
        }
        bool iProtocolRollOver;

        void enableReposAfterDownloadComplete()
        {
            iRepositionAfterDownloadComplete = true;
        }
        bool iRepositionAfterDownloadComplete;

        void enablePauseAfterDownloadComplete()
        {
            iPauseAfterDownloadComplete = true;
        }
        bool iPauseAfterDownloadComplete;

        void enablePlayUntilEOS()
        {
            iPlayUntilEOS = true;
        }
        bool iPlayUntilEOS;

        bool iPauseResumeAfterUnderflow;

        bool iProgPlayback;
        bool iPlayStopPlay;
        void enablePlayStopPlay()
        {
            iPlayStopPlay = true;
            iTestCaseName += " Play/Stop/Play";
        }
        int32 iLastBufferingStatusVal;

        //for janus drm.
        void PrintJanusError(const PVCmdResponse& aResponse);

        uint32 iSessionDuration;
    protected:
        PVCommandId iCancelAllCmdId;
    private:
        void HandleProtocolEngineNodeErrors(int32 aErr, OsclAny* aEventData);
        void HandleSocketNodeErrors(int32 aErr);
    private:
        PvmiCapabilityAndConfig* iPlayerCapConfigIF;
        PvmiKvp* iErrorKVP;
        PvmiKvp iKVPSetAsync;
        OSCL_StackString<256> iKeyStringSetAsync;
};


/*!
 *  A test case to test the normal 3GPP download and playback from an HTTP URL.
 *  - Data Source: http://172.16.6.54/JaniePorche_176.3gp
 *  - Data Sink(s): Video[FileOutputNode-test_player_3gppdlnormal_video.dat]\n
 *                  Audio[FileOutputNode-test_player_3gppdlnormal_audio.dat]
 *  - Sequence:
 *             -# CreatePlayer()
 *             -# AddDataSource()
 *             -# Init()
 *             -# AddDataSink() (video)
 *             -# AddDataSink() (audio)
 *             -# Prepare()
 *             -# Wait for Data Ready event
 *             -# Start()
 *             -# Play until either EOS is reached or 10 seconds after download
 *					finishes.
 *             -# Stop()
 *             -# RemoveDataSink() (video)
 *             -# RemoveDataSink() (audio)
 *             -# Reset()
 *             -# RemoveDataSource()
 *             -# DeletePlayer()
 *
 */
class pvplayer_async_test_3gppdlnormal : public pvplayer_async_test_downloadbase
{
    public:
        pvplayer_async_test_3gppdlnormal(PVPlayerAsyncTestParam aTestParam):
                pvplayer_async_test_downloadbase(aTestParam)
        {
            iLogger = PVLogger::GetLoggerObject("pvplayer_async_test_3gppdlnormal");
            iTestCaseName = _STRLIT_CHAR("3GPP Download Play ASAP");
            iPluginFactory = NULL;
            iUseCpmForPlayback = false;
            iDrmDeviceInfoFactory = NULL;
            iDrmSystemClockFactory = NULL;
        }

        ~pvplayer_async_test_3gppdlnormal();

        void CreateDataSource();
        void CreateDataSinkVideo();
        void CreateDataSinkAudio();

        //for janus DRM
        PVMFCPMPluginFactoryRegistryClient iPluginRegistryClient;
        PVMFJanusPluginFactory* iPluginFactory;
        OSCL_HeapString<OsclMemAllocator> iPluginMimeType;
        bool iUseCpmForPlayback;
        WmDrmDeviceInfoFactory* iDrmDeviceInfoFactory;
        PVWmdrmDeviceSystemClockFactory* iDrmSystemClockFactory;
        void CleanupData();
};

/*!
 *  A test case to test the normal PPB from an HTTP URL.
 *  - Data Source: http://172.16.6.54/JaniePorche_176.3gp
 *  - Data Sink(s): Video[FileOutputNode-test_player_3gppdlnormal_video.dat]\n
 *                  Audio[FileOutputNode-test_player_3gppdlnormal_audio.dat]
 *  - Sequence:
 *             -# CreatePlayer()
 *             -# AddDataSource()
 *             -# Init()
 *             -# AddDataSink() (video)
 *             -# AddDataSink() (audio)
 *             -# Prepare()
 *             -# Wait for Data Ready event
 *             -# Start()
 *             -# Play until either EOS is reached or 10 seconds after download
 *					finishes.
 *             -# Stop()
 *             -# RemoveDataSink() (video)
 *             -# RemoveDataSink() (audio)
 *             -# Reset()
 *             -# RemoveDataSource()
 *             -# DeletePlayer()
 *
 */
class pvplayer_async_test_ppbnormal : public pvplayer_async_test_downloadbase
{
    public:
        pvplayer_async_test_ppbnormal(PVPlayerAsyncTestParam aTestParam):
                pvplayer_async_test_downloadbase(aTestParam)
        {
            iLogger = PVLogger::GetLoggerObject("pvplayer_async_test_ppbnormal");
            iTestCaseName = _STRLIT_CHAR("PPB Normal");
            iProgPlayback = true;
        }

        ~pvplayer_async_test_ppbnormal();

        void CreateDataSource();
        void CreateDataSinkVideo();
        void CreateDataSinkAudio();
};

class pvplayer_async_test_cnclall_prtcl_rllovr : public pvplayer_async_test_3gppdlnormal
{
    public:
        pvplayer_async_test_cnclall_prtcl_rllovr(PVPlayerAsyncTestParam aTestParam):
                pvplayer_async_test_3gppdlnormal(aTestParam), iCancelCommandPending(true), iCancellationEventTime(Undetermined), iProtocolRolloverNotificationRecvd(false)
        {
        }
        void CancelAllDuringProtocolRolloverWithNoGetReqAfterRolloverTest()
        {
            iCancellationEventTime = NoGetReqAfterRollover;
        }
        void CancelAllDuringProtocolRolloverWithGetResponseRecvdAfterRolloverTest()
        {
            iCancellationEventTime = GetResponseRecvdAfterRollover;
        }
        void CancelAllDuringProtocolRolloverWithNoGetResponseRecvdAfterRolloverTest()
        {
            iCancellationEventTime = NoGetResponseRecvdAfterRollover;
        }
    protected:
        virtual void CommandCompleted(const PVCmdResponse& aResponse);
        virtual void HandleInformationalEvent(const PVAsyncInformationalEvent& aEvent);
        bool iCancelCommandPending;

    private:
        enum CancellationEventTime
        {
            Undetermined = 0,
            NoGetReqAfterRollover = 1,
            NoGetResponseRecvdAfterRollover = 2,
            GetResponseRecvdAfterRollover = 3
        };
        CancellationEventTime iCancellationEventTime;
        bool iProtocolRolloverNotificationRecvd;
};

class pvplayer_async_test_3gppdlnormal_dlthenplay : public pvplayer_async_test_downloadbase
{
    public:
        pvplayer_async_test_3gppdlnormal_dlthenplay(PVPlayerAsyncTestParam aTestParam):
                pvplayer_async_test_downloadbase(aTestParam)
        {
            iLogger = PVLogger::GetLoggerObject("pvplayer_async_test_3gppdlnormal_dlthenplay");
            iTestCaseName = _STRLIT_CHAR("3GPP Download Then Play");
        }

        ~pvplayer_async_test_3gppdlnormal_dlthenplay();

        void CreateDataSource();
        void CreateDataSinkVideo();
        void CreateDataSinkAudio();

};
class pvplayer_async_test_3gppdlnormal_dlonly : public pvplayer_async_test_downloadbase
{
    public:
        pvplayer_async_test_3gppdlnormal_dlonly(PVPlayerAsyncTestParam aTestParam):
                pvplayer_async_test_downloadbase(aTestParam)
        {
            iLogger = PVLogger::GetLoggerObject("pvplayer_async_test_3gppdlnormal_dlonly");

            iTestCaseName = _STRLIT_CHAR("3GPP Download Only");
        }

        ~pvplayer_async_test_3gppdlnormal_dlonly();

        void CreateDataSource();
        void CreateDataSinkVideo();
        void CreateDataSinkAudio();

};


/*!
 *  A test case to test cancel of invalid 3GPP download during init
 *  - Data Source: http://172.17.34.12/bogus.3gp
 *  - Data Sink(s): N/A
 *  - Sequence:
 *             -# CreatePlayer()
 *             -# AddDataSource()
 *             -# Init()
 *             -# WAIT 1 SEC
 *             -# CancelAll()
 *             -# WAIT 5 SEC
 *             -# DeletePlayer()
 *
 */
class pvplayer_async_test_3gppdlcancelduringinit : public pvplayer_async_test_base
{
    public:
        pvplayer_async_test_3gppdlcancelduringinit(PVPlayerAsyncTestParam aTestParam):
                pvplayer_async_test_base(aTestParam)
                , iPlayer(NULL)
                , iDataSource(NULL)
                , iDownloadHttpContextData(NULL)
                , iCancelCommandExecuted(false)
                , iCurrentCmdId(0)
        {
            iLogger = PVLogger::GetLoggerObject("pvplayer_async_test_3gppdlcancelduringinit");
            iTestCaseName = _STRLIT_CHAR("3GPP Download Cancel During Init");
        }

        ~pvplayer_async_test_3gppdlcancelduringinit() {}

        void StartTest();
        void Run();

        void CommandCompleted(const PVCmdResponse& aResponse);
        void HandleErrorEvent(const PVAsyncErrorEvent& aEvent);
        void HandleInformationalEvent(const PVAsyncInformationalEvent& aEvent);

        enum PVTestState
        {
            STATE_CREATE,
            STATE_ADDDATASOURCE,
            STATE_INIT,
            STATE_CANCELALL,
            STATE_WAIT_FOR_CANCELALL,
            STATE_RESET,
            STATE_REMOVEDATASOURCE,
            STATE_WAIT_FOR_ERROR_HANDLING,
            STATE_CLEANUPANDCOMPLETE
        };

        PVTestState iState;

        PVPlayerInterface* iPlayer;
        PVPlayerDataSourceURL* iDataSource;
        PVMFDownloadDataSourceHTTP* iDownloadHttpContextData;
        OSCL_wHeapString<OsclMemAllocator> iDownloadURL;
        OSCL_wHeapString<OsclMemAllocator> iDownloadFilename;
        OSCL_HeapString<OsclMemAllocator> iDownloadProxy;
        OSCL_wHeapString<OsclMemAllocator> iConfigFileName;
        bool iCancelCommandExecuted;
        PVCommandId iCurrentCmdId;
        PVLogger* iLogger;
};

/*!
 *  A test case to test cancel of invalid 3GPP download during init. Cancel request is delayed
 *  - Data Source: http://172.17.34.12/bogus.3gp - should be low bandwidth or non-PDL
 *  - Data Sink(s): N/A
 *  - Sequence:
 *             -# CreatePlayer()
 *             -# AddDataSource()
 *             -# Init()
 *             -# WAIT FOR FIRST DOWNLOAD STATUS EVENT
 *             -# CancelAll()
 *             -# WAIT UP TO 15 SEC FOR CmdCompleted
 *             -# DeletePlayer()
 *
 */
class pvplayer_async_test_3gppdlcancelduringinitdelay : public pvplayer_async_test_base
{
    public:
        pvplayer_async_test_3gppdlcancelduringinitdelay(PVPlayerAsyncTestParam aTestParam):
                pvplayer_async_test_base(aTestParam)
                , iPlayer(NULL)
                , iDataSource(NULL)
                , iDownloadHttpContextData(NULL)
                , iCancelCommandExecuted(false)
                , iCurrentCmdId(0)
                , iInitCmdId(-1)
        {
            iLogger = PVLogger::GetLoggerObject("pvplayer_async_test_3gppdlcancelduringinitdelay");
            iTestCaseName = _STRLIT_CHAR("3GPP Download Cancel During Init - delayed");
        }

        ~pvplayer_async_test_3gppdlcancelduringinitdelay() {}

        void StartTest();
        void Run();

        void CommandCompleted(const PVCmdResponse& aResponse);
        void HandleErrorEvent(const PVAsyncErrorEvent& aEvent);
        void HandleInformationalEvent(const PVAsyncInformationalEvent& aEvent);

        enum PVTestState
        {
            STATE_CREATE,
            STATE_ADDDATASOURCE,
            STATE_INIT,
            STATE_CANCELALL,
            STATE_WAIT_FOR_CANCELALL,
            STATE_RESET,
            STATE_REMOVEDATASOURCE,
            STATE_WAIT_FOR_ERROR_HANDLING,
            STATE_CLEANUPANDCOMPLETE
        };

        PVTestState iState;

        PVPlayerInterface* iPlayer;
        PVPlayerDataSourceURL* iDataSource;
        PVMFDownloadDataSourceHTTP* iDownloadHttpContextData;
        OSCL_wHeapString<OsclMemAllocator> iDownloadURL;
        OSCL_wHeapString<OsclMemAllocator> iDownloadFilename;
        OSCL_HeapString<OsclMemAllocator> iDownloadProxy;
        OSCL_wHeapString<OsclMemAllocator> iConfigFileName;
        bool iCancelCommandExecuted;
        PVCommandId iCurrentCmdId;
        PVCommandId iInitCmdId;
        PVLogger* iLogger;
};

/*!
 *  A test case to test the return of PVMFErrContentTooLarge from Init()
 *         when the iMaxFileSize is set to a lower number than the size of
 *         the downloading file.
 *  - Data Source: "http://wms.pv.com:7070/MediaDownloadContent/UserUploads/av5.wmv"
 *  - Data Sink(s): N/A
 *  - Sequence:
 *             -# CreatePlayer()
 *             -# AddDataSource()
 *             -# Init() - command complete should return error PVMFErrContentTooLarge
 *             -# RemoveDataSource()
 *             -# DeletePlayer()
 *
 */
class pvplayer_async_test_3gppdlcontenttoolarge : public pvplayer_async_test_downloadbase
{
    public:
        pvplayer_async_test_3gppdlcontenttoolarge(PVPlayerAsyncTestParam aTestParam):
                pvplayer_async_test_downloadbase(aTestParam)
        {
            iLogger = PVLogger::GetLoggerObject("pvplayer_async_test_3gppdlcontenttoolarge");
            iTestCaseName = _STRLIT_CHAR("3GPP PVMFErrContentTooLarge during Init");
        }

        ~pvplayer_async_test_3gppdlcontenttoolarge();

        void CreateDataSource();
        void CreateDataSinkVideo();
        void CreateDataSinkAudio();

};


/*!
 *  A test case to test the PVMFInfoContentTruncated behavior
 *  - Data Source: "TBD" - we dont have download content that does not report its size as zero
 *  - Data Sink(s): N/A
 *  - Sequence:
 *             -# CreatePlayer()
 *             -# AddDataSource()
 *             -# Init()
 *             -# AddDataSink() (video)
 *             -# AddDataSink() (audio)
 *             -# Prepare()
 *             -# Wait for Data Ready event
 *             -# Start()
 *             -# Play until PVMFInfoContentTruncated or EOS
 *             -# Stop()
 *             -# RemoveDataSink() (video)
 *             -# RemoveDataSink() (audio)
 *             -# Reset()
 *             -# RemoveDataSource()
 *             -# DeletePlayer()
 *
 */
class pvplayer_async_test_3gppdlContentTruncated : public pvplayer_async_test_downloadbase
{
    public:
        pvplayer_async_test_3gppdlContentTruncated(PVPlayerAsyncTestParam aTestParam):
                pvplayer_async_test_downloadbase(aTestParam)
        {
            iLogger = PVLogger::GetLoggerObject("pvplayer_async_test_3gppdlContentTruncated");
            iTestCaseName = _STRLIT_CHAR("3GPP PVMFInfoContentTruncated during download");
        }

        ~pvplayer_async_test_3gppdlContentTruncated();

        void CreateDataSource();
        void CreateDataSinkVideo();
        void CreateDataSinkAudio();

};


/*
 * Base class for progressive playback (aka progressive streaming) testing
 *
 */
class pvplayer_async_test_ppb_base : public pvplayer_async_test_base
{
    public:
        pvplayer_async_test_ppb_base(PVPlayerAsyncTestParam aTestParam):
                pvplayer_async_test_base(aTestParam)
                , iPlayer(NULL)
                , iDataSource(NULL)
                , iDataSinkVideo(NULL)
                , iDataSinkAudio(NULL)
                , iIONodeVideo(NULL)
                , iIONodeAudio(NULL)
                , iMIOFileOutVideo(NULL)
                , iMIOFileOutAudio(NULL)
                , iDownloadContextData(NULL)
                , iCurrentCmdId(0)
                , iRepositionAfterDownloadComplete(false)
                , iPlayUntilEOS(false)
                , iShortPauseResume(false)
                , iLongPauseResume(false)
                , iSeekAfterStart(false)
                , iSeekBeforeStart(false)
                , iTwice(false)
                , iLoop(0)
                , iLoopReq(0)
                , iStepInterval(0)
                , iBeginTime(0)
                , iEndTime(0)
                , iForwardStep(false)
                , iForwardSeekStep(0)
                , iForwardSeekTime(0)
                , iBackwardStep(false)
                , iBackwardSeekStep(0)
                , iBackwardSeekTime(0)
                , iSessionDuration(0)
        {
            iNumBufferingStart = iNumBufferingComplete = iNumUnderflow = iNumDataReady = iNumEOS = 0;
        }

        virtual ~pvplayer_async_test_ppb_base() {}

        void StartTest();
        void Run();

        void CommandCompleted(const PVCmdResponse& aResponse);
        void HandleErrorEvent(const PVAsyncErrorEvent& aEvent);
        void HandleInformationalEvent(const PVAsyncInformationalEvent& aEvent);

        enum PVTestState
        {
            STATE_CREATE,
            STATE_QUERYINTERFACE,
            STATE_ADDDATASOURCE,
            STATE_CONFIGPARAMS,
            STATE_INIT,
            STATE_ADDDATASINK_VIDEO,
            STATE_ADDDATASINK_AUDIO,
            STATE_SETPLAYBACKRANGE_BEFORESTART,
            STATE_PREPARE,
            STATE_GETMETADATAKEYLIST,
            STATE_GETMETADATAVALUELIST,
            STATE_WAIT_FOR_DATAREADY,
            STATE_WAIT_FOR_BUFFCOMPLETE,
            STATE_START,
            STATE_SETPLAYBACKRANGE,
            STATE_PAUSE,
            STATE_SETPLAYBACKRANGE_AFTERSTART,
            STATE_RESUME,
            STATE_PAUSE_TWICE,
            STATE_SETPLAYBACKRANGE_AFTERSTART_TWICE,
            STATE_RESUME_TWICE,
            STATE_STOP,
            STATE_REMOVEDATASINK_VIDEO,
            STATE_REMOVEDATASINK_AUDIO,
            STATE_RESET,
            STATE_REMOVEDATASOURCE,
            STATE_WAIT_FOR_ERROR_HANDLING,
            STATE_CLEANUPANDCOMPLETE
        };

        PVTestState iState;

        PVPlayerInterface* iPlayer;
        PVPlayerDataSourceURL* iDataSource;
        PVPlayerDataSink* iDataSinkVideo;
        PVPlayerDataSink* iDataSinkAudio;
        PVMFNodeInterface* iIONodeVideo;
        PVMFNodeInterface* iIONodeAudio;
        PvmiMIOControl* iMIOFileOutVideo;
        PvmiMIOControl* iMIOFileOutAudio;
        PVMFSourceContextData* iDownloadContextData;

        OSCL_wHeapString<OsclMemAllocator> iDownloadURL;
        OSCL_wHeapString<OsclMemAllocator> iDownloadFilename;
        OSCL_HeapString<OsclMemAllocator> iDownloadProxy;
        OSCL_wHeapString<OsclMemAllocator> iDownloadConfigFilename;

        PVCommandId iCurrentCmdId;
        PVLogger* iLogger;

        virtual void CreateDataSource() = 0;
        virtual void CreateDataSinkVideo() = 0;
        virtual void CreateDataSinkAudio() = 0;
        virtual void CleanupData() {}

        void PrintMetadata();
        PVPMetadataList iMetadataKeyList;
        Oscl_Vector<PvmiKvp, OsclMemAllocator> iMetadataValueList;
        int32 iNumValues;

        int32 iNumBufferingStart;
        int32 iNumBufferingComplete;
        int32 iNumUnderflow;
        int32 iNumDataReady;
        int32 iNumEOS;

        bool iContentTooLarge;

        void enableReposAfterDownloadComplete()
        {
            iRepositionAfterDownloadComplete = true;
        }
        bool iRepositionAfterDownloadComplete;

        void enablePlayUntilEOS()
        {
            iPlayUntilEOS = true;
        }
        bool iPlayUntilEOS;

        void enableShortPauseResume()
        {
            iShortPauseResume = true;
        }
        bool iShortPauseResume;

        void enableLongPauseResume()
        {
            iLongPauseResume = true;
        }
        bool iLongPauseResume;

        void enableSeekAfterStart()
        {
            iSeekAfterStart = true;
        }
        bool iSeekAfterStart;

        void enableSeekBeforeStart()
        {
            iSeekBeforeStart = true;
        }
        bool iSeekBeforeStart;

        void enableTwice()
        {
            iTwice = true;
        }
        bool iTwice;

        void enableLoop()
        {
            iLoop = iLoopReq = 10;
        }
        int32 iLoop;
        int32 iLoopReq;

        void enableForwardStep()
        {
            iForwardStep = true;
            // the following value are in millisecs
            iBeginTime = 0;
            iEndTime = 250 * 1000;
            iForwardSeekStep = 2 * 1000;
            iForwardSeekTime = 60 * 1000;
            iStepInterval = 5 * 1000;
        }
        int32 iStepInterval;
        int32 iBeginTime;
        int32 iEndTime;
        bool iForwardStep;
        int32 iForwardSeekStep;
        int32 iForwardSeekTime;
        bool iBackwardStep;
        int32 iBackwardSeekStep;
        int32 iBackwardSeekTime;

        //for janus drm.
        void PrintJanusError(const PVCmdResponse& aResponse);

        uint32 iSessionDuration;

    private:
        void HandleProtocolEngineNodeErrors(int32 aErr);
        void HandleSocketNodeErrors(int32 aErr);
    private:
        PvmiCapabilityAndConfig* iPlayerCapConfigIF;
        PvmiKvp* iErrorKVP;
        PvmiKvp iKVPSetAsync;
        OSCL_StackString<256> iKeyStringSetAsync;
};


class pvplayer_async_test_ppb_normal : public pvplayer_async_test_ppb_base
{
    public:
        pvplayer_async_test_ppb_normal(PVPlayerAsyncTestParam aTestParam):
                pvplayer_async_test_ppb_base(aTestParam)
        {
            iDownloadContextData = NULL;
            iLogger = PVLogger::GetLoggerObject("pvplayer_async_test_ppb_normal");
            iTestCaseName = _STRLIT_CHAR("Progressive Playback Normal");
        }

        ~pvplayer_async_test_ppb_normal();

        void CreateDataSource();
        void CreateDataSinkVideo();
        void CreateDataSinkAudio();
};

/*!
 *  A test case to test the normal PDL Pause Resume After UnderFlow and playback from an HTTP URL.
 *  - Data Source: http://172.16.6.54/JaniePorche_176.3gp
 *  - Data Sink(s): Video[FileOutputNode-test_player_3gppdlnormal_video.dat]\n
 *                  Audio[FileOutputNode-test_player_3gppdlnormal_audio.dat]
 *  - Sequence:
 *             -# CreatePlayer()
 *             -# AddDataSource()
 *             -# Init()
 *             -# AddDataSink() (video)
 *             -# AddDataSink() (audio)
 *             -# Prepare()
 *             -# Wait for Data Ready event
 *             -# Start()
 *			   -# After getting UnderFlow event
 *			   -# Pause()
 *			   -# Resume()
 *             -# Play until either EOS is reached or 10 seconds after download
 *					finishes.
 *             -# Stop()
 *             -# RemoveDataSink() (video)
 *             -# RemoveDataSink() (audio)
 *             -# Reset()
 *             -# RemoveDataSource()
 *             -# DeletePlayer()
 *
 */
class pvplayer_async_test_PDLPauseResumeAfterUnderFlow : public pvplayer_async_test_downloadbase
{
    public:
        pvplayer_async_test_PDLPauseResumeAfterUnderFlow(PVPlayerAsyncTestParam aTestParam):
                pvplayer_async_test_downloadbase(aTestParam)
        {
            iLogger = PVLogger::GetLoggerObject("pvplayer_async_test_PDLPauseResumeAfterUnderFlow");
            iTestCaseName = _STRLIT_CHAR("PDL Pause Resume After UnderFlow");
        }

        ~pvplayer_async_test_PDLPauseResumeAfterUnderFlow();

        void CreateDataSource();
        void CreateDataSinkVideo();
        void CreateDataSinkAudio();
        void CleanupData();
};

#endif  // TEST_PV_PLAYER_ENGINE_TESTSET5_H_INCLUDED

