diff options
| author | Patrick Venture <venture@google.com> | 2018-04-12 14:14:42 -0700 |
|---|---|---|
| committer | Patrick Venture <venture@google.com> | 2018-05-29 11:34:15 -0700 |
| commit | dba73d71c26bc5f526806e6be2a903ecfd085a7d (patch) | |
| tree | 0368deae0a710e36a3c2aaf7b634dfdfa20a8cee | |
| parent | e2642985895f4cbcd48116a76280fc0a87557e3e (diff) | |
| download | sdbusplus-dba73d71c26bc5f526806e6be2a903ecfd085a7d.tar.gz sdbusplus-dba73d71c26bc5f526806e6be2a903ecfd085a7d.zip | |
Added sdbusplus::sdbus Interface and Mock
This is meant to be used as an interface to sd-bus. It sets up a
singleton to the default interface and a mock for use in testing.
Note: This was originally part of another patchset.
Change-Id: I133770fdeec327e018b6c587a7992cbccc7b3f10
Signed-off-by: Patrick Venture <venture@google.com>
| -rw-r--r-- | Makefile.am | 5 | ||||
| -rw-r--r-- | sdbusplus/sdbus.cpp | 3 | ||||
| -rw-r--r-- | sdbusplus/sdbus.hpp | 205 | ||||
| -rw-r--r-- | sdbusplus/test/sdbus_mock.hpp | 56 |
4 files changed, 268 insertions, 1 deletions
diff --git a/Makefile.am b/Makefile.am index 8c96b3e..9bcba6d 100644 --- a/Makefile.am +++ b/Makefile.am @@ -5,6 +5,8 @@ nobase_include_HEADERS = \ mapbox/variant.hpp \ sdbusplus/bus.hpp \ sdbusplus/bus/match.hpp \ + sdbusplus/sdbus.hpp \ + sdbusplus/test/sdbus_mock.hpp \ sdbusplus/exception.hpp \ sdbusplus/message.hpp \ sdbusplus/message/append.hpp \ @@ -23,7 +25,8 @@ nobase_include_HEADERS = \ sdbusplus/vtable.hpp LIBSDBUSPLUS_FILES = \ - sdbusplus/exception.cpp + sdbusplus/exception.cpp \ + sdbusplus/sdbus.cpp if WANT_TRANSACTION nobase_include_HEADERS += \ diff --git a/sdbusplus/sdbus.cpp b/sdbusplus/sdbus.cpp new file mode 100644 index 0000000..45a68ba --- /dev/null +++ b/sdbusplus/sdbus.cpp @@ -0,0 +1,3 @@ +#include <sdbusplus/sdbus.hpp> + +sdbusplus::SdBusImpl sdbus_impl; diff --git a/sdbusplus/sdbus.hpp b/sdbusplus/sdbus.hpp new file mode 100644 index 0000000..f3db3f3 --- /dev/null +++ b/sdbusplus/sdbus.hpp @@ -0,0 +1,205 @@ +#pragma once + +#include <systemd/sd-bus.h> + +// ABC for sdbus implementation. +namespace sdbusplus +{ + +// A wrapper for interfacing or testing sd-bus. This will hold methods for +// buses, messages, etc. +class SdBusInterface +{ + public: + virtual ~SdBusInterface() = default; + + // https://github.com/systemd/systemd/blob/master/src/systemd/sd-bus.h + virtual sd_bus_message *sd_bus_message_ref(sd_bus_message *m) = 0; + + virtual int sd_bus_message_append_basic(sd_bus_message *message, char type, + const void *value) = 0; + + virtual int sd_bus_message_at_end(sd_bus_message *m, int complete) = 0; + + virtual int sd_bus_message_close_container(sd_bus_message *m) = 0; + + virtual int sd_bus_message_enter_container(sd_bus_message *m, char type, + const char *contents) = 0; + + virtual int sd_bus_message_exit_container(sd_bus_message *m) = 0; + + virtual sd_bus *sd_bus_message_get_bus(sd_bus_message *m) = 0; + virtual int sd_bus_message_get_cookie(sd_bus_message *m, + uint64_t *cookie) = 0; + virtual const char *sd_bus_message_get_destination(sd_bus_message *m) = 0; + virtual const char *sd_bus_message_get_interface(sd_bus_message *m) = 0; + virtual const char *sd_bus_message_get_member(sd_bus_message *m) = 0; + virtual const char *sd_bus_message_get_path(sd_bus_message *m) = 0; + virtual const char *sd_bus_message_get_sender(sd_bus_message *m) = 0; + virtual const char *sd_bus_message_get_signature(sd_bus_message *m, + int complete) = 0; + + virtual int sd_bus_message_is_method_call(sd_bus_message *m, + const char *interface, + const char *member) = 0; + virtual int sd_bus_message_is_method_error(sd_bus_message *m, + const char *name) = 0; + virtual int sd_bus_message_is_signal(sd_bus_message *m, + const char *interface, + const char *member) = 0; + + virtual int sd_bus_message_new_method_return(sd_bus_message *call, + sd_bus_message **m) = 0; + + virtual int sd_bus_message_read_basic(sd_bus_message *m, char type, + void *p) = 0; + + virtual int sd_bus_message_skip(sd_bus_message *m, const char *types) = 0; + + virtual int sd_bus_message_verify_type(sd_bus_message *m, char type, + const char *contents) = 0; + + virtual int sd_bus_send(sd_bus *bus, sd_bus_message *m, + uint64_t *cookie) = 0; + + virtual int sd_bus_message_open_container(sd_bus_message *m, char type, + const char *contents) = 0; +}; + +class SdBusImpl : public SdBusInterface +{ + public: + SdBusImpl() = default; + ~SdBusImpl() = default; + SdBusImpl(const SdBusImpl &) = default; + SdBusImpl &operator=(const SdBusImpl &) = default; + SdBusImpl(SdBusImpl &&) = default; + SdBusImpl &operator=(SdBusImpl &&) = default; + + sd_bus_message *sd_bus_message_ref(sd_bus_message *m) override + { + return ::sd_bus_message_ref(m); + } + + int sd_bus_message_append_basic(sd_bus_message *message, char type, + const void *value) override + { + return ::sd_bus_message_append_basic(message, type, value); + } + + int sd_bus_message_at_end(sd_bus_message *m, int complete) override + { + return ::sd_bus_message_at_end(m, complete); + } + + int sd_bus_message_close_container(sd_bus_message *m) override + { + return ::sd_bus_message_close_container(m); + } + + int sd_bus_message_enter_container(sd_bus_message *m, char type, + const char *contents) override + { + return ::sd_bus_message_enter_container(m, type, contents); + } + + int sd_bus_message_exit_container(sd_bus_message *m) override + { + return ::sd_bus_message_exit_container(m); + } + + sd_bus *sd_bus_message_get_bus(sd_bus_message *m) override + { + return ::sd_bus_message_get_bus(m); + } + + int sd_bus_message_get_cookie(sd_bus_message *m, uint64_t *cookie) override + { + return ::sd_bus_message_get_cookie(m, cookie); + } + + const char *sd_bus_message_get_destination(sd_bus_message *m) override + { + return ::sd_bus_message_get_destination(m); + } + + const char *sd_bus_message_get_interface(sd_bus_message *m) override + { + return ::sd_bus_message_get_interface(m); + } + + const char *sd_bus_message_get_member(sd_bus_message *m) override + { + return ::sd_bus_message_get_member(m); + } + + const char *sd_bus_message_get_path(sd_bus_message *m) override + { + return ::sd_bus_message_get_path(m); + } + + const char *sd_bus_message_get_sender(sd_bus_message *m) override + { + return ::sd_bus_message_get_sender(m); + } + + const char *sd_bus_message_get_signature(sd_bus_message *m, + int complete) override + { + return ::sd_bus_message_get_signature(m, complete); + } + + int sd_bus_message_is_method_call(sd_bus_message *m, const char *interface, + const char *member) override + { + return ::sd_bus_message_is_method_call(m, interface, member); + } + + int sd_bus_message_is_method_error(sd_bus_message *m, + const char *name) override + { + return ::sd_bus_message_is_method_error(m, name); + } + + int sd_bus_message_is_signal(sd_bus_message *m, const char *interface, + const char *member) override + { + return ::sd_bus_message_is_signal(m, interface, member); + } + + int sd_bus_message_new_method_return(sd_bus_message *call, + sd_bus_message **m) override + { + return ::sd_bus_message_new_method_return(call, m); + } + + int sd_bus_message_read_basic(sd_bus_message *m, char type, + void *p) override + { + return ::sd_bus_message_read_basic(m, type, p); + } + + int sd_bus_message_skip(sd_bus_message *m, const char *types) override + { + return ::sd_bus_message_skip(m, types); + } + + int sd_bus_message_verify_type(sd_bus_message *m, char type, + const char *contents) override + { + return ::sd_bus_message_verify_type(m, type, contents); + } + + int sd_bus_send(sd_bus *bus, sd_bus_message *m, uint64_t *cookie) override + { + return ::sd_bus_send(bus, m, cookie); + } + + int sd_bus_message_open_container(sd_bus_message *m, char type, + const char *contents) override + { + return ::sd_bus_message_open_container(m, type, contents); + } +}; + +} // namespace sdbusplus diff --git a/sdbusplus/test/sdbus_mock.hpp b/sdbusplus/test/sdbus_mock.hpp new file mode 100644 index 0000000..1c2ae7e --- /dev/null +++ b/sdbusplus/test/sdbus_mock.hpp @@ -0,0 +1,56 @@ +#pragma once + +#include "gmock/gmock.h" + +#include <sdbusplus/sdbus.hpp> + +namespace sdbusplus +{ + +class SdBusMock : public SdBusInterface +{ + public: + virtual ~SdBusMock(){}; + + MOCK_METHOD1(sd_bus_message_ref, sd_bus_message *(sd_bus_message *)); + MOCK_METHOD3(sd_bus_message_append_basic, + int(sd_bus_message *, char, const void *)); + MOCK_METHOD2(sd_bus_message_at_end, int(sd_bus_message *, int)); + MOCK_METHOD1(sd_bus_message_close_container, int(sd_bus_message *)); + MOCK_METHOD3(sd_bus_message_enter_container, + int(sd_bus_message *, char, const char *)); + MOCK_METHOD1(sd_bus_message_exit_container, int(sd_bus_message *)); + + MOCK_METHOD1(sd_bus_message_get_bus, sd_bus *(sd_bus_message *)); + MOCK_METHOD2(sd_bus_message_get_cookie, int(sd_bus_message *, uint64_t *)); + MOCK_METHOD1(sd_bus_message_get_destination, + const char *(sd_bus_message *)); + MOCK_METHOD1(sd_bus_message_get_interface, const char *(sd_bus_message *)); + MOCK_METHOD1(sd_bus_message_get_member, const char *(sd_bus_message *)); + MOCK_METHOD1(sd_bus_message_get_path, const char *(sd_bus_message *)); + MOCK_METHOD1(sd_bus_message_get_sender, const char *(sd_bus_message *)); + MOCK_METHOD2(sd_bus_message_get_signature, + const char *(sd_bus_message *, int)); + + MOCK_METHOD3(sd_bus_message_is_method_call, + int(sd_bus_message *, const char *, const char *)); + MOCK_METHOD2(sd_bus_message_is_method_error, + int(sd_bus_message *, const char *)); + MOCK_METHOD3(sd_bus_message_is_signal, + int(sd_bus_message *, const char *, const char *)); + + MOCK_METHOD2(sd_bus_message_new_method_return, + int(sd_bus_message *, sd_bus_message **)); + MOCK_METHOD3(sd_bus_message_read_basic, + int(sd_bus_message *, char, void *)); + + MOCK_METHOD2(sd_bus_message_skip, int(sd_bus_message *, const char *)); + MOCK_METHOD3(sd_bus_message_verify_type, + int(sd_bus_message *, char, const char *)); + MOCK_METHOD3(sd_bus_send, int(sd_bus *, sd_bus_message *, uint64_t *)); + + MOCK_METHOD3(sd_bus_message_open_container, + int(sd_bus_message *, char, const char *)); +}; + +} // namespace sdbusplus |

