-
Notifications
You must be signed in to change notification settings - Fork 67
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
- Loading branch information
1 parent
9fef692
commit 11d3242
Showing
6 changed files
with
230 additions
and
6 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
19 changes: 19 additions & 0 deletions
19
src/v2i-hub/RSUHealthMonitorPlugin/src/RSUConfigurationException.h
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,19 @@ | ||
#pragma once | ||
#include <iostream> | ||
|
||
namespace RSUHealthMonitor | ||
{ | ||
class RSUConfigurationException : public std::exception | ||
{ | ||
private: | ||
std::string message; | ||
|
||
public: | ||
RSUConfigurationException(const char *msg) : message(msg){}; | ||
const char *what() | ||
{ | ||
return message.c_str(); | ||
} | ||
}; | ||
|
||
} |
84 changes: 84 additions & 0 deletions
84
src/v2i-hub/RSUHealthMonitorPlugin/src/RSUConfigurationList.cpp
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,84 @@ | ||
|
||
#include "RSUConfigurationList.h" | ||
|
||
namespace RSUHealthMonitor | ||
{ | ||
Json::Value RSUConfigurationList::parseJson(std::string rsuConfigsStr) | ||
{ | ||
JSONCPP_STRING err; | ||
Json::Value root; | ||
auto length = static_cast<int>(rsuConfigsStr.length()); | ||
Json::CharReaderBuilder builder; | ||
std::unique_ptr<Json::CharReader> reader(builder.newCharReader()); | ||
if (!reader->parse(rsuConfigsStr.c_str(), rsuConfigsStr.c_str() + length, &root, &err)) | ||
{ | ||
std::stringstream oss; | ||
oss << "Parse RSUs raw string error: "; | ||
oss << err.c_str(); | ||
throw RSUConfigurationException(oss.str().c_str()); | ||
} | ||
return root; | ||
} | ||
void RSUConfigurationList::parseRSUs(std::string rsuConfigsStr) | ||
{ | ||
auto json = parseJson(rsuConfigsStr); | ||
RSUConfiguration config; | ||
auto rsuArray = json["RSUS"]; | ||
if (!rsuArray.isArray()) | ||
{ | ||
throw RSUConfigurationException("RSUS is not an array."); | ||
} | ||
for (auto i = 0; i != rsuArray.size(); i++) | ||
{ | ||
if (rsuArray[i].isMember(RSUIpKey)) | ||
{ | ||
config.rsuIp = rsuArray[i][RSUIpKey].asString(); | ||
} | ||
else | ||
{ | ||
throw RSUConfigurationException("RSU IP does not exist."); | ||
} | ||
|
||
if (rsuArray[i].isMember(SNMPPortKey)) | ||
{ | ||
config.snmpPort = atoi(rsuArray[i][SNMPPortKey].asCString()); | ||
} | ||
else | ||
{ | ||
throw RSUConfigurationException("SNMP port does not exist."); | ||
} | ||
|
||
if (rsuArray[i].isMember(AuthPassPhraseKey)) | ||
{ | ||
config.authPassPhrase = rsuArray[i][AuthPassPhraseKey].asString(); | ||
} | ||
else | ||
{ | ||
throw RSUConfigurationException("Authentication pass phrase does not exist."); | ||
} | ||
|
||
if (rsuArray[i].isMember(UserKey)) | ||
{ | ||
config.user = rsuArray[i][UserKey].asString(); | ||
} | ||
else | ||
{ | ||
throw RSUConfigurationException("User does not exist."); | ||
} | ||
|
||
if (rsuArray[i].isMember(RSUMIBVersionKey)) | ||
{ | ||
config.mibVersion = rsuArray[i][RSUMIBVersionKey].asString(); | ||
} | ||
else | ||
{ | ||
throw RSUConfigurationException("RSU mib version does not exist."); | ||
} | ||
configs.push_back(config); | ||
} | ||
} | ||
std::vector<RSUConfiguration> RSUConfigurationList::getConfigs() | ||
{ | ||
return configs; | ||
} | ||
} |
56 changes: 56 additions & 0 deletions
56
src/v2i-hub/RSUHealthMonitorPlugin/src/RSUConfigurationList.h
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,56 @@ | ||
#pragma once | ||
#include <string> | ||
#include <vector> | ||
#include <iostream> | ||
#include <jsoncpp/json/json.h> | ||
#include "RSUConfigurationException.h" | ||
|
||
namespace RSUHealthMonitor | ||
{ | ||
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"; | ||
struct RSUConfiguration | ||
{ | ||
std::string rsuIp; | ||
uint16_t snmpPort; | ||
std::string user; | ||
std::string authPassPhrase; | ||
std::string securityLevel = "authPriv"; | ||
std::string mibVersion; | ||
friend 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; | ||
} | ||
}; | ||
|
||
class RSUConfigurationList | ||
{ | ||
private: | ||
std::vector<RSUConfiguration> 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(std::string rsuConfigsStr); | ||
|
||
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(std::string rsuConfigsStr); | ||
/** | ||
* @brief Get a list of RSUConfiguration struct. | ||
*/ | ||
std::vector<RSUConfiguration> getConfigs(); | ||
}; | ||
|
||
} // namespace RSUHealthMonitor |
65 changes: 65 additions & 0 deletions
65
src/v2i-hub/RSUHealthMonitorPlugin/test/test_RSUConfigurationList.cpp
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,65 @@ | ||
#include <gtest/gtest.h> | ||
#include "RSUConfigurationList.h" | ||
|
||
namespace RSUHealthMonitor | ||
{ | ||
class test_RSUConfigurationList : public ::testing::Test | ||
{ | ||
public: | ||
std::shared_ptr<RSUConfigurationList> rsuConfigList = std::make_shared<RSUConfigurationList>(); | ||
}; | ||
|
||
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()); | ||
} | ||
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_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()); | ||
} | ||
} |