Tests: tst_ruletextparser.h: Add tests

This commit is contained in:
Nodir Temirkhodjaev 2024-11-06 18:33:03 +05:00
parent 59845ecc48
commit 1646c99fe4
3 changed files with 85 additions and 37 deletions

View File

@ -4,37 +4,39 @@
#include <googletest.h> #include <googletest.h>
#include <common/fortconf.h>
#include <util/conf/ruletextparser.h> #include <util/conf/ruletextparser.h>
namespace {
bool compareStringList(const StringViewList &l1, const QStringList &l2)
{
if (l1.size() != l2.size())
return false;
for (int i = 0; i < l1.size(); ++i) {
if (l1[i] != l2[i])
return false;
}
return true;
}
}
class RuleTextParserTest : public Test class RuleTextParserTest : public Test
{ {
// Test interface // Test interface
protected: protected:
void SetUp(); void SetUp();
void TearDown(); void TearDown();
protected:
void checkStringList(const StringViewList &l1, const QStringList &l2);
}; };
void RuleTextParserTest::SetUp() { } void RuleTextParserTest::SetUp() { }
void RuleTextParserTest::TearDown() { } void RuleTextParserTest::TearDown() { }
void RuleTextParserTest::checkStringList(const StringViewList &l1, const QStringList &l2)
{
ASSERT_EQ(l1.size(), l2.size());
for (int i = 0; i < l1.size(); ++i) {
const QStringView &s1 = l1[i];
const QString &s2 = l2[i];
if (s1 != QStringView(s2)) {
ASSERT_EQ(s1.toString(), s2);
}
}
}
TEST_F(RuleTextParserTest, emptyList) TEST_F(RuleTextParserTest, emptyList)
{ {
RuleTextParser p("{}"); RuleTextParser p("{}");
@ -73,13 +75,15 @@ TEST_F(RuleTextParserTest, lineIpPort)
// Check IP // Check IP
{ {
const RuleFilter &rf = p.ruleFilters()[2]; const RuleFilter &rf = p.ruleFilters()[2];
ASSERT_TRUE(compareStringList(rf.values, { "1.1.1.1" })); ASSERT_EQ(rf.type, FORT_RULE_FILTER_TYPE_ADDRESS);
checkStringList(rf.values, { "1.1.1.1" });
} }
// Check Port // Check Port
{ {
const RuleFilter &rf = p.ruleFilters()[3]; const RuleFilter &rf = p.ruleFilters()[3];
ASSERT_TRUE(compareStringList(rf.values, { "53" })); ASSERT_EQ(rf.type, FORT_RULE_FILTER_TYPE_PORT);
checkStringList(rf.values, { "53" });
} }
} }
@ -94,7 +98,8 @@ TEST_F(RuleTextParserTest, lineIpValues)
// Check IP Values // Check IP Values
{ {
const RuleFilter &rf = p.ruleFilters()[2]; const RuleFilter &rf = p.ruleFilters()[2];
ASSERT_TRUE(compareStringList(rf.values, { "1.1.1.1/8", "[2::]/16" })); ASSERT_EQ(rf.type, FORT_RULE_FILTER_TYPE_ADDRESS);
checkStringList(rf.values, { "1.1.1.1/8", "[2::]/16" });
} }
} }
@ -111,24 +116,74 @@ TEST_F(RuleTextParserTest, lineIpPortList)
// Check IP // Check IP
{ {
const RuleFilter &rf = p.ruleFilters()[5]; const RuleFilter &rf = p.ruleFilters()[5];
ASSERT_TRUE(compareStringList(rf.values, { "2.2.2.2" })); ASSERT_EQ(rf.type, FORT_RULE_FILTER_TYPE_ADDRESS);
checkStringList(rf.values, { "2.2.2.2" });
} }
// Check Port // Check Port
{ {
const RuleFilter &rf = p.ruleFilters()[6]; const RuleFilter &rf = p.ruleFilters()[6];
ASSERT_TRUE(compareStringList(rf.values, { "64" })); ASSERT_EQ(rf.type, FORT_RULE_FILTER_TYPE_PORT);
checkStringList(rf.values, { "64" });
} }
// Check IP // Check IP
{ {
const RuleFilter &rf = p.ruleFilters()[8]; const RuleFilter &rf = p.ruleFilters()[8];
ASSERT_TRUE(compareStringList(rf.values, { "3.3.3.3" })); ASSERT_EQ(rf.type, FORT_RULE_FILTER_TYPE_ADDRESS);
checkStringList(rf.values, { "3.3.3.3" });
} }
// Check Port // Check Port
{ {
const RuleFilter &rf = p.ruleFilters()[9]; const RuleFilter &rf = p.ruleFilters()[9];
ASSERT_TRUE(compareStringList(rf.values, { "75" })); ASSERT_EQ(rf.type, FORT_RULE_FILTER_TYPE_PORT);
checkStringList(rf.values, { "75" });
}
}
TEST_F(RuleTextParserTest, filterDirUdp)
{
RuleTextParser p("dir(out):udp(53)");
ASSERT_TRUE(p.parse());
ASSERT_EQ(p.ruleFilters().size(), 4);
// Check Direction
{
const RuleFilter &rf = p.ruleFilters()[2];
ASSERT_EQ(rf.type, FORT_RULE_FILTER_TYPE_DIRECTION);
checkStringList(rf.values, { "out" });
}
// Check UDP Port
{
const RuleFilter &rf = p.ruleFilters()[3];
ASSERT_EQ(rf.type, FORT_RULE_FILTER_TYPE_PORT_UDP);
checkStringList(rf.values, { "53" });
}
}
TEST_F(RuleTextParserTest, lineSectionList)
{
RuleTextParser p("ip(\n#1\n1.1.1.1/8\n#2\n2.2.2.2/16\n):{\ntcp(80)\n}");
ASSERT_TRUE(p.parse());
ASSERT_EQ(p.ruleFilters().size(), 6);
// Check IP
{
const RuleFilter &rf = p.ruleFilters()[2];
ASSERT_EQ(rf.type, FORT_RULE_FILTER_TYPE_ADDRESS);
checkStringList(rf.values, { "1.1.1.1/8", "2.2.2.2/16" });
}
// Check Port
{
const RuleFilter &rf = p.ruleFilters()[5];
ASSERT_EQ(rf.type, FORT_RULE_FILTER_TYPE_PORT_TCP);
checkStringList(rf.values, { "80" });
} }
} }

View File

@ -7,8 +7,8 @@
namespace { namespace {
const char *const extraNameChars = "_"; const char *const extraNameChars = "_";
const char *const extraValueChars = ".-/"; const char *const extraValueChars = "._-/";
const char *const extraValueEndChars = ".-/:"; const char *const extraValueEndChars = "._-/:";
int getCharIndex(const char *chars, const char c) int getCharIndex(const char *chars, const char c)
{ {
@ -295,7 +295,7 @@ void RuleTextParser::parseBracketValues()
if (!parseBracketValue(expectedSeparator)) if (!parseBracketValue(expectedSeparator))
break; break;
expectedSeparator = CharValueSeparator; expectedSeparator = CharValueSeparator | CharNewLine;
} }
} }
@ -303,7 +303,7 @@ bool RuleTextParser::parseBracketValue(RuleCharTypes expectedSeparator)
{ {
resetParsedCharTypes(); resetParsedCharTypes();
if (!nextCharType(CharValueBegin | CharValue, if (!nextCharType(CharValueBegin | CharLetter | CharValue,
CharLineBreak | CharBracketEnd | expectedSeparator, extraValueEndChars)) CharLineBreak | CharBracketEnd | expectedSeparator, extraValueEndChars))
return false; return false;
@ -354,14 +354,8 @@ bool RuleTextParser::parseValue(bool expectValueEnd)
bool RuleTextParser::checkAddFilter() bool RuleTextParser::checkAddFilter()
{ {
if (!m_ruleFilter.hasValues()) { if (!m_ruleFilter.hasValues())
if (!m_ruleFilter.isSectionEnd) {
setError(ErrorUnexpectedEndOfLineSection, tr("Unexpected end of line section"));
return false;
}
return true; return true;
}
if (m_ruleFilter.type == FORT_RULE_FILTER_TYPE_INVALID) { if (m_ruleFilter.type == FORT_RULE_FILTER_TYPE_INVALID) {
setError(ErrorNoFilterName, tr("No filter name")); setError(ErrorNoFilterName, tr("No filter name"));

View File

@ -29,7 +29,7 @@ enum RuleCharType : RuleCharTypes {
CharLineBegin = (CharListBegin | CharListEnd | CharBracketBegin | CharLetter | CharDigit CharLineBegin = (CharListBegin | CharListEnd | CharBracketBegin | CharLetter | CharDigit
| CharValueBegin | CharNot), | CharValueBegin | CharNot),
CharName = (CharLetter | CharExtra), // a-zA-Z_ CharName = (CharLetter | CharExtra), // a-zA-Z_
CharValue = (CharDigit | CharExtra), // 0-9.-/: CharValue = (CharDigit | CharExtra), // 0-9._-/:
CharSpaceComment = (CharSpace | CharComment), CharSpaceComment = (CharSpace | CharComment),
CharLineBreak = (CharSpaceComment | CharNewLine), CharLineBreak = (CharSpaceComment | CharNewLine),
}; };
@ -65,7 +65,6 @@ public:
ErrorUnexpectedEndOfValuesList, ErrorUnexpectedEndOfValuesList,
ErrorUnexpectedSymboOfListEnd, ErrorUnexpectedSymboOfListEnd,
ErrorUnexpectedEndOfValue, ErrorUnexpectedEndOfValue,
ErrorUnexpectedEndOfLineSection,
ErrorListMaxDepth, ErrorListMaxDepth,
ErrorExtraFilterName, ErrorExtraFilterName,
ErrorBadFilterName, ErrorBadFilterName,