27SCENARIO(
"configuring basic rules",
"[stateRuleEngine::ruleConfig]" )
30 #ifdef STATERULEENGINE_TEST_DOXYGEN_REF
31 loadRuleConfig( *(
indiRuleMaps *)
nullptr, *(std::map<std::string, ruleRuleKeys> *)
nullptr, *(mx::app::appConfigurator *)
nullptr );
35 GIVEN(
"single rules in a config file" )
37 WHEN(
"a numValRule using defaults" )
39 mx::app::writeConfigFile(
"/tmp/ruleConfig_test.conf",
40 {
"rule1",
"rule1",
"rule1",
"rule1" },
41 {
"ruleType",
"property",
"element",
"target" },
42 {
"numVal",
"dev.prop",
"elem",
"1.234" } );
43 mx::app::appConfigurator config;
44 config.readConfig(
"/tmp/ruleConfig_test.conf" );
47 std::map<std::string, ruleRuleKeys> rrkMap;
59 WHEN(
"a numValRule changing defaults" )
61 mx::app::writeConfigFile(
"/tmp/ruleConfig_test.conf",
62 {
"rule1",
"rule1",
"rule1",
"rule1",
"rule1",
"rule1",
"rule1" },
63 {
"ruleType",
"priority",
"comp",
"property",
"element",
"target",
"tol" },
64 {
"numVal",
"warning",
"GtEq",
"dev.prop",
"elem",
"1.234",
"1e-8" } );
65 mx::app::appConfigurator config;
66 config.readConfig(
"/tmp/ruleConfig_test.conf" );
69 std::map<std::string, ruleRuleKeys> rrkMap;
81 WHEN(
"a txtValRule using defaults" )
83 mx::app::writeConfigFile(
"/tmp/ruleConfig_test.conf",
84 {
"rule1",
"rule1",
"rule1",
"rule1" },
85 {
"ruleType",
"property",
"element",
"target" },
86 {
"txtVal",
"dev.prop",
"elem",
"xxx" } );
87 mx::app::appConfigurator config;
88 config.readConfig(
"/tmp/ruleConfig_test.conf" );
91 std::map<std::string, ruleRuleKeys> rrkMap;
102 WHEN(
"a txtValRule changing defaults" )
104 mx::app::writeConfigFile(
"/tmp/ruleConfig_test.conf",
105 {
"rule1",
"rule1",
"rule1",
"rule1",
"rule1",
"rule1" },
106 {
"ruleType",
"priority",
"comp",
"property",
"element",
"target" },
107 {
"txtVal",
"alert",
"Neq",
"dev.prop",
"elem",
"xxx" } );
108 mx::app::appConfigurator config;
109 config.readConfig(
"/tmp/ruleConfig_test.conf" );
112 std::map<std::string, ruleRuleKeys> rrkMap;
123 WHEN(
"a swValRule using defaults" )
125 mx::app::writeConfigFile(
"/tmp/ruleConfig_test.conf",
126 {
"rule1",
"rule1",
"rule1" },
127 {
"ruleType",
"property",
"element" },
128 {
"swVal",
"dev.prop",
"elem" } );
129 mx::app::appConfigurator config;
130 config.readConfig(
"/tmp/ruleConfig_test.conf" );
133 std::map<std::string, ruleRuleKeys> rrkMap;
144 WHEN(
"a swValRule changing defaults" )
146 mx::app::writeConfigFile(
"/tmp/ruleConfig_test.conf",
147 {
"rule1",
"rule1",
"rule1",
"rule1",
"rule1",
"rule1" },
148 {
"ruleType",
"priority",
"comp",
"property",
"element",
"target" },
149 {
"swVal",
"info",
"Neq",
"dev.prop",
"elem",
"Off" } );
150 mx::app::appConfigurator config;
151 config.readConfig(
"/tmp/ruleConfig_test.conf" );
154 std::map<std::string, ruleRuleKeys> rrkMap;
165 WHEN(
"a timeDiffRule using defaults" )
167 mx::app::writeConfigFile(
"/tmp/ruleConfig_test.conf",
168 {
"rule1",
"rule1",
"rule1",
"rule1" },
169 {
"ruleType",
"property",
"element",
"target" },
170 {
"timeDiff",
"dev.prop",
"elem",
"1.234" } );
171 mx::app::appConfigurator config;
172 config.readConfig(
"/tmp/ruleConfig_test.conf" );
175 std::map<std::string, ruleRuleKeys> rrkMap;
187 WHEN(
"a timeDiffRule changing defaults" )
189 mx::app::writeConfigFile(
"/tmp/ruleConfig_test.conf",
190 {
"rule1",
"rule1",
"rule1",
"rule1",
"rule1",
"rule1",
"rule1" },
191 {
"ruleType",
"priority",
"comp",
"property",
"element",
"target",
"tol" },
192 {
"timeDiff",
"warning",
"GtEq",
"dev.prop",
"elem",
"1.234",
"1e-8" } );
193 mx::app::appConfigurator config;
194 config.readConfig(
"/tmp/ruleConfig_test.conf" );
197 std::map<std::string, ruleRuleKeys> rrkMap;
209 WHEN(
"an elCompNumRule using defaults" )
211 mx::app::writeConfigFile(
"/tmp/ruleConfig_test.conf",
212 {
"rule1",
"rule1",
"rule1",
"rule1",
"rule1" },
213 {
"ruleType",
"property1",
"element1",
"property2",
"element2" },
214 {
"elCompNum",
"dev1.prop1",
"elem1",
"dev2.prop2",
"elem2" } );
215 mx::app::appConfigurator config;
216 config.readConfig(
"/tmp/ruleConfig_test.conf" );
219 std::map<std::string, ruleRuleKeys> rrkMap;
231 WHEN(
"an elCompTxtRule using defaults" )
233 mx::app::writeConfigFile(
"/tmp/ruleConfig_test.conf",
234 {
"rule1",
"rule1",
"rule1",
"rule1",
"rule1" },
235 {
"ruleType",
"property1",
"element1",
"property2",
"element2" },
236 {
"elCompTxt",
"dev1.prop1",
"elem1",
"dev2.prop2",
"elem2" } );
237 mx::app::appConfigurator config;
238 config.readConfig(
"/tmp/ruleConfig_test.conf" );
241 std::map<std::string, ruleRuleKeys> rrkMap;
253 WHEN(
"an elCompSwRule using defaults" )
255 mx::app::writeConfigFile(
"/tmp/ruleConfig_test.conf",
256 {
"rule1",
"rule1",
"rule1",
"rule1",
"rule1" },
257 {
"ruleType",
"property1",
"element1",
"property2",
"element2" },
258 {
"elCompSw",
"dev1.prop1",
"elem1",
"dev2.prop2",
"elem2" } );
259 mx::app::appConfigurator config;
260 config.readConfig(
"/tmp/ruleConfig_test.conf" );
263 std::map<std::string, ruleRuleKeys> rrkMap;
275 WHEN(
"a ruleCompRule using defaults" )
278 mx::app::writeConfigFile(
279 "/tmp/ruleConfig_test.conf",
280 {
"ruleA",
"ruleA",
"ruleA",
"rule3",
"rule3",
"rule3",
"rule3",
"rule4",
"rule4",
"rule4",
"rule4" },
303 mx::app::appConfigurator config;
304 config.readConfig(
"/tmp/ruleConfig_test.conf" );
307 std::map<std::string, ruleRuleKeys> rrkMap;
319 WHEN(
"a multiSwitchComboRule using defaults" )
321 mx::app::writeConfigFile(
322 "/tmp/ruleConfig_test.conf",
323 {
"rule1",
"rule1",
"rule1",
"rule1",
"rule1",
"rule1" },
324 {
"ruleType",
"numSwitches",
"property1",
"property2",
"format",
"targetProperty" },
325 {
"multiSwitchCombo",
"2",
"dev1.prop1",
"dev2.prop2",
"{}-{}",
"dev3.prop3" } );
326 mx::app::appConfigurator config;
327 config.readConfig(
"/tmp/ruleConfig_test.conf" );
330 std::map<std::string, ruleRuleKeys> rrkMap;
336 REQUIRE( mscr !=
nullptr );
339 REQUIRE( mscr->
ruleName() ==
"rule1" );
345 REQUIRE( mscr->
format() ==
"{}-{}" );
350 WHEN(
"a multiSwitchComboRule changing defaults" )
352 mx::app::writeConfigFile(
353 "/tmp/ruleConfig_test.conf",
354 {
"rule1",
"rule1",
"rule1",
"rule1",
"rule1",
"rule1",
"rule1",
"rule1" },
355 {
"ruleType",
"priority",
"comp",
"numSwitches",
"property1",
"property2",
"format",
"targetProperty" },
356 {
"multiSwitchCombo",
"warning",
"Eq",
"2",
"dev1.prop1",
"dev2.prop2",
"\"{}:{}\"",
"dev3.prop3" } );
357 mx::app::appConfigurator config;
358 config.readConfig(
"/tmp/ruleConfig_test.conf" );
361 std::map<std::string, ruleRuleKeys> rrkMap;
367 REQUIRE( mscr !=
nullptr );
370 REQUIRE( mscr->
format() ==
"{}:{}" );
439SCENARIO(
"rule configurations with errors",
"[stateRuleEngine::ruleConfig]" )
441 GIVEN(
"single rules in a config file" )
443 WHEN(
"no rule sections given" )
445 mx::app::writeConfigFile(
"/tmp/ruleConfig_test.conf", {
"rule1" }, {
"property" }, {
"dev.prop" } );
446 mx::app::appConfigurator config;
449 config.add(
"rule1.prop",
"",
"", argType::Required,
"rule1",
"property",
false,
"string",
"" );
450 config.readConfig(
"/tmp/ruleConfig_test.conf" );
453 std::map<std::string, ruleRuleKeys> rrkMap;
460 catch(
const mx::exception<mx::verbose::d> &e )
468 REQUIRE( caught ==
true );
471 WHEN(
"an invalid rule" )
473 mx::app::writeConfigFile(
"/tmp/ruleConfig_test.conf",
474 {
"rule1",
"rule1",
"rule1",
"rule1" },
475 {
"ruleType",
"property",
"element",
"target" },
476 {
"badRule",
"dev.prop",
"elem",
"1.234" } );
477 mx::app::appConfigurator config;
478 config.readConfig(
"/tmp/ruleConfig_test.conf" );
481 std::map<std::string, ruleRuleKeys> rrkMap;
488 catch(
const mx::exception<mx::verbose::d> &e )
496 REQUIRE( caught ==
true );
499 GIVEN(
"ruleComp rules with errors" )
501 WHEN(
"a ruleCompRule with rule1 not found" )
504 mx::app::writeConfigFile(
505 "/tmp/ruleConfig_test.conf",
506 {
"ruleA",
"ruleA",
"ruleA",
"rule3",
"rule3",
"rule3",
"rule3",
"rule4",
"rule4",
"rule4",
"rule4" },
529 mx::app::appConfigurator config;
530 config.readConfig(
"/tmp/ruleConfig_test.conf" );
533 std::map<std::string, ruleRuleKeys> rrkMap;
546 REQUIRE( caught ==
true );
549 WHEN(
"a ruleCompRule with rule1 self-referencing" )
552 mx::app::writeConfigFile(
553 "/tmp/ruleConfig_test.conf",
554 {
"ruleA",
"ruleA",
"ruleA",
"rule3",
"rule3",
"rule3",
"rule3",
"rule4",
"rule4",
"rule4",
"rule4" },
577 mx::app::appConfigurator config;
578 config.readConfig(
"/tmp/ruleConfig_test.conf" );
581 std::map<std::string, ruleRuleKeys> rrkMap;
593 REQUIRE( caught ==
true );
595 WHEN(
"a ruleCompRule with rule2 not found" )
598 mx::app::writeConfigFile(
599 "/tmp/ruleConfig_test.conf",
600 {
"ruleA",
"ruleA",
"ruleA",
"rule3",
"rule3",
"rule3",
"rule3",
"rule4",
"rule4",
"rule4",
"rule4" },
623 mx::app::appConfigurator config;
624 config.readConfig(
"/tmp/ruleConfig_test.conf" );
627 std::map<std::string, ruleRuleKeys> rrkMap;
640 REQUIRE( caught ==
true );
643 WHEN(
"a ruleCompRule with rule2 self-referencing" )
646 mx::app::writeConfigFile(
647 "/tmp/ruleConfig_test.conf",
648 {
"ruleA",
"ruleA",
"ruleA",
"rule3",
"rule3",
"rule3",
"rule3",
"rule4",
"rule4",
"rule4",
"rule4" },
671 mx::app::appConfigurator config;
672 config.readConfig(
"/tmp/ruleConfig_test.conf" );
675 std::map<std::string, ruleRuleKeys> rrkMap;
688 REQUIRE( caught ==
true );
692 GIVEN(
"multiSwitchCombo rules with errors" )
694 WHEN(
"numSwitches is zero" )
696 mx::app::writeConfigFile(
"/tmp/ruleConfig_test.conf",
697 {
"rule1",
"rule1",
"rule1",
"rule1",
"rule1" },
698 {
"ruleType",
"numSwitches",
"property1",
"format",
"targetProperty" },
699 {
"multiSwitchCombo",
"0",
"dev1.prop1",
"{}",
"dev2.prop2" } );
700 mx::app::appConfigurator config;
701 config.readConfig(
"/tmp/ruleConfig_test.conf" );
704 std::map<std::string, ruleRuleKeys> rrkMap;
716 REQUIRE( caught ==
true );
719 WHEN(
"a required propertyK is missing" )
721 mx::app::writeConfigFile(
"/tmp/ruleConfig_test.conf",
722 {
"rule1",
"rule1",
"rule1",
"rule1",
"rule1" },
723 {
"ruleType",
"numSwitches",
"property1",
"format",
"targetProperty" },
724 {
"multiSwitchCombo",
"2",
"dev1.prop1",
"{}-{}",
"dev2.prop2" } );
725 mx::app::appConfigurator config;
726 config.readConfig(
"/tmp/ruleConfig_test.conf" );
729 std::map<std::string, ruleRuleKeys> rrkMap;
741 REQUIRE( caught ==
true );
744 WHEN(
"a source property conflicts with a non-switch rule type" )
746 mx::app::writeConfigFile(
747 "/tmp/ruleConfig_test.conf",
766 {
"txtVal",
"dev1.prop1",
"elem",
"xxx",
"multiSwitchCombo",
"1",
"dev1.prop1",
"{}",
"dev2.prop2" } );
767 mx::app::appConfigurator config;
768 config.readConfig(
"/tmp/ruleConfig_test.conf" );
771 std::map<std::string, ruleRuleKeys> rrkMap;
783 REQUIRE( caught ==
true );
786 WHEN(
"the comparison operator is not valid" )
788 mx::app::writeConfigFile(
789 "/tmp/ruleConfig_test.conf",
790 {
"rule1",
"rule1",
"rule1",
"rule1",
"rule1",
"rule1",
"rule1" },
791 {
"ruleType",
"comp",
"numSwitches",
"property1",
"property2",
"format",
"targetProperty" },
792 {
"multiSwitchCombo",
"And",
"2",
"dev1.prop1",
"dev2.prop2",
"{}-{}",
"dev3.prop3" } );
793 mx::app::appConfigurator config;
794 config.readConfig(
"/tmp/ruleConfig_test.conf" );
797 std::map<std::string, ruleRuleKeys> rrkMap;
809 REQUIRE( caught ==
true );
812 WHEN(
"the format placeholder count does not match numSwitches" )
814 mx::app::writeConfigFile(
815 "/tmp/ruleConfig_test.conf",
816 {
"rule1",
"rule1",
"rule1",
"rule1",
"rule1",
"rule1" },
817 {
"ruleType",
"numSwitches",
"property1",
"property2",
"format",
"targetProperty" },
818 {
"multiSwitchCombo",
"2",
"dev1.prop1",
"dev2.prop2",
"{}",
"dev3.prop3" } );
819 mx::app::appConfigurator config;
820 config.readConfig(
"/tmp/ruleConfig_test.conf" );
823 std::map<std::string, ruleRuleKeys> rrkMap;
835 REQUIRE( caught ==
true );