X-Git-Url: https://gerrit.o-ran-sc.org/r/gitweb?a=blobdiff_plain;f=RIC-E2-TERMINATION%2FsctpThread.cpp;h=a0131429cd03141bff38c850e0a73307c686acc8;hb=c40ea1f7632d62130943768c82bb4a72e6780073;hp=882ffdf327bc88c574a25ad3dfdfe4dca8df13b1;hpb=6cf28617aec735a578731b2a7e0d184223f18cda;p=ric-plt%2Fe2.git diff --git a/RIC-E2-TERMINATION/sctpThread.cpp b/RIC-E2-TERMINATION/sctpThread.cpp index 882ffdf..a013142 100644 --- a/RIC-E2-TERMINATION/sctpThread.cpp +++ b/RIC-E2-TERMINATION/sctpThread.cpp @@ -27,6 +27,11 @@ //#include "3rdparty/oranE2SM/E2SM-gNB-NRT-RANfunction-Definition.h" //#include "BuildXml.h" //#include "pugixml/src/pugixml.hpp" +#include +#include +#include +#include +#include using namespace std; //using namespace std::placeholders; @@ -41,6 +46,7 @@ using namespace prometheus; // need to expose without the include of gcov extern "C" void __gcov_flush(void); +#define LOG_FILE_CONFIG_MAP "CONFIG_MAP_NAME" static void catch_function(int signal) { __gcov_flush(); @@ -54,14 +60,187 @@ boost::shared_ptr> boostLogger double cpuClock = 0.0; bool jsonTrace = false; + +static int enable_log_change_notify(const char* fileName) +{ + int ret = -1; + struct stat fileInfo; + if ( lstat(fileName,&fileInfo) == 0 ) + { + ret = register_log_change_notify(fileName); + } + return ret; +} + + +static int register_log_change_notify(const char *fileName) +{ + pthread_attr_t cb_attr; + pthread_t tid; + pthread_attr_init(&cb_attr); + pthread_attr_setdetachstate(&cb_attr,PTHREAD_CREATE_DETACHED); + return pthread_create(&tid, &cb_attr,&monitor_loglevel_change_handler,(void *)strdup(fileName)); +} + + +static void * monitor_loglevel_change_handler(void* arg) +{ + char *fileName = (char*) arg; + int ifd; // the inotify file des + int wfd; // the watched file des + ssize_t n = 0; + char rbuf[4096]; // large read buffer as the event is var len + fd_set fds; + int res = 0; + struct timeval timeout; + char* dname=NULL; // directory name + char* bname = NULL; // basename + char* tok=NULL; + char* log_level=NULL; + + dname = strdup( fileName); // defrock the file name into dir and basename + if( (tok = strrchr( dname, '/' )) != NULL ) { + *tok = '\0'; + bname = strdup( tok+1 ); + } + + + ifd = inotify_init1( 0 ); // initialise watcher setting blocking read (no option) + if( ifd < 0 ) { + fprintf( stderr, "### ERR ### unable to initialise file watch %s\n", strerror( errno ) ); + } else { + wfd = inotify_add_watch( ifd, dname, IN_MOVED_TO | IN_CLOSE_WRITE ); // we only care about close write changes + + if( wfd < 0 ) { + fprintf( stderr, "### ERR ### unable to add watch on config file %s: %s\n", fileName, strerror( errno ) ); + } else { + + + memset( &timeout, 0, sizeof(timeout) ); + while( 1 ) { + FD_ZERO (&fds); + FD_SET (ifd, &fds); + timeout.tv_sec=1; + res = select (ifd + 1, &fds, NULL, NULL, &timeout); + if(res) + { + n = read( ifd, rbuf, sizeof( rbuf ) ); // read the event + if( n < 0 ) { + if( errno == EAGAIN ) { + } else { + fprintf( stderr, "### CRIT ### config listener read err: %s\n", strerror( errno ) ); + } + continue; + } + + //Retrieving Log Level from configmap by parsing configmap file + log_level = parse_file(fileName); + update_mdc_log_level_severity(log_level); //setting log level + free(log_level); + } + } + inotify_rm_watch(ifd,wfd); + } + close(ifd); + } + free(bname); + free(dname); + + pthread_exit(NULL); +} + +void update_mdc_log_level_severity(char* log_level) +{ + mdclog_severity_t level = MDCLOG_ERR; + + if(log_level == NULL) + { + printf("### ERR ### Invalid Log-Level Configuration in ConfigMap, Default Log-Level Applied: %d\n",level); + } + else if(strcasecmp(log_level,"1")==0) + { + level = MDCLOG_ERR; + } + else if(strcasecmp(log_level,"2")==0) + { + level = MDCLOG_WARN; + } + else if(strcasecmp(log_level,"3")==0) + { + level = MDCLOG_INFO; + } + else if(strcasecmp(log_level,"4")==0) + { + level = MDCLOG_DEBUG; + } + + mdclog_level_set(level); +} +static char* parse_file(char* filename) +{ + char *token=NULL; + char *search = ": "; + char *string_match = "log-level"; + bool found = false; + FILE *file = fopen ( filename, "r" ); + if ( file != NULL ) + { + char line [ 128 ]; + while ( fgets ( line, sizeof line, file ) != NULL ) + { + token = strtok(line, search); + if(strcmp(token,string_match)==0) + { + found = true; + token = strtok(NULL, search); + token = strtok(token, "\n");//removing newline if any + break; + } + } + fclose ( file ); + } + if(found) + return(strdup(token)); + else + return(NULL); +} + +char *read_env_param(const char*envkey) +{ + if(envkey) + { + char *value = getenv(envkey); + if(value) + return strdup(value); + } + return NULL; +} + +void dynamic_log_level_change() +{ + char *logFile_Name = read_env_param(LOG_FILE_CONFIG_MAP); + char* log_level_init=NULL; + if(logFile_Name) + { + log_level_init = parse_file(logFile_Name); + update_mdc_log_level_severity(log_level_init); //setting log level + free(log_level_init); + + } + enable_log_change_notify(logFile_Name); + free(logFile_Name); + +} + void init_log() { - int log_change_monitor = 1; + int log_change_monitor = 0; mdclog_attr_t *attr; mdclog_attr_init(&attr); mdclog_attr_set_ident(attr, "E2Terminator"); mdclog_init(attr); if(mdclog_format_initialize(log_change_monitor)!=0) mdclog_write(MDCLOG_ERR, "Failed to intialize MDC log format !!!"); + dynamic_log_level_change(); mdclog_attr_destroy(attr); } auto start_time = std::chrono::high_resolution_clock::now(); @@ -298,10 +477,6 @@ void startPrometheus(sctp_params_t &sctpParams) { int main(const int argc, char **argv) { sctp_params_t sctpParams; -#else - int e2_test_main(const int argc, char **argv, sctp_params_t &sctpParams) { -#endif - { std::random_device device{}; std::mt19937 generator(device()); @@ -351,9 +526,7 @@ int main(const int argc, char **argv) { mdclog_write(MDCLOG_ERR, "failed to open epoll descriptor"); exit(-1); } -#ifndef UNIT_TEST getRmrContext(sctpParams); -#endif if (sctpParams.rmrCtx == nullptr) { close(sctpParams.epoll_fd); exit(-1); @@ -401,6 +574,7 @@ int main(const int argc, char **argv) { return 0; } +#endif void handleTermInit(sctp_params_t &sctpParams) { sendTermInit(sctpParams); //send to e2 manager init of e2 term @@ -710,7 +884,7 @@ void listener(sctp_params_t *params) { } } #ifdef UNIT_TEST - break; + break; #endif } } @@ -723,11 +897,17 @@ void handleConfigChange(sctp_params_t *sctpParams) { char buf[4096] __attribute__ ((aligned(__alignof__(struct inotify_event)))); const struct inotify_event *event; char *ptr; - +#ifdef UNIT_TEST + struct inotify_event tmpEvent; +#endif path p = (sctpParams->configFilePath + "/" + sctpParams->configFileName).c_str(); auto endlessLoop = true; while (endlessLoop) { - auto len = read(sctpParams->inotifyFD, buf, sizeof buf); +#ifndef UNIT_TEST + auto len = read(sctpParams->inotifyFD, buf, sizeof buf); +#else + auto len=10; +#endif if (len == -1) { if (errno != EAGAIN) { mdclog_write(MDCLOG_ERR, "read %s ", strerror(errno)); @@ -741,7 +921,12 @@ void handleConfigChange(sctp_params_t *sctpParams) { } for (ptr = buf; ptr < buf + len; ptr += sizeof(struct inotify_event) + event->len) { - event = (const struct inotify_event *)ptr; +#ifndef UNIT_TEST + event = (const struct inotify_event *)ptr; +#else + tmpEvent.mask = (uint32_t)IN_CLOSE_WRITE; + event = &tmpEvent; +#endif if (event->mask & (uint32_t)IN_ISDIR) { continue; } @@ -825,6 +1010,9 @@ void handleConfigChange(sctp_params_t *sctpParams) { endlessLoop = false; } +#ifdef UNIT_TEST + break; +#endif } } } @@ -985,7 +1173,11 @@ void cleanHashEntry(ConnectedCU_t *val, Sctp_Map_t *m) { */ int sendSctpMsg(ConnectedCU_t *peerInfo, ReportingMessages_t &message, Sctp_Map_t *m) { auto loglevel = mdclog_level_get(); +#ifndef UNIT_TEST int fd = peerInfo->fileDescriptor; +#else + int fd = FILE_DESCRIPTOR; +#endif if (loglevel >= MDCLOG_DEBUG) { mdclog_write(MDCLOG_DEBUG, "Send SCTP message for CU %s, %s", message.message.enodbName, __FUNCTION__); @@ -997,13 +1189,13 @@ int sendSctpMsg(ConnectedCU_t *peerInfo, ReportingMessages_t &message, Sctp_Map_ continue; } mdclog_write(MDCLOG_ERR, "error writing to CU a message, %s ", strerror(errno)); +#ifndef UNIT_TEST if (!peerInfo->isConnected) { mdclog_write(MDCLOG_ERR, "connection to CU %s is still in progress.", message.message.enodbName); -#ifndef UNIT_TEST return -1; -#endif } cleanHashEntry(peerInfo, m); +#endif close(fd); char key[MAX_ENODB_NAME_SIZE * 2]; snprintf(key, MAX_ENODB_NAME_SIZE * 2, "msg:%s|%d", message.message.enodbName, @@ -1088,8 +1280,12 @@ int receiveDataFromSctp(struct epoll_event *events, } // read the buffer directly to rmr payload message.message.asndata = rmrMessageBuffer.sendMessage->payload; +#ifndef UNIT_TEST message.message.asnLength = rmrMessageBuffer.sendMessage->len = read(message.peerInfo->fileDescriptor, rmrMessageBuffer.sendMessage->payload, RECEIVE_SCTP_BUFFER_SIZE); +#else + message.message.asnLength = rmrMessageBuffer.sendMessage->len; +#endif if (loglevel >= MDCLOG_DEBUG) { mdclog_write(MDCLOG_DEBUG, "Finish Read from SCTP %d fd message length = %ld", @@ -1139,9 +1335,13 @@ int receiveDataFromSctp(struct epoll_event *events, printBuffer); clock_gettime(CLOCK_MONOTONIC, &decodeStart); } - +#ifndef UNIT_TEST auto rval = asn_decode(nullptr, ATS_ALIGNED_BASIC_PER, &asn_DEF_E2AP_PDU, (void **) &pdu, - message.message.asndata, message.message.asnLength); + message.message.asndata, message.message.asnLength); +#else + asn_dec_rval_t rval = {RC_OK, 0}; + pdu = (E2AP_PDU_t*)rmrMessageBuffer.sendMessage->tp_buf; +#endif if (rval.code != RC_OK) { mdclog_write(MDCLOG_ERR, "Error %d Decoding (unpack) E2AP PDU from RAN : %s", rval.code, message.peerInfo->enodbName); @@ -1192,6 +1392,10 @@ int receiveDataFromSctp(struct epoll_event *events, //ASN_STRUCT_FREE(asn_DEF_E2AP_PDU, pdu); //pdu = nullptr; } +#ifdef UNIT_TEST + done = 1; + break; +#endif } if (done) { @@ -1204,12 +1408,13 @@ int receiveDataFromSctp(struct epoll_event *events, "%s|CU disconnected unexpectedly", message.peerInfo->enodbName); message.message.asndata = rmrMessageBuffer.sendMessage->payload; - +#ifndef UNIT_TEST if (sendRequestToXapp(message, RIC_SCTP_CONNECTION_FAILURE, rmrMessageBuffer) != 0) { mdclog_write(MDCLOG_ERR, "SCTP_CONNECTION_FAIL message failed to send to xAPP"); } +#endif /* Closing descriptor make epoll remove it from the set of descriptors which are monitored. */ close(message.peerInfo->fileDescriptor); @@ -1307,8 +1512,9 @@ static void buildAndSendSetupRequest(ReportingMessages_t &message, static unsigned char tx[32]; snprintf((char *) tx, sizeof tx, "%15ld", transactionCounter++); rmr_bytes2xact(rmrMsg, tx, strlen((const char *) tx)); - +#ifndef UNIT_TEST rmrMsg = rmr_send_msg(rmrMessageBuffer.rmrCtx, rmrMsg); +#endif if (rmrMsg == nullptr) { mdclog_write(MDCLOG_ERR, "RMR failed to send returned nullptr"); } else if (rmrMsg->state != 0) { @@ -1318,7 +1524,9 @@ static void buildAndSendSetupRequest(ReportingMessages_t &message, rmrMsg->state = 0; mdclog_write(MDCLOG_INFO, "RETRY sending Message %d to Xapp from %s", rmrMsg->mtype, rmr_get_meid(rmrMsg, (unsigned char *) meid)); +#ifndef UNIT_TEST rmrMsg = rmr_send_msg(rmrMessageBuffer.rmrCtx, rmrMsg); +#endif if (rmrMsg == nullptr) { mdclog_write(MDCLOG_ERR, "RMR failed send returned nullptr"); } else if (rmrMsg->state != 0) { @@ -1902,7 +2110,7 @@ void asnUnSuccsesfulMsg(E2AP_PDU_t *pdu, #ifndef UNIT_TEST message.peerInfo->counters[IN_UN_SUCC][MSG_COUNTER][ProcedureCode_id_RICcontrol]->Increment(); message.peerInfo->counters[IN_UN_SUCC][BYTES_COUNTER][ProcedureCode_id_RICcontrol]->Increment((double)message.message.asnLength); -#endif +#endif sendRmrMessage(rmrMessageBuffer, message); messageSent = true; } else { @@ -1944,9 +2152,9 @@ void asnUnSuccsesfulMsg(E2AP_PDU_t *pdu, default: { mdclog_write(MDCLOG_WARN, "Undefined or not supported message = %ld", procedureCode); message.message.messageType = 0; // no RMR message type yet - +#ifndef UNIT_TEST buildJsonMessage(message); - +#endif break; } } @@ -2041,6 +2249,9 @@ int PER_FromXML(ReportingMessages_t &message, RmrMessagesBuffer_t &rmrMessageBuf mdclog_write(MDCLOG_DEBUG, "%s After decoding the XML to PDU", __func__ ); } if (rval.code != RC_OK) { +#ifdef UNIT_TEST + return 0; +#endif mdclog_write(MDCLOG_ERR, "Error %d Decoding (unpack) setup response from E2MGR : %s", rval.code, message.message.enodbName); @@ -2101,6 +2312,9 @@ int receiveXappMessages(Sctp_Map_t *sctpMap, // get message payload //auto msgData = msg->payload; +#ifdef UNIT_TEST + rmrMessageBuffer.rcvMessage->state = 0; +#endif if (rmrMessageBuffer.rcvMessage->state != 0) { mdclog_write(MDCLOG_ERR, "RMR Receiving message with stat = %d", rmrMessageBuffer.rcvMessage->state); return -1; @@ -2115,6 +2329,9 @@ int receiveXappMessages(Sctp_Map_t *sctpMap, case RIC_HEALTH_CHECK_REQ: break; default: +#ifdef UNIT_TEST + break; +#endif mdclog_write(MDCLOG_ERR, "Failed to send message no CU entry %s", message.message.enodbName); return -1; } @@ -2132,8 +2349,10 @@ int receiveXappMessages(Sctp_Map_t *sctpMap, if (PER_FromXML(message, rmrMessageBuffer) != 0) { break; } +#ifndef UNIT_TEST message.peerInfo->counters[OUT_SUCC][MSG_COUNTER][ProcedureCode_id_E2setup]->Increment(); message.peerInfo->counters[OUT_SUCC][BYTES_COUNTER][ProcedureCode_id_E2setup]->Increment(rmrMessageBuffer.rcvMessage->len); +#endif if (sendDirectionalSctpMsg(rmrMessageBuffer, message, 0, sctpMap) != 0) { mdclog_write(MDCLOG_ERR, "Failed to send RIC_E2_SETUP_RESP"); return -6; @@ -2147,8 +2366,10 @@ int receiveXappMessages(Sctp_Map_t *sctpMap, if (PER_FromXML(message, rmrMessageBuffer) != 0) { break; } +#ifndef UNIT_TEST message.peerInfo->counters[OUT_UN_SUCC][MSG_COUNTER][ProcedureCode_id_E2setup]->Increment(); message.peerInfo->counters[OUT_UN_SUCC][BYTES_COUNTER][ProcedureCode_id_E2setup]->Increment(rmrMessageBuffer.rcvMessage->len); +#endif if (sendDirectionalSctpMsg(rmrMessageBuffer, message, 0, sctpMap) != 0) { mdclog_write(MDCLOG_ERR, "Failed to send RIC_E2_SETUP_FAILURE"); return -6; @@ -2159,8 +2380,10 @@ int receiveXappMessages(Sctp_Map_t *sctpMap, if (loglevel >= MDCLOG_DEBUG) { mdclog_write(MDCLOG_DEBUG, "RIC_ERROR_INDICATION"); } +#ifndef UNIT_TEST message.peerInfo->counters[OUT_INITI][MSG_COUNTER][ProcedureCode_id_ErrorIndication]->Increment(); message.peerInfo->counters[OUT_INITI][BYTES_COUNTER][ProcedureCode_id_ErrorIndication]->Increment(rmrMessageBuffer.rcvMessage->len); +#endif if (sendDirectionalSctpMsg(rmrMessageBuffer, message, 0, sctpMap) != 0) { mdclog_write(MDCLOG_ERR, "Failed to send RIC_ERROR_INDICATION"); return -6; @@ -2171,8 +2394,10 @@ int receiveXappMessages(Sctp_Map_t *sctpMap, if (loglevel >= MDCLOG_DEBUG) { mdclog_write(MDCLOG_DEBUG, "RIC_SUB_REQ"); } +#ifndef UNIT_TEST message.peerInfo->counters[OUT_INITI][MSG_COUNTER][ProcedureCode_id_RICsubscription]->Increment(); message.peerInfo->counters[OUT_INITI][BYTES_COUNTER][ProcedureCode_id_RICsubscription]->Increment(rmrMessageBuffer.rcvMessage->len); +#endif if (sendDirectionalSctpMsg(rmrMessageBuffer, message, 0, sctpMap) != 0) { mdclog_write(MDCLOG_ERR, "Failed to send RIC_SUB_REQ"); return -6; @@ -2183,8 +2408,10 @@ int receiveXappMessages(Sctp_Map_t *sctpMap, if (loglevel >= MDCLOG_DEBUG) { mdclog_write(MDCLOG_DEBUG, "RIC_SUB_DEL_REQ"); } +#ifndef UNIT_TEST message.peerInfo->counters[OUT_INITI][MSG_COUNTER][ProcedureCode_id_RICsubscriptionDelete]->Increment(); message.peerInfo->counters[OUT_INITI][BYTES_COUNTER][ProcedureCode_id_RICsubscriptionDelete]->Increment(rmrMessageBuffer.rcvMessage->len); +#endif if (sendDirectionalSctpMsg(rmrMessageBuffer, message, 0, sctpMap) != 0) { mdclog_write(MDCLOG_ERR, "Failed to send RIC_SUB_DEL_REQ"); return -6; @@ -2195,8 +2422,10 @@ int receiveXappMessages(Sctp_Map_t *sctpMap, if (loglevel >= MDCLOG_DEBUG) { mdclog_write(MDCLOG_DEBUG, "RIC_CONTROL_REQ"); } +#ifndef UNIT_TEST message.peerInfo->counters[OUT_INITI][MSG_COUNTER][ProcedureCode_id_RICcontrol]->Increment(); message.peerInfo->counters[OUT_INITI][BYTES_COUNTER][ProcedureCode_id_RICcontrol]->Increment(rmrMessageBuffer.rcvMessage->len); +#endif if (sendDirectionalSctpMsg(rmrMessageBuffer, message, 0, sctpMap) != 0) { mdclog_write(MDCLOG_ERR, "Failed to send RIC_CONTROL_REQ"); return -6; @@ -2210,8 +2439,10 @@ int receiveXappMessages(Sctp_Map_t *sctpMap, if (PER_FromXML(message, rmrMessageBuffer) != 0) { break; } +#ifndef UNIT_TEST message.peerInfo->counters[OUT_INITI][MSG_COUNTER][ProcedureCode_id_RICserviceQuery]->Increment(); message.peerInfo->counters[OUT_INITI][BYTES_COUNTER][ProcedureCode_id_RICserviceQuery]->Increment(rmrMessageBuffer.rcvMessage->len); +#endif if (sendDirectionalSctpMsg(rmrMessageBuffer, message, 0, sctpMap) != 0) { mdclog_write(MDCLOG_ERR, "Failed to send RIC_SERVICE_QUERY"); return -6; @@ -2226,8 +2457,10 @@ int receiveXappMessages(Sctp_Map_t *sctpMap, mdclog_write(MDCLOG_ERR, "error in PER_FromXML"); break; } +#ifndef UNIT_TEST message.peerInfo->counters[OUT_SUCC][MSG_COUNTER][ProcedureCode_id_RICserviceUpdate]->Increment(); message.peerInfo->counters[OUT_SUCC][BYTES_COUNTER][ProcedureCode_id_RICserviceUpdate]->Increment(rmrMessageBuffer.rcvMessage->len); +#endif if (loglevel >= MDCLOG_DEBUG) { mdclog_write(MDCLOG_DEBUG, "Before sending to CU"); } @@ -2244,8 +2477,10 @@ int receiveXappMessages(Sctp_Map_t *sctpMap, if (PER_FromXML(message, rmrMessageBuffer) != 0) { break; } +#ifndef UNIT_TEST message.peerInfo->counters[OUT_UN_SUCC][MSG_COUNTER][ProcedureCode_id_RICserviceUpdate]->Increment(); message.peerInfo->counters[OUT_UN_SUCC][BYTES_COUNTER][ProcedureCode_id_RICserviceUpdate]->Increment(rmrMessageBuffer.rcvMessage->len); +#endif if (sendDirectionalSctpMsg(rmrMessageBuffer, message, 0, sctpMap) != 0) { mdclog_write(MDCLOG_ERR, "Failed to send RIC_SERVICE_UPDATE_FAILURE"); return -6; @@ -2259,8 +2494,10 @@ int receiveXappMessages(Sctp_Map_t *sctpMap, if (PER_FromXML(message, rmrMessageBuffer) != 0) { break; } +#ifndef UNIT_TEST message.peerInfo->counters[OUT_INITI][MSG_COUNTER][ProcedureCode_id_Reset]->Increment(); message.peerInfo->counters[OUT_INITI][BYTES_COUNTER][ProcedureCode_id_Reset]->Increment(rmrMessageBuffer.rcvMessage->len); +#endif if (sendDirectionalSctpMsg(rmrMessageBuffer, message, 0, sctpMap) != 0) { mdclog_write(MDCLOG_ERR, "Failed to send RIC_E2_RESET"); return -6; @@ -2274,8 +2511,10 @@ int receiveXappMessages(Sctp_Map_t *sctpMap, if (PER_FromXML(message, rmrMessageBuffer) != 0) { break; } +#ifndef UNIT_TEST message.peerInfo->counters[OUT_SUCC][MSG_COUNTER][ProcedureCode_id_Reset]->Increment(); message.peerInfo->counters[OUT_SUCC][BYTES_COUNTER][ProcedureCode_id_Reset]->Increment(rmrMessageBuffer.rcvMessage->len); +#endif if (sendDirectionalSctpMsg(rmrMessageBuffer, message, 0, sctpMap) != 0) { mdclog_write(MDCLOG_ERR, "Failed to send RIC_E2_RESET_RESP"); return -6; @@ -2327,7 +2566,9 @@ int receiveXappMessages(Sctp_Map_t *sctpMap, static unsigned char tx[32]; auto txLen = snprintf((char *) tx, sizeof tx, "%15ld", transactionCounter++); rmr_bytes2xact(rmrMessageBuffer.sendMessage, tx, txLen); +#ifndef UNIT_TEST rmrMessageBuffer.sendMessage = rmr_send_msg(rmrMessageBuffer.rmrCtx, rmrMessageBuffer.sendMessage); +#endif if (rmrMessageBuffer.sendMessage == nullptr) { rmrMessageBuffer.sendMessage = rmr_alloc_msg(rmrMessageBuffer.rmrCtx, RECEIVE_XAPP_BUFFER_SIZE); mdclog_write(MDCLOG_ERR, "Failed to send E2_TERM_KEEP_ALIVE_RESP RMR message returned NULL"); @@ -2522,9 +2763,11 @@ int modifyToEpoll(int epoll_fd, int sendRmrMessage(RmrMessagesBuffer_t &rmrMessageBuffer, ReportingMessages_t &message) { buildJsonMessage(message); - +#ifndef UNIT_TEST rmrMessageBuffer.sendMessage = rmr_send_msg(rmrMessageBuffer.rmrCtx, rmrMessageBuffer.sendMessage); - +#else + rmrMessageBuffer.sendMessage->state = RMR_ERR_RETRY; +#endif if (rmrMessageBuffer.sendMessage == nullptr) { rmrMessageBuffer.sendMessage = rmr_alloc_msg(rmrMessageBuffer.rmrCtx, RECEIVE_XAPP_BUFFER_SIZE); mdclog_write(MDCLOG_ERR, "RMR failed send message returned with NULL pointer"); @@ -2539,7 +2782,9 @@ int sendRmrMessage(RmrMessagesBuffer_t &rmrMessageBuffer, ReportingMessages_t &m mdclog_write(MDCLOG_INFO, "RETRY sending Message type %d to Xapp from %s", rmrMessageBuffer.sendMessage->mtype, rmr_get_meid(rmrMessageBuffer.sendMessage, (unsigned char *)meid)); +#ifndef UNIT_TEST rmrMessageBuffer.sendMessage = rmr_send_msg(rmrMessageBuffer.rmrCtx, rmrMessageBuffer.sendMessage); +#endif if (rmrMessageBuffer.sendMessage == nullptr) { mdclog_write(MDCLOG_ERR, "RMR failed send message returned with NULL pointer"); rmrMessageBuffer.sendMessage = rmr_alloc_msg(rmrMessageBuffer.rmrCtx, RECEIVE_XAPP_BUFFER_SIZE); @@ -2565,6 +2810,9 @@ int sendRmrMessage(RmrMessagesBuffer_t &rmrMessageBuffer, ReportingMessages_t &m } void buildJsonMessage(ReportingMessages_t &message) { +#ifdef UNIT_TEST + jsonTrace = true; +#endif if (jsonTrace) { message.outLen = sizeof(message.base64Data); base64::encode((const unsigned char *) message.message.asndata,