diff --git a/test/helper.hpp b/test/helper.hpp
index ac2c572..64aaefc 100644
--- a/test/helper.hpp
+++ b/test/helper.hpp
@@ -10,7 +10,6 @@
 
 namespace blobs
 {
-std::vector<std::uint8_t>
-    validateReply(ipmi::RspType<std::vector<uint8_t>> reply,
-                  bool hasData = true);
+std::vector<std::uint8_t> validateReply(
+    ipmi::RspType<std::vector<uint8_t>> reply, bool hasData = true);
 } // namespace blobs
diff --git a/test/ipmi_open_unittest.cpp b/test/ipmi_open_unittest.cpp
index cdd4dc3..b938cbe 100644
--- a/test/ipmi_open_unittest.cpp
+++ b/test/ipmi_open_unittest.cpp
@@ -77,9 +77,9 @@
 
     EXPECT_CALL(mgr, open(req.flags, StrEq(blobId), NotNull()))
         .WillOnce(Invoke([&](uint16_t, const std::string&, uint16_t* session) {
-        (*session) = returnedSession;
-        return true;
-    }));
+            (*session) = returnedSession;
+            return true;
+        }));
 
     auto result = validateReply(openBlob(&mgr, request));
 
diff --git a/test/ipmi_sessionstat_unittest.cpp b/test/ipmi_sessionstat_unittest.cpp
index 56171f2..3278f25 100644
--- a/test/ipmi_sessionstat_unittest.cpp
+++ b/test/ipmi_sessionstat_unittest.cpp
@@ -64,10 +64,10 @@
     EXPECT_CALL(mgr, stat(Matcher<uint16_t>(req.sessionId),
                           Matcher<BlobMeta*>(NotNull())))
         .WillOnce(Invoke([&](uint16_t, BlobMeta* meta) {
-        meta->blobState = blobState;
-        meta->size = size;
-        return true;
-    }));
+            meta->blobState = blobState;
+            meta->size = size;
+            return true;
+        }));
 
     auto result = validateReply(sessionStatBlob(&mgr, request));
 
@@ -105,9 +105,9 @@
     EXPECT_CALL(mgr, stat(Matcher<uint16_t>(req.sessionId),
                           Matcher<BlobMeta*>(NotNull())))
         .WillOnce(Invoke([&](uint16_t, BlobMeta* meta) {
-        (*meta) = lmeta;
-        return true;
-    }));
+            (*meta) = lmeta;
+            return true;
+        }));
 
     auto result = validateReply(sessionStatBlob(&mgr, request));
 
diff --git a/test/ipmi_stat_unittest.cpp b/test/ipmi_stat_unittest.cpp
index aab3a76..ab091ad 100644
--- a/test/ipmi_stat_unittest.cpp
+++ b/test/ipmi_stat_unittest.cpp
@@ -88,10 +88,10 @@
     EXPECT_CALL(mgr, stat(Matcher<const std::string&>(StrEq(blobId)),
                           Matcher<BlobMeta*>(NotNull())))
         .WillOnce(Invoke([&](const std::string&, BlobMeta* meta) {
-        meta->blobState = blobState;
-        meta->size = size;
-        return true;
-    }));
+            meta->blobState = blobState;
+            meta->size = size;
+            return true;
+        }));
 
     auto result = validateReply(statBlob(&mgr, request));
 
@@ -131,9 +131,9 @@
     EXPECT_CALL(mgr, stat(Matcher<const std::string&>(StrEq(blobId)),
                           Matcher<BlobMeta*>(NotNull())))
         .WillOnce(Invoke([&](const std::string&, BlobMeta* meta) {
-        (*meta) = lmeta;
-        return true;
-    }));
+            (*meta) = lmeta;
+            return true;
+        }));
 
     auto result = validateReply(statBlob(&mgr, request));
 
diff --git a/test/ipmi_unittest.cpp b/test/ipmi_unittest.cpp
index ed2f026..4364b89 100644
--- a/test/ipmi_unittest.cpp
+++ b/test/ipmi_unittest.cpp
@@ -43,8 +43,9 @@
     // return it.
     std::string request = "asdf";
     request.push_back('\0');
-    EXPECT_STREQ("asdf", stringFromBuffer(std::vector<uint8_t>(request.begin(),
-                                                               request.end()))
-                             .c_str());
+    EXPECT_STREQ(
+        "asdf",
+        stringFromBuffer(std::vector<uint8_t>(request.begin(), request.end()))
+            .c_str());
 }
 } // namespace blobs
diff --git a/test/ipmi_write_unittest.cpp b/test/ipmi_write_unittest.cpp
index 12cf1bc..18f2909 100644
--- a/test/ipmi_write_unittest.cpp
+++ b/test/ipmi_write_unittest.cpp
@@ -28,8 +28,8 @@
     std::array<uint8_t, 2> expectedBytes = {0x66, 0x67};
     request.insert(request.end(), expectedBytes.begin(), expectedBytes.end());
 
-    EXPECT_CALL(
-        mgr, write(req.sessionId, req.offset, ElementsAreArray(expectedBytes)))
+    EXPECT_CALL(mgr, write(req.sessionId, req.offset,
+                           ElementsAreArray(expectedBytes)))
         .WillOnce(Return(false));
 
     EXPECT_EQ(ipmi::responseUnspecifiedError(), writeBlob(&mgr, request));
@@ -53,8 +53,8 @@
     std::array<uint8_t, 2> expectedBytes = {0x66, 0x67};
     request.insert(request.end(), expectedBytes.begin(), expectedBytes.end());
 
-    EXPECT_CALL(
-        mgr, write(req.sessionId, req.offset, ElementsAreArray(expectedBytes)))
+    EXPECT_CALL(mgr, write(req.sessionId, req.offset,
+                           ElementsAreArray(expectedBytes)))
         .WillOnce(Return(true));
 
     EXPECT_EQ(ipmi::responseSuccess(std::vector<uint8_t>{}),
diff --git a/test/process_unittest.cpp b/test/process_unittest.cpp
index c4273c4..e3c68a9 100644
--- a/test/process_unittest.cpp
+++ b/test/process_unittest.cpp
@@ -213,12 +213,12 @@
     std::vector<uint8_t> request(MAX_IPMI_BUFFER - 1);
     uint32_t payloadLen = sizeof(uint16_t) + sizeof(uint8_t);
 
-    IpmiBlobHandler h = [payloadLen](ManagerInterface*,
-                                     std::span<const uint8_t>) {
-        std::vector<uint8_t> output(payloadLen, 0);
-        output[2] = 0x56;
-        return ipmi::responseSuccess(output);
-    };
+    IpmiBlobHandler h =
+        [payloadLen](ManagerInterface*, std::span<const uint8_t>) {
+            std::vector<uint8_t> output(payloadLen, 0);
+            output[2] = 0x56;
+            return ipmi::responseSuccess(output);
+        };
 
     EXPECT_CALL(crcMock, generateCrc(_)).WillOnce(Return(0x3412));
 
@@ -239,12 +239,12 @@
     std::vector<uint8_t> request(MAX_IPMI_BUFFER - 1);
     uint32_t payloadLen = sizeof(uint16_t) + sizeof(uint8_t);
 
-    IpmiBlobHandler h = [payloadLen](ManagerInterface*,
-                                     std::span<const uint8_t>) {
-        std::vector<uint8_t> output(payloadLen, 0);
-        output[2] = 0x56;
-        return ipmi::responseSuccess(output);
-    };
+    IpmiBlobHandler h =
+        [payloadLen](ManagerInterface*, std::span<const uint8_t>) {
+            std::vector<uint8_t> output(payloadLen, 0);
+            output[2] = 0x56;
+            return ipmi::responseSuccess(output);
+        };
 
     EXPECT_EQ(ipmi::responseResponseError(),
               processBlobCommand(h, &manager, request, 0));
