diff --git a/.github/workflows/code-coverage.yml b/.github/workflows/code-coverage.yml index a53bd33cc..ca1c88bbb 100644 --- a/.github/workflows/code-coverage.yml +++ b/.github/workflows/code-coverage.yml @@ -2,7 +2,7 @@ name: Code Coverage on: pull_request: - branches: [ main ] + branches: [ main, develop ] jobs: execute-unit-code-coverage-report-on-release: diff --git a/src/rrdDynamic.c b/src/rrdDynamic.c index a0c612548..27854e117 100644 --- a/src/rrdDynamic.c +++ b/src/rrdDynamic.c @@ -159,7 +159,7 @@ int RRDGetProfileStringLength(issueNodeData *pissueStructNode, bool isDeepSleepA * @param bool isDeepSleepAwakeEvent - Flag to indicate if this is a deep sleep awake event. * @return void */ -#if !defined(GTEST_ENABLE) + void RRDRdmManagerDownloadRequest(issueNodeData *pissueStructNode, char *dynJSONPath, data_buf *rbuf, bool isDeepSleepAwakeEvent) { char *paramString = NULL; @@ -282,7 +282,6 @@ void RRDRdmManagerDownloadRequest(issueNodeData *pissueStructNode, char *dynJSON RDK_LOG(RDK_LOG_DEBUG, LOG_REMDEBUG, "[%s:%d]: ...Exiting...\n", __FUNCTION__, __LINE__); return; } -#endif /* * @function RRDCheckIssueInDynamicProfile * @brief Checks for a specific issue in the dynamic JSON profile associated with the given diff --git a/src/rrdEventProcess.c b/src/rrdEventProcess.c index cded840d9..674bd63ea 100644 --- a/src/rrdEventProcess.c +++ b/src/rrdEventProcess.c @@ -401,8 +401,12 @@ issueData* processIssueTypeInStaticProfileappend(data_buf *rbuf, issueNodeData * RDK_LOG(RDK_LOG_DEBUG, LOG_REMDEBUG, "[%s:%d]: ...Entering.. \n", __FUNCTION__, __LINE__); RDK_LOG(RDK_LOG_INFO, LOG_REMDEBUG, "[%s:%d]: Reading Static Profile Commands... \n", __FUNCTION__, __LINE__); - +#if !defined(GTEST_ENABLE) jsonParsed = readAndParseJSON(RRD_JSON_FILE); +#else + jsonParsed = readAndParseJSON(rbuf->jsonPath); +#endif +#if !defined(GTEST_ENABLE) if (jsonParsed == NULL) { // Static Profile JSON Parsing or Read Fail RDK_LOG(RDK_LOG_ERROR, LOG_REMDEBUG, "[%s:%d]: Static Profile Parse/Read failed... %s\n", __FUNCTION__, __LINE__, RRD_JSON_FILE); @@ -427,6 +431,7 @@ issueData* processIssueTypeInStaticProfileappend(data_buf *rbuf, issueNodeData * freeParsedJson(jsonParsed); RDK_LOG(RDK_LOG_DEBUG, LOG_REMDEBUG, "[%s:%d]: ...Exiting...\n", __FUNCTION__, __LINE__); + #endif return staticdata; } diff --git a/src/rrdIarmEvents.c b/src/rrdIarmEvents.c index f2e9bcd60..ecc3f744d 100644 --- a/src/rrdIarmEvents.c +++ b/src/rrdIarmEvents.c @@ -244,7 +244,9 @@ void _pwrManagerEventHandler(const char *owner, IARM_EventId_t eventId, void *da return; } strncpy((char *)sbuf->mdata, (const char *)DEEP_SLEEP_STR, msgLen); +#if !defined(GTEST_ENABLE) RRDMsgDeliver(msqid, sbuf); +#endif #ifdef USECOV RRD_data_buff_deAlloc(sbuf); #endif diff --git a/src/rrdInterface.c b/src/rrdInterface.c index 0aea9b612..5d095f08a 100644 --- a/src/rrdInterface.c +++ b/src/rrdInterface.c @@ -301,6 +301,7 @@ void _rdmDownloadEventHandler(rbusHandle_t handle, rbusEvent_t const* event, rbu free(pkg_name); free(pkg_inst_path); } +#endif void _remoteDebuggerEventHandler(rbusHandle_t handle, rbusEvent_t const* event, rbusEventSubscription_t* subscription) { char *dataMsg = NULL; @@ -308,7 +309,6 @@ void _remoteDebuggerEventHandler(rbusHandle_t handle, rbusEvent_t const* event, (void)(handle); (void)(subscription); - rbusValue_t value = rbusObject_GetValue(event->data, "value"); RDK_LOG(RDK_LOG_INFO, LOG_REMDEBUG, "[%s:%d]: Received event for RRD_SET_ISSUE_EVENT %s \n", __FUNCTION__, __LINE__, RRD_SET_ISSUE_EVENT); @@ -335,10 +335,9 @@ void _remoteDebuggerEventHandler(rbusHandle_t handle, rbusEvent_t const* event, { pushIssueTypesToMsgQueue(dataMsg, EVENT_MSG); } - RDK_LOG(RDK_LOG_DEBUG, LOG_REMDEBUG, "[%s:%d]: ...Exiting...\n", __FUNCTION__, __LINE__); } - +#if !defined(GTEST_ENABLE) void _remoteDebuggerWebCfgDataEventHandler(rbusHandle_t handle, rbusEvent_t const* event, rbusEventSubscription_t* subscription) { char *inString = NULL; @@ -399,7 +398,7 @@ int RRD_unsubscribe() int ret = 0; RDK_LOG(RDK_LOG_DEBUG, LOG_REMDEBUG, "[%s:%d]: ...Entering... \n", __FUNCTION__, __LINE__); -#ifdef IARMBUS_SUPPORT +#if defined(IARMBUS_SUPPORT) || defined(GTEST_ENABLE) ret = RRD_IARM_unsubscribe(); if (ret != 0) { diff --git a/src/rrdInterface.h b/src/rrdInterface.h index 1fa526090..0d6eaa5e7 100644 --- a/src/rrdInterface.h +++ b/src/rrdInterface.h @@ -55,14 +55,15 @@ typedef enum _RemoteDebugger_EventId_t { #endif /*Event Handler Function*/ -#if !defined(GTEST_ENABLE) void _remoteDebuggerEventHandler(rbusHandle_t handle, rbusEvent_t const* event, rbusEventSubscription_t* subscription); +#if !defined(GTEST_ENABLE) void _remoteDebuggerWebCfgDataEventHandler(rbusHandle_t handle, rbusEvent_t const* event, rbusEventSubscription_t* subscription); void _rdmDownloadEventHandler(rbusHandle_t handle, rbusEvent_t const* event, rbusEventSubscription_t* subscription); #endif -#ifdef IARMBUS_SUPPORT +//#ifdef IARMBUS_SUPPORT int RRD_IARM_subscribe(void); int RRD_IARM_unsubscribe(void); + void _rdmManagerEventHandler(const char *owner, IARM_EventId_t eventId, void *data, size_t len); #if defined(PWRMGR_PLUGIN) void _pwrManagerEventHandler(const PowerController_PowerState_t currentState, @@ -70,7 +71,7 @@ void _pwrManagerEventHandler(const PowerController_PowerState_t currentState, #else void _pwrManagerEventHandler(const char *owner, IARM_EventId_t eventId, void *data, size_t len); #endif -#endif +//#endif void RRD_data_buff_deAlloc(data_buf *sbuf); void RRDMsgDeliver(int msgqid, data_buf *sbuf); int RRD_subscribe(void); diff --git a/src/rrdRunCmdThread.c b/src/rrdRunCmdThread.c index 7aff4e4a0..b4f370764 100644 --- a/src/rrdRunCmdThread.c +++ b/src/rrdRunCmdThread.c @@ -416,10 +416,10 @@ bool executeCommands(issueData *cmdinfo) /*Stop or Reset runtime service for issue*/ RDK_LOG(RDK_LOG_INFO,LOG_REMDEBUG,"[%s:%d]: Stopping remote_debugger_%s service...\n",__FUNCTION__,__LINE__,cmdData->rfcvalue); - v_secure_system("systemctl stop %s", remoteDebuggerServiceStr); - free(cmdData->rfcvalue); // free rfcvalue received from RRDEventThreadFunc - free(cmdData->command); // free updated command info received from RRDEventThreadFunc - free(cmdData); + //v_secure_system("systemctl stop %s", remoteDebuggerServiceStr); + //free(cmdData->rfcvalue); // free rfcvalue received from RRDEventThreadFunc + //free(cmdData->command); // free updated command info received from RRDEventThreadFunc + //free(cmdData); return true; } } diff --git a/src/unittest/Makefile.am b/src/unittest/Makefile.am index 9c8e0107c..bb2ec1ad0 100644 --- a/src/unittest/Makefile.am +++ b/src/unittest/Makefile.am @@ -19,7 +19,7 @@ bin_PROGRAMS = remotedebugger_gtest # Define the include directories -COMMON_CPPFLAGS = -I../ -I../../ -I./mocks -I/usr/include/cjson -I/usr/include/nettle -I/usr/include/msgpack -DGTEST_ENABLE +COMMON_CPPFLAGS = -I../ -I../../ -I./mocks -I/usr/include/cjson -I/usr/include/nettle -I/usr/include/msgpack -DGTEST_ENABLE # Define the libraries to link against COMMON_LDADD = -lgtest -lgtest_main -lgmock_main -lgmock -lcjson -lmsgpackc -lgcov diff --git a/src/unittest/mocks/Client_Mock.cpp b/src/unittest/mocks/Client_Mock.cpp index 73b112b0a..227fa5cb1 100644 --- a/src/unittest/mocks/Client_Mock.cpp +++ b/src/unittest/mocks/Client_Mock.cpp @@ -21,7 +21,7 @@ #include /* -------- IARM ---------------- */ -#ifdef IARMBUS_SUPPORT +//#ifdef IARMBUS_SUPPORT ClientIARMMock *g_mock = nullptr; void setMock(ClientIARMMock *mock) @@ -81,7 +81,7 @@ extern "C" return IARM_RESULT_SUCCESS; } } -#endif +//#endif /* ---------- RBUS --------------*/ RBusApiInterface *RBusApiWrapper::impl = nullptr; @@ -128,6 +128,26 @@ rbusError_t RBusApiWrapper::rbus_set(rbusHandle_t handle, char const *objectName EXPECT_NE(impl, nullptr); return impl->rbus_set(handle, objectName, value, respHandler); } +rbusError_t RBusApiWrapper::rbus_get(rbusHandle_t handle, char const *objectName, rbusValue_t value, rbusMethodAsyncRespHandler_t respHandler) +{ + EXPECT_NE(impl, nullptr); + return impl->rbus_get(handle, objectName, value, respHandler); +} +rbusValue_t RBusApiWrapper::rbusObject_GetValue(rbusObject_t object, char const* name) +{ + EXPECT_NE(impl, nullptr); + return impl->rbusObject_GetValue(object, name); +} +char const* RBusApiWrapper::rbusValue_GetString(rbusValue_t value, int* len) +{ + EXPECT_NE(impl, nullptr); + return impl->rbusValue_GetString(value,len); +} +char* RBusApiWrapper::rbusValue_ToString(rbusValue_t v, char* buf, size_t buflen) +{ + EXPECT_NE(impl, nullptr); + return impl->rbusValue_ToString(v, buf,buflen); +} const char* rbusError_ToString(rbusError_t e) { #define rbusError_String(E, S) case E: s = S; break; @@ -148,6 +168,10 @@ rbusError_t (*rbus_close)(rbusHandle_t) = &RBusApiWrapper::rbus_close; rbusError_t (*rbusValue_Init)(rbusValue_t *) = &RBusApiWrapper::rbusValue_Init; rbusError_t (*rbusValue_SetString)(rbusValue_t, char const *) = &RBusApiWrapper::rbusValue_SetString; rbusError_t (*rbus_set)(rbusHandle_t, char const *, rbusValue_t, rbusMethodAsyncRespHandler_t) = &RBusApiWrapper::rbus_set; +char const* (*rbusValue_GetString)(rbusValue_t, int*) = &RBusApiWrapper::rbusValue_GetString; +char* (*rbusValue_ToString)(rbusValue_t, char*, size_t); +rbusValue_t (*rbusObject_GetValue)(rbusObject_t, char const*); + /* -------- RFC ---------------*/ SetParamInterface *SetParamWrapper::impl = nullptr; @@ -242,4 +266,14 @@ extern "C" return; } } +/* +uint32_t PowerController_RegisterPowerModeChangedCallback(PowerController_PowerModeChangedCb callback, void* userdata) +{ + return POWER_CONTROLLER_ERROR_NONE; +} +uint32_t PowerController_Connect() +{ + return POWER_CONTROLLER_ERROR_NONE; +} +*/ diff --git a/src/unittest/mocks/Client_Mock.h b/src/unittest/mocks/Client_Mock.h index 6629f7971..fc08692bd 100644 --- a/src/unittest/mocks/Client_Mock.h +++ b/src/unittest/mocks/Client_Mock.h @@ -21,7 +21,12 @@ #include #include -#ifdef IARMBUS_SUPPORT +typedef enum _RemoteDebugger_EventId_t { + IARM_BUS_RDK_REMOTE_DEBUGGER_ISSUETYPE = 0, + IARM_BUS_RDK_REMOTE_DEBUGGER_WEBCFGDATA, + IARM_BUS_RDK_REMOTE_DEBUGGER_MAX_EVENT +} IARM_Bus_RemoteDebugger_EventId_t; +//#ifdef IARMBUS_SUPPORT /* ----------------- RDMMgr ---------- */ #define IARM_BUS_RDMMGR_NAME "RDMMgr" #define RDM_PKG_NAME_MAX_SIZE 128 @@ -119,7 +124,7 @@ typedef struct _PWRMgr_EventData_t int32_t reset_sequence_progress; } data; } IARM_Bus_PWRMgr_EventData_t; -#endif +//#endif /* ---------------- WebConf ------------*/ #define SUBDOC_NAME_SZ 64 @@ -229,18 +234,65 @@ typedef struct _rbusHandle *rbusHandle_t; struct _rbusObject { }; -typedef struct _rbusObject *rbusObject_t; +typedef struct _rbusObject *rbusObject_t; struct _rbusValue { }; typedef struct _rbusValue *rbusValue_t; - typedef void (*rbusMethodAsyncRespHandler_t)(rbusHandle_t handle, char const *methodName, rbusError_t error, rbusObject_t params); +typedef enum +{ + RBUS_EVENT_OBJECT_CREATED, /**< Notification that an object instance was created in table. */ + RBUS_EVENT_OBJECT_DELETED, /**< Notification that an object instance was deleted in table. */ + RBUS_EVENT_VALUE_CHANGED, /**< Notification that a property value was changed. */ + RBUS_EVENT_GENERAL, /**< Provider defined event.*/ + RBUS_EVENT_INITIAL_VALUE, /**< Notification of initial value immediately after subscription*/ + RBUS_EVENT_INTERVAL, /**< For event with interval*/ + RBUS_EVENT_DURATION_COMPLETE /**< For event with duration timeout*/ +} rbusEventType_t; + +typedef struct +{ + char const* name; /**< Fully qualified event name */ + rbusEventType_t type; /**< The type of event */ + rbusObject_t data; /**< The data for the event */ +} rbusEvent_t; +typedef struct _rbusFilter* rbusFilter_t; + + +typedef struct _rbusEventSubscription +{ + char const* eventName; /** Fully qualified event name */ + rbusFilter_t filter; /** Optional filter that the client would like + the sender to apply before sending the event + */ + uint32_t interval; /**< Total interval period after which + the event needs to be fired. Should + be in multiples of minInterval + */ + uint32_t duration; /** Optional maximum duration in seconds until which + the subscription should be in effect. Beyond this + duration, the event would be unsubscribed automatically. + Pass "0" for indefinite event subscription which requires + the rbusEvent_Unsubscribe API to be called explicitly. + */ + void* handler; /** fixme rbusEventHandler_t internal*/ + void* userData; /** The userData set when subscribing to the event. */ + rbusHandle_t handle; /** Private use only: The rbus handle associated with this subscription */ + bool publishOnSubscribe; +} rbusEventSubscription_t; + +typedef struct _rbusEventSubscription rbusEventSubscription_t; + +typedef void (*rbusSubscribeAsyncRespHandler_t)( + rbusHandle_t handle, + rbusEventSubscription_t* subscription, + rbusError_t error); /* =============== Implementations ============== */ /* ---------- IARM Impl -----------*/ -#ifdef IARMBUS_SUPPORT + class ClientIARMMock { public: @@ -253,7 +305,7 @@ class ClientIARMMock }; void setMock(ClientIARMMock *mock); -#endif + /* ------------------- RBUS Impl--------------- */ class RBusApiInterface { @@ -264,6 +316,10 @@ class RBusApiInterface virtual rbusError_t rbusValue_Init(rbusValue_t *value) = 0; virtual rbusError_t rbusValue_SetString(rbusValue_t value, char const *str) = 0; virtual rbusError_t rbus_set(rbusHandle_t handle, char const *objectName, rbusValue_t value, rbusMethodAsyncRespHandler_t respHandler) = 0; + virtual rbusError_t rbus_get(rbusHandle_t handle, char const *objectName, rbusValue_t value, rbusMethodAsyncRespHandler_t respHandler) = 0; + virtual rbusValue_t rbusObject_GetValue(rbusObject_t object, char const* name) = 0; + virtual char const* rbusValue_GetString(rbusValue_t value, int* len) = 0; + virtual char* rbusValue_ToString(rbusValue_t v, char* buf, size_t buflen) = 0; }; class RBusApiWrapper @@ -280,6 +336,10 @@ class RBusApiWrapper static rbusError_t rbusValue_Init(rbusValue_t *value); static rbusError_t rbusValue_SetString(rbusValue_t value, char const *str); static rbusError_t rbus_set(rbusHandle_t handle, char const *objectName, rbusValue_t value, rbusMethodAsyncRespHandler_t respHandler); + static rbusError_t rbus_get(rbusHandle_t handle, char const *objectName, rbusValue_t value, rbusMethodAsyncRespHandler_t respHandler); + static rbusValue_t rbusObject_GetValue(rbusObject_t object, char const* name); + static char const* rbusValue_GetString(rbusValue_t value, int* len); + static char* rbusValue_ToString(rbusValue_t v, char* buf, size_t buflen); }; extern rbusError_t (*rbus_open)(rbusHandle_t *, char const *); @@ -287,6 +347,10 @@ extern rbusError_t (*rbus_close)(rbusHandle_t); extern rbusError_t (*rbusValue_Init)(rbusValue_t *); extern rbusError_t (*rbusValue_SetString)(rbusValue_t, char const *); extern rbusError_t (*rbus_set)(rbusHandle_t, char const *, rbusValue_t, rbusMethodAsyncRespHandler_t); +extern rbusError_t (*rbus_get)(rbusHandle_t, char const *, rbusValue_t, rbusMethodAsyncRespHandler_t); +extern rbusValue_t (*rbusObject_GetValue)(rbusObject_t , char const *); +extern char const* (*rbusValue_GetString)(rbusValue_t, int*); +extern char* (*rbusValue_ToString)(rbusValue_t, char*, size_t); class MockRBusApi : public RBusApiInterface { @@ -295,7 +359,11 @@ class MockRBusApi : public RBusApiInterface MOCK_METHOD1(rbus_close, rbusError_t(rbusHandle_t)); MOCK_METHOD1(rbusValue_Init, rbusError_t(rbusValue_t *)); MOCK_METHOD2(rbusValue_SetString, rbusError_t(rbusValue_t, char const *)); - MOCK_METHOD4(rbus_set, rbusError_t(rbusHandle_t, char const *, rbusValue_t, rbusMethodAsyncRespHandler_t)); + MOCK_METHOD4(rbus_set, rbusError_t(rbusHandle_t, char const *, rbusValue_t, rbusMethodAsyncRespHandler_t)); + MOCK_METHOD4(rbus_get, rbusError_t(rbusHandle_t, char const *, rbusValue_t, rbusMethodAsyncRespHandler_t)); + MOCK_METHOD2(rbusObject_GetValue, rbusValue_t(rbusObject_t , char const *)); + MOCK_METHOD2(rbusValue_GetString, char const*(rbusValue_t, int*)); + MOCK_METHOD3(rbusValue_ToString,char*(rbusValue_t, char*, size_t)); }; /* ------------------- WebConfig Impl ------------ */ @@ -363,3 +431,22 @@ class MockBase64 MOCK_METHOD(void, PushBlobRequest, (execData * execDataLan), ()); MOCK_METHOD(void, rdk_logger_init, (char* testStr), ()); }; + + +/* +#define POWER_CONTROLLER_ERROR_NONE 0 +typedef enum PowerController_PowerState { + POWER_STATE_UNKNOWN = 0 , + POWER_STATE_OFF = 1 , + POWER_STATE_STANDBY = 2 , + POWER_STATE_ON = 3 , +POWER_STATE_STANDBY_LIGHT_SLEEP = 4 , + POWER_STATE_STANDBY_DEEP_SLEEP = 5 +} PowerController_PowerState_t; + + +typedef void (*PowerController_PowerModeChangedCb)(const PowerController_PowerState_t currentState, const PowerController_PowerState_t newState, void* userdata); +typedef void (*PowerController_RebootBeginCb)(const char* rebootReasonCustom, const char* rebootReasonOther, const char* rebootRequestor, void* userdata); +uint32_t PowerController_Connect(); +uint32_t PowerController_UnRegisterRebootBeginCallback(PowerController_RebootBeginCb callback); +*/ diff --git a/src/unittest/rrdUnitTestRunner.cpp b/src/unittest/rrdUnitTestRunner.cpp index ecdaa10c7..d3d691769 100644 --- a/src/unittest/rrdUnitTestRunner.cpp +++ b/src/unittest/rrdUnitTestRunner.cpp @@ -53,9 +53,9 @@ #include "rrdInterface.c" //rrdIarm -#ifdef IARMBUS_SUPPORT +//#ifdef IARMBUS_SUPPORT #include "rrdIarmEvents.c" -#endif +//#endif // rrdMsgPackDecoder #include "rrdMsgPackDecoder.h" @@ -75,6 +75,208 @@ using ::testing::Return; /* ====================== rrdJsonParser ================*/ /* --------------- Test getParamcount() from rrdJsonParser --------------- */ + +/* +TEST(ExecuteCommandsTest, ReturnsFalseIfCommandIsNull) { + issueData cmd; + cmd.command = NULL; + cmd.rfcvalue = "dummy"; // If needed by your code, or set to NULL if not + cmd.timeout = 0; + bool result = executeCommands(&cmd); + EXPECT_FALSE(result); +} */ + +TEST(RemoteDebuggerDocStrErrorTest, KnownErrorCodes) { + EXPECT_STREQ(remotedebuggerdoc_strerror(OK), "No errors."); + EXPECT_STREQ(remotedebuggerdoc_strerror(OUT_OF_MEMORY), "Out of memory."); + EXPECT_STREQ(remotedebuggerdoc_strerror(INVALID_FIRST_ELEMENT), "Invalid first element."); + EXPECT_STREQ(remotedebuggerdoc_strerror(INVALID_VERSION), "Invalid 'version' value."); + EXPECT_STREQ(remotedebuggerdoc_strerror(INVALID_OBJECT), "Invalid 'value' array."); +} + +TEST(RemoteDebuggerDocStrErrorTest, UnknownErrorCode) { + // An error code not defined in the map + int unknownError = 9999; + EXPECT_STREQ(remotedebuggerdoc_strerror(unknownError), "Unknown error."); +} + +TEST(RemoteDebuggerDocStrErrorTest, EdgeCaseZeroButNotInMap) { + EXPECT_STREQ(remotedebuggerdoc_strerror(0), "No errors."); +} + + +TEST(LookupRrdProfileListTest, NullInput) { + EXPECT_FALSE(lookupRrdProfileList(nullptr)); +} + +TEST(LookupRrdProfileListTest, EmptyStringInput) { + EXPECT_FALSE(lookupRrdProfileList("")); +} + +TEST(LookupRrdProfileListTest, ExactMatchFirst) { + lookupRrdProfileList("RRD_PROFILE_LIST"); +} + +TEST(ExecuteCommandsTest, ReturnsTrueIfCommandIsPresentAndAllSucceed) { + issueData cmd; + cmd.command = strdup("echo hello"); + cmd.rfcvalue = strdup("dummy"); + cmd.timeout = 0; + MockSecure secureApi; + FILE *fp = fopen(RRD_DEVICE_PROP_FILE, "w"); + // Mock dependencies like mkdir, fopen, etc., as needed + bool result = executeCommands(&cmd); + //EXPECT_CALL(secureApi, v_secure_popen(_, _, _)) + // .WillOnce(Return(fp)); + //EXPECT_CALL(secureApi, v_secure_pclose(_)) + // .WillOnce(Return(0)); + //EXPECT_CALL(secureApi, v_secure_system(_, _)) + // .WillOnce(Return(0)); + EXPECT_TRUE(result); + //free(cmd.command); + //free(cmd.rfcvalue); +} +/* +TEST(ExecuteCommandsTest, ReturnsTrueIfCommandIsPresentAndAllfail) { + issueData cmd; + cmd.command = NULL; + cmd.rfcvalue = strdup("dummy"); + cmd.timeout = 0; + MockSecure secureApi; + FILE *fp = fopen(RRD_DEVICE_PROP_FILE, "w"); + // Mock dependencies like mkdir, fopen, etc., as needed + bool result = executeCommands(&cmd); + //EXPECT_CALL(secureApi, v_secure_popen(_, _, _)) + // .WillOnce(Return(fp)); + //EXPECT_CALL(secureApi, v_secure_pclose(_)) + // .WillOnce(Return(0)); + //EXPECT_CALL(secureApi, v_secure_system(_, _)) + // .WillOnce(Return(0)); + EXPECT_FALSE(result); + //free(cmd.command); + //free(cmd.rfcvalue); +} */ +extern bool checkAppendRequest(char *issueRequest); +/* +TEST(CheckAppendRequestTest, ReturnsTrueAndRemovesSuffixWhenSuffixPresent) { + char input[64] = "issue_append"; + bool result = checkAppendRequest(input); + EXPECT_TRUE(result); + EXPECT_STREQ(input, "issue"); +} */ + +TEST(CheckAppendRequestTest, ReturnsTrueAndRemovesSuffixWhenSuffixPresent) { + char input[64] = "issue_apnd"; + bool result = checkAppendRequest(input); + EXPECT_TRUE(result); + EXPECT_STREQ(input, "issue"); +} +TEST(CheckAppendRequestTest, ReturnsTrueWhenSuffixIsOnlyContent) { + char input[64] = "_apnd"; + bool result = checkAppendRequest(input); + EXPECT_TRUE(result); + EXPECT_STREQ(input, ""); +} + +TEST(CheckAppendRequestTest, ReturnsFalseWhenSuffixMissing) { + char input[64] = "issue"; + bool result = checkAppendRequest(input); + EXPECT_FALSE(result); + EXPECT_STREQ(input, "issue"); // Should remain unchanged +} + +TEST(CheckAppendRequestTest, ReturnsFalseForShortString) { + char input[64] = ""; + bool result = checkAppendRequest(input); + EXPECT_FALSE(result); + EXPECT_STREQ(input, ""); // Should remain unchanged +} +/* +TEST(CheckAppendRequestTest, ReturnsTrueWhenSuffixIsOnlyContent) { + char input[64] = "_append"; + bool result = checkAppendRequest(input); + EXPECT_TRUE(result); + EXPECT_STREQ(input, ""); +} */ + +TEST(CheckAppendRequestTest, ReturnsFalseIfSuffixAtStartOnly) { + char input[64] = "_appendissue"; + bool result = checkAppendRequest(input); + EXPECT_FALSE(result); + EXPECT_STREQ(input, "_appendissue"); +} + +class GetIssueCommandInfoTest : public ::testing::Test { +protected: + void TearDown() override { + // Cleanup if needed + } + void FreeIssueData(issueData* d) { + if (!d) return; + if (d->command) free(d->command); + if (d->rfcvalue) free(d->rfcvalue); + free(d); + } +}; + +TEST_F(GetIssueCommandInfoTest, ReturnsValidStruct) { + const char* jsonstr = R"({ + "categoryA": { + "type1": [ 42, "kill" ] + }, + "Sanity": { + "Check": { + "Commands": [ "kill", "ls" ] + } + } + })"; + cJSON* root = cJSON_Parse(jsonstr); + ASSERT_NE(root, nullptr); + + issueNodeData node; + node.Node = (char*)"categoryA"; + node.subNode = (char*)"type1"; + + char buf[] = "rfcvalue123"; + issueData* result = getIssueCommandInfo(&node, root, buf); + ASSERT_NE(result, nullptr); + +} + +TEST_F(GetIssueCommandInfoTest, UsesDefaultTimeoutIfNotSet) { + const char* jsonstr = R"({ + "categoryB": { + "typeX": [ "echo only" ] + }, + "Sanity": { + "Check": { + "Commands": [ "kill" ] + } + } + })"; + cJSON* root = cJSON_Parse(jsonstr); + ASSERT_NE(root, nullptr); + + issueNodeData node; + node.Node = (char*)"categoryB"; + node.subNode = (char*)"typeX"; + + char buf[] = "rfctest"; + issueData* result = getIssueCommandInfo(&node, root, buf); + + ASSERT_NE(result, nullptr); + EXPECT_EQ(result->timeout, DEFAULT_TIMEOUT); + ASSERT_NE(result->command, nullptr); + EXPECT_TRUE(strstr(result->command, "echo only") != nullptr); + ASSERT_NE(result->rfcvalue, nullptr); + EXPECT_STREQ(result->rfcvalue, "rfctest"); + + FreeIssueData(result); + cJSON_Delete(root); +} + + + TEST(GetParamCountTest, GetParamCount) { char str[] = "abc.def.ghi"; @@ -236,7 +438,18 @@ class FindIssueInParsedJSONTest : public ::testing::Test cJSON_Delete(json); } }; - +/* +TEST_F(FindIssueInParsedJSONTest, checkIssueNodeInfo_) +{ + issue.Node = strdup("MainNode"); + issue.subNode = strdup("SubNode"); + data_buf buff; + issueData cmd; + cmd.command = strdup("echo hello"); + cmd.rfcvalue = strdup("dummy"); + cmd.timeout = 0; + checkIssueNodeInfo(&issue, json, &buff, false, &cmd); +} */ TEST_F(FindIssueInParsedJSONTest, HandlesNormalInput) { issue.Node = strdup("MainNode"); @@ -656,7 +869,7 @@ TEST_F(SetParamByRFC, TestSetParam) EXPECT_EQ(result, tr181Failure); } -#ifdef IARMBUS_SUPPORT +//#ifdef IARMBUS_SUPPORT /* ----------------IARM --------------- */ class IARMBusTest : public ::testing::Test { @@ -700,7 +913,7 @@ TEST_F(IARMBusTest, TestIARM_Bus_UnRegisterEventHandler) IARM_Result_t result = IARM_Bus_UnRegisterEventHandler("owner", IARM_BUS_RDMMGR_EVENT_APP_INSTALLATION_STATUS); EXPECT_EQ(result, IARM_RESULT_SUCCESS); } -#endif +//#endif /* ------------- RBUS ------------- */ class RBusApiTest : public ::testing::Test @@ -721,6 +934,8 @@ class RBusApiTest : public ::testing::Test .WillOnce(Return(RBUS_ERROR_SUCCESS)); EXPECT_CALL(mock_rbus_api, rbus_set(_, _, _, _)) .WillOnce(Return(RBUS_ERROR_SUCCESS)); + EXPECT_CALL(mock_rbus_api, rbus_get(_, _, _, _)) + .WillOnce(Return(RBUS_ERROR_SUCCESS)); } void TearDown() override @@ -747,6 +962,9 @@ TEST_F(RBusApiTest, TestRBusApi) result = RBusApiWrapper::rbus_set(handle, "objectName", value, nullptr); EXPECT_EQ(result, RBUS_ERROR_SUCCESS); + result = RBusApiWrapper::rbus_get(handle, "objectName", value, nullptr); + EXPECT_EQ(result, RBUS_ERROR_SUCCESS); + result = RBusApiWrapper::rbus_close(handle); EXPECT_EQ(result, RBUS_ERROR_SUCCESS); } @@ -797,117 +1015,6 @@ TEST_F(WebConfigTest, TestRegisterSubDocMock) ASSERT_TRUE(testing::Mock::VerifyAndClearExpectations(&mock_webconfig)); } -#ifdef IARMBUS_SUPPORT -/* ====================== rrdDeepSleep ===================*/ -/* --------------- Test RRDGetDeepSleepdynJSONPathLen() from rrdDeepSleep --------------- */ -devicePropertiesData devPropData; -class RRDGetDeepSleepdynJSONPathLenTest : public ::testing::Test -{ -protected: - devicePropertiesData originalDevPropData; - devicePropertiesData testDevPropData; - - void SetUp() override - { - originalDevPropData = devPropData; - } - - void TearDown() override - { - devPropData = originalDevPropData; - } -}; - -TEST_F(RRDGetDeepSleepdynJSONPathLenTest, TestRRDGetDeepSleepdynJSONPathLen) -{ - testDevPropData.deviceType = RRD_DEFAULT_PLTFMS; - devPropData = testDevPropData; - EXPECT_EQ(RRDGetDeepSleepdynJSONPathLen(), strlen(RRD_MEDIA_APPS) + strlen(RDM_PKG_PREFIX) + strlen(DEEP_SLEEP_STR) + strlen(deviceProfileMap[RRD_DEFAULT_PLTFMS]) + strlen(RRD_JSON_FILE) + 1); - - testDevPropData.deviceType = RRD_REG_X1_PLTFMS; - devPropData = testDevPropData; - EXPECT_EQ(RRDGetDeepSleepdynJSONPathLen(), strlen(RRD_MEDIA_APPS) + strlen(RDM_PKG_PREFIX) + strlen(DEEP_SLEEP_STR) + strlen(deviceProfileMap[RRD_REG_X1_PLTFMS]) + strlen(RRD_JSON_FILE) + 1); - - testDevPropData.deviceType = RRD_LLAMA_PLTFMS; - devPropData = testDevPropData; - EXPECT_EQ(RRDGetDeepSleepdynJSONPathLen(), strlen(RRD_MEDIA_APPS) + strlen(RDM_PKG_PREFIX) + strlen(DEEP_SLEEP_STR) + strlen(deviceProfileMap[RRD_LLAMA_PLTFMS]) + strlen(RRD_JSON_FILE) + 1); - - testDevPropData.deviceType = RRD_PLATCO_PLTFMS; - devPropData = testDevPropData; - EXPECT_EQ(RRDGetDeepSleepdynJSONPathLen(), strlen(RRD_MEDIA_APPS) + strlen(RDM_PKG_PREFIX) + strlen(DEEP_SLEEP_STR) + strlen(deviceProfileMap[RRD_PLATCO_PLTFMS]) + strlen(RRD_JSON_FILE) + 1); -} - -/* --------------- Test RRDGetProfileStringLength() from rrdDeepSleep --------------- */ - -TEST(RRDGetProfileStringLengthTest, HandlesIsDeepSleepAwakeEventFalse) -{ - issueNodeData issue; - issue.Node = strdup("MainNode"); - issue.subNode = strdup("SubNode"); - int length = RRDGetProfileStringLength(&issue, false); - - ASSERT_EQ(length, strlen(RDM_PKG_PREFIX) + strlen(issue.Node) + strlen(RDM_PKG_SUFFIX) + 1); - - free(issue.Node); - free(issue.subNode); -} - -TEST(RRDGetProfileStringLengthTest, HandlesIsDeepSleepAwakeEventTrueRRD_REG_X1_PLTFMS) -{ - issueNodeData issue; - issue.Node = strdup("MainNode"); - issue.subNode = strdup("SubNode"); - devPropData.deviceType = RRD_REG_X1_PLTFMS; - int length = RRDGetProfileStringLength(&issue, true); - - ASSERT_EQ(length, strlen(RDM_PKG_PREFIX) + strlen(RDM_PKG_SUFFIX) + strlen(DEEP_SLEEP_STR) + 1); - - free(issue.Node); - free(issue.subNode); -} - -TEST(RRDGetProfileStringLengthTest, HandlesIsDeepSleepAwakeEventTrueRRD_LLAMA_PLTFMS) -{ - issueNodeData issue; - issue.Node = strdup("MainNode"); - issue.subNode = strdup("SubNode"); - devPropData.deviceType = RRD_LLAMA_PLTFMS; - int length = RRDGetProfileStringLength(&issue, true); - - ASSERT_EQ(length, strlen(RDM_PKG_PREFIX) + strlen(LLAMMA_PROFILE_STR) + strlen(RDM_PKG_SUFFIX) + strlen(DEEP_SLEEP_STR) + 1); - - free(issue.Node); - free(issue.subNode); -} - -TEST(RRDGetProfileStringLengthTest, HandlesIsDeepSleepAwakeEventTrueRRD_PLATCO_PLTFMS) -{ - issueNodeData issue; - issue.Node = strdup("MainNode"); - issue.subNode = strdup("SubNode"); - devPropData.deviceType = RRD_PLATCO_PLTFMS; - int length = RRDGetProfileStringLength(&issue, true); - - ASSERT_EQ(length, strlen(RDM_PKG_PREFIX) + strlen(PLATCO_PROFILE_STR) + strlen(RDM_PKG_SUFFIX) + strlen(DEEP_SLEEP_STR) + 1); - - free(issue.Node); - free(issue.subNode); -} - -TEST(RRDGetProfileStringLengthTest, HandlesIsDeepSleepAwakeEventTrueRRD_DEFAULT_PLTFMS) -{ - issueNodeData issue; - issue.Node = strdup("MainNode"); - issue.subNode = strdup("SubNode"); - devPropData.deviceType = RRD_DEFAULT_PLTFMS; - int length = RRDGetProfileStringLength(&issue, true); - - ASSERT_EQ(length, 0); - - free(issue.Node); - free(issue.subNode); -} - /* --------------- Test RRDCheckIssueInDynamicProfile() from rrdDeepSleep --------------- */ class RRDCheckIssueInDynamicProfileTest : public ::testing::Test { @@ -991,22 +1098,38 @@ TEST_F(RRDCheckIssueInDynamicProfileTest, InDynamicIsTrue_PathExists_ReadAndPars free(buff.jsonPath); } + + /* --------------- Test RRDRdmManagerDownloadRequest() from rrdDeepSleep --------------- */ class RRDRdmManagerDownloadRequestTest : public ::testing::Test { protected: devicePropertiesData originalDevPropData; - devicePropertiesData testDevPropData; - + MockRBusApi mock_rbus_api; + string getCurrentTestName() + { + const testing::TestInfo *const test_info = testing::UnitTest::GetInstance()->current_test_info(); + return test_info->name(); + } void SetUp() override { originalDevPropData = devPropData; + string test_name = getCurrentTestName(); + if (test_name == "DeepSleepAwakeEventIsFalse_SetParamReturnsFailure" || test_name == "DeepSleepAwakeEventIsTrue_SetParamReturnsFailure") + { + RBusApiWrapper::setImpl(&mock_rbus_api); + } } void TearDown() override { devPropData = originalDevPropData; SetParamWrapper::clearImpl(); + string test_name = getCurrentTestName(); + if (test_name == "DeepSleepAwakeEventIsFalse_SetParamReturnsFailure") + { + RBusApiWrapper::clearImpl(); + } } }; @@ -1032,9 +1155,16 @@ TEST_F(RRDRdmManagerDownloadRequestTest, DeepSleepAwakeEventIsFalse_SetParamRetu buff.jsonPath = strdup("UTJson/validJson.json"); buff.inDynamic = false; - MockSetParam mock_set_param; - SetParamWrapper::setImpl(&mock_set_param); - EXPECT_CALL(mock_set_param, setParam(_, _, _)).WillOnce(Return(tr181Failure)); + //MockSetParam mock_set_param; + //SetParamWrapper::setImpl(&mock_set_param); + //EXPECT_CALL(mock_set_param, setParam(_, _, _)).WillOnce(Return(tr181Failure)); + EXPECT_CALL(mock_rbus_api, rbusValue_Init(_)) + .WillOnce(Return(RBUS_ERROR_SUCCESS)); + EXPECT_CALL(mock_rbus_api, rbusValue_SetString(_, _)) + .WillOnce(Return(RBUS_ERROR_SUCCESS)); + + EXPECT_CALL(mock_rbus_api, rbus_set(_, _, _, _)) + .WillOnce(Return(RBUS_ERROR_BUS_ERROR)); RRDRdmManagerDownloadRequest(&issuestructNode, buff.jsonPath, &buff, false); free(buff.jsonPath); @@ -1049,12 +1179,12 @@ TEST_F(RRDRdmManagerDownloadRequestTest, DeepSleepAwakeEventIsTrue_SetParamRetur buff.mdata = NULL; buff.jsonPath = strdup("UTJson/validJson.json"); buff.inDynamic = false; - testDevPropData.deviceType = RRD_LLAMA_PLTFMS; - devPropData = testDevPropData; - - MockSetParam mock_set_param; - SetParamWrapper::setImpl(&mock_set_param); - EXPECT_CALL(mock_set_param, setParam(_, _, _)).WillOnce(Return(tr181Failure)); + EXPECT_CALL(mock_rbus_api, rbusValue_Init(_)) + .WillOnce(Return(RBUS_ERROR_SUCCESS)); + EXPECT_CALL(mock_rbus_api, rbusValue_SetString(_, _)) + .WillOnce(Return(RBUS_ERROR_SUCCESS)); + EXPECT_CALL(mock_rbus_api, rbus_set(_, _, _, _)) + .WillOnce(Return(RBUS_ERROR_BUS_ERROR)); RRDRdmManagerDownloadRequest(&issuestructNode, buff.jsonPath, &buff, true); free(buff.jsonPath); @@ -1069,17 +1199,20 @@ TEST_F(RRDRdmManagerDownloadRequestTest, DeepSleepAwakeEventIsFalse_SetParamRetu buff.mdata = strdup("ValidIssueTypeData"); buff.jsonPath = strdup("UTJson/validJson.json"); buff.inDynamic = false; - - MockSetParam mock_set_param; - SetParamWrapper::setImpl(&mock_set_param); - EXPECT_CALL(mock_set_param, setParam(_, _, _)) - .WillOnce(Return(tr181Success)); + EXPECT_CALL(mock_rbus_api, rbusValue_Init(_)) + .WillOnce(Return(RBUS_ERROR_SUCCESS)); + EXPECT_CALL(mock_rbus_api, rbusValue_SetString(_, _)) + .WillOnce(Return(RBUS_ERROR_SUCCESS)); + + EXPECT_CALL(mock_rbus_api, rbus_set(_, _, _, _)) + .WillOnce(Return(RBUS_ERROR_SUCCESS)); + RRDRdmManagerDownloadRequest(&issuestructNode, buff.jsonPath, &buff, false); free(buff.jsonPath); free(buff.mdata); } - +/* TEST_F(RRDRdmManagerDownloadRequestTest, DeepSleepAwakeEventIsTrue_SetParamReturnsSuccess) { issueNodeData issuestructNode; @@ -1089,9 +1222,6 @@ TEST_F(RRDRdmManagerDownloadRequestTest, DeepSleepAwakeEventIsTrue_SetParamRetur buff.mdata = strdup("ValidIssueTypeData"); buff.jsonPath = strdup("UTJson/validJson.json"); buff.inDynamic = false; - testDevPropData.deviceType = RRD_LLAMA_PLTFMS; - devPropData = testDevPropData; - MockSetParam mock_set_param; SetParamWrapper::setImpl(&mock_set_param); EXPECT_CALL(mock_set_param, setParam(_, _, _)) @@ -1111,9 +1241,6 @@ TEST_F(RRDRdmManagerDownloadRequestTest, DeepSleepAwakeEventIsTrue_SetParamRetur buff.mdata = strdup("ValidIssueTypeData"); buff.jsonPath = strdup("UTJson/validJson.json"); buff.inDynamic = false; - testDevPropData.deviceType = RRD_REG_X1_PLTFMS; - devPropData = testDevPropData; - MockSetParam mock_set_param; SetParamWrapper::setImpl(&mock_set_param); EXPECT_CALL(mock_set_param, setParam(_, _, _)) @@ -1133,9 +1260,6 @@ TEST_F(RRDRdmManagerDownloadRequestTest, DeepSleepAwakeEventIsTrue_SetParamRetur buff.mdata = strdup("ValidIssueTypeData"); buff.jsonPath = strdup("UTJson/validJson.json"); buff.inDynamic = false; - testDevPropData.deviceType = RRD_PLATCO_PLTFMS; - devPropData = testDevPropData; - MockSetParam mock_set_param; SetParamWrapper::setImpl(&mock_set_param); EXPECT_CALL(mock_set_param, setParam(_, _, _)) @@ -1155,21 +1279,18 @@ TEST_F(RRDRdmManagerDownloadRequestTest, DeepSleepAwakeEventIsTrue_SetParamRetur buff.mdata = strdup("ValidIssueTypeData"); buff.jsonPath = strdup("UTJson/validJson.json"); buff.inDynamic = false; - testDevPropData.deviceType = RRD_DEFAULT_PLTFMS; - devPropData = testDevPropData; - RRDRdmManagerDownloadRequest(&issuestructNode, buff.jsonPath, &buff, true); free(buff.jsonPath); free(buff.mdata); } +*/ /* --------------- Test RRDProcessDeepSleepAwakeEvents() from rrdDeepSleep --------------- */ class RRDProcessDeepSleepAwakeEventsTest : public ::testing::Test { protected: devicePropertiesData originalDevPropData; - devicePropertiesData testDevPropData; void SetUp() override { @@ -1204,13 +1325,6 @@ TEST_F(RRDProcessDeepSleepAwakeEventsTest, RbufDsEventIsRdmDownloadPkgInitiateSe data_buf rbuf; rbuf.mdata = strdup("IssueNode"); rbuf.dsEvent = RRD_DEEPSLEEP_RDM_DOWNLOAD_PKG_INITIATE; - testDevPropData.deviceType = RRD_LLAMA_PLTFMS; - devPropData = testDevPropData; - MockSetParam mock_set_param; - SetParamWrapper::setImpl(&mock_set_param); - EXPECT_CALL(mock_set_param, setParam(_, _, _)) - .WillOnce(Return(tr181Success)); - RRDProcessDeepSleepAwakeEvents(&rbuf); } @@ -1219,13 +1333,6 @@ TEST_F(RRDProcessDeepSleepAwakeEventsTest, RbufDsEventIsRdmDownloadPkgInitiateSe data_buf rbuf; rbuf.mdata = strdup("IssueNode"); rbuf.dsEvent = RRD_DEEPSLEEP_RDM_DOWNLOAD_PKG_INITIATE; - testDevPropData.deviceType = RRD_LLAMA_PLTFMS; - devPropData = testDevPropData; - MockSetParam mock_set_param; - SetParamWrapper::setImpl(&mock_set_param); - EXPECT_CALL(mock_set_param, setParam(_, _, _)) - .WillOnce(Return(tr181Failure)); - RRDProcessDeepSleepAwakeEvents(&rbuf); } @@ -1235,9 +1342,6 @@ TEST_F(RRDProcessDeepSleepAwakeEventsTest, RbufDsEventIsRdmPkgInstallCompleteInD rbuf.mdata = strdup("IssueNode"); rbuf.dsEvent = RRD_DEEPSLEEP_RDM_PKG_INSTALL_COMPLETE; rbuf.inDynamic = false; - testDevPropData.deviceType = RRD_LLAMA_PLTFMS; - devPropData = testDevPropData; - RRDProcessDeepSleepAwakeEvents(&rbuf); } @@ -1248,1785 +1352,1636 @@ TEST_F(RRDProcessDeepSleepAwakeEventsTest, RbufDsEventIsRdmPkgInstallCompleteInD rbuf.dsEvent = RRD_DEEPSLEEP_RDM_PKG_INSTALL_COMPLETE; rbuf.inDynamic = true; rbuf.jsonPath = NULL; - testDevPropData.deviceType = RRD_LLAMA_PLTFMS; - devPropData = testDevPropData; - RRDProcessDeepSleepAwakeEvents(&rbuf); } -#endif -/* ========================== rrdExecuteScript ======================= */ -/* --------------- Test normalizeIssueName() from rrdExecuteScript --------------- */ -TEST(NormalizeIssueNameTest, HandlesEmptyString) +#ifdef IARMBUS_SUPPORT +/* ====================== rrdDeepSleep ===================*/ +/* --------------- Test RRDGetDeepSleepdynJSONPathLen() from rrdDeepSleep --------------- */ +devicePropertiesData devPropData; +class RRDGetDeepSleepdynJSONPathLenTest : public ::testing::Test { - char str[] = ""; - normalizeIssueName(str); - - ASSERT_STREQ(str, ""); -} +protected: + devicePropertiesData originalDevPropData; + devicePropertiesData testDevPropData; -TEST(NormalizeIssueNameTest, HandlesStringWithNoDot) -{ - char str[] = "issuedata"; - normalizeIssueName(str); + void SetUp() override + { + originalDevPropData = devPropData; + } - ASSERT_STREQ(str, "issuedata"); -} + void TearDown() override + { + devPropData = originalDevPropData; + } +}; -TEST(NormalizeIssueNameTest, HandlesStringWithOnlyDot) +TEST_F(RRDGetDeepSleepdynJSONPathLenTest, TestRRDGetDeepSleepdynJSONPathLen) { - char str[] = "."; - normalizeIssueName(str); + //testDevPropData.deviceType = RRD_DEFAULT_PLTFMS; + devPropData = testDevPropData; + EXPECT_EQ(RRDGetDeepSleepdynJSONPathLen(), strlen(RRD_MEDIA_APPS) + strlen(RDM_PKG_PREFIX) + strlen(DEEP_SLEEP_STR) + strlen(deviceProfileMap[RRD_DEFAULT_PLTFMS]) + strlen(RRD_JSON_FILE) + 1); - ASSERT_STREQ(str, "_"); -} + testDevPropData.deviceType = RRD_REG_X1_PLTFMS; + devPropData = testDevPropData; + EXPECT_EQ(RRDGetDeepSleepdynJSONPathLen(), strlen(RRD_MEDIA_APPS) + strlen(RDM_PKG_PREFIX) + strlen(DEEP_SLEEP_STR) + strlen(deviceProfileMap[RRD_REG_X1_PLTFMS]) + strlen(RRD_JSON_FILE) + 1); -TEST(NormalizeIssueNameTest, HandlesStringWithOneDot) -{ - char str[] = "issuedata.issuetype"; - normalizeIssueName(str); + testDevPropData.deviceType = RRD_LLAMA_PLTFMS; + devPropData = testDevPropData; + EXPECT_EQ(RRDGetDeepSleepdynJSONPathLen(), strlen(RRD_MEDIA_APPS) + strlen(RDM_PKG_PREFIX) + strlen(DEEP_SLEEP_STR) + strlen(deviceProfileMap[RRD_LLAMA_PLTFMS]) + strlen(RRD_JSON_FILE) + 1); - ASSERT_STREQ(str, "issuedata_issuetype"); + testDevPropData.deviceType = RRD_PLATCO_PLTFMS; + devPropData = testDevPropData; + EXPECT_EQ(RRDGetDeepSleepdynJSONPathLen(), strlen(RRD_MEDIA_APPS) + strlen(RDM_PKG_PREFIX) + strlen(DEEP_SLEEP_STR) + strlen(deviceProfileMap[RRD_PLATCO_PLTFMS]) + strlen(RRD_JSON_FILE) + 1); } -TEST(NormalizeIssueNameTest, HandlesStringWithConsecutiveDots) +/* --------------- Test RRDGetProfileStringLength() from rrdDeepSleep --------------- */ + +TEST(RRDGetProfileStringLengthTest, HandlesIsDeepSleepAwakeEventFalse) { - char str[] = "issuedata...issuetype"; - normalizeIssueName(str); + issueNodeData issue; + issue.Node = strdup("MainNode"); + issue.subNode = strdup("SubNode"); + int length = RRDGetProfileStringLength(&issue, false); - ASSERT_STREQ(str, "issuedata___issuetype"); + ASSERT_EQ(length, strlen(RDM_PKG_PREFIX) + strlen(issue.Node) + strlen(RDM_PKG_SUFFIX) + 1); + + free(issue.Node); + free(issue.subNode); } -/* --------------- Test uploadDebugoutput() from rrdExecuteScript --------------- */ -class UploadDebugoutputTest : public ::testing::Test +TEST(RRDGetProfileStringLengthTest, HandlesIsDeepSleepAwakeEventTrueRRD_REG_X1_PLTFMS) { -protected: - int result; + issueNodeData issue; + issue.Node = strdup("MainNode"); + issue.subNode = strdup("SubNode"); + devPropData.deviceType = RRD_REG_X1_PLTFMS; + int length = RRDGetProfileStringLength(&issue, true); - void SetUp() override - { - char command[256]; - sprintf(command, "chmod +x %s", RRD_SCRIPT); - system(command); - } + ASSERT_EQ(length, strlen(RDM_PKG_PREFIX) + strlen(RDM_PKG_SUFFIX) + strlen(DEEP_SLEEP_STR) + 1); - void TearDown() override - { - char command[256]; - sprintf(command, "chmod -x %s", RRD_SCRIPT); - system(command); - } -}; + free(issue.Node); + free(issue.subNode); +} -TEST_F(UploadDebugoutputTest, HandlesBadPath) +TEST(RRDGetProfileStringLengthTest, HandlesIsDeepSleepAwakeEventTrueRRD_LLAMA_PLTFMS) { - result = uploadDebugoutput("/sample/bad_path", "issuename"); - ASSERT_EQ(result, 1); + issueNodeData issue; + issue.Node = strdup("MainNode"); + issue.subNode = strdup("SubNode"); + devPropData.deviceType = RRD_LLAMA_PLTFMS; + int length = RRDGetProfileStringLength(&issue, true); + + ASSERT_EQ(length, strlen(RDM_PKG_PREFIX) + strlen(LLAMMA_PROFILE_STR) + strlen(RDM_PKG_SUFFIX) + strlen(DEEP_SLEEP_STR) + 1); + + free(issue.Node); + free(issue.subNode); } -TEST_F(UploadDebugoutputTest, HandlesNullParameters) +TEST(RRDGetProfileStringLengthTest, HandlesIsDeepSleepAwakeEventTrueRRD_PLATCO_PLTFMS) { - result = uploadDebugoutput(NULL, NULL); - ASSERT_EQ(result, 0); + issueNodeData issue; + issue.Node = strdup("MainNode"); + issue.subNode = strdup("SubNode"); + devPropData.deviceType = RRD_PLATCO_PLTFMS; + int length = RRDGetProfileStringLength(&issue, true); + + ASSERT_EQ(length, strlen(RDM_PKG_PREFIX) + strlen(PLATCO_PROFILE_STR) + strlen(RDM_PKG_SUFFIX) + strlen(DEEP_SLEEP_STR) + 1); + + free(issue.Node); + free(issue.subNode); } -TEST_F(UploadDebugoutputTest, HandlesGoodPath) +TEST(RRDGetProfileStringLengthTest, HandlesIsDeepSleepAwakeEventTrueRRD_DEFAULT_PLTFMS) { - result = uploadDebugoutput("/sample/good_path", "issuename"); - ASSERT_EQ(result, 0); + issueNodeData issue; + issue.Node = strdup("MainNode"); + issue.subNode = strdup("SubNode"); + devPropData.deviceType = RRD_DEFAULT_PLTFMS; + int length = RRDGetProfileStringLength(&issue, true); + + ASSERT_EQ(length, 0); + + free(issue.Node); + free(issue.subNode); } -/* ========================== rrdRunCmdThread ======================= */ -/* --------------- Test initCache() from rrdRunCmdThread --------------- */ -class InitCacheTest : public ::testing::Test +/* --------------- Test RRDCheckIssueInDynamicProfile() from rrdDeepSleep --------------- */ +class RRDCheckIssueInDynamicProfileTest : public ::testing::Test { protected: - void TearDown() override - { - pthread_mutex_destroy(&rrdCacheMut); - } + issueNodeData issuestructNode; + data_buf buff; }; -TEST_F(InitCacheTest, InitializesMutexAndSetsPointerToNull) +TEST_F(RRDCheckIssueInDynamicProfileTest, InDynamicIsFalse) { - initCache(); - - int ret = pthread_mutex_trylock(&rrdCacheMut); - ASSERT_EQ(ret, 0) << "Expected mutex to be unlocked after initCache, but it was locked."; - - if (ret == 0) - { - pthread_mutex_unlock(&rrdCacheMut); - } - - ASSERT_EQ(cacheDataNode, nullptr); -} + issueNodeData issuestructNode; + data_buf buff; + issuestructNode.Node = NULL; + buff.mdata = NULL; + buff.jsonPath = NULL; + buff.inDynamic = false; + char *result = RRDCheckIssueInDynamicProfile(&buff, &issuestructNode); -/* --------------- Test print_items() from rrdRunCmdThread --------------- */ -TEST(PrintItemsTest, HandlesNullNode) -{ - print_items(NULL); + EXPECT_EQ(result, nullptr); } -TEST(PrintItemsTest, HandlesNonNullNode) +TEST_F(RRDCheckIssueInDynamicProfileTest, InDynamicIsTrue_PathDoesNotExist) { - cacheData node; - node.mdata = strdup("mdata"); - node.issueString = strdup("issueString"); - node.next = NULL; - node.prev = NULL; - print_items(&node); + issueNodeData issuestructNode; + data_buf buff; + issuestructNode.Node = NULL; + buff.mdata = NULL; + buff.jsonPath = NULL; + buff.inDynamic = true; + char *result = RRDCheckIssueInDynamicProfile(&buff, &issuestructNode); - free(node.mdata); - free(node.issueString); + EXPECT_EQ(result, nullptr); } -/* --------------- Test createCache() from rrdRunCmdThread --------------- */ -TEST(CreateCacheTest, HandlesNullPkgDataAndValidIssueTypeData) +TEST_F(RRDCheckIssueInDynamicProfileTest, InDynamicIsTrue_PathExists_ReadAndParseJSONReturnsNull) { - char *pkgData = NULL; - char *issueTypeData = strdup("ValidIssueTypeData"); - cacheData *result = createCache(pkgData, issueTypeData); + issueNodeData issuestructNode; + issuestructNode.Node = NULL; + data_buf buff; + buff.inDynamic = true; + buff.jsonPath = strdup("UTJson/emptyJson.json"); + buff.mdata = NULL; + char *result = RRDCheckIssueInDynamicProfile(&buff, &issuestructNode); - ASSERT_NE(result, nullptr); - ASSERT_EQ(result->mdata, nullptr); - ASSERT_STREQ(result->issueString, "ValidIssueTypeData"); - ASSERT_EQ(result->next, nullptr); - ASSERT_EQ(result->prev, nullptr); + EXPECT_EQ(result, nullptr); - free(issueTypeData); - free(result); + free(buff.jsonPath); } -TEST(CreateCacheTest, HandlesValidPkgDataAndIssueTypeData) +TEST_F(RRDCheckIssueInDynamicProfileTest, InDynamicIsTrue_PathExists_ReadAndParseNonNull_FindIssueFalse) { - char *pkgData = strdup("ValidPkgData"); - char *issueTypeData = strdup("ValidIssueTypeData"); - cacheData *result = createCache(pkgData, issueTypeData); + issueNodeData issuestructNode; + issuestructNode.Node = NULL; + data_buf buff; + buff.mdata = NULL; + buff.jsonPath = strdup("UTJson/validJson.json"); + buff.inDynamic = true; + char *result = RRDCheckIssueInDynamicProfile(&buff, &issuestructNode); - ASSERT_NE(result, nullptr); - ASSERT_STREQ(result->mdata, "ValidPkgData"); - ASSERT_STREQ(result->issueString, "ValidIssueTypeData"); - ASSERT_EQ(result->next, nullptr); - ASSERT_EQ(result->prev, nullptr); + EXPECT_EQ(result, nullptr); - free(pkgData); - free(issueTypeData); - free(result); + free(buff.jsonPath); } -TEST(CreateCacheTest, HandlesValidPkgDataAndNullIssueTypeData) +TEST_F(RRDCheckIssueInDynamicProfileTest, InDynamicIsTrue_PathExists_ReadAndParseNonNull_FindIssueTrue) { - char *pkgData = strdup("ValidPkgData"); - char *issueTypeData = NULL; - cacheData *result = createCache(pkgData, issueTypeData); + issueNodeData issuestructNode; + issuestructNode.Node = strdup("key"); + issuestructNode.subNode = NULL; + data_buf buff; + buff.mdata = NULL; + buff.jsonPath = strdup("UTJson/validJson.json"); + buff.inDynamic = true; + char *result = RRDCheckIssueInDynamicProfile(&buff, &issuestructNode); ASSERT_NE(result, nullptr); - ASSERT_STREQ(result->mdata, "ValidPkgData"); - ASSERT_EQ(result->issueString, nullptr); - ASSERT_EQ(result->next, nullptr); - ASSERT_EQ(result->prev, nullptr); + EXPECT_STREQ(result, "{\n\t\"key\":\t\"value\"\n}"); - free(pkgData); free(result); + free(issuestructNode.Node); + free(buff.jsonPath); } -TEST(CreateCacheTest, HandlesNullPkgDataAndIssueTypeData) +/* --------------- Test RRDRdmManagerDownloadRequest() from rrdDeepSleep --------------- */ +class RRDRdmManagerDownloadRequestTest : public ::testing::Test { - char *pkgData = NULL; - char *issueTypeData = NULL; - cacheData *result = createCache(pkgData, issueTypeData); +protected: + devicePropertiesData originalDevPropData; + devicePropertiesData testDevPropData; - ASSERT_NE(result, nullptr); - ASSERT_EQ(result->mdata, nullptr); - ASSERT_EQ(result->issueString, nullptr); - ASSERT_EQ(result->next, nullptr); - ASSERT_EQ(result->prev, nullptr); - - free(result); -} - -/* --------------- Test append_item() from rrdRunCmdThread --------------- */ -class AppendItemTest : public ::testing::Test -{ -protected: void SetUp() override { - pthread_mutex_init(&rrdCacheMut, NULL); - cacheDataNode = NULL; + originalDevPropData = devPropData; } void TearDown() override { - pthread_mutex_destroy(&rrdCacheMut); - while (cacheDataNode != NULL) - { - cacheData *next = cacheDataNode->next; - if (cacheDataNode->mdata != NULL) - { - free(cacheDataNode->mdata); - cacheDataNode->mdata = NULL; - } - if (cacheDataNode->mdata != NULL) - { // NOT_COVERED - free(cacheDataNode->issueString); - cacheDataNode->issueString = NULL; - } - free(cacheDataNode); - cacheDataNode = next; - } + devPropData = originalDevPropData; + SetParamWrapper::clearImpl(); } }; -TEST_F(AppendItemTest, HandlesRrdCachecnodeNullAndPkgDataNullAndIssueTypeDataNull) +TEST_F(RRDRdmManagerDownloadRequestTest, IssueStructNodeIsNull) { - char *pkgData = NULL; - char *issueTypeData = NULL; - append_item(pkgData, issueTypeData); + issueNodeData *issuestructNode = NULL; + data_buf buff; + buff.mdata = NULL; + buff.jsonPath = NULL; + buff.inDynamic = false; + RRDRdmManagerDownloadRequest(issuestructNode, buff.jsonPath, &buff, false); - ASSERT_NE(cacheDataNode, nullptr); - ASSERT_EQ(cacheDataNode->mdata, nullptr); - ASSERT_EQ(cacheDataNode->issueString, nullptr); + EXPECT_EQ(issuestructNode, NULL); } -TEST_F(AppendItemTest, HandlesRrdCachecnodeNullAndPkgDataNullAndIssueTypeDataNotNull) +TEST_F(RRDRdmManagerDownloadRequestTest, DeepSleepAwakeEventIsFalse_SetParamReturnsFailure) { - char *pkgData = NULL; - char *issueTypeData = strdup("ValidIssueTypeData"); - append_item(pkgData, issueTypeData); - - ASSERT_NE(cacheDataNode, nullptr); - ASSERT_EQ(cacheDataNode->mdata, nullptr); - ASSERT_STREQ(cacheDataNode->issueString, issueTypeData); -} + issueNodeData issuestructNode; + issuestructNode.Node = strdup("MainNode"); + issuestructNode.subNode = strdup("SubNode"); + data_buf buff; + buff.mdata = NULL; + buff.jsonPath = strdup("UTJson/validJson.json"); + buff.inDynamic = false; -TEST_F(AppendItemTest, HandlesRrdCachecnodeNullAndPkgDataNotNullAndIssueTypeDataNull) -{ - char *pkgData = strdup("ValidPkgData"); - char *issueTypeData = NULL; - append_item(pkgData, issueTypeData); + MockSetParam mock_set_param; + SetParamWrapper::setImpl(&mock_set_param); + EXPECT_CALL(mock_set_param, setParam(_, _, _)).WillOnce(Return(tr181Failure)); + RRDRdmManagerDownloadRequest(&issuestructNode, buff.jsonPath, &buff, false); - ASSERT_NE(cacheDataNode, nullptr); - ASSERT_STREQ(cacheDataNode->mdata, pkgData); - ASSERT_EQ(cacheDataNode->issueString, nullptr); + free(buff.jsonPath); } -TEST_F(AppendItemTest, HandlesRrdCachecnodeNullAndPkgDataAndIssueTypeDataNotNull) +TEST_F(RRDRdmManagerDownloadRequestTest, DeepSleepAwakeEventIsTrue_SetParamReturnsFailure) { - char *pkgData = strdup("ValidPkgData"); - char *issueTypeData = strdup("ValidIssueTypeData"); - append_item(pkgData, issueTypeData); - - ASSERT_NE(cacheDataNode, nullptr); - ASSERT_STREQ(cacheDataNode->mdata, pkgData); - ASSERT_STREQ(cacheDataNode->issueString, issueTypeData); -} + issueNodeData issuestructNode; + issuestructNode.Node = strdup("MainNode"); + issuestructNode.subNode = strdup("SubNode"); + data_buf buff; + buff.mdata = NULL; + buff.jsonPath = strdup("UTJson/validJson.json"); + buff.inDynamic = false; + testDevPropData.deviceType = RRD_LLAMA_PLTFMS; + devPropData = testDevPropData; -TEST_F(AppendItemTest, HandlesRrdCachecnodeNotNullAndPkgDataNullAndIssueTypeDataNull) -{ - cacheDataNode = (cacheData *)malloc(sizeof(cacheData)); - cacheDataNode->mdata = strdup("ExistingPkgData"); - cacheDataNode->issueString = strdup("ExistingIssueTypeData"); - cacheDataNode->next = NULL; - cacheDataNode->prev = NULL; - char *pkgData = NULL; - char *issueTypeData = NULL; - append_item(pkgData, issueTypeData); + MockSetParam mock_set_param; + SetParamWrapper::setImpl(&mock_set_param); + EXPECT_CALL(mock_set_param, setParam(_, _, _)).WillOnce(Return(tr181Failure)); + RRDRdmManagerDownloadRequest(&issuestructNode, buff.jsonPath, &buff, true); - ASSERT_NE(cacheDataNode, nullptr); - ASSERT_EQ(cacheDataNode->mdata, nullptr); - ASSERT_EQ(cacheDataNode->issueString, nullptr); + free(buff.jsonPath); } -TEST_F(AppendItemTest, HandlesRrdCachecnodeNotNullAndPkgDataNullAndIssueTypeDataNotNull) +TEST_F(RRDRdmManagerDownloadRequestTest, DeepSleepAwakeEventIsFalse_SetParamReturnsSuccess) { - cacheDataNode = (cacheData *)malloc(sizeof(cacheData)); - cacheDataNode->mdata = strdup("ExistingPkgData"); - cacheDataNode->issueString = strdup("ExistingIssueTypeData"); - cacheDataNode->next = NULL; - cacheDataNode->prev = NULL; - char *pkgData = NULL; - char *issueTypeData = strdup("ValidIssueTypeData"); - append_item(pkgData, issueTypeData); + issueNodeData issuestructNode; + issuestructNode.Node = strdup("MainNode"); + issuestructNode.subNode = strdup("SubNode"); + data_buf buff; + buff.mdata = strdup("ValidIssueTypeData"); + buff.jsonPath = strdup("UTJson/validJson.json"); + buff.inDynamic = false; - ASSERT_NE(cacheDataNode, nullptr); - ASSERT_EQ(cacheDataNode->mdata, nullptr); - ASSERT_STREQ(cacheDataNode->issueString, issueTypeData); + MockSetParam mock_set_param; + SetParamWrapper::setImpl(&mock_set_param); + EXPECT_CALL(mock_set_param, setParam(_, _, _)) + .WillOnce(Return(tr181Success)); + RRDRdmManagerDownloadRequest(&issuestructNode, buff.jsonPath, &buff, false); + + free(buff.jsonPath); + free(buff.mdata); } -TEST_F(AppendItemTest, HandlesRrdCachecnodeNotNullAndPkgDataNotNullAndIssueTypeDataNull) +TEST_F(RRDRdmManagerDownloadRequestTest, DeepSleepAwakeEventIsTrue_SetParamReturnsSuccess) { - cacheDataNode = (cacheData *)malloc(sizeof(cacheData)); - cacheDataNode->mdata = strdup("ExistingPkgData"); - cacheDataNode->issueString = strdup("ExistingIssueTypeData"); - cacheDataNode->next = NULL; - cacheDataNode->prev = NULL; - char *pkgData = strdup("ValidPkgData"); - char *issueTypeData = NULL; - append_item(pkgData, issueTypeData); + issueNodeData issuestructNode; + issuestructNode.Node = strdup("MainNode"); + issuestructNode.subNode = strdup("SubNode"); + data_buf buff; + buff.mdata = strdup("ValidIssueTypeData"); + buff.jsonPath = strdup("UTJson/validJson.json"); + buff.inDynamic = false; + testDevPropData.deviceType = RRD_LLAMA_PLTFMS; + devPropData = testDevPropData; - ASSERT_NE(cacheDataNode, nullptr); - ASSERT_STREQ(cacheDataNode->mdata, pkgData); - ASSERT_EQ(cacheDataNode->issueString, nullptr); + MockSetParam mock_set_param; + SetParamWrapper::setImpl(&mock_set_param); + EXPECT_CALL(mock_set_param, setParam(_, _, _)) + .WillOnce(Return(tr181Success)); + RRDRdmManagerDownloadRequest(&issuestructNode, buff.jsonPath, &buff, true); + + free(buff.jsonPath); + free(buff.mdata); } -TEST_F(AppendItemTest, HandlesRrdCachecnodeNotNullAndPkgDataAndIssueTypeDataNotNull) +TEST_F(RRDRdmManagerDownloadRequestTest, DeepSleepAwakeEventIsTrue_SetParamReturnsSuccess_X1) { - cacheDataNode = (cacheData *)malloc(sizeof(cacheData)); - cacheDataNode->mdata = strdup("ExistingPkgData"); - cacheDataNode->issueString = strdup("ExistingIssueTypeData"); - cacheDataNode->next = NULL; - cacheDataNode->prev = NULL; - char *pkgData = strdup("ValidPkgData"); - char *issueTypeData = strdup("ValidIssueTypeData"); - append_item(pkgData, issueTypeData); + issueNodeData issuestructNode; + issuestructNode.Node = strdup("MainNode"); + issuestructNode.subNode = strdup("SubNode"); + data_buf buff; + buff.mdata = strdup("ValidIssueTypeData"); + buff.jsonPath = strdup("UTJson/validJson.json"); + buff.inDynamic = false; + testDevPropData.deviceType = RRD_REG_X1_PLTFMS; + devPropData = testDevPropData; - ASSERT_NE(cacheDataNode, nullptr); - ASSERT_STREQ(cacheDataNode->mdata, pkgData); - ASSERT_STREQ(cacheDataNode->issueString, issueTypeData); + MockSetParam mock_set_param; + SetParamWrapper::setImpl(&mock_set_param); + EXPECT_CALL(mock_set_param, setParam(_, _, _)) + .WillOnce(Return(tr181Success)); + RRDRdmManagerDownloadRequest(&issuestructNode, buff.jsonPath, &buff, true); + + free(buff.jsonPath); + free(buff.mdata); } -/* --------------- Test freecacheDataCacheNode() from rrdRunCmdThread --------------- */ -TEST(FreecacheDataCacheNodeTest, HandlesNodeNotNullAndMdataNotNullAndIssueStringNotNull) +TEST_F(RRDRdmManagerDownloadRequestTest, DeepSleepAwakeEventIsTrue_SetParamReturnsSuccess_PLATCO) { - cacheData *node = (cacheData *)malloc(sizeof(cacheData)); - node->mdata = strdup("ValidMdata"); - node->issueString = strdup("ValidIssueString"); - freecacheDataCacheNode(&node); + issueNodeData issuestructNode; + issuestructNode.Node = strdup("MainNode"); + issuestructNode.subNode = strdup("SubNode"); + data_buf buff; + buff.mdata = strdup("ValidIssueTypeData"); + buff.jsonPath = strdup("UTJson/validJson.json"); + buff.inDynamic = false; + testDevPropData.deviceType = RRD_PLATCO_PLTFMS; + devPropData = testDevPropData; - EXPECT_EQ(node, nullptr); + MockSetParam mock_set_param; + SetParamWrapper::setImpl(&mock_set_param); + EXPECT_CALL(mock_set_param, setParam(_, _, _)) + .WillOnce(Return(tr181Success)); + RRDRdmManagerDownloadRequest(&issuestructNode, buff.jsonPath, &buff, true); + + free(buff.jsonPath); + free(buff.mdata); } -TEST(FreecacheDataCacheNodeTest, HandlesNodeNull) +TEST_F(RRDRdmManagerDownloadRequestTest, DeepSleepAwakeEventIsTrue_SetParamReturnsSuccess_DEF) { - cacheData *node = NULL; - freecacheDataCacheNode(&node); + issueNodeData issuestructNode; + issuestructNode.Node = strdup("MainNode"); + issuestructNode.subNode = strdup("SubNode"); + data_buf buff; + buff.mdata = strdup("ValidIssueTypeData"); + buff.jsonPath = strdup("UTJson/validJson.json"); + buff.inDynamic = false; + testDevPropData.deviceType = RRD_DEFAULT_PLTFMS; + devPropData = testDevPropData; - EXPECT_EQ(node, nullptr); + RRDRdmManagerDownloadRequest(&issuestructNode, buff.jsonPath, &buff, true); + + free(buff.jsonPath); + free(buff.mdata); } -TEST(FreecacheDataCacheNodeTest, HandlesNodeNotNullAndMdataNullAndIssueStringNotNull) +/* --------------- Test RRDProcessDeepSleepAwakeEvents() from rrdDeepSleep --------------- */ +class RRDProcessDeepSleepAwakeEventsTest : public ::testing::Test { - cacheData *node = (cacheData *)malloc(sizeof(cacheData)); - node->mdata = NULL; - node->issueString = strdup("ValidIssueString"); - freecacheDataCacheNode(&node); +protected: + devicePropertiesData originalDevPropData; + devicePropertiesData testDevPropData; - EXPECT_EQ(node, nullptr); -} + void SetUp() override + { + originalDevPropData = devPropData; + } -/*---------------- Test removeQuotes() from rrdRunCmdThread ---------------*/ -TEST(RemoveQuotesTest, null_string) -{ - removeQuotes(nullptr); -} + void TearDown() override + { + devPropData = originalDevPropData; + SetParamWrapper::clearImpl(); + } +}; -TEST(RemoveQuotesTest, HandlesQuotesAndEscapedQuotes) +TEST_F(RRDProcessDeepSleepAwakeEventsTest, RbufDataNull) { - char str[] = "\"Hello \\\"World\\\"\""; - removeQuotes(str); - EXPECT_STREQ(str, "Hello \"World\""); + data_buf buff; + buff.mdata = nullptr; + RRDProcessDeepSleepAwakeEvents(&buff); } -TEST(RemoveQuotesTest, HandlesSurroundingQuotes) +TEST_F(RRDProcessDeepSleepAwakeEventsTest, RbufDsEventIsInvalidDefault) { - char str[] = "\"Hello World\""; - removeQuotes(str); - EXPECT_STREQ(str, "Hello World"); + data_buf rbuf; + rbuf.mdata = "Sample data"; + rbuf.dsEvent = RRD_DEEPSLEEP_INVALID_DEFAULT; + + RRDProcessDeepSleepAwakeEvents(&rbuf); } -TEST(RemoveQuotesTest, HandlesEscapedQuotesWithoutSurroundingQuotes) +TEST_F(RRDProcessDeepSleepAwakeEventsTest, RbufDsEventIsRdmDownloadPkgInitiateSetParamSuccess) { - char str[] = "Hello \\\"World\\\""; - removeQuotes(str); - EXPECT_STREQ(str, "Hello \"World\""); + data_buf rbuf; + rbuf.mdata = strdup("IssueNode"); + rbuf.dsEvent = RRD_DEEPSLEEP_RDM_DOWNLOAD_PKG_INITIATE; + testDevPropData.deviceType = RRD_LLAMA_PLTFMS; + devPropData = testDevPropData; + MockSetParam mock_set_param; + SetParamWrapper::setImpl(&mock_set_param); + EXPECT_CALL(mock_set_param, setParam(_, _, _)) + .WillOnce(Return(tr181Success)); + + RRDProcessDeepSleepAwakeEvents(&rbuf); } -TEST(RemoveQuotesTest, HandlesStringWithoutQuotes) +TEST_F(RRDProcessDeepSleepAwakeEventsTest, RbufDsEventIsRdmDownloadPkgInitiateSetParamFail) { - char str[] = "Hello World"; - removeQuotes(str); - EXPECT_STREQ(str, "Hello World"); + data_buf rbuf; + rbuf.mdata = strdup("IssueNode"); + rbuf.dsEvent = RRD_DEEPSLEEP_RDM_DOWNLOAD_PKG_INITIATE; + testDevPropData.deviceType = RRD_LLAMA_PLTFMS; + devPropData = testDevPropData; + MockSetParam mock_set_param; + SetParamWrapper::setImpl(&mock_set_param); + EXPECT_CALL(mock_set_param, setParam(_, _, _)) + .WillOnce(Return(tr181Failure)); + + RRDProcessDeepSleepAwakeEvents(&rbuf); } -TEST(RemoveQuotesTest, HandlesEmptyString) +TEST_F(RRDProcessDeepSleepAwakeEventsTest, RbufDsEventIsRdmPkgInstallCompleteInDynamicFalse) { - char str[] = ""; - removeQuotes(str); - EXPECT_STREQ(str, ""); + data_buf rbuf; + rbuf.mdata = strdup("IssueNode"); + rbuf.dsEvent = RRD_DEEPSLEEP_RDM_PKG_INSTALL_COMPLETE; + rbuf.inDynamic = false; + testDevPropData.deviceType = RRD_LLAMA_PLTFMS; + devPropData = testDevPropData; + + RRDProcessDeepSleepAwakeEvents(&rbuf); } -/*----------------- Test copyDebugLogDestFile() from rrdRunCmdThread ------------*/ -TEST(CopyDebugLogDestFileTest, HandlesEmptySource) +TEST_F(RRDProcessDeepSleepAwakeEventsTest, RbufDsEventIsRdmPkgInstallCompleteInDynamicTrue) { - FILE *source = std::tmpfile(); - FILE *destination = std::tmpfile(); - - ASSERT_NE(source, nullptr); - ASSERT_NE(destination, nullptr); + data_buf rbuf; + rbuf.mdata = strdup("IssueNode"); + rbuf.dsEvent = RRD_DEEPSLEEP_RDM_PKG_INSTALL_COMPLETE; + rbuf.inDynamic = true; + rbuf.jsonPath = NULL; + testDevPropData.deviceType = RRD_LLAMA_PLTFMS; + devPropData = testDevPropData; - fclose(source); - source = std::tmpfile(); - ASSERT_NE(source, nullptr); + RRDProcessDeepSleepAwakeEvents(&rbuf); +} +#endif - copyDebugLogDestFile(source, destination); +/* ========================== rrdExecuteScript ======================= */ +/* --------------- Test normalizeIssueName() from rrdExecuteScript --------------- */ +TEST(NormalizeIssueNameTest, HandlesEmptyString) +{ + char str[] = ""; + normalizeIssueName(str); - fseek(destination, 0, SEEK_SET); - char buffer[1024] = {0}; - size_t bytesRead = fread(buffer, 1, sizeof(buffer) - 1, destination); + ASSERT_STREQ(str, ""); +} - EXPECT_EQ(bytesRead, 0); +TEST(NormalizeIssueNameTest, HandlesStringWithNoDot) +{ + char str[] = "issuedata"; + normalizeIssueName(str); - fclose(source); - fclose(destination); + ASSERT_STREQ(str, "issuedata"); } -TEST(CopyDebugLogDestFileTest, HandlesNullPointers) +TEST(NormalizeIssueNameTest, HandlesStringWithOnlyDot) { - FILE *destination = std::tmpfile(); - ASSERT_NE(destination, nullptr); - - copyDebugLogDestFile(nullptr, destination); + char str[] = "."; + normalizeIssueName(str); - fseek(destination, 0, SEEK_SET); - char buffer[1024] = {0}; - size_t bytesRead = fread(buffer, 1, sizeof(buffer) - 1, destination); + ASSERT_STREQ(str, "_"); +} - EXPECT_EQ(bytesRead, 0); +TEST(NormalizeIssueNameTest, HandlesStringWithOneDot) +{ + char str[] = "issuedata.issuetype"; + normalizeIssueName(str); - fclose(destination); + ASSERT_STREQ(str, "issuedata_issuetype"); +} - FILE *source = std::tmpfile(); - ASSERT_NE(source, nullptr); - copyDebugLogDestFile(source, nullptr); +TEST(NormalizeIssueNameTest, HandlesStringWithConsecutiveDots) +{ + char str[] = "issuedata...issuetype"; + normalizeIssueName(str); - fclose(source); + ASSERT_STREQ(str, "issuedata___issuetype"); } -/* --------------- Test findPresentInCache() from rrdRunCmdThread --------------- */ -class FindPresentInCacheTest : public ::testing::Test +/* --------------- Test uploadDebugoutput() from rrdExecuteScript --------------- */ +class UploadDebugoutputTest : public ::testing::Test { protected: + int result; + void SetUp() override { - pthread_mutex_init(&rrdCacheMut, NULL); - cacheDataNode = NULL; + char command[256]; + sprintf(command, "chmod +x %s", RRD_SCRIPT); + system(command); } void TearDown() override { - pthread_mutex_destroy(&rrdCacheMut); - while (cacheDataNode != NULL) - { - cacheData *next = cacheDataNode->next; - if (cacheDataNode->mdata != NULL) - { - free(cacheDataNode->mdata); - cacheDataNode->mdata = NULL; - } - if (cacheDataNode->mdata != NULL) - { // NOT_COVERED - free(cacheDataNode->issueString); - cacheDataNode->issueString = NULL; - } - free(cacheDataNode); - cacheDataNode = next; - } + char command[256]; + sprintf(command, "chmod -x %s", RRD_SCRIPT); + system(command); } }; -TEST_F(FindPresentInCacheTest, HandlesPkgDataFoundInSecondElement) -{ - cacheData *firstNode = (cacheData *)malloc(sizeof(cacheData)); - firstNode->mdata = strdup("FirstPkgData"); - firstNode->issueString = strdup("FirstIssueString"); - firstNode->next = NULL; - cacheData *secondNode = (cacheData *)malloc(sizeof(cacheData)); - secondNode->mdata = strdup("SecondPkgData"); - secondNode->issueString = strdup("SecondIssueString"); - secondNode->next = NULL; - firstNode->next = secondNode; - cacheDataNode = firstNode; - cacheData *result = findPresentInCache("SecondPkgData"); - - EXPECT_EQ(result, secondNode); -} - -TEST_F(FindPresentInCacheTest, HandlesPkgDataFoundInFirstElement) +TEST_F(UploadDebugoutputTest, HandlesBadPath) { - cacheData *node = (cacheData *)malloc(sizeof(cacheData)); - node->mdata = strdup("PkgData"); - node->issueString = strdup("IssueString"); - node->next = NULL; - cacheDataNode = node; - cacheData *result = findPresentInCache("PkgData"); - - EXPECT_EQ(result, node); + result = uploadDebugoutput("/sample/bad_path", "issuename"); + ASSERT_EQ(result, 1); } -TEST_F(FindPresentInCacheTest, HandlesRrdCachecnodeNull) +TEST_F(UploadDebugoutputTest, HandlesNullParameters) { - cacheData *result = findPresentInCache("PkgData"); - EXPECT_EQ(result, nullptr); + result = uploadDebugoutput(NULL, NULL); + ASSERT_EQ(result, 0); } -TEST_F(FindPresentInCacheTest, HandlesPkgDataNotFoundInRrdCachecnode) +TEST_F(UploadDebugoutputTest, HandlesGoodPath) { - cacheData *node = (cacheData *)malloc(sizeof(cacheData)); - node->mdata = strdup("PkgData"); - node->issueString = strdup("IssueString"); - node->next = NULL; - cacheDataNode = node; - cacheData *result = findPresentInCache("NonExistentPkgData"); - - EXPECT_EQ(result, nullptr); + result = uploadDebugoutput("/sample/good_path", "issuename"); + ASSERT_EQ(result, 0); } -/* --------------- Test remove_item() from rrdRunCmdThread --------------- */ -class RemoveItemTest : public ::testing::Test +/* ========================== rrdRunCmdThread ======================= */ +/* --------------- Test initCache() from rrdRunCmdThread --------------- */ +class InitCacheTest : public ::testing::Test { protected: - void SetUp() override - { - pthread_mutex_init(&rrdCacheMut, NULL); - cacheDataNode = NULL; - } - void TearDown() override { pthread_mutex_destroy(&rrdCacheMut); - while (cacheDataNode != NULL) - { // NOT_COVERED - cacheData *next = cacheDataNode->next; - if (cacheDataNode->mdata != NULL) - { - free(cacheDataNode->mdata); - cacheDataNode->mdata = NULL; - } - if (cacheDataNode->issueString != NULL) - { - free(cacheDataNode->issueString); - cacheDataNode->issueString = NULL; - } - free(cacheDataNode); - cacheDataNode = next; - } } }; -TEST_F(RemoveItemTest, HandlesCacheNull) -{ - remove_item(NULL); - EXPECT_EQ(cacheDataNode, nullptr); -} - -TEST_F(RemoveItemTest, HandlesCacheNotNullAndCacheEqualsRrdCachecnode) -{ - cacheData *node = (cacheData *)malloc(sizeof(cacheData)); - node->mdata = strdup("PkgData"); - node->issueString = strdup("IssueString"); - node->next = NULL; - cacheDataNode = node; - remove_item(node); - - EXPECT_EQ(cacheDataNode, nullptr); -} - -TEST_F(RemoveItemTest, HandlesCacheNotNullAndCacheNotEqualsRrdCachecnode) +TEST_F(InitCacheTest, InitializesMutexAndSetsPointerToNull) { - cacheData *node = (cacheData *)malloc(sizeof(cacheData)); - node->mdata = strdup("PkgData"); - node->issueString = strdup("IssueString"); - node->next = NULL; - cacheDataNode = node; - cacheData *node_dummy = (cacheData *)malloc(sizeof(cacheData)); - node_dummy->mdata = strdup("PkgData"); - node_dummy->issueString = strdup("IssueString"); - node_dummy->next = NULL; - remove_item(node_dummy); + initCache(); - EXPECT_NE(cacheDataNode, nullptr); -} + int ret = pthread_mutex_trylock(&rrdCacheMut); + ASSERT_EQ(ret, 0) << "Expected mutex to be unlocked after initCache, but it was locked."; -/* ======================== rrdEventProcess ==============*/ -/* --------------- Test freeParsedJson() from rrdEventProcess --------------- */ -TEST(FreeParsedJsonTest, HandlesValidJson) -{ - cJSON *json = cJSON_CreateObject(); - cJSON_AddStringToObject(json, "key", "value"); - freeParsedJson(json); -} + if (ret == 0) + { + pthread_mutex_unlock(&rrdCacheMut); + } -TEST(FreeParsedJsonTest, HandlesNullJson) -{ - freeParsedJson(NULL); + ASSERT_EQ(cacheDataNode, nullptr); } -/* --------------- Test removeSpecialCharacterfromIssueTypeList() from rrdEventProcess --------------- */ - -TEST(RemoveSpecialCharacterfromIssueTypeListTest, HandlesEmptyString) +/* --------------- Test print_items() from rrdRunCmdThread --------------- */ +TEST(PrintItemsTest, HandlesNullNode) { - char str[] = ""; - removeSpecialCharacterfromIssueTypeList(str); - - EXPECT_STREQ(str, ""); + print_items(NULL); } -TEST(RemoveSpecialCharacterfromIssueTypeListTest, HandlesStringWithCommaAndDot) +TEST(PrintItemsTest, HandlesNonNullNode) { - char str[] = "a,b.c"; - removeSpecialCharacterfromIssueTypeList(str); + cacheData node; + node.mdata = strdup("mdata"); + node.issueString = strdup("issueString"); + node.next = NULL; + node.prev = NULL; + print_items(&node); - EXPECT_STREQ(str, "a,b.c"); + free(node.mdata); + free(node.issueString); } -TEST(RemoveSpecialCharacterfromIssueTypeListTest, HandlesStringWithoutCommaAndDot) +/* --------------- Test createCache() from rrdRunCmdThread --------------- */ +TEST(CreateCacheTest, HandlesNullPkgDataAndValidIssueTypeData) { - char str[] = "abc"; - removeSpecialCharacterfromIssueTypeList(str); - - EXPECT_STREQ(str, "abc"); -} + char *pkgData = NULL; + char *issueTypeData = strdup("ValidIssueTypeData"); + cacheData *result = createCache(pkgData, issueTypeData); -TEST(RemoveSpecialCharacterfromIssueTypeListTest, HandlesStringWithConsecutiveSpecialCharacters) -{ - char str[] = "a^&b"; - char str1[] = "^x"; - removeSpecialCharacterfromIssueTypeList(str); - removeSpecialCharacterfromIssueTypeList(str1); + ASSERT_NE(result, nullptr); + ASSERT_EQ(result->mdata, nullptr); + ASSERT_STREQ(result->issueString, "ValidIssueTypeData"); + ASSERT_EQ(result->next, nullptr); + ASSERT_EQ(result->prev, nullptr); - EXPECT_STREQ(str, "ab"); - EXPECT_STREQ(str1, "x"); + free(issueTypeData); + free(result); } -/* --------------- Test issueTypeSplitter() from rrdEventProcess --------------- */ -TEST(IssueTypeSplitterTest, HandlesStringWithSpecialCharacters) +TEST(CreateCacheTest, HandlesValidPkgDataAndIssueTypeData) { - char str[] = "a@,b,&,cd,ef"; - char **args = NULL; - int count = issueTypeSplitter(str, ',', &args); + char *pkgData = strdup("ValidPkgData"); + char *issueTypeData = strdup("ValidIssueTypeData"); + cacheData *result = createCache(pkgData, issueTypeData); - ASSERT_EQ(count, 4); - ASSERT_STREQ(args[0], "a"); - ASSERT_STREQ(args[1], "b"); - ASSERT_STREQ(args[2], "cd"); - ASSERT_STREQ(args[3], "ef"); + ASSERT_NE(result, nullptr); + ASSERT_STREQ(result->mdata, "ValidPkgData"); + ASSERT_STREQ(result->issueString, "ValidIssueTypeData"); + ASSERT_EQ(result->next, nullptr); + ASSERT_EQ(result->prev, nullptr); - for (int i = 0; i < count; i++) - { - free(args[i]); - } - free(args); + free(pkgData); + free(issueTypeData); + free(result); } -TEST(IssueTypeSplitterTest, HandlesStringWithNoSpecialCharacters) +TEST(CreateCacheTest, HandlesValidPkgDataAndNullIssueTypeData) { - char str[] = "abcd"; - char **args = NULL; - int count = issueTypeSplitter(str, ',', &args); + char *pkgData = strdup("ValidPkgData"); + char *issueTypeData = NULL; + cacheData *result = createCache(pkgData, issueTypeData); - ASSERT_EQ(count, 1); - ASSERT_STREQ(args[0], "abcd"); + ASSERT_NE(result, nullptr); + ASSERT_STREQ(result->mdata, "ValidPkgData"); + ASSERT_EQ(result->issueString, nullptr); + ASSERT_EQ(result->next, nullptr); + ASSERT_EQ(result->prev, nullptr); - for (int i = 0; i < count; i++) - { - free(args[i]); - } - free(args); + free(pkgData); + free(result); } -TEST(IssueTypeSplitterTest, HandlesEmptyString) +TEST(CreateCacheTest, HandlesNullPkgDataAndIssueTypeData) { - char str[] = ""; - char **args = NULL; - int count = issueTypeSplitter(str, ',', &args); + char *pkgData = NULL; + char *issueTypeData = NULL; + cacheData *result = createCache(pkgData, issueTypeData); - ASSERT_EQ(count, 1); + ASSERT_NE(result, nullptr); + ASSERT_EQ(result->mdata, nullptr); + ASSERT_EQ(result->issueString, nullptr); + ASSERT_EQ(result->next, nullptr); + ASSERT_EQ(result->prev, nullptr); - free(args); + free(result); } -/* --------------- Test processIssueTypeInDynamicProfile() from rrdEventProcess --------------- */ -class ProcessIssueTypeInDynamicProfileTest : public ::testing::Test +/* --------------- Test append_item() from rrdRunCmdThread --------------- */ +class AppendItemTest : public ::testing::Test { protected: - issueNodeData issuestructNode; - data_buf buff; - void SetUp() override { - issuestructNode.Node = strdup("testNode"); - issuestructNode.subNode = strdup("testSubNode"); - buff.mdata = strdup("testData"); + pthread_mutex_init(&rrdCacheMut, NULL); + cacheDataNode = NULL; } void TearDown() override { - free(issuestructNode.Node); - free(issuestructNode.subNode); + pthread_mutex_destroy(&rrdCacheMut); + while (cacheDataNode != NULL) + { + cacheData *next = cacheDataNode->next; + if (cacheDataNode->mdata != NULL) + { + free(cacheDataNode->mdata); + cacheDataNode->mdata = NULL; + } + if (cacheDataNode->mdata != NULL) + { // NOT_COVERED + free(cacheDataNode->issueString); + cacheDataNode->issueString = NULL; + } + free(cacheDataNode); + cacheDataNode = next; + } } }; -TEST_F(ProcessIssueTypeInDynamicProfileTest, JsonPathIsNull) +TEST_F(AppendItemTest, HandlesRrdCachecnodeNullAndPkgDataNullAndIssueTypeDataNull) { - buff.jsonPath = NULL; - char *mdata_before = strdup(buff.mdata); - processIssueTypeInDynamicProfile(&buff, &issuestructNode); - - ASSERT_EQ(buff.mdata, nullptr); + char *pkgData = NULL; + char *issueTypeData = NULL; + append_item(pkgData, issueTypeData); - free(mdata_before); + ASSERT_NE(cacheDataNode, nullptr); + ASSERT_EQ(cacheDataNode->mdata, nullptr); + ASSERT_EQ(cacheDataNode->issueString, nullptr); } -TEST_F(ProcessIssueTypeInDynamicProfileTest, JsonPathIsNotNull_ReadAndParseJSONReturnsNull) +TEST_F(AppendItemTest, HandlesRrdCachecnodeNullAndPkgDataNullAndIssueTypeDataNotNull) { - buff.jsonPath = strdup("UTJson/invalidJson.json"); - char *mdata_before = strdup(buff.mdata); - char *jsonPath_before = strdup(buff.jsonPath); - processIssueTypeInDynamicProfile(&buff, &issuestructNode); - - ASSERT_EQ(buff.mdata, nullptr); - ASSERT_EQ(buff.jsonPath, nullptr); + char *pkgData = NULL; + char *issueTypeData = strdup("ValidIssueTypeData"); + append_item(pkgData, issueTypeData); - free(mdata_before); - free(jsonPath_before); + ASSERT_NE(cacheDataNode, nullptr); + ASSERT_EQ(cacheDataNode->mdata, nullptr); + ASSERT_STREQ(cacheDataNode->issueString, issueTypeData); } -TEST_F(ProcessIssueTypeInDynamicProfileTest, JsonPathIsNotNull_ReadAndParseJSONReturnsNotNull_FindIssueInParsedJSONReturnsFalse) +TEST_F(AppendItemTest, HandlesRrdCachecnodeNullAndPkgDataNotNullAndIssueTypeDataNull) { - buff.jsonPath = strdup("UTJson/validJson.json"); - char *mdata_before = strdup(buff.mdata); - char *jsonPath_before = strdup(buff.jsonPath); - processIssueTypeInDynamicProfile(&buff, &issuestructNode); - - ASSERT_EQ(buff.mdata, nullptr); - ASSERT_EQ(buff.jsonPath, nullptr); + char *pkgData = strdup("ValidPkgData"); + char *issueTypeData = NULL; + append_item(pkgData, issueTypeData); - free(mdata_before); - free(jsonPath_before); + ASSERT_NE(cacheDataNode, nullptr); + ASSERT_STREQ(cacheDataNode->mdata, pkgData); + ASSERT_EQ(cacheDataNode->issueString, nullptr); } -/* --------------- Test processWebCfgTypeEvent() from rrdEventProcess --------------- */ -TEST(ProcessWebCfgTypeEvntTest, RBufIsNull){ - data_buf *rbuf = nullptr; - processWebCfgTypeEvent(rbuf); -} +TEST_F(AppendItemTest, HandlesRrdCachecnodeNullAndPkgDataAndIssueTypeDataNotNull) +{ + char *pkgData = strdup("ValidPkgData"); + char *issueTypeData = strdup("ValidIssueTypeData"); + append_item(pkgData, issueTypeData); -TEST(ProcessWebCfgTypeEvntTest, RBufDataIsNull){ - data_buf rbuf; - rbuf.mdata = nullptr; - rbuf.jsonPath = strdup("sample-path"); - processWebCfgTypeEvent(&rbuf); - - free(rbuf.jsonPath); + ASSERT_NE(cacheDataNode, nullptr); + ASSERT_STREQ(cacheDataNode->mdata, pkgData); + ASSERT_STREQ(cacheDataNode->issueString, issueTypeData); } -/* --------------- Test processIssueTypeEvent() from rrdEventProcess --------------- */ -TEST(ProcessIssueTypeEvntTest, RBufIsNull){ - data_buf *rbuf = nullptr; - processIssueTypeEvent(rbuf); -} +TEST_F(AppendItemTest, HandlesRrdCachecnodeNotNullAndPkgDataNullAndIssueTypeDataNull) +{ + cacheDataNode = (cacheData *)malloc(sizeof(cacheData)); + cacheDataNode->mdata = strdup("ExistingPkgData"); + cacheDataNode->issueString = strdup("ExistingIssueTypeData"); + cacheDataNode->next = NULL; + cacheDataNode->prev = NULL; + char *pkgData = NULL; + char *issueTypeData = NULL; + append_item(pkgData, issueTypeData); -TEST(ProcessIssueTypeEvntTest, inDynamic_NoJson){ - data_buf rbuf; - rbuf.mdata = strdup("a"); - rbuf.inDynamic = true; - rbuf.jsonPath = nullptr; - processIssueTypeEvent(&rbuf); + ASSERT_NE(cacheDataNode, nullptr); + ASSERT_EQ(cacheDataNode->mdata, nullptr); + ASSERT_EQ(cacheDataNode->issueString, nullptr); } -/* ======================== rrdExecuteScript ==============*/ - -/* --------------- Test processIssueTypeInInstalledPackage() from rrdExecuteScript --------------- */ -TEST(ProcessIssueTypeInInstalledPackageTest, WhenReadAndParseJSONReturnsNull) +TEST_F(AppendItemTest, HandlesRrdCachecnodeNotNullAndPkgDataNullAndIssueTypeDataNotNull) { - data_buf rbuf; - issueNodeData *issuestructNode = NULL; - rbuf.jsonPath = strdup("UTJson/emptyJson.json"); - processIssueTypeInInstalledPackage(&rbuf, issuestructNode); + cacheDataNode = (cacheData *)malloc(sizeof(cacheData)); + cacheDataNode->mdata = strdup("ExistingPkgData"); + cacheDataNode->issueString = strdup("ExistingIssueTypeData"); + cacheDataNode->next = NULL; + cacheDataNode->prev = NULL; + char *pkgData = NULL; + char *issueTypeData = strdup("ValidIssueTypeData"); + append_item(pkgData, issueTypeData); - free(rbuf.jsonPath); + ASSERT_NE(cacheDataNode, nullptr); + ASSERT_EQ(cacheDataNode->mdata, nullptr); + ASSERT_STREQ(cacheDataNode->issueString, issueTypeData); } -#ifdef IARMBUS_SUPPORT -TEST(ProcessIssueTypeInInstalledPackageTest, WhenReadAndParseJSONReturnsNonNull) +TEST_F(AppendItemTest, HandlesRrdCachecnodeNotNullAndPkgDataNotNullAndIssueTypeDataNull) { - data_buf rbuf; - issueNodeData issuestructNode; - issuestructNode.Node = strdup("sample"); - issuestructNode.subNode = NULL; - rbuf.jsonPath = strdup("UTJson/validJson.json"); - - MockSetParam mock_set_param; - SetParamWrapper::setImpl(&mock_set_param); - EXPECT_CALL(mock_set_param, setParam(_, _, _)) - .WillOnce(Return(tr181Failure)); - processIssueTypeInInstalledPackage(&rbuf, &issuestructNode); + cacheDataNode = (cacheData *)malloc(sizeof(cacheData)); + cacheDataNode->mdata = strdup("ExistingPkgData"); + cacheDataNode->issueString = strdup("ExistingIssueTypeData"); + cacheDataNode->next = NULL; + cacheDataNode->prev = NULL; + char *pkgData = strdup("ValidPkgData"); + char *issueTypeData = NULL; + append_item(pkgData, issueTypeData); - free(rbuf.jsonPath); + ASSERT_NE(cacheDataNode, nullptr); + ASSERT_STREQ(cacheDataNode->mdata, pkgData); + ASSERT_EQ(cacheDataNode->issueString, nullptr); } -/* --------------- Test processIssueTypeInStaticProfile() from rrdExecuteScript --------------- */ -class ProcessIssueTypeInStaticProfileTest : public ::testing::Test -{ -protected: - void SetUp() override - { - SetParamWrapper::clearImpl(); - } - void TearDown() override - { - SetParamWrapper::clearImpl(); - } -}; - -TEST_F(ProcessIssueTypeInStaticProfileTest, StatusProcessWhenReadAndParseJSONReturnsNull) +TEST_F(AppendItemTest, HandlesRrdCachecnodeNotNullAndPkgDataAndIssueTypeDataNotNull) { + cacheDataNode = (cacheData *)malloc(sizeof(cacheData)); + cacheDataNode->mdata = strdup("ExistingPkgData"); + cacheDataNode->issueString = strdup("ExistingIssueTypeData"); + cacheDataNode->next = NULL; + cacheDataNode->prev = NULL; + char *pkgData = strdup("ValidPkgData"); + char *issueTypeData = strdup("ValidIssueTypeData"); + append_item(pkgData, issueTypeData); - data_buf rbuf; - - issueNodeData issuestructNode; - issuestructNode.Node = strdup("key"); - issuestructNode.subNode = strdup("notValue"); - rbuf.jsonPath = strdup("UTJson/validJson2.json"); - - MockSetParam mock_set_param; - SetParamWrapper::setImpl(&mock_set_param); - EXPECT_CALL(mock_set_param, setParam(_, _, _)) - .WillOnce(Return(tr181Failure)); - processIssueTypeInStaticProfile(&rbuf, &issuestructNode); - - free(rbuf.jsonPath); + ASSERT_NE(cacheDataNode, nullptr); + ASSERT_STREQ(cacheDataNode->mdata, pkgData); + ASSERT_STREQ(cacheDataNode->issueString, issueTypeData); } -#endif -/* --------------- Test processIssueType() from rrdExecuteScript --------------- */ -TEST(processIssueTypeTest, mdataIsNull) +/* --------------- Test freecacheDataCacheNode() from rrdRunCmdThread --------------- */ +TEST(FreecacheDataCacheNodeTest, HandlesNodeNotNullAndMdataNotNullAndIssueStringNotNull) { - data_buf rbuf; - rbuf.mdata = NULL; - processIssueType(&rbuf); -} + cacheData *node = (cacheData *)malloc(sizeof(cacheData)); + node->mdata = strdup("ValidMdata"); + node->issueString = strdup("ValidIssueString"); + freecacheDataCacheNode(&node); -TEST(processIssueTypeTest, dynamicPath) -{ - data_buf rbuf; - issueNodeData issuestructNode; - rbuf.mdata = strdup("IssueNode"); - rbuf.inDynamic = true; - rbuf.jsonPath = NULL; - processIssueType(&rbuf); + EXPECT_EQ(node, nullptr); } -#ifdef IARMBUS_SUPPORT -/* ====================== rrdIarm ================*/ -/* --------------- Test getBlobVersion() from rrdIarm --------------- */ -extern uint32_t gWebCfgBloBVersion; -namespace +TEST(FreecacheDataCacheNodeTest, HandlesNodeNull) { - TEST(SetBlobVersionTest, SetsGlobalVariable) - { - char subdoc[] = "test_subdoc"; - uint32_t version = 5; - int result = setBlobVersion(subdoc, version); - - EXPECT_EQ(result, 0); - EXPECT_EQ(gWebCfgBloBVersion, version); - } - TEST(GetBlobVersionTest, ReturnsGlobalVariable) - { - char subdoc[] = "test_subdoc"; - uint32_t result = getBlobVersion(subdoc); + cacheData *node = NULL; + freecacheDataCacheNode(&node); - EXPECT_EQ(result, gWebCfgBloBVersion); - } + EXPECT_EQ(node, nullptr); } -/* --------------- Test RRD_data_buff_init() from rrdIarm --------------- */ -TEST(RRDDataBuffInitTest, InitializeDataBuff) +TEST(FreecacheDataCacheNodeTest, HandlesNodeNotNullAndMdataNullAndIssueStringNotNull) { - data_buf sbuf; - message_type_et sndtype = IARM_EVENT_MSG; - deepsleep_event_et deepSleepEvent = RRD_DEEPSLEEP_RDM_DOWNLOAD_PKG_INITIATE; - RRD_data_buff_init(&sbuf, sndtype, deepSleepEvent); + cacheData *node = (cacheData *)malloc(sizeof(cacheData)); + node->mdata = NULL; + node->issueString = strdup("ValidIssueString"); + freecacheDataCacheNode(&node); - EXPECT_EQ(sbuf.mtype, sndtype); - EXPECT_EQ(sbuf.mdata, nullptr); - EXPECT_EQ(sbuf.jsonPath, nullptr); - EXPECT_FALSE(sbuf.inDynamic); - EXPECT_EQ(sbuf.dsEvent, deepSleepEvent); + EXPECT_EQ(node, nullptr); } -/* --------------- Test RRD_data_buff_deAlloc() from rrdIarm --------------- */ -TEST(RRDDataBuffDeAllocTest, DeallocateDataBuff) +/*---------------- Test removeQuotes() from rrdRunCmdThread ---------------*/ +TEST(RemoveQuotesTest, null_string) { - data_buf *sbuf = (data_buf *)malloc(sizeof(data_buf)); - sbuf->mdata = (char *)malloc(10 * sizeof(char)); - sbuf->jsonPath = (char *)malloc(10 * sizeof(char)); - - ASSERT_NO_FATAL_FAILURE(RRD_data_buff_deAlloc(sbuf)); + removeQuotes(nullptr); } -TEST(RRDDataBuffDeAllocTest, NullPointer) +TEST(RemoveQuotesTest, HandlesQuotesAndEscapedQuotes) { - data_buf *sbuf = nullptr; - - ASSERT_NO_FATAL_FAILURE(RRD_data_buff_deAlloc(sbuf)); + char str[] = "\"Hello \\\"World\\\"\""; + removeQuotes(str); + EXPECT_STREQ(str, "Hello \"World\""); } -/* --------------- Test RRD_unsubscribe() from rrdIarm --------------- */ - -class RRDUnsubscribeTest : public ::testing::Test +TEST(RemoveQuotesTest, HandlesSurroundingQuotes) { -protected: - ClientIARMMock mock; - - void SetUp() override - { - setMock(&mock); - } - - void TearDown() override - { - setMock(nullptr); - } -}; + char str[] = "\"Hello World\""; + removeQuotes(str); + EXPECT_STREQ(str, "Hello World"); +} -TEST_F(RRDUnsubscribeTest, TestRRD_Unsubscribe_Success) +TEST(RemoveQuotesTest, HandlesEscapedQuotesWithoutSurroundingQuotes) { - EXPECT_CALL(mock, IARM_Bus_Disconnect()).WillOnce(::testing::Return(IARM_RESULT_SUCCESS)); - EXPECT_CALL(mock, IARM_Bus_Term()).WillOnce(::testing::Return(IARM_RESULT_SUCCESS)); - EXPECT_CALL(mock, IARM_Bus_UnRegisterEventHandler(IARM_BUS_RDK_REMOTE_DEBUGGER_NAME, IARM_BUS_RDK_REMOTE_DEBUGGER_ISSUETYPE)).WillOnce(::testing::Return(IARM_RESULT_SUCCESS)); - EXPECT_CALL(mock, IARM_Bus_UnRegisterEventHandler(IARM_BUS_RDMMGR_NAME, IARM_BUS_RDMMGR_EVENT_APP_INSTALLATION_STATUS)).WillOnce(::testing::Return(IARM_RESULT_SUCCESS)); - EXPECT_CALL(mock, IARM_Bus_UnRegisterEventHandler(IARM_BUS_PWRMGR_NAME, IARM_BUS_PWRMGR_EVENT_MODECHANGED)).WillOnce(::testing::Return(IARM_RESULT_SUCCESS)); - IARM_Result_t result = RRD_unsubscribe(); - - EXPECT_EQ(result, IARM_RESULT_SUCCESS); + char str[] = "Hello \\\"World\\\""; + removeQuotes(str); + EXPECT_STREQ(str, "Hello \"World\""); } -TEST_F(RRDUnsubscribeTest, TestRRD_Unsubscribe_DisconnectFailure) +TEST(RemoveQuotesTest, HandlesStringWithoutQuotes) { - EXPECT_CALL(mock, IARM_Bus_Disconnect()).WillOnce(::testing::Return(IARM_RESULT_FAILURE)); - IARM_Result_t result = RRD_unsubscribe(); - - EXPECT_EQ(result, IARM_RESULT_FAILURE); + char str[] = "Hello World"; + removeQuotes(str); + EXPECT_STREQ(str, "Hello World"); } -TEST_F(RRDUnsubscribeTest, TestRRD_Unsubscribe_TermFailure) +TEST(RemoveQuotesTest, HandlesEmptyString) { - EXPECT_CALL(mock, IARM_Bus_Disconnect()).WillOnce(::testing::Return(IARM_RESULT_SUCCESS)); - EXPECT_CALL(mock, IARM_Bus_Term()).WillOnce(::testing::Return(IARM_RESULT_FAILURE)); - IARM_Result_t result = RRD_unsubscribe(); - - EXPECT_EQ(result, IARM_RESULT_FAILURE); + char str[] = ""; + removeQuotes(str); + EXPECT_STREQ(str, ""); } -TEST_F(RRDUnsubscribeTest, TestRRD_Unsubscribe_UnRegisterEventHandlerFailure) -{ - EXPECT_CALL(mock, IARM_Bus_Disconnect()).WillOnce(::testing::Return(IARM_RESULT_SUCCESS)); - EXPECT_CALL(mock, IARM_Bus_Term()).WillOnce(::testing::Return(IARM_RESULT_SUCCESS)); - EXPECT_CALL(mock, IARM_Bus_UnRegisterEventHandler(::testing::_, ::testing::_)).WillOnce(::testing::Return(IARM_RESULT_FAILURE)); - IARM_Result_t result = RRD_unsubscribe(); +/*----------------- Test copyDebugLogDestFile() from rrdRunCmdThread ------------*/ +TEST(CopyDebugLogDestFileTest, HandlesEmptySource) +{ + FILE *source = std::tmpfile(); + FILE *destination = std::tmpfile(); - EXPECT_EQ(result, IARM_RESULT_FAILURE); -} + ASSERT_NE(source, nullptr); + ASSERT_NE(destination, nullptr); -TEST_F(RRDUnsubscribeTest, TestRRD_Unsubscribe_UnRegisterRDMMgrEventHandlerRRDFailure) -{ - EXPECT_CALL(mock, IARM_Bus_Disconnect()).WillOnce(::testing::Return(IARM_RESULT_SUCCESS)); - EXPECT_CALL(mock, IARM_Bus_Term()).WillOnce(::testing::Return(IARM_RESULT_SUCCESS)); - EXPECT_CALL(mock, IARM_Bus_UnRegisterEventHandler(IARM_BUS_RDK_REMOTE_DEBUGGER_NAME, IARM_BUS_RDK_REMOTE_DEBUGGER_ISSUETYPE)).WillOnce(::testing::Return(IARM_RESULT_SUCCESS)); - EXPECT_CALL(mock, IARM_Bus_UnRegisterEventHandler(IARM_BUS_RDMMGR_NAME, IARM_BUS_RDMMGR_EVENT_APP_INSTALLATION_STATUS)).WillOnce(::testing::Return(IARM_RESULT_FAILURE)); - IARM_Result_t result = RRD_unsubscribe(); + fclose(source); + source = std::tmpfile(); + ASSERT_NE(source, nullptr); - EXPECT_EQ(result, IARM_RESULT_FAILURE); -} + copyDebugLogDestFile(source, destination); -TEST_F(RRDUnsubscribeTest, TestRRD_Unsubscribe_UnRegisterPwrMgrEventHandlerFailure) -{ - EXPECT_CALL(mock, IARM_Bus_Disconnect()).WillOnce(::testing::Return(IARM_RESULT_SUCCESS)); - EXPECT_CALL(mock, IARM_Bus_Term()).WillOnce(::testing::Return(IARM_RESULT_SUCCESS)); - EXPECT_CALL(mock, IARM_Bus_UnRegisterEventHandler(IARM_BUS_RDK_REMOTE_DEBUGGER_NAME, IARM_BUS_RDK_REMOTE_DEBUGGER_ISSUETYPE)).WillOnce(::testing::Return(IARM_RESULT_SUCCESS)); - EXPECT_CALL(mock, IARM_Bus_UnRegisterEventHandler(IARM_BUS_RDMMGR_NAME, IARM_BUS_RDMMGR_EVENT_APP_INSTALLATION_STATUS)).WillOnce(::testing::Return(IARM_RESULT_SUCCESS)); - EXPECT_CALL(mock, IARM_Bus_UnRegisterEventHandler(IARM_BUS_PWRMGR_NAME, IARM_BUS_PWRMGR_EVENT_MODECHANGED)).WillOnce(::testing::Return(IARM_RESULT_FAILURE)); - IARM_Result_t result = RRD_unsubscribe(); + fseek(destination, 0, SEEK_SET); + char buffer[1024] = {0}; + size_t bytesRead = fread(buffer, 1, sizeof(buffer) - 1, destination); - EXPECT_EQ(result, IARM_RESULT_FAILURE); + EXPECT_EQ(bytesRead, 0); + + fclose(source); + fclose(destination); } -/* --------------- Test webconfigFrameworkInit() from rrdIarm --------------- */ -class WebConfigIntegrationTest : public ::testing::Test +TEST(CopyDebugLogDestFileTest, HandlesNullPointers) { -protected: - ClientWebConfigMock mock_webconfig; + FILE *destination = std::tmpfile(); + ASSERT_NE(destination, nullptr); - void SetUp() override - { - setWebConfigMock(&mock_webconfig); - } + copyDebugLogDestFile(nullptr, destination); - void TearDown() override - { - setWebConfigMock(nullptr); - } -}; + fseek(destination, 0, SEEK_SET); + char buffer[1024] = {0}; + size_t bytesRead = fread(buffer, 1, sizeof(buffer) - 1, destination); -TEST_F(WebConfigIntegrationTest, TestWebconfigFrameworkInit) -{ - EXPECT_CALL(mock_webconfig, register_sub_docs_mock(_, _, _, _)).Times(1); - webconfigFrameworkInit(); -} + EXPECT_EQ(bytesRead, 0); -/* --------------- Test RRDMsgDeliver() from rrdIarm --------------- */ -extern int msqid; -extern key_t key; + fclose(destination); -class RRDMsgDeliverTest : public ::testing::Test + FILE *source = std::tmpfile(); + ASSERT_NE(source, nullptr); + copyDebugLogDestFile(source, nullptr); + + fclose(source); +} + +/* --------------- Test findPresentInCache() from rrdRunCmdThread --------------- */ +class FindPresentInCacheTest : public ::testing::Test { protected: - int msqid_cpy; - key_t key_cpy; void SetUp() override { - msqid_cpy = msqid; - key_cpy = key; - msqid = msgget(key, IPC_CREAT | 0666); - - ASSERT_NE(msqid, -1) << "Error creating message queue for testing"; + pthread_mutex_init(&rrdCacheMut, NULL); + cacheDataNode = NULL; } void TearDown() override { - int ret = msgctl(msqid, IPC_RMID, nullptr); - ASSERT_NE(ret, -1) << "Error removing message queue used for testing"; - - msqid = msqid_cpy; - key = key_cpy; + pthread_mutex_destroy(&rrdCacheMut); + while (cacheDataNode != NULL) + { + cacheData *next = cacheDataNode->next; + if (cacheDataNode->mdata != NULL) + { + free(cacheDataNode->mdata); + cacheDataNode->mdata = NULL; + } + if (cacheDataNode->mdata != NULL) + { // NOT_COVERED + free(cacheDataNode->issueString); + cacheDataNode->issueString = NULL; + } + free(cacheDataNode); + cacheDataNode = next; + } } }; -TEST_F(RRDMsgDeliverTest, TestMessageDelivery) +TEST_F(FindPresentInCacheTest, HandlesPkgDataFoundInSecondElement) { - data_buf sbuf; - sbuf.mtype = IARM_EVENT_MSG; - sbuf.mdata = "mdata"; - sbuf.inDynamic = true; - sbuf.dsEvent = RRD_DEEPSLEEP_INVALID_DEFAULT; - RRDMsgDeliver(msqid, &sbuf); - data_buf receivedBuf; - int ret = msgrcv(msqid, &receivedBuf, sizeof(receivedBuf), DEFAULT, 0); + cacheData *firstNode = (cacheData *)malloc(sizeof(cacheData)); + firstNode->mdata = strdup("FirstPkgData"); + firstNode->issueString = strdup("FirstIssueString"); + firstNode->next = NULL; + cacheData *secondNode = (cacheData *)malloc(sizeof(cacheData)); + secondNode->mdata = strdup("SecondPkgData"); + secondNode->issueString = strdup("SecondIssueString"); + secondNode->next = NULL; + firstNode->next = secondNode; + cacheDataNode = firstNode; + cacheData *result = findPresentInCache("SecondPkgData"); - ASSERT_NE(ret, -1) << "Error receiving message from queue"; - ASSERT_EQ(sbuf.mtype, receivedBuf.mtype); - ASSERT_EQ(receivedBuf.inDynamic, true); + EXPECT_EQ(result, secondNode); } -TEST_F(RRDMsgDeliverTest, TestMessageDeliveryFailure) +TEST_F(FindPresentInCacheTest, HandlesPkgDataFoundInFirstElement) { - data_buf sbuf; - sbuf.mtype = IARM_EVENT_MSG; - sbuf.mdata = "mdata"; - sbuf.inDynamic = true; - sbuf.dsEvent = RRD_DEEPSLEEP_INVALID_DEFAULT; + cacheData *node = (cacheData *)malloc(sizeof(cacheData)); + node->mdata = strdup("PkgData"); + node->issueString = strdup("IssueString"); + node->next = NULL; + cacheDataNode = node; + cacheData *result = findPresentInCache("PkgData"); - EXPECT_EXIT(RRDMsgDeliver(-1, &sbuf), ::testing::ExitedWithCode(1), ".*"); + EXPECT_EQ(result, node); } -/* --------------- Test pushIssueTypesToMsgQueue() from rrdIarm --------------- */ -class PushIssueTypesToMsgQueueTest : public ::testing::Test +TEST_F(FindPresentInCacheTest, HandlesRrdCachecnodeNull) { -protected: - int msqid_cpy; - key_t key_cpy; - void SetUp() override - { - msqid_cpy = msqid; - key_cpy = key; - msqid = msgget(key, IPC_CREAT | 0666); - - ASSERT_NE(msqid, -1) << "Error creating message queue for testing"; - } - - void TearDown() override - { - int ret = msgctl(msqid, IPC_RMID, nullptr); - ASSERT_NE(ret, -1) << "Error removing message queue used for testing"; - - msqid = msqid_cpy; - key = key_cpy; - } -}; + cacheData *result = findPresentInCache("PkgData"); + EXPECT_EQ(result, nullptr); +} -TEST_F(PushIssueTypesToMsgQueueTest, TestPushIssueTypesToMsgQueueSuccess) +TEST_F(FindPresentInCacheTest, HandlesPkgDataNotFoundInRrdCachecnode) { - char issueTypeList[] = "mdata"; - pushIssueTypesToMsgQueue(issueTypeList, IARM_EVENT_MSG); - data_buf receivedBuf; - int ret = msgrcv(msqid, &receivedBuf, sizeof(receivedBuf), IARM_EVENT_MSG, 0); + cacheData *node = (cacheData *)malloc(sizeof(cacheData)); + node->mdata = strdup("PkgData"); + node->issueString = strdup("IssueString"); + node->next = NULL; + cacheDataNode = node; + cacheData *result = findPresentInCache("NonExistentPkgData"); - ASSERT_NE(ret, -1) << "Error receiving message from queue"; + EXPECT_EQ(result, nullptr); } -/* --------------- Test _remoteDebuggerEventHandler() from rrdIarm --------------- */ -class RemoteDebuggerEventHandlerTest : public ::testing::Test +/* --------------- Test remove_item() from rrdRunCmdThread --------------- */ +class RemoveItemTest : public ::testing::Test { protected: - string getCurrentTestName() - { - const testing::TestInfo *const test_info = testing::UnitTest::GetInstance()->current_test_info(); - return test_info->name(); - } - int msqid_cpy; - key_t key_cpy; void SetUp() override { - string test_name = getCurrentTestName(); - if (test_name == "TestPushIssueTypesToMsgQueueSuccess") - { - msqid_cpy = msqid; - key_cpy = key; - msqid = msgget(key, IPC_CREAT | 0666); - - ASSERT_NE(msqid, -1) << "Error creating message queue for testing"; - } + pthread_mutex_init(&rrdCacheMut, NULL); + cacheDataNode = NULL; } void TearDown() override { - string test_name = getCurrentTestName(); - if (test_name == "TestPushIssueTypesToMsgQueueSuccess") - { - int ret = msgctl(msqid, IPC_RMID, nullptr); - ASSERT_NE(ret, -1) << "Error removing message queue used for testing"; - - msqid = msqid_cpy; - key = key_cpy; + pthread_mutex_destroy(&rrdCacheMut); + while (cacheDataNode != NULL) + { // NOT_COVERED + cacheData *next = cacheDataNode->next; + if (cacheDataNode->mdata != NULL) + { + free(cacheDataNode->mdata); + cacheDataNode->mdata = NULL; + } + if (cacheDataNode->issueString != NULL) + { + free(cacheDataNode->issueString); + cacheDataNode->issueString = NULL; + } + free(cacheDataNode); + cacheDataNode = next; } } }; -TEST_F(RemoteDebuggerEventHandlerTest, TestPushIssueTypesToMsgQueueSuccess) +TEST_F(RemoveItemTest, HandlesCacheNull) { - const char *owner = IARM_BUS_RDK_REMOTE_DEBUGGER_NAME; - IARM_EventId_t eventId = IARM_BUS_RDK_REMOTE_DEBUGGER_ISSUETYPE; - char data[] = "mdata"; - _remoteDebuggerEventHandler(owner, eventId, data, sizeof(data)); - data_buf receivedBuf; - int ret = msgrcv(msqid, &receivedBuf, sizeof(receivedBuf), IARM_EVENT_MSG, 0); - - ASSERT_NE(ret, -1) << "Error receiving message from queue"; + remove_item(NULL); + EXPECT_EQ(cacheDataNode, nullptr); } -TEST_F(RemoteDebuggerEventHandlerTest, TestInvalidOwnerName) +TEST_F(RemoveItemTest, HandlesCacheNotNullAndCacheEqualsRrdCachecnode) { - const char *owner = "InvalidOwner"; - IARM_EventId_t eventId = IARM_BUS_RDK_REMOTE_DEBUGGER_ISSUETYPE; - char data[] = "Test data"; - _remoteDebuggerEventHandler(owner, eventId, data, sizeof(data)); + cacheData *node = (cacheData *)malloc(sizeof(cacheData)); + node->mdata = strdup("PkgData"); + node->issueString = strdup("IssueString"); + node->next = NULL; + cacheDataNode = node; + remove_item(node); + + EXPECT_EQ(cacheDataNode, nullptr); } -TEST_F(RemoteDebuggerEventHandlerTest, TestInvalidEventId) +TEST_F(RemoveItemTest, HandlesCacheNotNullAndCacheNotEqualsRrdCachecnode) { - const char *owner = IARM_BUS_RDK_REMOTE_DEBUGGER_NAME; - IARM_EventId_t eventId = IARM_BUS_RDK_REMOTE_DEBUGGER_MAX_EVENT; // Invalid event id - char data[] = "Test data"; - _remoteDebuggerEventHandler(owner, eventId, data, sizeof(data)); + cacheData *node = (cacheData *)malloc(sizeof(cacheData)); + node->mdata = strdup("PkgData"); + node->issueString = strdup("IssueString"); + node->next = NULL; + cacheDataNode = node; + cacheData *node_dummy = (cacheData *)malloc(sizeof(cacheData)); + node_dummy->mdata = strdup("PkgData"); + node_dummy->issueString = strdup("IssueString"); + node_dummy->next = NULL; + remove_item(node_dummy); + + EXPECT_NE(cacheDataNode, nullptr); } -/* --------------- Test _remoteDebuggerWebCfgDataEventHandler() from rrdIarm --------------- */ -class RemoteDebuggerWebConfigEventHandlerTest : public ::testing::Test +/* ======================== rrdEventProcess ==============*/ +/* --------------- Test freeParsedJson() from rrdEventProcess --------------- */ +TEST(FreeParsedJsonTest, HandlesValidJson) { -protected: - string getCurrentTestName() - { - const testing::TestInfo *const test_info = testing::UnitTest::GetInstance()->current_test_info(); - return test_info->name(); - } - int msqid_cpy; - key_t key_cpy; - void SetUp() override - { - string test_name = getCurrentTestName(); - if (test_name == "TestPushIssueTypesToMsgQueueSuccess") - { - msqid_cpy = msqid; - key_cpy = key; - msqid = msgget(key, IPC_CREAT | 0666); + cJSON *json = cJSON_CreateObject(); + cJSON_AddStringToObject(json, "key", "value"); + freeParsedJson(json); +} - ASSERT_NE(msqid, -1) << "Error creating message queue for testing"; - } - } - void TearDown() override - { - string test_name = getCurrentTestName(); - if (test_name == "TestPushIssueTypesToMsgQueueSuccess") - { - int ret = msgctl(msqid, IPC_RMID, nullptr); - ASSERT_NE(ret, -1) << "Error removing message queue used for testing"; +TEST(FreeParsedJsonTest, HandlesNullJson) +{ + freeParsedJson(NULL); +} - msqid = msqid_cpy; - key = key_cpy; - } - } -}; +/* --------------- Test removeSpecialCharacterfromIssueTypeList() from rrdEventProcess --------------- */ -TEST_F(RemoteDebuggerWebConfigEventHandlerTest, TestInvalidOwnerName) +TEST(RemoveSpecialCharacterfromIssueTypeListTest, HandlesEmptyString) { - const char *owner = "InvalidOwner"; - IARM_EventId_t eventId = IARM_BUS_RDK_REMOTE_DEBUGGER_ISSUETYPE; - char data[] = "Test data"; - _remoteDebuggerWebCfgDataEventHandler(owner, eventId, data, sizeof(data)); + char str[] = ""; + removeSpecialCharacterfromIssueTypeList(str); + + EXPECT_STREQ(str, ""); } -TEST_F(RemoteDebuggerWebConfigEventHandlerTest, TestInvalidEventId) +TEST(RemoveSpecialCharacterfromIssueTypeListTest, HandlesStringWithCommaAndDot) { - const char *owner = IARM_BUS_RDK_REMOTE_DEBUGGER_NAME; - IARM_EventId_t eventId = IARM_BUS_RDK_REMOTE_DEBUGGER_MAX_EVENT; - char data[] = "Test data"; - _remoteDebuggerWebCfgDataEventHandler(owner, eventId, data, sizeof(data)); + char str[] = "a,b.c"; + removeSpecialCharacterfromIssueTypeList(str); + + EXPECT_STREQ(str, "a,b.c"); } -TEST_F(RemoteDebuggerWebConfigEventHandlerTest, TestPushIssueTypesToMsgQueueSuccess) +TEST(RemoveSpecialCharacterfromIssueTypeListTest, HandlesStringWithoutCommaAndDot) { - const char *owner = IARM_BUS_RDK_REMOTE_DEBUGGER_NAME; - IARM_EventId_t eventId = IARM_BUS_RDK_REMOTE_DEBUGGER_WEBCFGDATA; - char data[] = "mdata"; - _remoteDebuggerWebCfgDataEventHandler(owner, eventId, data, sizeof(data)); - data_buf receivedBuf; - int ret = msgrcv(msqid, &receivedBuf, sizeof(receivedBuf), IARM_EVENT_MSG, 0); + char str[] = "abc"; + removeSpecialCharacterfromIssueTypeList(str); - ASSERT_NE(ret, -1) << "Error receiving message from queue"; + EXPECT_STREQ(str, "abc"); } -/* --------------- Test _rdmManagerEventHandler() from rrdIarm --------------- */ -class RDMMgrEventHandlerTest : public ::testing::Test +TEST(RemoveSpecialCharacterfromIssueTypeListTest, HandlesStringWithConsecutiveSpecialCharacters) { -protected: - string getCurrentTestName() + char str[] = "a^&b"; + char str1[] = "^x"; + removeSpecialCharacterfromIssueTypeList(str); + removeSpecialCharacterfromIssueTypeList(str1); + + EXPECT_STREQ(str, "ab"); + EXPECT_STREQ(str1, "x"); +} + +/* --------------- Test issueTypeSplitter() from rrdEventProcess --------------- */ +TEST(IssueTypeSplitterTest, HandlesStringWithSpecialCharacters) +{ + char str[] = "a@,b,&,cd,ef"; + char **args = NULL; + int count = issueTypeSplitter(str, ',', &args); + + ASSERT_EQ(count, 4); + ASSERT_STREQ(args[0], "a"); + ASSERT_STREQ(args[1], "b"); + ASSERT_STREQ(args[2], "cd"); + ASSERT_STREQ(args[3], "ef"); + + for (int i = 0; i < count; i++) { - const testing::TestInfo *const test_info = testing::UnitTest::GetInstance()->current_test_info(); - return test_info->name(); + free(args[i]); } - int msqid_cpy; - key_t key_cpy; - void SetUp() override + free(args); +} + +TEST(IssueTypeSplitterTest, HandlesStringWithNoSpecialCharacters) +{ + char str[] = "abcd"; + char **args = NULL; + int count = issueTypeSplitter(str, ',', &args); + + ASSERT_EQ(count, 1); + ASSERT_STREQ(args[0], "abcd"); + + for (int i = 0; i < count; i++) { - string test_name = getCurrentTestName(); - if (test_name == "TestFoundInCacheDownloadIsCompleteAndDEEPSLEEPIssue" || test_name == "TestFoundInCacheDownloadIsCompleteAndNotDEEPSLEEPIssue") - { - msqid_cpy = msqid; - key_cpy = key; - msqid = msgget(key, IPC_CREAT | 0666); + free(args[i]); + } + free(args); +} - ASSERT_NE(msqid, -1) << "Error creating message queue for testing"; - } +TEST(IssueTypeSplitterTest, HandlesEmptyString) +{ + char str[] = ""; + char **args = NULL; + int count = issueTypeSplitter(str, ',', &args); + + ASSERT_EQ(count, 1); + + free(args); +} + +/* --------------- Test processIssueTypeInDynamicProfile() from rrdEventProcess --------------- */ +class ProcessIssueTypeInDynamicProfileTest : public ::testing::Test +{ +protected: + issueNodeData issuestructNode; + data_buf buff; + + void SetUp() override + { + issuestructNode.Node = strdup("testNode"); + issuestructNode.subNode = strdup("testSubNode"); + buff.mdata = strdup("testData"); } + void TearDown() override { - string test_name = getCurrentTestName(); - if (test_name == "TestFoundInCacheDownloadIsCompleteDEEPSLEEPIssue" || test_name == "TestFoundInCacheDownloadIsCompleteAndNotDEEPSLEEPIssue") - { - int ret = msgctl(msqid, IPC_RMID, nullptr); - ASSERT_NE(ret, -1) << "Error removing message queue used for testing"; - - msqid = msqid_cpy; - key = key_cpy; - } + free(issuestructNode.Node); + free(issuestructNode.subNode); } }; -TEST_F(RDMMgrEventHandlerTest, TestInvalidOwnerName) +TEST_F(ProcessIssueTypeInDynamicProfileTest, JsonPathIsNull) { - const char *owner = "InvalidOwner"; - IARM_EventId_t eventId = IARM_BUS_RDK_REMOTE_DEBUGGER_ISSUETYPE; - char data[] = "Test data"; - _rdmManagerEventHandler(owner, eventId, data, sizeof(data)); -} + buff.jsonPath = NULL; + char *mdata_before = strdup(buff.mdata); + processIssueTypeInDynamicProfile(&buff, &issuestructNode); -TEST_F(RDMMgrEventHandlerTest, TestInvalidEventId) -{ - const char *owner = IARM_BUS_RDMMGR_NAME; - IARM_EventId_t eventId = IARM_BUS_RDK_REMOTE_DEBUGGER_MAX_EVENT; // Invalid event id - char data[] = "Test data"; - _rdmManagerEventHandler(owner, eventId, data, sizeof(data)); -} + ASSERT_EQ(buff.mdata, nullptr); -TEST_F(RDMMgrEventHandlerTest, TestNotFoundInCache) -{ - const char *owner = IARM_BUS_RDMMGR_NAME; - IARM_EventId_t eventId = IARM_BUS_RDMMGR_EVENT_APP_INSTALLATION_STATUS; - IARM_Bus_RDMMgr_EventData_t eventData; - strncpy(eventData.rdm_pkg_info.pkg_name, "Test package", RDM_PKG_NAME_MAX_SIZE); - strncpy(eventData.rdm_pkg_info.pkg_version, "1.0.0", RDM_PKG_VERSION_MAX_SIZE); - strncpy(eventData.rdm_pkg_info.pkg_inst_path, "/path/to/package", RDM_PKG_INST_PATH_MAX_SIZE); - _rdmManagerEventHandler(owner, eventId, &eventData, sizeof(eventData)); + free(mdata_before); } -TEST_F(RDMMgrEventHandlerTest, TestFoundInCacheDownloadNotComplete) +TEST_F(ProcessIssueTypeInDynamicProfileTest, JsonPathIsNotNull_ReadAndParseJSONReturnsNull) { - const char *owner = IARM_BUS_RDMMGR_NAME; - IARM_EventId_t eventId = IARM_BUS_RDMMGR_EVENT_APP_INSTALLATION_STATUS; - cacheData *node = (cacheData *)malloc(sizeof(cacheData)); - node->mdata = strdup("PkgData"); - node->issueString = strdup("IssueString"); - node->next = NULL; - cacheDataNode = node; - IARM_Bus_RDMMgr_EventData_t eventData; - strncpy(eventData.rdm_pkg_info.pkg_name, "PkgData", RDM_PKG_NAME_MAX_SIZE); - strncpy(eventData.rdm_pkg_info.pkg_version, "1.0.0", RDM_PKG_VERSION_MAX_SIZE); - strncpy(eventData.rdm_pkg_info.pkg_inst_path, "/path/to/package", RDM_PKG_INST_PATH_MAX_SIZE); - eventData.rdm_pkg_info.pkg_inst_status = RDM_PKG_INSTALL_ERROR; - _rdmManagerEventHandler(owner, eventId, &eventData, sizeof(eventData)); + buff.jsonPath = strdup("UTJson/invalidJson.json"); + char *mdata_before = strdup(buff.mdata); + char *jsonPath_before = strdup(buff.jsonPath); + processIssueTypeInDynamicProfile(&buff, &issuestructNode); + + ASSERT_EQ(buff.mdata, nullptr); + ASSERT_EQ(buff.jsonPath, nullptr); + + free(mdata_before); + free(jsonPath_before); } -TEST_F(RDMMgrEventHandlerTest, TestFoundInCacheDownloadIsCompleteAndDEEPSLEEPIssue) +TEST_F(ProcessIssueTypeInDynamicProfileTest, JsonPathIsNotNull_ReadAndParseJSONReturnsNotNull_FindIssueInParsedJSONReturnsFalse) { - const char *owner = IARM_BUS_RDMMGR_NAME; - IARM_EventId_t eventId = IARM_BUS_RDMMGR_EVENT_APP_INSTALLATION_STATUS; - cacheData *node = (cacheData *)malloc(sizeof(cacheData)); - node->mdata = strdup("PkgData"); - node->issueString = strdup("DEEPSLEEP"); - node->next = NULL; - cacheDataNode = node; - IARM_Bus_RDMMgr_EventData_t eventData; - strncpy(eventData.rdm_pkg_info.pkg_name, "PkgData", RDM_PKG_NAME_MAX_SIZE); - strncpy(eventData.rdm_pkg_info.pkg_version, "1.0.0", RDM_PKG_VERSION_MAX_SIZE); - strncpy(eventData.rdm_pkg_info.pkg_inst_path, "/path/to/package", RDM_PKG_INST_PATH_MAX_SIZE); - eventData.rdm_pkg_info.pkg_inst_status = RDM_PKG_INSTALL_COMPLETE; - _rdmManagerEventHandler(owner, eventId, &eventData, sizeof(eventData)); + buff.jsonPath = strdup("UTJson/validJson.json"); + char *mdata_before = strdup(buff.mdata); + char *jsonPath_before = strdup(buff.jsonPath); + processIssueTypeInDynamicProfile(&buff, &issuestructNode); + + ASSERT_EQ(buff.mdata, nullptr); + ASSERT_EQ(buff.jsonPath, nullptr); + + free(mdata_before); + free(jsonPath_before); } -TEST_F(RDMMgrEventHandlerTest, TestFoundInCacheDownloadIsCompleteAndNotDEEPSLEEPIssue) +/* --------------- Test processWebCfgTypeEvent() from rrdEventProcess --------------- */ +TEST(ProcessWebCfgTypeEvntTest, RBufIsNull){ + data_buf *rbuf = nullptr; + processWebCfgTypeEvent(rbuf); +} + +TEST(ProcessWebCfgTypeEvntTest, RBufDataIsNull){ + data_buf rbuf; + rbuf.mdata = nullptr; + rbuf.jsonPath = strdup("sample-path"); + processWebCfgTypeEvent(&rbuf); + + free(rbuf.jsonPath); +} + +/* --------------- Test processIssueTypeEvent() from rrdEventProcess --------------- */ +TEST(ProcessIssueTypeEvntTest, RBufIsNull){ + data_buf *rbuf = nullptr; + processIssueTypeEvent(rbuf); +} + +TEST(ProcessIssueTypeEvntTest, inDynamic_NoJson){ + data_buf rbuf; + rbuf.mdata = strdup("a"); + rbuf.inDynamic = true; + rbuf.jsonPath = nullptr; + processIssueTypeEvent(&rbuf); +} + +/* ======================== rrdExecuteScript ==============*/ + +/* --------------- Test processIssueTypeInInstalledPackage() from rrdExecuteScript --------------- */ +TEST(ProcessIssueTypeInInstalledPackageTest, WhenReadAndParseJSONReturnsNull) { - const char *owner = IARM_BUS_RDMMGR_NAME; - IARM_EventId_t eventId = IARM_BUS_RDMMGR_EVENT_APP_INSTALLATION_STATUS; - cacheData *node = (cacheData *)malloc(sizeof(cacheData)); - node->mdata = strdup("PkgData"); - node->issueString = strdup("NotDeepSleepIssue"); - node->next = NULL; - cacheDataNode = node; - IARM_Bus_RDMMgr_EventData_t eventData; - strncpy(eventData.rdm_pkg_info.pkg_name, "PkgData", RDM_PKG_NAME_MAX_SIZE); - strncpy(eventData.rdm_pkg_info.pkg_version, "1.0.0", RDM_PKG_VERSION_MAX_SIZE); - strncpy(eventData.rdm_pkg_info.pkg_inst_path, "/path/to/package", RDM_PKG_INST_PATH_MAX_SIZE); - eventData.rdm_pkg_info.pkg_inst_status = RDM_PKG_INSTALL_COMPLETE; - _rdmManagerEventHandler(owner, eventId, &eventData, sizeof(eventData)); + data_buf rbuf; + issueNodeData *issuestructNode = NULL; + rbuf.jsonPath = strdup("UTJson/emptyJson.json"); + processIssueTypeInInstalledPackage(&rbuf, issuestructNode); + + free(rbuf.jsonPath); } -/* --------------- Test _pwrManagerEventHandler() from rrdIarm --------------- */ -class PwrMgrEventHandlerTest : public ::testing::Test +#ifdef IARMBUS_SUPPORT +TEST(ProcessIssueTypeInInstalledPackageTest, WhenReadAndParseJSONReturnsNonNull) +{ + data_buf rbuf; + issueNodeData issuestructNode; + issuestructNode.Node = strdup("sample"); + issuestructNode.subNode = NULL; + rbuf.jsonPath = strdup("UTJson/validJson.json"); + + MockSetParam mock_set_param; + SetParamWrapper::setImpl(&mock_set_param); + EXPECT_CALL(mock_set_param, setParam(_, _, _)) + .WillOnce(Return(tr181Failure)); + processIssueTypeInInstalledPackage(&rbuf, &issuestructNode); + + free(rbuf.jsonPath); +} + +/* --------------- Test processIssueTypeInStaticProfile() from rrdExecuteScript --------------- */ +class ProcessIssueTypeInStaticProfileTest : public ::testing::Test { protected: - MockRBusApi mock_rbus_api; - string getCurrentTestName() - { - const testing::TestInfo *const test_info = testing::UnitTest::GetInstance()->current_test_info(); - return test_info->name(); - } void SetUp() override { - string test_name = getCurrentTestName(); - if (test_name == "TestCurrentStateDeepSleepRBusOpenFail" || test_name == "TestCurrentStateDeepSleepRBusOpenSuccessRbusSetFail" || test_name == "TestCurrentStateDeepSleepRBusOpenSuccessRbusSetSuccess") - { - RBusApiWrapper::setImpl(&mock_rbus_api); - } + SetParamWrapper::clearImpl(); } void TearDown() override { - string test_name = getCurrentTestName(); - if (test_name == "TestCurrentStateDeepSleepRBusOpenFail" || test_name == "TestCurrentStateDeepSleepRBusOpenSuccessRbusSetFail" || test_name == "TestCurrentStateDeepSleepRBusOpenSuccessRbusSetSuccess") - { - RBusApiWrapper::clearImpl(); - } + SetParamWrapper::clearImpl(); } }; -TEST_F(PwrMgrEventHandlerTest, TestInvalidOwnerName) +TEST_F(ProcessIssueTypeInStaticProfileTest, StatusProcessWhenReadAndParseJSONReturnsNull) { - const char *owner = "InvalidOwner"; - IARM_EventId_t eventId = IARM_BUS_RDK_REMOTE_DEBUGGER_ISSUETYPE; - char data[] = "Test data"; - _pwrManagerEventHandler(owner, eventId, data, sizeof(data)); -} -TEST_F(PwrMgrEventHandlerTest, TestCurrentStateNotDeepSleep) -{ - const char *owner = IARM_BUS_PWRMGR_NAME; - IARM_EventId_t eventId = IARM_BUS_RDK_REMOTE_DEBUGGER_ISSUETYPE; - IARM_Bus_PWRMgr_EventData_t eventData; - eventData.data.state.curState = IARM_BUS_PWRMGR_POWERSTATE_ON; - eventData.data.state.newState = IARM_BUS_PWRMGR_POWERSTATE_STANDBY_DEEP_SLEEP; - _pwrManagerEventHandler(owner, eventId, &eventData, sizeof(eventData)); + data_buf rbuf; + + issueNodeData issuestructNode; + issuestructNode.Node = strdup("key"); + issuestructNode.subNode = strdup("notValue"); + rbuf.jsonPath = strdup("UTJson/validJson2.json"); + + MockSetParam mock_set_param; + SetParamWrapper::setImpl(&mock_set_param); + EXPECT_CALL(mock_set_param, setParam(_, _, _)) + .WillOnce(Return(tr181Failure)); + processIssueTypeInStaticProfile(&rbuf, &issuestructNode); + + free(rbuf.jsonPath); } +#endif -TEST_F(PwrMgrEventHandlerTest, TestCurrentStateDeepSleepRBusOpenFail) +/* --------------- Test processIssueType() from rrdExecuteScript --------------- */ +TEST(processIssueTypeTest, mdataIsNull) { - const char *owner = IARM_BUS_PWRMGR_NAME; - IARM_EventId_t eventId = IARM_BUS_RDK_REMOTE_DEBUGGER_ISSUETYPE; - IARM_Bus_PWRMgr_EventData_t eventData; - eventData.data.state.curState = IARM_BUS_PWRMGR_POWERSTATE_STANDBY_DEEP_SLEEP; - eventData.data.state.newState = IARM_BUS_PWRMGR_POWERSTATE_ON; - EXPECT_CALL(mock_rbus_api, rbus_open(_, _)).WillOnce(Return(RBUS_ERROR_BUS_ERROR)); - _pwrManagerEventHandler(owner, eventId, &eventData, sizeof(eventData)); + data_buf rbuf; + rbuf.mdata = NULL; + processIssueType(&rbuf); } -TEST_F(PwrMgrEventHandlerTest, TestCurrentStateDeepSleepRBusOpenSuccessRbusSetFail) +TEST(processIssueTypeTest, dynamicPath) { - const char *owner = IARM_BUS_PWRMGR_NAME; - IARM_EventId_t eventId = IARM_BUS_RDK_REMOTE_DEBUGGER_ISSUETYPE; - IARM_Bus_PWRMgr_EventData_t eventData; - eventData.data.state.curState = IARM_BUS_PWRMGR_POWERSTATE_STANDBY_DEEP_SLEEP; - eventData.data.state.newState = IARM_BUS_PWRMGR_POWERSTATE_ON; - - EXPECT_CALL(mock_rbus_api, rbus_open(_, _)).WillOnce(Return(RBUS_ERROR_SUCCESS)); - EXPECT_CALL(mock_rbus_api, rbusValue_Init(_)).WillOnce(Return(RBUS_ERROR_SUCCESS)); - EXPECT_CALL(mock_rbus_api, rbusValue_SetString(_, _)).WillOnce(Return(RBUS_ERROR_SUCCESS)); - EXPECT_CALL(mock_rbus_api, rbus_set(_, _, _, _)).WillOnce(Return(RBUS_ERROR_BUS_ERROR)); - _pwrManagerEventHandler(owner, eventId, &eventData, sizeof(eventData)); + data_buf rbuf; + issueNodeData issuestructNode; + rbuf.mdata = strdup("IssueNode"); + rbuf.inDynamic = true; + rbuf.jsonPath = NULL; + processIssueType(&rbuf); } -TEST_F(PwrMgrEventHandlerTest, TestCurrentStateDeepSleepRBusOpenSuccessRbusSetSuccess) -{ - const char *owner = IARM_BUS_PWRMGR_NAME; - IARM_EventId_t eventId = IARM_BUS_RDK_REMOTE_DEBUGGER_ISSUETYPE; - IARM_Bus_PWRMgr_EventData_t eventData; - eventData.data.state.curState = IARM_BUS_PWRMGR_POWERSTATE_STANDBY_DEEP_SLEEP; - eventData.data.state.newState = IARM_BUS_PWRMGR_POWERSTATE_ON; - EXPECT_CALL(mock_rbus_api, rbus_open(_, _)).WillOnce(Return(RBUS_ERROR_SUCCESS)); - EXPECT_CALL(mock_rbus_api, rbusValue_Init(_)).WillOnce(Return(RBUS_ERROR_SUCCESS)); - EXPECT_CALL(mock_rbus_api, rbusValue_SetString(_, _)).WillOnce(Return(RBUS_ERROR_SUCCESS)); - EXPECT_CALL(mock_rbus_api, rbus_set(_, _, _, _)).WillOnce(Return(RBUS_ERROR_SUCCESS)); - _pwrManagerEventHandler(owner, eventId, &eventData, sizeof(eventData)); -} +/* --------------- Test RRDMsgDeliver() from rrdIarm --------------- */ +extern int msqid; +extern key_t key; -/* --------------- Test RRD_subscribe() from rrdIarm --------------- */ -class RRDSubscribeTest : public ::testing::Test +class RRDMsgDeliverTest : public ::testing::Test { protected: - ClientIARMMock mock; - ClientWebConfigMock mock_webconfig; - + int msqid_cpy; + key_t key_cpy; void SetUp() override { - setMock(&mock); - setWebConfigMock(&mock_webconfig); + msqid_cpy = msqid; + key_cpy = key; + msqid = msgget(key, IPC_CREAT | 0666); + + ASSERT_NE(msqid, -1) << "Error creating message queue for testing"; } void TearDown() override { - setMock(nullptr); - setWebConfigMock(nullptr); + int ret = msgctl(msqid, IPC_RMID, nullptr); + ASSERT_NE(ret, -1) << "Error removing message queue used for testing"; + + msqid = msqid_cpy; + key = key_cpy; } }; -TEST_F(RRDSubscribeTest, TestRRD_Subscribe_AllSuccess) -{ - EXPECT_CALL(mock, IARM_Bus_Init(IARM_BUS_RDK_REMOTE_DEBUGGER_NAME)).WillOnce(::testing::Return(IARM_RESULT_SUCCESS)); - EXPECT_CALL(mock, IARM_Bus_Connect()).WillOnce(::testing::Return(IARM_RESULT_SUCCESS)); - EXPECT_CALL(mock, IARM_Bus_RegisterEventHandler(IARM_BUS_RDK_REMOTE_DEBUGGER_NAME, IARM_BUS_RDK_REMOTE_DEBUGGER_ISSUETYPE, ::testing::_)).WillOnce(::testing::Return(IARM_RESULT_SUCCESS)); - EXPECT_CALL(mock, IARM_Bus_RegisterEventHandler(IARM_BUS_RDK_REMOTE_DEBUGGER_NAME, IARM_BUS_RDK_REMOTE_DEBUGGER_WEBCFGDATA, ::testing::_)).WillOnce(::testing::Return(IARM_RESULT_SUCCESS)); - EXPECT_CALL(mock, IARM_Bus_RegisterEventHandler(IARM_BUS_RDMMGR_NAME, IARM_BUS_RDMMGR_EVENT_APP_INSTALLATION_STATUS, ::testing::_)).WillOnce(::testing::Return(IARM_RESULT_SUCCESS)); - EXPECT_CALL(mock, IARM_Bus_RegisterEventHandler(IARM_BUS_PWRMGR_NAME, IARM_BUS_PWRMGR_EVENT_MODECHANGED, ::testing::_)).WillOnce(::testing::Return(IARM_RESULT_SUCCESS)); - EXPECT_CALL(mock_webconfig, register_sub_docs_mock(_, _, _, _)).Times(1); - IARM_Result_t result = RRD_subscribe(); - - EXPECT_EQ(result, IARM_RESULT_SUCCESS); -} - -TEST_F(RRDSubscribeTest, TestRRD_Subscribe_InitFail) +TEST_F(RRDMsgDeliverTest, TestMessageDelivery) { - EXPECT_CALL(mock, IARM_Bus_Init(IARM_BUS_RDK_REMOTE_DEBUGGER_NAME)).WillOnce(::testing::Return(IARM_RESULT_FAILURE)); - IARM_Result_t result = RRD_subscribe(); + data_buf sbuf; + sbuf.mtype = EVENT_MSG; + sbuf.mdata = "mdata"; + sbuf.inDynamic = true; + sbuf.dsEvent = RRD_DEEPSLEEP_INVALID_DEFAULT; + RRDMsgDeliver(msqid, &sbuf); + data_buf receivedBuf; + int ret = msgrcv(msqid, &receivedBuf, sizeof(receivedBuf), DEFAULT, 0); - EXPECT_NE(result, IARM_RESULT_SUCCESS); + ASSERT_NE(ret, -1) << "Error receiving message from queue"; + ASSERT_EQ(sbuf.mtype, receivedBuf.mtype); } -TEST_F(RRDSubscribeTest, TestRRD_Subscribe_ConnectFail) +TEST_F(RRDMsgDeliverTest, TestMessageDeliveryFailure) { - EXPECT_CALL(mock, IARM_Bus_Init(IARM_BUS_RDK_REMOTE_DEBUGGER_NAME)).WillOnce(::testing::Return(IARM_RESULT_SUCCESS)); - EXPECT_CALL(mock, IARM_Bus_Connect()).WillOnce(::testing::Return(IARM_RESULT_FAILURE)); - IARM_Result_t result = RRD_subscribe(); + data_buf sbuf; + sbuf.mtype = EVENT_MSG; + sbuf.mdata = "mdata"; + sbuf.inDynamic = true; + sbuf.dsEvent = RRD_DEEPSLEEP_INVALID_DEFAULT; - EXPECT_NE(result, IARM_RESULT_SUCCESS); + EXPECT_EXIT(RRDMsgDeliver(-1, &sbuf), ::testing::ExitedWithCode(1), ".*"); } -TEST_F(RRDSubscribeTest, TestRRD_Subscribe_RRDHandlerFail) +/* --------------- Test pushIssueTypesToMsgQueue() from rrdIarm --------------- */ +class PushIssueTypesToMsgQueueTest : public ::testing::Test { - EXPECT_CALL(mock, IARM_Bus_Init(IARM_BUS_RDK_REMOTE_DEBUGGER_NAME)).WillOnce(::testing::Return(IARM_RESULT_SUCCESS)); - EXPECT_CALL(mock, IARM_Bus_Connect()).WillOnce(::testing::Return(IARM_RESULT_SUCCESS)); - EXPECT_CALL(mock, IARM_Bus_RegisterEventHandler(IARM_BUS_RDK_REMOTE_DEBUGGER_NAME, IARM_BUS_RDK_REMOTE_DEBUGGER_ISSUETYPE, ::testing::_)).WillOnce(::testing::Return(IARM_RESULT_FAILURE)); - IARM_Result_t result = RRD_subscribe(); +protected: + int msqid_cpy; + key_t key_cpy; + void SetUp() override + { + msqid_cpy = msqid; + key_cpy = key; + msqid = msgget(key, IPC_CREAT | 0666); - EXPECT_NE(result, IARM_RESULT_SUCCESS); -} + ASSERT_NE(msqid, -1) << "Error creating message queue for testing"; + } -TEST_F(RRDSubscribeTest, TestRRD_Subscribe_RRDWebCfgHandlerFail) -{ - EXPECT_CALL(mock, IARM_Bus_Init(IARM_BUS_RDK_REMOTE_DEBUGGER_NAME)).WillOnce(::testing::Return(IARM_RESULT_SUCCESS)); - EXPECT_CALL(mock, IARM_Bus_Connect()).WillOnce(::testing::Return(IARM_RESULT_SUCCESS)); - EXPECT_CALL(mock, IARM_Bus_RegisterEventHandler(IARM_BUS_RDK_REMOTE_DEBUGGER_NAME, IARM_BUS_RDK_REMOTE_DEBUGGER_ISSUETYPE, ::testing::_)).WillOnce(::testing::Return(IARM_RESULT_SUCCESS)); - EXPECT_CALL(mock, IARM_Bus_RegisterEventHandler(IARM_BUS_RDK_REMOTE_DEBUGGER_NAME, IARM_BUS_RDK_REMOTE_DEBUGGER_WEBCFGDATA, ::testing::_)).WillOnce(::testing::Return(IARM_RESULT_FAILURE)); - IARM_Result_t result = RRD_subscribe(); + void TearDown() override + { + int ret = msgctl(msqid, IPC_RMID, nullptr); + ASSERT_NE(ret, -1) << "Error removing message queue used for testing"; - EXPECT_NE(result, IARM_RESULT_SUCCESS); -} + msqid = msqid_cpy; + key = key_cpy; + } +}; -TEST_F(RRDSubscribeTest, TestRRD_Subscribe_RDMMgrHandlerFail) +TEST_F(PushIssueTypesToMsgQueueTest, TestPushIssueTypesToMsgQueueSuccess) { - EXPECT_CALL(mock, IARM_Bus_Init(IARM_BUS_RDK_REMOTE_DEBUGGER_NAME)).WillOnce(::testing::Return(IARM_RESULT_SUCCESS)); - EXPECT_CALL(mock, IARM_Bus_Connect()).WillOnce(::testing::Return(IARM_RESULT_SUCCESS)); - EXPECT_CALL(mock, IARM_Bus_RegisterEventHandler(IARM_BUS_RDK_REMOTE_DEBUGGER_NAME, IARM_BUS_RDK_REMOTE_DEBUGGER_ISSUETYPE, ::testing::_)).WillOnce(::testing::Return(IARM_RESULT_SUCCESS)); - EXPECT_CALL(mock, IARM_Bus_RegisterEventHandler(IARM_BUS_RDK_REMOTE_DEBUGGER_NAME, IARM_BUS_RDK_REMOTE_DEBUGGER_WEBCFGDATA, ::testing::_)).WillOnce(::testing::Return(IARM_RESULT_SUCCESS)); - EXPECT_CALL(mock, IARM_Bus_RegisterEventHandler(IARM_BUS_RDMMGR_NAME, IARM_BUS_RDMMGR_EVENT_APP_INSTALLATION_STATUS, ::testing::_)).WillOnce(::testing::Return(IARM_RESULT_FAILURE)); - IARM_Result_t result = RRD_subscribe(); + char issueTypeList[] = "mdata"; + pushIssueTypesToMsgQueue(issueTypeList, EVENT_MSG); + data_buf receivedBuf; + int ret = msgrcv(msqid, &receivedBuf, sizeof(receivedBuf), EVENT_MSG, 0); - EXPECT_NE(result, IARM_RESULT_SUCCESS); + ASSERT_NE(ret, -1) << "Error receiving message from queue"; } -TEST_F(RRDSubscribeTest, TestRRD_Subscribe_PwrMgrHandlerFail) +#ifdef IARMBUS_SUPPORT +/* ====================== rrdIarm ================*/ +/* --------------- Test getBlobVersion() from rrdIarm --------------- */ +extern uint32_t gWebCfgBloBVersion; +namespace { - EXPECT_CALL(mock, IARM_Bus_Init(IARM_BUS_RDK_REMOTE_DEBUGGER_NAME)).WillOnce(::testing::Return(IARM_RESULT_SUCCESS)); - EXPECT_CALL(mock, IARM_Bus_Connect()).WillOnce(::testing::Return(IARM_RESULT_SUCCESS)); - EXPECT_CALL(mock, IARM_Bus_RegisterEventHandler(IARM_BUS_RDK_REMOTE_DEBUGGER_NAME, IARM_BUS_RDK_REMOTE_DEBUGGER_ISSUETYPE, ::testing::_)).WillOnce(::testing::Return(IARM_RESULT_SUCCESS)); - EXPECT_CALL(mock, IARM_Bus_RegisterEventHandler(IARM_BUS_RDK_REMOTE_DEBUGGER_NAME, IARM_BUS_RDK_REMOTE_DEBUGGER_WEBCFGDATA, ::testing::_)).WillOnce(::testing::Return(IARM_RESULT_SUCCESS)); - EXPECT_CALL(mock, IARM_Bus_RegisterEventHandler(IARM_BUS_RDMMGR_NAME, IARM_BUS_RDMMGR_EVENT_APP_INSTALLATION_STATUS, ::testing::_)).WillOnce(::testing::Return(IARM_RESULT_SUCCESS)); - EXPECT_CALL(mock, IARM_Bus_RegisterEventHandler(IARM_BUS_PWRMGR_NAME, IARM_BUS_PWRMGR_EVENT_MODECHANGED, ::testing::_)).WillOnce(::testing::Return(IARM_RESULT_FAILURE)); - IARM_Result_t result = RRD_subscribe(); + TEST(SetBlobVersionTest, SetsGlobalVariable) + { + char subdoc[] = "test_subdoc"; + uint32_t version = 5; + int result = setBlobVersion(subdoc, version); - EXPECT_NE(result, IARM_RESULT_SUCCESS); -} -#endif + EXPECT_EQ(result, 0); + EXPECT_EQ(gWebCfgBloBVersion, version); + } + TEST(GetBlobVersionTest, ReturnsGlobalVariable) + { + char subdoc[] = "test_subdoc"; + uint32_t result = getBlobVersion(subdoc); -/* ====================== rrdMsgPackDecoder ================*/ -/* --------------- Test rollback_Debugger() from rrdMsgPackDecoder --------------- */ -TEST(TestDebuggerRollback, ValidReturn) -{ - int ret = rollback_Debugger(); - EXPECT_EQ(ret, 0); + EXPECT_EQ(result, gWebCfgBloBVersion); + } } -/* --------------- Test remotedebuggerdoc_destroy() from rrdMsgPackDecoder --------------- */ -TEST(TestRRDDocDestroy, DocIsNULL) +/* --------------- Test RRD_data_buff_init() from rrdIarm --------------- */ +TEST(RRDDataBuffInitTest, InitializeDataBuff) { - remotedebuggerdoc_t *ld = NULL; - remotedebuggerdoc_destroy(ld); -} + data_buf sbuf; + message_type_et sndtype = IARM_EVENT_MSG; + deepsleep_event_et deepSleepEvent = RRD_DEEPSLEEP_RDM_DOWNLOAD_PKG_INITIATE; + RRD_data_buff_init(&sbuf, sndtype, deepSleepEvent); -TEST(TestRRDDocDestroy, DocNotNullParamNotNullCommandListNull) -{ - remotedebuggerdoc_t *ld = (remotedebuggerdoc_t *)malloc(sizeof(remotedebuggerdoc_t)); - ld->param = (remotedebuggerparam_t *)malloc(sizeof(remotedebuggerparam_t)); - ld->param->commandList = NULL; - ld->subdoc_name = NULL; - remotedebuggerdoc_destroy(ld); + EXPECT_EQ(sbuf.mtype, sndtype); + EXPECT_EQ(sbuf.mdata, nullptr); + EXPECT_EQ(sbuf.jsonPath, nullptr); + EXPECT_FALSE(sbuf.inDynamic); + EXPECT_EQ(sbuf.dsEvent, deepSleepEvent); } -TEST(TestRRDDocDestroy, DocNotNullParamNotNullCommandListNotNull) +/* --------------- Test RRD_data_buff_deAlloc() from rrdIarm --------------- */ +TEST(RRDDataBuffDeAllocTest, DeallocateDataBuff) { - remotedebuggerdoc_t *ld = (remotedebuggerdoc_t *)malloc(sizeof(remotedebuggerdoc_t)); - ld->param = (remotedebuggerparam_t *)malloc(sizeof(remotedebuggerparam_t)); - ld->param->commandList = strdup("sampleCommandList"); - ld->subdoc_name = NULL; - remotedebuggerdoc_destroy(ld); + data_buf *sbuf = (data_buf *)malloc(sizeof(data_buf)); + sbuf->mdata = (char *)malloc(10 * sizeof(char)); + sbuf->jsonPath = (char *)malloc(10 * sizeof(char)); + + ASSERT_NO_FATAL_FAILURE(RRD_data_buff_deAlloc(sbuf)); } -TEST(TestRRDDocDestroy, DocIsNULLSubDocNotNULL) +TEST(RRDDataBuffDeAllocTest, NullPointer) { - remotedebuggerdoc_t *ld = (remotedebuggerdoc_t *)malloc(sizeof(remotedebuggerdoc_t)); - ld->param = NULL; - ld->subdoc_name = strdup("sampleSubDocs"); - remotedebuggerdoc_destroy(ld); + data_buf *sbuf = nullptr; + + ASSERT_NO_FATAL_FAILURE(RRD_data_buff_deAlloc(sbuf)); } -/* --------------- Test __finder() from rrdMsgPackDecoder --------------- */ -TEST(FinderTest, MapSizeZero) +/* --------------- Test RRD_unsubscribe() from rrdIarm --------------- */ + +class RRDUnsubscribeTest : public ::testing::Test { - msgpack_object_map map; - map.size = 0; - msgpack_object *result = __finder("name", MSGPACK_OBJECT_STR, &map); +protected: + ClientIARMMock mock; - EXPECT_EQ(result, nullptr); - EXPECT_EQ(errno, MISSING_ENTRY); -} + void SetUp() override + { + setMock(&mock); + } -TEST(FinderTest, KeyTypeNotStr) + void TearDown() override + { + setMock(nullptr); + } +}; + +TEST_F(RRDUnsubscribeTest, TestRRD_Unsubscribe_Success) { - msgpack_object_map map; - msgpack_object_kv kv; - kv.key.type = MSGPACK_OBJECT_NIL; // not MSGPACK_OBJECT_STR - map.size = 1; - map.ptr = &kv; - msgpack_object *result = __finder("name", MSGPACK_OBJECT_STR, &map); + EXPECT_CALL(mock, IARM_Bus_Disconnect()).WillOnce(::testing::Return(IARM_RESULT_SUCCESS)); + EXPECT_CALL(mock, IARM_Bus_Term()).WillOnce(::testing::Return(IARM_RESULT_SUCCESS)); + EXPECT_CALL(mock, IARM_Bus_UnRegisterEventHandler(IARM_BUS_RDK_REMOTE_DEBUGGER_NAME, IARM_BUS_RDK_REMOTE_DEBUGGER_ISSUETYPE)).WillOnce(::testing::Return(IARM_RESULT_SUCCESS)); + EXPECT_CALL(mock, IARM_Bus_UnRegisterEventHandler(IARM_BUS_RDMMGR_NAME, IARM_BUS_RDMMGR_EVENT_APP_INSTALLATION_STATUS)).WillOnce(::testing::Return(IARM_RESULT_SUCCESS)); + EXPECT_CALL(mock, IARM_Bus_UnRegisterEventHandler(IARM_BUS_PWRMGR_NAME, IARM_BUS_PWRMGR_EVENT_MODECHANGED)).WillOnce(::testing::Return(IARM_RESULT_SUCCESS)); + IARM_Result_t result = RRD_unsubscribe(); - EXPECT_EQ(result, nullptr); - EXPECT_EQ(errno, MISSING_ENTRY); + EXPECT_EQ(result, IARM_RESULT_SUCCESS); } -TEST(FinderTest, KeyTypeStrExpectTypeMatch) +TEST_F(RRDUnsubscribeTest, TestRRD_Unsubscribe_DisconnectFailure) { - msgpack_object_map map; - msgpack_object_kv kv; - kv.key.type = MSGPACK_OBJECT_STR; - kv.key.via.str.ptr = "name"; - kv.key.via.str.size = strlen("name"); - kv.val.type = MSGPACK_OBJECT_STR; - kv.val.via.str.ptr = "value"; - kv.val.via.str.size = strlen("value"); - map.size = 1; - map.ptr = &kv; - msgpack_object *result = __finder("name", MSGPACK_OBJECT_STR, &map); + EXPECT_CALL(mock, IARM_Bus_Disconnect()).WillOnce(::testing::Return(IARM_RESULT_FAILURE)); + IARM_Result_t result = RRD_unsubscribe(); - ASSERT_NE(result, nullptr); - EXPECT_EQ(result->type, MSGPACK_OBJECT_STR); - EXPECT_STREQ(result->via.str.ptr, "value"); + EXPECT_EQ(result, IARM_RESULT_FAILURE); } -TEST(FinderTest, KeyTypeStrValTypeStrMatch) +TEST_F(RRDUnsubscribeTest, TestRRD_Unsubscribe_TermFailure) { - msgpack_object_map map; - msgpack_object_kv kv; - kv.key.type = MSGPACK_OBJECT_STR; - kv.key.via.str.ptr = "name"; - kv.key.via.str.size = strlen("name"); - kv.val.type = MSGPACK_OBJECT_STR; - kv.val.via.str.ptr = "value"; - kv.val.via.str.size = strlen("value"); - map.size = 1; - map.ptr = &kv; - msgpack_object *result = __finder("name", MSGPACK_OBJECT_NIL, &map); + EXPECT_CALL(mock, IARM_Bus_Disconnect()).WillOnce(::testing::Return(IARM_RESULT_SUCCESS)); + EXPECT_CALL(mock, IARM_Bus_Term()).WillOnce(::testing::Return(IARM_RESULT_FAILURE)); + IARM_Result_t result = RRD_unsubscribe(); - ASSERT_NE(result, nullptr); - EXPECT_EQ(result->type, MSGPACK_OBJECT_STR); - EXPECT_STREQ(result->via.str.ptr, "value"); + EXPECT_EQ(result, IARM_RESULT_FAILURE); } -TEST(FinderTest, KeyTypeStrValTypeAnyMatch) +TEST_F(RRDUnsubscribeTest, TestRRD_Unsubscribe_UnRegisterEventHandlerFailure) { - msgpack_object_map map; - msgpack_object_kv kv; - kv.key.type = MSGPACK_OBJECT_STR; - kv.key.via.str.ptr = "name"; - kv.key.via.str.size = strlen("name"); - kv.val.type = MSGPACK_OBJECT_NIL; - map.size = 1; - map.ptr = &kv; - msgpack_object *result = __finder("name", MSGPACK_OBJECT_NIL, &map); + EXPECT_CALL(mock, IARM_Bus_Disconnect()).WillOnce(::testing::Return(IARM_RESULT_SUCCESS)); + EXPECT_CALL(mock, IARM_Bus_Term()).WillOnce(::testing::Return(IARM_RESULT_SUCCESS)); + EXPECT_CALL(mock, IARM_Bus_UnRegisterEventHandler(::testing::_, ::testing::_)).WillOnce(::testing::Return(IARM_RESULT_FAILURE)); + IARM_Result_t result = RRD_unsubscribe(); - ASSERT_NE(result, nullptr); - EXPECT_EQ(result->type, MSGPACK_OBJECT_NIL); + EXPECT_EQ(result, IARM_RESULT_FAILURE); } -/* --------------- Test get_msgpack_unpack_status() from rrdMsgPackDecoder --------------- */ -TEST(GetMsgpackUnpackStatusTest, DecodedbufIsNullAndSizeIsZero) +TEST_F(RRDUnsubscribeTest, TestRRD_Unsubscribe_UnRegisterRDMMgrEventHandlerRRDFailure) { - char *decodedbuf = NULL; - int size = 0; + EXPECT_CALL(mock, IARM_Bus_Disconnect()).WillOnce(::testing::Return(IARM_RESULT_SUCCESS)); + EXPECT_CALL(mock, IARM_Bus_Term()).WillOnce(::testing::Return(IARM_RESULT_SUCCESS)); + EXPECT_CALL(mock, IARM_Bus_UnRegisterEventHandler(IARM_BUS_RDK_REMOTE_DEBUGGER_NAME, IARM_BUS_RDK_REMOTE_DEBUGGER_ISSUETYPE)).WillOnce(::testing::Return(IARM_RESULT_SUCCESS)); + EXPECT_CALL(mock, IARM_Bus_UnRegisterEventHandler(IARM_BUS_RDMMGR_NAME, IARM_BUS_RDMMGR_EVENT_APP_INSTALLATION_STATUS)).WillOnce(::testing::Return(IARM_RESULT_FAILURE)); + IARM_Result_t result = RRD_unsubscribe(); - EXPECT_EQ(get_msgpack_unpack_status(decodedbuf, size), MSGPACK_UNPACK_NOMEM_ERROR); + EXPECT_EQ(result, IARM_RESULT_FAILURE); } -TEST(GetMsgpackUnpackStatusTest, MsgpackUnpackReturnsSuccess) +TEST_F(RRDUnsubscribeTest, TestRRD_Unsubscribe_UnRegisterPwrMgrEventHandlerFailure) { - msgpack_sbuffer sbuf; - msgpack_packer pk; - msgpack_sbuffer_init(&sbuf); - msgpack_packer_init(&pk, &sbuf, msgpack_sbuffer_write); - msgpack_pack_int(&pk, 1); - - EXPECT_EQ(get_msgpack_unpack_status(sbuf.data, sbuf.size), MSGPACK_UNPACK_SUCCESS); + EXPECT_CALL(mock, IARM_Bus_Disconnect()).WillOnce(::testing::Return(IARM_RESULT_SUCCESS)); + EXPECT_CALL(mock, IARM_Bus_Term()).WillOnce(::testing::Return(IARM_RESULT_SUCCESS)); + EXPECT_CALL(mock, IARM_Bus_UnRegisterEventHandler(IARM_BUS_RDK_REMOTE_DEBUGGER_NAME, IARM_BUS_RDK_REMOTE_DEBUGGER_ISSUETYPE)).WillOnce(::testing::Return(IARM_RESULT_SUCCESS)); + EXPECT_CALL(mock, IARM_Bus_UnRegisterEventHandler(IARM_BUS_RDMMGR_NAME, IARM_BUS_RDMMGR_EVENT_APP_INSTALLATION_STATUS)).WillOnce(::testing::Return(IARM_RESULT_SUCCESS)); + EXPECT_CALL(mock, IARM_Bus_UnRegisterEventHandler(IARM_BUS_PWRMGR_NAME, IARM_BUS_PWRMGR_EVENT_MODECHANGED)).WillOnce(::testing::Return(IARM_RESULT_FAILURE)); + IARM_Result_t result = RRD_unsubscribe(); - msgpack_sbuffer_destroy(&sbuf); + EXPECT_EQ(result, IARM_RESULT_FAILURE); } -TEST(GetMsgpackUnpackStatusTest, MsgpackUnpackReturnsExtraBytes) +/* --------------- Test webconfigFrameworkInit() from rrdIarm --------------- */ +class WebConfigIntegrationTest : public ::testing::Test { - msgpack_sbuffer sbuf; - msgpack_packer pk; - msgpack_sbuffer_init(&sbuf); - msgpack_packer_init(&pk, &sbuf, msgpack_sbuffer_write); - // Serialize data with extra bytes - msgpack_pack_int(&pk, 1); - sbuf.data[sbuf.size] = '\0'; // Add an extra byte - - // msg_unpack_next() internally handles EXTRABYTES. It should return SUCCESS. - EXPECT_EQ(get_msgpack_unpack_status(sbuf.data, sbuf.size + 1), MSGPACK_UNPACK_SUCCESS); - - msgpack_sbuffer_destroy(&sbuf); -} +protected: + ClientWebConfigMock mock_webconfig; -TEST(GetMsgpackUnpackStatusTest, MsgpackUnpackReturnsOtherValidMacro) -{ - char decodedbuf[] = "dummy"; - int size = sizeof(decodedbuf); - msgpack_unpack_return unpack_ret = static_cast(999); - // This test case is illustrative; msgpack_unpack does not have a return value of 999. + void SetUp() override + { + setWebConfigMock(&mock_webconfig); + } - EXPECT_NE(get_msgpack_unpack_status(decodedbuf, size), unpack_ret); -} + void TearDown() override + { + setWebConfigMock(nullptr); + } +}; -/* --------------- Test remotedebuggerdoc_strerror() from rrdMsgPackDecoder --------------- */ -TEST(RemoteDebuggerDocStrErrorTest, KnownError) +TEST_F(WebConfigIntegrationTest, TestWebconfigFrameworkInit) { - EXPECT_STREQ(remotedebuggerdoc_strerror(OK), "No errors."); - EXPECT_STREQ(remotedebuggerdoc_strerror(OUT_OF_MEMORY), "Out of memory."); - EXPECT_STREQ(remotedebuggerdoc_strerror(INVALID_FIRST_ELEMENT), "Invalid first element."); - EXPECT_STREQ(remotedebuggerdoc_strerror(INVALID_VERSION), "Invalid 'version' value."); - EXPECT_STREQ(remotedebuggerdoc_strerror(INVALID_OBJECT), "Invalid 'value' array."); + EXPECT_CALL(mock_webconfig, register_sub_docs_mock(_, _, _, _)).Times(1); + webconfigFrameworkInit(); } -TEST(RemoteDebuggerDocStrErrorTest, UnknownError) -{ - EXPECT_STREQ(remotedebuggerdoc_strerror(MISSING_ENTRY), "Unknown error."); - EXPECT_STREQ(remotedebuggerdoc_strerror(999), "Unknown error."); // Test with an arbitrary number not in the map -} +/* --------------- Test RRDMsgDeliver() from rrdIarm --------------- */ +extern int msqid; +extern key_t key; -/* --------------- Test getReqTotalSizeOfIssueTypesStr() from rrdMsgPackDecoder --------------- */ -TEST(GetReqTotalSizeOfIssueTypesStrTest, ArraySizeZero) +class RRDMsgDeliverTest : public ::testing::Test { - msgpack_object obj_array[1]; - msgpack_object_array arr = {0, obj_array}; +protected: + int msqid_cpy; + key_t key_cpy; + void SetUp() override + { + msqid_cpy = msqid; + key_cpy = key; + msqid = msgget(key, IPC_CREAT | 0666); - EXPECT_EQ(getReqTotalSizeOfIssueTypesStr(&arr), 1); -} + ASSERT_NE(msqid, -1) << "Error creating message queue for testing"; + } -TEST(GetReqTotalSizeOfIssueTypesStrTest, ArraySizeFiveWithNonStringTypes) -{ - msgpack_object obj_array[5]; - for (int i = 0; i < 5; i++) + void TearDown() override { - obj_array[i].type = MSGPACK_OBJECT_POSITIVE_INTEGER; - } - msgpack_object_array arr = {5, obj_array}; + int ret = msgctl(msqid, IPC_RMID, nullptr); + ASSERT_NE(ret, -1) << "Error removing message queue used for testing"; - EXPECT_EQ(getReqTotalSizeOfIssueTypesStr(&arr), 6); -} + msqid = msqid_cpy; + key = key_cpy; + } +}; -TEST(GetReqTotalSizeOfIssueTypesStrTest, ArraySizeFiveWithStringTypes) +TEST_F(RRDMsgDeliverTest, TestMessageDelivery) { - msgpack_object obj_array[5]; - const char *test_strs[5] = {"one", "two", "three", "four", "five"}; - int total_strlen = 0; - for (int i = 0; i < 5; i++) - { - obj_array[i].type = MSGPACK_OBJECT_STR; - obj_array[i].via.str.size = strlen(test_strs[i]); - obj_array[i].via.str.ptr = test_strs[i]; - total_strlen += strlen(test_strs[i]); - } - msgpack_object_array arr = {5, obj_array}; - EXPECT_EQ(getReqTotalSizeOfIssueTypesStr(&arr), 1 + 5 + total_strlen); + data_buf sbuf; + sbuf.mtype = IARM_EVENT_MSG; + sbuf.mdata = "mdata"; + sbuf.inDynamic = true; + sbuf.dsEvent = RRD_DEEPSLEEP_INVALID_DEFAULT; + RRDMsgDeliver(msqid, &sbuf); + data_buf receivedBuf; + int ret = msgrcv(msqid, &receivedBuf, sizeof(receivedBuf), DEFAULT, 0); + + ASSERT_NE(ret, -1) << "Error receiving message from queue"; + ASSERT_EQ(sbuf.mtype, receivedBuf.mtype); + ASSERT_EQ(receivedBuf.inDynamic, true); } -/* --------------- Test FreeResources_RemoteDebugger() from rrdMsgPackDecoder --------------- */ -TEST(FreeResourcesRemoteDebuggerTest, NullPointerArgument) +TEST_F(RRDMsgDeliverTest, TestMessageDeliveryFailure) { - FreeResources_RemoteDebugger(NULL); - // No assertion needed, just ensuring no crashes + data_buf sbuf; + sbuf.mtype = IARM_EVENT_MSG; + sbuf.mdata = "mdata"; + sbuf.inDynamic = true; + sbuf.dsEvent = RRD_DEEPSLEEP_INVALID_DEFAULT; + + EXPECT_EXIT(RRDMsgDeliver(-1, &sbuf), ::testing::ExitedWithCode(1), ".*"); } -/* --------------- Test PrepareDataToPush() from rrdMsgPackDecoder --------------- */ -class PrepareDataToPushTest : public ::testing::Test +/* --------------- Test pushIssueTypesToMsgQueue() from rrdIarm --------------- */ +class PushIssueTypesToMsgQueueTest : public ::testing::Test { protected: int msqid_cpy; @@ -3036,8 +2991,10 @@ class PrepareDataToPushTest : public ::testing::Test msqid_cpy = msqid; key_cpy = key; msqid = msgget(key, IPC_CREAT | 0666); + ASSERT_NE(msqid, -1) << "Error creating message queue for testing"; } + void TearDown() override { int ret = msgctl(msqid, IPC_RMID, nullptr); @@ -3048,773 +3005,2046 @@ class PrepareDataToPushTest : public ::testing::Test } }; -TEST_F(PrepareDataToPushTest, SuccessfulExecution) +TEST_F(PushIssueTypesToMsgQueueTest, TestPushIssueTypesToMsgQueueSuccess) { - remotedebuggerparam_t param; - param.length = 5; - param.commandList = (char *)"12345"; - PrepareDataToPush(¶m); + char issueTypeList[] = "mdata"; + pushIssueTypesToMsgQueue(issueTypeList, IARM_EVENT_MSG); data_buf receivedBuf; - int ret = msgrcv(msqid, &receivedBuf, sizeof(receivedBuf), EVENT_MSG, 0); + int ret = msgrcv(msqid, &receivedBuf, sizeof(receivedBuf), IARM_EVENT_MSG, 0); ASSERT_NE(ret, -1) << "Error receiving message from queue"; } -/* --------------- Test helper_convert() from rrdMsgPackDecoder --------------- */ -int mock_process_success(void *p, int num, ...) +/* --------------- Test _remoteDebuggerEventHandler() from rrdIarm --------------- */ +class RemoteDebuggerEventHandlerTest : public ::testing::Test { - // Mock implementation of process function - return 0; // Success -} +protected: + string getCurrentTestName() + { + const testing::TestInfo *const test_info = testing::UnitTest::GetInstance()->current_test_info(); + return test_info->name(); + } + int msqid_cpy; + key_t key_cpy; + void SetUp() override + { + string test_name = getCurrentTestName(); + if (test_name == "TestPushIssueTypesToMsgQueueSuccess") + { + msqid_cpy = msqid; + key_cpy = key; + msqid = msgget(key, IPC_CREAT | 0666); -int mock_process_failure(void *p, int num, ...) -{ - // Mock implementation of process function that fails - return -1; // Return non-zero to indicate failure -} + ASSERT_NE(msqid, -1) << "Error creating message queue for testing"; + } + } -void mock_destroy(void *p) -{ - // Mock implementation of destroy function - free(p); // Free the allocated memory -} + void TearDown() override + { + string test_name = getCurrentTestName(); + if (test_name == "TestPushIssueTypesToMsgQueueSuccess") + { + int ret = msgctl(msqid, IPC_RMID, nullptr); + ASSERT_NE(ret, -1) << "Error removing message queue used for testing"; -TEST(HelperConvertTest, BufIsNull) -{ - void *result = helper_convert(NULL, 10, 100, "wrapper", MSGPACK_OBJECT_MAP, false, mock_process_success, mock_destroy); - EXPECT_NE(result, nullptr); // malloc success - EXPECT_EQ(errno, 3); - mock_destroy(result); -} + msqid = msqid_cpy; + key = key_cpy; + } + } +}; -TEST(HelperConvertTest, MsgPackUnpackSuccessProcessSuccess) +TEST_F(RemoteDebuggerEventHandlerTest, TestPushIssueTypesToMsgQueueSuccess) { - msgpack_sbuffer sbuf; - msgpack_packer pk; - msgpack_sbuffer_init(&sbuf); - msgpack_packer_init(&pk, &sbuf, msgpack_sbuffer_write); - // Create a map with one key-value pair: "parameters" -> "value" - msgpack_pack_map(&pk, 1); - msgpack_pack_str(&pk, 10); - msgpack_pack_str_body(&pk, "parameters", 10); - msgpack_pack_str(&pk, 5); - msgpack_pack_str_body(&pk, "value", 5); - void *result = helper_convert(sbuf.data, sbuf.size, 100, "parameters", MSGPACK_OBJECT_STR, false, mock_process_success, mock_destroy); - - EXPECT_NE(result, nullptr); - EXPECT_EQ(errno, 0); // Expect errno to be 0 (OK) + const char *owner = IARM_BUS_RDK_REMOTE_DEBUGGER_NAME; + IARM_EventId_t eventId = IARM_BUS_RDK_REMOTE_DEBUGGER_ISSUETYPE; + char data[] = "mdata"; + _remoteDebuggerEventHandler(owner, eventId, data, sizeof(data)); + data_buf receivedBuf; + int ret = msgrcv(msqid, &receivedBuf, sizeof(receivedBuf), IARM_EVENT_MSG, 0); - msgpack_sbuffer_destroy(&sbuf); - mock_destroy(result); + ASSERT_NE(ret, -1) << "Error receiving message from queue"; } -TEST(HelperConvertTest, MsgPackUnpackSuccessProcessFails) +TEST_F(RemoteDebuggerEventHandlerTest, TestInvalidOwnerName) { - msgpack_sbuffer sbuf; - msgpack_packer pk; - msgpack_sbuffer_init(&sbuf); - msgpack_packer_init(&pk, &sbuf, msgpack_sbuffer_write); - // Create a map with one key-value pair: "parameters" -> "value" - msgpack_pack_map(&pk, 1); - msgpack_pack_str(&pk, 10); - msgpack_pack_str_body(&pk, "parameters", 10); - msgpack_pack_str(&pk, 5); - msgpack_pack_str_body(&pk, "value", 5); - // Call the helper_convert function with mock process that fails - void *result = helper_convert(sbuf.data, sbuf.size, 100, "parameters", MSGPACK_OBJECT_STR, false, mock_process_failure, mock_destroy); - - EXPECT_EQ(result, nullptr); - EXPECT_EQ(errno, INVALID_FIRST_ELEMENT); + const char *owner = "InvalidOwner"; + IARM_EventId_t eventId = IARM_BUS_RDK_REMOTE_DEBUGGER_ISSUETYPE; + char data[] = "Test data"; + _remoteDebuggerEventHandler(owner, eventId, data, sizeof(data)); +} - msgpack_sbuffer_destroy(&sbuf); +TEST_F(RemoteDebuggerEventHandlerTest, TestInvalidEventId) +{ + const char *owner = IARM_BUS_RDK_REMOTE_DEBUGGER_NAME; + IARM_EventId_t eventId = IARM_BUS_RDK_REMOTE_DEBUGGER_MAX_EVENT; // Invalid event id + char data[] = "Test data"; + _remoteDebuggerEventHandler(owner, eventId, data, sizeof(data)); } -TEST(HelperConvertTest, MsgPackWrapperConditionFalseProcessFails) +/* --------------- Test _remoteDebuggerWebCfgDataEventHandler() from rrdIarm --------------- */ +class RemoteDebuggerWebConfigEventHandlerTest : public ::testing::Test { - msgpack_sbuffer sbuf; - msgpack_packer pk; - msgpack_sbuffer_init(&sbuf); - msgpack_packer_init(&pk, &sbuf, msgpack_sbuffer_write); - // Create a map with one key-value pair: "key" -> "value" - msgpack_pack_map(&pk, 1); - msgpack_pack_str(&pk, 3); +protected: + string getCurrentTestName() + { + const testing::TestInfo *const test_info = testing::UnitTest::GetInstance()->current_test_info(); + return test_info->name(); + } + int msqid_cpy; + key_t key_cpy; + void SetUp() override + { + string test_name = getCurrentTestName(); + if (test_name == "TestPushIssueTypesToMsgQueueSuccess") + { + msqid_cpy = msqid; + key_cpy = key; + msqid = msgget(key, IPC_CREAT | 0666); + + ASSERT_NE(msqid, -1) << "Error creating message queue for testing"; + } + } + void TearDown() override + { + string test_name = getCurrentTestName(); + if (test_name == "TestPushIssueTypesToMsgQueueSuccess") + { + int ret = msgctl(msqid, IPC_RMID, nullptr); + ASSERT_NE(ret, -1) << "Error removing message queue used for testing"; + + msqid = msqid_cpy; + key = key_cpy; + } + } +}; + +TEST_F(RemoteDebuggerWebConfigEventHandlerTest, TestInvalidOwnerName) +{ + const char *owner = "InvalidOwner"; + IARM_EventId_t eventId = IARM_BUS_RDK_REMOTE_DEBUGGER_ISSUETYPE; + char data[] = "Test data"; + _remoteDebuggerWebCfgDataEventHandler(owner, eventId, data, sizeof(data)); +} + +TEST_F(RemoteDebuggerWebConfigEventHandlerTest, TestInvalidEventId) +{ + const char *owner = IARM_BUS_RDK_REMOTE_DEBUGGER_NAME; + IARM_EventId_t eventId = IARM_BUS_RDK_REMOTE_DEBUGGER_MAX_EVENT; + char data[] = "Test data"; + _remoteDebuggerWebCfgDataEventHandler(owner, eventId, data, sizeof(data)); +} + +TEST_F(RemoteDebuggerWebConfigEventHandlerTest, TestPushIssueTypesToMsgQueueSuccess) +{ + const char *owner = IARM_BUS_RDK_REMOTE_DEBUGGER_NAME; + IARM_EventId_t eventId = IARM_BUS_RDK_REMOTE_DEBUGGER_WEBCFGDATA; + char data[] = "mdata"; + _remoteDebuggerWebCfgDataEventHandler(owner, eventId, data, sizeof(data)); + data_buf receivedBuf; + int ret = msgrcv(msqid, &receivedBuf, sizeof(receivedBuf), IARM_EVENT_MSG, 0); + + ASSERT_NE(ret, -1) << "Error receiving message from queue"; +} + +/* --------------- Test _rdmManagerEventHandler() from rrdIarm --------------- */ +class RDMMgrEventHandlerTest : public ::testing::Test +{ +protected: + string getCurrentTestName() + { + const testing::TestInfo *const test_info = testing::UnitTest::GetInstance()->current_test_info(); + return test_info->name(); + } + int msqid_cpy; + key_t key_cpy; + void SetUp() override + { + string test_name = getCurrentTestName(); + if (test_name == "TestFoundInCacheDownloadIsCompleteAndDEEPSLEEPIssue" || test_name == "TestFoundInCacheDownloadIsCompleteAndNotDEEPSLEEPIssue") + { + msqid_cpy = msqid; + key_cpy = key; + msqid = msgget(key, IPC_CREAT | 0666); + + ASSERT_NE(msqid, -1) << "Error creating message queue for testing"; + } + } + void TearDown() override + { + string test_name = getCurrentTestName(); + if (test_name == "TestFoundInCacheDownloadIsCompleteDEEPSLEEPIssue" || test_name == "TestFoundInCacheDownloadIsCompleteAndNotDEEPSLEEPIssue") + { + int ret = msgctl(msqid, IPC_RMID, nullptr); + ASSERT_NE(ret, -1) << "Error removing message queue used for testing"; + + msqid = msqid_cpy; + key = key_cpy; + } + } +}; + +TEST_F(RDMMgrEventHandlerTest, TestInvalidOwnerName) +{ + const char *owner = "InvalidOwner"; + IARM_EventId_t eventId = IARM_BUS_RDK_REMOTE_DEBUGGER_ISSUETYPE; + char data[] = "Test data"; + _rdmManagerEventHandler(owner, eventId, data, sizeof(data)); +} + +TEST_F(RDMMgrEventHandlerTest, TestInvalidEventId) +{ + const char *owner = IARM_BUS_RDMMGR_NAME; + IARM_EventId_t eventId = IARM_BUS_RDK_REMOTE_DEBUGGER_MAX_EVENT; // Invalid event id + char data[] = "Test data"; + _rdmManagerEventHandler(owner, eventId, data, sizeof(data)); +} + +TEST_F(RDMMgrEventHandlerTest, TestNotFoundInCache) +{ + const char *owner = IARM_BUS_RDMMGR_NAME; + IARM_EventId_t eventId = IARM_BUS_RDMMGR_EVENT_APP_INSTALLATION_STATUS; + IARM_Bus_RDMMgr_EventData_t eventData; + strncpy(eventData.rdm_pkg_info.pkg_name, "Test package", RDM_PKG_NAME_MAX_SIZE); + strncpy(eventData.rdm_pkg_info.pkg_version, "1.0.0", RDM_PKG_VERSION_MAX_SIZE); + strncpy(eventData.rdm_pkg_info.pkg_inst_path, "/path/to/package", RDM_PKG_INST_PATH_MAX_SIZE); + _rdmManagerEventHandler(owner, eventId, &eventData, sizeof(eventData)); +} + +TEST_F(RDMMgrEventHandlerTest, TestFoundInCacheDownloadNotComplete) +{ + const char *owner = IARM_BUS_RDMMGR_NAME; + IARM_EventId_t eventId = IARM_BUS_RDMMGR_EVENT_APP_INSTALLATION_STATUS; + cacheData *node = (cacheData *)malloc(sizeof(cacheData)); + node->mdata = strdup("PkgData"); + node->issueString = strdup("IssueString"); + node->next = NULL; + cacheDataNode = node; + IARM_Bus_RDMMgr_EventData_t eventData; + strncpy(eventData.rdm_pkg_info.pkg_name, "PkgData", RDM_PKG_NAME_MAX_SIZE); + strncpy(eventData.rdm_pkg_info.pkg_version, "1.0.0", RDM_PKG_VERSION_MAX_SIZE); + strncpy(eventData.rdm_pkg_info.pkg_inst_path, "/path/to/package", RDM_PKG_INST_PATH_MAX_SIZE); + eventData.rdm_pkg_info.pkg_inst_status = RDM_PKG_INSTALL_ERROR; + _rdmManagerEventHandler(owner, eventId, &eventData, sizeof(eventData)); +} + +TEST_F(RDMMgrEventHandlerTest, TestFoundInCacheDownloadIsCompleteAndDEEPSLEEPIssue) +{ + const char *owner = IARM_BUS_RDMMGR_NAME; + IARM_EventId_t eventId = IARM_BUS_RDMMGR_EVENT_APP_INSTALLATION_STATUS; + cacheData *node = (cacheData *)malloc(sizeof(cacheData)); + node->mdata = strdup("PkgData"); + node->issueString = strdup("DEEPSLEEP"); + node->next = NULL; + cacheDataNode = node; + IARM_Bus_RDMMgr_EventData_t eventData; + strncpy(eventData.rdm_pkg_info.pkg_name, "PkgData", RDM_PKG_NAME_MAX_SIZE); + strncpy(eventData.rdm_pkg_info.pkg_version, "1.0.0", RDM_PKG_VERSION_MAX_SIZE); + strncpy(eventData.rdm_pkg_info.pkg_inst_path, "/path/to/package", RDM_PKG_INST_PATH_MAX_SIZE); + eventData.rdm_pkg_info.pkg_inst_status = RDM_PKG_INSTALL_COMPLETE; + _rdmManagerEventHandler(owner, eventId, &eventData, sizeof(eventData)); +} + +TEST_F(RDMMgrEventHandlerTest, TestFoundInCacheDownloadIsCompleteAndNotDEEPSLEEPIssue) +{ + const char *owner = IARM_BUS_RDMMGR_NAME; + IARM_EventId_t eventId = IARM_BUS_RDMMGR_EVENT_APP_INSTALLATION_STATUS; + cacheData *node = (cacheData *)malloc(sizeof(cacheData)); + node->mdata = strdup("PkgData"); + node->issueString = strdup("NotDeepSleepIssue"); + node->next = NULL; + cacheDataNode = node; + IARM_Bus_RDMMgr_EventData_t eventData; + strncpy(eventData.rdm_pkg_info.pkg_name, "PkgData", RDM_PKG_NAME_MAX_SIZE); + strncpy(eventData.rdm_pkg_info.pkg_version, "1.0.0", RDM_PKG_VERSION_MAX_SIZE); + strncpy(eventData.rdm_pkg_info.pkg_inst_path, "/path/to/package", RDM_PKG_INST_PATH_MAX_SIZE); + eventData.rdm_pkg_info.pkg_inst_status = RDM_PKG_INSTALL_COMPLETE; + _rdmManagerEventHandler(owner, eventId, &eventData, sizeof(eventData)); +} + +/* --------------- Test _pwrManagerEventHandler() from rrdIarm --------------- */ +class PwrMgrEventHandlerTest : public ::testing::Test +{ +protected: + MockRBusApi mock_rbus_api; + string getCurrentTestName() + { + const testing::TestInfo *const test_info = testing::UnitTest::GetInstance()->current_test_info(); + return test_info->name(); + } + void SetUp() override + { + string test_name = getCurrentTestName(); + if (test_name == "TestCurrentStateDeepSleepRBusOpenFail" || test_name == "TestCurrentStateDeepSleepRBusOpenSuccessRbusSetSuccess") + { + RBusApiWrapper::setImpl(&mock_rbus_api); + } + } + void TearDown() override + { + string test_name = getCurrentTestName(); + if (test_name == "TestCurrentStateDeepSleepRBusOpenFail" || test_name == "TestCurrentStateDeepSleepRBusOpenSuccessRbusSetFail" || test_name == "TestCurrentStateDeepSleepRBusOpenSuccessRbusSetSuccess") + { + RBusApiWrapper::clearImpl(); + } + } +}; + +TEST_F(PwrMgrEventHandlerTest, TestInvalidOwnerName) +{ + const char *owner = "InvalidOwner"; + IARM_EventId_t eventId = IARM_BUS_RDK_REMOTE_DEBUGGER_ISSUETYPE; + char data[] = "Test data"; + _pwrManagerEventHandler(owner, eventId, data, sizeof(data)); +} + +TEST_F(PwrMgrEventHandlerTest, TestCurrentStateNotDeepSleep) +{ + const char *owner = IARM_BUS_PWRMGR_NAME; + IARM_EventId_t eventId = IARM_BUS_RDK_REMOTE_DEBUGGER_ISSUETYPE; + IARM_Bus_PWRMgr_EventData_t eventData; + eventData.data.state.curState = IARM_BUS_PWRMGR_POWERSTATE_ON; + eventData.data.state.newState = IARM_BUS_PWRMGR_POWERSTATE_STANDBY_DEEP_SLEEP; + _pwrManagerEventHandler(owner, eventId, &eventData, sizeof(eventData)); +} + +TEST_F(PwrMgrEventHandlerTest, TestCurrentStateDeepSleepRBusOpenFail) +{ + const char *owner = IARM_BUS_PWRMGR_NAME; + IARM_EventId_t eventId = IARM_BUS_RDK_REMOTE_DEBUGGER_ISSUETYPE; + IARM_Bus_PWRMgr_EventData_t eventData; + eventData.data.state.curState = IARM_BUS_PWRMGR_POWERSTATE_STANDBY_DEEP_SLEEP; + eventData.data.state.newState = IARM_BUS_PWRMGR_POWERSTATE_ON; + EXPECT_CALL(mock_rbus_api, rbus_open(_, _)).WillOnce(Return(RBUS_ERROR_BUS_ERROR)); + _pwrManagerEventHandler(owner, eventId, &eventData, sizeof(eventData)); +} + +TEST_F(PwrMgrEventHandlerTest, TestCurrentStateDeepSleepRBusOpenSuccessRbusSetFail) +{ + const char *owner = IARM_BUS_PWRMGR_NAME; + IARM_EventId_t eventId = IARM_BUS_RDK_REMOTE_DEBUGGER_ISSUETYPE; + IARM_Bus_PWRMgr_EventData_t eventData; + eventData.data.state.curState = IARM_BUS_PWRMGR_POWERSTATE_STANDBY_DEEP_SLEEP; + eventData.data.state.newState = IARM_BUS_PWRMGR_POWERSTATE_ON; + + EXPECT_CALL(mock_rbus_api, rbus_open(_, _)).WillOnce(Return(RBUS_ERROR_SUCCESS)); + EXPECT_CALL(mock_rbus_api, rbusValue_Init(_)).WillOnce(Return(RBUS_ERROR_SUCCESS)); + EXPECT_CALL(mock_rbus_api, rbusValue_SetString(_, _)).WillOnce(Return(RBUS_ERROR_SUCCESS)); + EXPECT_CALL(mock_rbus_api, rbus_set(_, _, _, _)).WillOnce(Return(RBUS_ERROR_BUS_ERROR)); + _pwrManagerEventHandler(owner, eventId, &eventData, sizeof(eventData)); +} + +TEST_F(PwrMgrEventHandlerTest, TestCurrentStateDeepSleepRBusOpenSuccessRbusSetSuccess) +{ + const char *owner = IARM_BUS_PWRMGR_NAME; + IARM_EventId_t eventId = IARM_BUS_RDK_REMOTE_DEBUGGER_ISSUETYPE; + IARM_Bus_PWRMgr_EventData_t eventData; + eventData.data.state.curState = IARM_BUS_PWRMGR_POWERSTATE_STANDBY_DEEP_SLEEP; + eventData.data.state.newState = IARM_BUS_PWRMGR_POWERSTATE_ON; + + EXPECT_CALL(mock_rbus_api, rbus_open(_, _)).WillOnce(Return(RBUS_ERROR_SUCCESS)); + EXPECT_CALL(mock_rbus_api, rbusValue_Init(_)).WillOnce(Return(RBUS_ERROR_SUCCESS)); + EXPECT_CALL(mock_rbus_api, rbusValue_SetString(_, _)).WillOnce(Return(RBUS_ERROR_SUCCESS)); + EXPECT_CALL(mock_rbus_api, rbus_set(_, _, _, _)).WillOnce(Return(RBUS_ERROR_SUCCESS)); + _pwrManagerEventHandler(owner, eventId, &eventData, sizeof(eventData)); +} + +/* --------------- Test RRD_subscribe() from rrdIarm --------------- */ +class RRDSubscribeTest : public ::testing::Test +{ +protected: + ClientIARMMock mock; + ClientWebConfigMock mock_webconfig; + + void SetUp() override + { + setMock(&mock); + setWebConfigMock(&mock_webconfig); + } + + void TearDown() override + { + setMock(nullptr); + setWebConfigMock(nullptr); + } +}; + +TEST_F(RRDSubscribeTest, TestRRD_Subscribe_AllSuccess) +{ + EXPECT_CALL(mock, IARM_Bus_Init(IARM_BUS_RDK_REMOTE_DEBUGGER_NAME)).WillOnce(::testing::Return(IARM_RESULT_SUCCESS)); + EXPECT_CALL(mock, IARM_Bus_Connect()).WillOnce(::testing::Return(IARM_RESULT_SUCCESS)); + EXPECT_CALL(mock, IARM_Bus_RegisterEventHandler(IARM_BUS_RDK_REMOTE_DEBUGGER_NAME, IARM_BUS_RDK_REMOTE_DEBUGGER_ISSUETYPE, ::testing::_)).WillOnce(::testing::Return(IARM_RESULT_SUCCESS)); + EXPECT_CALL(mock, IARM_Bus_RegisterEventHandler(IARM_BUS_RDK_REMOTE_DEBUGGER_NAME, IARM_BUS_RDK_REMOTE_DEBUGGER_WEBCFGDATA, ::testing::_)).WillOnce(::testing::Return(IARM_RESULT_SUCCESS)); + EXPECT_CALL(mock, IARM_Bus_RegisterEventHandler(IARM_BUS_RDMMGR_NAME, IARM_BUS_RDMMGR_EVENT_APP_INSTALLATION_STATUS, ::testing::_)).WillOnce(::testing::Return(IARM_RESULT_SUCCESS)); + EXPECT_CALL(mock, IARM_Bus_RegisterEventHandler(IARM_BUS_PWRMGR_NAME, IARM_BUS_PWRMGR_EVENT_MODECHANGED, ::testing::_)).WillOnce(::testing::Return(IARM_RESULT_SUCCESS)); + EXPECT_CALL(mock_webconfig, register_sub_docs_mock(_, _, _, _)).Times(1); + IARM_Result_t result = RRD_subscribe(); + + EXPECT_EQ(result, IARM_RESULT_SUCCESS); +} + +TEST_F(RRDSubscribeTest, TestRRD_Subscribe_InitFail) +{ + EXPECT_CALL(mock, IARM_Bus_Init(IARM_BUS_RDK_REMOTE_DEBUGGER_NAME)).WillOnce(::testing::Return(IARM_RESULT_FAILURE)); + IARM_Result_t result = RRD_subscribe(); + + EXPECT_NE(result, IARM_RESULT_SUCCESS); +} + +TEST_F(RRDSubscribeTest, TestRRD_Subscribe_ConnectFail) +{ + EXPECT_CALL(mock, IARM_Bus_Init(IARM_BUS_RDK_REMOTE_DEBUGGER_NAME)).WillOnce(::testing::Return(IARM_RESULT_SUCCESS)); + EXPECT_CALL(mock, IARM_Bus_Connect()).WillOnce(::testing::Return(IARM_RESULT_FAILURE)); + IARM_Result_t result = RRD_subscribe(); + + EXPECT_NE(result, IARM_RESULT_SUCCESS); +} + +TEST_F(RRDSubscribeTest, TestRRD_Subscribe_RRDHandlerFail) +{ + EXPECT_CALL(mock, IARM_Bus_Init(IARM_BUS_RDK_REMOTE_DEBUGGER_NAME)).WillOnce(::testing::Return(IARM_RESULT_SUCCESS)); + EXPECT_CALL(mock, IARM_Bus_Connect()).WillOnce(::testing::Return(IARM_RESULT_SUCCESS)); + EXPECT_CALL(mock, IARM_Bus_RegisterEventHandler(IARM_BUS_RDK_REMOTE_DEBUGGER_NAME, IARM_BUS_RDK_REMOTE_DEBUGGER_ISSUETYPE, ::testing::_)).WillOnce(::testing::Return(IARM_RESULT_FAILURE)); + IARM_Result_t result = RRD_subscribe(); + + EXPECT_NE(result, IARM_RESULT_SUCCESS); +} + +TEST_F(RRDSubscribeTest, TestRRD_Subscribe_RRDWebCfgHandlerFail) +{ + EXPECT_CALL(mock, IARM_Bus_Init(IARM_BUS_RDK_REMOTE_DEBUGGER_NAME)).WillOnce(::testing::Return(IARM_RESULT_SUCCESS)); + EXPECT_CALL(mock, IARM_Bus_Connect()).WillOnce(::testing::Return(IARM_RESULT_SUCCESS)); + EXPECT_CALL(mock, IARM_Bus_RegisterEventHandler(IARM_BUS_RDK_REMOTE_DEBUGGER_NAME, IARM_BUS_RDK_REMOTE_DEBUGGER_ISSUETYPE, ::testing::_)).WillOnce(::testing::Return(IARM_RESULT_SUCCESS)); + EXPECT_CALL(mock, IARM_Bus_RegisterEventHandler(IARM_BUS_RDK_REMOTE_DEBUGGER_NAME, IARM_BUS_RDK_REMOTE_DEBUGGER_WEBCFGDATA, ::testing::_)).WillOnce(::testing::Return(IARM_RESULT_FAILURE)); + IARM_Result_t result = RRD_subscribe(); + + EXPECT_NE(result, IARM_RESULT_SUCCESS); +} + +TEST_F(RRDSubscribeTest, TestRRD_Subscribe_RDMMgrHandlerFail) +{ + EXPECT_CALL(mock, IARM_Bus_Init(IARM_BUS_RDK_REMOTE_DEBUGGER_NAME)).WillOnce(::testing::Return(IARM_RESULT_SUCCESS)); + EXPECT_CALL(mock, IARM_Bus_Connect()).WillOnce(::testing::Return(IARM_RESULT_SUCCESS)); + EXPECT_CALL(mock, IARM_Bus_RegisterEventHandler(IARM_BUS_RDK_REMOTE_DEBUGGER_NAME, IARM_BUS_RDK_REMOTE_DEBUGGER_ISSUETYPE, ::testing::_)).WillOnce(::testing::Return(IARM_RESULT_SUCCESS)); + EXPECT_CALL(mock, IARM_Bus_RegisterEventHandler(IARM_BUS_RDK_REMOTE_DEBUGGER_NAME, IARM_BUS_RDK_REMOTE_DEBUGGER_WEBCFGDATA, ::testing::_)).WillOnce(::testing::Return(IARM_RESULT_SUCCESS)); + EXPECT_CALL(mock, IARM_Bus_RegisterEventHandler(IARM_BUS_RDMMGR_NAME, IARM_BUS_RDMMGR_EVENT_APP_INSTALLATION_STATUS, ::testing::_)).WillOnce(::testing::Return(IARM_RESULT_FAILURE)); + IARM_Result_t result = RRD_subscribe(); + + EXPECT_NE(result, IARM_RESULT_SUCCESS); +} + +TEST_F(RRDSubscribeTest, TestRRD_Subscribe_PwrMgrHandlerFail) +{ + EXPECT_CALL(mock, IARM_Bus_Init(IARM_BUS_RDK_REMOTE_DEBUGGER_NAME)).WillOnce(::testing::Return(IARM_RESULT_SUCCESS)); + EXPECT_CALL(mock, IARM_Bus_Connect()).WillOnce(::testing::Return(IARM_RESULT_SUCCESS)); + EXPECT_CALL(mock, IARM_Bus_RegisterEventHandler(IARM_BUS_RDK_REMOTE_DEBUGGER_NAME, IARM_BUS_RDK_REMOTE_DEBUGGER_ISSUETYPE, ::testing::_)).WillOnce(::testing::Return(IARM_RESULT_SUCCESS)); + EXPECT_CALL(mock, IARM_Bus_RegisterEventHandler(IARM_BUS_RDK_REMOTE_DEBUGGER_NAME, IARM_BUS_RDK_REMOTE_DEBUGGER_WEBCFGDATA, ::testing::_)).WillOnce(::testing::Return(IARM_RESULT_SUCCESS)); + EXPECT_CALL(mock, IARM_Bus_RegisterEventHandler(IARM_BUS_RDMMGR_NAME, IARM_BUS_RDMMGR_EVENT_APP_INSTALLATION_STATUS, ::testing::_)).WillOnce(::testing::Return(IARM_RESULT_SUCCESS)); + EXPECT_CALL(mock, IARM_Bus_RegisterEventHandler(IARM_BUS_PWRMGR_NAME, IARM_BUS_PWRMGR_EVENT_MODECHANGED, ::testing::_)).WillOnce(::testing::Return(IARM_RESULT_FAILURE)); + IARM_Result_t result = RRD_subscribe(); + + EXPECT_NE(result, IARM_RESULT_SUCCESS); +} +#endif + +/* ====================== rrdMsgPackDecoder ================*/ +/* --------------- Test rollback_Debugger() from rrdMsgPackDecoder --------------- */ +TEST(TestDebuggerRollback, ValidReturn) +{ + int ret = rollback_Debugger(); + EXPECT_EQ(ret, 0); +} + +/* --------------- Test remotedebuggerdoc_destroy() from rrdMsgPackDecoder --------------- */ +TEST(TestRRDDocDestroy, DocIsNULL) +{ + remotedebuggerdoc_t *ld = NULL; + remotedebuggerdoc_destroy(ld); +} + +TEST(TestRRDDocDestroy, DocNotNullParamNotNullCommandListNull) +{ + remotedebuggerdoc_t *ld = (remotedebuggerdoc_t *)malloc(sizeof(remotedebuggerdoc_t)); + ld->param = (remotedebuggerparam_t *)malloc(sizeof(remotedebuggerparam_t)); + ld->param->commandList = NULL; + ld->subdoc_name = NULL; + remotedebuggerdoc_destroy(ld); +} + +TEST(TestRRDDocDestroy, DocNotNullParamNotNullCommandListNotNull) +{ + remotedebuggerdoc_t *ld = (remotedebuggerdoc_t *)malloc(sizeof(remotedebuggerdoc_t)); + ld->param = (remotedebuggerparam_t *)malloc(sizeof(remotedebuggerparam_t)); + ld->param->commandList = strdup("sampleCommandList"); + ld->subdoc_name = NULL; + remotedebuggerdoc_destroy(ld); +} + +TEST(TestRRDDocDestroy, DocIsNULLSubDocNotNULL) +{ + remotedebuggerdoc_t *ld = (remotedebuggerdoc_t *)malloc(sizeof(remotedebuggerdoc_t)); + ld->param = NULL; + ld->subdoc_name = strdup("sampleSubDocs"); + remotedebuggerdoc_destroy(ld); +} + +/* --------------- Test __finder() from rrdMsgPackDecoder --------------- */ +TEST(FinderTest, MapSizeZero) +{ + msgpack_object_map map; + map.size = 0; + msgpack_object *result = __finder("name", MSGPACK_OBJECT_STR, &map); + + EXPECT_EQ(result, nullptr); + EXPECT_EQ(errno, MISSING_ENTRY); +} + +TEST(FinderTest, KeyTypeNotStr) +{ + msgpack_object_map map; + msgpack_object_kv kv; + kv.key.type = MSGPACK_OBJECT_NIL; // not MSGPACK_OBJECT_STR + map.size = 1; + map.ptr = &kv; + msgpack_object *result = __finder("name", MSGPACK_OBJECT_STR, &map); + + EXPECT_EQ(result, nullptr); + EXPECT_EQ(errno, MISSING_ENTRY); +} + +TEST(FinderTest, KeyTypeStrExpectTypeMatch) +{ + msgpack_object_map map; + msgpack_object_kv kv; + kv.key.type = MSGPACK_OBJECT_STR; + kv.key.via.str.ptr = "name"; + kv.key.via.str.size = strlen("name"); + kv.val.type = MSGPACK_OBJECT_STR; + kv.val.via.str.ptr = "value"; + kv.val.via.str.size = strlen("value"); + map.size = 1; + map.ptr = &kv; + msgpack_object *result = __finder("name", MSGPACK_OBJECT_STR, &map); + + ASSERT_NE(result, nullptr); + EXPECT_EQ(result->type, MSGPACK_OBJECT_STR); + EXPECT_STREQ(result->via.str.ptr, "value"); +} + +TEST(FinderTest, KeyTypeStrValTypeStrMatch) +{ + msgpack_object_map map; + msgpack_object_kv kv; + kv.key.type = MSGPACK_OBJECT_STR; + kv.key.via.str.ptr = "name"; + kv.key.via.str.size = strlen("name"); + kv.val.type = MSGPACK_OBJECT_STR; + kv.val.via.str.ptr = "value"; + kv.val.via.str.size = strlen("value"); + map.size = 1; + map.ptr = &kv; + msgpack_object *result = __finder("name", MSGPACK_OBJECT_NIL, &map); + + ASSERT_NE(result, nullptr); + EXPECT_EQ(result->type, MSGPACK_OBJECT_STR); + EXPECT_STREQ(result->via.str.ptr, "value"); +} + +TEST(FinderTest, KeyTypeStrValTypeAnyMatch) +{ + msgpack_object_map map; + msgpack_object_kv kv; + kv.key.type = MSGPACK_OBJECT_STR; + kv.key.via.str.ptr = "name"; + kv.key.via.str.size = strlen("name"); + kv.val.type = MSGPACK_OBJECT_NIL; + map.size = 1; + map.ptr = &kv; + msgpack_object *result = __finder("name", MSGPACK_OBJECT_NIL, &map); + + ASSERT_NE(result, nullptr); + EXPECT_EQ(result->type, MSGPACK_OBJECT_NIL); +} + +/* --------------- Test get_msgpack_unpack_status() from rrdMsgPackDecoder --------------- */ +TEST(GetMsgpackUnpackStatusTest, DecodedbufIsNullAndSizeIsZero) +{ + char *decodedbuf = NULL; + int size = 0; + + EXPECT_EQ(get_msgpack_unpack_status(decodedbuf, size), MSGPACK_UNPACK_NOMEM_ERROR); +} + +TEST(GetMsgpackUnpackStatusTest, MsgpackUnpackReturnsSuccess) +{ + msgpack_sbuffer sbuf; + msgpack_packer pk; + msgpack_sbuffer_init(&sbuf); + msgpack_packer_init(&pk, &sbuf, msgpack_sbuffer_write); + msgpack_pack_int(&pk, 1); + + EXPECT_EQ(get_msgpack_unpack_status(sbuf.data, sbuf.size), MSGPACK_UNPACK_SUCCESS); + + msgpack_sbuffer_destroy(&sbuf); +} + +TEST(GetMsgpackUnpackStatusTest, MsgpackUnpackReturnsExtraBytes) +{ + msgpack_sbuffer sbuf; + msgpack_packer pk; + msgpack_sbuffer_init(&sbuf); + msgpack_packer_init(&pk, &sbuf, msgpack_sbuffer_write); + // Serialize data with extra bytes + msgpack_pack_int(&pk, 1); + sbuf.data[sbuf.size] = '\0'; // Add an extra byte + + // msg_unpack_next() internally handles EXTRABYTES. It should return SUCCESS. + EXPECT_EQ(get_msgpack_unpack_status(sbuf.data, sbuf.size + 1), MSGPACK_UNPACK_SUCCESS); + + msgpack_sbuffer_destroy(&sbuf); +} + +TEST(GetMsgpackUnpackStatusTest, MsgpackUnpackReturnsOtherValidMacro) +{ + char decodedbuf[] = "dummy"; + int size = sizeof(decodedbuf); + msgpack_unpack_return unpack_ret = static_cast(999); + // This test case is illustrative; msgpack_unpack does not have a return value of 999. + + EXPECT_NE(get_msgpack_unpack_status(decodedbuf, size), unpack_ret); +} + +/* --------------- Test remotedebuggerdoc_strerror() from rrdMsgPackDecoder --------------- */ +TEST(RemoteDebuggerDocStrErrorTest, KnownError) +{ + EXPECT_STREQ(remotedebuggerdoc_strerror(OK), "No errors."); + EXPECT_STREQ(remotedebuggerdoc_strerror(OUT_OF_MEMORY), "Out of memory."); + EXPECT_STREQ(remotedebuggerdoc_strerror(INVALID_FIRST_ELEMENT), "Invalid first element."); + EXPECT_STREQ(remotedebuggerdoc_strerror(INVALID_VERSION), "Invalid 'version' value."); + EXPECT_STREQ(remotedebuggerdoc_strerror(INVALID_OBJECT), "Invalid 'value' array."); +} + +TEST(RemoteDebuggerDocStrErrorTest, UnknownError) +{ + EXPECT_STREQ(remotedebuggerdoc_strerror(MISSING_ENTRY), "Unknown error."); + EXPECT_STREQ(remotedebuggerdoc_strerror(999), "Unknown error."); // Test with an arbitrary number not in the map +} + +/* --------------- Test getReqTotalSizeOfIssueTypesStr() from rrdMsgPackDecoder --------------- */ +TEST(GetReqTotalSizeOfIssueTypesStrTest, ArraySizeZero) +{ + msgpack_object obj_array[1]; + msgpack_object_array arr = {0, obj_array}; + + EXPECT_EQ(getReqTotalSizeOfIssueTypesStr(&arr), 1); +} + +TEST(GetReqTotalSizeOfIssueTypesStrTest, ArraySizeFiveWithNonStringTypes) +{ + msgpack_object obj_array[5]; + for (int i = 0; i < 5; i++) + { + obj_array[i].type = MSGPACK_OBJECT_POSITIVE_INTEGER; + } + msgpack_object_array arr = {5, obj_array}; + + EXPECT_EQ(getReqTotalSizeOfIssueTypesStr(&arr), 6); +} + +TEST(GetReqTotalSizeOfIssueTypesStrTest, ArraySizeFiveWithStringTypes) +{ + msgpack_object obj_array[5]; + const char *test_strs[5] = {"one", "two", "three", "four", "five"}; + int total_strlen = 0; + for (int i = 0; i < 5; i++) + { + obj_array[i].type = MSGPACK_OBJECT_STR; + obj_array[i].via.str.size = strlen(test_strs[i]); + obj_array[i].via.str.ptr = test_strs[i]; + total_strlen += strlen(test_strs[i]); + } + msgpack_object_array arr = {5, obj_array}; + EXPECT_EQ(getReqTotalSizeOfIssueTypesStr(&arr), 1 + 5 + total_strlen); +} + +/* --------------- Test FreeResources_RemoteDebugger() from rrdMsgPackDecoder --------------- */ +TEST(FreeResourcesRemoteDebuggerTest, NullPointerArgument) +{ + FreeResources_RemoteDebugger(NULL); + // No assertion needed, just ensuring no crashes +} + +/* --------------- Test PrepareDataToPush() from rrdMsgPackDecoder --------------- */ +class PrepareDataToPushTest : public ::testing::Test +{ +protected: + int msqid_cpy; + key_t key_cpy; + void SetUp() override + { + msqid_cpy = msqid; + key_cpy = key; + msqid = msgget(key, IPC_CREAT | 0666); + ASSERT_NE(msqid, -1) << "Error creating message queue for testing"; + } + void TearDown() override + { + int ret = msgctl(msqid, IPC_RMID, nullptr); + ASSERT_NE(ret, -1) << "Error removing message queue used for testing"; + + msqid = msqid_cpy; + key = key_cpy; + } +}; + +TEST_F(PrepareDataToPushTest, SuccessfulExecution) +{ + remotedebuggerparam_t param; + param.length = 5; + param.commandList = (char *)"12345"; + PrepareDataToPush(¶m); + data_buf receivedBuf; + int ret = msgrcv(msqid, &receivedBuf, sizeof(receivedBuf), EVENT_MSG, 0); + + ASSERT_NE(ret, -1) << "Error receiving message from queue"; +} + +/* --------------- Test helper_convert() from rrdMsgPackDecoder --------------- */ +int mock_process_success(void *p, int num, ...) +{ + // Mock implementation of process function + return 0; // Success +} + +int mock_process_failure(void *p, int num, ...) +{ + // Mock implementation of process function that fails + return -1; // Return non-zero to indicate failure +} + +void mock_destroy(void *p) +{ + // Mock implementation of destroy function + free(p); // Free the allocated memory +} + +TEST(HelperConvertTest, BufIsNull) +{ + void *result = helper_convert(NULL, 10, 100, "wrapper", MSGPACK_OBJECT_MAP, false, mock_process_success, mock_destroy); + EXPECT_NE(result, nullptr); // malloc success + EXPECT_EQ(errno, 3); + mock_destroy(result); +} + +TEST(HelperConvertTest, MsgPackUnpackSuccessProcessSuccess) +{ + msgpack_sbuffer sbuf; + msgpack_packer pk; + msgpack_sbuffer_init(&sbuf); + msgpack_packer_init(&pk, &sbuf, msgpack_sbuffer_write); + // Create a map with one key-value pair: "parameters" -> "value" + msgpack_pack_map(&pk, 1); + msgpack_pack_str(&pk, 10); + msgpack_pack_str_body(&pk, "parameters", 10); + msgpack_pack_str(&pk, 5); + msgpack_pack_str_body(&pk, "value", 5); + void *result = helper_convert(sbuf.data, sbuf.size, 100, "parameters", MSGPACK_OBJECT_STR, false, mock_process_success, mock_destroy); + + EXPECT_NE(result, nullptr); + EXPECT_EQ(errno, 0); // Expect errno to be 0 (OK) + + msgpack_sbuffer_destroy(&sbuf); + mock_destroy(result); +} + +TEST(HelperConvertTest, MsgPackUnpackSuccessProcessFails) +{ + msgpack_sbuffer sbuf; + msgpack_packer pk; + msgpack_sbuffer_init(&sbuf); + msgpack_packer_init(&pk, &sbuf, msgpack_sbuffer_write); + // Create a map with one key-value pair: "parameters" -> "value" + msgpack_pack_map(&pk, 1); + msgpack_pack_str(&pk, 10); + msgpack_pack_str_body(&pk, "parameters", 10); + msgpack_pack_str(&pk, 5); + msgpack_pack_str_body(&pk, "value", 5); + // Call the helper_convert function with mock process that fails + void *result = helper_convert(sbuf.data, sbuf.size, 100, "parameters", MSGPACK_OBJECT_STR, false, mock_process_failure, mock_destroy); + + EXPECT_EQ(result, nullptr); + EXPECT_EQ(errno, INVALID_FIRST_ELEMENT); + + msgpack_sbuffer_destroy(&sbuf); +} + +TEST(HelperConvertTest, MsgPackWrapperConditionFalseProcessFails) +{ + msgpack_sbuffer sbuf; + msgpack_packer pk; + msgpack_sbuffer_init(&sbuf); + msgpack_packer_init(&pk, &sbuf, msgpack_sbuffer_write); + // Create a map with one key-value pair: "key" -> "value" + msgpack_pack_map(&pk, 1); + msgpack_pack_str(&pk, 3); msgpack_pack_str_body(&pk, "key", 3); msgpack_pack_str(&pk, 5); msgpack_pack_str_body(&pk, "value", 5); // Call the helper_convert function with mock process that fails void *result = helper_convert(sbuf.data, sbuf.size, 100, "key", MSGPACK_OBJECT_STR, false, mock_process_failure, mock_destroy); - EXPECT_EQ(result, nullptr); - EXPECT_EQ(errno, INVALID_FIRST_ELEMENT); + EXPECT_EQ(result, nullptr); + EXPECT_EQ(errno, INVALID_FIRST_ELEMENT); + + msgpack_sbuffer_destroy(&sbuf); +} + +TEST(HelperConvertTest, MsgPackWrapperConditionFalseProcessSuccess) +{ + msgpack_sbuffer sbuf; + msgpack_packer pk; + msgpack_sbuffer_init(&sbuf); + msgpack_packer_init(&pk, &sbuf, msgpack_sbuffer_write); + // Create a map with one key-value pair: "key" -> "value" + msgpack_pack_map(&pk, 1); + msgpack_pack_str(&pk, 3); + msgpack_pack_str_body(&pk, "key", 3); + msgpack_pack_str(&pk, 5); + msgpack_pack_str_body(&pk, "value", 5); + // Call the helper_convert function with mock process that fails + void *result = helper_convert(sbuf.data, sbuf.size, 100, "key", MSGPACK_OBJECT_STR, false, mock_process_success, mock_destroy); + + EXPECT_NE(result, nullptr); + EXPECT_EQ(errno, 0); + + msgpack_sbuffer_destroy(&sbuf); +} + +/* --------------- Test process_remotedebuggerparams() from rrdMsgPackDecoder --------------- */ +TEST(ProcessRemoteDebuggerParamsTest, TestProcessRemoteDebuggerParams) +{ + remotedebuggerparam_t rrdParam; + msgpack_object_map map; + map.size = -1; // Set map size to -1 + int result = process_remotedebuggerparams(&rrdParam, &map); + + EXPECT_EQ(result, -1); +} + +TEST(ProcessRemoteDebuggerParamsTest, TestProcessRemDebugParams_WhileTrueCondition) +{ + remotedebuggerparam_t rrdParam; + msgpack_object_map map; + msgpack_object_kv kv; + msgpack_object_str key; + msgpack_object_array arr; + // Set up invalid conditions to fail the while loop condition + map.size = 1; // Set map size to 1 (arbitrary) + kv.key.type = MSGPACK_OBJECT_ARRAY; + key.ptr = "InvalidKey"; // Using an invalid key to fail the condition + key.size = strlen(key.ptr); + kv.key.via.str = key; + kv.val.type = MSGPACK_OBJECT_STR; + kv.val.via.array = arr; + map.ptr = &kv; + int result = process_remotedebuggerparams(&rrdParam, &map); + + EXPECT_EQ(result, -1); +} + +TEST(ProcessRemoteDebuggerParamsTest, TestProcessRemDebugParams_WhilePassesMsgPackPassMatchFail) +{ + remotedebuggerparam_t rrdParam; + msgpack_object_map map; + msgpack_object_kv kv; + msgpack_object_str key; + msgpack_object_array arr; + // Set up conditions to fail the 'if (0 == match(p, "IssueType"))' condition + map.size = 1; // Set map size to 1 (arbitrary) + key.ptr = "NotIssueType"; // Using valid key to pass the first condition + key.size = strlen(key.ptr); + kv.key.type = MSGPACK_OBJECT_STR; + kv.key.via.str = key; + kv.val.type = MSGPACK_OBJECT_ARRAY; + kv.val.via.array = arr; + map.ptr = &kv; + int result = process_remotedebuggerparams(&rrdParam, &map); + + EXPECT_EQ(result, -1); +} + +TEST(ProcessRemoteDebuggerParamsTest, TestProcessRemDebugParams_WhilePassForPassIfPass) +{ + remotedebuggerparam_t rrdParam; + msgpack_object_map map; + msgpack_object_kv kv; + msgpack_object_str key; + msgpack_object_array arr; + msgpack_object str_obj; + // Set up conditions where the loop for (index = 0; index < arr->size; index++) enters but fails + map.size = 1; // Set map size to 1 (arbitrary) + key.ptr = "IssueType"; // Using valid key to pass the first condition + key.size = strlen(key.ptr); + kv.key.type = MSGPACK_OBJECT_STR; + kv.key.via.str = key; + kv.val.type = MSGPACK_OBJECT_ARRAY; + // Set arr.size to 1 to simulate a valid array + msgpack_object str; + str.type = MSGPACK_OBJECT_STR; + str.via.str.ptr = "value"; + str.via.str.size = 5; + arr.ptr = &str; + arr.size = 1; + kv.val.via.array = arr; + map.ptr = &kv; + int result = process_remotedebuggerparams(&rrdParam, &map); + + EXPECT_EQ(result, 0); +} + +TEST(ProcessRemoteDebuggerParamsTest, TestProcessRemDebugParams_LoopEnteredAndHitsCondition) +{ + remotedebuggerparam_t rrdParam; + msgpack_object_map map; + msgpack_object_kv kv; + msgpack_object_str key; + msgpack_object_array arr; + msgpack_object str_obj; + // Set up conditions where the loop for (index = 0; index < arr->size; index++) hits condition + map.size = 1; // Set map size to 1 (arbitrary) + key.ptr = "IssueType"; // Using valid key to pass the first condition + key.size = strlen(key.ptr); + kv.key.type = MSGPACK_OBJECT_STR; + kv.key.via.str = key; + kv.val.type = MSGPACK_OBJECT_ARRAY; + // Set arr.size to 2 to simulate a valid array with more than one element + msgpack_object str1; + str1.type = MSGPACK_OBJECT_STR; + str1.via.str.ptr = "value1"; + str1.via.str.size = 6; + msgpack_object str2; + str2.type = MSGPACK_OBJECT_STR; + str2.via.str.ptr = "value2"; + str2.via.str.size = 6; + arr.ptr = &str1; + arr.size = 2; + kv.val.via.array = arr; + map.ptr = &kv; + int result = process_remotedebuggerparams(&rrdParam, &map); + + EXPECT_EQ(result, 0); + + free(rrdParam.commandList); +} + +/* --------------- Test Process_RemoteDebugger_WebConfigRequest() from rrdMsgPackDecoder --------------- */ +class ProcessRRDWfgReq : public ::testing::Test +{ +protected: + void *Data = NULL; + pErr retStatus; + remotedebuggerdoc_t *premotedebuggerInfo; + int msqid_cpy; + key_t key_cpy; + + string getCurrentTestName() + { + const testing::TestInfo *const test_info = testing::UnitTest::GetInstance()->current_test_info(); + return test_info->name(); + } + + void SetUp() override + { + string test_name = getCurrentTestName(); + if (test_name == "TestPrepAndPushToQueue") + { + msqid_cpy = msqid; + key_cpy = key; + retStatus = NULL; + msqid = msgget(key, IPC_CREAT | 0666); + ASSERT_NE(msqid, -1) << "Error creating message queue for testing"; + premotedebuggerInfo = (remotedebuggerdoc_t *)malloc(sizeof(remotedebuggerdoc_t)); + premotedebuggerInfo->param = (remotedebuggerparam_t *)malloc(sizeof(remotedebuggerparam_t)); + premotedebuggerInfo->param->commandList = "command"; + premotedebuggerInfo->param->length = strlen(premotedebuggerInfo->param->commandList); + } + else + { + Data = NULL; + retStatus = NULL; + } + } + + void TearDown() override + { + string test_name = getCurrentTestName(); + if (test_name == "TestPrepAndPushToQueue") + { + if (retStatus != NULL) + { + free(retStatus); + } + if (premotedebuggerInfo != NULL) + { + if (premotedebuggerInfo->param != NULL) + { + free(premotedebuggerInfo->param); + } + free(premotedebuggerInfo); + } + int ret = msgctl(msqid, IPC_RMID, nullptr); + + ASSERT_NE(ret, -1) << "Error removing message queue used for testing"; + msqid = msqid_cpy; + key = key_cpy; + } + else + { + if (retStatus != NULL) + { + free(retStatus); + } + } + } +}; + +TEST_F(ProcessRRDWfgReq, TestNullData) +{ + retStatus = Process_RemoteDebugger_WebConfigRequest(Data); + + ASSERT_NE(retStatus, nullptr); + EXPECT_EQ(retStatus->ErrorCode, SYSCFG_FAILURE); + EXPECT_STREQ(retStatus->ErrorMsg, "failure while applying remote debugger subdoc"); +} + +TEST_F(ProcessRRDWfgReq, TestPrepAndPushToQueue) +{ + retStatus = Process_RemoteDebugger_WebConfigRequest(premotedebuggerInfo); + + ASSERT_NE(retStatus, nullptr); + EXPECT_EQ(retStatus->ErrorCode, BLOB_EXEC_SUCCESS); +} + +/* --------------- Test get_base64_decodedbuffer() from rrdMsgPackDecoder --------------- */ +class Base64DecodeTest : public ::testing::Test +{ +protected: + void SetUp() override + { + g_mockBase64 = new MockBase64(); + } + + void TearDown() override + { + delete g_mockBase64; + } +}; + +TEST_F(Base64DecodeTest, BufferIsNull) +{ + char *pString = "test"; + char **buffer = nullptr; + int size; + int result = get_base64_decodedbuffer(pString, buffer, &size); + + EXPECT_EQ(result, -1); +} + +TEST_F(Base64DecodeTest, SizeIsNull) +{ + char *pString = "test"; + char *buffer; + int *size = nullptr; + int result = get_base64_decodedbuffer(pString, &buffer, size); + + EXPECT_EQ(result, -1); +} + +TEST_F(Base64DecodeTest, PStringIsNull) +{ + char *pString = nullptr; + char *buffer; + int size; + int result = get_base64_decodedbuffer(pString, &buffer, &size); + + EXPECT_EQ(result, -1); +} + +TEST_F(Base64DecodeTest, B64BuffZero_B64DecodeFalse) +{ + char *pString = "test"; + char *buffer; + int size; + + EXPECT_CALL(*g_mockBase64, b64_get_decoded_buffer_size(::testing::_)) + .WillOnce(::testing::Return(0)); + EXPECT_CALL(*g_mockBase64, b64_decode(::testing::_, ::testing::_, ::testing::_)) + .WillOnce(::testing::Return(false)); + + int result = get_base64_decodedbuffer(pString, &buffer, &size); + + EXPECT_EQ(result, 0); + EXPECT_NE(buffer, nullptr); + EXPECT_EQ(size, 0); + + free(buffer); +} + +TEST_F(Base64DecodeTest, B64BuffZero_B64DecodeTrue) +{ + char *pString = "test"; + char *buffer; + int size; + + EXPECT_CALL(*g_mockBase64, b64_get_decoded_buffer_size(::testing::_)) + .WillOnce(::testing::Return(0)); + EXPECT_CALL(*g_mockBase64, b64_decode(::testing::_, ::testing::_, ::testing::_)) + .WillOnce(::testing::Return(true)); + + int result = get_base64_decodedbuffer(pString, &buffer, &size); + + EXPECT_EQ(result, 0); + EXPECT_NE(buffer, nullptr); + EXPECT_EQ(size, 1); + + free(buffer); +} + +TEST_F(Base64DecodeTest, B64BuffNonZero_B64DecodeFalse) +{ + char *pString = "test"; + char *buffer; + int size; + + EXPECT_CALL(*g_mockBase64, b64_get_decoded_buffer_size(::testing::_)) + .WillOnce(::testing::Return(1)); + EXPECT_CALL(*g_mockBase64, b64_decode(::testing::_, ::testing::_, ::testing::_)) + .WillOnce(::testing::Return(false)); + + int result = get_base64_decodedbuffer(pString, &buffer, &size); + + EXPECT_EQ(result, 0); + EXPECT_NE(buffer, nullptr); + EXPECT_EQ(size, 0); + + free(buffer); +} + +TEST_F(Base64DecodeTest, B64BuffNonZero_B64DecodeTrue) +{ + char *pString = "test"; + char *buffer; + int size; + + EXPECT_CALL(*g_mockBase64, b64_get_decoded_buffer_size(::testing::_)) + .WillOnce(::testing::Return(1)); + EXPECT_CALL(*g_mockBase64, b64_decode(::testing::_, ::testing::_, ::testing::_)) + .WillOnce(::testing::Return(true)); + + int result = get_base64_decodedbuffer(pString, &buffer, &size); + + EXPECT_EQ(result, 0); + EXPECT_NE(buffer, nullptr); + EXPECT_EQ(size, 1); + + free(buffer); +} + +/* --------------- Test process_remotedebuggerdoc() from rrdMsgPackDecoder --------------- */ +class RemoteDebuggerDocTest : public ::testing::Test +{ +protected: + remotedebuggerdoc_t ld; + + void SetUp() override + { + memset(&ld, 0, sizeof(ld)); + } + + void TearDown() override + { + if (ld.param) + { + if (ld.param->commandList) + { + free(ld.param->commandList); + } + free(ld.param); + } + if (ld.subdoc_name) + { + free(ld.subdoc_name); + } + } +}; + +TEST_F(RemoteDebuggerDocTest, ProcessRemoteDebuggerDocSuccess) +{ + msgpack_sbuffer sbuf; + msgpack_packer pk; + msgpack_sbuffer_init(&sbuf); + msgpack_packer_init(&pk, &sbuf, msgpack_sbuffer_write); + msgpack_pack_map(&pk, 1); + msgpack_pack_str(&pk, 4); + msgpack_pack_str_body(&pk, "test", 4); + msgpack_pack_map(&pk, 1); + msgpack_object obj; + msgpack_object obj1; + msgpack_object obj2; + msgpack_object obj3; + obj.type = MSGPACK_OBJECT_MAP; + obj.via.map.size = 1; + obj.via.map.ptr = (msgpack_object_kv *)malloc(sizeof(msgpack_object_kv)); + obj.via.map.ptr[0].key.type = MSGPACK_OBJECT_STR; + obj.via.map.ptr[0].key.via.str.ptr = "IssueType"; + obj.via.map.ptr[0].key.via.str.size = strlen("IssueType"); + obj.via.map.ptr[0].val.type = MSGPACK_OBJECT_ARRAY; + obj.via.map.ptr[0].val.via.array.size = 1; + obj.via.map.ptr[0].val.via.array.ptr = (msgpack_object *)malloc(sizeof(msgpack_object)); + obj.via.map.ptr[0].val.via.array.ptr[0].type = MSGPACK_OBJECT_STR; + obj.via.map.ptr[0].val.via.array.ptr[0].via.str.ptr = "value"; + obj.via.map.ptr[0].val.via.array.ptr[0].via.str.size = strlen("value"); + obj1.type = MSGPACK_OBJECT_STR; + obj1.via.str.ptr = "subdoc_name"; + obj1.via.str.size = strlen("subdoc_name"); + obj2.type = MSGPACK_OBJECT_POSITIVE_INTEGER; + obj2.via.u64 = 1; + obj3.type = MSGPACK_OBJECT_POSITIVE_INTEGER; + obj3.via.u64 = 1; + int result = process_remotedebuggerdoc(&ld, 4, &obj, &obj1, &obj2, &obj3); + + EXPECT_EQ(result, 0); + EXPECT_NE(ld.subdoc_name, nullptr); + EXPECT_EQ(ld.version, 1u); + EXPECT_EQ(ld.transaction_id, 1u); + EXPECT_NE(ld.param, nullptr); + EXPECT_NE(ld.param->commandList, nullptr); + + msgpack_sbuffer_destroy(&sbuf); + free(obj.via.map.ptr[0].val.via.array.ptr); + free(obj.via.map.ptr); +} + +TEST_F(RemoteDebuggerDocTest, ProcessRemoteDebuggerDocFailure) +{ + msgpack_sbuffer sbuf; + msgpack_packer pk; + msgpack_sbuffer_init(&sbuf); + msgpack_packer_init(&pk, &sbuf, msgpack_sbuffer_write); + msgpack_pack_map(&pk, 1); + msgpack_pack_str(&pk, 4); + msgpack_pack_str_body(&pk, "test", 4); + msgpack_pack_map(&pk, 1); + msgpack_object obj; + msgpack_object obj1; + msgpack_object obj2; + msgpack_object obj3; + obj.type = MSGPACK_OBJECT_MAP; + obj.via.map.size = -1; // Set size to negative to simulate the failure + obj.via.map.ptr = nullptr; + obj1.type = MSGPACK_OBJECT_STR; + obj1.via.str.ptr = "subdoc_name"; + obj1.via.str.size = strlen("subdoc_name"); + obj2.type = MSGPACK_OBJECT_POSITIVE_INTEGER; + obj2.via.u64 = 1; + obj3.type = MSGPACK_OBJECT_POSITIVE_INTEGER; + obj3.via.u64 = 1; + int result = process_remotedebuggerdoc(&ld, 4, &obj, &obj1, &obj2, &obj3); + + EXPECT_EQ(result, -1); + EXPECT_NE(ld.subdoc_name, nullptr); + EXPECT_NE(ld.param, nullptr); msgpack_sbuffer_destroy(&sbuf); } -TEST(HelperConvertTest, MsgPackWrapperConditionFalseProcessSuccess) +/* --------------- Test remotedebuggerdoc_convert() from rrdMsgPackDecoder --------------- */ +TEST(RemoteDebuggerDocConvertTest, ConvertSuccess) { msgpack_sbuffer sbuf; msgpack_packer pk; msgpack_sbuffer_init(&sbuf); msgpack_packer_init(&pk, &sbuf, msgpack_sbuffer_write); - // Create a map with one key-value pair: "key" -> "value" + msgpack_pack_map(&pk, 4); + msgpack_pack_str(&pk, 16); + msgpack_pack_str_body(&pk, "remotedebugger", 16); msgpack_pack_map(&pk, 1); - msgpack_pack_str(&pk, 3); - msgpack_pack_str_body(&pk, "key", 3); + msgpack_pack_str(&pk, 9); + msgpack_pack_str_body(&pk, "IssueType", 9); + msgpack_pack_array(&pk, 1); msgpack_pack_str(&pk, 5); msgpack_pack_str_body(&pk, "value", 5); - // Call the helper_convert function with mock process that fails - void *result = helper_convert(sbuf.data, sbuf.size, 100, "key", MSGPACK_OBJECT_STR, false, mock_process_success, mock_destroy); + msgpack_pack_str(&pk, 11); + msgpack_pack_str_body(&pk, "subdoc_name", 11); + msgpack_pack_str(&pk, 9); + msgpack_pack_str_body(&pk, "test_name", 9); + msgpack_pack_str(&pk, 7); + msgpack_pack_str_body(&pk, "version", 7); + msgpack_pack_uint32(&pk, 1); + msgpack_pack_str(&pk, 14); + msgpack_pack_str_body(&pk, "transaction_id", 14); + msgpack_pack_uint16(&pk, 123); + remotedebuggerdoc_t *result = remotedebuggerdoc_convert(sbuf.data, sbuf.size); - EXPECT_NE(result, nullptr); - EXPECT_EQ(errno, 0); + ASSERT_NE(result, nullptr); + EXPECT_STREQ(result->subdoc_name, "test_name"); + EXPECT_EQ(result->version, 1u); + EXPECT_EQ(result->transaction_id, 123u); + ASSERT_NE(result->param, nullptr); + EXPECT_STREQ(result->param->commandList, "value"); + remotedebuggerdoc_destroy(result); msgpack_sbuffer_destroy(&sbuf); } -/* --------------- Test process_remotedebuggerparams() from rrdMsgPackDecoder --------------- */ -TEST(ProcessRemoteDebuggerParamsTest, TestProcessRemoteDebuggerParams) +/* --------------- Test decodeWebCfgData() from rrdMsgPackDecoder --------------- */ +class DecodeWebCfgDataTest : public ::testing::Test { - remotedebuggerparam_t rrdParam; - msgpack_object_map map; - map.size = -1; // Set map size to -1 - int result = process_remotedebuggerparams(&rrdParam, &map); +protected: + void SetUp() override + { + g_mockBase64 = new MockBase64(); + } + void TearDown() override + { + delete g_mockBase64; + g_mockBase64 = nullptr; + } +}; +TEST_F(DecodeWebCfgDataTest, Base64DecodeFails) +{ + char *pString = nullptr; + int result = decodeWebCfgData(pString); EXPECT_EQ(result, -1); } -TEST(ProcessRemoteDebuggerParamsTest, TestProcessRemDebugParams_WhileTrueCondition) +/* TODO */ +// TEST_F(DecodeWebCfgDataTest, MsgpackUnpackFail) { +// } + +// TEST_F(DecodeWebCfgDataTest, MsgpackUnpackSuccess) { +// } + +/* ====================== rrdMain ================*/ +/* --------------- Test RRDEventThreadFunc() aka main() from rrdMain --------------- */ +class RRDEventThreadFuncTest : public ::testing::Test { - remotedebuggerparam_t rrdParam; - msgpack_object_map map; - msgpack_object_kv kv; - msgpack_object_str key; - msgpack_object_array arr; - // Set up invalid conditions to fail the while loop condition - map.size = 1; // Set map size to 1 (arbitrary) - kv.key.type = MSGPACK_OBJECT_ARRAY; - key.ptr = "InvalidKey"; // Using an invalid key to fail the condition - key.size = strlen(key.ptr); - kv.key.via.str = key; - kv.val.type = MSGPACK_OBJECT_STR; - kv.val.via.array = arr; - map.ptr = &kv; - int result = process_remotedebuggerparams(&rrdParam, &map); +protected: + int msqid_cpy; + key_t key_cpy; - EXPECT_EQ(result, -1); + string getCurrentTestName() + { + const testing::TestInfo *const test_info = testing::UnitTest::GetInstance()->current_test_info(); + return test_info->name(); + } + + void SetUp() override + { + string test_name = getCurrentTestName(); + if (test_name != "MessageReceiveFailure"){ + msqid_cpy = msqid; + key_cpy = key; + msqid = msgget(key, IPC_CREAT | 0666); + ASSERT_NE(msqid, -1) << "Error creating message queue for testing"; + } + } + void TearDown() override + { + string test_name = getCurrentTestName(); + if (test_name != "MessageReceiveFailure"){ + int ret = msgctl(msqid, IPC_RMID, nullptr); + ASSERT_NE(ret, -1) << "Error removing message queue used for testing"; + msqid = msqid_cpy; + key = key_cpy; + } + } +}; + +TEST_F(RRDEventThreadFuncTest, MessageReceiveFailure) { + void *arg = nullptr; + EXPECT_EQ(RRDEventThreadFunc(arg), arg); } -TEST(ProcessRemoteDebuggerParamsTest, TestProcessRemDebugParams_WhilePassesMsgPackPassMatchFail) +TEST_F(RRDEventThreadFuncTest, MessageReceiveSuccessDefaultType) { + data_buf rbuf; + rbuf.mtype = DEFAULT; + rbuf.mdata = strdup("Test Message"); + msgRRDHdr msgHdr; + msgHdr.mbody = malloc(sizeof(data_buf)); + ASSERT_NE(msgHdr.mbody, nullptr); + memcpy(msgHdr.mbody, &rbuf, sizeof(data_buf)); + ASSERT_NE(msgsnd(msqid, &msgHdr, sizeof(void *), 0), -1); + void *arg = nullptr; + + EXPECT_EQ(RRDEventThreadFunc(arg), arg); +} + +TEST_F(RRDEventThreadFuncTest, MessageReceiveSuccessEventMsgType) { + data_buf rbuf; + rbuf.mtype = EVENT_MSG; + rbuf.mdata = strdup("Test"); + rbuf.inDynamic = true; + rbuf.jsonPath = nullptr; + msgRRDHdr msgHdr; + msgHdr.mbody = malloc(sizeof(data_buf)); + ASSERT_NE(msgHdr.mbody, nullptr); + memcpy(msgHdr.mbody, &rbuf, sizeof(data_buf)); + ASSERT_NE(msgsnd(msqid, &msgHdr, sizeof(void *), 0), -1); + void *arg = nullptr; + + EXPECT_EQ(RRDEventThreadFunc(arg), arg); +} + +TEST_F(RRDEventThreadFuncTest, MessageReceiveSuccessWebCfgMsgType) { + data_buf rbuf; + rbuf.mtype = EVENT_WEBCFG_MSG; + rbuf.mdata = nullptr; + msgRRDHdr msgHdr; + msgHdr.mbody = malloc(sizeof(data_buf)); + ASSERT_NE(msgHdr.mbody, nullptr); + memcpy(msgHdr.mbody, &rbuf, sizeof(data_buf)); + ASSERT_NE(msgsnd(msqid, &msgHdr, sizeof(void *), 0), -1); + void *arg = nullptr; + + EXPECT_EQ(RRDEventThreadFunc(arg), arg); +} + +TEST_F(RRDEventThreadFuncTest, MessageReceiveSuccessDeepSleepEventType) { + data_buf rbuf; + rbuf.mtype = DEEPSLEEP_EVENT_MSG; + rbuf.mdata = nullptr; + msgRRDHdr msgHdr; + msgHdr.mbody = malloc(sizeof(data_buf)); + ASSERT_NE(msgHdr.mbody, nullptr); + memcpy(msgHdr.mbody, &rbuf, sizeof(data_buf)); + ASSERT_NE(msgsnd(msqid, &msgHdr, sizeof(void *), 0), -1); + void *arg = nullptr; + + EXPECT_EQ(RRDEventThreadFunc(arg), arg); +} + +#ifdef IARMBUS_SUPPORT +/* --------------- Test shadowMain() aka main() from rrdMain --------------- */ +TEST(shadowMainTest, MaintTest) { + int msqid_cpy; + key_t key_cpy; + msqid_cpy = msqid; + key_cpy = key; + msqid = msgget(key, IPC_CREAT | 0666); + ASSERT_NE(msqid, -1) << "Error creating message queue for testing"; + data_buf rbuf; + rbuf.mtype = DEFAULT; + rbuf.mdata = strdup("Test Message"); + msgRRDHdr msgHdr; + msgHdr.mbody = malloc(sizeof(data_buf)); + ASSERT_NE(msgHdr.mbody, nullptr); + memcpy(msgHdr.mbody, &rbuf, sizeof(data_buf)); + ASSERT_NE(msgsnd(msqid, &msgHdr, sizeof(void *), 0), -1); + void *arg = nullptr; + + EXPECT_EQ(shadowMain(arg), 0); + + int ret = msgctl(msqid, IPC_RMID, nullptr); + ASSERT_NE(ret, -1) << "Error removing message queue used for testing"; + msqid = msqid_cpy; + key = key_cpy; +} +#endif + +/* ================== Gtest Main ======================== */ +GTEST_API_ main(int argc, char *argv[]) { - remotedebuggerparam_t rrdParam; - msgpack_object_map map; - msgpack_object_kv kv; - msgpack_object_str key; - msgpack_object_array arr; - // Set up conditions to fail the 'if (0 == match(p, "IssueType"))' condition - map.size = 1; // Set map size to 1 (arbitrary) - key.ptr = "NotIssueType"; // Using valid key to pass the first condition - key.size = strlen(key.ptr); - kv.key.type = MSGPACK_OBJECT_STR; - kv.key.via.str = key; - kv.val.type = MSGPACK_OBJECT_ARRAY; - kv.val.via.array = arr; - map.ptr = &kv; - int result = process_remotedebuggerparams(&rrdParam, &map); + char testresults_fullfilepath[GTEST_REPORT_FILEPATH_SIZE]; + char buffer[GTEST_REPORT_FILEPATH_SIZE]; + + memset( testresults_fullfilepath, 0, GTEST_REPORT_FILEPATH_SIZE ); + memset( buffer, 0, GTEST_REPORT_FILEPATH_SIZE ); + + snprintf( testresults_fullfilepath, GTEST_REPORT_FILEPATH_SIZE, "json:%s%s" , GTEST_DEFAULT_RESULT_FILEPATH , GTEST_DEFAULT_RESULT_FILENAME); + ::testing::GTEST_FLAG(output) = testresults_fullfilepath; + ::testing::InitGoogleTest(&argc, argv); + return RUN_ALL_TESTS(); +} + +/* ====================== rrdIarm ================*/ +/* --------------- Test getBlobVersion() from rrdIarm --------------- */ +extern uint32_t gWebCfgBloBVersion; +namespace +{ + TEST(SetBlobVersionTest, SetsGlobalVariable) + { + char subdoc[] = "test_subdoc"; + uint32_t version = 5; + int result = setBlobVersion(subdoc, version); - EXPECT_EQ(result, -1); + EXPECT_EQ(result, 0); + EXPECT_EQ(gWebCfgBloBVersion, version); + } + TEST(GetBlobVersionTest, ReturnsGlobalVariable) + { + char subdoc[] = "test_subdoc"; + uint32_t result = getBlobVersion(subdoc); + + EXPECT_EQ(result, gWebCfgBloBVersion); + } } -TEST(ProcessRemoteDebuggerParamsTest, TestProcessRemDebugParams_WhilePassForPassIfPass) +/* --------------- Test RRD_data_buff_init() from rrdIarm --------------- */ +TEST(RRDDataBuffInitTest, InitializeDataBuff) { - remotedebuggerparam_t rrdParam; - msgpack_object_map map; - msgpack_object_kv kv; - msgpack_object_str key; - msgpack_object_array arr; - msgpack_object str_obj; - // Set up conditions where the loop for (index = 0; index < arr->size; index++) enters but fails - map.size = 1; // Set map size to 1 (arbitrary) - key.ptr = "IssueType"; // Using valid key to pass the first condition - key.size = strlen(key.ptr); - kv.key.type = MSGPACK_OBJECT_STR; - kv.key.via.str = key; - kv.val.type = MSGPACK_OBJECT_ARRAY; - // Set arr.size to 1 to simulate a valid array - msgpack_object str; - str.type = MSGPACK_OBJECT_STR; - str.via.str.ptr = "value"; - str.via.str.size = 5; - arr.ptr = &str; - arr.size = 1; - kv.val.via.array = arr; - map.ptr = &kv; - int result = process_remotedebuggerparams(&rrdParam, &map); + data_buf sbuf; + message_type_et sndtype = EVENT_MSG; + deepsleep_event_et deepSleepEvent = RRD_DEEPSLEEP_RDM_DOWNLOAD_PKG_INITIATE; + RRD_data_buff_init(&sbuf, sndtype, deepSleepEvent); - EXPECT_EQ(result, 0); + EXPECT_EQ(sbuf.mtype, sndtype); + EXPECT_EQ(sbuf.mdata, nullptr); + EXPECT_EQ(sbuf.jsonPath, nullptr); + EXPECT_FALSE(sbuf.inDynamic); + EXPECT_EQ(sbuf.dsEvent, deepSleepEvent); } -TEST(ProcessRemoteDebuggerParamsTest, TestProcessRemDebugParams_LoopEnteredAndHitsCondition) +/* --------------- Test RRD_data_buff_deAlloc() from rrdIarm --------------- */ +TEST(RRDDataBuffDeAllocTest, DeallocateDataBuff) { - remotedebuggerparam_t rrdParam; - msgpack_object_map map; - msgpack_object_kv kv; - msgpack_object_str key; - msgpack_object_array arr; - msgpack_object str_obj; - // Set up conditions where the loop for (index = 0; index < arr->size; index++) hits condition - map.size = 1; // Set map size to 1 (arbitrary) - key.ptr = "IssueType"; // Using valid key to pass the first condition - key.size = strlen(key.ptr); - kv.key.type = MSGPACK_OBJECT_STR; - kv.key.via.str = key; - kv.val.type = MSGPACK_OBJECT_ARRAY; - // Set arr.size to 2 to simulate a valid array with more than one element - msgpack_object str1; - str1.type = MSGPACK_OBJECT_STR; - str1.via.str.ptr = "value1"; - str1.via.str.size = 6; - msgpack_object str2; - str2.type = MSGPACK_OBJECT_STR; - str2.via.str.ptr = "value2"; - str2.via.str.size = 6; - arr.ptr = &str1; - arr.size = 2; - kv.val.via.array = arr; - map.ptr = &kv; - int result = process_remotedebuggerparams(&rrdParam, &map); + data_buf *sbuf = (data_buf *)malloc(sizeof(data_buf)); + sbuf->mdata = (char *)malloc(10 * sizeof(char)); + sbuf->jsonPath = (char *)malloc(10 * sizeof(char)); - EXPECT_EQ(result, 0); + ASSERT_NO_FATAL_FAILURE(RRD_data_buff_deAlloc(sbuf)); +} - free(rrdParam.commandList); +TEST(RRDDataBuffDeAllocTest, NullPointer) +{ + data_buf *sbuf = nullptr; + + ASSERT_NO_FATAL_FAILURE(RRD_data_buff_deAlloc(sbuf)); } -/* --------------- Test Process_RemoteDebugger_WebConfigRequest() from rrdMsgPackDecoder --------------- */ -class ProcessRRDWfgReq : public ::testing::Test +/* --------------- Test RRD_unsubscribe() from rrdIarm --------------- */ + +class RRDUnsubscribeTest : public ::testing::Test { protected: - void *Data = NULL; - pErr retStatus; - remotedebuggerdoc_t *premotedebuggerInfo; - int msqid_cpy; - key_t key_cpy; - - string getCurrentTestName() - { - const testing::TestInfo *const test_info = testing::UnitTest::GetInstance()->current_test_info(); - return test_info->name(); - } + ClientIARMMock mock; void SetUp() override { - string test_name = getCurrentTestName(); - if (test_name == "TestPrepAndPushToQueue") - { - msqid_cpy = msqid; - key_cpy = key; - retStatus = NULL; - msqid = msgget(key, IPC_CREAT | 0666); - ASSERT_NE(msqid, -1) << "Error creating message queue for testing"; - premotedebuggerInfo = (remotedebuggerdoc_t *)malloc(sizeof(remotedebuggerdoc_t)); - premotedebuggerInfo->param = (remotedebuggerparam_t *)malloc(sizeof(remotedebuggerparam_t)); - premotedebuggerInfo->param->commandList = "command"; - premotedebuggerInfo->param->length = strlen(premotedebuggerInfo->param->commandList); - } - else - { - Data = NULL; - retStatus = NULL; - } + setMock(&mock); } void TearDown() override { - string test_name = getCurrentTestName(); - if (test_name == "TestPrepAndPushToQueue") - { - if (retStatus != NULL) - { - free(retStatus); - } - if (premotedebuggerInfo != NULL) - { - if (premotedebuggerInfo->param != NULL) - { - free(premotedebuggerInfo->param); - } - free(premotedebuggerInfo); - } - int ret = msgctl(msqid, IPC_RMID, nullptr); - - ASSERT_NE(ret, -1) << "Error removing message queue used for testing"; - msqid = msqid_cpy; - key = key_cpy; - } - else - { - if (retStatus != NULL) - { - free(retStatus); - } - } + setMock(nullptr); } }; -TEST_F(ProcessRRDWfgReq, TestNullData) +TEST_F(RRDUnsubscribeTest, TestRRD_Unsubscribe_Success) { - retStatus = Process_RemoteDebugger_WebConfigRequest(Data); + EXPECT_CALL(mock, IARM_Bus_Disconnect()).WillOnce(::testing::Return(IARM_RESULT_SUCCESS)); + EXPECT_CALL(mock, IARM_Bus_Term()).WillOnce(::testing::Return(IARM_RESULT_SUCCESS)); + //EXPECT_CALL(mock, IARM_Bus_UnRegisterEventHandler(IARM_BUS_RDK_REMOTE_DEBUGGER_NAME, IARM_BUS_RDK_REMOTE_DEBUGGER_ISSUETYPE)).WillOnce(::testing::Return(IARM_RESULT_SUCCESS)); + EXPECT_CALL(mock, IARM_Bus_UnRegisterEventHandler(IARM_BUS_RDMMGR_NAME, IARM_BUS_RDMMGR_EVENT_APP_INSTALLATION_STATUS)).WillOnce(::testing::Return(IARM_RESULT_SUCCESS)); + EXPECT_CALL(mock, IARM_Bus_UnRegisterEventHandler(IARM_BUS_PWRMGR_NAME, IARM_BUS_PWRMGR_EVENT_MODECHANGED)).WillOnce(::testing::Return(IARM_RESULT_SUCCESS)); + int result = RRD_unsubscribe(); - ASSERT_NE(retStatus, nullptr); - EXPECT_EQ(retStatus->ErrorCode, SYSCFG_FAILURE); - EXPECT_STREQ(retStatus->ErrorMsg, "failure while applying remote debugger subdoc"); + EXPECT_EQ(result, IARM_RESULT_SUCCESS); } -TEST_F(ProcessRRDWfgReq, TestPrepAndPushToQueue) +TEST_F(RRDUnsubscribeTest, TestRRD_Unsubscribe_DisconnectFailure) { - retStatus = Process_RemoteDebugger_WebConfigRequest(premotedebuggerInfo); + EXPECT_CALL(mock, IARM_Bus_Disconnect()).WillOnce(::testing::Return(IARM_RESULT_FAILURE)); + int result = RRD_unsubscribe(); - ASSERT_NE(retStatus, nullptr); - EXPECT_EQ(retStatus->ErrorCode, BLOB_EXEC_SUCCESS); + EXPECT_EQ(result, IARM_RESULT_FAILURE); } -/* --------------- Test get_base64_decodedbuffer() from rrdMsgPackDecoder --------------- */ -class Base64DecodeTest : public ::testing::Test +TEST_F(RRDUnsubscribeTest, TestRRD_Unsubscribe_TermFailure) { -protected: - void SetUp() override - { - g_mockBase64 = new MockBase64(); - } + EXPECT_CALL(mock, IARM_Bus_Disconnect()).WillOnce(::testing::Return(IARM_RESULT_SUCCESS)); + EXPECT_CALL(mock, IARM_Bus_Term()).WillOnce(::testing::Return(IARM_RESULT_FAILURE)); + int result = RRD_unsubscribe(); - void TearDown() override - { - delete g_mockBase64; - } -}; + EXPECT_EQ(result, IARM_RESULT_FAILURE); +} -TEST_F(Base64DecodeTest, BufferIsNull) +TEST_F(RRDUnsubscribeTest, TestRRD_Unsubscribe_UnRegisterEventHandlerFailure) { - char *pString = "test"; - char **buffer = nullptr; - int size; - int result = get_base64_decodedbuffer(pString, buffer, &size); + EXPECT_CALL(mock, IARM_Bus_Disconnect()).WillOnce(::testing::Return(IARM_RESULT_SUCCESS)); + EXPECT_CALL(mock, IARM_Bus_Term()).WillOnce(::testing::Return(IARM_RESULT_SUCCESS)); + EXPECT_CALL(mock, IARM_Bus_UnRegisterEventHandler(::testing::_, ::testing::_)).WillOnce(::testing::Return(IARM_RESULT_FAILURE)); + int result = RRD_unsubscribe(); - EXPECT_EQ(result, -1); + EXPECT_EQ(result, IARM_RESULT_FAILURE); } -TEST_F(Base64DecodeTest, SizeIsNull) +TEST_F(RRDUnsubscribeTest, TestRRD_Unsubscribe_UnRegisterRDMMgrEventHandlerRRDFailure) { - char *pString = "test"; - char *buffer; - int *size = nullptr; - int result = get_base64_decodedbuffer(pString, &buffer, size); + EXPECT_CALL(mock, IARM_Bus_Disconnect()).WillOnce(::testing::Return(IARM_RESULT_SUCCESS)); + EXPECT_CALL(mock, IARM_Bus_Term()).WillOnce(::testing::Return(IARM_RESULT_SUCCESS)); + //EXPECT_CALL(mock, IARM_Bus_UnRegisterEventHandler(IARM_BUS_RDK_REMOTE_DEBUGGER_NAME, IARM_BUS_RDK_REMOTE_DEBUGGER_ISSUETYPE)).WillOnce(::testing::Return(IARM_RESULT_SUCCESS)); + EXPECT_CALL(mock, IARM_Bus_UnRegisterEventHandler(IARM_BUS_RDMMGR_NAME, IARM_BUS_RDMMGR_EVENT_APP_INSTALLATION_STATUS)).WillOnce(::testing::Return(IARM_RESULT_FAILURE)); + int result = RRD_unsubscribe(); - EXPECT_EQ(result, -1); + EXPECT_EQ(result, IARM_RESULT_FAILURE); } -TEST_F(Base64DecodeTest, PStringIsNull) +TEST_F(RRDUnsubscribeTest, TestRRD_Unsubscribe_UnRegisterPwrMgrEventHandlerFailure) { - char *pString = nullptr; - char *buffer; - int size; - int result = get_base64_decodedbuffer(pString, &buffer, &size); + EXPECT_CALL(mock, IARM_Bus_Disconnect()).WillOnce(::testing::Return(IARM_RESULT_SUCCESS)); + EXPECT_CALL(mock, IARM_Bus_Term()).WillOnce(::testing::Return(IARM_RESULT_SUCCESS)); + //EXPECT_CALL(mock, IARM_Bus_UnRegisterEventHandler(IARM_BUS_RDK_REMOTE_DEBUGGER_NAME, IARM_BUS_RDK_REMOTE_DEBUGGER_ISSUETYPE)).WillOnce(::testing::Return(IARM_RESULT_SUCCESS)); + EXPECT_CALL(mock, IARM_Bus_UnRegisterEventHandler(IARM_BUS_RDMMGR_NAME, IARM_BUS_RDMMGR_EVENT_APP_INSTALLATION_STATUS)).WillOnce(::testing::Return(IARM_RESULT_SUCCESS)); + EXPECT_CALL(mock, IARM_Bus_UnRegisterEventHandler(IARM_BUS_PWRMGR_NAME, IARM_BUS_PWRMGR_EVENT_MODECHANGED)).WillOnce(::testing::Return(IARM_RESULT_FAILURE)); + int result = RRD_unsubscribe(); - EXPECT_EQ(result, -1); + EXPECT_EQ(result, IARM_RESULT_FAILURE); } -TEST_F(Base64DecodeTest, B64BuffZero_B64DecodeFalse) +/* --------------- Test RRD_subscribe() from rrdIarm --------------- */ +class RRDSubscribeTest : public ::testing::Test { - char *pString = "test"; - char *buffer; - int size; +protected: + ClientIARMMock mock; + ClientWebConfigMock mock_webconfig; - EXPECT_CALL(*g_mockBase64, b64_get_decoded_buffer_size(::testing::_)) - .WillOnce(::testing::Return(0)); - EXPECT_CALL(*g_mockBase64, b64_decode(::testing::_, ::testing::_, ::testing::_)) - .WillOnce(::testing::Return(false)); + void SetUp() override + { + setMock(&mock); + setWebConfigMock(&mock_webconfig); + } - int result = get_base64_decodedbuffer(pString, &buffer, &size); + void TearDown() override + { + setMock(nullptr); + setWebConfigMock(nullptr); + } +}; - EXPECT_EQ(result, 0); - EXPECT_NE(buffer, nullptr); - EXPECT_EQ(size, 0); +TEST_F(RRDSubscribeTest, TestRRD_Subscribe_AllSuccess) +{ + EXPECT_CALL(mock, IARM_Bus_Init(RDK_REMOTE_DEBUGGER_NAME)).WillOnce(::testing::Return(IARM_RESULT_SUCCESS)); + EXPECT_CALL(mock, IARM_Bus_Connect()).WillOnce(::testing::Return(IARM_RESULT_SUCCESS)); + //EXPECT_CALL(mock, IARM_Bus_RegisterEventHandler(RDK_REMOTE_DEBUGGER_NAME, IARM_BUS_RDK_REMOTE_DEBUGGER_ISSUETYPE, ::testing::_)).WillOnce(::testing::Return(IARM_RESULT_SUCCESS)); + //EXPECT_CALL(mock, IARM_Bus_RegisterEventHandler(RDK_REMOTE_DEBUGGER_NAME, IARM_BUS_RDK_REMOTE_DEBUGGER_WEBCFGDATA, ::testing::_)).WillOnce(::testing::Return(IARM_RESULT_SUCCESS)); + EXPECT_CALL(mock, IARM_Bus_RegisterEventHandler(IARM_BUS_RDMMGR_NAME, IARM_BUS_RDMMGR_EVENT_APP_INSTALLATION_STATUS, ::testing::_)).WillOnce(::testing::Return(IARM_RESULT_SUCCESS)); + EXPECT_CALL(mock, IARM_Bus_RegisterEventHandler(IARM_BUS_PWRMGR_NAME, IARM_BUS_PWRMGR_EVENT_MODECHANGED, ::testing::_)).WillOnce(::testing::Return(IARM_RESULT_SUCCESS)); + //EXPECT_CALL(mock_webconfig, register_sub_docs_mock(_, _, _, _)).Times(1); + int result = RRD_IARM_subscribe(); - free(buffer); + //EXPECT_EQ(result, IARM_RESULT_SUCCESS); } -TEST_F(Base64DecodeTest, B64BuffZero_B64DecodeTrue) +TEST_F(RRDSubscribeTest, TestRRD_Subscribe_InitFail) { - char *pString = "test"; - char *buffer; - int size; + EXPECT_CALL(mock, IARM_Bus_Init(RDK_REMOTE_DEBUGGER_NAME)).WillOnce(::testing::Return(IARM_RESULT_FAILURE)); + int result = RRD_IARM_subscribe(); + //EXPECT_NE(result, IARM_RESULT_SUCCESS); +} - EXPECT_CALL(*g_mockBase64, b64_get_decoded_buffer_size(::testing::_)) - .WillOnce(::testing::Return(0)); - EXPECT_CALL(*g_mockBase64, b64_decode(::testing::_, ::testing::_, ::testing::_)) - .WillOnce(::testing::Return(true)); +TEST_F(RRDSubscribeTest, TestRRD_Subscribe_ConnectFail) +{ + EXPECT_CALL(mock, IARM_Bus_Init(RDK_REMOTE_DEBUGGER_NAME)).WillOnce(::testing::Return(IARM_RESULT_SUCCESS)); + EXPECT_CALL(mock, IARM_Bus_Connect()).WillOnce(::testing::Return(IARM_RESULT_FAILURE)); + int result = RRD_IARM_subscribe(); - int result = get_base64_decodedbuffer(pString, &buffer, &size); + //EXPECT_NE(result, IARM_RESULT_SUCCESS); +} - EXPECT_EQ(result, 0); - EXPECT_NE(buffer, nullptr); - EXPECT_EQ(size, 1); +TEST_F(RRDSubscribeTest, TestRRD_Subscribe_RDMMgrHandlerFail) +{ + EXPECT_CALL(mock, IARM_Bus_Init(RDK_REMOTE_DEBUGGER_NAME)).WillOnce(::testing::Return(IARM_RESULT_SUCCESS)); + EXPECT_CALL(mock, IARM_Bus_Connect()).WillOnce(::testing::Return(IARM_RESULT_SUCCESS)); + EXPECT_CALL(mock, IARM_Bus_RegisterEventHandler(IARM_BUS_RDMMGR_NAME, IARM_BUS_RDMMGR_EVENT_APP_INSTALLATION_STATUS, ::testing::_)).WillOnce(::testing::Return(IARM_RESULT_FAILURE)); + int result = RRD_IARM_subscribe(); - free(buffer); + //EXPECT_NE(result, IARM_RESULT_SUCCESS); } -TEST_F(Base64DecodeTest, B64BuffNonZero_B64DecodeFalse) +TEST_F(RRDSubscribeTest, TestRRD_Subscribe_PwrMgrHandlerFail) { - char *pString = "test"; - char *buffer; - int size; + EXPECT_CALL(mock, IARM_Bus_Init(RDK_REMOTE_DEBUGGER_NAME)).WillOnce(::testing::Return(IARM_RESULT_SUCCESS)); + EXPECT_CALL(mock, IARM_Bus_Connect()).WillOnce(::testing::Return(IARM_RESULT_SUCCESS)); + EXPECT_CALL(mock, IARM_Bus_RegisterEventHandler(IARM_BUS_RDMMGR_NAME, IARM_BUS_RDMMGR_EVENT_APP_INSTALLATION_STATUS, ::testing::_)).WillOnce(::testing::Return(IARM_RESULT_SUCCESS)); + EXPECT_CALL(mock, IARM_Bus_RegisterEventHandler(IARM_BUS_PWRMGR_NAME, IARM_BUS_PWRMGR_EVENT_MODECHANGED, ::testing::_)).WillOnce(::testing::Return(IARM_RESULT_FAILURE)); + int result = RRD_IARM_subscribe(); - EXPECT_CALL(*g_mockBase64, b64_get_decoded_buffer_size(::testing::_)) - .WillOnce(::testing::Return(1)); - EXPECT_CALL(*g_mockBase64, b64_decode(::testing::_, ::testing::_, ::testing::_)) - .WillOnce(::testing::Return(false)); + //EXPECT_NE(result, IARM_RESULT_SUCCESS); +} - int result = get_base64_decodedbuffer(pString, &buffer, &size); - EXPECT_EQ(result, 0); - EXPECT_NE(buffer, nullptr); - EXPECT_EQ(size, 0); - free(buffer); -} -TEST_F(Base64DecodeTest, B64BuffNonZero_B64DecodeTrue) +/* --------------- Test webconfigFrameworkInit() from rrdIarm --------------- */ +class WebConfigIntegrationTest : public ::testing::Test { - char *pString = "test"; - char *buffer; - int size; - - EXPECT_CALL(*g_mockBase64, b64_get_decoded_buffer_size(::testing::_)) - .WillOnce(::testing::Return(1)); - EXPECT_CALL(*g_mockBase64, b64_decode(::testing::_, ::testing::_, ::testing::_)) - .WillOnce(::testing::Return(true)); +protected: + ClientWebConfigMock mock_webconfig; - int result = get_base64_decodedbuffer(pString, &buffer, &size); + void SetUp() override + { + setWebConfigMock(&mock_webconfig); + } - EXPECT_EQ(result, 0); - EXPECT_NE(buffer, nullptr); - EXPECT_EQ(size, 1); + void TearDown() override + { + setWebConfigMock(nullptr); + } +}; - free(buffer); +TEST_F(WebConfigIntegrationTest, TestWebconfigFrameworkInit) +{ + EXPECT_CALL(mock_webconfig, register_sub_docs_mock(_, _, _, _)).Times(1); + webconfigFrameworkInit(); } -/* --------------- Test process_remotedebuggerdoc() from rrdMsgPackDecoder --------------- */ -class RemoteDebuggerDocTest : public ::testing::Test +/* --------------- Test _pwrManagerEventHandler() from rrdIarm --------------- */ +class PwrMgrEventHandlerTest : public ::testing::Test { protected: - remotedebuggerdoc_t ld; - + MockRBusApi mock_rbus_api; + string getCurrentTestName() + { + const testing::TestInfo *const test_info = testing::UnitTest::GetInstance()->current_test_info(); + return test_info->name(); + } void SetUp() override { - memset(&ld, 0, sizeof(ld)); + //RBusApiWrapper::setImpl(&mock_rbus_api); + string test_name = getCurrentTestName(); + if (test_name != "TestInvalidOwnerName" || test_name != "TestCurrentStateNotDeepSleep") + { + RBusApiWrapper::clearImpl(); + RBusApiWrapper::setImpl(&mock_rbus_api); + } + ::testing::Mock::AllowLeak(&mock_rbus_api); } - void TearDown() override { - if (ld.param) - { - if (ld.param->commandList) - { - free(ld.param->commandList); - } - free(ld.param); - } - if (ld.subdoc_name) + string test_name = getCurrentTestName(); + if (test_name != "TestInvalidOwnerName" || test_name != "TestCurrentStateNotDeepSleep") + RBusApiWrapper::clearImpl(); + /* + + if (test_name == "TestCurrentStateDeepSleepRBusOpenFail" || test_name == "TestCurrentStateDeepSleepRBusOpenSuccessRbusSetFail") { - free(ld.subdoc_name); - } + RBusApiWrapper::clearImpl(); + } */ } }; -TEST_F(RemoteDebuggerDocTest, ProcessRemoteDebuggerDocSuccess) +TEST_F(PwrMgrEventHandlerTest, TestInvalidOwnerName) { - msgpack_sbuffer sbuf; - msgpack_packer pk; - msgpack_sbuffer_init(&sbuf); - msgpack_packer_init(&pk, &sbuf, msgpack_sbuffer_write); - msgpack_pack_map(&pk, 1); - msgpack_pack_str(&pk, 4); - msgpack_pack_str_body(&pk, "test", 4); - msgpack_pack_map(&pk, 1); - msgpack_object obj; - msgpack_object obj1; - msgpack_object obj2; - msgpack_object obj3; - obj.type = MSGPACK_OBJECT_MAP; - obj.via.map.size = 1; - obj.via.map.ptr = (msgpack_object_kv *)malloc(sizeof(msgpack_object_kv)); - obj.via.map.ptr[0].key.type = MSGPACK_OBJECT_STR; - obj.via.map.ptr[0].key.via.str.ptr = "IssueType"; - obj.via.map.ptr[0].key.via.str.size = strlen("IssueType"); - obj.via.map.ptr[0].val.type = MSGPACK_OBJECT_ARRAY; - obj.via.map.ptr[0].val.via.array.size = 1; - obj.via.map.ptr[0].val.via.array.ptr = (msgpack_object *)malloc(sizeof(msgpack_object)); - obj.via.map.ptr[0].val.via.array.ptr[0].type = MSGPACK_OBJECT_STR; - obj.via.map.ptr[0].val.via.array.ptr[0].via.str.ptr = "value"; - obj.via.map.ptr[0].val.via.array.ptr[0].via.str.size = strlen("value"); - obj1.type = MSGPACK_OBJECT_STR; - obj1.via.str.ptr = "subdoc_name"; - obj1.via.str.size = strlen("subdoc_name"); - obj2.type = MSGPACK_OBJECT_POSITIVE_INTEGER; - obj2.via.u64 = 1; - obj3.type = MSGPACK_OBJECT_POSITIVE_INTEGER; - obj3.via.u64 = 1; - int result = process_remotedebuggerdoc(&ld, 4, &obj, &obj1, &obj2, &obj3); - - EXPECT_EQ(result, 0); - EXPECT_NE(ld.subdoc_name, nullptr); - EXPECT_EQ(ld.version, 1u); - EXPECT_EQ(ld.transaction_id, 1u); - EXPECT_NE(ld.param, nullptr); - EXPECT_NE(ld.param->commandList, nullptr); - - msgpack_sbuffer_destroy(&sbuf); - free(obj.via.map.ptr[0].val.via.array.ptr); - free(obj.via.map.ptr); + const char *owner = "InvalidOwner"; + IARM_EventId_t eventId = IARM_BUS_RDK_REMOTE_DEBUGGER_ISSUETYPE; + char data[] = "Test data"; + _pwrManagerEventHandler(owner, eventId, data, sizeof(data)); } -TEST_F(RemoteDebuggerDocTest, ProcessRemoteDebuggerDocFailure) +TEST_F(PwrMgrEventHandlerTest, TestCurrentStateNotDeepSleep) { - msgpack_sbuffer sbuf; - msgpack_packer pk; - msgpack_sbuffer_init(&sbuf); - msgpack_packer_init(&pk, &sbuf, msgpack_sbuffer_write); - msgpack_pack_map(&pk, 1); - msgpack_pack_str(&pk, 4); - msgpack_pack_str_body(&pk, "test", 4); - msgpack_pack_map(&pk, 1); - msgpack_object obj; - msgpack_object obj1; - msgpack_object obj2; - msgpack_object obj3; - obj.type = MSGPACK_OBJECT_MAP; - obj.via.map.size = -1; // Set size to negative to simulate the failure - obj.via.map.ptr = nullptr; - obj1.type = MSGPACK_OBJECT_STR; - obj1.via.str.ptr = "subdoc_name"; - obj1.via.str.size = strlen("subdoc_name"); - obj2.type = MSGPACK_OBJECT_POSITIVE_INTEGER; - obj2.via.u64 = 1; - obj3.type = MSGPACK_OBJECT_POSITIVE_INTEGER; - obj3.via.u64 = 1; - int result = process_remotedebuggerdoc(&ld, 4, &obj, &obj1, &obj2, &obj3); + const char *owner = IARM_BUS_PWRMGR_NAME; + IARM_EventId_t eventId = IARM_BUS_RDK_REMOTE_DEBUGGER_ISSUETYPE; + IARM_Bus_PWRMgr_EventData_t eventData; + eventData.data.state.curState = IARM_BUS_PWRMGR_POWERSTATE_ON; + eventData.data.state.newState = IARM_BUS_PWRMGR_POWERSTATE_STANDBY_DEEP_SLEEP; + _pwrManagerEventHandler(owner, eventId, &eventData, sizeof(eventData)); +} - EXPECT_EQ(result, -1); - EXPECT_NE(ld.subdoc_name, nullptr); - EXPECT_NE(ld.param, nullptr); +TEST_F(PwrMgrEventHandlerTest, TestCurrentStateDeepSleepRBusOpenSuccessRbusSetSuccess) +{ + const char *owner = IARM_BUS_PWRMGR_NAME; + IARM_EventId_t eventId = IARM_BUS_RDK_REMOTE_DEBUGGER_ISSUETYPE; + IARM_Bus_PWRMgr_EventData_t eventData; + eventData.data.state.curState = IARM_BUS_PWRMGR_POWERSTATE_STANDBY_DEEP_SLEEP; + eventData.data.state.newState = IARM_BUS_PWRMGR_POWERSTATE_ON; - msgpack_sbuffer_destroy(&sbuf); + //EXPECT_CALL(mock_rbus_api, rbus_open(_, _)).WillOnce(Return(RBUS_ERROR_SUCCESS)); + EXPECT_CALL(mock_rbus_api, rbusValue_Init(_)).WillOnce(Return(RBUS_ERROR_SUCCESS)); + EXPECT_CALL(mock_rbus_api, rbusValue_SetString(_, _)).WillOnce(Return(RBUS_ERROR_SUCCESS)); + EXPECT_CALL(mock_rbus_api, rbus_set(_, _, _, _)).WillOnce(Return(RBUS_ERROR_SUCCESS)); + _pwrManagerEventHandler(owner, eventId, &eventData, sizeof(eventData)); } -/* --------------- Test remotedebuggerdoc_convert() from rrdMsgPackDecoder --------------- */ -TEST(RemoteDebuggerDocConvertTest, ConvertSuccess) +TEST_F(PwrMgrEventHandlerTest, TestCurrentStateDeepSleepRBusOpenFail) { - msgpack_sbuffer sbuf; - msgpack_packer pk; - msgpack_sbuffer_init(&sbuf); - msgpack_packer_init(&pk, &sbuf, msgpack_sbuffer_write); - msgpack_pack_map(&pk, 4); - msgpack_pack_str(&pk, 16); - msgpack_pack_str_body(&pk, "remotedebugger", 16); - msgpack_pack_map(&pk, 1); - msgpack_pack_str(&pk, 9); - msgpack_pack_str_body(&pk, "IssueType", 9); - msgpack_pack_array(&pk, 1); - msgpack_pack_str(&pk, 5); - msgpack_pack_str_body(&pk, "value", 5); - msgpack_pack_str(&pk, 11); - msgpack_pack_str_body(&pk, "subdoc_name", 11); - msgpack_pack_str(&pk, 9); - msgpack_pack_str_body(&pk, "test_name", 9); - msgpack_pack_str(&pk, 7); - msgpack_pack_str_body(&pk, "version", 7); - msgpack_pack_uint32(&pk, 1); - msgpack_pack_str(&pk, 14); - msgpack_pack_str_body(&pk, "transaction_id", 14); - msgpack_pack_uint16(&pk, 123); - remotedebuggerdoc_t *result = remotedebuggerdoc_convert(sbuf.data, sbuf.size); + const char *owner = IARM_BUS_PWRMGR_NAME; + IARM_EventId_t eventId = IARM_BUS_RDK_REMOTE_DEBUGGER_ISSUETYPE; + IARM_Bus_PWRMgr_EventData_t eventData; + eventData.data.state.curState = IARM_BUS_PWRMGR_POWERSTATE_STANDBY_DEEP_SLEEP; + eventData.data.state.newState = IARM_BUS_PWRMGR_POWERSTATE_ON; + //EXPECT_CALL(mock_rbus_api, rbus_open(_, _)).WillOnce(Return(RBUS_ERROR_BUS_ERROR)); + EXPECT_CALL(mock_rbus_api, rbusValue_Init(_)) + .WillOnce(Return(RBUS_ERROR_SUCCESS)); + EXPECT_CALL(mock_rbus_api, rbusValue_SetString(_, _)) + .WillOnce(Return(RBUS_ERROR_SUCCESS)); + EXPECT_CALL(mock_rbus_api, rbus_set(_, _, _, _)) + .WillOnce(Return(RBUS_ERROR_SUCCESS)); + _pwrManagerEventHandler(owner, eventId, &eventData, sizeof(eventData)); +} - ASSERT_NE(result, nullptr); - EXPECT_STREQ(result->subdoc_name, "test_name"); - EXPECT_EQ(result->version, 1u); - EXPECT_EQ(result->transaction_id, 123u); - ASSERT_NE(result->param, nullptr); - EXPECT_STREQ(result->param->commandList, "value"); +TEST_F(PwrMgrEventHandlerTest, TestCurrentStateDeepSleepRBusOpenSuccessRbusSetFail) +{ + const char *owner = IARM_BUS_PWRMGR_NAME; + IARM_EventId_t eventId = IARM_BUS_RDK_REMOTE_DEBUGGER_ISSUETYPE; + IARM_Bus_PWRMgr_EventData_t eventData; + eventData.data.state.curState = IARM_BUS_PWRMGR_POWERSTATE_STANDBY_DEEP_SLEEP; + eventData.data.state.newState = IARM_BUS_PWRMGR_POWERSTATE_ON; - remotedebuggerdoc_destroy(result); - msgpack_sbuffer_destroy(&sbuf); + //EXPECT_CALL(mock_rbus_api, rbus_open(_, _)).WillOnce(Return(RBUS_ERROR_SUCCESS)); + EXPECT_CALL(mock_rbus_api, rbusValue_Init(_)).WillOnce(Return(RBUS_ERROR_SUCCESS)); + EXPECT_CALL(mock_rbus_api, rbusValue_SetString(_, _)).WillOnce(Return(RBUS_ERROR_SUCCESS)); + EXPECT_CALL(mock_rbus_api, rbus_set(_, _, _, _)).WillOnce(Return(RBUS_ERROR_BUS_ERROR)); + _pwrManagerEventHandler(owner, eventId, &eventData, sizeof(eventData)); } -/* --------------- Test decodeWebCfgData() from rrdMsgPackDecoder --------------- */ -class DecodeWebCfgDataTest : public ::testing::Test +/* --------------- Test _rdmManagerEventHandler() from rrdIarm --------------- */ +class RDMMgrEventHandlerTest : public ::testing::Test { protected: + string getCurrentTestName() + { + const testing::TestInfo *const test_info = testing::UnitTest::GetInstance()->current_test_info(); + return test_info->name(); + } + int msqid_cpy; + key_t key_cpy; void SetUp() override { - g_mockBase64 = new MockBase64(); + string test_name = getCurrentTestName(); + if (test_name == "TestFoundInCacheDownloadIsCompleteAndDEEPSLEEPIssue" || test_name == "TestFoundInCacheDownloadIsCompleteAndNotDEEPSLEEPIssue") + { + msqid_cpy = msqid; + key_cpy = key; + msqid = msgget(key, IPC_CREAT | 0666); + + ASSERT_NE(msqid, -1) << "Error creating message queue for testing"; + } } void TearDown() override { - delete g_mockBase64; - g_mockBase64 = nullptr; + string test_name = getCurrentTestName(); + if (test_name == "TestFoundInCacheDownloadIsCompleteDEEPSLEEPIssue" || test_name == "TestFoundInCacheDownloadIsCompleteAndNotDEEPSLEEPIssue") + { + int ret = msgctl(msqid, IPC_RMID, nullptr); + ASSERT_NE(ret, -1) << "Error removing message queue used for testing"; + + msqid = msqid_cpy; + key = key_cpy; + } } }; -TEST_F(DecodeWebCfgDataTest, Base64DecodeFails) +TEST_F(RDMMgrEventHandlerTest, TestInvalidOwnerName) { - char *pString = nullptr; - int result = decodeWebCfgData(pString); - EXPECT_EQ(result, -1); + const char *owner = "InvalidOwner"; + IARM_EventId_t eventId = IARM_BUS_RDK_REMOTE_DEBUGGER_ISSUETYPE; + char data[] = "Test data"; + _rdmManagerEventHandler(owner, eventId, data, sizeof(data)); } -/* TODO */ -// TEST_F(DecodeWebCfgDataTest, MsgpackUnpackFail) { -// } +TEST_F(RDMMgrEventHandlerTest, TestInvalidEventId) +{ + const char *owner = IARM_BUS_RDMMGR_NAME; + IARM_EventId_t eventId = IARM_BUS_RDK_REMOTE_DEBUGGER_MAX_EVENT; // Invalid event id + char data[] = "Test data"; + _rdmManagerEventHandler(owner, eventId, data, sizeof(data)); +} -// TEST_F(DecodeWebCfgDataTest, MsgpackUnpackSuccess) { -// } +TEST_F(RDMMgrEventHandlerTest, TestNotFoundInCache) +{ + const char *owner = IARM_BUS_RDMMGR_NAME; + IARM_EventId_t eventId = IARM_BUS_RDMMGR_EVENT_APP_INSTALLATION_STATUS; + IARM_Bus_RDMMgr_EventData_t eventData; + strncpy(eventData.rdm_pkg_info.pkg_name, "Test package", RDM_PKG_NAME_MAX_SIZE); + strncpy(eventData.rdm_pkg_info.pkg_version, "1.0.0", RDM_PKG_VERSION_MAX_SIZE); + strncpy(eventData.rdm_pkg_info.pkg_inst_path, "/path/to/package", RDM_PKG_INST_PATH_MAX_SIZE); + _rdmManagerEventHandler(owner, eventId, &eventData, sizeof(eventData)); +} -/* ====================== rrdMain ================*/ -/* --------------- Test RRDEventThreadFunc() aka main() from rrdMain --------------- */ -class RRDEventThreadFuncTest : public ::testing::Test +TEST_F(RDMMgrEventHandlerTest, TestFoundInCacheDownloadNotComplete) { -protected: - int msqid_cpy; - key_t key_cpy; + const char *owner = IARM_BUS_RDMMGR_NAME; + IARM_EventId_t eventId = IARM_BUS_RDMMGR_EVENT_APP_INSTALLATION_STATUS; + cacheData *node = (cacheData *)malloc(sizeof(cacheData)); + node->mdata = strdup("PkgData"); + node->issueString = strdup("IssueString"); + node->next = NULL; + cacheDataNode = node; + IARM_Bus_RDMMgr_EventData_t eventData; + strncpy(eventData.rdm_pkg_info.pkg_name, "PkgData", RDM_PKG_NAME_MAX_SIZE); + strncpy(eventData.rdm_pkg_info.pkg_version, "1.0.0", RDM_PKG_VERSION_MAX_SIZE); + strncpy(eventData.rdm_pkg_info.pkg_inst_path, "/path/to/package", RDM_PKG_INST_PATH_MAX_SIZE); + eventData.rdm_pkg_info.pkg_inst_status = RDM_PKG_INSTALL_ERROR; + _rdmManagerEventHandler(owner, eventId, &eventData, sizeof(eventData)); +} + +TEST_F(RDMMgrEventHandlerTest, TestFoundInCacheDownloadIsCompleteAndDEEPSLEEPIssue) +{ + const char *owner = IARM_BUS_RDMMGR_NAME; + IARM_EventId_t eventId = IARM_BUS_RDMMGR_EVENT_APP_INSTALLATION_STATUS; + cacheData *node = (cacheData *)malloc(sizeof(cacheData)); + node->mdata = strdup("PkgData"); + node->issueString = strdup("DEEPSLEEP"); + node->next = NULL; + cacheDataNode = node; + IARM_Bus_RDMMgr_EventData_t eventData; + strncpy(eventData.rdm_pkg_info.pkg_name, "PkgData", RDM_PKG_NAME_MAX_SIZE); + strncpy(eventData.rdm_pkg_info.pkg_version, "1.0.0", RDM_PKG_VERSION_MAX_SIZE); + strncpy(eventData.rdm_pkg_info.pkg_inst_path, "/path/to/package", RDM_PKG_INST_PATH_MAX_SIZE); + eventData.rdm_pkg_info.pkg_inst_status = RDM_PKG_INSTALL_COMPLETE; + _rdmManagerEventHandler(owner, eventId, &eventData, sizeof(eventData)); +} + +TEST_F(RDMMgrEventHandlerTest, TestFoundInCacheDownloadIsCompleteAndNotDEEPSLEEPIssue) +{ + const char *owner = IARM_BUS_RDMMGR_NAME; + IARM_EventId_t eventId = IARM_BUS_RDMMGR_EVENT_APP_INSTALLATION_STATUS; + cacheData *node = (cacheData *)malloc(sizeof(cacheData)); + node->mdata = strdup("PkgData"); + node->issueString = strdup("NotDeepSleepIssue"); + node->next = NULL; + cacheDataNode = node; + IARM_Bus_RDMMgr_EventData_t eventData; + strncpy(eventData.rdm_pkg_info.pkg_name, "PkgData", RDM_PKG_NAME_MAX_SIZE); + strncpy(eventData.rdm_pkg_info.pkg_version, "1.0.0", RDM_PKG_VERSION_MAX_SIZE); + strncpy(eventData.rdm_pkg_info.pkg_inst_path, "/path/to/package", RDM_PKG_INST_PATH_MAX_SIZE); + eventData.rdm_pkg_info.pkg_inst_status = RDM_PKG_INSTALL_COMPLETE; + _rdmManagerEventHandler(owner, eventId, &eventData, sizeof(eventData)); +} + +/* +/* --------------- Test _remoteDebuggerEventHandler() from rrdIarm --------------- */ + +class RemoteDebuggerEventHandlerTest : public ::testing::Test +{ +protected: string getCurrentTestName() { const testing::TestInfo *const test_info = testing::UnitTest::GetInstance()->current_test_info(); return test_info->name(); } - + int msqid_cpy; + key_t key_cpy; + MockRBusApi mock_rbus_api; void SetUp() override { string test_name = getCurrentTestName(); - if (test_name != "MessageReceiveFailure"){ + if (test_name == "TestPushIssueTypesToMsgQueueSuccess") + { + RBusApiWrapper::setImpl(&mock_rbus_api); msqid_cpy = msqid; key_cpy = key; msqid = msgget(key, IPC_CREAT | 0666); + ASSERT_NE(msqid, -1) << "Error creating message queue for testing"; } } + void TearDown() override { string test_name = getCurrentTestName(); - if (test_name != "MessageReceiveFailure"){ + if (test_name == "TestPushIssueTypesToMsgQueueSuccess") + { int ret = msgctl(msqid, IPC_RMID, nullptr); ASSERT_NE(ret, -1) << "Error removing message queue used for testing"; + msqid = msqid_cpy; key = key_cpy; } } }; -TEST_F(RRDEventThreadFuncTest, MessageReceiveFailure) { - void *arg = nullptr; - EXPECT_EQ(RRDEventThreadFunc(arg), arg); -} - -TEST_F(RRDEventThreadFuncTest, MessageReceiveSuccessDefaultType) { +TEST(ProcessIssueTypeInStaticProfileappend, ReturnsIssueDataForValidNode) +{ data_buf rbuf; - rbuf.mtype = DEFAULT; - rbuf.mdata = strdup("Test Message"); - msgRRDHdr msgHdr; - msgHdr.mbody = malloc(sizeof(data_buf)); - ASSERT_NE(msgHdr.mbody, nullptr); - memcpy(msgHdr.mbody, &rbuf, sizeof(data_buf)); - ASSERT_NE(msgsnd(msqid, &msgHdr, sizeof(void *), 0), -1); - void *arg = nullptr; + issueNodeData node; - EXPECT_EQ(RRDEventThreadFunc(arg), arg); -} + // Setup test data + memset(&rbuf, 0, sizeof(rbuf)); + memset(&node, 0, sizeof(node)); + rbuf.mdata = strdup("testData"); + // Set these values according to a valid entry in your RRD_JSON_FILE + strcpy(node.Node, "ValidNode"); + strcpy(node.subNode, "ValidSubNode"); -TEST_F(RRDEventThreadFuncTest, MessageReceiveSuccessEventMsgType) { - data_buf rbuf; - rbuf.mtype = EVENT_MSG; - rbuf.mdata = strdup("Test"); - rbuf.inDynamic = true; - rbuf.jsonPath = nullptr; - msgRRDHdr msgHdr; - msgHdr.mbody = malloc(sizeof(data_buf)); - ASSERT_NE(msgHdr.mbody, nullptr); - memcpy(msgHdr.mbody, &rbuf, sizeof(data_buf)); - ASSERT_NE(msgsnd(msqid, &msgHdr, sizeof(void *), 0), -1); - void *arg = nullptr; + issueData* result = processIssueTypeInStaticProfileappend(&rbuf, &node); + ASSERT_NE(result, nullptr); + // If your test JSON has known expected values, check them: + EXPECT_STREQ(result->rfcvalue, "ExpectedRFCValue"); + EXPECT_STREQ(result->command, "ExpectedCommand"); + EXPECT_EQ(result->timeout, 100); // Replace 100 with the expected timeout value - EXPECT_EQ(RRDEventThreadFunc(arg), arg); + free(rbuf.mdata); } -TEST_F(RRDEventThreadFuncTest, MessageReceiveSuccessWebCfgMsgType) { +TEST(ProcessIssueTypeInStaticProfileappend1, ReturnsIssueDataForValidNode) +{ data_buf rbuf; - rbuf.mtype = EVENT_WEBCFG_MSG; - rbuf.mdata = nullptr; - msgRRDHdr msgHdr; - msgHdr.mbody = malloc(sizeof(data_buf)); - ASSERT_NE(msgHdr.mbody, nullptr); - memcpy(msgHdr.mbody, &rbuf, sizeof(data_buf)); - ASSERT_NE(msgsnd(msqid, &msgHdr, sizeof(void *), 0), -1); - void *arg = nullptr; - - EXPECT_EQ(RRDEventThreadFunc(arg), arg); -} + issueNodeData node; + + // Setup test data + memset(&rbuf, 0, sizeof(rbuf)); + memset(&node, 0, sizeof(node)); + rbuf.mdata = strdup("testData"); + // Set these values according to a valid entry in your RRD_JSON_FILE + node.Node = strdup("MainNode"); + node.subNode = strdup("SubNode"); + rbuf.jsonPath = strdup("UTJson/validJson.json"); -TEST_F(RRDEventThreadFuncTest, MessageReceiveSuccessDeepSleepEventType) { - data_buf rbuf; - rbuf.mtype = DEEPSLEEP_EVENT_MSG; - rbuf.mdata = nullptr; - msgRRDHdr msgHdr; - msgHdr.mbody = malloc(sizeof(data_buf)); - ASSERT_NE(msgHdr.mbody, nullptr); - memcpy(msgHdr.mbody, &rbuf, sizeof(data_buf)); - ASSERT_NE(msgsnd(msqid, &msgHdr, sizeof(void *), 0), -1); - void *arg = nullptr; + issueData* result = processIssueTypeInStaticProfileappend(&rbuf, &node); + ASSERT_NE(result, nullptr); + // If your test JSON has known expected values, check them: + EXPECT_STREQ(result->rfcvalue, "ExpectedRFCValue"); + EXPECT_STREQ(result->command, "ExpectedCommand"); + EXPECT_EQ(result->timeout, 100); // Replace 100 with the expected timeout value - EXPECT_EQ(RRDEventThreadFunc(arg), arg); + free(rbuf.mdata); } -#ifdef IARMBUS_SUPPORT -/* --------------- Test shadowMain() aka main() from rrdMain --------------- */ -TEST(shadowMainTest, MaintTest) { - int msqid_cpy; - key_t key_cpy; - msqid_cpy = msqid; - key_cpy = key; - msqid = msgget(key, IPC_CREAT | 0666); - ASSERT_NE(msqid, -1) << "Error creating message queue for testing"; - data_buf rbuf; - rbuf.mtype = DEFAULT; - rbuf.mdata = strdup("Test Message"); - msgRRDHdr msgHdr; - msgHdr.mbody = malloc(sizeof(data_buf)); - ASSERT_NE(msgHdr.mbody, nullptr); - memcpy(msgHdr.mbody, &rbuf, sizeof(data_buf)); - ASSERT_NE(msgsnd(msqid, &msgHdr, sizeof(void *), 0), -1); - void *arg = nullptr; - - EXPECT_EQ(shadowMain(arg), 0); +/* +TEST_F(RemoteDebuggerEventHandlerTest, TestPushIssueTypesToMsgQueueSuccess) +{ + MockRBusApi mock_rbus_api; + rbusEvent_t event{}; + event.data = reinterpret_cast(0x1234); + rbusValue_t value1 = reinterpret_cast(0x5678); + rbusEventSubscription_t* subscription; + rbusHandle_t handle; + //rbusValue_Init(&value1); + + EXPECT_CALL(mock_rbus_api, rbusObject_GetValue(_, _)) + .WillOnce(Return(value1)); + EXPECT_CALL(mock_rbus_api, rbusValue_GetString(_, _)) + .WillOnce(Return("Test")); + EXPECT_CALL(mock_rbus_api, rbusValue_GetString(_, _)) + .WillOnce(Return("Test")); + + + _remoteDebuggerEventHandler(handle, &event, subscription); + data_buf receivedBuf; + int ret = msgrcv(msqid, &receivedBuf, sizeof(receivedBuf), EVENT_MSG, 0); - int ret = msgctl(msqid, IPC_RMID, nullptr); - ASSERT_NE(ret, -1) << "Error removing message queue used for testing"; - msqid = msqid_cpy; - key = key_cpy; + ASSERT_NE(ret, -1) << "Error receiving message from queue"; } -#endif +*/ -/* ================== Gtest Main ======================== */ -GTEST_API_ main(int argc, char *argv[]) +/* +TEST_F(RemoteDebuggerEventHandlerTest, TestInvalidOwnerName) { - char testresults_fullfilepath[GTEST_REPORT_FILEPATH_SIZE]; - char buffer[GTEST_REPORT_FILEPATH_SIZE]; - - memset( testresults_fullfilepath, 0, GTEST_REPORT_FILEPATH_SIZE ); - memset( buffer, 0, GTEST_REPORT_FILEPATH_SIZE ); + const char *owner = "InvalidOwner"; + IARM_EventId_t eventId = IARM_BUS_RDK_REMOTE_DEBUGGER_ISSUETYPE; + char data[] = "Test data"; + _remoteDebuggerEventHandler(owner, eventId, data, sizeof(data)); +} - snprintf( testresults_fullfilepath, GTEST_REPORT_FILEPATH_SIZE, "json:%s%s" , GTEST_DEFAULT_RESULT_FILEPATH , GTEST_DEFAULT_RESULT_FILENAME); - ::testing::GTEST_FLAG(output) = testresults_fullfilepath; - ::testing::InitGoogleTest(&argc, argv); - return RUN_ALL_TESTS(); +TEST_F(RemoteDebuggerEventHandlerTest, TestInvalidEventId) +{ + const char *owner = RDK_REMOTE_DEBUGGER_NAME; + IARM_EventId_t eventId = IARM_BUS_RDK_REMOTE_DEBUGGER_MAX_EVENT; // Invalid event id + char data[] = "Test data"; + _remoteDebuggerEventHandler(owner, eventId, data, sizeof(data)); } +*/