regulators: Add test cases for check duplicates and infinite loop.

*Invalid: test duplicate ID in rule.
*Invalid: test duplicate number in chassis.
*Invalid: test duplicate ID in device.
*Invalid: test duplicate ID in rail.
*Invalid: test run_rule with infinite loop (rule runs itself).
*Invalid: test run_rule with infinite loop (rules run each other).
*Invalid: test run_rule with infinite loop (indirect loop).

Signed-off-by: Bob King <Bob_King@wistron.com>
Change-Id: I06a5d68d1bbb2214a9fba63920b4527a1aa3df84
diff --git a/phosphor-regulators/test/validate-regulators-config_tests.cpp b/phosphor-regulators/test/validate-regulators-config_tests.cpp
index aeb5614..a5980f8 100644
--- a/phosphor-regulators/test/validate-regulators-config_tests.cpp
+++ b/phosphor-regulators/test/validate-regulators-config_tests.cpp
@@ -1919,3 +1919,80 @@
             "u'io_expander2%' does not match u'^[A-Za-z0-9_]+$'");
     }
 }
+TEST(ValidateRegulatorsConfigTest, DuplicateRuleID)
+{
+    // Invalid: test duplicate ID in rule.
+    {
+        json configFile = validConfigFile;
+        configFile["rules"][1]["id"] = "set_voltage_rule";
+        configFile["rules"][1]["actions"][0]["pmbus_write_vout_command"]
+                  ["format"] = "linear";
+        EXPECT_JSON_INVALID(configFile, "Error: Duplicate rule ID.", "");
+    }
+}
+TEST(ValidateRegulatorsConfigTest, DuplicateChassisNumber)
+{
+    // Invalid: test duplicate number in chassis.
+    {
+        json configFile = validConfigFile;
+        configFile["chassis"][1]["number"] = 1;
+        EXPECT_JSON_INVALID(configFile, "Error: Duplicate chassis number.", "");
+    }
+}
+TEST(ValidateRegulatorsConfigTest, DuplicateDeviceID)
+{
+    // Invalid: test duplicate ID in device.
+    {
+        json configFile = validConfigFile;
+        configFile["chassis"][0]["devices"][1]["id"] = "vdd_regulator";
+        configFile["chassis"][0]["devices"][1]["is_regulator"] = true;
+        configFile["chassis"][0]["devices"][1]["fru"] =
+            "/system/chassis/motherboard/regulator1";
+        configFile["chassis"][0]["devices"][1]["i2c_interface"]["bus"] = 2;
+        configFile["chassis"][0]["devices"][1]["i2c_interface"]["address"] =
+            "0x71";
+        EXPECT_JSON_INVALID(configFile, "Error: Duplicate device ID.", "");
+    }
+}
+TEST(ValidateRegulatorsConfigTest, DuplicateRailID)
+{
+    // Invalid: test duplicate ID in rail.
+    {
+        json configFile = validConfigFile;
+        configFile["chassis"][0]["devices"][0]["rails"][1]["id"] = "vdd";
+        EXPECT_JSON_INVALID(configFile, "Error: Duplicate rail ID.", "");
+    }
+}
+TEST(ValidateRegulatorsConfigTest, InfiniteLoops)
+{
+    // Invalid: test run_rule with infinite loop (rules run each other).
+    {
+        json configFile = validConfigFile;
+        configFile["rules"][2]["actions"][0]["run_rule"] = "set_voltage_rule2";
+        configFile["rules"][2]["id"] = "set_voltage_rule1";
+        configFile["rules"][3]["actions"][0]["run_rule"] = "set_voltage_rule1";
+        configFile["rules"][3]["id"] = "set_voltage_rule2";
+        EXPECT_JSON_INVALID(configFile,
+                            "Infinite loop caused by run_rule actions.", "");
+    }
+    // Invalid: test run_rule with infinite loop (rule runs itself).
+    {
+        json configFile = validConfigFile;
+        configFile["rules"][2]["actions"][0]["run_rule"] = "set_voltage_rule1";
+        configFile["rules"][2]["id"] = "set_voltage_rule1";
+        EXPECT_JSON_INVALID(configFile,
+                            "Infinite loop caused by run_rule actions.", "");
+    }
+    // Invalid: test run_rule with infinite loop (indirect loop).
+    {
+        json configFile = validConfigFile;
+        configFile["rules"][2]["actions"][0]["run_rule"] = "set_voltage_rule2";
+        configFile["rules"][2]["id"] = "set_voltage_rule1";
+        configFile["rules"][3]["actions"][0]["run_rule"] = "set_voltage_rule3";
+        configFile["rules"][3]["id"] = "set_voltage_rule2";
+        configFile["rules"][4]["actions"][0]["run_rule"] = "set_voltage_rule1";
+        configFile["rules"][4]["id"] = "set_voltage_rule3";
+        EXPECT_JSON_INVALID(configFile,
+                            "Infinite loop caused by run_rule actions.", "");
+    }
+}