bus: add wrapper for sd_bus_list_names

Change-Id: I94467376e89cc813e270cbbe27b83c4415bb9d85
Signed-off-by: Patrick Williams <patrick@stwcx.xyz>
diff --git a/sdbusplus/bus.hpp.in b/sdbusplus/bus.hpp.in
index dc809ad..57df1bf 100644
--- a/sdbusplus/bus.hpp.in
+++ b/sdbusplus/bus.hpp.in
@@ -305,6 +305,28 @@
         sd_bus_emit_object_removed(_bus.get(), path);
     }
 
+    /** @brief Wrapper for sd_bus_list_names.
+     *
+     *  @return A vector of strings containing the 'acquired' names from
+     *          sd_bus_list_names.
+     */
+    auto list_names_acquired()
+    {
+        char** names = nullptr;
+
+        sd_bus_list_names(_bus.get(), &names, nullptr);
+
+        std::vector<std::string> result;
+        for(auto ptr = names; ptr && *ptr; ++ptr)
+        {
+            result.push_back(*ptr);
+            free(*ptr);
+        }
+        free(names);
+
+        return result;
+    }
+
     friend struct server::interface::interface;
     friend struct server::manager::manager;
     template<class... Args> friend struct server::object::object;
diff --git a/test/Makefile.am b/test/Makefile.am
index c80b2b5..bc1ede9 100644
--- a/test/Makefile.am
+++ b/test/Makefile.am
@@ -5,6 +5,10 @@
 
 TESTS = $(check_PROGRAMS)
 
+check_PROGRAMS += bus_list_names
+bus_list_names_SOURCES = bus/list_names.cpp
+bus_list_names_LDFLAGS = $(gtest_ldflags) $(SYSTEMD_LIBS)
+
 check_PROGRAMS += message_append
 message_append_CXXFLAGS = $(SYSTEMD_CFLAGS) $(PTHREAD_CFLAGS)
 message_append_LDFLAGS = $(SYSTEMD_LIBS) $(PTHREAD_LIBS)
diff --git a/test/bus/list_names.cpp b/test/bus/list_names.cpp
new file mode 100644
index 0000000..65333b7
--- /dev/null
+++ b/test/bus/list_names.cpp
@@ -0,0 +1,51 @@
+#include <gtest/gtest.h>
+#include <sdbusplus/bus.hpp>
+
+constexpr auto this_name = "xyz.openbmc_project.sdbusplus.test.ListNames";
+
+class ListNames : public ::testing::Test
+{
+    protected:
+        decltype(sdbusplus::bus::new_default()) bus =
+                sdbusplus::bus::new_default();
+};
+
+TEST_F(ListNames, NoServiceNameWithoutRequestName)
+{
+    auto names = bus.list_names_acquired();
+
+    EXPECT_EQ(names.cend(),
+              std::find(names.cbegin(), names.cend(), this_name));
+}
+
+TEST_F(ListNames, HasServiceNameAfterRequestName)
+{
+    bus.request_name(this_name);
+    auto names = bus.list_names_acquired();
+
+    auto i = std::find(names.cbegin(), names.cend(), this_name);
+
+    ASSERT_NE(names.cend(), i);
+    EXPECT_EQ(this_name, *i);
+}
+
+TEST_F(ListNames, HasUniqueName)
+{
+    auto names = bus.list_names_acquired();
+
+    ASSERT_FALSE(bus.get_unique_name().empty());
+    EXPECT_NE(names.cend(),
+              std::find(names.cbegin(), names.cend(), bus.get_unique_name()));
+}
+
+
+TEST_F(ListNames, HasDbusServer)
+{
+    auto names = bus.list_names_acquired();
+
+    auto dbus_server = "org.freedesktop.DBus";
+    auto i = std::find(names.cbegin(), names.cend(), dbus_server);
+
+    ASSERT_NE(names.cend(), i);
+    EXPECT_EQ(dbus_server, *i);
+}