summaryrefslogtreecommitdiffstats
path: root/phosphor-logging/sdjournal.hpp
diff options
context:
space:
mode:
Diffstat (limited to 'phosphor-logging/sdjournal.hpp')
-rw-r--r--phosphor-logging/sdjournal.hpp72
1 files changed, 72 insertions, 0 deletions
diff --git a/phosphor-logging/sdjournal.hpp b/phosphor-logging/sdjournal.hpp
new file mode 100644
index 0000000..6aa2394
--- /dev/null
+++ b/phosphor-logging/sdjournal.hpp
@@ -0,0 +1,72 @@
+#pragma once
+
+#include <systemd/sd-journal.h>
+
+#include <cstdarg>
+
+namespace phosphor
+{
+namespace logging
+{
+
+/**
+ * Implementation that calls into real sd_journal methods.
+ */
+class SdJournalHandler
+{
+ public:
+ SdJournalHandler() = default;
+ virtual ~SdJournalHandler() = default;
+ SdJournalHandler(const SdJournalHandler&) = default;
+ SdJournalHandler& operator=(const SdJournalHandler&) = default;
+ SdJournalHandler(SdJournalHandler&&) = default;
+ SdJournalHandler& operator=(SdJournalHandler&&) = default;
+
+ /**
+ * Provide a fake method that's called by the real method so we can catch
+ * the journal_send call in testing.
+ *
+ * @param[in] fmt - the format string passed into journal_send.
+ * @return an int meant to be intepreted by the journal_send caller during
+ * testing.
+ */
+ virtual int journal_send_call(const char* fmt)
+ {
+ return 0;
+ };
+
+ /**
+ * Send the information to sd_journal_send.
+ *
+ * @param[in] fmt - c string format.
+ * @param[in] ... - parameters.
+ * @return value from sd_journal_send
+ *
+ * sentinel default makes sure the last parameter is null.
+ */
+ virtual int journal_send(const char* fmt, ...)
+ __attribute__((format(printf, 2, 0))) __attribute__((sentinel))
+ {
+ va_list args;
+ va_start(args, fmt);
+
+ int rc = ::sd_journal_send(fmt, args, NULL);
+ va_end(args);
+
+ return rc;
+ }
+};
+
+extern SdJournalHandler* sdjournal_ptr;
+
+/**
+ * Swap out the sdjournal_ptr used by log<> such that a test
+ * won't need to hit the real sd_journal and fail.
+ *
+ * @param[in] with - pointer to your sdjournal_mock object.
+ * @return pointer to the previously stored sdjournal_ptr.
+ */
+SdJournalHandler* SwapJouralImpl(SdJournalHandler* with);
+
+} // namespace logging
+} // namespace phosphor
OpenPOWER on IntegriCloud