Skip to content

Commit

Permalink
update code coverage
Browse files Browse the repository at this point in the history
  • Loading branch information
dan-du-car committed Nov 14, 2023
1 parent c118f90 commit d517517
Show file tree
Hide file tree
Showing 4 changed files with 107 additions and 36 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -76,16 +76,12 @@ namespace RSUHealthMonitor
rsuStatusFields.push_back(field);
}
auto configTbl = _rsuWorker->GetRSUStatusConfig(_rsuMibVersion);

// Only broadcast RSU status when all required fields are present.
if (_rsuWorker && _rsuWorker->validateAllRequiredFieldsPresent(configTbl, rsuStatusFields))
{
Json::FastWriter fasterWirter;
string json_str = fasterWirter.write(rsuStatusJson);
tmx::messages::RSUStatusMessage sendRsuStatusMsg;
sendRsuStatusMsg.set_contents(json_str);
string source = RSUHealthMonitorPlugin::GetName();
BroadcastMessage(sendRsuStatusMsg, source);
PLOG(logINFO) << "Broadcast RSU status: " << json_str;
auto sendRsuStatusMsg = _rsuWorker->convertJsonToTMXMsg(rsuStatusJson);
BroadcastMessage(sendRsuStatusMsg, RSUHealthMonitorPlugin::GetName());
}
}
}
Expand Down
66 changes: 41 additions & 25 deletions src/v2i-hub/RSUHealthMonitorPlugin/src/RSUHealthMonitorWorker.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -62,7 +62,7 @@ namespace RSUHealthMonitor
return rsuStatusTbl;
}

bool RSUHealthMonitorWorker::validateAllRequiredFieldsPresent(const RSUHealthMonitor::RSUStatusConfigTable &configTbl, const vector<string> &fields) const
bool RSUHealthMonitorWorker::validateAllRequiredFieldsPresent(const RSUHealthMonitor::RSUStatusConfigTable &configTbl, const vector<string> &fields) const
{
bool isAllPresent = true;
for (const auto &config : configTbl)
Expand Down Expand Up @@ -128,40 +128,25 @@ namespace RSUHealthMonitor
PLOG(logINFO) << "Update SNMP client: RSU IP: " << _rsuIp << ", RSU port: " << _snmpPort << ", User: " << _securityUser << ", auth pass phrase: " << _authPassPhrase << ", security level: "
<< _securityLevel;
auto _snmpClientPtr = std::make_unique<snmp_client>(_rsuIp, _snmpPort, "", _securityUser, _securityLevel, _authPassPhrase, SNMP_VERSION_3, timeout);
if (_snmpClientPtr == nullptr)
{
PLOG(logERROR) << "Error creating SNMP client!";
return Json::nullValue;
}

Json::Value rsuStatuJson;
// Sending RSU SNMP call for each field as each field has its own OID.
for (const auto &config : rsuStatusConfigTbl)
{
PLOG(logINFO) << "SNMP RSU status call for field:" << config.field << ", OID: " << config.oid;
snmp_response_obj responseVal;
auto success = _snmpClientPtr->process_snmp_request(config.oid, request_type::GET, responseVal);
if (!success && config.required)
{
PLOG(logERROR) << "SNMP session stopped as the required field: " << config.field << " failed! Return empty RSU status!";
return Json::nullValue;
}

if (success && responseVal.type == snmp_response_obj::response_type::INTEGER)
if (_snmpClientPtr)
{
rsuStatuJson[config.field] = responseVal.val_int;
}
else if (success && responseVal.type == snmp_response_obj::response_type::STRING)
{
string response_str(responseVal.val_string.begin(), responseVal.val_string.end());
// Proess GPS nmea string
if (boost::iequals(config.field, "rsuGpsOutputString"))
auto success = _snmpClientPtr->process_snmp_request(config.oid, request_type::GET, responseVal);
if (!success && config.required)
{
PLOG(logERROR) << "SNMP session stopped as the required field: " << config.field << " failed! Return empty RSU status!";
return Json::nullValue;
}
else if (success)
{
auto gps = ParseRSUGPS(response_str);
rsuStatuJson["rsuGpsOutputStringLatitude"] = gps.begin()->first;
rsuStatuJson["rsuGpsOutputStringLongitude"] = gps.begin()->second;
rsuStatuJson.append(populateJson(config.field, responseVal));
}
rsuStatuJson[config.field] = response_str;
}
}
return rsuStatuJson;
Expand All @@ -172,4 +157,35 @@ namespace RSUHealthMonitor
return Json::nullValue;
}
}

Json::Value RSUHealthMonitorWorker::populateJson(const string &field, const snmp_response_obj &response) const
{
Json::Value rsuStatuJson;
if (response.type == snmp_response_obj::response_type::INTEGER)
{
rsuStatuJson[field] = response.val_int;
}
else if (response.type == snmp_response_obj::response_type::STRING)
{
string response_str(response.val_string.begin(), response.val_string.end());
// Proess GPS nmea string
if (boost::iequals(field, "rsuGpsOutputString"))
{
auto gps = ParseRSUGPS(response_str);
rsuStatuJson["rsuGpsOutputStringLatitude"] = gps.begin()->first;
rsuStatuJson["rsuGpsOutputStringLongitude"] = gps.begin()->second;
}
rsuStatuJson[field] = response_str;
}
return rsuStatuJson;
}

RSUStatusMessage RSUHealthMonitorWorker::convertJsonToTMXMsg(const Json::Value &json) const
{
Json::FastWriter fasterWirter;
string json_str = fasterWirter.write(json);
tmx::messages::RSUStatusMessage rsuStatusMsg;
rsuStatusMsg.set_contents(json_str);
return rsuStatusMsg;
}
}
25 changes: 21 additions & 4 deletions src/v2i-hub/RSUHealthMonitorPlugin/src/RSUHealthMonitorWorker.h
Original file line number Diff line number Diff line change
Expand Up @@ -10,10 +10,12 @@
#include <jsoncpp/json/json.h>
#include "SNMPClient.h"
#include <boost/algorithm/string/predicate.hpp>
#include "RSUStatusMessage.h"

using namespace std;
using namespace tmx::utils;
using namespace tmx::utils::rsu41::mib::oid;
using namespace tmx::messages;

namespace RSUHealthMonitor
{
Expand Down Expand Up @@ -65,7 +67,7 @@ namespace RSUHealthMonitor
* @param vector<string> Input RSU fields to verify
* @return True if all required fields found. Otherwise, false.
*/
bool validateAllRequiredFieldsPresent(const RSUHealthMonitor::RSUStatusConfigTable &configTbl, const vector<string> &fields) const;
bool validateAllRequiredFieldsPresent(const RSUHealthMonitor::RSUStatusConfigTable &configTbl, const vector<string> &fields) const;

/**
* @brief Parse NMEA GPS sentense and return GPS related data
Expand All @@ -87,10 +89,25 @@ namespace RSUHealthMonitor
*/
Json::Value getRSUStatus(const RSUMibVersion &mibVersion, const string &_rsuIp, uint16_t &_snmpPort, const string &_securityUser, const string &_authPassPhrase, const string &_securityLevel, long timeout);

//Delete move constructor
/***
*@brief Convert the JSON message into TMX message
@param Json Input Json value
@return RSUStatusMessage TMX message
*/
RSUStatusMessage convertJsonToTMXMsg(const Json::Value &json) const;

/**
* @brief Populate Json with snmp response object.
* @param string The field that maps to an OID.
* @param snmp_response_obj The response returned by SNMP call for the OID.
* @return Json value populated with response object.
*/
Json::Value populateJson(const string &field, const snmp_response_obj &response) const;

// Delete move constructor
RSUHealthMonitorWorker(RSUHealthMonitorWorker &&worker) = delete;
//Delete copy constructor

// Delete copy constructor
RSUHealthMonitorWorker(RSUHealthMonitorWorker &worker) = delete;
};
} // namespace RSUHealthMonitor
Original file line number Diff line number Diff line change
Expand Up @@ -61,4 +61,46 @@ namespace RSUHealthMonitor
json = _rsuWorker->getRSUStatus(RSUMibVersion::RSUMIB_V_1218, "127.0.0.1", port, "test", "test", "authPriv", 1000);
ASSERT_TRUE(json.empty());
}

TEST_F(test_RSUHealthMonitorWorker, convertJsonToTMXMsg)
{
Json::Value json;
json["rsuID"] = "RSU4.1";
json["rsuMode"] = 4;
auto rsuStatusTmxMsg = _rsuWorker->convertJsonToTMXMsg(json);
string expectedStr = "{\"rsuID\":\"RSU4.1\",\"rsuMode\":4}\n";
ASSERT_EQ(expectedStr, rsuStatusTmxMsg.to_string());
}

TEST_F(test_RSUHealthMonitorWorker, populateJson)
{
Json::Value rsuStatusJson;
snmp_response_obj stringObj;
stringObj.type = snmp_response_obj::response_type::STRING;
std::string gps_nmea_data = "$GPGGA,142440.00,3857.3065,N,07708.9734,W,2,18,0.65,86.18,M,-34.722,M,,*62";
vector<char> rgps_nmea_data_c;
copy(gps_nmea_data.begin(), gps_nmea_data.end(), back_inserter(rgps_nmea_data_c));
stringObj.val_string = rgps_nmea_data_c;

auto json = _rsuWorker->populateJson("rsuGpsOutputString", stringObj);
double expected_latitude = 38.9551;
double expected_longitude = -77.1496;
ASSERT_NEAR(expected_latitude, json["rsuGpsOutputStringLatitude"].asDouble(), 0.001);
ASSERT_NEAR(expected_longitude, json["rsuGpsOutputStringLongitude"].asDouble(), 0.001);
rsuStatusJson.append(json);

snmp_response_obj intObj;
intObj.type = snmp_response_obj::response_type::INTEGER;
intObj.val_int = 4;

json = _rsuWorker->populateJson("rsuMode", intObj);
ASSERT_EQ(4, json["rsuMode"].asInt64());
rsuStatusJson.append(json);

Json::FastWriter fasterWirter;
string json_str = fasterWirter.write(rsuStatusJson);
string expectedStr = "[{\"rsuGpsOutputString\":\"$GPGGA,142440.00,3857.3065,N,07708.9734,W,2,18,0.65,86.18,M,-34.722,M,,*62\",\"rsuGpsOutputStringLatitude\":38.955108330000002,\"rsuGpsOutputStringLongitude\":-77.149556669999996},{\"rsuMode\":4}]\n";
ASSERT_EQ(expectedStr, json_str);
}

}

0 comments on commit d517517

Please sign in to comment.