blob: f27f7078e5ccf4ff9400014047d9a98f857390ed [file] [log] [blame]
/* ------------------------------------------------------------------
* Copyright (C) 1998-2009 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_FRAME_METADATA_UTILITY_H_INCLUDED
#define TEST_PV_FRAME_METADATA_UTILITY_H_INCLUDED
#ifndef TEST_CASE_H_INCLUDED
#include "test_case.h"
#endif
#ifndef TEXT_TEST_INTERPRETER_H_INCLUDED
#include "text_test_interpreter.h"
#endif
#ifndef OSCL_SCHEDULER_AO_H_INCLUDED
#include "oscl_scheduler_ao.h"
#endif
#ifndef OSCL_EXCEPTION_H_INCLUDE
#include "oscl_exception.h"
#endif
#ifndef PV_FRAME_METADATA_FACTORY_H_INCLUDED
#include "pv_frame_metadata_factory.h"
#endif
#ifndef PV_FRAME_METADATA_INTERFACE_H_INCLUDED
#include "pv_frame_metadata_interface.h"
#endif
#ifndef PV_ENGINE_OBSERVER_H_INCLUDED
#include "pv_engine_observer.h"
#endif
#ifndef PVLOGGER_H_INCLUDED
#include "pvlogger.h"
#endif
#ifndef PVLOGGER_STDERR_APPENDER_H_INCLUDED
#include "pvlogger_stderr_appender.h"
#endif
#ifndef PVLOGGER_TIME_AND_ID_LAYOUT_H_INCLUDED
#include "pvlogger_time_and_id_layout.h"
#endif
#ifndef OSCL_UTF8CONV_H_INCLUDED
#include "oscl_utf8conv.h"
#endif
#ifndef TEST_PV_FRAME_METADATA_UTILITY_CONFIG_H_INCLUDED
#include "test_pv_frame_metadata_utility_config.h"
#endif
template<class DestructClass>
class LogAppenderDestructDealloc : public OsclDestructDealloc
{
public:
virtual void destruct_and_dealloc(OsclAny *ptr)
{
delete((DestructClass*)ptr);
}
};
class pvframemetadata_utility_test_suite : public test_case
{
public:
pvframemetadata_utility_test_suite(char *aFilename, PVMFFormatType aFiletype, int32 aFirstTest, int32 aLastTest, int32 aLogLevel);
};
// Observer class for pvFrameMetadata async test to notify completion of test
class pvframemetadata_async_test_observer
{
public:
// Signals completion of test. Test instance can be deleted after this callback completes.
virtual void TestCompleted(test_case &) = 0;
};
typedef struct
{
pvframemetadata_async_test_observer* iObserver;
test_case* iTestCase;
FILE* iTestMsgOutputFile;
char* iFileName;
PVMFFormatType iFileType;
PVMFFormatType iOutputFrameType;
} PVFrameMetadataAsyncTestParam;
#define PVFMUATB_TEST_IS_TRUE(condition) (iTestCase->test_is_true_stub( (condition), (#condition), __FILE__, __LINE__ ))
// The base class for all pvframemetadata utility asynchronous tests
class pvframemetadata_async_test_base : public OsclTimerObject,
public PVCommandStatusObserver,
public PVInformationalEventObserver,
public PVErrorEventObserver
{
public:
pvframemetadata_async_test_base(PVFrameMetadataAsyncTestParam aTestParam) :
OsclTimerObject(OsclActiveObject::EPriorityNominal, "PVFrameMetadataUtilityAsyncTestBase")
{
OSCL_ASSERT(aTestParam.iObserver != NULL);
OSCL_ASSERT(aTestParam.iTestCase != NULL);
iObserver = aTestParam.iObserver;
iTestCase = aTestParam.iTestCase;
iTestMsgOutputFile = aTestParam.iTestMsgOutputFile;
iFileName = aTestParam.iFileName;
iFileType = aTestParam.iFileType;
iOutputFrameType = aTestParam.iOutputFrameType;
oscl_UTF8ToUnicode(iOutputFrameTypeString.get_str(), iOutputFrameTypeString.get_size(), iTempWCharBuf, 512);
iOutputFrameTypeWString.set(iTempWCharBuf, oscl_strlen(iTempWCharBuf));
iTestCaseName = _STRLIT_CHAR(" ");
// Initialize the variables to use for context data testing
iContextObjectRefValue = 0x5C7A; // some random number
iContextObject = iContextObjectRefValue;
}
virtual ~pvframemetadata_async_test_base() {}
virtual void StartTest() = 0;
virtual void CommandCompleted(const PVCmdResponse& /*aResponse*/) {}
virtual void HandleErrorEvent(const PVAsyncErrorEvent& /*aEvent*/) {}
virtual void HandleInformationalEvent(const PVAsyncInformationalEvent& /*aEvent*/) {}
// Utility function to retrieve the filename from string and replace ',' with '_'
void RetrieveFilename(const oscl_wchar* aSource, OSCL_wHeapString<OsclMemAllocator>& aFilename)
{
if (aSource == NULL)
{
return;
}
// Find the last '\' or '/' in the string
oscl_wchar* lastslash = (oscl_wchar*)aSource;
bool foundlastslash = false;
while (!foundlastslash)
{
const oscl_wchar* tmp1 = oscl_strstr(lastslash, _STRLIT_WCHAR("\\"));
const oscl_wchar* tmp2 = oscl_strstr(lastslash, _STRLIT_WCHAR("/"));
if (tmp1 != NULL)
{
lastslash = (oscl_wchar*)tmp1 + 1;
}
else if (tmp2 != NULL)
{
lastslash = (oscl_wchar*)tmp2 + 1;
}
else
{
foundlastslash = true;
}
}
// Now copy the filename
if (lastslash)
{
aFilename = lastslash;
}
// Replace each '.' in filename with '_'
bool finishedreplace = false;
while (!finishedreplace)
{
const oscl_wchar* tmp = oscl_strstr(aFilename.get_cstr(), _STRLIT_WCHAR("."));
if (tmp != NULL)
{
oscl_strncpy((oscl_wchar*)tmp, _STRLIT_WCHAR("_"), 1);
}
else
{
finishedreplace = true;
}
}
}
pvframemetadata_async_test_observer* iObserver;
test_case* iTestCase;
FILE* iTestMsgOutputFile;
char *iFileName;
oscl_wchar iTempWCharBuf[512];
PVMFFormatType iFileType;
PVMFFormatType iOutputFrameType;
OSCL_HeapString<OsclMemAllocator> iOutputFrameTypeString;
OSCL_wHeapString<OsclMemAllocator> iOutputFrameTypeWString;
OSCL_HeapString<OsclMemAllocator> iTestCaseName;
uint32 iContextObject;
uint32 iContextObjectRefValue;
};
// test_base-based class which will run async tests on pvFrameMetadata utility
class pvframemetadata_utility_test : public test_case,
public pvframemetadata_async_test_observer
{
public:
pvframemetadata_utility_test(char *aFileName, PVMFFormatType aFileType, int32 aFirstTest, int32 aLastTest, int32 aLogLevel);
~pvframemetadata_utility_test();
enum PVFrameMetadataUtilityAsyncTests
{
NewDeleteTest = 0,
GetSourceMetadataTest = NewDeleteTest + 1,
GetSourceMetadataandFrameTest = GetSourceMetadataTest + 1,
GetSourceMetadataandBestFrameTest = GetSourceMetadataandFrameTest + 1,
GetAllMetadataTest = GetSourceMetadataandBestFrameTest + 1, //4
GetFirstFrameYUV420AndMetadataTest = GetAllMetadataTest + 1, //5
GetFirstFrameYUV420UtilityBufferTest = GetFirstFrameYUV420AndMetadataTest + 1,
GetFirstFrameRGB12AndMetadataTest = GetFirstFrameYUV420UtilityBufferTest + 1,
GetFirstFrameRGB12UtilityBufferTest = GetFirstFrameRGB12AndMetadataTest + 1,
GetFirstFrameRGB16AndMetadataTest = GetFirstFrameRGB12UtilityBufferTest + 1,
GetFirstFrameRGB16UtilityBufferTest = GetFirstFrameRGB16AndMetadataTest + 1,
GetFirstFrameRGB24AndMetadataTest = GetFirstFrameRGB16UtilityBufferTest + 1,
GetFirstFrameRGB24UtilityBufferTest = GetFirstFrameRGB24AndMetadataTest + 1, //12
Get30thFrameTest = GetFirstFrameRGB24UtilityBufferTest + 1, //13
Get10secFrameTest = Get30thFrameTest + 1,
CancelCommandTest = Get10secFrameTest + 1, //15
MultipleGetFirstFrameAndMetadataTest = CancelCommandTest + 1, //16
MultipleGetFramesYUVTest = MultipleGetFirstFrameAndMetadataTest + 1,
MultipleGetFramesRGB24Test = MultipleGetFramesYUVTest + 1,
InvalidSourceFileTest = MultipleGetFramesRGB24Test + 1, //19
NoGetFrameTest = InvalidSourceFileTest + 1,
NoVideoTrackTest = NoGetFrameTest + 1,
ProtectedMetadataTest = NoVideoTrackTest + 1,
SetTimeoutAndGetFrameTest = ProtectedMetadataTest + 1,
SetPlayerKeyTest = SetTimeoutAndGetFrameTest + 1,
LastTest = SetPlayerKeyTest + 1,//placeholder
BeyondLastTest = 999 //placeholder
};
// From test_case
virtual void test();
// From pvframemetadata_async_test_observer
void TestCompleted(test_case&);
void SetupLoggerScheduler();
private:
char *iFileName;
PVMFFormatType iFileType;
int iCurrentTestNumber;
pvframemetadata_async_test_base* iCurrentTest;
int32 iFirstTest;
int32 iLastTest;
// For test results
int iTotalSuccess;
int iTotalError;
int iTotalFail;
// For logging
int32 iLogLevel;
// For memory statistics
uint32 iTotalAlloc;
uint32 iTotalBytes;
uint32 iAllocFails;
uint32 iNumAllocs;
};
#endif