Update SettingsFileReader

Improve parsing to be less strict.

Change-Id: I123a98bb8341b007c8fe6e7556ebaa113d1f076e
Signed-off-by: Filip Hazubski <filip.hazubski@intel.com>
This commit is contained in:
Filip Hazubski 2020-07-01 00:37:33 +02:00 committed by sys_ocldev
parent 949e4cba76
commit 29821b5a25
2 changed files with 128 additions and 15 deletions

View File

@ -155,3 +155,105 @@ TEST(SettingsFileReader, given64bitKeyValueWhenGetSettingThenValueIsCorrect) {
EXPECT_EQ(-18764712120594, returnedValue);
}
TEST(SettingsFileReader, givenKeyValueWithoutSpacesWhenGetSettingThenValueIsCorrect) {
auto reader = std::make_unique<TestSettingsFileReader>();
ASSERT_NE(nullptr, reader);
EXPECT_EQ(0u, reader->getStringSettingsCount());
std::stringstream inputLine("SomeKey=12");
reader->parseStream(inputLine);
int64_t returnedValue = reader->getSetting("SomeKey", 0);
EXPECT_EQ(1u, reader->getStringSettingsCount());
EXPECT_EQ(12, returnedValue);
}
TEST(SettingsFileReader, givenKeyValueWithAdditionalWhitespaceCharactersWhenGetSettingThenValueIsCorrect) {
auto reader = std::make_unique<TestSettingsFileReader>();
ASSERT_NE(nullptr, reader);
EXPECT_EQ(0u, reader->getStringSettingsCount());
std::stringstream inputLine("\t \t SomeKey\t \t =\t \t 12\t \t ");
reader->parseStream(inputLine);
int64_t returnedValue = reader->getSetting("SomeKey", 0);
EXPECT_EQ(1u, reader->getStringSettingsCount());
EXPECT_EQ(12, returnedValue);
}
TEST(SettingsFileReader, givenKeyValueWithAdditionalCharactersWhenGetSettingThenValueIsIncorrect) {
{
auto reader = std::make_unique<TestSettingsFileReader>();
ASSERT_NE(nullptr, reader);
EXPECT_EQ(0u, reader->getStringSettingsCount());
std::stringstream inputLine("Some Key = 12");
reader->parseStream(inputLine);
EXPECT_EQ(0u, reader->getStringSettingsCount());
}
{
auto reader = std::make_unique<TestSettingsFileReader>();
ASSERT_NE(nullptr, reader);
EXPECT_EQ(0u, reader->getStringSettingsCount());
std::stringstream inputLine("SomeKey = 1 2");
reader->parseStream(inputLine);
EXPECT_EQ(0u, reader->getStringSettingsCount());
}
}
TEST(SettingsFileReader, givenMultipleKeysWhenGetSettingThenInvalidKeysAreSkipped) {
auto reader = std::make_unique<TestSettingsFileReader>();
ASSERT_NE(nullptr, reader);
EXPECT_EQ(0u, reader->getStringSettingsCount());
std::string testFile;
testFile.append("InvalidKey1 = 1 2\n");
testFile.append("ValidKey1 = 12\n");
testFile.append("InvalidKey2 = - 1\n");
testFile.append("ValidKey2 = 128\n");
std::stringstream inputFile(testFile);
reader->parseStream(inputFile);
EXPECT_EQ(2u, reader->getStringSettingsCount());
EXPECT_EQ(0, reader->getSetting("InvalidKey1", 0));
EXPECT_EQ(0, reader->getSetting("InvalidKey2", 0));
EXPECT_EQ(12, reader->getSetting("ValidKey1", 0));
EXPECT_EQ(128, reader->getSetting("ValidKey2", 0));
}
TEST(SettingsFileReader, givenNoKeyOrNoValueWhenGetSettingThenExceptionIsNotThrown) {
{
auto reader = std::make_unique<TestSettingsFileReader>();
ASSERT_NE(nullptr, reader);
EXPECT_EQ(0u, reader->getStringSettingsCount());
std::stringstream inputLine("= 12");
EXPECT_NO_THROW(reader->parseStream(inputLine));
EXPECT_EQ(0u, reader->getStringSettingsCount());
}
{
auto reader = std::make_unique<TestSettingsFileReader>();
ASSERT_NE(nullptr, reader);
EXPECT_EQ(0u, reader->getStringSettingsCount());
std::stringstream inputLine("SomeKey =");
EXPECT_NO_THROW(reader->parseStream(inputLine));
EXPECT_EQ(0u, reader->getStringSettingsCount());
}
{
auto reader = std::make_unique<TestSettingsFileReader>();
ASSERT_NE(nullptr, reader);
EXPECT_EQ(0u, reader->getStringSettingsCount());
std::stringstream inputLine("=");
EXPECT_NO_THROW(reader->parseStream(inputLine));
EXPECT_EQ(0u, reader->getStringSettingsCount());
}
}

View File

@ -60,28 +60,39 @@ const char *SettingsFileReader::appSpecificLocation(const std::string &name) {
}
void SettingsFileReader::parseStream(std::istream &inputStream) {
std::stringstream ss;
std::string key;
std::string value;
char temp = 0;
std::string line;
std::string tmp;
while (!inputStream.eof()) {
std::string tempString;
std::string tempStringValue;
getline(inputStream, tempString);
getline(inputStream, line);
ss << tempString;
ss >> key;
ss >> temp;
ss >> value;
if (!ss.fail()) {
settingStringMap.insert(std::pair<std::string, std::string>(key, value));
auto equalsSignPosition = line.find('=');
if (equalsSignPosition == std::string::npos) {
continue;
}
ss.str(std::string()); // for reset string inside stringstream
ss.clear();
key.clear();
{
std::stringstream ss;
auto linePartWithKey = line.substr(0, equalsSignPosition);
ss << linePartWithKey;
ss >> key;
if (ss.fail() || (ss >> tmp)) {
continue;
}
}
{
std::stringstream ss;
auto linePartWithValue = line.substr(equalsSignPosition + 1);
ss << linePartWithValue;
ss >> value;
if (ss.fail() || (ss >> tmp)) {
continue;
}
}
settingStringMap.insert(std::pair<std::string, std::string>(key, value));
}
}
}; // namespace NEO