sysd_monitor: Monitor and log errors

Note some aspects of the code are non-optimal to allow better unit
testing.

Tested:
- Verified failure detected and correct error created in qemu

Change-Id: I1d4c9638fc13147508168278cc5ab90c37e1fb8e
Signed-off-by: Andrew Geissler <geissonator@yahoo.com>
diff --git a/test/Makefile.am.include b/test/Makefile.am.include
index 95bf636..ba8d106 100644
--- a/test/Makefile.am.include
+++ b/test/Makefile.am.include
@@ -1,4 +1,8 @@
 test_systemd_parser_SOURCES = %reldir%/systemd_parser.cpp systemd_target_parser.cpp
+test_systemd_signal_SOURCES = %reldir%/systemd_signal.cpp systemd_target_signal.cpp
 
 check_PROGRAMS += \
 	%reldir%/systemd_parser
+
+check_PROGRAMS += \
+	%reldir%/systemd_signal
diff --git a/test/systemd_signal.cpp b/test/systemd_signal.cpp
new file mode 100644
index 0000000..ce0a299
--- /dev/null
+++ b/test/systemd_signal.cpp
@@ -0,0 +1,44 @@
+#include <gtest/gtest.h>
+#include <sdbusplus/bus.hpp>
+#include <sdeventplus/event.hpp>
+#include <systemd_target_signal.hpp>
+
+#include <iostream>
+
+// Enable debug by default for debug when needed
+bool gVerbose = true;
+
+TEST(TargetSignalData, BasicPaths)
+{
+
+    // Create default data structure for testing
+    TargetErrorData targetData = {
+        {"multi-user.target",
+         {"xyz.openbmc_project.State.BMC.Error.MultiUserTargetFailure",
+          {"default"}}},
+        {"obmc-chassis-poweron@0.target",
+         {"xyz.openbmc_project.State.Chassis.Error.PowerOnTargetFailure",
+          {"timeout", "failed"}}}};
+
+    auto bus = sdbusplus::bus::new_default();
+    auto event = sdeventplus::Event::get_default();
+    bus.attach_event(event.get(), SD_EVENT_PRIORITY_NORMAL);
+
+    phosphor::state::manager::SystemdTargetLogging targetMon(targetData, bus);
+
+    std::string invalidUnit = "invalid_unit";
+    std::string validError = "timeout";
+    const std::string* errorToLog =
+        targetMon.processError(invalidUnit, validError);
+    EXPECT_EQ(errorToLog, nullptr);
+
+    std::string validUnit = "obmc-chassis-poweron@0.target";
+    std::string invalidError = "invalid_error";
+    errorToLog = targetMon.processError(validUnit, invalidError);
+    EXPECT_EQ(errorToLog, nullptr);
+
+    errorToLog = targetMon.processError(validUnit, validError);
+    EXPECT_NE(errorToLog, nullptr);
+    EXPECT_EQ(*errorToLog,
+              "xyz.openbmc_project.State.Chassis.Error.PowerOnTargetFailure");
+}