@@ -76,13 +76,19 @@ CppUnit::Test* CDetectionRulesJsonParserTest::suite() {
7676 new CppUnit::TestCaller<CDetectionRulesJsonParserTest>(" CDetectionRulesJsonParserTest::testParseRulesGivenMultipleRules" ,
7777 &CDetectionRulesJsonParserTest::testParseRulesGivenMultipleRules));
7878 suiteOfTests->addTest (
79- new CppUnit::TestCaller<CDetectionRulesJsonParserTest>(" CDetectionRulesJsonParserTest::testParseRulesGivenCategoricalRule" ,
80- &CDetectionRulesJsonParserTest::testParseRulesGivenCategoricalRule));
79+ new CppUnit::TestCaller<CDetectionRulesJsonParserTest>(" CDetectionRulesJsonParserTest::testParseRulesGivenCategoricalMatchRule" ,
80+ &CDetectionRulesJsonParserTest::testParseRulesGivenCategoricalMatchRule));
81+ suiteOfTests->addTest (
82+ new CppUnit::TestCaller<CDetectionRulesJsonParserTest>(" CDetectionRulesJsonParserTest::testParseRulesGivenCategoricalComplementRule" ,
83+ &CDetectionRulesJsonParserTest::testParseRulesGivenCategoricalComplementRule));
8184 suiteOfTests->addTest (new CppUnit::TestCaller<CDetectionRulesJsonParserTest>(
8285 " CDetectionRulesJsonParserTest::testParseRulesGivenTimeRule" , &CDetectionRulesJsonParserTest::testParseRulesGivenTimeRule));
8386 suiteOfTests->addTest (
8487 new CppUnit::TestCaller<CDetectionRulesJsonParserTest>(" CDetectionRulesJsonParserTest::testParseRulesGivenDifferentActions" ,
8588 &CDetectionRulesJsonParserTest::testParseRulesGivenDifferentActions));
89+ suiteOfTests->addTest (
90+ new CppUnit::TestCaller<CDetectionRulesJsonParserTest>(" CDetectionRulesJsonParserTest::testParseRulesGivenOldStyleCategoricalRule" ,
91+ &CDetectionRulesJsonParserTest::testParseRulesGivenOldStyleCategoricalRule));
8692 return suiteOfTests;
8793}
8894
@@ -356,8 +362,37 @@ void CDetectionRulesJsonParserTest::testParseRulesGivenMultipleRules() {
356362 CPPUNIT_ASSERT_EQUAL (std::string (" SKIP_SAMPLING (id:42) IF ACTUAL < 2.000000" ), rules[1 ].print ());
357363}
358364
359- void CDetectionRulesJsonParserTest::testParseRulesGivenCategoricalRule () {
360- LOG_DEBUG (" *** testParseRulesGivenCategoricalRule ***" );
365+ void CDetectionRulesJsonParserTest::testParseRulesGivenCategoricalMatchRule () {
366+ LOG_DEBUG (" *** testParseRulesGivenCategoricalMatchRule ***" );
367+
368+ TStrPatternSetUMap filtersById;
369+ core::CPatternSet filter;
370+ filter.initFromJson (" [\" b\" , \" a\" ]" );
371+ filtersById[" filter1" ] = filter;
372+
373+ CDetectionRulesJsonParser parser (filtersById);
374+ CDetectionRulesJsonParser::TDetectionRuleVec rules;
375+ std::string rulesJson = " [" ;
376+ rulesJson += " {" ;
377+ rulesJson += " \" actions\" :[\" filter_results\" ]," ;
378+ rulesJson += " \" conditions_connective\" :\" or\" ," ;
379+ rulesJson += " \" conditions\" : [" ;
380+ rulesJson += " {\" type\" :\" categorical_match\" , \" field_name\" :\" foo\" , \" filter_id\" :\" filter1\" }" ;
381+ rulesJson += " ]" ;
382+ rulesJson += " }" ;
383+ rulesJson += " ]" ;
384+
385+ CPPUNIT_ASSERT (parser.parseRules (rulesJson, rules));
386+
387+ CPPUNIT_ASSERT_EQUAL (std::size_t (1 ), rules.size ());
388+ CPPUNIT_ASSERT_EQUAL (std::string (" FILTER_RESULTS IF (foo) IN FILTER" ), rules[0 ].print ());
389+ }
390+
391+ void CDetectionRulesJsonParserTest::testParseRulesGivenOldStyleCategoricalRule () {
392+ LOG_DEBUG (" *** testParseRulesGivenOldStyleCategoricalRule ***" );
393+
394+ // Tests that the rule type can be parsed as categorical_match
395+ // when the type is categorical
361396
362397 TStrPatternSetUMap filtersById;
363398 core::CPatternSet filter;
@@ -382,6 +417,32 @@ void CDetectionRulesJsonParserTest::testParseRulesGivenCategoricalRule() {
382417 CPPUNIT_ASSERT_EQUAL (std::string (" FILTER_RESULTS IF (foo) IN FILTER" ), rules[0 ].print ());
383418}
384419
420+ void CDetectionRulesJsonParserTest::testParseRulesGivenCategoricalComplementRule () {
421+ LOG_DEBUG (" *** testParseRulesGivenCategoricalComplementRule ***" );
422+
423+ TStrPatternSetUMap filtersById;
424+ core::CPatternSet filter;
425+ filter.initFromJson (" [\" b\" , \" a\" ]" );
426+ filtersById[" filter1" ] = filter;
427+
428+ CDetectionRulesJsonParser parser (filtersById);
429+ CDetectionRulesJsonParser::TDetectionRuleVec rules;
430+ std::string rulesJson = " [" ;
431+ rulesJson += " {" ;
432+ rulesJson += " \" actions\" :[\" filter_results\" ]," ;
433+ rulesJson += " \" conditions_connective\" :\" or\" ," ;
434+ rulesJson += " \" conditions\" : [" ;
435+ rulesJson += " {\" type\" :\" categorical_complement\" , \" field_name\" :\" foo\" , \" filter_id\" :\" filter1\" }" ;
436+ rulesJson += " ]" ;
437+ rulesJson += " }" ;
438+ rulesJson += " ]" ;
439+
440+ CPPUNIT_ASSERT (parser.parseRules (rulesJson, rules));
441+
442+ CPPUNIT_ASSERT_EQUAL (std::size_t (1 ), rules.size ());
443+ CPPUNIT_ASSERT_EQUAL (std::string (" FILTER_RESULTS IF (foo) NOT IN FILTER" ), rules[0 ].print ());
444+ }
445+
385446void CDetectionRulesJsonParserTest::testParseRulesGivenTimeRule () {
386447 LOG_DEBUG (" *** testParseRulesGivenTimeRule ***" );
387448
0 commit comments