sysd_monitor: Handle default for errors to monitor

If default is input, replace it with the three default errors to monitor
for

Tested:
- Relied on unit test

Change-Id: Ife92e74242d72b322f46f7f08d5a47068b31977d
Signed-off-by: Andrew Geissler <geissonator@yahoo.com>
diff --git a/systemd_target_parser.cpp b/systemd_target_parser.cpp
index d2cfa86..9656a46 100644
--- a/systemd_target_parser.cpp
+++ b/systemd_target_parser.cpp
@@ -17,6 +17,23 @@
             throw std::out_of_range("Found invalid error to monitor");
         }
     }
+    // See if default was in the errors to monitor, if so replace with defaults
+    auto errorItr =
+        std::find(errorsToMonitor.begin(), errorsToMonitor.end(), "default");
+    if (errorItr != errorsToMonitor.end())
+    {
+        // Verify default is the only entry
+        if (errorsToMonitor.size() != 1)
+        {
+            throw std::invalid_argument(
+                "default must be only error to monitor");
+        }
+        // delete "default" and insert defaults
+        errorsToMonitor.erase(errorItr);
+        errorsToMonitor.push_back("timeout");
+        errorsToMonitor.push_back("failed");
+        errorsToMonitor.push_back("dependency");
+    }
 }
 
 TargetErrorData parseFiles(const std::vector<std::string>& filePaths)
diff --git a/test/systemd_parser.cpp b/test/systemd_parser.cpp
index 7ca94b9..cb3a609 100644
--- a/test/systemd_parser.cpp
+++ b/test/systemd_parser.cpp
@@ -63,6 +63,9 @@
     EXPECT_EQ(tgt.errorToLog,
               "xyz.openbmc_project.State.Chassis.Error.PowerOnTargetFailure");
     EXPECT_EQ(tgt.errorsToMonitor.size(), 2);
+    // Check a target with "default" for errorsToMonitor, should have 3 defaults
+    tgt = targetData["obmc-host-start@0.target"];
+    EXPECT_EQ(tgt.errorsToMonitor.size(), 3);
 
     std::remove("/tmp/good_file1.json");
     std::remove("/tmp/good_file2.json");
@@ -107,3 +110,28 @@
                  nlohmann::detail::parse_error);
     std::remove("/tmp/invalid_json_file.json");
 }
+
+TEST(TargetJsonParser, NotJustDefault)
+{
+    auto notJustDefault = R"(
+        {
+            "targets" : {
+                "obmc-chassis-poweron@0.target" : {
+                    "errorsToMonitor": ["timeout", "default"],
+                    "errorToLog": "xyz.openbmc_project.State.Chassis.Error.PowerOnTargetFailure"}
+                }
+        }
+    )"_json;
+
+    std::FILE* tmpf = fopen("/tmp/not_just_default_file.json", "w");
+    std::fputs(notJustDefault.dump().c_str(), tmpf);
+    std::fclose(tmpf);
+
+    std::vector<std::string> filePaths;
+    filePaths.push_back("/tmp/not_just_default_file.json");
+
+    // Verify exception thrown on invalid errorsToMonitor
+    EXPECT_THROW(TargetErrorData targetData = parseFiles(filePaths),
+                 std::invalid_argument);
+    std::remove("/tmp/not_just_default_file.json");
+}