/* * @copyright Copyright (c) 2016-2019 TOYOTA MOTOR CORPORATION. * * 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. */ /////////////////////////////////////////////////////////////////////////////// /// \ingroup tag_SS_LoggerService /// \brief Provide support for CPU high load monitor configuration. /// /////////////////////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////////////////////// // INCLUDES /////////////////////////////////////////////////////////////////////////////// #include "ss_logger_cfg.h" #include #include #include #include #include #include #include #include #include #include #include #include #include #include const static UI_32 cMAX_EMMC_COUNTER_VALUE = 100000u; // NOLINT (build/storage_class) /////////////////////////////////////////////////////////////////////////////// // CLASS METHODS /////////////////////////////////////////////////////////////////////////////// CLoggerCfg::CLoggerCfg() noexcept : m_logMaxFileSize(0), m_performanceLogMaxFileSize(0), m_emmcOutputMax(0), m_emmcOutputErrMax(0), m_emmcOutputGrpRelaunchMax(0), m_emmcOutputNaviLogMax(0), m_emmcOutputNaviLogNmlMax(0), m_emmcOutputNaviLogErrMax(0), m_emmcOutputPath(""), m_emmcOutputNaviLogPath(""), m_usb0MountPath(""), m_usb1MountPath(""), m_sdMountPath(""), m_eDevType(eDevUSB1), m_UserInvokedLoggingNumber(1u), m_EmmcCounter(0u), m_eLoggerUDPLoggingStatus(eDeactivate), m_eLoggerStatus(SS_LOGGER_DEFAULT_VALUE) { m_udpEnvFlag = FALSE; std::memset(m_logMask, 0, sizeof(m_logMask)); } CLoggerCfg::~CLoggerCfg(void) { // LCOV_EXCL_START 14:global instance AGL_ASSERT_NOT_TESTED(); // LCOV_EXCL_LINE 200: test assert } // LCOV_EXCL_STOP EFrameworkunifiedStatus CLoggerCfg::Initialize(HANDLE f_hApp) { FRAMEWORKUNIFIEDLOG(ZONE_FUNC, __FUNCTION__, "+"); char* l_udp_env = getenv("UDPLOGS_ON"); m_udpEnvFlag = ( l_udp_env == NULL ? FALSE : (strcmp("TRUE", l_udp_env) == 0 ? TRUE : FALSE)); FRAMEWORKUNIFIEDLOG(ZONE_FUNC, __FUNCTION__, "-"); return eFrameworkunifiedStatusOK; } EFrameworkunifiedStatus CLoggerCfg::SetandPersistLoggingParams(HANDLE f_hApp, STLoggerSetAllParams f_Params, BOOL f_InitCall) { FRAMEWORKUNIFIEDLOG(ZONE_FUNC, __FUNCTION__, "+"); EFrameworkunifiedStatus l_eStatus = eFrameworkunifiedStatusOK; BOOL l_paramChanged = f_InitCall; BOOL l_updateLoggerState = f_InitCall; if ((TRUE == l_paramChanged) // LCOV_EXCL_BR_LINE 200:l_paramChanged is never TRUE || (m_eLoggerStatus != f_Params.Logger_State) || // LCOV_EXCL_BR_LINE 200:Because m_UserInvokedLoggingNumber != f_Params.Log_FolderCnt is never false (m_UserInvokedLoggingNumber != f_Params.Log_FolderCnt) || (m_eLoggerUDPLoggingStatus != f_Params.Logger_UDPState) || (m_eDevType != f_Params.Device_Type)) { l_paramChanged = TRUE; } else { l_paramChanged = FALSE; } l_updateLoggerState = ((l_updateLoggerState == TRUE) || (m_eLoggerStatus != f_Params.Logger_State)) ? TRUE : FALSE; // After startup Logging will be set to default value if (TRUE == f_InitCall) { // LCOV_EXCL_BR_LINE 200:f_InitCall is never TRUE // LCOV_EXCL_START 200:f_InitCall is never TRUE AGL_ASSERT_NOT_TESTED(); // LCOV_EXCL_LINE 200: test assert m_eLoggerStatus = SS_LOGGER_DEFAULT_VALUE; // LCOV_EXCL_STOP } else { m_eLoggerStatus = f_Params.Logger_State; } m_eLoggerUDPLoggingStatus = f_Params.Logger_UDPState; m_UserInvokedLoggingNumber = f_Params.Log_FolderCnt; m_eDevType = f_Params.Device_Type; if (TRUE == l_paramChanged) { l_eStatus = PersistLoggingParam(f_hApp); LOG_STATUS_IF_ERRORED(l_eStatus, // LCOV_EXCL_BR_LINE 15: macro "PersistLoggingParam()"); } FRAMEWORKUNIFIEDLOG(ZONE_FUNC, __FUNCTION__, "-"); return (l_eStatus); } EFrameworkunifiedStatus CLoggerCfg::SetLoggingParams(HANDLE f_hApp, STLoggerSetParams f_stLoggerSetParams) noexcept { FRAMEWORKUNIFIEDLOG(ZONE_FUNC, __FUNCTION__, "+"); EFrameworkunifiedStatus l_eStatus = eFrameworkunifiedStatusOK; STLoggerSetAllParams l_Params; l_Params.Logger_UDPState = m_eLoggerUDPLoggingStatus; l_Params.Log_FolderCnt = m_UserInvokedLoggingNumber; l_Params.Logger_State = f_stLoggerSetParams.Logger_State; l_Params.Device_Type = f_stLoggerSetParams.Device_Type; l_eStatus = SetandPersistLoggingParams(f_hApp, l_Params, FALSE); LOG_STATUS_IF_ERRORED(l_eStatus, "SetandPersistLoggingParams()"); // LCOV_EXCL_BR_LINE 15: macro FRAMEWORKUNIFIEDLOG(ZONE_FUNC, __FUNCTION__, "-"); return (l_eStatus); } EFrameworkunifiedStatus CLoggerCfg::SetUDPLogging(HANDLE f_hApp, ELOGGER_STAT f_eUDPLoggingStatus) noexcept { FRAMEWORKUNIFIEDLOG(ZONE_FUNC, __FUNCTION__, "+"); EFrameworkunifiedStatus l_eStatus = eFrameworkunifiedStatusOK; STLoggerSetAllParams l_Params; l_Params.Logger_UDPState = f_eUDPLoggingStatus; l_Params.Log_FolderCnt = m_UserInvokedLoggingNumber; l_Params.Logger_State = m_eLoggerStatus; l_Params.Device_Type = m_eDevType; l_eStatus = SetandPersistLoggingParams(f_hApp, l_Params, FALSE); LOG_STATUS_IF_ERRORED(l_eStatus, "SetandPersistLoggingParams()"); // LCOV_EXCL_BR_LINE 15: macro FRAMEWORKUNIFIEDLOG(ZONE_FUNC, __FUNCTION__, "-"); return (l_eStatus); } EFrameworkunifiedStatus CLoggerCfg::PersistLoggingParam(HANDLE f_hApp) { FRAMEWORKUNIFIEDLOG(ZONE_FUNC, __FUNCTION__, "+"); FRAMEWORKUNIFIEDLOG( ZONE_INFO, __FUNCTION__, "LoggerState = %d, Device_Type = %d,UDPLogging = %d, TriggerNumber = %d", m_eLoggerStatus, m_eDevType, m_eLoggerUDPLoggingStatus, m_UserInvokedLoggingNumber); // LCOV_EXCL_BR_LINE 11:Unexpected branch this->UpdateLoggingStatus(); FRAMEWORKUNIFIEDLOG(ZONE_FUNC, __FUNCTION__, "-"); return eFrameworkunifiedStatusOK; } void CLoggerCfg::RemoveCarriageReturn(std::string &f_str) { if (f_str.empty()) { // LCOV_EXCL_BR_LINE 8: Because there is no empty string case return; } if ('\r' == f_str.at(f_str.size() - 1)) { f_str.erase(f_str.size() - 1, 1); } } EFrameworkunifiedStatus CLoggerCfg::Load(const std::string &f_filePathAndName) { FRAMEWORKUNIFIEDLOG(ZONE_FUNC, __FUNCTION__, "+"); EFrameworkunifiedStatus l_eStatus = eFrameworkunifiedStatusDbRecNotFound; if ("" == f_filePathAndName) { // LCOV_EXCL_BR_LINE 200: Because there is no empty string case // LCOV_EXCL_START 200: Because there is no empty string case AGL_ASSERT_NOT_TESTED(); // LCOV_EXCL_LINE 200: test assert FRAMEWORKUNIFIEDLOG(ZONE_ERR, __FUNCTION__, " Invalid configuration file name detected."); l_eStatus = eFrameworkunifiedStatusInvldParam; // LCOV_EXCL_STOP } else { // FRAMEWORKUNIFIEDLOG(ZONE_INFO, __FUNCTION__, "Reading Configuration Data from %s", f_filePathAndName.c_str()); CNSConfigReader *l_pReaderCfg = new CNSConfigReader(); // LCOV_EXCL_BR_LINE 11:except,C++ STL if (NULL == l_pReaderCfg) { // LCOV_EXCL_BR_LINE 5:new error // LCOV_EXCL_START 5:new error AGL_ASSERT_NOT_TESTED(); // LCOV_EXCL_LINE 200: test assert FRAMEWORKUNIFIEDLOG(ZONE_ERR, __FUNCTION__, " Error. Unable to allocate CNSConfigReader object."); l_eStatus = eFrameworkunifiedStatusFileLoadError; // LCOV_EXCL_STOP } else { if (eFrameworkunifiedStatusOK != (l_eStatus = l_pReaderCfg->Parse(f_filePathAndName))) { // LCOV_EXCL_BR_LINE 200:To ensure success // NOLINT[whitespace/line_length] // LCOV_EXCL_START 200:To ensure success AGL_ASSERT_NOT_TESTED(); // LCOV_EXCL_LINE 200: test assert FRAMEWORKUNIFIEDLOG(ZONE_ERR, __FUNCTION__, " Error. l_pReaderCfg->Parse(%s) returned: 0x%X", f_filePathAndName.c_str(), l_eStatus); // LCOV_EXCL_STOP } else if (eFrameworkunifiedStatusOK != (l_eStatus = l_pReaderCfg->GetInt("LOGGING.LogMaxFileSize", m_logMaxFileSize))) { // LCOV_EXCL_BR_LINE 200:To ensure success // NOLINT[whitespace/line_length] // LCOV_EXCL_START 200:To ensure success AGL_ASSERT_NOT_TESTED(); // LCOV_EXCL_LINE 200: test assert LOG_STATUS(l_eStatus, "l_pReaderCfg->GetInt(LOGGING.LogMaxFileSize)"); // LCOV_EXCL_STOP } else if (eFrameworkunifiedStatusOK != (l_eStatus = l_pReaderCfg->GetInt("LOGGING.PerformanceLogSize", m_performanceLogMaxFileSize))) { // LCOV_EXCL_BR_LINE 200:To ensure success // NOLINT[whitespace/line_length] // LCOV_EXCL_START 200:To ensure success AGL_ASSERT_NOT_TESTED(); // LCOV_EXCL_LINE 200: test assert LOG_STATUS(l_eStatus, "l_pReaderCfg->GetInt(LOGGING.LogMaxFileSize)"); // LCOV_EXCL_STOP } else if (eFrameworkunifiedStatusOK != (l_eStatus = l_pReaderCfg->GetString("LOGGING.EmmcOutputPath", m_emmcOutputPath))) { // LCOV_EXCL_BR_LINE 200:To ensure success // NOLINT[whitespace/line_length] // LCOV_EXCL_START 200:To ensure success AGL_ASSERT_NOT_TESTED(); // LCOV_EXCL_LINE 200: test assert LOG_STATUS(l_eStatus, "l_pReaderCfg->GetString(LOGGING.EmmcOutputPath)"); // LCOV_EXCL_STOP } else if (eFrameworkunifiedStatusOK != (l_eStatus = l_pReaderCfg->GetString("LOGGING.EmmcOutputNaviLogPath", m_emmcOutputNaviLogPath))) { // LCOV_EXCL_BR_LINE 200:To ensure success // NOLINT[whitespace/line_length] // LCOV_EXCL_START 200:To ensure success AGL_ASSERT_NOT_TESTED(); // LCOV_EXCL_LINE 200: test assert LOG_STATUS(l_eStatus, "l_pReaderCfg->GetString(LOGGING.EmmcOutputNaviLogPath)"); // LCOV_EXCL_STOP } else if (eFrameworkunifiedStatusOK != (l_eStatus = l_pReaderCfg->GetString("LOGGING.Usb0MountPath", m_usb0MountPath))) { // LCOV_EXCL_BR_LINE 200:To ensure success // NOLINT[whitespace/line_length] // LCOV_EXCL_START 200:To ensure success AGL_ASSERT_NOT_TESTED(); // LCOV_EXCL_LINE 200: test assert LOG_STATUS(l_eStatus, "l_pReaderCfg->GetString(LOGGING.Usb0MountPath)"); // LCOV_EXCL_STOP } else if (eFrameworkunifiedStatusOK != (l_eStatus = l_pReaderCfg->GetString("LOGGING.Usb1MountPath", m_usb1MountPath))) { // LCOV_EXCL_BR_LINE 200:To ensure success // NOLINT[whitespace/line_length] // LCOV_EXCL_START 200:To ensure success AGL_ASSERT_NOT_TESTED(); // LCOV_EXCL_LINE 200: test assert LOG_STATUS(l_eStatus, "l_pReaderCfg->GetString(LOGGING.Usb1MountPath)"); // LCOV_EXCL_STOP } else if (eFrameworkunifiedStatusOK != (l_eStatus = l_pReaderCfg->GetString("LOGGING.SdMountPath", m_sdMountPath))) { // LCOV_EXCL_BR_LINE 200:To ensure success // NOLINT[whitespace/line_length] // LCOV_EXCL_START 200:To ensure success AGL_ASSERT_NOT_TESTED(); // LCOV_EXCL_LINE 200: test assert LOG_STATUS(l_eStatus, "l_pReaderCfg->GetString(LOGGING.SdMountPath)"); // LCOV_EXCL_STOP } else if (eFrameworkunifiedStatusOK != (l_eStatus = l_pReaderCfg->GetInt("LOGGING.EmmcOutputMax", m_emmcOutputMax))) { // LCOV_EXCL_BR_LINE 200:To ensure success // NOLINT[whitespace/line_length] // LCOV_EXCL_START 200:To ensure success AGL_ASSERT_NOT_TESTED(); // LCOV_EXCL_LINE 200: test assert LOG_STATUS(l_eStatus, "l_pReaderCfg->GetString(LOGGING.EmmcOutputMax)"); // LCOV_EXCL_STOP } else if (eFrameworkunifiedStatusOK != (l_eStatus = l_pReaderCfg->GetInt("LOGGING.EmmcOutputErrMax", m_emmcOutputErrMax))) { // LCOV_EXCL_BR_LINE 200:To ensure success // NOLINT[whitespace/line_length] // LCOV_EXCL_START 200:To ensure success AGL_ASSERT_NOT_TESTED(); // LCOV_EXCL_LINE 200: test assert LOG_STATUS(l_eStatus, "l_pReaderCfg->GetString(LOGGING.EmmcOutputErrMax)"); // LCOV_EXCL_STOP } else if (eFrameworkunifiedStatusOK != (l_eStatus = l_pReaderCfg->GetInt("LOGGING.EmmcOutputGrpRelaunchMax", m_emmcOutputGrpRelaunchMax))) { // LCOV_EXCL_BR_LINE 200:To ensure success // NOLINT[whitespace/line_length] // LCOV_EXCL_START 200:To ensure success AGL_ASSERT_NOT_TESTED(); // LCOV_EXCL_LINE 200: test assert LOG_STATUS(l_eStatus, "l_pReaderCfg->GetString(LOGGING.EmmcOutputGrpRelaunchMax)"); // LCOV_EXCL_STOP } else if (eFrameworkunifiedStatusOK != (l_eStatus = l_pReaderCfg->GetInt("LOGGING.EmmcOutputNaviLogMax", m_emmcOutputNaviLogMax))) { // LCOV_EXCL_BR_LINE 200:To ensure success // NOLINT[whitespace/line_length] // LCOV_EXCL_START 200:To ensure success AGL_ASSERT_NOT_TESTED(); // LCOV_EXCL_LINE 200: test assert LOG_STATUS(l_eStatus, "l_pReaderCfg->GetString(LOGGING.EmmcOutputNaviLogMax)"); // LCOV_EXCL_STOP } else if (eFrameworkunifiedStatusOK != (l_eStatus = l_pReaderCfg->GetInt("LOGGING.EmmcOutputNaviLogNmlMax", m_emmcOutputNaviLogNmlMax))) { // LCOV_EXCL_BR_LINE 200:To ensure success // NOLINT[whitespace/line_length] // LCOV_EXCL_START 200:To ensure success AGL_ASSERT_NOT_TESTED(); // LCOV_EXCL_LINE 200: test assert LOG_STATUS(l_eStatus, "l_pReaderCfg->GetString(LOGGING.EmmcOutputNaviLogNmlMax)"); // LCOV_EXCL_STOP } else if (eFrameworkunifiedStatusOK != (l_eStatus = l_pReaderCfg->GetInt("LOGGING.EmmcOutputNaviLogErrMax", m_emmcOutputNaviLogErrMax))) { // LCOV_EXCL_BR_LINE 200:To ensure success // NOLINT[whitespace/line_length] // LCOV_EXCL_START 200:To ensure success AGL_ASSERT_NOT_TESTED(); // LCOV_EXCL_LINE 200: test assert LOG_STATUS(l_eStatus, "l_pReaderCfg->GetString(LOGGING.EmmcOutputNaviLogErrMax)"); // LCOV_EXCL_STOP } else if (eFrameworkunifiedStatusOK != (l_eStatus = l_pReaderCfg->GetString("STORAGE.ThreadName", m_loggerStorageInfo.Name))) { // LCOV_EXCL_BR_LINE 200:To ensure success // NOLINT[whitespace/line_length] // LCOV_EXCL_START 200:To ensure success AGL_ASSERT_NOT_TESTED(); // LCOV_EXCL_LINE 200: test assert LOG_STATUS(l_eStatus, "l_pReaderCfg->GetString(STORAGE.ThreadName)"); // LCOV_EXCL_STOP } else if (eFrameworkunifiedStatusOK != (l_eStatus = l_pReaderCfg->GetInt("STORAGE.Priority", m_loggerStorageInfo.Priority))) { // LCOV_EXCL_BR_LINE 200:To ensure success // NOLINT[whitespace/line_length] // LCOV_EXCL_START 200:To ensure success AGL_ASSERT_NOT_TESTED(); // LCOV_EXCL_LINE 200: test assert LOG_STATUS(l_eStatus, "l_pReaderCfg->GetInt(STORAGE.Priority)"); // LCOV_EXCL_STOP } else if (eFrameworkunifiedStatusOK != (l_eStatus = l_pReaderCfg->GetInt("STORAGE.Timeout", m_loggerStorageInfo.Timeout))) { // LCOV_EXCL_BR_LINE 200:To ensure success // NOLINT[whitespace/line_length] // LCOV_EXCL_START 200:To ensure success AGL_ASSERT_NOT_TESTED(); // LCOV_EXCL_LINE 200: test assert LOG_STATUS(l_eStatus, "l_pReaderCfg->GetInt(STORAGE.Timeout)"); // LCOV_EXCL_STOP } else if (eFrameworkunifiedStatusOK != (l_eStatus = l_pReaderCfg->GetInt("STORAGE.TimeoutAfter", m_loggerStorageInfo.TimeoutAfter))) { // LCOV_EXCL_BR_LINE 200:To ensure success // NOLINT[whitespace/line_length] // LCOV_EXCL_START 200:To ensure success AGL_ASSERT_NOT_TESTED(); // LCOV_EXCL_LINE 200: test assert LOG_STATUS(l_eStatus, "l_pReaderCfg->GetInt(STORAGE.TimeoutAfter)"); // LCOV_EXCL_STOP } else { RemoveCarriageReturn(m_emmcOutputPath); RemoveCarriageReturn(m_emmcOutputNaviLogPath); RemoveCarriageReturn(m_usb0MountPath); RemoveCarriageReturn(m_usb1MountPath); RemoveCarriageReturn(m_sdMountPath); RemoveCarriageReturn(m_loggerStorageInfo.Name); for (UI_32 i = 0; i < ZONE_MASK_ARRAY_ELTS; i++) { SI_32 l_logMaskTemp; std::stringstream l_cfgParamName; l_cfgParamName << "SETLOGMASK.MASK" << i; if (eFrameworkunifiedStatusOK != (l_eStatus = l_pReaderCfg->GetInt(l_cfgParamName.str(), l_logMaskTemp))) { // LCOV_EXCL_BR_LINE 200:To ensure success // NOLINT[whitespace/line_length] // LCOV_EXCL_START 200:To ensure success AGL_ASSERT_NOT_TESTED(); // LCOV_EXCL_LINE 200: test assert FRAMEWORKUNIFIEDLOG(ZONE_ERR, __FUNCTION__, " Error. l_pReaderCfg->GetInt(%s) failed with error: %d.", l_cfgParamName.str().c_str(), l_eStatus); break; // LCOV_EXCL_STOP } else { m_logMask[i] = (UI_32) l_logMaskTemp; } } m_EELStorageRelPath = "/EEL_export"; m_EELActivateRelPath = "/EEL_activate"; m_LoggerserviceEmmcLogsRelPath = "/LOGGERSERVICE_EMMC_LOGS"; if (eFrameworkunifiedStatusOK == l_eStatus) { // LCOV_EXCL_BR_LINE 200:To ensure success FRAMEWORKUNIFIEDLOG(ZONE_INFO, __FUNCTION__, " Info. Configuration successfully loaded."); // LCOV_EXCL_BR_LINE 15: macro } } delete l_pReaderCfg; // LCOV_EXCL_BR_LINE 11:Unexpected branch } } FRAMEWORKUNIFIEDLOG(ZONE_FUNC, __FUNCTION__, "-"); return (l_eStatus); } EFrameworkunifiedStatus CLoggerCfg::Validate(void) { FRAMEWORKUNIFIEDLOG(ZONE_FUNC, __FUNCTION__, "+"); EFrameworkunifiedStatus l_eStatus = eFrameworkunifiedStatusInvldParam; if (m_logMaxFileSize == 0) { // LCOV_EXCL_BR_LINE 200:Because the size is never 0 // LCOV_EXCL_START 200:Because the size is never 0 AGL_ASSERT_NOT_TESTED(); // LCOV_EXCL_LINE 200: test assert FRAMEWORKUNIFIEDLOG( ZONE_ERR, __FUNCTION__, " Error. Invalid configuration detected. LogMaxFileSize: %d Must be > 0.", m_logMaxFileSize); // LCOV_EXCL_STOP } else if (m_emmcOutputPath == "") { FRAMEWORKUNIFIEDLOG( ZONE_ERR, __FUNCTION__, " Error. Invalid configuration detected." " EmmcOutputPath: %s Must be a valid path containing a trailing backslash.", m_emmcOutputPath.c_str()); } else if (m_emmcOutputNaviLogPath == "") { // LCOV_EXCL_BR_LINE 200:Because it is not always an empty string // LCOV_EXCL_START 200:Because it is not always an empty string AGL_ASSERT_NOT_TESTED(); // LCOV_EXCL_LINE 200: test assert FRAMEWORKUNIFIEDLOG( ZONE_ERR, __FUNCTION__, " Error. Invalid configuration detected." " EmmcOutputNaviLogPath: %s Must be a valid path containing a trailing backslash.", m_emmcOutputNaviLogPath.c_str()); // LCOV_EXCL_STOP } else if (m_usb0MountPath == "") { // LCOV_EXCL_BR_LINE 200:Because it is not always an empty string // LCOV_EXCL_START 200:Because it is not always an empty string AGL_ASSERT_NOT_TESTED(); // LCOV_EXCL_LINE 200: test assert FRAMEWORKUNIFIEDLOG( ZONE_ERR, __FUNCTION__, " Error. Invalid configuration detected." " Usb0MountPath: %s Must be a valid path containing a trailing backslash.", m_usb0MountPath.c_str()); // LCOV_EXCL_STOP } else if (m_usb1MountPath == "") { // LCOV_EXCL_BR_LINE 200:Because it is not always an empty string // LCOV_EXCL_START 200:Because it is not always an empty string AGL_ASSERT_NOT_TESTED(); // LCOV_EXCL_LINE 200: test assert FRAMEWORKUNIFIEDLOG( ZONE_ERR, __FUNCTION__, " Error. Invalid configuration detected." " Usb1MountPath: %s Must be a valid path containing a trailing backslash.", m_usb1MountPath.c_str()); // LCOV_EXCL_STOP } else if (m_sdMountPath == "") { // LCOV_EXCL_BR_LINE 200:Because it is not always an empty string // LCOV_EXCL_START 200:Because it is not always an empty string AGL_ASSERT_NOT_TESTED(); // LCOV_EXCL_LINE 200: test assert FRAMEWORKUNIFIEDLOG( ZONE_ERR, __FUNCTION__, " Error. Invalid configuration detected. SdMountPath: %s Must be a valid path containing a trailing backslash.", m_sdMountPath.c_str()); // LCOV_EXCL_STOP } else { l_eStatus = eFrameworkunifiedStatusOK; } FRAMEWORKUNIFIEDLOG(ZONE_FUNC, __FUNCTION__, "-"); return (l_eStatus); } void CLoggerCfg::Print(void) { FRAMEWORKUNIFIEDLOG(ZONE_FUNC, __FUNCTION__, "+"); FRAMEWORKUNIFIEDLOG(ZONE_FUNC, __FUNCTION__, "-"); } std::string CLoggerCfg::getEmmcOutputPath(void) { return (m_emmcOutputPath); } std::string CLoggerCfg::getEmmcOutputNaviLogPath(void) { return (m_emmcOutputNaviLogPath); } std::string CLoggerCfg::getUsb0MountPath(void) { return (m_usb0MountPath); } void CLoggerCfg::setUsb0MountPath(std::string& f_deviceMountpath) { m_usb0MountPath = f_deviceMountpath; } EFrameworkunifiedStatus CLoggerCfg::GetUserInvokedDestination(std::string& f_dest) { FRAMEWORKUNIFIEDLOG(ZONE_FUNC, __FUNCTION__, "+"); EFrameworkunifiedStatus l_eStatus = eFrameworkunifiedStatusOK; f_dest = ""; switch (m_eDevType) { case eDevUSB1: f_dest = m_usb0MountPath; break; case eDevUSB2: f_dest = m_usb1MountPath; break; case eDevSD: f_dest = m_sdMountPath; break; case eTotalDevicesTypes: case eInvalid_DevType: default: FRAMEWORKUNIFIEDLOG(ZONE_ERR, __FUNCTION__, " Error. Unknown device type: %d", m_eDevType); l_eStatus = eFrameworkunifiedStatusFail; break; } FRAMEWORKUNIFIEDLOG(ZONE_FUNC, __FUNCTION__, "-"); return (l_eStatus); } EFrameworkunifiedStatus CLoggerCfg::GetEmmcDestination(std::string& f_dest) { FRAMEWORKUNIFIEDLOG(ZONE_FUNC, __FUNCTION__, "+"); EFrameworkunifiedStatus l_eStatus = eFrameworkunifiedStatusOK; f_dest = m_emmcOutputPath; FRAMEWORKUNIFIEDLOG(ZONE_FUNC, __FUNCTION__, "-"); return (l_eStatus); } EFrameworkunifiedStatus CLoggerCfg::GetEmmcNaviLogDestination(std::string& f_dest) { FRAMEWORKUNIFIEDLOG(ZONE_FUNC, __FUNCTION__, "+"); EFrameworkunifiedStatus l_eStatus = eFrameworkunifiedStatusOK; f_dest = m_emmcOutputNaviLogPath; FRAMEWORKUNIFIEDLOG(ZONE_FUNC, __FUNCTION__, "-"); return (l_eStatus); } UI_32 CLoggerCfg::GetUserInvokedCounter(void) { return m_UserInvokedLoggingNumber; } EFrameworkunifiedStatus CLoggerCfg::GetIncrementAndPersistUserInvokedCounter( HANDLE f_hApp, UI_32 &f_counter) { FRAMEWORKUNIFIEDLOG(ZONE_FUNC, __FUNCTION__, "+"); EFrameworkunifiedStatus l_eStatus = eFrameworkunifiedStatusOK; f_counter = m_UserInvokedLoggingNumber; m_UserInvokedLoggingNumber++; l_eStatus = PersistLoggingParam(f_hApp); FRAMEWORKUNIFIEDLOG(ZONE_FUNC, __FUNCTION__, "-"); return (l_eStatus); } EFrameworkunifiedStatus CLoggerCfg::GetAndIncrementEmmcCounter(UI_32 &f_counter) noexcept { FRAMEWORKUNIFIEDLOG(ZONE_FUNC, __FUNCTION__, "+"); EFrameworkunifiedStatus l_eStatus = eFrameworkunifiedStatusOK; std::string l_checkFileName; std::vector l_vector; DIR *l_dirp; struct dirent l_dirent; struct dirent* next = NULL; size_t l_pos; UI_32 l_count; UI_32 l_maxCount; FRAMEWORKUNIFIEDLOG(ZONE_FUNC, __FUNCTION__, "+"); if (m_EmmcCounter == 0u) { l_maxCount = 0; l_dirp = opendir(m_emmcOutputPath.c_str()); if (l_dirp != NULL) { // LCOV_EXCL_BR_LINE 5: m_emmcOutputPath is not null, opendir is C code, always ok for (;;) { int l_ret = readdir_r(l_dirp, &l_dirent, &next); if (((l_ret == 0) && (next == NULL)) || (l_ret > 0)) { break; } l_checkFileName = l_dirent.d_name; l_pos = l_checkFileName.find(".tar.gz"); if (std::string::npos != l_pos) { l_pos = l_checkFileName.find("_"); if (std::string::npos != l_pos) { // LCOV_EXCL_BR_LINE 200: tar.gz file is aways has "_" std::string l_numberString = l_checkFileName.substr(0, l_pos); l_count = static_cast(strtoul(l_numberString.c_str(), NULL, 10)); l_vector.push_back(l_count); l_maxCount = std::max(l_count, l_maxCount); } } } closedir(l_dirp); } else { // LCOV_EXCL_START 5: m_emmcOutputPath is not null, opendir is C code, always ok AGL_ASSERT_NOT_TESTED(); // LCOV_EXCL_LINE 200: test assert f_counter = 1; return eFrameworkunifiedStatusOK; // LCOV_EXCL_STOP } // reach at max number if (l_maxCount >= LOGGERSERVICELOG_EMMC_COUNTER_MAX) { RefreshEmmcCounter(m_EmmcCounter); } else { m_EmmcCounter = l_maxCount + 1; } } else if (m_EmmcCounter >= LOGGERSERVICELOG_EMMC_COUNTER_MAX) { // reach at max number RefreshEmmcCounter(m_EmmcCounter); } else { m_EmmcCounter++; } f_counter = m_EmmcCounter; FRAMEWORKUNIFIEDLOG(ZONE_FUNC, __FUNCTION__, "-"); return (l_eStatus); } EFrameworkunifiedStatus CLoggerCfg::RefreshEmmcCounter(UI_32& f_counter) noexcept { EFrameworkunifiedStatus l_eStatus = eFrameworkunifiedStatusOK; std::string l_checkFileName; std::vector l_vector; DIR *l_dirp; struct dirent l_dirent; struct dirent* next = NULL; size_t l_pos; FRAMEWORKUNIFIEDLOG(ZONE_FUNC, __FUNCTION__, "+"); // get filename saved frameworkunifiedlog on eMMC Device l_dirp = opendir(m_emmcOutputPath.c_str()); if (l_dirp != NULL) { // LCOV_EXCL_BR_LINE 5: m_emmcOutputPath is not null, opendir is C code, always ok for (;;) { int l_ret = readdir_r(l_dirp, &l_dirent, &next); if (((l_ret == 0) && (next == NULL)) || (l_ret > 0)) { break; } l_checkFileName = l_dirent.d_name; l_pos = l_checkFileName.find(".tar.gz"); if (std::string::npos != l_pos) { l_pos = l_checkFileName.find("_"); if (std::string::npos != l_pos) { l_vector.push_back(l_checkFileName); } } } closedir(l_dirp); } else { // LCOV_EXCL_START 5: m_emmcOutputPath is not null, opendir is C code, always ok AGL_ASSERT_NOT_TESTED(); // LCOV_EXCL_LINE 200: test assert // ignore opendir failure. this means saved frameworkunifiedlog is nothing on eMMC Device FRAMEWORKUNIFIEDLOG(ZONE_ERR, __FUNCTION__, "open dir error path=%s errno=%s.", m_emmcOutputPath.c_str(), strerror(errno)); f_counter = 1; return eFrameworkunifiedStatusOK; // LCOV_EXCL_STOP } // sort at log count std::sort(l_vector.begin(), l_vector.end()); std::vector::iterator it; std::string l_orgFilePath; std::string l_renameFilePath; UI_32 l_wpt = 0; UI_32 l_count; it = l_vector.begin(); while (it != l_vector.end()) { std::stringstream l_nameStream; // get log counter parts l_wpt++; l_checkFileName = *it; l_pos = l_checkFileName.find("_"); std::string l_numberString = l_checkFileName.substr(0, l_pos); l_count = static_cast(strtoul(l_numberString.c_str(), NULL, 10)); // rename file if necessary if (l_count != l_wpt) { l_renameFilePath = l_orgFilePath = m_emmcOutputPath.c_str(); l_renameFilePath.append("/"); l_orgFilePath.append("/"); l_orgFilePath.append(l_checkFileName); l_nameStream << std::setw(5) << std::setfill('0') << std::right << std::dec << l_wpt; l_checkFileName.replace(0, l_pos, l_nameStream.str()); l_renameFilePath.append(l_checkFileName); if (rename(l_orgFilePath.c_str(), l_renameFilePath.c_str()) != 0) { // LCOV_EXCL_BR_LINE 5: rename is C code // LCOV_EXCL_START 5: rename is C code AGL_ASSERT_NOT_TESTED(); // LCOV_EXCL_LINE 200: test assert // rename failed but continue reamin log rename because new log need to be saved. FRAMEWORKUNIFIEDLOG(ZONE_ERR, __FUNCTION__, "log file[%s]->[%s] rename failed: err=%s.", l_orgFilePath.c_str(), l_renameFilePath.c_str(), strerror(errno)); // LCOV_EXCL_STOP } } it++; } f_counter = l_wpt + 1; // set return value as next log counter FRAMEWORKUNIFIEDLOG(ZONE_FUNC, __FUNCTION__, "-"); return l_eStatus; } BOOL CLoggerCfg::IsUDPLoggingEnabled(void) { FRAMEWORKUNIFIEDLOG(ZONE_FUNC, __FUNCTION__, "+"); BOOL l_ret = ((this->m_eLoggerUDPLoggingStatus == eActivate) || (this->m_udpEnvFlag == TRUE)) ? TRUE : FALSE; FRAMEWORKUNIFIEDLOG(ZONE_FUNC, __FUNCTION__, "- : %s", (TRUE == l_ret)?"TRUE":"FALSE"); return (l_ret); } void CLoggerCfg::AddLoggingParamCB(CbFuncPtr f_fp) { FRAMEWORKUNIFIEDLOG(ZONE_FUNC, __FUNCTION__, "+"); if (f_fp != NULL) { // LCOV_EXCL_BR_LINE 6: it aways not be null this->m_LoggingCallBack.push_back(f_fp); (void) f_fp(NULL); } FRAMEWORKUNIFIEDLOG(ZONE_FUNC, __FUNCTION__, "-"); } void CLoggerCfg::UpdateLoggingStatus(void) noexcept { FRAMEWORKUNIFIEDLOG(ZONE_FUNC, __FUNCTION__, "+"); std::vector::iterator l_iter; for (l_iter = m_LoggingCallBack.begin(); l_iter != m_LoggingCallBack.end(); l_iter++) { // LCOV_EXCL_BR_LINE 11:Unexpected branch // NOLINT[whitespace/line_length] (void) (*l_iter)(NULL); } FRAMEWORKUNIFIEDLOG(ZONE_FUNC, __FUNCTION__, "-"); } EFrameworkunifiedStatus CLoggerCfg::GetLoggerStorageInfo(SLoggerStorageInfo &f_info) { FRAMEWORKUNIFIEDLOG(ZONE_FUNC, __FUNCTION__, "+"); EFrameworkunifiedStatus l_eStatus = eFrameworkunifiedStatusOK; f_info = m_loggerStorageInfo; FRAMEWORKUNIFIEDLOG(ZONE_FUNC, __FUNCTION__, "-"); return (l_eStatus); } BOOL CLoggerCfg::IsLoggingEnabled(void) { FRAMEWORKUNIFIEDLOG(ZONE_FUNC, __FUNCTION__, "+"); return (this->m_eLoggerStatus == eActivate) ? TRUE : FALSE; FRAMEWORKUNIFIEDLOG(ZONE_FUNC, __FUNCTION__, "-"); }