diff --git a/test/extensions_test.cpp b/test/extensions_test.cpp
new file mode 100644
index 0000000..17c3395
--- /dev/null
+++ b/test/extensions_test.cpp
@@ -0,0 +1,98 @@
+#include "elog_entry.hpp"
+#include "extensions.hpp"
+
+#include <gtest/gtest.h>
+
+using namespace phosphor::logging;
+
+// gtest doesn't like this happening in another file, so do it here.
+StartupFunctions Extensions::startupFunctions{};
+CreateFunctions Extensions::createFunctions{};
+DeleteFunctions Extensions::deleteFunctions{};
+DeleteProhibitedFunctions Extensions::deleteProhibitedFunctions{};
+Extensions::DefaultErrorCaps Extensions::defaultErrorCaps =
+    Extensions::DefaultErrorCaps::enable;
+
+void startup1(internal::Manager& manager)
+{
+}
+
+void startup2(internal::Manager& manager)
+{
+}
+
+void create1(const std::string& message, uint32_t id, uint64_t timestamp,
+             Entry::Level severity, const AdditionalDataArg& additionalData,
+             const AssociationEndpointsArg& assocs)
+{
+}
+
+void create2(const std::string& message, uint32_t id, uint64_t timestamp,
+             Entry::Level severity, const AdditionalDataArg& additionalData,
+             const AssociationEndpointsArg& assocs)
+{
+}
+
+void deleteLog1(uint32_t id)
+{
+}
+
+void deleteLog2(uint32_t id)
+{
+}
+
+void deleteProhibited1(uint32_t id, bool& prohibited)
+{
+    prohibited = true;
+}
+
+void deleteProhibited2(uint32_t id, bool& prohibited)
+{
+    prohibited = true;
+}
+
+DISABLE_LOG_ENTRY_CAPS();
+REGISTER_EXTENSION_FUNCTION(startup1);
+REGISTER_EXTENSION_FUNCTION(startup2);
+REGISTER_EXTENSION_FUNCTION(create1);
+REGISTER_EXTENSION_FUNCTION(create2);
+REGISTER_EXTENSION_FUNCTION(deleteProhibited1);
+REGISTER_EXTENSION_FUNCTION(deleteProhibited2);
+REGISTER_EXTENSION_FUNCTION(deleteLog1);
+REGISTER_EXTENSION_FUNCTION(deleteLog2);
+
+TEST(ExtensionsTest, FunctionCallTest)
+{
+    auto bus = sdbusplus::bus::new_default();
+    internal::Manager manager(bus, "testpath");
+
+    EXPECT_EQ(Extensions::getStartupFunctions().size(), 2);
+    for (auto& s : Extensions::getStartupFunctions())
+    {
+        s(manager);
+    }
+
+    AdditionalDataArg ad;
+    AssociationEndpointsArg assocs;
+    EXPECT_EQ(Extensions::getCreateFunctions().size(), 2);
+    for (auto& c : Extensions::getCreateFunctions())
+    {
+        c("test", 5, 6, Entry::Level::Informational, ad, assocs);
+    }
+
+    EXPECT_EQ(Extensions::getDeleteFunctions().size(), 2);
+    for (auto& d : Extensions::getDeleteFunctions())
+    {
+        d(5);
+    }
+
+    EXPECT_EQ(Extensions::getDeleteProhibitedFunctions().size(), 2);
+    for (auto& p : Extensions::getDeleteProhibitedFunctions())
+    {
+        bool prohibited = false;
+        p(5, prohibited);
+        EXPECT_TRUE(prohibited);
+    }
+
+    EXPECT_TRUE(Extensions::disableDefaultLogCaps());
+}
