blob: 0414186f5e8c35a4edf19b90dfb743de59eeeb9d [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.
* -------------------------------------------------------------------
*/
#include "test_pv_frame_metadata_utility.h"
#include "test_pv_frame_metadata_utility_testset1.h"
#if RUN_JANUSCPM_TESTCASES
#include "test_pv_frame_metadata_utility_testset_januscpm.h"
#endif
#include "oscl_mem.h"
#include "oscl_mem_audit.h"
#include "oscl_error.h"
#include "oscl_scheduler.h"
#include "pvlogger.h"
#include "pvlogger_file_appender.h"
#include "pvlogger_mem_appender.h"
#include "unit_test_args.h"
#include "oscl_utf8conv.h"
#include "oscl_string_utils.h"
#include "OMX_Core.h"
#include "pv_omxcore.h"
#ifndef DEFAULTSOURCEFILENAME
#error // The default source file needs to be defined in config file
#endif
#ifndef DEFAULTSOURCEFORMATTYPE
#error // The format type for default source file needs to be defined in config file
#endif
FILE* file;
#define MAX_LEN 100
class PVLoggerConfigFile
{
/* To change the logging settings without the need to compile the test application
Let us read the logging settings from the file instead of hard coding them over here
The name of the config file is pvlogger.ini
The format of entries in it is like
First entry will decide if the file appender has to be used or error appender will be used.
0 -> ErrAppender will be used
1 -> File Appender will be used
2 -> Mem Appender will be used
Entries after this will decide the module whose logging has to be taken.For example, contents of one sample config file could be
1
1,PVPlayerEngine
8,PVSocketNode
(pls note that no space is allowed between loglevel and logger tag)
This means, we intend to have logging of level 1 for the module PVPlayerEngine
and of level 8 for the PVSocketNode on file.
*/
public:
PVLoggerConfigFile(): iLogFileRead(false)
{
iFileServer.Connect();
// Full path of pvlogger.ini is: SOURCENAME_PREPEND_STRING + pvlogger.ini
oscl_strncpy(iLogFileName, SOURCENAME_PREPEND_STRING,
oscl_strlen(SOURCENAME_PREPEND_STRING) + 1);
oscl_strcat(iLogFileName, "pvlogger.ini");
oscl_memset(ibuffer, 0, sizeof(ibuffer));
iAppenderType = 0;
}
~PVLoggerConfigFile()
{
iFileServer.Close();
}
bool get_next_line(const char *start_ptr, const char * end_ptr,
const char *& line_start,
const char *& line_end)
{
// Finds the boundaries of the next non-empty line within start
// and end ptrs
// This initializes line_start to the first non-whitespace character
line_start = skip_whitespace_and_line_term(start_ptr, end_ptr);
line_end = skip_to_line_term(line_start, end_ptr);
return (line_start < end_ptr);
}
bool IsLoggerConfigFilePresent()
{
if (-1 != ReadAndParseLoggerConfigFile())
return true;
return false;
}
//Read and parse the config file
//retval = -1 if the config file doesnt exist
int8 ReadAndParseLoggerConfigFile()
{
int8 retval = 1;
if (0 != iLogFile.Open(iLogFileName, Oscl_File::MODE_READ, iFileServer))
{
retval = -1;
}
else
{
if (!iLogFileRead)
{
int32 nCharRead = iLogFile.Read(ibuffer, 1, sizeof(ibuffer));
//Parse the buffer for \n chars
Oscl_Vector<char*, OsclMemAllocator> LogConfigStrings;
const char *end_ptr = ibuffer + oscl_strlen(ibuffer) ; // Point just beyond the end
const char *section_start_ptr;
const char *line_start_ptr, *line_end_ptr;
char* end_temp_ptr;
int16 offset = 0;
section_start_ptr = skip_whitespace_and_line_term(ibuffer, end_ptr);
while (section_start_ptr < end_ptr)
{
if (!get_next_line(section_start_ptr, end_ptr,
line_start_ptr, line_end_ptr))
{
break;
}
section_start_ptr = line_end_ptr + 1;
end_temp_ptr = (char*)line_end_ptr;
*end_temp_ptr = '\0';
LogConfigStrings.push_back((char*)line_start_ptr);
}
//Populate the LoggerConfigElements vector
{
if (!LogConfigStrings.empty())
{
Oscl_Vector<char*, OsclMemAllocator>::iterator it;
it = LogConfigStrings.begin();
uint32 appenderType;
PV_atoi(*it, 'd', oscl_strlen(*it), appenderType);
iAppenderType = appenderType;
if (LogConfigStrings.size() > 1)
{
for (it = LogConfigStrings.begin() + 1; it != LogConfigStrings.end(); it++)
{
char* CommaIndex = (char*)oscl_strstr(*it, ",");
if (CommaIndex != NULL)
{
*CommaIndex = '\0';
LoggerConfigElement obj;
uint32 logLevel;
PV_atoi(*it, 'd', oscl_strlen(*it), logLevel);
obj.iLogLevel = logLevel;
obj.iLoggerString = CommaIndex + 1;
iLoggerConfigElements.push_back(obj);
}
}
}
else
{
//Add the config element for complete logging fo all the modules
LoggerConfigElement obj;
obj.iLoggerString = "";
obj.iLogLevel = 8;
iLoggerConfigElements.push_back(obj);
}
}
}
iLogFile.Close();
iLogFileRead = true;
}
}
return retval;
}
void SetLoggerSettings()
{
Oscl_Vector<LoggerConfigElement, OsclMemAllocator>::iterator it;
PVLoggerAppender *appender = NULL;
OsclRefCounter *refCounter = NULL;
if (iLoggerConfigElements.empty())
{
return;
}
if (iAppenderType == 0)
{
appender = new StdErrAppender<TimeAndIdLayout, 1024>();
OsclRefCounterSA<LogAppenderDestructDealloc<StdErrAppender<TimeAndIdLayout, 1024> > > *appenderRefCounter =
new OsclRefCounterSA<LogAppenderDestructDealloc<StdErrAppender<TimeAndIdLayout, 1024> > >(appender);
refCounter = appenderRefCounter;
}
else if (iAppenderType == 1)
{
OSCL_wHeapString<OsclMemAllocator> logfilename(OUTPUTNAME_PREPEND_WSTRING);
logfilename += _STRLIT_WCHAR("player.log");
appender = (PVLoggerAppender*)TextFileAppender<TimeAndIdLayout, 1024>::CreateAppender(logfilename.get_str());
OsclRefCounterSA<LogAppenderDestructDealloc<TextFileAppender<TimeAndIdLayout, 1024> > > *appenderRefCounter =
new OsclRefCounterSA<LogAppenderDestructDealloc<TextFileAppender<TimeAndIdLayout, 1024> > >(appender);
refCounter = appenderRefCounter;
}
else
{
OSCL_wHeapString<OsclMemAllocator> logfilename(OUTPUTNAME_PREPEND_WSTRING);
logfilename += _STRLIT_WCHAR("player.log");
appender = (PVLoggerAppender*)MemAppender<TimeAndIdLayout, 1024>::CreateAppender(logfilename.get_str());
OsclRefCounterSA<LogAppenderDestructDealloc<MemAppender<TimeAndIdLayout, 1024> > > *appenderRefCounter =
new OsclRefCounterSA<LogAppenderDestructDealloc<MemAppender<TimeAndIdLayout, 1024> > >(appender);
refCounter = appenderRefCounter;
}
OsclSharedPtr<PVLoggerAppender> appenderPtr(appender, refCounter);
for (it = iLoggerConfigElements.begin(); it != iLoggerConfigElements.end(); it++)
{
PVLogger *node = NULL;
node = PVLogger::GetLoggerObject(it->iLoggerString);
node->AddAppender(appenderPtr);
node->SetLogLevel(it->iLogLevel);
}
}
private:
class LoggerConfigElement
{
public:
LoggerConfigElement()
{
iLoggerString = NULL;
iLogLevel = 8;
}
char *iLoggerString;
int8 iLogLevel;
};
int8 iAppenderType; //Type of appender to be used for the logging 0-> Err Appender, 1-> File Appender
bool iLogFileRead;
Oscl_File iLogFile;
Oscl_FileServer iFileServer;
char iLogFileName[255];
char ibuffer[1024];
Oscl_Vector<LoggerConfigElement, OsclMemAllocator> iLoggerConfigElements;
};
// Pull out source file name from arguments
// -source sometestfile.mp4
//
//
void FindSourceFile(cmd_line* command_line, OSCL_HeapString<OsclMemAllocator>& aFileNameInfo, PVMFFormatType& aInputFileFormatType, FILE* aFile)
{
aFileNameInfo = SOURCENAME_PREPEND_STRING;
aFileNameInfo += DEFAULTSOURCEFILENAME;
aInputFileFormatType = DEFAULTSOURCEFORMATTYPE;
int iFileArgument = 0;
bool iFileFound = false;
bool cmdline_iswchar = command_line->is_wchar();
int count = command_line->get_count();
// Search for the "-source" argument
// Go through each argument
for (int iFileSearch = 0; iFileSearch < count; iFileSearch++)
{
char argstr[128];
// Convert to UTF8 if necessary
if (cmdline_iswchar)
{
oscl_wchar* argwstr = NULL;
command_line->get_arg(iFileSearch, argwstr);
oscl_UnicodeToUTF8(argwstr, oscl_strlen(argwstr), argstr, 128);
argstr[127] = NULL;
}
else
{
char* tmpstr = NULL;
command_line->get_arg(iFileSearch, tmpstr);
int32 tmpstrlen = oscl_strlen(tmpstr) + 1;
if (tmpstrlen > 128)
{
tmpstrlen = 128;
}
oscl_strncpy(argstr, tmpstr, tmpstrlen);
argstr[tmpstrlen-1] = NULL;
}
// Do the string compare
if (oscl_strcmp(argstr, "-help") == NULL)
{
fprintf(aFile, "Source specification option. Default is 'test.mp4':\n");
fprintf(aFile, " -source sourcename\n");
fprintf(aFile, " Specify the source filename or URL to use for test cases which\n");
fprintf(aFile, " allow user-specified source name. The unit test determines the\n");
fprintf(aFile, " source format type using extension or URL header.\n\n");
}
else if (oscl_strcmp(argstr, "-source") == NULL)
{
iFileFound = true;
iFileArgument = ++iFileSearch;
break;
}
}
if (iFileFound)
{
// Convert to UTF8 if necessary
if (cmdline_iswchar)
{
oscl_wchar* cmd;
command_line->get_arg(iFileArgument, cmd);
char tmpstr[256];
oscl_UnicodeToUTF8(cmd, oscl_strlen(cmd), tmpstr, 256);
tmpstr[255] = NULL;
aFileNameInfo = tmpstr;
}
else
{
char* cmdlinefilename = NULL;
command_line->get_arg(iFileArgument, cmdlinefilename);
aFileNameInfo = cmdlinefilename;
}
// Check the file extension to determine format type
// AAC file
if (oscl_strstr(aFileNameInfo.get_cstr(), ".aac") != NULL || oscl_strstr(aFileNameInfo.get_cstr(), ".AAC") != NULL)
{
aInputFileFormatType = PVMF_MIME_AACFF;
}
// MP3 file
else if (oscl_strstr(aFileNameInfo.get_cstr(), ".mp3") != NULL || oscl_strstr(aFileNameInfo.get_cstr(), ".MP3") != NULL)
{
aInputFileFormatType = PVMF_MIME_MP3FF;
}
// AMR file (IETF and IF2)
else if (oscl_strstr(aFileNameInfo.get_cstr(), ".amr") != NULL || oscl_strstr(aFileNameInfo.get_cstr(), ".AMR") != NULL ||
oscl_strstr(aFileNameInfo.get_cstr(), ".cod") != NULL || oscl_strstr(aFileNameInfo.get_cstr(), ".COD") != NULL)
{
aInputFileFormatType = PVMF_MIME_AMRFF;
}
// RTSP URL
else if ((!oscl_strncmp("rtsp", aFileNameInfo.get_cstr(), 4)) ||
(!oscl_strncmp("RTSP", aFileNameInfo.get_cstr(), 4)))
{
aInputFileFormatType = PVMF_MIME_DATA_SOURCE_RTSP_URL;
}
// HTTP URL
else if (oscl_strstr(aFileNameInfo.get_cstr(), "http:") != NULL || oscl_strstr(aFileNameInfo.get_cstr(), "HTTP:") != NULL)
{
aInputFileFormatType = PVMF_MIME_DATA_SOURCE_HTTP_URL;
}
// MP4/3GP file
else if (oscl_strstr(aFileNameInfo.get_cstr(), ".mp4") != NULL || oscl_strstr(aFileNameInfo.get_cstr(), ".MP4") != NULL ||
oscl_strstr(aFileNameInfo.get_cstr(), ".3gp") != NULL || oscl_strstr(aFileNameInfo.get_cstr(), ".3GP") != NULL)
{
aInputFileFormatType = PVMF_MIME_MPEG4FF;
}
// ASF file
else if (oscl_strstr(aFileNameInfo.get_cstr(), ".asf") != NULL || oscl_strstr(aFileNameInfo.get_cstr(), ".ASF") != NULL ||
oscl_strstr(aFileNameInfo.get_cstr(), ".wma") != NULL || oscl_strstr(aFileNameInfo.get_cstr(), ".WMA") != NULL ||
oscl_strstr(aFileNameInfo.get_cstr(), ".wmv") != NULL || oscl_strstr(aFileNameInfo.get_cstr(), ".WMV") != NULL)
{
aInputFileFormatType = PVMF_MIME_ASFFF;
}
// SDP file
else if (oscl_strstr(aFileNameInfo.get_cstr(), ".sdp") != NULL || oscl_strstr(aFileNameInfo.get_cstr(), ".SDP") != NULL)
{
aInputFileFormatType = PVMF_MIME_DATA_SOURCE_SDP_FILE;
}
// PVX file
else if (oscl_strstr(aFileNameInfo.get_cstr(), ".pvx") != NULL || oscl_strstr(aFileNameInfo.get_cstr(), ".PVX") != NULL)
{
aInputFileFormatType = PVMF_MIME_DATA_SOURCE_PVX_FILE;
}
// WAV file
else if (oscl_strstr(aFileNameInfo.get_cstr(), ".wav") != NULL || oscl_strstr(aFileNameInfo.get_cstr(), ".WAV") != NULL)
{
aInputFileFormatType = PVMF_MIME_WAVFF;
}
// Unknown so set to unknown and let the player engine determine the format type
else
{
fprintf(file, "Source type unknown so setting to unknown and have the utility recognize it\n");
aInputFileFormatType = PVMF_MIME_FORMAT_UNKNOWN;
}
}
}
//Find test range args:
//To run a range of tests by enum ID:
// -test 17 29
void FindTestRange(cmd_line* command_line, int32& iFirstTest, int32 &iLastTest, FILE* aFile)
{
//default is to run all tests.
iFirstTest = 0;
iLastTest = 999;
int iTestArgument = 0;
char *iTestArgStr1 = NULL;
char *iTestArgStr2 = NULL;
bool iTestFound = false;
bool cmdline_iswchar = command_line->is_wchar();
int count = command_line->get_count();
// Search for the "-test" argument
char *iSourceFind = NULL;
if (cmdline_iswchar)
{
iSourceFind = new char[256];
}
// Go through each argument
for (int iTestSearch = 0; iTestSearch < count; iTestSearch++)
{
// Convert to UTF8 if necessary
if (cmdline_iswchar)
{
OSCL_TCHAR* cmd = NULL;
command_line->get_arg(iTestSearch, cmd);
oscl_UnicodeToUTF8(cmd, oscl_strlen(cmd), iSourceFind, 256);
}
else
{
iSourceFind = NULL;
command_line->get_arg(iTestSearch, iSourceFind);
}
// Do the string compare
if (oscl_strcmp(iSourceFind, "-help") == NULL)
{
fprintf(aFile, "Test cases to run option. Default is ALL:\n");
fprintf(aFile, " -test x y\n");
fprintf(aFile, " Specify a range of test cases to run. To run one test case, use the\n");
fprintf(aFile, " same index for x and y.\n\n");
}
else if (oscl_strcmp(iSourceFind, "-test") == NULL)
{
iTestFound = true;
iTestArgument = ++iTestSearch;
break;
}
}
if (cmdline_iswchar)
{
delete[] iSourceFind;
iSourceFind = NULL;
}
if (iTestFound)
{
// Convert to UTF8 if necessary
if (cmdline_iswchar)
{
iTestArgStr1 = new char[256];
OSCL_TCHAR* cmd;
command_line->get_arg(iTestArgument, cmd);
if (cmd)
{
oscl_UnicodeToUTF8(cmd, oscl_strlen(cmd), iTestArgStr1, 256);
}
iTestArgStr2 = new char[256];
command_line->get_arg(iTestArgument + 1, cmd);
if (cmd)
{
oscl_UnicodeToUTF8(cmd, oscl_strlen(cmd), iTestArgStr2, 256);
}
}
else
{
command_line->get_arg(iTestArgument, iTestArgStr1);
command_line->get_arg(iTestArgument + 1, iTestArgStr2);
}
//Pull out 2 integers...
if (iTestArgStr1
&& '0' <= iTestArgStr1[0] && iTestArgStr1[0] <= '9'
&& iTestArgStr2
&& '0' <= iTestArgStr2[0] && iTestArgStr2[0] <= '9')
{
int len = oscl_strlen(iTestArgStr1);
switch (len)
{
case 3:
iFirstTest = 0;
if ('0' <= iTestArgStr1[0] && iTestArgStr1[0] <= '9')
{
iFirstTest = iFirstTest + 100 * (iTestArgStr1[0] - '0');
}
if ('0' <= iTestArgStr1[1] && iTestArgStr1[1] <= '9')
{
iFirstTest = iFirstTest + 10 * (iTestArgStr1[1] - '0');
}
if ('0' <= iTestArgStr1[2] && iTestArgStr1[2] <= '9')
{
iFirstTest = iFirstTest + 1 * (iTestArgStr1[2] - '0');
}
break;
case 2:
iFirstTest = 0;
if ('0' <= iTestArgStr1[0] && iTestArgStr1[0] <= '9')
{
iFirstTest = iFirstTest + 10 * (iTestArgStr1[0] - '0');
}
if ('0' <= iTestArgStr1[1] && iTestArgStr1[1] <= '9')
{
iFirstTest = iFirstTest + 1 * (iTestArgStr1[1] - '0');
}
break;
case 1:
iFirstTest = 0;
if ('0' <= iTestArgStr1[0] && iTestArgStr1[0] <= '9')
{
iFirstTest = iFirstTest + 1 * (iTestArgStr1[0] - '0');
}
break;
default:
break;
}
len = oscl_strlen(iTestArgStr2);
switch (len)
{
case 3:
iLastTest = 0;
if ('0' <= iTestArgStr2[0] && iTestArgStr2[0] <= '9')
{
iLastTest = iLastTest + 100 * (iTestArgStr2[0] - '0');
}
if ('0' <= iTestArgStr2[1] && iTestArgStr2[1] <= '9')
{
iLastTest = iLastTest + 10 * (iTestArgStr2[1] - '0');
}
if ('0' <= iTestArgStr2[2] && iTestArgStr2[2] <= '9')
{
iLastTest = iLastTest + 1 * (iTestArgStr2[2] - '0');
}
break;
case 2:
iLastTest = 0;
if ('0' <= iTestArgStr2[0] && iTestArgStr2[0] <= '9')
{
iLastTest = iLastTest + 10 * (iTestArgStr2[0] - '0');
}
if ('0' <= iTestArgStr2[1] && iTestArgStr2[1] <= '9')
{
iLastTest = iLastTest + 1 * (iTestArgStr2[1] - '0');
}
break;
case 1:
iLastTest = 0;
if ('0' <= iTestArgStr2[0] && iTestArgStr2[0] <= '9')
{
iLastTest = iLastTest + 1 * (iTestArgStr2[0] - '0');
}
break;
default:
break;
}
}
}
if (cmdline_iswchar)
{
if (iTestArgStr1)
{
delete[] iTestArgStr1;
iTestArgStr1 = NULL;
}
if (iTestArgStr2)
{
delete[] iTestArgStr2;
iTestArgStr2 = NULL;
}
if (iSourceFind)
{
delete[] iSourceFind;
iSourceFind = NULL;
}
}
}
void FindMemMgmtRelatedCmdLineParams(cmd_line* command_line, bool& aPrintDetailedMemLeakInfo, FILE* aFile)
{
aPrintDetailedMemLeakInfo = false;
bool cmdline_iswchar = command_line->is_wchar();
int count = command_line->get_count();
// Search for the "-logerr"/"-logwarn" argument
char *iSourceFind = NULL;
if (cmdline_iswchar)
{
iSourceFind = new char[256];
}
// Go through each argument
for (int iTestSearch = 0; iTestSearch < count; iTestSearch++)
{
// Convert to UTF8 if necessary
if (cmdline_iswchar)
{
OSCL_TCHAR* cmd = NULL;
command_line->get_arg(iTestSearch, cmd);
oscl_UnicodeToUTF8(cmd, oscl_strlen(cmd), iSourceFind, 256);
}
else
{
iSourceFind = NULL;
command_line->get_arg(iTestSearch, iSourceFind);
}
// Do the string compare
if (oscl_strcmp(iSourceFind, "-help") == NULL)
{
fprintf(aFile, "Printing leak info option. Default is OFF:\n");
fprintf(aFile, " -leakinfo\n");
fprintf(aFile, " If there is a memory leak, prints out the memory leak information\n");
fprintf(aFile, " after all specified test cases have finished running.\n\n");
}
else if (oscl_strcmp(iSourceFind, "-leakinfo") == NULL)
{
aPrintDetailedMemLeakInfo = true;
}
}
if (cmdline_iswchar)
{
delete[] iSourceFind;
iSourceFind = NULL;
}
}
void FindLogLevel(cmd_line* command_line, int32& loglevel, FILE* aFile)
{
//default is verbose
loglevel = PVLOGMSG_DEBUG;
bool cmdline_iswchar = command_line->is_wchar();
int count = command_line->get_count();
// Search for the "-logerr"/"-logwarn" argument
char *iSourceFind = NULL;
if (cmdline_iswchar)
{
iSourceFind = new char[256];
}
// Go through each argument
for (int iTestSearch = 0; iTestSearch < count; iTestSearch++)
{
// Convert to UTF8 if necessary
if (cmdline_iswchar)
{
OSCL_TCHAR* cmd = NULL;
command_line->get_arg(iTestSearch, cmd);
oscl_UnicodeToUTF8(cmd, oscl_strlen(cmd), iSourceFind, 256);
}
else
{
iSourceFind = NULL;
command_line->get_arg(iTestSearch, iSourceFind);
}
// Do the string compare
if (oscl_strcmp(iSourceFind, "-help") == NULL)
{
fprintf(aFile, "Log level options. Default is debug level:\n");
fprintf(aFile, " -logerr\n");
fprintf(aFile, " Log at error level\n");
fprintf(aFile, " -logwarn\n");
fprintf(aFile, " Log at warning level\n\n");
}
else if (oscl_strcmp(iSourceFind, "-logerr") == NULL)
{
loglevel = PVLOGMSG_ERR;
}
else if (oscl_strcmp(iSourceFind, "-logwarn") == NULL)
{
loglevel = PVLOGMSG_WARNING;
}
}
if (cmdline_iswchar)
{
delete[] iSourceFind;
iSourceFind = NULL;
}
}
int _local_main(FILE* filehandle, cmd_line* command_line);
// Entry point for the unit test program
int local_main(FILE* filehandle, cmd_line* command_line)
{
//Init Oscl
OsclBase::Init();
OsclErrorTrap::Init();
OsclMem::Init();
OMX_MasterInit();
const int numArgs = 10; //change as per the number of args below
char *argv[numArgs];
char arr[numArgs][MAX_LEN];
FILE *InputFile = NULL;
int argc = 0;
fprintf(filehandle, "Test Program for pvFrameMetadata utility class.\n");
InputFile = fopen("input.txt", "r+");
if (NULL != InputFile)
{
int ii = 0;
int len = 0;
fseek(InputFile , 0 , SEEK_SET);
while (!feof(InputFile))
{
arr[ii][0] = '\0';
fgets(arr[ii], 127, InputFile);
len = strlen(arr[ii]);
if (arr[ii][len-1] == '\n')
{
arr[ii][len-1] = '\0';
}
else
{
arr[ii][len-1] = '\0';
}
argv[ii] = arr[ii];
ii++;
}
fclose(InputFile);
argc = ii - 1;
}
int n = 0;
command_line->setup(argc - n, &argv[n]);
bool oPrintDetailedMemLeakInfo = false;
FindMemMgmtRelatedCmdLineParams(command_line, oPrintDetailedMemLeakInfo, filehandle);
//Run the test under a trap
int result = 0;
int32 err = 0;
OSCL_TRY(err, result = _local_main(filehandle, command_line););
//Show any exception.
if (err != 0)
{
fprintf(file, "Error! Leave %d\n", err);
}
//Cleanup
OMX_MasterDeinit();
#if !(OSCL_BYPASS_MEMMGT)
//Check for memory leaks before cleaning up OsclMem.
OsclAuditCB auditCB;
OsclMemInit(auditCB);
if (auditCB.pAudit)
{
MM_Stats_t* stats = auditCB.pAudit->MM_GetStats("");
if (stats)
{
fprintf(file, "\nMemory Stats:\n");
fprintf(file, " peakNumAllocs %d\n", stats->peakNumAllocs);
fprintf(file, " peakNumBytes %d\n", stats->peakNumBytes);
fprintf(file, " totalNumAllocs %d\n", stats->totalNumAllocs);
fprintf(file, " totalNumBytes %d\n", stats->totalNumBytes);
fprintf(file, " numAllocFails %d\n", stats->numAllocFails);
if (stats->numAllocs)
{
fprintf(file, " ERROR: Memory Leaks! numAllocs %d, numBytes %d\n", stats->numAllocs, stats->numBytes);
}
}
uint32 leaks = auditCB.pAudit->MM_GetNumAllocNodes();
if (leaks != 0)
{
if (oPrintDetailedMemLeakInfo)
{
fprintf(file, "ERROR: %d Memory leaks detected!\n", leaks);
MM_AllocQueryInfo*info = auditCB.pAudit->MM_CreateAllocNodeInfo(leaks);
uint32 leakinfo = auditCB.pAudit->MM_GetAllocNodeInfo(info, leaks, 0);
if (leakinfo != leaks)
{
fprintf(file, "ERROR: Leak info is incomplete.\n");
}
for (uint32 i = 0; i < leakinfo; i++)
{
fprintf(file, "Leak Info:\n");
fprintf(file, " allocNum %d\n", info[i].allocNum);
fprintf(file, " fileName %s\n", info[i].fileName);
fprintf(file, " lineNo %d\n", info[i].lineNo);
fprintf(file, " size %d\n", info[i].size);
fprintf(file, " pMemBlock 0x%x\n", info[i].pMemBlock);
fprintf(file, " tag %s\n", info[i].tag);
}
auditCB.pAudit->MM_ReleaseAllocNodeInfo(info);
}
}
}
#endif
OsclMem::Cleanup();
OsclErrorTrap::Cleanup();
OsclBase::Cleanup();
return result;
}
int _local_main(FILE* filehandle, cmd_line* command_line)
{
file = filehandle;
// Print out the extension for help if no argument
if (command_line->get_count() == 0)
{
fprintf(file, " Specify '-help' first to get help information on options\n\n");
}
OSCL_HeapString<OsclMemAllocator> filenameinfo;
PVMFFormatType inputformattype ;
FindSourceFile(command_line, filenameinfo, inputformattype, file);
int32 firsttest, lasttest;
FindTestRange(command_line, firsttest, lasttest, file);
int32 loglevel;
FindLogLevel(command_line, loglevel, file);
fprintf(file, " Input file name '%s'\n", filenameinfo.get_cstr());
fprintf(file, " Test case range %d to %d\n", firsttest, lasttest);
fprintf(file, " Log level %d\n", loglevel);
pvframemetadata_utility_test_suite* util_tests = NULL;
util_tests = new pvframemetadata_utility_test_suite(filenameinfo.get_str(), inputformattype, firsttest, lasttest, loglevel);
if (util_tests)
{
// Run the utility test
util_tests->run_test();
// Print out the results
text_test_interpreter interp;
_STRING rs = interp.interpretation(util_tests->last_result());
fprintf(file, rs.c_str());
const test_result the_result = util_tests->last_result();
delete util_tests;
util_tests = NULL;
return (the_result.success_count() != the_result.total_test_count());
}
else
{
fprintf(file, "ERROR! pvframemetadata_utility_test_suite could not be instantiated.\n");
return 1;
}
}
pvframemetadata_utility_test_suite::pvframemetadata_utility_test_suite(char *aFileName, PVMFFormatType aFileType, int32 aFirstTest, int32 aLastTest, int32 aLogLevel)
: test_case()
{
adopt_test_case(new pvframemetadata_utility_test(aFileName, aFileType, aFirstTest, aLastTest, aLogLevel));
}
pvframemetadata_utility_test::pvframemetadata_utility_test(char *aFileName, PVMFFormatType aFileType, int32 aFirstTest, int32 aLastTest, int32 aLogLevel)
{
iFileName = aFileName;
iFileType = aFileType;
iCurrentTestNumber = 0;
iCurrentTest = NULL;
iFirstTest = aFirstTest;
iLastTest = aLastTest;
iLogLevel = aLogLevel;
iTotalAlloc = 0;
iTotalBytes = 0;
iAllocFails = 0;
iNumAllocs = 0;
}
pvframemetadata_utility_test::~pvframemetadata_utility_test()
{
}
void pvframemetadata_utility_test::TestCompleted(test_case &tc)
{
// Print out the result for this test case
const test_result the_result = tc.last_result();
fprintf(file, " Successes %d, Failures %d\n"
, the_result.success_count() - iTotalSuccess, the_result.failures().size() - iTotalFail);
iTotalSuccess = the_result.success_count();
iTotalFail = the_result.failures().size();
iTotalError = the_result.errors().size();
// Go to next test
++iCurrentTestNumber;
// Stop the scheduler
OsclExecScheduler *sched = OsclExecScheduler::Current();
if (sched)
{
sched->StopScheduler();
}
}
void pvframemetadata_utility_test::test()
{
// Specify the starting test case
iCurrentTestNumber = iFirstTest;
iTotalSuccess = iTotalFail = iTotalError = 0;
while (iCurrentTestNumber <= iLastTest || iCurrentTestNumber < BeyondLastTest)
{
if (iCurrentTest)
{
delete iCurrentTest;
iCurrentTest = NULL;
// Shutdown PVLogger and scheduler before checking mem stats
OsclScheduler::Cleanup();
PVLogger::Cleanup();
#if !(OSCL_BYPASS_MEMMGT)
// Print out the memory usage results for this test case
OsclAuditCB auditCB;
OsclMemInit(auditCB);
if (auditCB.pAudit)
{
MM_Stats_t* stats = auditCB.pAudit->MM_GetStats("");
if (stats)
{
fprintf(file, " Mem stats: TotalAllocs(%d), TotalBytes(%d),\n AllocFailures(%d), AllocLeak(%d)\n",
stats->totalNumAllocs - iTotalAlloc, stats->totalNumBytes - iTotalBytes, stats->numAllocFails - iAllocFails, stats->numAllocs - iNumAllocs);
}
else
{
fprintf(file, "Retrieving memory statistics after running test case failed! Memory statistics result is not available.\n");
}
}
else
{
fprintf(file, "Memory audit not available! Memory statistics result is not available.\n");
}
#endif
}
#if !(OSCL_BYPASS_MEMMGT)
// Obtain the current mem stats before running the test case
OsclAuditCB auditCB;
OsclMemInit(auditCB);
if (auditCB.pAudit)
{
MM_Stats_t* stats = auditCB.pAudit->MM_GetStats("");
if (stats)
{
iTotalAlloc = stats->totalNumAllocs;
iTotalBytes = stats->totalNumBytes;
iAllocFails = stats->numAllocFails;
iNumAllocs = stats->numAllocs;
}
else
{
fprintf(file, "Retrieving memory statistics before running test case failed! Memory statistics result would be invalid.\n");
}
}
else
{
fprintf(file, "Memory audit not available! Memory statistics result would be invalid.\n");
}
#endif
// Stop at last test of selected range.
if (iCurrentTestNumber > iLastTest || iCurrentTestNumber == LastTest)
{
iCurrentTestNumber = BeyondLastTest;
}
else
{
fprintf(file, "\nStarting Test %d: ", iCurrentTestNumber);
SetupLoggerScheduler();
}
// Setup the standard test case parameters based on current unit test settings
PVFrameMetadataAsyncTestParam testparam;
testparam.iObserver = this;
testparam.iTestCase = this;
testparam.iTestMsgOutputFile = file;
testparam.iFileName = iFileName;
testparam.iFileType = iFileType;
testparam.iOutputFrameType = PVMF_MIME_YUV420;
switch (iCurrentTestNumber)
{
case NewDeleteTest:
iCurrentTest = new pvframemetadata_async_test_newdelete(testparam);
break;
case GetSourceMetadataTest:
iCurrentTest = new pvframemetadata_async_test_getmetadata(testparam, 1);
break;
case GetSourceMetadataandFrameTest:
iCurrentTest = new pvframemetadata_async_test_getmetadata(testparam, 2);
break;
case GetSourceMetadataandBestFrameTest:
iCurrentTest = new pvframemetadata_async_test_getmetadata(testparam, 2, true);
break;
case GetAllMetadataTest:
iCurrentTest = new pvframemetadata_async_test_getmetadata(testparam, 3);
break;
case GetFirstFrameYUV420AndMetadataTest:
#if RUN_YUV420_TESTCASES
testparam.iOutputFrameType = PVMF_MIME_YUV420;
iCurrentTest = new pvframemetadata_async_test_getfirstframemetadata(testparam);
fprintf(file, "YUV 4:2:0 ");
#else
fprintf(file, "YUV420 test cases disabled\n");
#endif
break;
case GetFirstFrameYUV420UtilityBufferTest:
#if RUN_YUV420_TESTCASES
testparam.iOutputFrameType = PVMF_MIME_YUV420;
iCurrentTest = new pvframemetadata_async_test_getfirstframeutilitybuffer(testparam);
fprintf(file, "YUV 4:2:0 ");
#else
fprintf(file, "YVU420 test cases disabled\n");
#endif
break;
case GetFirstFrameRGB12AndMetadataTest:
#if RUN_RGB12_TESTCASES
testparam.iOutputFrameType = PVMF_RGB12;
iCurrentTest = new pvframemetadata_async_test_getfirstframemetadata(testparam);
fprintf(file, "RGB 12bpp ");
#else
fprintf(file, "RGB12 test cases disabled\n");
#endif
break;
case GetFirstFrameRGB12UtilityBufferTest:
#if RUN_RGB12_TESTCASES
testparam.iOutputFrameType = PVMF_RGB12;
iCurrentTest = new pvframemetadata_async_test_getfirstframeutilitybuffer(testparam);
fprintf(file, "RGB 12bpp ");
#else
fprintf(file, "RGB12 test cases disabled\n");
#endif
break;
case GetFirstFrameRGB16AndMetadataTest:
#if RUN_RGB16_TESTCASES
testparam.iOutputFrameType = PVMF_MIME_RGB16;
iCurrentTest = new pvframemetadata_async_test_getfirstframemetadata(testparam);
fprintf(file, "RGB 16bpp ");
#else
fprintf(file, "RGB16 test cases disabled\n");
#endif
break;
case GetFirstFrameRGB16UtilityBufferTest:
#if RUN_RGB16_TESTCASES
testparam.iOutputFrameType = PVMF_MIME_RGB16;
iCurrentTest = new pvframemetadata_async_test_getfirstframeutilitybuffer(testparam);
fprintf(file, "RGB 16bpp ");
#else
fprintf(file, "RGB16 test cases disabled\n");
#endif
break;
case GetFirstFrameRGB24AndMetadataTest:
#if RUN_RGB24_TESTCASES
testparam.iOutputFrameType = PVMF_RGB24;
iCurrentTest = new pvframemetadata_async_test_getfirstframemetadata(testparam);
fprintf(file, "RGB 24bpp ");
#else
fprintf(file, "RGB24 test cases disabled\n");
#endif
break;
case GetFirstFrameRGB24UtilityBufferTest:
#if RUN_RGB24_TESTCASES
testparam.iOutputFrameType = PVMF_RGB24;
iCurrentTest = new pvframemetadata_async_test_getfirstframeutilitybuffer(testparam);
fprintf(file, "RGB 24bpp ");
#else
fprintf(file, "RGB24 test cases disabled\n");
#endif
break;
case Get30thFrameTest:
iCurrentTest = new pvframemetadata_async_test_get30thframe(testparam);
break;
case Get10secFrameTest:
iCurrentTest = new pvframemetadata_async_test_get10secframe(testparam);
break;
case CancelCommandTest:
iCurrentTest = new pvframemetadata_async_test_cancelcommand(testparam);
break;
case MultipleGetFirstFrameAndMetadataTest:
iCurrentTest = new pvframemetadata_async_test_multigetfirstframemetadata(testparam);
break;
case MultipleGetFramesYUVTest:
#if RUN_YUV420_TESTCASES
testparam.iOutputFrameType = PVMF_MIME_YUV420;
iCurrentTest = new pvframemetadata_async_test_multigetframe(testparam);
fprintf(file, "YUV 4:2:0 ");
#else
fprintf(file, "YUV420 test cases disabled\n");
#endif
break;
case MultipleGetFramesRGB24Test:
#if RUN_RGB24_TESTCASES
testparam.iOutputFrameType = PVMF_RGB24;
iCurrentTest = new pvframemetadata_async_test_multigetframe(testparam);
fprintf(file, "RGB 24bpp ");
#else
fprintf(file, "RGB24 test cases disabled\n");
#endif
break;
case InvalidSourceFileTest:
iCurrentTest = new pvframemetadata_async_test_invalidsourcefile(testparam);
break;
case NoGetFrameTest:
iCurrentTest = new pvframemetadata_async_test_nogetframe(testparam);
break;
case NoVideoTrackTest:
testparam.iFileName = NOVIDEOSOURCEFILENAME;
testparam.iFileType = NOVIDEOSOURCEFORMATTYPE;
iCurrentTest = new pvframemetadata_async_test_novideotrack(testparam);
break;
case ProtectedMetadataTest:
#if RUN_JANUSCPM_TESTCASES
iCurrentTest = new pvframemetadata_async_test_protectedmetadata(testparam);
#else
fprintf(file, "Janus CPM test cases disabled\n");
#endif
break;
case SetTimeoutAndGetFrameTest:
iCurrentTest = new pvframemetadata_async_test_settimeout_getframe(testparam, 2, false);
break;
case SetPlayerKeyTest:
iCurrentTest = new pvframemetadata_async_test_set_player_key(testparam);
break;
case BeyondLastTest:
default:
iCurrentTestNumber = BeyondLastTest;
break;
}
if (iCurrentTest)
{
OsclExecScheduler *sched = OsclExecScheduler::Current();
if (sched)
{
// Print out the test name
fprintf(file, "%s\n", iCurrentTest->iTestCaseName.get_cstr());
// Start the test
iCurrentTest->StartTest();
// Start the scheduler so the test case would run
#if USE_NATIVE_SCHEDULER
// Have PV scheduler use the scheduler native to the system
sched->StartNativeScheduler();
#else
// Have PV scheduler use its own implementation of the scheduler
sched->StartScheduler();
#endif
}
else
{
fprintf(file, "ERROR! Scheduler is not available. Test case could not run.");
++iCurrentTestNumber;
}
}
else
{
++iCurrentTestNumber;
if (iCurrentTestNumber < BeyondLastTest)
{
// Shutdown PVLogger and scheduler before continuing on
OsclScheduler::Cleanup();
PVLogger::Cleanup();
}
}
}
}
void pvframemetadata_utility_test::SetupLoggerScheduler()
{
// Enable the following code for logging (on Symbian, RDebug)
PVLogger::Init();
PVLoggerConfigFile obj;
if (obj.IsLoggerConfigFilePresent())
{
obj.SetLoggerSettings();
}
// Construct and install the active scheduler
OsclScheduler::Init("PVFrameMetadataUtilityTestScheduler");
}