#pragma once #include #include 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* SwapJouralHandler(SdJournalHandler* with); } // namespace logging } // namespace phosphor