diff options
Diffstat (limited to 'phosphor-logging/sdjournal.hpp')
-rw-r--r-- | phosphor-logging/sdjournal.hpp | 72 |
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 |