OSDN Git Service

RIO-7740: Logging in PVME Test not working properly for Threaded Mode
authorPacketVideo CM <engbuild@pv.com>
Wed, 21 Oct 2009 16:46:30 +0000 (09:46 -0700)
committerPacketVideo CM <engbuild@pv.com>
Wed, 21 Oct 2009 16:46:30 +0000 (09:46 -0700)
engines/2way/src/pv_2way_sdkinfo.h
engines/author/src/pv_author_sdkinfo.h
engines/player/src/pv_player_sdkinfo.h
engines/pvme/include/pv_metadata_engine_factory.h
engines/pvme/src/pv_metadata_engine.cpp
engines/pvme/test/src/test_pvme.cpp
engines/pvme/test/src/test_pvme.h
engines/pvme/test/src/test_pvme_testset1.cpp
engines/pvme/test/src/test_pvme_testset1.h

index b4c02ca..1a127ec 100644 (file)
@@ -21,7 +21,7 @@
 // This header file is automatically generated at build-time
 // *** OFFICIAL RELEASE INFO -- Will not auto update
 
-#define PV2WAY_ENGINE_SDKINFO_LABEL "1017470"
+#define PV2WAY_ENGINE_SDKINFO_LABEL "1017508"
 #define PV2WAY_ENGINE_SDKINFO_DATE 0x20091013
 
 #endif //PV_2WAY_SDKINFO_H_INCLUDED
index a9e6a97..c0e848b 100644 (file)
@@ -21,7 +21,7 @@
 // This header file is automatically generated at build-time
 // *** OFFICIAL RELEASE INFO -- Will not auto update
 
-#define PVAUTHOR_ENGINE_SDKINFO_LABEL "1017470"
+#define PVAUTHOR_ENGINE_SDKINFO_LABEL "1017508"
 #define PVAUTHOR_ENGINE_SDKINFO_DATE 0x20091013
 
 #endif //PV_AUTHOR_SDKINFO_H_INCLUDED
index 2989591..4c9a5e3 100644 (file)
@@ -21,7 +21,7 @@
 // This header file is automatically generated at build-time
 // *** OFFICIAL RELEASE INFO -- Will not auto update
 
-#define PVPLAYER_ENGINE_SDKINFO_LABEL "1017470"
+#define PVPLAYER_ENGINE_SDKINFO_LABEL "1017508"
 #define PVPLAYER_ENGINE_SDKINFO_DATE 0x20091013
 
 #endif //PV_PLAYER_SDKINFO_H_INCLUDED
index 2f1b17c..4dbf9db 100644 (file)
@@ -82,6 +82,9 @@ class PVMetadataEngineInterfaceContainer
         OsclThreadPriority iPriority;
         OsclSemaphore iSem;
 
+        uint32 iAppenderType; //Type of appender to be used for the logging 0-> Err Appender, 1-> File Appender
+        Oscl_Vector<LoggerConfigElement, OsclMemAllocator> iLoggerConfigElements;
+        OSCL_wHeapString<OsclMemAllocator> iLogfilename;
 };
 
 /**
index ae4d66e..db8d35b 100644 (file)
@@ -80,6 +80,54 @@ void PVMetadataEngine::Construct(PVMetadataEngineInterfaceContainer& aPVMEContai
     iErrorEventObserver = aContainer->iErrorEventObserver;
     iInfoEventObserver = aContainer->iInfoEventObserver;
 
+    if (aContainer->iMode == PV_METADATA_ENGINE_THREADED_MODE)
+    {
+        Oscl_Vector<LoggerConfigElement, OsclMemAllocator>::iterator it;
+        PVLoggerAppender *appender = NULL;
+        OsclRefCounter *refCounter = NULL;
+
+        iAppenderType = aContainer->iAppenderType;
+        iLoggerConfigElements = aContainer->iLoggerConfigElements;
+
+        if (iAppenderType == 1)
+        {
+            logfilename = aContainer->iLogfilename;
+        }
+
+        if (iAppenderType == 0)
+        {
+            appender = new StdErrAppender<TimeAndIdLayout, 1024>();
+            OsclRefCounterSA<AppenderDestructDealloc<StdErrAppender<TimeAndIdLayout, 1024> > > *appenderRefCounter =
+                new OsclRefCounterSA<AppenderDestructDealloc<StdErrAppender<TimeAndIdLayout, 1024> > >(appender);
+            refCounter = appenderRefCounter;
+        }
+        else if (iAppenderType == 1)
+        {
+            appender = (PVLoggerAppender*)TextFileAppender<TimeAndIdLayout, 1024>::CreateAppender(logfilename.get_str());
+            OsclRefCounterSA<AppenderDestructDealloc<TextFileAppender<TimeAndIdLayout, 1024> > > *appenderRefCounter =
+                new OsclRefCounterSA<AppenderDestructDealloc<TextFileAppender<TimeAndIdLayout, 1024> > >(appender);
+            refCounter = appenderRefCounter;
+        }
+        else
+        {
+            appender = (PVLoggerAppender*)MemAppender<TimeAndIdLayout, 1024>::CreateAppender(logfilename.get_str());
+            OsclRefCounterSA<AppenderDestructDealloc<MemAppender<TimeAndIdLayout, 1024> > > *appenderRefCounter =
+                new OsclRefCounterSA<AppenderDestructDealloc<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);
+        }
+    }
+
     iCommandIdMut.Create();
     iOOTSyncCommandSem.Create();
     iThreadSafeQueue.Configure(this);
index 1709226..cd1fbaa 100644 (file)
 #include "test_pvme.h"
 #endif
 
-#ifndef PVLOGGER_CFG_FILE_PARSER_H_INCLUDED
-#include "pvlogger_cfg_file_parser.h"
-#endif
-
 #include "test_pvme_testset1.h"
 
 FILE* file;
@@ -56,6 +52,172 @@ int fgetline(Oscl_File* aFp, char aLine[], int aMax)
     return nch;
 }
 
+bool PVLoggerConfigFile::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 PVLoggerConfigFile::IsLoggerConfigFilePresent()
+{
+    if (-1 != ReadAndParseLoggerConfigFile())
+        return true;
+    return false;
+}
+
+//Read and parse the config file
+//retval = -1 if the config file doesnt exist
+int8 PVLoggerConfigFile::ReadAndParseLoggerConfigFile()
+{
+    int8 retval = 1;
+
+    if (0 != iLogFile.Open(iLogFileName, Oscl_File::MODE_READ, iFileServer))
+    {
+        retval = -1;
+    }
+    else
+    {
+        if (!iLogFileRead)
+        {
+            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;
+
+            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 = (char*)"";
+                        obj.iLogLevel = 8;
+                        iLoggerConfigElements.push_back(obj);
+                    }
+                }
+            }
+            iLogFile.Close();
+            iLogFileRead = true;
+        }
+    }
+    return retval;
+}
+
+void PVLoggerConfigFile::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> testlogfilename;
+        //File to be sent to pvme for logging in threaded mode
+        logfilename += OUTPUTNAME_PREPEND_WSTRING;
+        logfilename += _STRLIT_WCHAR("pvme.log");
+        //File for logging PVME test log statements in threaded mode, all logs in non-threaded mode
+        testlogfilename += OUTPUTNAME_PREPEND_WSTRING;
+        testlogfilename += _STRLIT_WCHAR("pvme_test.log");
+        appender = (PVLoggerAppender*)TextFileAppender<TimeAndIdLayout, 1024>::CreateAppender(testlogfilename.get_str());
+        OsclRefCounterSA<LogAppenderDestructDealloc<TextFileAppender<TimeAndIdLayout, 1024> > > *appenderRefCounter =
+            new OsclRefCounterSA<LogAppenderDestructDealloc<TextFileAppender<TimeAndIdLayout, 1024> > >(appender);
+        refCounter = appenderRefCounter;
+    }
+    else
+    {
+        OSCL_wHeapString<OsclMemAllocator> testlogfilename;
+        logfilename += OUTPUTNAME_PREPEND_WSTRING;
+        logfilename += _STRLIT_WCHAR("pvme.log");
+        testlogfilename += OUTPUTNAME_PREPEND_WSTRING;
+        testlogfilename += _STRLIT_WCHAR("pvme_test.log");
+        appender = (PVLoggerAppender*)MemAppender<TimeAndIdLayout, 1024>::CreateAppender(testlogfilename.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);
+    }
+}
 
 //Find test range args:
 //To run a range of tests by enum ID:
@@ -701,13 +863,7 @@ void pvmetadataengine_test::test()
         else
         {
             fprintf(file, "\nStarting Test %d: ", iCurrentTestNumber);
-            PVLogger::Init();
-            OSCL_HeapString<OsclMemAllocator> cfgfilename(PVLOG_PREPEND_CFG_FILENAME);
-            cfgfilename += PVLOG_CFG_FILENAME;
-            OSCL_HeapString<OsclMemAllocator> logfilename(PVLOG_PREPEND_OUT_FILENAME);
-            logfilename += PVLOG_OUT_FILENAME;
-            PVLoggerCfgFileParser::Parse(cfgfilename.get_str(), logfilename.get_str());
-            OsclScheduler::Init("PVMetadataEngineTestScheduler"); // construct and install active scheduler
+            SetupLoggerScheduler();
         }
 
         // Setup the standard test case parameters based on current unit test settings
@@ -719,11 +875,11 @@ void pvmetadataengine_test::test()
         switch (iCurrentTestNumber)
         {
             case GetSourceMetadataNonThreadedModeTest:
-                iCurrentTest = new pv_metadata_engine_test(testparam, PV_METADATA_ENGINE_NON_THREADED_MODE);
+                iCurrentTest = new pv_metadata_engine_test(testparam, PV_METADATA_ENGINE_NON_THREADED_MODE, obj);
                 break;
 
             case GetSourceMetadataThreadedModeTest:
-                iCurrentTest = new pv_metadata_engine_test(testparam, PV_METADATA_ENGINE_THREADED_MODE);
+                iCurrentTest = new pv_metadata_engine_test(testparam, PV_METADATA_ENGINE_THREADED_MODE, obj);
                 break;
 
             case BeyondLastTest:
@@ -769,3 +925,17 @@ void pvmetadataengine_test::test()
     }
 }
 
+void pvmetadataengine_test::SetupLoggerScheduler()
+{
+    // Enable the following code for logging (on Symbian, RDebug)
+    PVLogger::Init();
+    if (obj.IsLoggerConfigFilePresent())
+    {
+        obj.SetLoggerSettings();
+    }
+    // Construct and install the active scheduler
+    OsclScheduler::Init("PVMetadataEngineTestScheduler");
+}
+
+
+
index 1bbc777..da14066 100644 (file)
 
 class pv_metadata_engine_test;
 
+template<class DestructClass>
+class LogAppenderDestructDealloc : public OsclDestructDealloc
+{
+    public:
+        virtual void destruct_and_dealloc(OsclAny *ptr)
+        {
+            delete((DestructClass*)ptr);
+        }
+};
+
 //This function is used to read the contents of a file, one line at a time.
 int fgetline(Oscl_File* aFp, char aLine[], int aMax);
 
+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,PVMetadataEngine
+            (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 PVMetadataEngine
+            on file.
+        */
+    public:
+
+        uint32 iAppenderType; //Type of appender to be used for the logging 0-> Err Appender, 1-> File Appender
+        Oscl_Vector<LoggerConfigElement, OsclMemAllocator> iLoggerConfigElements;
+        OSCL_wHeapString<OsclMemAllocator> logfilename;
+
+        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);
+
+        bool IsLoggerConfigFilePresent();
+
+        int8 ReadAndParseLoggerConfigFile();
+
+        void SetLoggerSettings();
+
+    private:
+
+        bool iLogFileRead;
+        Oscl_File iLogFile;
+        Oscl_FileServer iFileServer;
+        char iLogFileName[255];
+        char ibuffer[1024];
+
+};
+
+
 class pvme_test_suite : public test_case
 {
     public:
@@ -161,6 +232,7 @@ class pvmetadataengine_test : public test_case,
 
         // For logging
         int32 iLogLevel;
+        PVLoggerConfigFile obj;
 
         // For memory statistics
         uint32 iTotalAlloc;
index 7e76bca..5713151 100644 (file)
@@ -59,6 +59,10 @@ void pv_metadata_engine_test::Run()
                 iThreadSafeInfoQueue.Configure(this);
 
                 iPVMEContainer.iSem.Create();
+
+                iPVMEContainer.iAppenderType = iLoggerInfo.iAppenderType;
+                iPVMEContainer.iLogfilename = iLoggerInfo.logfilename;
+                iPVMEContainer.iLoggerConfigElements = iLoggerInfo.iLoggerConfigElements;
             }
 
             OSCL_TRY(error, PVMetadataEngineFactory::CreatePVMetadataEngine(iPVMEContainer));
@@ -390,6 +394,7 @@ void pv_metadata_engine_test::ReadMetadataFile()
     Oscl_FileServer fileServer;
     err = fileServer.Connect();
 
+    // Full path of MetadataFile is: SOURCENAME_PREPEND_STRING + pvlogger.ini
     oscl_strncpy(KeysFileName, SOURCENAME_PREPEND_STRING,
                  oscl_strlen(SOURCENAME_PREPEND_STRING) + 1);
     oscl_strcat(KeysFileName, "MetadataKeys.txt");
@@ -467,6 +472,7 @@ void pv_metadata_engine_test::ReadClipsFile()
     if (0 == err)
     {
         Oscl_File *ClipsFile = new Oscl_File;
+        // Full path of ClipsFile is: SOURCENAME_PREPEND_STRING + pvlogger.ini
         oscl_strncpy(ClipsFileName, SOURCENAME_PREPEND_STRING,
                      oscl_strlen(SOURCENAME_PREPEND_STRING) + 1);
         oscl_strcat(ClipsFileName, "Clips.txt");
index 601687a..16279b0 100644 (file)
 #include "oscl_file_io.h"
 #endif
 
+#ifndef PVMI_CONFIG_AND_CAPABILITY_H_INCLUDED
+#include "pvmi_config_and_capability.h"
+#endif
+
 #ifndef OSCL_ERROR_CODES_H_INCLUDED
 #include "oscl_error_codes.h"
 #endif
@@ -75,6 +79,7 @@
 
 
 class pvmetadataengine_test_observer;
+class PVLoggerConfigFile;
 
 extern FILE* file;
 #define MAX_LEN 100
@@ -102,9 +107,9 @@ class pv_metadata_engine_test : public OsclTimerObject,
         public ThreadSafeQueueObserver
 {
     public:
-        pv_metadata_engine_test(PVMetadataEngineTestParam aTestParam, PVMetadataEngineThreadMode aMode):
+        pv_metadata_engine_test(PVMetadataEngineTestParam aTestParam, PVMetadataEngineThreadMode aMode, PVLoggerConfigFile& aLoggerInfo):
                 OsclTimerObject(OsclActiveObject::EPriorityNominal, "PVMetadataEngineTest")
-                , iCurrentCmdId(0)
+                , iCurrentCmdId(0), iLoggerInfo(aLoggerInfo)
 
         {
             OSCL_ASSERT(aTestParam.iObserver != NULL);
@@ -240,6 +245,9 @@ class pv_metadata_engine_test : public OsclTimerObject,
         //Threaded or Non-Threaded Mode
         PVMetadataEngineThreadMode iMode;
 
+        //To pass logging information to PVME
+        PVLoggerConfigFile& iLoggerInfo;
+
         //To store the clips
         Oscl_Vector<char*, OsclMemAllocator> iClips;
         Oscl_Vector<char*, OsclMemAllocator>::iterator it;