diff --git a/src/v2i-hub/RSUHealthMonitorPlugin/CMakeLists.txt b/src/v2i-hub/RSUHealthMonitorPlugin/CMakeLists.txt index d863a4bf1..2bbadf66a 100755 --- a/src/v2i-hub/RSUHealthMonitorPlugin/CMakeLists.txt +++ b/src/v2i-hub/RSUHealthMonitorPlugin/CMakeLists.txt @@ -13,7 +13,7 @@ TARGET_LINK_LIBRARIES(${PROJECT_NAME} PUBLIC tmxutils jsoncpp NemaTode) ############# enable_testing() include_directories(${PROJECT_SOURCE_DIR}/src) -add_library(${PROJECT_NAME}_lib src/RSUHealthMonitorWorker.cpp) +add_library(${PROJECT_NAME}_lib src/RSUHealthMonitorWorker.cpp src/RSUConfigurationList) target_link_libraries(${PROJECT_NAME}_lib PUBLIC tmxutils NemaTode diff --git a/src/v2i-hub/RSUHealthMonitorPlugin/manifest.json b/src/v2i-hub/RSUHealthMonitorPlugin/manifest.json index f2ee94443..5cbd9dff2 100755 --- a/src/v2i-hub/RSUHealthMonitorPlugin/manifest.json +++ b/src/v2i-hub/RSUHealthMonitorPlugin/manifest.json @@ -17,35 +17,10 @@ "default":"1", "description": "Sending RSU SNMP GET request at every configured interval. Default every 1 second. Unit of measure: second." }, - { - "key":"RSUIp", - "default":"192.168.XX.XX", - "description":"An IP address of the RSU the V2X hub is connected to." - }, - { - "key":"SNMPPort", - "default":"161", - "description":"The SNMP port for sending message or command." - }, - { - "key":"AuthPassPhrase", - "default":"dummy", - "description":"SNMP v3 authentication passphrase" - }, - { - "key":"SecurityUser", - "default":"authOnlyUser", - "description":"SNMP Security Name" - }, - { - "key":"SecurityLevel", - "default":"authPriv", - "description":"SNMP Security level" - }, - { - "key":"RSUMIBVersion", - "default":"RSU4.1", - "description":"The version of RSU MIB (Management Information Base). E.G. RSU4.1 or RSU1218. Currently only support RSU4.1" + { + "key":"RSUConfigurationList", + "default":"{ \"RSUS\": [ { \"RSUIp\": \"192.168.XX.XX\", \"SNMPPort\": \"161\", \"AuthPassPhrase\": \"dummy\", \"User\": \"authOnlyUser\", \"RSUMIBVersion\": \"RSU4.1\" },{ \"RSUIp\": \"192.168.00.XX\", \"SNMPPort\": \"162\", \"AuthPassPhrase\": \"tester\", \"User\": \"authPrivUser\", \"RSUMIBVersion\": \"RSU4.1\" }] }", + "description":"Configurations of the RSUs the V2X hub is connected to." } ] } \ No newline at end of file diff --git a/src/v2i-hub/RSUHealthMonitorPlugin/src/RSUConfigurationException.h b/src/v2i-hub/RSUHealthMonitorPlugin/src/RSUConfigurationException.h new file mode 100644 index 000000000..27e5197ca --- /dev/null +++ b/src/v2i-hub/RSUHealthMonitorPlugin/src/RSUConfigurationException.h @@ -0,0 +1,10 @@ +#pragma once + +namespace RSUHealthMonitor +{ + class RSUConfigurationException : public std::runtime_error + { + public: + using runtime_error::runtime_error; + }; +} \ No newline at end of file diff --git a/src/v2i-hub/RSUHealthMonitorPlugin/src/RSUConfigurationList.cpp b/src/v2i-hub/RSUHealthMonitorPlugin/src/RSUConfigurationList.cpp new file mode 100644 index 000000000..058ea216d --- /dev/null +++ b/src/v2i-hub/RSUHealthMonitorPlugin/src/RSUConfigurationList.cpp @@ -0,0 +1,128 @@ + +#include "RSUConfigurationList.h" + +namespace RSUHealthMonitor +{ + Json::Value RSUConfigurationList::parseJson(const std::string &rsuConfigsStr) const + { + JSONCPP_STRING err; + Json::Value root; + auto length = static_cast(rsuConfigsStr.length()); + Json::CharReaderBuilder builder; + std::unique_ptr reader(builder.newCharReader()); + if (!reader->parse(rsuConfigsStr.c_str(), rsuConfigsStr.c_str() + length, &root, &err)) + { + std::stringstream ss; + ss << "Parse RSUs raw string error: " << err; + throw RSUConfigurationException(ss.str().c_str()); + } + return root; + } + + void RSUConfigurationList::parseRSUs(const std::string &rsuConfigsStr) + { + auto json = parseJson(rsuConfigsStr); + std::vector tempConfigs; + RSUConfiguration config; + auto rsuArray = json[RSUSKey]; + if (!rsuArray.isArray()) + { + throw RSUConfigurationException("RSUConfigurationList: Missing RSUS array."); + } + for (auto i = 0; i != rsuArray.size(); i++) + { + if (rsuArray[i].isMember(RSUIpKey)) + { + config.rsuIp = rsuArray[i][RSUIpKey].asString(); + } + else + { + auto errMsg = "RSUConfigurationList [" + std::to_string(i + 1) + "]: RSU IP [" + std::string(RSUIpKey) + "] is required."; + throw RSUConfigurationException(errMsg); + } + + if (rsuArray[i].isMember(SNMPPortKey)) + { + auto port = static_cast(atoi(rsuArray[i][SNMPPortKey].asCString())); + auto errMsg = "RSUConfigurationList [" + std::to_string(i + 1) + "]: Invalid SNMP port number in string format."; + port != 0 ? config.snmpPort = port : throw RSUConfigurationException(errMsg); + } + else + { + auto errMsg = "RSUConfigurationList [" + std::to_string(i + 1) + "]: SNMP port [" + std::string(SNMPPortKey) + "] is required."; + throw RSUConfigurationException(errMsg); + } + + if (rsuArray[i].isMember(AuthPassPhraseKey)) + { + config.authPassPhrase = rsuArray[i][AuthPassPhraseKey].asString(); + } + else + { + auto errMsg = "RSUConfigurationList [" + std::to_string(i + 1) + "]: Authentication pass phrase [" + std::string(AuthPassPhraseKey) + "] is required."; + throw RSUConfigurationException(errMsg); + } + + if (rsuArray[i].isMember(UserKey)) + { + config.user = rsuArray[i][UserKey].asString(); + } + else + { + auto errMsg = "RSUConfigurationList [" + std::to_string(i + 1) + "]: User [" + std::string(UserKey) + "] is required."; + throw RSUConfigurationException(errMsg); + } + + if (rsuArray[i].isMember(RSUMIBVersionKey)) + { + auto rsuMIBVersionStr = rsuArray[i][RSUMIBVersionKey].asString(); + config.mibVersion = strToMibVersion(rsuMIBVersionStr); + } + else + { + auto errMsg = "RSUConfigurationList [" + std::to_string(i + 1) + "]: RSU MIB version [" + std::string(RSUMIBVersionKey) + "] is required."; + throw RSUConfigurationException(errMsg); + } + tempConfigs.push_back(config); + } + // Only update RSU configurations when all configs are processed correctly. + configs.clear(); + configs.assign(tempConfigs.begin(), tempConfigs.end()); + } + + RSUMibVersion RSUConfigurationList::strToMibVersion(std::string &mibVersionStr) const + { + boost::trim_left(mibVersionStr); + boost::trim_right(mibVersionStr); + // Only support RSU MIB version 4.1 + if (boost::iequals(mibVersionStr, RSU4_1_str)) + { + return RSUMibVersion::RSUMIB_V_4_1; + } + else + { + std::stringstream ss; + ss << "Uknown RSU MIB version: " << mibVersionStr; + throw RSUConfigurationException(ss.str().c_str()); + } + } + + std::vector RSUConfigurationList::getConfigs() const + { + return configs; + } + + std::ostream &operator<<(std::ostream &os, const RSUMibVersion &mib) + { + const std::vector nameMibs = {"UNKOWN MIB", + "RSU4.1", + "NTCIP1218"}; + return os << nameMibs[static_cast(mib)]; + } + + std::ostream &operator<<(std::ostream &os, const RSUConfiguration &config) + { + os << RSUIpKey << ": " << config.rsuIp << ", " << SNMPPortKey << ": " << config.snmpPort << ", " << UserKey << ": " << config.user << ", " << AuthPassPhraseKey << ": " << config.authPassPhrase << ", " << SecurityLevelKey << ": " << config.securityLevel << ", " << RSUMIBVersionKey << ": " << config.mibVersion; + return os; + } +} \ No newline at end of file diff --git a/src/v2i-hub/RSUHealthMonitorPlugin/src/RSUConfigurationList.h b/src/v2i-hub/RSUHealthMonitorPlugin/src/RSUConfigurationList.h new file mode 100644 index 000000000..5938ec7fb --- /dev/null +++ b/src/v2i-hub/RSUHealthMonitorPlugin/src/RSUConfigurationList.h @@ -0,0 +1,65 @@ +#pragma once +#include +#include +#include +#include +#include +#include "RSUConfigurationException.h" + +namespace RSUHealthMonitor +{ + static constexpr const char *RSUSKey = "RSUS"; + static constexpr const char *RSUIpKey = "RSUIp"; + static constexpr const char *SNMPPortKey = "SNMPPort"; + static constexpr const char *UserKey = "User"; + static constexpr const char *AuthPassPhraseKey = "AuthPassPhrase"; + static constexpr const char *RSUMIBVersionKey = "RSUMIBVersion"; + static constexpr const char *SecurityLevelKey = "SecurityLevel"; + static constexpr const char *RSU4_1_str = "RSU4.1"; + static constexpr const char *RSU1218_str = "RSU1218"; + + enum class RSUMibVersion + { + UNKOWN_MIB_V = 0, + RSUMIB_V_4_1 = 1, + RSUMIB_V_1218 = 2 + }; + + struct RSUConfiguration + { + std::string rsuIp; + uint16_t snmpPort; + std::string user; + std::string authPassPhrase; + std::string securityLevel = "authPriv"; + RSUMibVersion mibVersion; + friend std::ostream &operator<<(std::ostream &os, const RSUConfiguration &config); + }; + + class RSUConfigurationList + { + private: + std::vector configs; + /*** + * @brief Parse JSON string and return the corresponding JSON value. + * @param rsuConfigsStr A JSON string includes all RSUs related configrations. + * @return JSON::Value A JSON object that includes RSUS information. + */ + Json::Value parseJson(const std::string &rsuConfigsStr) const; + RSUMibVersion strToMibVersion(std::string &mibVersionStr) const; + + public: + RSUConfigurationList() = default; + ~RSUConfigurationList() = default; + /** + * @brief Parse RSUs configrations in JSON string representation, and update the memeber of list of RSUConfiguration struct. + * @param rsuConfigsStr A JSON string includes all RSUs related configrations. + */ + void parseRSUs(const std::string &rsuConfigsStr); + /** + * @brief Get a list of RSUConfiguration struct. + */ + std::vector getConfigs() const; + }; + +} // namespace RSUHealthMonitor diff --git a/src/v2i-hub/RSUHealthMonitorPlugin/src/RSUHealthMonitorPlugin.cpp b/src/v2i-hub/RSUHealthMonitorPlugin/src/RSUHealthMonitorPlugin.cpp index 8d81a3b6c..ea4a0ce09 100755 --- a/src/v2i-hub/RSUHealthMonitorPlugin/src/RSUHealthMonitorPlugin.cpp +++ b/src/v2i-hub/RSUHealthMonitorPlugin/src/RSUHealthMonitorPlugin.cpp @@ -10,49 +10,44 @@ namespace RSUHealthMonitor { _rsuWorker = std::make_shared(); _rsuStatusTimer = make_unique(); + _rsuConfigListPtr = std::make_shared(); UpdateConfigSettings(); // Send SNMP call to RSU periodically at configurable interval. _timerThId = _rsuStatusTimer->AddPeriodicTick([this]() { - // Periodic SNMP call to get RSU status based on RSU MIB version 4.1 - auto rsuStatusJson = _rsuWorker->getRSUStatus(_rsuMibVersion, _rsuIp, _snmpPort, _securityUser, _authPassPhrase, _securityLevel, SEC_TO_MICRO); - PLOG(logINFO) << "Updating _interval: " << _interval; - //Broadcast RSU status periodically at _interval - BroadcastRSUStatus(rsuStatusJson); }, + this->monitorRSUs(); + PLOG(logINFO) << "Monitoring RSU at interval (second): " << _interval; }, std::chrono::milliseconds(_interval * SEC_TO_MILLI)); _rsuStatusTimer->Start(); } + void RSUHealthMonitorPlugin::monitorRSUs() + { + for (auto rsuConfig : _rsuConfigListPtr->getConfigs()) + { + auto rsuStatusJson = _rsuWorker->getRSUStatus(rsuConfig.mibVersion, rsuConfig.rsuIp, rsuConfig.snmpPort, rsuConfig.user, rsuConfig.authPassPhrase, rsuConfig.securityLevel, SEC_TO_MICRO); + BroadcastRSUStatus(rsuStatusJson, rsuConfig.mibVersion); + } + } + void RSUHealthMonitorPlugin::UpdateConfigSettings() { PLOG(logINFO) << "Updating configuration settings."; lock_guard lock(_configMutex); GetConfigValue("Interval", _interval); - GetConfigValue("RSUIp", _rsuIp); - GetConfigValue("SNMPPort", _snmpPort); - GetConfigValue("AuthPassPhrase", _authPassPhrase); - GetConfigValue("SecurityUser", _securityUser); - GetConfigValue("SecurityLevel", _securityLevel); - GetConfigValue("RSUMIBVersion", _rsuMIBVersionStr); - boost::trim_left(_rsuMIBVersionStr); - boost::trim_right(_rsuMIBVersionStr); - // Support RSU MIB version 4.1 - if (boost::iequals(_rsuMIBVersionStr, RSU4_1_str)) - { - _rsuMibVersion = RSUMibVersion::RSUMIB_V_4_1; - } - else - { - _rsuMibVersion = RSUMibVersion::UNKOWN_MIB_V; - PLOG(logERROR) << "Uknown RSU MIB version: " << _rsuMIBVersionStr; - } + GetConfigValue("RSUConfigurationList", _rsuConfigListStr); try { + _rsuConfigListPtr->parseRSUs(_rsuConfigListStr); _rsuStatusTimer->ChangeFrequency(_timerThId, std::chrono::milliseconds(_interval * SEC_TO_MILLI)); } + catch (const RSUConfigurationException &ex) + { + PLOG(logERROR) << "Cannot update RSU configurations due to error: " << ex.what(); + } catch (const tmx::TmxException &ex) { PLOG(logERROR) << ex.what(); @@ -65,13 +60,13 @@ namespace RSUHealthMonitor UpdateConfigSettings(); } - void RSUHealthMonitorPlugin::BroadcastRSUStatus(const Json::Value &rsuStatusJson) + void RSUHealthMonitorPlugin::BroadcastRSUStatus(const Json::Value &rsuStatusJson, const RSUMibVersion &mibVersion) { // Broadcast the RSU status info when there are RSU responses. if (!rsuStatusJson.empty() && _rsuWorker) { auto rsuStatusFields = _rsuWorker->getJsonKeys(rsuStatusJson); - auto configTbl = _rsuWorker->GetRSUStatusConfig(_rsuMibVersion); + auto configTbl = _rsuWorker->GetRSUStatusConfig(mibVersion); // Only broadcast RSU status when all required fields are present. if (_rsuWorker->validateAllRequiredFieldsPresent(configTbl, rsuStatusFields)) diff --git a/src/v2i-hub/RSUHealthMonitorPlugin/src/RSUHealthMonitorPlugin.h b/src/v2i-hub/RSUHealthMonitorPlugin/src/RSUHealthMonitorPlugin.h index 47d8ee1bd..e41ec8d8c 100755 --- a/src/v2i-hub/RSUHealthMonitorPlugin/src/RSUHealthMonitorPlugin.h +++ b/src/v2i-hub/RSUHealthMonitorPlugin/src/RSUHealthMonitorPlugin.h @@ -5,6 +5,7 @@ #include #include "RSUStatusMessage.h" #include "RSUHealthMonitorWorker.h" +#include "RSUConfigurationList.h" using namespace tmx::utils; using namespace std; @@ -17,15 +18,8 @@ namespace RSUHealthMonitor private: mutex _configMutex; uint16_t _interval; - string _rsuIp; - uint16_t _snmpPort; - string _authPassPhrase; - string _securityUser; - string _securityLevel; - string _rsuMIBVersionStr; - RSUMibVersion _rsuMibVersion; - const char *RSU4_1_str = "RSU4.1"; - const char *RSU1218_str = "RSU1218"; + string _rsuConfigListStr; + shared_ptr _rsuConfigListPtr; shared_ptr _rsuWorker; unique_ptr _rsuStatusTimer; uint _timerThId; @@ -35,12 +29,13 @@ namespace RSUHealthMonitor * @brief Broadcast RSU status * @param Json::Value RSU status in JSON format */ - void BroadcastRSUStatus(const Json::Value& rsuStatusJson); + void BroadcastRSUStatus(const Json::Value &rsuStatusJson, const RSUMibVersion &mibVersion); public: explicit RSUHealthMonitorPlugin(const std::string &name); void UpdateConfigSettings(); void OnConfigChanged(const char *key, const char *value) override; + void monitorRSUs(); }; } // namespace RSUHealthMonitorPlugin \ No newline at end of file diff --git a/src/v2i-hub/RSUHealthMonitorPlugin/src/RSUHealthMonitorWorker.cpp b/src/v2i-hub/RSUHealthMonitorPlugin/src/RSUHealthMonitorWorker.cpp index 6ac62f9fc..7c972cc75 100644 --- a/src/v2i-hub/RSUHealthMonitorPlugin/src/RSUHealthMonitorWorker.cpp +++ b/src/v2i-hub/RSUHealthMonitorPlugin/src/RSUHealthMonitorWorker.cpp @@ -125,7 +125,7 @@ namespace RSUHealthMonitor try { // Create SNMP client and use SNMP V3 protocol - PLOG(logINFO) << "Update SNMP client: RSU IP: " << _rsuIp << ", RSU port: " << _snmpPort << ", User: " << _securityUser << ", auth pass phrase: " << _authPassPhrase << ", security level: " + PLOG(logINFO) << "SNMP client: RSU IP: " << _rsuIp << ", RSU port: " << _snmpPort << ", User: " << _securityUser << ", auth pass phrase: " << _authPassPhrase << ", security level: " << _securityLevel; auto _snmpClientPtr = std::make_unique(_rsuIp, _snmpPort, "", _securityUser, _securityLevel, _authPassPhrase, SNMP_VERSION_3, timeout); diff --git a/src/v2i-hub/RSUHealthMonitorPlugin/src/RSUHealthMonitorWorker.h b/src/v2i-hub/RSUHealthMonitorPlugin/src/RSUHealthMonitorWorker.h index ef7a429c5..36ebf34bf 100644 --- a/src/v2i-hub/RSUHealthMonitorPlugin/src/RSUHealthMonitorWorker.h +++ b/src/v2i-hub/RSUHealthMonitorPlugin/src/RSUHealthMonitorWorker.h @@ -11,6 +11,7 @@ #include "SNMPClient.h" #include #include "RSUStatusMessage.h" +#include "RSUConfigurationList.h" using namespace std; using namespace tmx::utils; @@ -19,12 +20,6 @@ using namespace tmx::messages; namespace RSUHealthMonitor { - enum class RSUMibVersion - { - UNKOWN_MIB_V = 0, - RSUMIB_V_4_1 = 1, - RSUMIB_V_1218 = 2 - }; struct RSUFieldOIDStruct { diff --git a/src/v2i-hub/RSUHealthMonitorPlugin/test/test_RSUConfigurationList.cpp b/src/v2i-hub/RSUHealthMonitorPlugin/test/test_RSUConfigurationList.cpp new file mode 100644 index 000000000..8fb16e5a2 --- /dev/null +++ b/src/v2i-hub/RSUHealthMonitorPlugin/test/test_RSUConfigurationList.cpp @@ -0,0 +1,85 @@ +#include +#include "RSUConfigurationList.h" + +namespace RSUHealthMonitor +{ + class test_RSUConfigurationList : public ::testing::Test + { + public: + std::shared_ptr rsuConfigList = std::make_shared(); + }; + + TEST_F(test_RSUConfigurationList, parseAndGetConfigs) + { + ASSERT_EQ(0, rsuConfigList->getConfigs().size()); + std::string rsuConfigsStr = "{ \"RSUS\": [ { \"RSUIp\": \"192.168.XX.XX\", \"SNMPPort\": \"161\", \"AuthPassPhrase\": \"dummy\", \"User\": \"authOnlyUser\", \"RSUMIBVersion\": \"RSU4.1\" },{ \"RSUIp\": \"192.168.00.XX\", \"SNMPPort\": \"162\", \"AuthPassPhrase\": \"tester\", \"User\": \"authPrivUser\", \"RSUMIBVersion\": \"RSU4.1\" }] }"; + rsuConfigList->parseRSUs(rsuConfigsStr); + ASSERT_EQ(2, rsuConfigList->getConfigs().size()); + std::stringstream ss; + ss << rsuConfigList->getConfigs()[0]; + std::string expected = "RSUIp: 192.168.XX.XX, SNMPPort: 161, User: authOnlyUser, AuthPassPhrase: dummy, SecurityLevel: authPriv, RSUMIBVersion: RSU4.1"; + ASSERT_EQ(expected, ss.str()); + } + TEST_F(test_RSUConfigurationList, parseAndGetConfigs_MalformatJSON) + { + ASSERT_EQ(0, rsuConfigList->getConfigs().size()); + std::string rsuConfigsStr = "{ \"RSUS { \"RSUIp\": \"192.168.XX.XX\", \"SNMPPort\": \"161\", \"AuthPassPhrase\": \"dummy\", \"User\": \"authOnlyUser\", \"RSUMIBVersion\": \"RSU4.1\" },{ \"RSUIp\": \"192.168.00.XX\", \"SNMPPort\": \"162\", \"AuthPassPhrase\": \"tester\", \"User\": \"authPrivUser\", \"RSUMIBVersion\": \"RSU4.1\" }] }"; + ASSERT_THROW(rsuConfigList->parseRSUs(rsuConfigsStr), RSUHealthMonitor::RSUConfigurationException); + ASSERT_EQ(0, rsuConfigList->getConfigs().size()); + } + + TEST_F(test_RSUConfigurationList, parseAndGetConfigs_Missing_RSUS) + { + ASSERT_EQ(0, rsuConfigList->getConfigs().size()); + std::string rsuConfigsStr = "{ \"ERROR\": [ { \"RSUIp\": \"192.168.XX.XX\", \"SNMPPort\": \"161\", \"AuthPassPhrase\": \"dummy\", \"User\": \"authOnlyUser\", \"RSUMIBVersion\": \"RSU4.1\" },{ \"RSUIp\": \"192.168.00.XX\", \"SNMPPort\": \"162\", \"AuthPassPhrase\": \"tester\", \"User\": \"authPrivUser\", \"RSUMIBVersion\": \"RSU4.1\" }] }"; + ASSERT_THROW(rsuConfigList->parseRSUs(rsuConfigsStr), RSUHealthMonitor::RSUConfigurationException); + ASSERT_EQ(0, rsuConfigList->getConfigs().size()); + } + + TEST_F(test_RSUConfigurationList, parseAndGetConfigs_Missing_SNMPPORT) + { + ASSERT_EQ(0, rsuConfigList->getConfigs().size()); + std::string rsuConfigsStr = "{ \"RSUS\": [ { \"RSUIp\": \"192.168.XX.XX\", \"SNMPPort_Missing\": \"161\", \"AuthPassPhrase\": \"dummy\", \"User\": \"authOnlyUser\", \"RSUMIBVersion\": \"RSU4.1\" },{ \"RSUIp\": \"192.168.00.XX\", \"SNMPPort\": \"162\", \"AuthPassPhrase\": \"tester\", \"User\": \"authPrivUser\", \"RSUMIBVersion\": \"RSU4.1\" }] }"; + ASSERT_THROW(rsuConfigList->parseRSUs(rsuConfigsStr), RSUHealthMonitor::RSUConfigurationException); + ASSERT_EQ(0, rsuConfigList->getConfigs().size()); + } + + TEST_F(test_RSUConfigurationList, parseAndGetConfigs_INVALID_SNMPPORT) + { + std::string rsuConfigsStr = "{ \"RSUS\": [ { \"RSUIp\": \"192.168.01.XX\", \"SNMPPort\": \"162\", \"AuthPassPhrase\": \"dummy\", \"User\": \"authOnlyUser\", \"RSUMIBVersion\": \"RSU4.1\" },{ \"RSUIp\": \"192.168.00.XX\", \"SNMPPort\": \"INVALID_PORT\", \"AuthPassPhrase\": \"tester\", \"User\": \"authPrivUser\", \"RSUMIBVersion\": \"RSU4.1\" }] }"; + ASSERT_THROW(rsuConfigList->parseRSUs(rsuConfigsStr), RSUHealthMonitor::RSUConfigurationException); + ASSERT_EQ(0, rsuConfigList->getConfigs().size()); + } + + TEST_F(test_RSUConfigurationList, parseAndGetConfigs_Missing_AuthPassPhrase) + { + ASSERT_EQ(0, rsuConfigList->getConfigs().size()); + std::string rsuConfigsStr = "{ \"RSUS\": [ { \"RSUIp\": \"192.168.XX.XX\", \"SNMPPort\": \"161\", \"AuthPassPhrase_Missing\": \"dummy\", \"User\": \"authOnlyUser\", \"RSUMIBVersion\": \"RSU4.1\" },{ \"RSUIp\": \"192.168.00.XX\", \"SNMPPort\": \"162\", \"AuthPassPhrase\": \"tester\", \"User\": \"authPrivUser\", \"RSUMIBVersion\": \"RSU4.1\" }] }"; + ASSERT_THROW(rsuConfigList->parseRSUs(rsuConfigsStr), RSUHealthMonitor::RSUConfigurationException); + ASSERT_EQ(0, rsuConfigList->getConfigs().size()); + } + + TEST_F(test_RSUConfigurationList, parseAndGetConfigs_Missing_User) + { + ASSERT_EQ(0, rsuConfigList->getConfigs().size()); + std::string rsuConfigsStr = "{ \"RSUS\": [ { \"RSUIp\": \"192.168.XX.XX\", \"SNMPPort\": \"161\", \"AuthPassPhrase\": \"dummy\", \"User_Missing\": \"authOnlyUser\", \"RSUMIBVersion\": \"RSU4.1\" },{ \"RSUIp\": \"192.168.00.XX\", \"SNMPPort\": \"162\", \"AuthPassPhrase\": \"tester\", \"User\": \"authPrivUser\", \"RSUMIBVersion\": \"RSU4.1\" }] }"; + ASSERT_THROW(rsuConfigList->parseRSUs(rsuConfigsStr), RSUHealthMonitor::RSUConfigurationException); + ASSERT_EQ(0, rsuConfigList->getConfigs().size()); + } + + TEST_F(test_RSUConfigurationList, parseAndGetConfigs_Missing_MibVersion) + { + ASSERT_EQ(0, rsuConfigList->getConfigs().size()); + std::string rsuConfigsStr = "{ \"RSUS\": [ { \"RSUIp\": \"192.168.XX.XX\", \"SNMPPort\": \"161\", \"AuthPassPhrase\": \"dummy\", \"User\": \"authOnlyUser\", \"RSUMIBVersion_Missing\": \"RSU4.1\" },{ \"RSUIp\": \"192.168.00.XX\", \"SNMPPort\": \"162\", \"AuthPassPhrase\": \"tester\", \"User\": \"authPrivUser\", \"RSUMIBVersion\": \"RSU4.1\" }] }"; + ASSERT_THROW(rsuConfigList->parseRSUs(rsuConfigsStr), RSUHealthMonitor::RSUConfigurationException); + ASSERT_EQ(0, rsuConfigList->getConfigs().size()); + } + + TEST_F(test_RSUConfigurationList, parseAndGetConfigs_Invalid_MibVersion) + { + ASSERT_EQ(0, rsuConfigList->getConfigs().size()); + std::string rsuConfigsStr = "{ \"RSUS\": [ { \"RSUIp\": \"192.168.XX.XX\", \"SNMPPort\": \"161\", \"AuthPassPhrase\": \"dummy\", \"User\": \"authOnlyUser\", \"RSUMIBVersion\": \"INVALID_RSU4.1\" },{ \"RSUIp\": \"192.168.00.XX\", \"SNMPPort\": \"162\", \"AuthPassPhrase\": \"tester\", \"User\": \"authPrivUser\", \"RSUMIBVersion\": \"RSU4.1\" }] }"; + ASSERT_THROW(rsuConfigList->parseRSUs(rsuConfigsStr), RSUHealthMonitor::RSUConfigurationException); + ASSERT_EQ(0, rsuConfigList->getConfigs().size()); + } +} \ No newline at end of file