diff --git a/test/message/append.cpp b/test/message/append.cpp
index c3a06db..7782f02 100644
--- a/test/message/append.cpp
+++ b/test/message/append.cpp
@@ -6,7 +6,7 @@
 // Global to share the dbus type string between client and server.
 static std::string verifyTypeString;
 
-using verifyCallback_t = void(*)(sd_bus_message*);
+using verifyCallback_t = void (*)(sd_bus_message*);
 verifyCallback_t verifyCallback = nullptr;
 
 static constexpr auto SERVICE = "sdbusplus.test.message.append";
@@ -28,12 +28,12 @@
 {
     auto bus = sdbusplus::bus::bus(reinterpret_cast<sdbusplus::bus::busp_t>(b));
 
-    while(1)
+    while (1)
     {
         // Wait for messages.
         auto m = bus.process().release();
 
-        if(m == nullptr)
+        if (m == nullptr)
         {
             bus.wait();
             continue;
@@ -50,8 +50,8 @@
             }
             else
             {
-                std::cout << "Warning: No verification for "
-                          << verifyTypeString << std::endl;
+                std::cout << "Warning: No verification for " << verifyTypeString
+                          << std::endl;
             }
             // Reply to client.
             sd_bus_reply_method_return(m, nullptr);
@@ -233,8 +233,7 @@
         const char* str3 = "1234";
         const char* const str4 = "5678";
         const auto str5 = "!@#$";
-        m.append(1, "asdf", "ASDF"s, str,
-                 std::move(str2), str3, str4, str5, 5);
+        m.append(1, "asdf", "ASDF"s, str, std::move(str2), str3, str4, str5, 5);
         verifyTypeString = "isssssssi";
 
         struct verify
@@ -245,8 +244,8 @@
                 const char *s0 = nullptr, *s1 = nullptr, *s2 = nullptr,
                            *s3 = nullptr, *s4 = nullptr, *s5 = nullptr,
                            *s6 = nullptr;
-                sd_bus_message_read(m, "isssssssi", &a, &s0, &s1, &s2, &s3,
-                                    &s4, &s5, &s6, &b);
+                sd_bus_message_read(m, "isssssssi", &a, &s0, &s1, &s2, &s3, &s4,
+                                    &s5, &s6, &b);
                 assert(a == 1);
                 assert(b == 5);
                 assert(0 == strcmp("asdf", s0));
@@ -283,7 +282,6 @@
                 assert(b == 4);
                 assert(0 == strcmp("/asdf", s0));
                 assert(0 == strcmp("iii", s1));
-
             }
         };
         verifyCallback = &verify::op;
@@ -294,7 +292,7 @@
     // Test vector.
     {
         auto m = newMethodCall__test(b);
-        std::vector<std::string> s{ "1", "2", "3"};
+        std::vector<std::string> s{"1", "2", "3"};
         m.append(1, s, 2);
         verifyTypeString = "iasi";
 
@@ -306,9 +304,8 @@
                 sd_bus_message_read(m, "i", &a);
                 assert(a == 1);
 
-                auto rc = sd_bus_message_enter_container(m,
-                                                         SD_BUS_TYPE_ARRAY,
-                                                         "s");
+                auto rc =
+                    sd_bus_message_enter_container(m, SD_BUS_TYPE_ARRAY, "s");
                 assert(0 <= rc);
 
                 const char* s = nullptr;
@@ -324,19 +321,17 @@
 
                 sd_bus_message_read(m, "i", &a);
                 assert(a == 2);
-
             }
         };
         verifyCallback = &verify::op;
 
-
         b.call_noreply(m);
     }
 
     // Test map.
     {
         auto m = newMethodCall__test(b);
-        std::map<std::string, int> s = { { "asdf", 3 }, { "jkl;", 4 } };
+        std::map<std::string, int> s = {{"asdf", 3}, {"jkl;", 4}};
         m.append(1, s, 2);
         verifyTypeString = "ia{si}i";
 
@@ -348,13 +343,11 @@
                 sd_bus_message_read(m, "i", &a);
                 assert(a == 1);
 
-                auto rc = sd_bus_message_enter_container(m,
-                                                         SD_BUS_TYPE_ARRAY,
+                auto rc = sd_bus_message_enter_container(m, SD_BUS_TYPE_ARRAY,
                                                          "{si}");
                 assert(0 <= rc);
 
-                rc = sd_bus_message_enter_container(m,
-                                                    SD_BUS_TYPE_DICT_ENTRY,
+                rc = sd_bus_message_enter_container(m, SD_BUS_TYPE_DICT_ENTRY,
                                                     "si");
                 assert(0 <= rc);
 
@@ -367,8 +360,7 @@
                 assert(1 == sd_bus_message_at_end(m, false));
                 sd_bus_message_exit_container(m);
 
-                rc = sd_bus_message_enter_container(m,
-                                                    SD_BUS_TYPE_DICT_ENTRY,
+                rc = sd_bus_message_enter_container(m, SD_BUS_TYPE_DICT_ENTRY,
                                                     "si");
                 assert(0 <= rc);
 
@@ -395,7 +387,7 @@
     // Test tuple.
     {
         auto m = newMethodCall__test(b);
-        std::tuple<int, double, std::string> a{ 3, 4.1, "asdf" };
+        std::tuple<int, double, std::string> a{3, 4.1, "asdf"};
         m.append(1, a, 2);
         verifyTypeString = "i(ids)i";
 
@@ -410,8 +402,7 @@
                 sd_bus_message_read(m, "i", &a);
                 assert(a == 1);
 
-                auto rc = sd_bus_message_enter_container(m,
-                                                         SD_BUS_TYPE_STRUCT,
+                auto rc = sd_bus_message_enter_container(m, SD_BUS_TYPE_STRUCT,
                                                          "ids");
                 assert(0 <= rc);
 
@@ -470,8 +461,8 @@
     // Test map-variant.
     {
         auto m = newMethodCall__test(b);
-        std::map<std::string, sdbusplus::message::variant<int, double>> a1 =
-                { { "asdf", 3 }, { "jkl;", 4.1 } };
+        std::map<std::string, sdbusplus::message::variant<int, double>> a1 = {
+            {"asdf", 3}, {"jkl;", 4.1}};
         m.append(1, a1, 2);
         verifyTypeString = "ia{sv}i";
 
diff --git a/test/message/native_types.cpp b/test/message/native_types.cpp
index 3b46457..eed7669 100644
--- a/test/message/native_types.cpp
+++ b/test/message/native_types.cpp
@@ -28,24 +28,24 @@
 
 TEST(MessageNativeTypeConversions, SignatureInVector)
 {
-    std::vector<sdbusplus::message::signature> v =
-        { sdbusplus::message::signature("iii") };
+    std::vector<sdbusplus::message::signature> v = {
+        sdbusplus::message::signature("iii")};
 
     ASSERT_EQ(v.front(), "iii");
 }
 
 TEST(MessageNativeTypeConversions, SignatureInMap)
 {
-    std::map<sdbusplus::message::signature, int> m =
-        { { sdbusplus::message::signature("iii"), 1 } };
+    std::map<sdbusplus::message::signature, int> m = {
+        {sdbusplus::message::signature("iii"), 1}};
 
     ASSERT_EQ(m[sdbusplus::message::signature("iii")], 1);
 }
 
 TEST(MessageNativeTypeConversions, SignatureInUnorderedMap)
 {
-    std::unordered_map<sdbusplus::message::signature, int> u =
-        { { sdbusplus::message::signature("iii"), 2 } };
+    std::unordered_map<sdbusplus::message::signature, int> u = {
+        {sdbusplus::message::signature("iii"), 2}};
 
     ASSERT_EQ(u[sdbusplus::message::signature("iii")], 2);
 }
diff --git a/test/message/read.cpp b/test/message/read.cpp
index 2b137d7..8c2c4ea 100644
--- a/test/message/read.cpp
+++ b/test/message/read.cpp
@@ -6,7 +6,7 @@
 // Global to share the dbus type string between client and server.
 static std::string verifyTypeString;
 
-using verifyCallback_t = void(*)(sdbusplus::message::message&);
+using verifyCallback_t = void (*)(sdbusplus::message::message&);
 verifyCallback_t verifyCallback = nullptr;
 
 static constexpr auto SERVICE = "sdbusplus.test.message.read";
@@ -28,12 +28,12 @@
 {
     auto bus = sdbusplus::bus::bus(reinterpret_cast<sdbusplus::bus::busp_t>(b));
 
-    while(1)
+    while (1)
     {
         // Wait for messages.
         auto m = bus.process();
 
-        if(!m)
+        if (!m)
         {
             bus.wait();
             continue;
@@ -52,8 +52,8 @@
             }
             else
             {
-                std::cout << "Warning: No verification for "
-                          << verifyTypeString << std::endl;
+                std::cout << "Warning: No verification for " << verifyTypeString
+                          << std::endl;
             }
             // Reply to client.
             sd_bus_reply_method_return(m.release(), nullptr);
@@ -133,7 +133,7 @@
             static void op(sdbusplus::message::message& m)
             {
                 int32_t a = 0, b = 0, c = 0, d = 0, e = 0;
-                m.read(a,b,c,d,e);
+                m.read(a, b, c, d, e);
                 assert(a == 1);
                 assert(b == 2);
                 assert(c == 3);
@@ -200,8 +200,7 @@
         auto m = newMethodCall__test(b);
         auto str = "jkl;"s;
         auto str2 = "JKL:"s;
-        m.append(1, "asdf", "ASDF"s, str,
-                 std::move(str2), 5);
+        m.append(1, "asdf", "ASDF"s, str, std::move(str2), 5);
         verifyTypeString = "issssi";
 
         struct verify
@@ -251,11 +250,10 @@
         b.call_noreply(m);
     }
 
-
     // Test vector.
     {
         auto m = newMethodCall__test(b);
-        std::vector<std::string> s{ "1", "2", "3"};
+        std::vector<std::string> s{"1", "2", "3"};
         m.append(1, s, 2);
         verifyTypeString = "iasi";
 
@@ -270,7 +268,7 @@
                 assert(s[0] == "1");
                 assert(s[1] == "2");
                 assert(s[2] == "3");
-                decltype(s) s2 = { "1" , "2" , "3" };
+                decltype(s) s2 = {"1", "2", "3"};
                 assert(s == s2);
             }
         };
@@ -282,7 +280,7 @@
     // Test map.
     {
         auto m = newMethodCall__test(b);
-        std::map<std::string, int> s = { { "asdf", 3 }, { "jkl;", 4 } };
+        std::map<std::string, int> s = {{"asdf", 3}, {"jkl;", 4}};
         m.append(1, s, 2);
         verifyTypeString = "ia{si}i";
 
@@ -309,7 +307,7 @@
     // Test tuple.
     {
         auto m = newMethodCall__test(b);
-        std::tuple<int, double, std::string> a{ 3, 4.1, "asdf" };
+        std::tuple<int, double, std::string> a{3, 4.1, "asdf"};
         m.append(1, a, 2);
         verifyTypeString = "i(ids)i";
 
@@ -386,8 +384,8 @@
     // Test map-variant.
     {
         auto m = newMethodCall__test(b);
-        std::map<std::string, sdbusplus::message::variant<int, double>> a1 =
-                { { "asdf", 3 }, { "jkl;", 4.1 } };
+        std::map<std::string, sdbusplus::message::variant<int, double>> a1 = {
+            {"asdf", 3}, {"jkl;", 4.1}};
         m.append(1, a1, 2);
         verifyTypeString = "ia{sv}i";
 
@@ -396,8 +394,8 @@
             static void op(sdbusplus::message::message& m)
             {
                 int32_t a = 0, b = 0;
-                std::map<std::string,
-                         sdbusplus::message::variant<int, double>> a1{};
+                std::map<std::string, sdbusplus::message::variant<int, double>>
+                    a1{};
 
                 m.read(a, a1, b);
                 assert(a == 1);
@@ -411,7 +409,6 @@
         b.call_noreply(m);
     }
 
-
     // Shutdown server.
     {
         auto m = b.new_method_call(SERVICE, "/", INTERFACE, QUIT_METHOD);
diff --git a/test/message/types.cpp b/test/message/types.cpp
index 604996e..e779c79 100644
--- a/test/message/types.cpp
+++ b/test/message/types.cpp
@@ -2,17 +2,16 @@
 #include <sdbusplus/message/types.hpp>
 #include <sdbusplus/utility/tuple_to_array.hpp>
 
-template <typename ...Args>
-auto dbus_string(Args&& ... args)
+template <typename... Args> auto dbus_string(Args&&... args)
 {
-    return std::string(
-               sdbusplus::utility::tuple_to_array(
-                   sdbusplus::message::types::type_id<Args...>()).data());
+    return std::string(sdbusplus::utility::tuple_to_array(
+                           sdbusplus::message::types::type_id<Args...>())
+                           .data());
 }
 
 TEST(MessageTypes, Integer)
 {
-    ASSERT_EQ(dbus_string(1),"i");
+    ASSERT_EQ(dbus_string(1), "i");
 }
 
 TEST(MessageTypes, Double)
