You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@ignite.apache.org by is...@apache.org on 2020/01/22 12:59:15 UTC

[ignite] branch master updated: IGNITE-12474: Support newer boost.test versions.

This is an automated email from the ASF dual-hosted git repository.

isapego pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/ignite.git


The following commit(s) were added to refs/heads/master by this push:
     new de123e2  IGNITE-12474: Support newer boost.test versions.
de123e2 is described below

commit de123e2fca5fe4320d418f686e9f35cde6a0d3fa
Author: Igor Sapego <is...@apache.org>
AuthorDate: Wed Jan 22 15:56:13 2020 +0300

    IGNITE-12474: Support newer boost.test versions.
    
    This closes #7242
---
 .../platforms/cpp/core-test/src/teamcity_boost.cpp | 120 ++++++++++-----------
 .../cpp/core-test/src/teamcity_messages.cpp        |   9 +-
 .../cpp/odbc-test/src/teamcity/teamcity_boost.cpp  | 120 ++++++++++-----------
 .../odbc-test/src/teamcity/teamcity_messages.cpp   |   9 +-
 .../src/teamcity/teamcity_boost.cpp                | 120 ++++++++++-----------
 .../src/teamcity/teamcity_messages.cpp             |   9 +-
 6 files changed, 192 insertions(+), 195 deletions(-)

diff --git a/modules/platforms/cpp/core-test/src/teamcity_boost.cpp b/modules/platforms/cpp/core-test/src/teamcity_boost.cpp
index 6d15b5d..1a87fd4 100644
--- a/modules/platforms/cpp/core-test/src/teamcity_boost.cpp
+++ b/modules/platforms/cpp/core-test/src/teamcity_boost.cpp
@@ -1,5 +1,4 @@
 /* Copyright 2011 JetBrains s.r.o.
- * Copyright 2015-2017 Alex Turbov <i....@gmail.com>
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -21,11 +20,7 @@
 #include "teamcity_messages.h"
 
 #include <boost/version.hpp>
-#if BOOST_VERSION >= 105900
-# include <boost/test/execution_monitor.hpp>
-#else                                                       // BOOST_VERSION < 105900
-# include <boost/test/unit_test_suite_impl.hpp>
-#endif                                                      // BOOST_VERSION < 105900
+#include <boost/test/execution_monitor.hpp>
 #include <boost/test/results_collector.hpp>
 #include <boost/test/utils/basic_cstring/io.hpp>
 #include <boost/test/unit_test_log.hpp>
@@ -35,15 +30,17 @@
 #include <sstream>
 
 namespace jetbrains { namespace teamcity { namespace {
-const std::string ASSERT_CTX = "Assertion has occurred in a following context:";
-const std::string FAILURE_CTX = "Failure has occurred in a following context:";
-const boost::unit_test::test_unit_type UNIT_TEST_CASE =
-#if BOOST_VERSION < 105900
-    boost::unit_test::tut_case
-#else                                                       // BOOST_VERSION >= 105900
-    boost::unit_test::TUT_CASE
-#endif                                                      // BOOST_VERSION >= 105900
-  ;
+const std::string ASSERT_CTX = "Assertion occurred in a following context:";
+const std::string FAILURE_CTX = "Failure occurred in a following context:";
+
+// In 1.59.0, they changed the name of this enum value, so we have to this hacky thing...
+#if BOOST_VERSION >= 105900
+    #define UNIT_TEST_CASE boost::unit_test::TUT_CASE
+    #define CURRENT_TEST_NAME   boost::unit_test_framework::framework::current_test_case().full_name()
+#else
+    #define UNIT_TEST_CASE boost::unit_test::tut_case
+    #define CURRENT_TEST_NAME   boost::unit_test_framework::framework::current_test_case().p_name
+#endif
 
 // Formatter implementation
 std::string toString(boost::unit_test::const_string bstr)
@@ -67,9 +64,7 @@ class TeamcityBoostLogFormatter : public boost::unit_test::unit_test_log_formatt
     TeamcityMessages messages;
     std::string currentDetails;
     std::string flowId;
-#if BOOST_VERSION >= 105900
     std::string currentContextDetails;
-#endif                                                      // BOOST_VERSION >= 105900
 
 public:
     TeamcityBoostLogFormatter(const std::string& flowId);
@@ -81,6 +76,10 @@ public:
     virtual void log_finish(std::ostream&);
     virtual void log_build_info(std::ostream&);
 
+#if BOOST_VERSION >= 107000
+    virtual void log_build_info(std::ostream&, bool);
+#endif
+
     virtual void test_unit_start(std::ostream&, const boost::unit_test::test_unit&);
     virtual void test_unit_finish(std::ostream&, const boost::unit_test::test_unit&, unsigned long);
 
@@ -88,23 +87,29 @@ public:
     virtual void log_entry_value(std::ostream&, boost::unit_test::const_string);
     virtual void log_entry_finish(std::ostream&);
 
-#if BOOST_VERSION < 105900
+
     virtual void log_exception(std::ostream&, const boost::unit_test::log_checkpoint_data&, boost::unit_test::const_string);
     virtual void test_unit_skipped(std::ostream&, const boost::unit_test::test_unit&);
-#else                                                       // BOOST_VERSION >= 105900
+
     virtual void log_exception_start(std::ostream&,const boost::unit_test::log_checkpoint_data&, const boost::execution_exception&);
     virtual void test_unit_skipped(std::ostream&, const boost::unit_test::test_unit&, boost::unit_test::const_string);
 
     virtual void log_exception_finish(std::ostream&);
     virtual void entry_context_start(std::ostream&, boost::unit_test::log_level);
-# if BOOST_VERSION < 106500
+
     virtual void log_entry_context(std::ostream&, boost::unit_test::const_string);
     virtual void entry_context_finish(std::ostream&);
-# else                                                      // BOOST_VERSION >= 106500
-    virtual void log_entry_context(std::ostream&, boost::unit_test::log_level, boost::unit_test::const_string);
-    virtual void entry_context_finish(std::ostream&, boost::unit_test::log_level);
-# endif                                                     // BOOST_VERSION >= 106500
-#endif                                                      // BOOST_VERSION >= 105900
+
+#if BOOST_VERSION >= 106500
+    // Since v1.65.0 the log level is passed to the formatters for the contexts
+    // See boostorg/test.git:fcb302b66ea09c25f0682588d22fbfdf59eac0f7
+    virtual void log_entry_context(std::ostream& os, boost::unit_test::log_level, boost::unit_test::const_string ctx) {
+        log_entry_context(os, ctx);
+    }
+    virtual void entry_context_finish(std::ostream& os, boost::unit_test::log_level) override {
+        entry_context_finish(os);
+    }
+#endif
 };
 
 // Fake fixture to register formatter
@@ -120,11 +125,11 @@ struct TeamcityFormatterRegistrar
     }
 };
 
-#if BOOST_VERSION < 106500
-    BOOST_GLOBAL_FIXTURE(TeamcityFormatterRegistrar);
-#else                                                       // BOOST_VERSION >= 106500
-    BOOST_TEST_GLOBAL_CONFIGURATION(TeamcityFormatterRegistrar);
-#endif                                                      // BOOST_VERSION >= 106500
+BOOST_GLOBAL_FIXTURE(TeamcityFormatterRegistrar);
+
+// Dummy method used to keep object file in case of static library linking
+// See README.md and https://github.com/JetBrains/teamcity-cpp/pull/19
+void TeamcityGlobalFixture() {}
 
 TeamcityBoostLogFormatter::TeamcityBoostLogFormatter(const std::string& id)
   : flowId(id)
@@ -134,10 +139,8 @@ TeamcityBoostLogFormatter::TeamcityBoostLogFormatter()
   : flowId(getFlowIdFromEnvironment())
 {}
 
-void TeamcityBoostLogFormatter::log_start(std::ostream& out, boost::unit_test::counter_t /*test_cases_amount*/)
-{
-    messages.setOutput(out);
-}
+void TeamcityBoostLogFormatter::log_start(std::ostream& /*out*/, boost::unit_test::counter_t /*test_cases_amount*/)
+{}
 
 void TeamcityBoostLogFormatter::log_finish(std::ostream& /*out*/)
 {}
@@ -145,8 +148,18 @@ void TeamcityBoostLogFormatter::log_finish(std::ostream& /*out*/)
 void TeamcityBoostLogFormatter::log_build_info(std::ostream& /*out*/)
 {}
 
-void TeamcityBoostLogFormatter::test_unit_start(std::ostream& /*out*/, const boost::unit_test::test_unit& tu)
+#if BOOST_VERSION >= 107000
+ // Since v1.70.0 the second argument indicates whether build info should be logged or not
+ // See boostorg/test.git:7e20f966dca4e4b49585bbe7654334f31b35b3db
+void log_build_info(std::ostream& os, bool log_build_info) override {
+    if (log_build_info) this->log_build_info(os);
+}
+#endif
+
+void TeamcityBoostLogFormatter::test_unit_start(std::ostream& out, const boost::unit_test::test_unit& tu)
 {
+    messages.setOutput(out);
+
     if (tu.p_type == UNIT_TEST_CASE)
         messages.testStarted(tu.p_name, flowId);
     else
@@ -155,8 +168,10 @@ void TeamcityBoostLogFormatter::test_unit_start(std::ostream& /*out*/, const boo
     currentDetails.clear();
 }
 
-void TeamcityBoostLogFormatter::test_unit_finish(std::ostream& /*out*/, const boost::unit_test::test_unit& tu, unsigned long elapsed)
+void TeamcityBoostLogFormatter::test_unit_finish(std::ostream& out, const boost::unit_test::test_unit& tu, unsigned long elapsed)
 {
+    messages.setOutput(out);
+
     const boost::unit_test::test_results& tr = boost::unit_test::results_collector.results(tu.p_id);
     if (tu.p_type == UNIT_TEST_CASE)
     {
@@ -196,11 +211,10 @@ void TeamcityBoostLogFormatter::log_entry_value(std::ostream& out, boost::unit_t
 
 void TeamcityBoostLogFormatter::log_entry_finish(std::ostream& out)
 {
-    out << '\n';
+    out << std::endl;
     currentDetails += '\n';
 }
 
-#if BOOST_VERSION < 105900
 
 void TeamcityBoostLogFormatter::log_exception(
     std::ostream& out
@@ -208,31 +222,24 @@ void TeamcityBoostLogFormatter::log_exception(
   , boost::unit_test::const_string explanation
   )
 {
-    out << explanation << '\n';
+    out << explanation << std::endl;
     currentDetails += toString(explanation) + '\n';
 }
 
-void TeamcityBoostLogFormatter::test_unit_skipped(std::ostream& /*out*/, const boost::unit_test::test_unit& tu)
-{
-    messages.testIgnored(tu.p_name, "test ignored", flowId);
-}
-
-#else                                                       // BOOST_VERSION >= 105900
+void TeamcityBoostLogFormatter::test_unit_skipped(std::ostream& /*out*/, const boost::unit_test::test_unit& /*tu*/)
+{}
 
 void TeamcityBoostLogFormatter::log_exception_start(
     std::ostream& out
-  , const boost::unit_test::log_checkpoint_data&
+  , const boost::unit_test::log_checkpoint_data& data
   , const boost::execution_exception& excpt
   )
 {
-    const std::string what = toString(excpt);
-
-    out << what << '\n';
-    currentDetails += what + '\n';
+    log_exception(out, data, excpt.what());
 }
 
 void TeamcityBoostLogFormatter::test_unit_skipped(
-    std::ostream& /*out*/
+    std::ostream& out
   , const boost::unit_test::test_unit& tu
   , boost::unit_test::const_string reason
   )
@@ -250,30 +257,21 @@ void TeamcityBoostLogFormatter::entry_context_start(std::ostream& out, boost::un
     currentContextDetails = initial_msg;
 }
 
-# if BOOST_VERSION < 106500
 void TeamcityBoostLogFormatter::log_entry_context(std::ostream& out, boost::unit_test::const_string ctx)
-# else                                                      // BOOST_VERSION >= 106500
-void TeamcityBoostLogFormatter::log_entry_context(std::ostream& out, boost::unit_test::log_level, boost::unit_test::const_string ctx)
-# endif                                                     // BOOST_VERSION >= 106500
 {
     out << "\n " << ctx;
     currentContextDetails += "\n " + toString(ctx);
 }
 
-# if BOOST_VERSION < 106500
 void TeamcityBoostLogFormatter::entry_context_finish(std::ostream& out)
-# else                                                      // BOOST_VERSION >= 106500
-void TeamcityBoostLogFormatter::entry_context_finish(std::ostream& out, boost::unit_test::log_level)
-# endif                                                     // BOOST_VERSION >= 106500
 {
     out.flush();
     messages.testOutput(
-        boost::unit_test_framework::framework::current_test_case().full_name()
+        CURRENT_TEST_NAME
       , currentContextDetails
       , flowId
       , TeamcityMessages::StdErr
       );
 }
 
-#endif                                                      // BOOST_VERSION >= 105900
 }}                                                          // namespace teamcity, jetbrains
diff --git a/modules/platforms/cpp/core-test/src/teamcity_messages.cpp b/modules/platforms/cpp/core-test/src/teamcity_messages.cpp
index 103e091..0e6b09f 100644
--- a/modules/platforms/cpp/core-test/src/teamcity_messages.cpp
+++ b/modules/platforms/cpp/core-test/src/teamcity_messages.cpp
@@ -38,9 +38,10 @@ public:
         m_out << "]" << std::endl;
     }
     /// \todo Copying char-by-char is ineffective!
-    std::string escape(const std::string s)
+    std::string escape(const std::string &s)
     {
         std::string result;
+        result.reserve(s.length());
 
         for (size_t i = 0; i < s.length(); i++)
         {
@@ -60,7 +61,7 @@ public:
         return result;
     }
 
-    void writeProperty(const char* const name, const std::string value)
+    void writeProperty(const std::string& name, const std::string& value)
     {
         m_out << ' ' << name << "='" << escape(value) << '\'';
     }
@@ -79,7 +80,7 @@ private:
 //BEGIN Public helper functions
 std::string getFlowIdFromEnvironment()
 {
-#if defined(WIN32) || defined(_WIN32) || defined(__WIN32) && !defined(__CYGWIN__)
+#if (defined(WIN32) || defined(_WIN32) || defined(__WIN32)) && !defined(__CYGWIN__) && !defined(__MINGW32__)
     char* flowId = 0;
     size_t sz = 0;
     std::string result;
@@ -98,7 +99,7 @@ std::string getFlowIdFromEnvironment()
 
 bool underTeamcity()
 {
-#if defined(WIN32) || defined(_WIN32) || defined(__WIN32) && !defined(__CYGWIN__)
+#if (defined(WIN32) || defined(_WIN32) || defined(__WIN32)) && !defined(__CYGWIN__) && !defined(__MINGW32__)
     char* teamCityProjectName = 0;
     size_t sz = 0;
     bool result = false;
diff --git a/modules/platforms/cpp/odbc-test/src/teamcity/teamcity_boost.cpp b/modules/platforms/cpp/odbc-test/src/teamcity/teamcity_boost.cpp
index 4c27ac3..1eba2d2 100644
--- a/modules/platforms/cpp/odbc-test/src/teamcity/teamcity_boost.cpp
+++ b/modules/platforms/cpp/odbc-test/src/teamcity/teamcity_boost.cpp
@@ -1,5 +1,4 @@
 /* Copyright 2011 JetBrains s.r.o.
- * Copyright 2015-2017 Alex Turbov <i....@gmail.com>
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -21,11 +20,7 @@
 #include "teamcity/teamcity_messages.h"
 
 #include <boost/version.hpp>
-#if BOOST_VERSION >= 105900
-# include <boost/test/execution_monitor.hpp>
-#else                                                       // BOOST_VERSION < 105900
-# include <boost/test/unit_test_suite_impl.hpp>
-#endif                                                      // BOOST_VERSION < 105900
+#include <boost/test/execution_monitor.hpp>
 #include <boost/test/results_collector.hpp>
 #include <boost/test/utils/basic_cstring/io.hpp>
 #include <boost/test/unit_test_log.hpp>
@@ -35,15 +30,17 @@
 #include <sstream>
 
 namespace jetbrains { namespace teamcity { namespace {
-const std::string ASSERT_CTX = "Assertion has occurred in a following context:";
-const std::string FAILURE_CTX = "Failure has occurred in a following context:";
-const boost::unit_test::test_unit_type UNIT_TEST_CASE =
-#if BOOST_VERSION < 105900
-    boost::unit_test::tut_case
-#else                                                       // BOOST_VERSION >= 105900
-    boost::unit_test::TUT_CASE
-#endif                                                      // BOOST_VERSION >= 105900
-  ;
+const std::string ASSERT_CTX = "Assertion occurred in a following context:";
+const std::string FAILURE_CTX = "Failure occurred in a following context:";
+
+// In 1.59.0, they changed the name of this enum value, so we have to this hacky thing...
+#if BOOST_VERSION >= 105900
+    #define UNIT_TEST_CASE boost::unit_test::TUT_CASE
+    #define CURRENT_TEST_NAME   boost::unit_test_framework::framework::current_test_case().full_name()
+#else
+    #define UNIT_TEST_CASE boost::unit_test::tut_case
+    #define CURRENT_TEST_NAME   boost::unit_test_framework::framework::current_test_case().p_name
+#endif
 
 // Formatter implementation
 std::string toString(boost::unit_test::const_string bstr)
@@ -67,9 +64,7 @@ class TeamcityBoostLogFormatter : public boost::unit_test::unit_test_log_formatt
     TeamcityMessages messages;
     std::string currentDetails;
     std::string flowId;
-#if BOOST_VERSION >= 105900
     std::string currentContextDetails;
-#endif                                                      // BOOST_VERSION >= 105900
 
 public:
     TeamcityBoostLogFormatter(const std::string& flowId);
@@ -81,6 +76,10 @@ public:
     virtual void log_finish(std::ostream&);
     virtual void log_build_info(std::ostream&);
 
+#if BOOST_VERSION >= 107000
+    virtual void log_build_info(std::ostream&, bool);
+#endif
+
     virtual void test_unit_start(std::ostream&, const boost::unit_test::test_unit&);
     virtual void test_unit_finish(std::ostream&, const boost::unit_test::test_unit&, unsigned long);
 
@@ -88,23 +87,29 @@ public:
     virtual void log_entry_value(std::ostream&, boost::unit_test::const_string);
     virtual void log_entry_finish(std::ostream&);
 
-#if BOOST_VERSION < 105900
+
     virtual void log_exception(std::ostream&, const boost::unit_test::log_checkpoint_data&, boost::unit_test::const_string);
     virtual void test_unit_skipped(std::ostream&, const boost::unit_test::test_unit&);
-#else                                                       // BOOST_VERSION >= 105900
+
     virtual void log_exception_start(std::ostream&,const boost::unit_test::log_checkpoint_data&, const boost::execution_exception&);
     virtual void test_unit_skipped(std::ostream&, const boost::unit_test::test_unit&, boost::unit_test::const_string);
 
     virtual void log_exception_finish(std::ostream&);
     virtual void entry_context_start(std::ostream&, boost::unit_test::log_level);
-# if BOOST_VERSION < 106500
+
     virtual void log_entry_context(std::ostream&, boost::unit_test::const_string);
     virtual void entry_context_finish(std::ostream&);
-# else                                                      // BOOST_VERSION >= 106500
-    virtual void log_entry_context(std::ostream&, boost::unit_test::log_level, boost::unit_test::const_string);
-    virtual void entry_context_finish(std::ostream&, boost::unit_test::log_level);
-# endif                                                     // BOOST_VERSION >= 106500
-#endif                                                      // BOOST_VERSION >= 105900
+
+#if BOOST_VERSION >= 106500
+    // Since v1.65.0 the log level is passed to the formatters for the contexts
+    // See boostorg/test.git:fcb302b66ea09c25f0682588d22fbfdf59eac0f7
+    virtual void log_entry_context(std::ostream& os, boost::unit_test::log_level, boost::unit_test::const_string ctx) {
+        log_entry_context(os, ctx);
+    }
+    virtual void entry_context_finish(std::ostream& os, boost::unit_test::log_level) override {
+        entry_context_finish(os);
+    }
+#endif
 };
 
 // Fake fixture to register formatter
@@ -120,11 +125,11 @@ struct TeamcityFormatterRegistrar
     }
 };
 
-#if BOOST_VERSION < 106500
-    BOOST_GLOBAL_FIXTURE(TeamcityFormatterRegistrar);
-#else                                                       // BOOST_VERSION >= 106500
-    BOOST_TEST_GLOBAL_CONFIGURATION(TeamcityFormatterRegistrar);
-#endif                                                      // BOOST_VERSION >= 106500
+BOOST_GLOBAL_FIXTURE(TeamcityFormatterRegistrar);
+
+// Dummy method used to keep object file in case of static library linking
+// See README.md and https://github.com/JetBrains/teamcity-cpp/pull/19
+void TeamcityGlobalFixture() {}
 
 TeamcityBoostLogFormatter::TeamcityBoostLogFormatter(const std::string& id)
   : flowId(id)
@@ -134,10 +139,8 @@ TeamcityBoostLogFormatter::TeamcityBoostLogFormatter()
   : flowId(getFlowIdFromEnvironment())
 {}
 
-void TeamcityBoostLogFormatter::log_start(std::ostream& out, boost::unit_test::counter_t /*test_cases_amount*/)
-{
-    messages.setOutput(out);
-}
+void TeamcityBoostLogFormatter::log_start(std::ostream& /*out*/, boost::unit_test::counter_t /*test_cases_amount*/)
+{}
 
 void TeamcityBoostLogFormatter::log_finish(std::ostream& /*out*/)
 {}
@@ -145,8 +148,18 @@ void TeamcityBoostLogFormatter::log_finish(std::ostream& /*out*/)
 void TeamcityBoostLogFormatter::log_build_info(std::ostream& /*out*/)
 {}
 
-void TeamcityBoostLogFormatter::test_unit_start(std::ostream& /*out*/, const boost::unit_test::test_unit& tu)
+#if BOOST_VERSION >= 107000
+ // Since v1.70.0 the second argument indicates whether build info should be logged or not
+ // See boostorg/test.git:7e20f966dca4e4b49585bbe7654334f31b35b3db
+void log_build_info(std::ostream& os, bool log_build_info) override {
+    if (log_build_info) this->log_build_info(os);
+}
+#endif
+
+void TeamcityBoostLogFormatter::test_unit_start(std::ostream& out, const boost::unit_test::test_unit& tu)
 {
+    messages.setOutput(out);
+
     if (tu.p_type == UNIT_TEST_CASE)
         messages.testStarted(tu.p_name, flowId);
     else
@@ -155,8 +168,10 @@ void TeamcityBoostLogFormatter::test_unit_start(std::ostream& /*out*/, const boo
     currentDetails.clear();
 }
 
-void TeamcityBoostLogFormatter::test_unit_finish(std::ostream& /*out*/, const boost::unit_test::test_unit& tu, unsigned long elapsed)
+void TeamcityBoostLogFormatter::test_unit_finish(std::ostream& out, const boost::unit_test::test_unit& tu, unsigned long elapsed)
 {
+    messages.setOutput(out);
+
     const boost::unit_test::test_results& tr = boost::unit_test::results_collector.results(tu.p_id);
     if (tu.p_type == UNIT_TEST_CASE)
     {
@@ -196,11 +211,10 @@ void TeamcityBoostLogFormatter::log_entry_value(std::ostream& out, boost::unit_t
 
 void TeamcityBoostLogFormatter::log_entry_finish(std::ostream& out)
 {
-    out << '\n';
+    out << std::endl;
     currentDetails += '\n';
 }
 
-#if BOOST_VERSION < 105900
 
 void TeamcityBoostLogFormatter::log_exception(
     std::ostream& out
@@ -208,31 +222,24 @@ void TeamcityBoostLogFormatter::log_exception(
   , boost::unit_test::const_string explanation
   )
 {
-    out << explanation << '\n';
+    out << explanation << std::endl;
     currentDetails += toString(explanation) + '\n';
 }
 
-void TeamcityBoostLogFormatter::test_unit_skipped(std::ostream& /*out*/, const boost::unit_test::test_unit& tu)
-{
-    messages.testIgnored(tu.p_name, "test ignored", flowId);
-}
-
-#else                                                       // BOOST_VERSION >= 105900
+void TeamcityBoostLogFormatter::test_unit_skipped(std::ostream& /*out*/, const boost::unit_test::test_unit& /*tu*/)
+{}
 
 void TeamcityBoostLogFormatter::log_exception_start(
     std::ostream& out
-  , const boost::unit_test::log_checkpoint_data&
+  , const boost::unit_test::log_checkpoint_data& data
   , const boost::execution_exception& excpt
   )
 {
-    const std::string what = toString(excpt);
-
-    out << what << '\n';
-    currentDetails += what + '\n';
+    log_exception(out, data, excpt.what());
 }
 
 void TeamcityBoostLogFormatter::test_unit_skipped(
-    std::ostream& /*out*/
+    std::ostream& out
   , const boost::unit_test::test_unit& tu
   , boost::unit_test::const_string reason
   )
@@ -250,30 +257,21 @@ void TeamcityBoostLogFormatter::entry_context_start(std::ostream& out, boost::un
     currentContextDetails = initial_msg;
 }
 
-# if BOOST_VERSION < 106500
 void TeamcityBoostLogFormatter::log_entry_context(std::ostream& out, boost::unit_test::const_string ctx)
-# else                                                      // BOOST_VERSION >= 106500
-void TeamcityBoostLogFormatter::log_entry_context(std::ostream& out, boost::unit_test::log_level, boost::unit_test::const_string ctx)
-# endif                                                     // BOOST_VERSION >= 106500
 {
     out << "\n " << ctx;
     currentContextDetails += "\n " + toString(ctx);
 }
 
-# if BOOST_VERSION < 106500
 void TeamcityBoostLogFormatter::entry_context_finish(std::ostream& out)
-# else                                                      // BOOST_VERSION >= 106500
-void TeamcityBoostLogFormatter::entry_context_finish(std::ostream& out, boost::unit_test::log_level)
-# endif                                                     // BOOST_VERSION >= 106500
 {
     out.flush();
     messages.testOutput(
-        boost::unit_test_framework::framework::current_test_case().full_name()
+        CURRENT_TEST_NAME
       , currentContextDetails
       , flowId
       , TeamcityMessages::StdErr
       );
 }
 
-#endif                                                      // BOOST_VERSION >= 105900
 }}                                                          // namespace teamcity, jetbrains
diff --git a/modules/platforms/cpp/odbc-test/src/teamcity/teamcity_messages.cpp b/modules/platforms/cpp/odbc-test/src/teamcity/teamcity_messages.cpp
index 068b1d6..9781e3d 100644
--- a/modules/platforms/cpp/odbc-test/src/teamcity/teamcity_messages.cpp
+++ b/modules/platforms/cpp/odbc-test/src/teamcity/teamcity_messages.cpp
@@ -38,9 +38,10 @@ public:
         m_out << "]" << std::endl;
     }
     /// \todo Copying char-by-char is ineffective!
-    std::string escape(const std::string s)
+    std::string escape(const std::string &s)
     {
         std::string result;
+        result.reserve(s.length());
 
         for (size_t i = 0; i < s.length(); i++)
         {
@@ -60,7 +61,7 @@ public:
         return result;
     }
 
-    void writeProperty(const char* const name, const std::string value)
+    void writeProperty(const std::string& name, const std::string& value)
     {
         m_out << ' ' << name << "='" << escape(value) << '\'';
     }
@@ -79,7 +80,7 @@ private:
 //BEGIN Public helper functions
 std::string getFlowIdFromEnvironment()
 {
-#if defined(WIN32) || defined(_WIN32) || defined(__WIN32) && !defined(__CYGWIN__)
+#if (defined(WIN32) || defined(_WIN32) || defined(__WIN32)) && !defined(__CYGWIN__) && !defined(__MINGW32__)
     char* flowId = 0;
     size_t sz = 0;
     std::string result;
@@ -98,7 +99,7 @@ std::string getFlowIdFromEnvironment()
 
 bool underTeamcity()
 {
-#if defined(WIN32) || defined(_WIN32) || defined(__WIN32) && !defined(__CYGWIN__)
+#if (defined(WIN32) || defined(_WIN32) || defined(__WIN32)) && !defined(__CYGWIN__) && !defined(__MINGW32__)
     char* teamCityProjectName = 0;
     size_t sz = 0;
     bool result = false;
diff --git a/modules/platforms/cpp/thin-client-test/src/teamcity/teamcity_boost.cpp b/modules/platforms/cpp/thin-client-test/src/teamcity/teamcity_boost.cpp
index 9a06bb9..3efe9e5 100644
--- a/modules/platforms/cpp/thin-client-test/src/teamcity/teamcity_boost.cpp
+++ b/modules/platforms/cpp/thin-client-test/src/teamcity/teamcity_boost.cpp
@@ -1,5 +1,4 @@
 /* Copyright 2011 JetBrains s.r.o.
- * Copyright 2015-2017 Alex Turbov <i....@gmail.com>
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -21,11 +20,7 @@
 #include "teamcity/teamcity_messages.h"
 
 #include <boost/version.hpp>
-#if BOOST_VERSION >= 105900
-# include <boost/test/execution_monitor.hpp>
-#else                                                       // BOOST_VERSION < 105900
-# include <boost/test/unit_test_suite_impl.hpp>
-#endif                                                      // BOOST_VERSION < 105900
+#include <boost/test/execution_monitor.hpp>
 #include <boost/test/results_collector.hpp>
 #include <boost/test/utils/basic_cstring/io.hpp>
 #include <boost/test/unit_test_log.hpp>
@@ -35,15 +30,17 @@
 #include <sstream>
 
 namespace jetbrains { namespace teamcity { namespace {
-const std::string ASSERT_CTX = "Assertion has occurred in a following context:";
-const std::string FAILURE_CTX = "Failure has occurred in a following context:";
-const boost::unit_test::test_unit_type UNIT_TEST_CASE =
-#if BOOST_VERSION < 105900
-    boost::unit_test::tut_case
-#else                                                       // BOOST_VERSION >= 105900
-    boost::unit_test::TUT_CASE
-#endif                                                      // BOOST_VERSION >= 105900
-  ;
+const std::string ASSERT_CTX = "Assertion occurred in a following context:";
+const std::string FAILURE_CTX = "Failure occurred in a following context:";
+
+// In 1.59.0, they changed the name of this enum value, so we have to this hacky thing...
+#if BOOST_VERSION >= 105900
+    #define UNIT_TEST_CASE boost::unit_test::TUT_CASE
+    #define CURRENT_TEST_NAME   boost::unit_test_framework::framework::current_test_case().full_name()
+#else
+    #define UNIT_TEST_CASE boost::unit_test::tut_case
+    #define CURRENT_TEST_NAME   boost::unit_test_framework::framework::current_test_case().p_name
+#endif
 
 // Formatter implementation
 std::string toString(boost::unit_test::const_string bstr)
@@ -67,9 +64,7 @@ class TeamcityBoostLogFormatter : public boost::unit_test::unit_test_log_formatt
     TeamcityMessages messages;
     std::string currentDetails;
     std::string flowId;
-#if BOOST_VERSION >= 105900
     std::string currentContextDetails;
-#endif                                                      // BOOST_VERSION >= 105900
 
 public:
     TeamcityBoostLogFormatter(const std::string& flowId);
@@ -81,6 +76,10 @@ public:
     virtual void log_finish(std::ostream&);
     virtual void log_build_info(std::ostream&);
 
+#if BOOST_VERSION >= 107000
+    virtual void log_build_info(std::ostream&, bool);
+#endif
+
     virtual void test_unit_start(std::ostream&, const boost::unit_test::test_unit&);
     virtual void test_unit_finish(std::ostream&, const boost::unit_test::test_unit&, unsigned long);
 
@@ -88,23 +87,29 @@ public:
     virtual void log_entry_value(std::ostream&, boost::unit_test::const_string);
     virtual void log_entry_finish(std::ostream&);
 
-#if BOOST_VERSION < 105900
+
     virtual void log_exception(std::ostream&, const boost::unit_test::log_checkpoint_data&, boost::unit_test::const_string);
     virtual void test_unit_skipped(std::ostream&, const boost::unit_test::test_unit&);
-#else                                                       // BOOST_VERSION >= 105900
+
     virtual void log_exception_start(std::ostream&,const boost::unit_test::log_checkpoint_data&, const boost::execution_exception&);
     virtual void test_unit_skipped(std::ostream&, const boost::unit_test::test_unit&, boost::unit_test::const_string);
 
     virtual void log_exception_finish(std::ostream&);
     virtual void entry_context_start(std::ostream&, boost::unit_test::log_level);
-# if BOOST_VERSION < 106500
+
     virtual void log_entry_context(std::ostream&, boost::unit_test::const_string);
     virtual void entry_context_finish(std::ostream&);
-# else                                                      // BOOST_VERSION >= 106500
-    virtual void log_entry_context(std::ostream&, boost::unit_test::log_level, boost::unit_test::const_string);
-    virtual void entry_context_finish(std::ostream&, boost::unit_test::log_level);
-# endif                                                     // BOOST_VERSION >= 106500
-#endif                                                      // BOOST_VERSION >= 105900
+
+#if BOOST_VERSION >= 106500
+    // Since v1.65.0 the log level is passed to the formatters for the contexts
+    // See boostorg/test.git:fcb302b66ea09c25f0682588d22fbfdf59eac0f7
+    virtual void log_entry_context(std::ostream& os, boost::unit_test::log_level, boost::unit_test::const_string ctx) {
+        log_entry_context(os, ctx);
+    }
+    virtual void entry_context_finish(std::ostream& os, boost::unit_test::log_level) override {
+        entry_context_finish(os);
+    }
+#endif
 };
 
 // Fake fixture to register formatter
@@ -120,11 +125,11 @@ struct TeamcityFormatterRegistrar
     }
 };
 
-#if BOOST_VERSION < 106500
-    BOOST_GLOBAL_FIXTURE(TeamcityFormatterRegistrar);
-#else                                                       // BOOST_VERSION >= 106500
-    BOOST_TEST_GLOBAL_CONFIGURATION(TeamcityFormatterRegistrar);
-#endif                                                      // BOOST_VERSION >= 106500
+BOOST_GLOBAL_FIXTURE(TeamcityFormatterRegistrar);
+
+// Dummy method used to keep object file in case of static library linking
+// See README.md and https://github.com/JetBrains/teamcity-cpp/pull/19
+void TeamcityGlobalFixture() {}
 
 TeamcityBoostLogFormatter::TeamcityBoostLogFormatter(const std::string& id)
   : flowId(id)
@@ -134,10 +139,8 @@ TeamcityBoostLogFormatter::TeamcityBoostLogFormatter()
   : flowId(getFlowIdFromEnvironment())
 {}
 
-void TeamcityBoostLogFormatter::log_start(std::ostream& out, boost::unit_test::counter_t /*test_cases_amount*/)
-{
-    messages.setOutput(out);
-}
+void TeamcityBoostLogFormatter::log_start(std::ostream& /*out*/, boost::unit_test::counter_t /*test_cases_amount*/)
+{}
 
 void TeamcityBoostLogFormatter::log_finish(std::ostream& /*out*/)
 {}
@@ -145,8 +148,18 @@ void TeamcityBoostLogFormatter::log_finish(std::ostream& /*out*/)
 void TeamcityBoostLogFormatter::log_build_info(std::ostream& /*out*/)
 {}
 
-void TeamcityBoostLogFormatter::test_unit_start(std::ostream& /*out*/, const boost::unit_test::test_unit& tu)
+#if BOOST_VERSION >= 107000
+ // Since v1.70.0 the second argument indicates whether build info should be logged or not
+ // See boostorg/test.git:7e20f966dca4e4b49585bbe7654334f31b35b3db
+void log_build_info(std::ostream& os, bool log_build_info) override {
+    if (log_build_info) this->log_build_info(os);
+}
+#endif
+
+void TeamcityBoostLogFormatter::test_unit_start(std::ostream& out, const boost::unit_test::test_unit& tu)
 {
+    messages.setOutput(out);
+
     if (tu.p_type == UNIT_TEST_CASE)
         messages.testStarted(tu.p_name, flowId);
     else
@@ -155,8 +168,10 @@ void TeamcityBoostLogFormatter::test_unit_start(std::ostream& /*out*/, const boo
     currentDetails.clear();
 }
 
-void TeamcityBoostLogFormatter::test_unit_finish(std::ostream& /*out*/, const boost::unit_test::test_unit& tu, unsigned long elapsed)
+void TeamcityBoostLogFormatter::test_unit_finish(std::ostream& out, const boost::unit_test::test_unit& tu, unsigned long elapsed)
 {
+    messages.setOutput(out);
+
     const boost::unit_test::test_results& tr = boost::unit_test::results_collector.results(tu.p_id);
     if (tu.p_type == UNIT_TEST_CASE)
     {
@@ -196,11 +211,10 @@ void TeamcityBoostLogFormatter::log_entry_value(std::ostream& out, boost::unit_t
 
 void TeamcityBoostLogFormatter::log_entry_finish(std::ostream& out)
 {
-    out << '\n';
+    out << std::endl;
     currentDetails += '\n';
 }
 
-#if BOOST_VERSION < 105900
 
 void TeamcityBoostLogFormatter::log_exception(
     std::ostream& out
@@ -208,31 +222,24 @@ void TeamcityBoostLogFormatter::log_exception(
   , boost::unit_test::const_string explanation
   )
 {
-    out << explanation << '\n';
+    out << explanation << std::endl;
     currentDetails += toString(explanation) + '\n';
 }
 
-void TeamcityBoostLogFormatter::test_unit_skipped(std::ostream& /*out*/, const boost::unit_test::test_unit& tu)
-{
-    messages.testIgnored(tu.p_name, "test ignored", flowId);
-}
-
-#else                                                       // BOOST_VERSION >= 105900
+void TeamcityBoostLogFormatter::test_unit_skipped(std::ostream& /*out*/, const boost::unit_test::test_unit& /*tu*/)
+{}
 
 void TeamcityBoostLogFormatter::log_exception_start(
     std::ostream& out
-  , const boost::unit_test::log_checkpoint_data&
+  , const boost::unit_test::log_checkpoint_data& data
   , const boost::execution_exception& excpt
   )
 {
-    const std::string what = toString(excpt);
-
-    out << what << '\n';
-    currentDetails += what + '\n';
+    log_exception(out, data, excpt.what());
 }
 
 void TeamcityBoostLogFormatter::test_unit_skipped(
-    std::ostream& /*out*/
+    std::ostream& out
   , const boost::unit_test::test_unit& tu
   , boost::unit_test::const_string reason
   )
@@ -250,30 +257,21 @@ void TeamcityBoostLogFormatter::entry_context_start(std::ostream& out, boost::un
     currentContextDetails = initial_msg;
 }
 
-# if BOOST_VERSION < 106500
 void TeamcityBoostLogFormatter::log_entry_context(std::ostream& out, boost::unit_test::const_string ctx)
-# else                                                      // BOOST_VERSION >= 106500
-void TeamcityBoostLogFormatter::log_entry_context(std::ostream& out, boost::unit_test::log_level, boost::unit_test::const_string ctx)
-# endif                                                     // BOOST_VERSION >= 106500
 {
     out << "\n " << ctx;
     currentContextDetails += "\n " + toString(ctx);
 }
 
-# if BOOST_VERSION < 106500
 void TeamcityBoostLogFormatter::entry_context_finish(std::ostream& out)
-# else                                                      // BOOST_VERSION >= 106500
-void TeamcityBoostLogFormatter::entry_context_finish(std::ostream& out, boost::unit_test::log_level)
-# endif                                                     // BOOST_VERSION >= 106500
 {
     out.flush();
     messages.testOutput(
-        boost::unit_test_framework::framework::current_test_case().full_name()
+        CURRENT_TEST_NAME
       , currentContextDetails
       , flowId
       , TeamcityMessages::StdErr
       );
 }
 
-#endif                                                      // BOOST_VERSION >= 105900
 }}                                                          // namespace teamcity, jetbrains
diff --git a/modules/platforms/cpp/thin-client-test/src/teamcity/teamcity_messages.cpp b/modules/platforms/cpp/thin-client-test/src/teamcity/teamcity_messages.cpp
index 068b1d6..9781e3d 100644
--- a/modules/platforms/cpp/thin-client-test/src/teamcity/teamcity_messages.cpp
+++ b/modules/platforms/cpp/thin-client-test/src/teamcity/teamcity_messages.cpp
@@ -38,9 +38,10 @@ public:
         m_out << "]" << std::endl;
     }
     /// \todo Copying char-by-char is ineffective!
-    std::string escape(const std::string s)
+    std::string escape(const std::string &s)
     {
         std::string result;
+        result.reserve(s.length());
 
         for (size_t i = 0; i < s.length(); i++)
         {
@@ -60,7 +61,7 @@ public:
         return result;
     }
 
-    void writeProperty(const char* const name, const std::string value)
+    void writeProperty(const std::string& name, const std::string& value)
     {
         m_out << ' ' << name << "='" << escape(value) << '\'';
     }
@@ -79,7 +80,7 @@ private:
 //BEGIN Public helper functions
 std::string getFlowIdFromEnvironment()
 {
-#if defined(WIN32) || defined(_WIN32) || defined(__WIN32) && !defined(__CYGWIN__)
+#if (defined(WIN32) || defined(_WIN32) || defined(__WIN32)) && !defined(__CYGWIN__) && !defined(__MINGW32__)
     char* flowId = 0;
     size_t sz = 0;
     std::string result;
@@ -98,7 +99,7 @@ std::string getFlowIdFromEnvironment()
 
 bool underTeamcity()
 {
-#if defined(WIN32) || defined(_WIN32) || defined(__WIN32) && !defined(__CYGWIN__)
+#if (defined(WIN32) || defined(_WIN32) || defined(__WIN32)) && !defined(__CYGWIN__) && !defined(__MINGW32__)
     char* teamCityProjectName = 0;
     size_t sz = 0;
     bool result = false;