diff --git a/lib/cpp/test/TFDTransportTest.cpp b/lib/cpp/test/TFDTransportTest.cpp
index 47780ff..edbc55a 100644
--- a/lib/cpp/test/TFDTransportTest.cpp
+++ b/lib/cpp/test/TFDTransportTest.cpp
@@ -30,8 +30,8 @@
 int main() {
   { TFDTransport t(256, TFDTransport::NO_CLOSE_ON_DESTROY); }
 
-  // Disabled on MSVC because the RTL asserts on an invalid file descriptor
-  // in both debug and release mode; at least in MSVCR100 (Visual Studio 2010)
+// Disabled on MSVC because the RTL asserts on an invalid file descriptor
+// in both debug and release mode; at least in MSVCR100 (Visual Studio 2010)
 #if !defined(WIN32)
   try {
     {
diff --git a/lib/cpp/test/TMemoryBufferTest.cpp b/lib/cpp/test/TMemoryBufferTest.cpp
index ec0f392..b562b34 100644
--- a/lib/cpp/test/TMemoryBufferTest.cpp
+++ b/lib/cpp/test/TMemoryBufferTest.cpp
@@ -36,8 +36,7 @@
 using std::endl;
 using std::string;
 
-BOOST_AUTO_TEST_CASE(test_read_write_grow)
-{
+BOOST_AUTO_TEST_CASE(test_read_write_grow) {
   // Added to test the fix for THRIFT-1248
   TMemoryBuffer uut;
   const int maxSize = 65536;
@@ -45,25 +44,21 @@
   std::vector<uint8_t> buf;
   buf.resize(maxSize);
 
-  for (uint32_t i = 0; i < maxSize; ++i)
-  {
+  for (uint32_t i = 0; i < maxSize; ++i) {
     buf[i] = static_cast<uint8_t>(i);
   }
 
-  for (uint32_t i = 1; i < maxSize; i *= 2)
-  {
+  for (uint32_t i = 1; i < maxSize; i *= 2) {
     uut.write(&buf[0], i);
   }
 
-  for (uint32_t i = 1; i < maxSize; i *= 2)
-  {
+  for (uint32_t i = 1; i < maxSize; i *= 2) {
     uut.read(verify, i);
     BOOST_CHECK_EQUAL(0, ::memcmp(verify, &buf[0], i));
   }
 }
 
-BOOST_AUTO_TEST_CASE(test_roundtrip)
-{
+BOOST_AUTO_TEST_CASE(test_roundtrip) {
   shared_ptr<TMemoryBuffer> strBuffer(new TMemoryBuffer());
   shared_ptr<TBinaryProtocol> binaryProtcol(new TBinaryProtocol(strBuffer));
 
@@ -85,8 +80,7 @@
   assert(a == a2);
 }
 
-BOOST_AUTO_TEST_CASE(test_copy)
-{
+BOOST_AUTO_TEST_CASE(test_copy) {
   string* str1 = new string("abcd1234");
   const char* data1 = str1->data();
   TMemoryBuffer buf((uint8_t*)str1->data(),
@@ -108,8 +102,7 @@
   assert(str4 == "67891234");
 }
 
-BOOST_AUTO_TEST_CASE(test_exceptions)
-{
+BOOST_AUTO_TEST_CASE(test_exceptions) {
   char data[] = "foo\0bar";
 
   TMemoryBuffer buf1((uint8_t*)data, 7, TMemoryBuffer::OBSERVE);
diff --git a/lib/cpp/test/TServerIntegrationTest.cpp b/lib/cpp/test/TServerIntegrationTest.cpp
index fec1b9c..42ec5d6 100644
--- a/lib/cpp/test/TServerIntegrationTest.cpp
+++ b/lib/cpp/test/TServerIntegrationTest.cpp
@@ -68,8 +68,7 @@
 /**
  * preServe runs after listen() is successful, when we can connect
  */
-class TServerReadyEventHandler : public TServerEventHandler, public Monitor
-{
+class TServerReadyEventHandler : public TServerEventHandler, public Monitor {
 public:
   TServerReadyEventHandler() : isListening_(false), accepted_(0) {}
   virtual ~TServerReadyEventHandler() {}
@@ -90,6 +89,7 @@
   }
   bool isListening() const { return isListening_; }
   uint64_t acceptedCount() const { return accepted_; }
+
 private:
   bool isListening_;
   uint64_t accepted_;
@@ -127,16 +127,11 @@
     THRIFT_UNUSED_VARIABLE(length);
   }
 
-  void onewayWait() {
-  }
+  void onewayWait() {}
 
-  void exceptionWait(const std::string& message) {
-    THRIFT_UNUSED_VARIABLE(message);
-  }
+  void exceptionWait(const std::string& message) { THRIFT_UNUSED_VARIABLE(message); }
 
-  void unexpectedExceptionWait(const std::string& message) {
-    THRIFT_UNUSED_VARIABLE(message);
-  }
+  void unexpectedExceptionWait(const std::string& message) { THRIFT_UNUSED_VARIABLE(message); }
 
 protected:
   Mutex mutex_;
@@ -144,34 +139,31 @@
   std::vector<std::string> strings_;
 };
 
-void autoSocketCloser(TSocket *pSock) {
+void autoSocketCloser(TSocket* pSock) {
   pSock->close();
   delete pSock;
 }
 
-template<class TServerType>
-class TServerIntegrationTestFixture : public TestPortFixture
-{
+template <class TServerType>
+class TServerIntegrationTestFixture : public TestPortFixture {
 public:
-  TServerIntegrationTestFixture(const boost::shared_ptr<TProcessorFactory>& _processorFactory) :
-      pServer(new TServerType(
-                    _processorFactory,
-                    boost::shared_ptr<TServerTransport>(new TServerSocket("localhost", m_serverPort)),
-                    boost::shared_ptr<TTransportFactory>(new TTransportFactory),
-                    boost::shared_ptr<TProtocolFactory>(new TBinaryProtocolFactory))),
-      pEventHandler(boost::shared_ptr<TServerReadyEventHandler>(new TServerReadyEventHandler))
-  {
+  TServerIntegrationTestFixture(const boost::shared_ptr<TProcessorFactory>& _processorFactory)
+    : pServer(new TServerType(_processorFactory,
+                              boost::shared_ptr<TServerTransport>(
+                                  new TServerSocket("localhost", m_serverPort)),
+                              boost::shared_ptr<TTransportFactory>(new TTransportFactory),
+                              boost::shared_ptr<TProtocolFactory>(new TBinaryProtocolFactory))),
+      pEventHandler(boost::shared_ptr<TServerReadyEventHandler>(new TServerReadyEventHandler)) {
     pServer->setServerEventHandler(pEventHandler);
   }
 
-  TServerIntegrationTestFixture(const boost::shared_ptr<TProcessor>& _processor) :
-      pServer(new TServerType(
-                    _processor,
-                    boost::shared_ptr<TServerTransport>(new TServerSocket("localhost", 0)),
-                    boost::shared_ptr<TTransportFactory>(new TTransportFactory),
-                    boost::shared_ptr<TProtocolFactory>(new TBinaryProtocolFactory))),
-      pEventHandler(boost::shared_ptr<TServerReadyEventHandler>(new TServerReadyEventHandler))
-  {
+  TServerIntegrationTestFixture(const boost::shared_ptr<TProcessor>& _processor)
+    : pServer(
+          new TServerType(_processor,
+                          boost::shared_ptr<TServerTransport>(new TServerSocket("localhost", 0)),
+                          boost::shared_ptr<TTransportFactory>(new TTransportFactory),
+                          boost::shared_ptr<TProtocolFactory>(new TBinaryProtocolFactory))),
+      pEventHandler(boost::shared_ptr<TServerReadyEventHandler>(new TServerReadyEventHandler)) {
     pServer->setServerEventHandler(pEventHandler);
   }
 
@@ -181,7 +173,7 @@
     // block until listen() completes so clients will be able to connect
     Synchronized sync(*(pEventHandler.get()));
     while (!pEventHandler->isListening()) {
-        pEventHandler->wait();
+      pEventHandler->wait();
     }
 
     BOOST_MESSAGE("server is listening");
@@ -190,7 +182,7 @@
   void blockUntilAccepted(uint64_t numAccepted) {
     Synchronized sync(*(pEventHandler.get()));
     while (pEventHandler->acceptedCount() < numAccepted) {
-        pEventHandler->wait();
+      pEventHandler->wait();
     }
 
     BOOST_MESSAGE(boost::format("server has accepted %1%") % numAccepted);
@@ -207,12 +199,10 @@
     }
   }
 
-  ~TServerIntegrationTestFixture() {
-    stopServer();
-  }
+  ~TServerIntegrationTestFixture() { stopServer(); }
 
   int getServerPort() {
-    TServerSocket *pSock = dynamic_cast<TServerSocket *>(pServer->getServerTransport().get());
+    TServerSocket* pSock = dynamic_cast<TServerSocket*>(pServer->getServerTransport().get());
     return pSock->getPort();
   }
 
@@ -227,24 +217,23 @@
     std::vector<boost::shared_ptr<boost::thread> > holdThreads;
 
     for (int64_t i = 0; i < numToMake; ++i) {
-        boost::shared_ptr<TSocket> pClientSock(new TSocket("localhost", getServerPort()), autoSocketCloser);
-        holdSockets.push_back(pClientSock);
-        boost::shared_ptr<TProtocol> pClientProtocol(new TBinaryProtocol(pClientSock));
-        ParentServiceClient client(pClientProtocol);
-        pClientSock->open();
-        client.incrementGeneration();
-        holdThreads.push_back(
-                boost::shared_ptr<boost::thread>(
-                        new boost::thread(
-                                boost::bind(&TServerIntegrationTestFixture::delayClose, this,
-                                            pClientSock, milliseconds(100 * numToMake)))));
+      boost::shared_ptr<TSocket> pClientSock(new TSocket("localhost", getServerPort()),
+                                             autoSocketCloser);
+      holdSockets.push_back(pClientSock);
+      boost::shared_ptr<TProtocol> pClientProtocol(new TBinaryProtocol(pClientSock));
+      ParentServiceClient client(pClientProtocol);
+      pClientSock->open();
+      client.incrementGeneration();
+      holdThreads.push_back(boost::shared_ptr<boost::thread>(
+          new boost::thread(boost::bind(&TServerIntegrationTestFixture::delayClose,
+                                        this,
+                                        pClientSock,
+                                        milliseconds(100 * numToMake)))));
     }
 
     BOOST_CHECK_EQUAL(expectedHWM, pServer->getConcurrentClientCountHWM());
     stopServer();
-    BOOST_FOREACH(boost::shared_ptr<boost::thread> pThread, holdThreads) {
-        pThread->join();
-    }
+    BOOST_FOREACH (boost::shared_ptr<boost::thread> pThread, holdThreads) { pThread->join(); }
     holdThreads.clear();
     holdSockets.clear();
   }
@@ -254,183 +243,191 @@
   boost::shared_ptr<boost::thread> pServerThread;
 };
 
-template<class TServerType>
-class TServerIntegrationProcessorFactoryTestFixture : public TServerIntegrationTestFixture<TServerType>
-{
+template <class TServerType>
+class TServerIntegrationProcessorFactoryTestFixture
+    : public TServerIntegrationTestFixture<TServerType> {
 public:
-    TServerIntegrationProcessorFactoryTestFixture() :
-        TServerIntegrationTestFixture<TServerType>(
-                boost::make_shared<ParentServiceProcessorFactory>(
-                    boost::make_shared<ParentServiceIfSingletonFactory>(
-                            boost::make_shared<ParentHandler>()))) { }
+  TServerIntegrationProcessorFactoryTestFixture()
+    : TServerIntegrationTestFixture<TServerType>(boost::make_shared<ParentServiceProcessorFactory>(
+          boost::make_shared<ParentServiceIfSingletonFactory>(
+              boost::make_shared<ParentHandler>()))) {}
 };
 
-template<class TServerType>
-class TServerIntegrationProcessorTestFixture : public TServerIntegrationTestFixture<TServerType>
-{
+template <class TServerType>
+class TServerIntegrationProcessorTestFixture : public TServerIntegrationTestFixture<TServerType> {
 public:
-    TServerIntegrationProcessorTestFixture() :
-        TServerIntegrationTestFixture<TServerType>(
-                boost::make_shared<ParentServiceProcessor>(
-                        boost::make_shared<ParentHandler>())) { }
+  TServerIntegrationProcessorTestFixture()
+    : TServerIntegrationTestFixture<TServerType>(
+          boost::make_shared<ParentServiceProcessor>(boost::make_shared<ParentHandler>())) {}
 };
 
 BOOST_AUTO_TEST_SUITE(constructors)
 
-BOOST_FIXTURE_TEST_CASE(test_simple_factory, TServerIntegrationProcessorFactoryTestFixture<TSimpleServer>)
-{
-    baseline(3, 1);
+BOOST_FIXTURE_TEST_CASE(test_simple_factory,
+                        TServerIntegrationProcessorFactoryTestFixture<TSimpleServer>) {
+  baseline(3, 1);
 }
 
-BOOST_FIXTURE_TEST_CASE(test_simple, TServerIntegrationProcessorTestFixture<TSimpleServer>)
-{
-    baseline(3, 1);
+BOOST_FIXTURE_TEST_CASE(test_simple, TServerIntegrationProcessorTestFixture<TSimpleServer>) {
+  baseline(3, 1);
 }
 
-BOOST_FIXTURE_TEST_CASE(test_threaded_factory, TServerIntegrationProcessorFactoryTestFixture<TThreadedServer>)
-{
-    baseline(10, 10);
+BOOST_FIXTURE_TEST_CASE(test_threaded_factory,
+                        TServerIntegrationProcessorFactoryTestFixture<TThreadedServer>) {
+  baseline(10, 10);
 }
 
-BOOST_FIXTURE_TEST_CASE(test_threaded, TServerIntegrationProcessorTestFixture<TThreadedServer>)
-{
-    baseline(10, 10);
+BOOST_FIXTURE_TEST_CASE(test_threaded, TServerIntegrationProcessorTestFixture<TThreadedServer>) {
+  baseline(10, 10);
 }
 
-BOOST_FIXTURE_TEST_CASE(test_threaded_bound, TServerIntegrationProcessorTestFixture<TThreadedServer>)
-{
-    pServer->setConcurrentClientLimit(4);
-    baseline(10, 4);
+BOOST_FIXTURE_TEST_CASE(test_threaded_bound,
+                        TServerIntegrationProcessorTestFixture<TThreadedServer>) {
+  pServer->setConcurrentClientLimit(4);
+  baseline(10, 4);
 }
 
-BOOST_FIXTURE_TEST_CASE(test_threadpool_factory, TServerIntegrationProcessorFactoryTestFixture<TThreadPoolServer>)
-{
-    pServer->getThreadManager()->threadFactory(
-            boost::shared_ptr<apache::thrift::concurrency::ThreadFactory>(
-                    new apache::thrift::concurrency::PlatformThreadFactory));
-    pServer->getThreadManager()->start();
+BOOST_FIXTURE_TEST_CASE(test_threadpool_factory,
+                        TServerIntegrationProcessorFactoryTestFixture<TThreadPoolServer>) {
+  pServer->getThreadManager()->threadFactory(
+      boost::shared_ptr<apache::thrift::concurrency::ThreadFactory>(
+          new apache::thrift::concurrency::PlatformThreadFactory));
+  pServer->getThreadManager()->start();
 
-    // thread factory has 4 threads as a default
-    // thread factory however is a bad way to limit concurrent clients
-    // as accept() will be called to grab a 5th client socket, in this case
-    // and then the thread factory will block adding the thread to manage
-    // that client.
-    baseline(10, 5);
+  // thread factory has 4 threads as a default
+  // thread factory however is a bad way to limit concurrent clients
+  // as accept() will be called to grab a 5th client socket, in this case
+  // and then the thread factory will block adding the thread to manage
+  // that client.
+  baseline(10, 5);
 }
 
-BOOST_FIXTURE_TEST_CASE(test_threadpool, TServerIntegrationProcessorTestFixture<TThreadPoolServer>)
-{
-    pServer->getThreadManager()->threadFactory(
-            boost::shared_ptr<apache::thrift::concurrency::ThreadFactory>(
-                    new apache::thrift::concurrency::PlatformThreadFactory));
-    pServer->getThreadManager()->start();
+BOOST_FIXTURE_TEST_CASE(test_threadpool,
+                        TServerIntegrationProcessorTestFixture<TThreadPoolServer>) {
+  pServer->getThreadManager()->threadFactory(
+      boost::shared_ptr<apache::thrift::concurrency::ThreadFactory>(
+          new apache::thrift::concurrency::PlatformThreadFactory));
+  pServer->getThreadManager()->start();
 
-    // thread factory has 4 threads as a default
-    // thread factory however is a bad way to limit concurrent clients
-    // as accept() will be called to grab a 5th client socket, in this case
-    // and then the thread factory will block adding the thread to manage
-    // that client.
-    baseline(10, 5);
+  // thread factory has 4 threads as a default
+  // thread factory however is a bad way to limit concurrent clients
+  // as accept() will be called to grab a 5th client socket, in this case
+  // and then the thread factory will block adding the thread to manage
+  // that client.
+  baseline(10, 5);
 }
 
-BOOST_FIXTURE_TEST_CASE(test_threadpool_bound, TServerIntegrationProcessorTestFixture<TThreadPoolServer>)
-{
-    pServer->getThreadManager()->threadFactory(
-            boost::shared_ptr<apache::thrift::concurrency::ThreadFactory>(
-                    new apache::thrift::concurrency::PlatformThreadFactory));
-    pServer->getThreadManager()->start();
-    pServer->setConcurrentClientLimit(4);
+BOOST_FIXTURE_TEST_CASE(test_threadpool_bound,
+                        TServerIntegrationProcessorTestFixture<TThreadPoolServer>) {
+  pServer->getThreadManager()->threadFactory(
+      boost::shared_ptr<apache::thrift::concurrency::ThreadFactory>(
+          new apache::thrift::concurrency::PlatformThreadFactory));
+  pServer->getThreadManager()->start();
+  pServer->setConcurrentClientLimit(4);
 
-    baseline(10, 4);
+  baseline(10, 4);
 }
 
 BOOST_AUTO_TEST_SUITE_END()
 
+BOOST_FIXTURE_TEST_SUITE(TServerIntegrationTest,
+                         TServerIntegrationProcessorTestFixture<TThreadedServer>)
 
-BOOST_FIXTURE_TEST_SUITE ( TServerIntegrationTest, TServerIntegrationProcessorTestFixture<TThreadedServer> )
+BOOST_AUTO_TEST_CASE(test_stop_with_interruptable_clients_connected) {
+  // This tests THRIFT-2441 new behavior: stopping the server disconnects clients
 
-BOOST_AUTO_TEST_CASE(test_stop_with_interruptable_clients_connected)
-{
-    // This tests THRIFT-2441 new behavior: stopping the server disconnects clients
+  startServer();
 
-    startServer();
+  boost::shared_ptr<TSocket> pClientSock1(new TSocket("localhost", getServerPort()),
+                                          autoSocketCloser);
+  pClientSock1->open();
 
-    boost::shared_ptr<TSocket> pClientSock1(new TSocket("localhost", getServerPort()), autoSocketCloser);
-    pClientSock1->open();
+  boost::shared_ptr<TSocket> pClientSock2(new TSocket("localhost", getServerPort()),
+                                          autoSocketCloser);
+  pClientSock2->open();
 
-    boost::shared_ptr<TSocket> pClientSock2(new TSocket("localhost", getServerPort()), autoSocketCloser);
-    pClientSock2->open();
+  // Ensure they have been accepted
+  blockUntilAccepted(2);
 
-    // Ensure they have been accepted
-    blockUntilAccepted(2);
+  // The test fixture destructor will force the sockets to disconnect
+  // Prior to THRIFT-2441, pServer->stop() would hang until clients disconnected
+  stopServer();
 
-    // The test fixture destructor will force the sockets to disconnect
-    // Prior to THRIFT-2441, pServer->stop() would hang until clients disconnected
-    stopServer();
-
-    // extra proof the server end disconnected the clients
-    uint8_t buf[1];
-    BOOST_CHECK_EQUAL(0, pClientSock1->read(&buf[0], 1));   // 0 = disconnected
-    BOOST_CHECK_EQUAL(0, pClientSock2->read(&buf[0], 1));   // 0 = disconnected
+  // extra proof the server end disconnected the clients
+  uint8_t buf[1];
+  BOOST_CHECK_EQUAL(0, pClientSock1->read(&buf[0], 1)); // 0 = disconnected
+  BOOST_CHECK_EQUAL(0, pClientSock2->read(&buf[0], 1)); // 0 = disconnected
 }
 
-BOOST_AUTO_TEST_CASE(test_stop_with_uninterruptable_clients_connected)
-{
-    // This tests pre-THRIFT-2441 behavior: stopping the server blocks until clients
-    // disconnect.
+BOOST_AUTO_TEST_CASE(test_stop_with_uninterruptable_clients_connected) {
+  // This tests pre-THRIFT-2441 behavior: stopping the server blocks until clients
+  // disconnect.
 
-    boost::dynamic_pointer_cast<TServerSocket>(pServer->getServerTransport())->
-            setInterruptableChildren(false);    // returns to pre-THRIFT-2441 behavior
+  boost::dynamic_pointer_cast<TServerSocket>(pServer->getServerTransport())
+      ->setInterruptableChildren(false); // returns to pre-THRIFT-2441 behavior
 
-    startServer();
+  startServer();
 
-    boost::shared_ptr<TSocket> pClientSock1(new TSocket("localhost", getServerPort()), autoSocketCloser);
-    pClientSock1->open();
+  boost::shared_ptr<TSocket> pClientSock1(new TSocket("localhost", getServerPort()),
+                                          autoSocketCloser);
+  pClientSock1->open();
 
-    boost::shared_ptr<TSocket> pClientSock2(new TSocket("localhost", getServerPort()), autoSocketCloser);
-    pClientSock2->open();
+  boost::shared_ptr<TSocket> pClientSock2(new TSocket("localhost", getServerPort()),
+                                          autoSocketCloser);
+  pClientSock2->open();
 
-    // Ensure they have been accepted
-    blockUntilAccepted(2);
+  // Ensure they have been accepted
+  blockUntilAccepted(2);
 
-    boost::thread t1(boost::bind(&TServerIntegrationTestFixture::delayClose, this, pClientSock1, milliseconds(250)));
-    boost::thread t2(boost::bind(&TServerIntegrationTestFixture::delayClose, this, pClientSock2, milliseconds(250)));
+  boost::thread t1(boost::bind(&TServerIntegrationTestFixture::delayClose,
+                               this,
+                               pClientSock1,
+                               milliseconds(250)));
+  boost::thread t2(boost::bind(&TServerIntegrationTestFixture::delayClose,
+                               this,
+                               pClientSock2,
+                               milliseconds(250)));
 
-    // Once the clients disconnect the server will stop
-    stopServer();
-    t1.join();
-    t2.join();
+  // Once the clients disconnect the server will stop
+  stopServer();
+  t1.join();
+  t2.join();
 }
 
-BOOST_AUTO_TEST_CASE(test_concurrent_client_limit)
-{
-    startServer();
+BOOST_AUTO_TEST_CASE(test_concurrent_client_limit) {
+  startServer();
 
-    BOOST_CHECK_EQUAL(INT64_MAX, pServer->getConcurrentClientLimit());
-    pServer->setConcurrentClientLimit(2);
-    BOOST_CHECK_EQUAL(0, pServer->getConcurrentClientCount());
-    BOOST_CHECK_EQUAL(2, pServer->getConcurrentClientLimit());
+  BOOST_CHECK_EQUAL(INT64_MAX, pServer->getConcurrentClientLimit());
+  pServer->setConcurrentClientLimit(2);
+  BOOST_CHECK_EQUAL(0, pServer->getConcurrentClientCount());
+  BOOST_CHECK_EQUAL(2, pServer->getConcurrentClientLimit());
 
-    boost::shared_ptr<TSocket> pClientSock1(new TSocket("localhost", getServerPort()), autoSocketCloser);
-    pClientSock1->open();
-    blockUntilAccepted(1);
-    BOOST_CHECK_EQUAL(1, pServer->getConcurrentClientCount());
+  boost::shared_ptr<TSocket> pClientSock1(new TSocket("localhost", getServerPort()),
+                                          autoSocketCloser);
+  pClientSock1->open();
+  blockUntilAccepted(1);
+  BOOST_CHECK_EQUAL(1, pServer->getConcurrentClientCount());
 
-    boost::shared_ptr<TSocket> pClientSock2(new TSocket("localhost", getServerPort()), autoSocketCloser);
-    pClientSock2->open();
-    blockUntilAccepted(2);
-    BOOST_CHECK_EQUAL(2, pServer->getConcurrentClientCount());
+  boost::shared_ptr<TSocket> pClientSock2(new TSocket("localhost", getServerPort()),
+                                          autoSocketCloser);
+  pClientSock2->open();
+  blockUntilAccepted(2);
+  BOOST_CHECK_EQUAL(2, pServer->getConcurrentClientCount());
 
-    // a third client cannot connect until one of the other two closes
-    boost::thread t2(boost::bind(&TServerIntegrationTestFixture::delayClose, this, pClientSock2, milliseconds(250)));
-    boost::shared_ptr<TSocket> pClientSock3(new TSocket("localhost", getServerPort()), autoSocketCloser);
-    pClientSock2->open();
-    blockUntilAccepted(2);
-    BOOST_CHECK_EQUAL(2, pServer->getConcurrentClientCount());
-    BOOST_CHECK_EQUAL(2, pServer->getConcurrentClientCountHWM());
+  // a third client cannot connect until one of the other two closes
+  boost::thread t2(boost::bind(&TServerIntegrationTestFixture::delayClose,
+                               this,
+                               pClientSock2,
+                               milliseconds(250)));
+  boost::shared_ptr<TSocket> pClientSock3(new TSocket("localhost", getServerPort()),
+                                          autoSocketCloser);
+  pClientSock2->open();
+  blockUntilAccepted(2);
+  BOOST_CHECK_EQUAL(2, pServer->getConcurrentClientCount());
+  BOOST_CHECK_EQUAL(2, pServer->getConcurrentClientCountHWM());
 
-    stopServer();
-    t2.join();
+  stopServer();
+  t2.join();
 }
 
 BOOST_AUTO_TEST_SUITE_END()
diff --git a/lib/cpp/test/TServerSocketTest.cpp b/lib/cpp/test/TServerSocketTest.cpp
index 65f99f9..ae87ba8 100644
--- a/lib/cpp/test/TServerSocketTest.cpp
+++ b/lib/cpp/test/TServerSocketTest.cpp
@@ -29,44 +29,39 @@
 using apache::thrift::transport::TTransport;
 using apache::thrift::transport::TTransportException;
 
-BOOST_FIXTURE_TEST_SUITE ( TServerSocketTest, TestPortFixture )
+BOOST_FIXTURE_TEST_SUITE(TServerSocketTest, TestPortFixture)
 
-BOOST_AUTO_TEST_CASE( test_bind_to_address )
-{
-    TServerSocket sock1("localhost", m_serverPort);
-    sock1.listen();
-    TSocket clientSock("localhost", m_serverPort);
-    clientSock.open();
-    boost::shared_ptr<TTransport> accepted = sock1.accept();
-    accepted->close();
-    sock1.close();
+BOOST_AUTO_TEST_CASE(test_bind_to_address) {
+  TServerSocket sock1("localhost", m_serverPort);
+  sock1.listen();
+  TSocket clientSock("localhost", m_serverPort);
+  clientSock.open();
+  boost::shared_ptr<TTransport> accepted = sock1.accept();
+  accepted->close();
+  sock1.close();
 
-    std::cout << "An error message from getaddrinfo on the console is expected:" << std::endl;
-    TServerSocket sock2("257.258.259.260", m_serverPort);
-    BOOST_CHECK_THROW(sock2.listen(), TTransportException);
-    sock2.close();
+  std::cout << "An error message from getaddrinfo on the console is expected:" << std::endl;
+  TServerSocket sock2("257.258.259.260", m_serverPort);
+  BOOST_CHECK_THROW(sock2.listen(), TTransportException);
+  sock2.close();
 }
 
-BOOST_AUTO_TEST_CASE( test_listen_valid_port )
-{
-    TServerSocket sock1(-1);
-    TTRANSPORT_CHECK_THROW(sock1.listen(), TTransportException::BAD_ARGS);
+BOOST_AUTO_TEST_CASE(test_listen_valid_port) {
+  TServerSocket sock1(-1);
+  TTRANSPORT_CHECK_THROW(sock1.listen(), TTransportException::BAD_ARGS);
 
-    TServerSocket sock2(65536);
-    TTRANSPORT_CHECK_THROW(sock2.listen(), TTransportException::BAD_ARGS);
+  TServerSocket sock2(65536);
+  TTRANSPORT_CHECK_THROW(sock2.listen(), TTransportException::BAD_ARGS);
 }
 
-BOOST_AUTO_TEST_CASE( test_close_before_listen )
-{
-    TServerSocket sock1("localhost", m_serverPort);
-    sock1.close();
+BOOST_AUTO_TEST_CASE(test_close_before_listen) {
+  TServerSocket sock1("localhost", m_serverPort);
+  sock1.close();
 }
 
-BOOST_AUTO_TEST_CASE( test_get_port )
-{
-    TServerSocket sock1("localHost", 888);
-    BOOST_CHECK_EQUAL(888, sock1.getPort());
+BOOST_AUTO_TEST_CASE(test_get_port) {
+  TServerSocket sock1("localHost", 888);
+  BOOST_CHECK_EQUAL(888, sock1.getPort());
 }
 
 BOOST_AUTO_TEST_SUITE_END()
-
diff --git a/lib/cpp/test/TServerTransportTest.cpp b/lib/cpp/test/TServerTransportTest.cpp
index 09b2c59..2047337 100644
--- a/lib/cpp/test/TServerTransportTest.cpp
+++ b/lib/cpp/test/TServerTransportTest.cpp
@@ -26,37 +26,32 @@
 using apache::thrift::transport::TTransport;
 using apache::thrift::transport::TTransportException;
 
-BOOST_AUTO_TEST_SUITE ( TServerTransportTest )
+BOOST_AUTO_TEST_SUITE(TServerTransportTest)
 
-class TestTTransport : public TTransport
-{
-};
+class TestTTransport : public TTransport {};
 
-class TestTServerTransport : public TServerTransport
-{
+class TestTServerTransport : public TServerTransport {
 public:
-    TestTServerTransport() : valid_(true) {}
-    void close() {}
-    bool valid_;
+  TestTServerTransport() : valid_(true) {}
+  void close() {}
+  bool valid_;
+
 protected:
-    boost::shared_ptr<TTransport> acceptImpl()
-    {
-        return valid_ ? boost::shared_ptr<TestTTransport>(new TestTTransport) : boost::shared_ptr<TestTTransport>();
-    }
+  boost::shared_ptr<TTransport> acceptImpl() {
+    return valid_ ? boost::shared_ptr<TestTTransport>(new TestTTransport)
+                  : boost::shared_ptr<TestTTransport>();
+  }
 };
 
-BOOST_AUTO_TEST_CASE( test_positive_accept )
-{
-    TestTServerTransport uut;
-    BOOST_CHECK(uut.accept());
+BOOST_AUTO_TEST_CASE(test_positive_accept) {
+  TestTServerTransport uut;
+  BOOST_CHECK(uut.accept());
 }
 
-BOOST_AUTO_TEST_CASE( test_negative_accept )
-{
-    TestTServerTransport uut;
-    uut.valid_ = false;
-    BOOST_CHECK_THROW(uut.accept(), TTransportException);
+BOOST_AUTO_TEST_CASE(test_negative_accept) {
+  TestTServerTransport uut;
+  uut.valid_ = false;
+  BOOST_CHECK_THROW(uut.accept(), TTransportException);
 }
 
 BOOST_AUTO_TEST_SUITE_END()
-
diff --git a/lib/cpp/test/TSocketInterruptTest.cpp b/lib/cpp/test/TSocketInterruptTest.cpp
index 4f6b2bc..02da3ee 100644
--- a/lib/cpp/test/TSocketInterruptTest.cpp
+++ b/lib/cpp/test/TSocketInterruptTest.cpp
@@ -33,122 +33,110 @@
 using apache::thrift::transport::TTransport;
 using apache::thrift::transport::TTransportException;
 
-BOOST_FIXTURE_TEST_SUITE ( TSocketInterruptTest, TestPortFixture )
+BOOST_FIXTURE_TEST_SUITE(TSocketInterruptTest, TestPortFixture)
 
-void readerWorker(boost::shared_ptr<TTransport> tt, uint32_t expectedResult)
-{
+void readerWorker(boost::shared_ptr<TTransport> tt, uint32_t expectedResult) {
+  uint8_t buf[4];
+  BOOST_CHECK_EQUAL(expectedResult, tt->read(buf, 4));
+}
+
+void readerWorkerMustThrow(boost::shared_ptr<TTransport> tt) {
+  try {
     uint8_t buf[4];
-    BOOST_CHECK_EQUAL(expectedResult, tt->read(buf, 4));
+    tt->read(buf, 4);
+    BOOST_ERROR("should not have gotten here");
+  } catch (const TTransportException& tx) {
+    BOOST_CHECK_EQUAL(TTransportException::INTERRUPTED, tx.getType());
+  }
 }
 
-void readerWorkerMustThrow(boost::shared_ptr<TTransport> tt)
-{
-    try
-    {
-        uint8_t buf[4];
-        tt->read(buf, 4);
-        BOOST_ERROR("should not have gotten here");
-    }
-    catch (const TTransportException& tx)
-    {
-        BOOST_CHECK_EQUAL(TTransportException::INTERRUPTED, tx.getType());
-    }
+BOOST_AUTO_TEST_CASE(test_interruptable_child_read) {
+  TServerSocket sock1("localhost", m_serverPort);
+  sock1.listen();
+  TSocket clientSock("localhost", m_serverPort);
+  clientSock.open();
+  boost::shared_ptr<TTransport> accepted = sock1.accept();
+  boost::thread readThread(boost::bind(readerWorkerMustThrow, accepted));
+  boost::this_thread::sleep(boost::posix_time::milliseconds(50));
+  // readThread is practically guaranteed to be blocking now
+  sock1.interruptChildren();
+  BOOST_CHECK_MESSAGE(readThread.try_join_for(boost::chrono::milliseconds(200)),
+                      "server socket interruptChildren did not interrupt child read");
+  clientSock.close();
+  accepted->close();
+  sock1.close();
 }
 
-BOOST_AUTO_TEST_CASE( test_interruptable_child_read )
-{
-    TServerSocket sock1("localhost", m_serverPort);
-    sock1.listen();
-    TSocket clientSock("localhost", m_serverPort);
-    clientSock.open();
-    boost::shared_ptr<TTransport> accepted = sock1.accept();
-    boost::thread readThread(boost::bind(readerWorkerMustThrow, accepted));
-    boost::this_thread::sleep(boost::posix_time::milliseconds(50));
-    // readThread is practically guaranteed to be blocking now
-    sock1.interruptChildren();
-    BOOST_CHECK_MESSAGE(readThread.try_join_for(boost::chrono::milliseconds(200)),
-        "server socket interruptChildren did not interrupt child read");
-    clientSock.close();
-    accepted->close();
-    sock1.close();
+BOOST_AUTO_TEST_CASE(test_non_interruptable_child_read) {
+  TServerSocket sock1("localhost", m_serverPort);
+  sock1.setInterruptableChildren(false); // returns to pre-THRIFT-2441 behavior
+  sock1.listen();
+  TSocket clientSock("localhost", m_serverPort);
+  clientSock.open();
+  boost::shared_ptr<TTransport> accepted = sock1.accept();
+  boost::thread readThread(boost::bind(readerWorker, accepted, 0));
+  boost::this_thread::sleep(boost::posix_time::milliseconds(50));
+  // readThread is practically guaranteed to be blocking here
+  sock1.interruptChildren();
+  BOOST_CHECK_MESSAGE(!readThread.try_join_for(boost::chrono::milliseconds(200)),
+                      "server socket interruptChildren interrupted child read");
+
+  // only way to proceed is to have the client disconnect
+  clientSock.close();
+  readThread.join();
+  accepted->close();
+  sock1.close();
 }
 
-BOOST_AUTO_TEST_CASE( test_non_interruptable_child_read )
-{
-    TServerSocket sock1("localhost", m_serverPort);
-    sock1.setInterruptableChildren(false); // returns to pre-THRIFT-2441 behavior
-    sock1.listen();
-    TSocket clientSock("localhost", m_serverPort);
-    clientSock.open();
-    boost::shared_ptr<TTransport> accepted = sock1.accept();
-    boost::thread readThread(boost::bind(readerWorker, accepted, 0));
-    boost::this_thread::sleep(boost::posix_time::milliseconds(50));
-    // readThread is practically guaranteed to be blocking here
-    sock1.interruptChildren();
-    BOOST_CHECK_MESSAGE(!readThread.try_join_for(boost::chrono::milliseconds(200)),
-        "server socket interruptChildren interrupted child read");
-
-    // only way to proceed is to have the client disconnect
-    clientSock.close();
-    readThread.join();
-    accepted->close();
-    sock1.close();
+BOOST_AUTO_TEST_CASE(test_cannot_change_after_listen) {
+  TServerSocket sock1("localhost", m_serverPort);
+  sock1.listen();
+  BOOST_CHECK_THROW(sock1.setInterruptableChildren(false), std::logic_error);
+  sock1.close();
 }
 
-BOOST_AUTO_TEST_CASE( test_cannot_change_after_listen )
-{
-    TServerSocket sock1("localhost", m_serverPort);
-    sock1.listen();
-    BOOST_CHECK_THROW(sock1.setInterruptableChildren(false), std::logic_error);
-    sock1.close();
+void peekerWorker(boost::shared_ptr<TTransport> tt, bool expectedResult) {
+  BOOST_CHECK_EQUAL(expectedResult, tt->peek());
 }
 
-void peekerWorker(boost::shared_ptr<TTransport> tt, bool expectedResult)
-{
-    BOOST_CHECK_EQUAL(expectedResult, tt->peek());
+BOOST_AUTO_TEST_CASE(test_interruptable_child_peek) {
+  TServerSocket sock1("localhost", m_serverPort);
+  sock1.listen();
+  TSocket clientSock("localhost", m_serverPort);
+  clientSock.open();
+  boost::shared_ptr<TTransport> accepted = sock1.accept();
+  // peek() will return false if child is interrupted
+  boost::thread peekThread(boost::bind(peekerWorker, accepted, false));
+  boost::this_thread::sleep(boost::posix_time::milliseconds(50));
+  // peekThread is practically guaranteed to be blocking now
+  sock1.interruptChildren();
+  BOOST_CHECK_MESSAGE(peekThread.try_join_for(boost::chrono::milliseconds(200)),
+                      "server socket interruptChildren did not interrupt child peek");
+  clientSock.close();
+  accepted->close();
+  sock1.close();
 }
 
-BOOST_AUTO_TEST_CASE( test_interruptable_child_peek )
-{
-    TServerSocket sock1("localhost", m_serverPort);
-    sock1.listen();
-    TSocket clientSock("localhost", m_serverPort);
-    clientSock.open();
-    boost::shared_ptr<TTransport> accepted = sock1.accept();
-    // peek() will return false if child is interrupted
-    boost::thread peekThread(boost::bind(peekerWorker, accepted, false));
-    boost::this_thread::sleep(boost::posix_time::milliseconds(50));
-    // peekThread is practically guaranteed to be blocking now
-    sock1.interruptChildren();
-    BOOST_CHECK_MESSAGE(peekThread.try_join_for(boost::chrono::milliseconds(200)),
-        "server socket interruptChildren did not interrupt child peek");
-    clientSock.close();
-    accepted->close();
-    sock1.close();
-}
+BOOST_AUTO_TEST_CASE(test_non_interruptable_child_peek) {
+  TServerSocket sock1("localhost", m_serverPort);
+  sock1.setInterruptableChildren(false); // returns to pre-THRIFT-2441 behavior
+  sock1.listen();
+  TSocket clientSock("localhost", m_serverPort);
+  clientSock.open();
+  boost::shared_ptr<TTransport> accepted = sock1.accept();
+  // peek() will return false when remote side is closed
+  boost::thread peekThread(boost::bind(peekerWorker, accepted, false));
+  boost::this_thread::sleep(boost::posix_time::milliseconds(50));
+  // peekThread is practically guaranteed to be blocking now
+  sock1.interruptChildren();
+  BOOST_CHECK_MESSAGE(!peekThread.try_join_for(boost::chrono::milliseconds(200)),
+                      "server socket interruptChildren interrupted child peek");
 
-BOOST_AUTO_TEST_CASE( test_non_interruptable_child_peek )
-{
-    TServerSocket sock1("localhost", m_serverPort);
-    sock1.setInterruptableChildren(false); // returns to pre-THRIFT-2441 behavior
-    sock1.listen();
-    TSocket clientSock("localhost", m_serverPort);
-    clientSock.open();
-    boost::shared_ptr<TTransport> accepted = sock1.accept();
-    // peek() will return false when remote side is closed
-    boost::thread peekThread(boost::bind(peekerWorker, accepted, false));
-    boost::this_thread::sleep(boost::posix_time::milliseconds(50));
-    // peekThread is practically guaranteed to be blocking now
-    sock1.interruptChildren();
-    BOOST_CHECK_MESSAGE(!peekThread.try_join_for(boost::chrono::milliseconds(200)),
-        "server socket interruptChildren interrupted child peek");
-
-    // only way to proceed is to have the client disconnect
-    clientSock.close();
-    peekThread.join();
-    accepted->close();
-    sock1.close();
+  // only way to proceed is to have the client disconnect
+  clientSock.close();
+  peekThread.join();
+  accepted->close();
+  sock1.close();
 }
 
 BOOST_AUTO_TEST_SUITE_END()
-
diff --git a/lib/cpp/test/TTransportCheckThrow.h b/lib/cpp/test/TTransportCheckThrow.h
index 3b212e1..92277b4 100644
--- a/lib/cpp/test/TTransportCheckThrow.h
+++ b/lib/cpp/test/TTransportCheckThrow.h
@@ -19,15 +19,26 @@
 
 #pragma once
 
-#define TTRANSPORT_CHECK_THROW(_CALL, _TYPE) \
-  { bool caught = false; \
-    try { (_CALL); } \
-    catch (TTransportException& ex) { BOOST_CHECK_EQUAL(ex.getType(), _TYPE); caught = true; } \
-    BOOST_CHECK_MESSAGE(caught, "expected TTransportException but nothing was thrown"); }
+#define TTRANSPORT_CHECK_THROW(_CALL, _TYPE)                                                       \
+  {                                                                                                \
+    bool caught = false;                                                                           \
+    try {                                                                                          \
+      (_CALL);                                                                                     \
+    } catch (TTransportException & ex) {                                                           \
+      BOOST_CHECK_EQUAL(ex.getType(), _TYPE);                                                      \
+      caught = true;                                                                               \
+    }                                                                                              \
+    BOOST_CHECK_MESSAGE(caught, "expected TTransportException but nothing was thrown");            \
+  }
 
-#define TTRANSPORT_REQUIRE_THROW(_CALL, _TYPE) \
-  { bool caught = false; \
-    try { (_CALL); } \
-    catch (TTransportException& ex) { BOOST_REQUIRE_EQUAL(ex.getType(), _TYPE); caught = true; } \
-    BOOST_REQUIRE_MESSAGE(caught, "expected TTransportException but nothing was thrown"); }
-
+#define TTRANSPORT_REQUIRE_THROW(_CALL, _TYPE)                                                     \
+  {                                                                                                \
+    bool caught = false;                                                                           \
+    try {                                                                                          \
+      (_CALL);                                                                                     \
+    } catch (TTransportException & ex) {                                                           \
+      BOOST_REQUIRE_EQUAL(ex.getType(), _TYPE);                                                    \
+      caught = true;                                                                               \
+    }                                                                                              \
+    BOOST_REQUIRE_MESSAGE(caught, "expected TTransportException but nothing was thrown");          \
+  }
diff --git a/lib/cpp/test/TestPortFixture.h b/lib/cpp/test/TestPortFixture.h
index 5b27e5e..5af47d6 100644
--- a/lib/cpp/test/TestPortFixture.h
+++ b/lib/cpp/test/TestPortFixture.h
@@ -21,16 +21,13 @@
 
 #include <cstdlib>
 
-class TestPortFixture
-{
-  public:
-    TestPortFixture()
-    {
-        const char *spEnv = std::getenv("THRIFT_TEST_PORT");
-        m_serverPort = (spEnv) ? atoi(spEnv) : 9090;
-    }
+class TestPortFixture {
+public:
+  TestPortFixture() {
+    const char* spEnv = std::getenv("THRIFT_TEST_PORT");
+    m_serverPort = (spEnv) ? atoi(spEnv) : 9090;
+  }
 
-  protected:
-    int m_serverPort;
+protected:
+  int m_serverPort;
 };
-
diff --git a/lib/cpp/test/TypedefTest.cpp b/lib/cpp/test/TypedefTest.cpp
index eb2f743..24e9265 100644
--- a/lib/cpp/test/TypedefTest.cpp
+++ b/lib/cpp/test/TypedefTest.cpp
@@ -24,4 +24,5 @@
 
 BOOST_STATIC_ASSERT((boost::is_same<int32_t, thrift::test::MyInt32>::value));
 BOOST_STATIC_ASSERT((boost::is_same<std::string, thrift::test::MyString>::value));
-BOOST_STATIC_ASSERT((boost::is_same<thrift::test::TypedefTestStruct, thrift::test::MyStruct>::value));
+BOOST_STATIC_ASSERT(
+    (boost::is_same<thrift::test::TypedefTestStruct, thrift::test::MyStruct>::value));
