diff options
Diffstat (limited to 'test')
-rw-r--r-- | test/Makefile.am | 21 | ||||
-rw-r--r-- | test/server/Test.interface.yaml | 5 | ||||
-rw-r--r-- | test/server/object.cpp | 105 |
3 files changed, 131 insertions, 0 deletions
diff --git a/test/Makefile.am b/test/Makefile.am index ab52758..445569a 100644 --- a/test/Makefile.am +++ b/test/Makefile.am @@ -60,4 +60,25 @@ check_PROGRAMS += timer timer_SOURCES = timer.cpp timer_LDADD = $(gtest_ldadd) +server/Test/server.hpp: + @mkdir -p $(@D) + @top_srcdir@/tools/sdbus++ \ + -r $(srcdir) -t $(top_builddir)/tools/sdbusplus/templates \ + interface server-header server.Test > $@ + +server/Test/server.cpp: + @mkdir -p $(@D) + @top_srcdir@/tools/sdbus++ \ + -r $(srcdir) -t $(top_builddir)/tools/sdbusplus/templates \ + interface server-cpp server.Test > $@ + +server_test_generated_sources = server/Test/server.cpp server/Test/server.hpp + +BUILT_SOURCES = $(server_test_generated_sources) +CLEANFILES = $(server_test_generated_sources) + +check_PROGRAMS += object +object_SOURCES = server/object.cpp $(server_test_generated_sources) +object_LDADD = $(gtest_ldadd) + endif diff --git a/test/server/Test.interface.yaml b/test/server/Test.interface.yaml new file mode 100644 index 0000000..d015c99 --- /dev/null +++ b/test/server/Test.interface.yaml @@ -0,0 +1,5 @@ +description: > + A test interface +properties: + - name: SomeValue + type: int64 diff --git a/test/server/object.cpp b/test/server/object.cpp new file mode 100644 index 0000000..8faa668 --- /dev/null +++ b/test/server/object.cpp @@ -0,0 +1,105 @@ +#include "Test/server.hpp" + +#include <sdbusplus/bus.hpp> +#include <sdbusplus/server/manager.hpp> +#include <sdbusplus/test/sdbus_mock.hpp> + +#include <gtest/gtest.h> + +using ::testing::_; +using ::testing::StrEq; + +using TestInherit = + sdbusplus::server::object::object<sdbusplus::server::server::Test>; + +class Object : public ::testing::Test +{ + protected: + sdbusplus::SdBusMock sdbusMock; + sdbusplus::bus::bus bus = sdbusplus::get_mocked_new(&sdbusMock); + + static constexpr auto busName = "xyz.openbmc_project.sdbusplus.test.Object"; + static constexpr auto objPath = "/xyz/openbmc_project/sdbusplus/test"; +}; + +TEST_F(Object, InterfaceAddedOnly) +{ + // Simulate the typical usage of a service + sdbusplus::server::manager::manager objManager(bus, objPath); + bus.request_name(busName); + + EXPECT_CALL(sdbusMock, sd_bus_emit_object_added(_, StrEq(objPath))) + .Times(0); + EXPECT_CALL(sdbusMock, + sd_bus_emit_interfaces_added_strv(_, StrEq(objPath), _)) + .Times(1); + + // This only add interface to the existing object + auto test = std::make_unique<TestInherit>( + bus, objPath, TestInherit::action::emit_interface_added); + + // After destruction, the interface shall be removed + EXPECT_CALL(sdbusMock, sd_bus_emit_object_removed(_, StrEq(objPath))) + .Times(0); + EXPECT_CALL(sdbusMock, + sd_bus_emit_interfaces_removed_strv(_, StrEq(objPath), _)) + .Times(1); +} + +TEST_F(Object, DeferAddInterface) +{ + // Simulate the typical usage of a service + sdbusplus::server::manager::manager objManager(bus, objPath); + bus.request_name(busName); + + EXPECT_CALL(sdbusMock, sd_bus_emit_object_added(_, StrEq(objPath))) + .Times(0); + EXPECT_CALL(sdbusMock, + sd_bus_emit_interfaces_added_strv(_, StrEq(objPath), _)) + .Times(0); + + // It defers emit_object_added() + auto test = std::make_unique<TestInherit>(bus, objPath, + TestInherit::action::defer_emit); + + EXPECT_CALL(sdbusMock, sd_bus_emit_object_added(_, StrEq(objPath))) + .Times(1); + EXPECT_CALL(sdbusMock, + sd_bus_emit_interfaces_added_strv(_, StrEq(objPath), _)) + .Times(0); + + // Now invoke emit_object_added() + test->emit_object_added(); + + // After destruction, the object will be removed + EXPECT_CALL(sdbusMock, sd_bus_emit_object_removed(_, StrEq(objPath))) + .Times(1); + EXPECT_CALL(sdbusMock, + sd_bus_emit_interfaces_removed_strv(_, StrEq(objPath), _)) + .Times(0); +} + +TEST_F(Object, ObjectAdded) +{ + // Simulate the typical usage of a service + sdbusplus::server::manager::manager objManager(bus, objPath); + bus.request_name(busName); + + EXPECT_CALL(sdbusMock, sd_bus_emit_object_added(_, StrEq(objPath))) + .Times(1); + EXPECT_CALL(sdbusMock, + sd_bus_emit_interfaces_added_strv(_, StrEq(objPath), _)) + .Times(0); + + // Note: this is the wrong usage! + // With the below code, the interface is added as expected, but after + // destruction of TestInherit, the whole object will be removed from DBus. + // Refer to InterfaceAddedOnly case for the correct usage. + auto test = std::make_unique<TestInherit>(bus, objPath); + + EXPECT_CALL(sdbusMock, sd_bus_emit_object_removed(_, StrEq(objPath))) + .Times(1); + EXPECT_CALL(sdbusMock, + sd_bus_emit_interfaces_removed_strv(_, StrEq(objPath), _)) + .Times(0); +} |