diff --git a/googletest/cmake/internal_utils.cmake b/googletest/cmake/internal_utils.cmake index 580ac1cbc..954ba2c93 100644 --- a/googletest/cmake/internal_utils.cmake +++ b/googletest/cmake/internal_utils.cmake @@ -75,7 +75,7 @@ macro(config_compiler_and_linker) # TODO(vladl@google.com): Add -RTCs and -RTCu to debug builds. set(cxx_base_flags "-GS -W4 -WX -wd4251 -wd4275 -nologo -J") set(cxx_base_flags "${cxx_base_flags} -D_UNICODE -DUNICODE -DWIN32 -D_WIN32") - set(cxx_base_flags "${cxx_base_flags} -DSTRICT -DWIN32_LEAN_AND_MEAN") + set(cxx_base_flags "${cxx_base_flags} -DSTRICT -DWIN32_LEAN_AND_MEAN -DNOMINMAX") set(cxx_exception_flags "-EHsc -D_HAS_EXCEPTIONS=1") set(cxx_no_exception_flags "-EHs-c- -D_HAS_EXCEPTIONS=0") set(cxx_no_rtti_flags "-GR-") diff --git a/googletest/include/gtest/internal/gtest-port.h b/googletest/include/gtest/internal/gtest-port.h index fa457b788..17227310b 100644 --- a/googletest/include/gtest/internal/gtest-port.h +++ b/googletest/include/gtest/internal/gtest-port.h @@ -708,7 +708,8 @@ typedef struct _RTL_CRITICAL_SECTION GTEST_CRITICAL_SECTION; #if defined(GTEST_OS_LINUX) || defined(GTEST_OS_GNU_KFREEBSD) || \ defined(GTEST_OS_DRAGONFLY) || defined(GTEST_OS_FREEBSD) || \ defined(GTEST_OS_NETBSD) || defined(GTEST_OS_OPENBSD) || \ - defined(GTEST_OS_GNU_HURD) || defined(GTEST_OS_MAC) + defined(GTEST_OS_GNU_HURD) || defined(GTEST_OS_MAC) || \ + defined(GTEST_OS_WINDOWS) #define GTEST_CAN_STREAM_RESULTS_ 1 #else #define GTEST_CAN_STREAM_RESULTS_ 0 diff --git a/googletest/src/gtest-death-test.cc b/googletest/src/gtest-death-test.cc index 15472f1a7..fa32b0645 100644 --- a/googletest/src/gtest-death-test.cc +++ b/googletest/src/gtest-death-test.cc @@ -62,6 +62,12 @@ #ifdef GTEST_OS_WINDOWS #include +#ifndef WIN32_LEAN_AND_MEAN +#define WIN32_LEAN_AND_MEAN +#endif +#ifndef NOMINMAX +#define NOMINMAX +#endif #else #include #include diff --git a/googletest/src/gtest-filepath.cc b/googletest/src/gtest-filepath.cc index 902d8c7f6..9c7d3e081 100644 --- a/googletest/src/gtest-filepath.cc +++ b/googletest/src/gtest-filepath.cc @@ -38,6 +38,12 @@ #include "gtest/internal/gtest-port.h" #ifdef GTEST_OS_WINDOWS_MOBILE +#ifndef WIN32_LEAN_AND_MEAN +#define WIN32_LEAN_AND_MEAN +#endif +#ifndef NOMINMAX +#define NOMINMAX +#endif #include #elif defined(GTEST_OS_WINDOWS) #include diff --git a/googletest/src/gtest-internal-inl.h b/googletest/src/gtest-internal-inl.h index cc6f00488..507b5c066 100644 --- a/googletest/src/gtest-internal-inl.h +++ b/googletest/src/gtest-internal-inl.h @@ -52,11 +52,22 @@ #include "gtest/internal/gtest-port.h" #if GTEST_CAN_STREAM_RESULTS_ +#if GTEST_OS_WINDOWS +#include // NOLINT +#pragma comment(lib, "Ws2_32.lib") +#else #include // NOLINT #include // NOLINT #endif +#endif #ifdef GTEST_OS_WINDOWS +#ifndef WIN32_LEAN_AND_MEAN +#define WIN32_LEAN_AND_MEAN +#endif +#ifndef NOMINMAX +#define NOMINMAX +#endif #include // NOLINT #endif // GTEST_OS_WINDOWS @@ -1071,7 +1082,7 @@ class TestResultAccessor { #if GTEST_CAN_STREAM_RESULTS_ // Streams test results to the given port on the given host machine. -class StreamingListener : public EmptyTestEventListener { +class GTEST_API_ StreamingListener : public EmptyTestEventListener { public: // Abstract base class for writing strings to a socket. class AbstractSocketWriter { @@ -1092,24 +1103,44 @@ class StreamingListener : public EmptyTestEventListener { class SocketWriter : public AbstractSocketWriter { public: SocketWriter(const std::string& host, const std::string& port) +#if GTEST_OS_WINDOWS + : sockfd_(INVALID_SOCKET), host_name_(host), port_num_(port) { +#else : sockfd_(-1), host_name_(host), port_num_(port) { +#endif MakeConnection(); } ~SocketWriter() override { +#if GTEST_OS_WINDOWS + if (sockfd_ != INVALID_SOCKET) CloseConnection(); +#else if (sockfd_ != -1) CloseConnection(); +#endif } // Sends a string to the socket. void Send(const std::string& message) override { +#if GTEST_OS_WINDOWS + GTEST_CHECK_(sockfd_ != INVALID_SOCKET) +#else GTEST_CHECK_(sockfd_ != -1) +#endif << "Send() can be called only when there is a connection."; +#if GTEST_OS_WINDOWS + const auto len = static_cast(message.length()); + if (send(sockfd_, message.c_str(), len, 0) != len) { + GTEST_LOG_(WARNING) << "stream_result_to: failed to stream to " + << host_name_ << ":" << port_num_; + } +#else const auto len = static_cast(message.length()); if (write(sockfd_, message.c_str(), len) != static_cast(len)) { GTEST_LOG_(WARNING) << "stream_result_to: failed to stream to " << host_name_ << ":" << port_num_; } +#endif } private: @@ -1118,14 +1149,27 @@ class StreamingListener : public EmptyTestEventListener { // Closes the socket. void CloseConnection() override { +#if GTEST_OS_WINDOWS + GTEST_CHECK_(sockfd_ != INVALID_SOCKET) +#else GTEST_CHECK_(sockfd_ != -1) +#endif << "CloseConnection() can be called only when there is a connection."; +#if GTEST_OS_WINDOWS + closesocket(sockfd_); + sockfd_ = INVALID_SOCKET; +#else close(sockfd_); sockfd_ = -1; +#endif } - int sockfd_; // socket file descriptor +#if GTEST_OS_WINDOWS + SOCKET sockfd_; // socket file descriptor +#else + int sockfd_; // socket file descriptor +#endif const std::string host_name_; const std::string port_num_; diff --git a/googletest/src/gtest-port.cc b/googletest/src/gtest-port.cc index 3bb7dd450..67a35dfbd 100644 --- a/googletest/src/gtest-port.cc +++ b/googletest/src/gtest-port.cc @@ -45,6 +45,12 @@ #ifdef GTEST_OS_WINDOWS #include #include +#ifndef WIN32_LEAN_AND_MEAN +#define WIN32_LEAN_AND_MEAN +#endif +#ifndef NOMINMAX +#define NOMINMAX +#endif #include #include // Used in ThreadLocal. diff --git a/googletest/src/gtest.cc b/googletest/src/gtest.cc index d4292ae06..c9e8d566a 100644 --- a/googletest/src/gtest.cc +++ b/googletest/src/gtest.cc @@ -88,13 +88,23 @@ #elif defined(GTEST_OS_WINDOWS_MOBILE) // We are on Windows CE. +#ifndef WIN32_LEAN_AND_MEAN +#define WIN32_LEAN_AND_MEAN +#endif +#ifndef NOMINMAX +#define NOMINMAX +#endif #include // NOLINT -#undef min #elif defined(GTEST_OS_WINDOWS) // We are on Windows proper. +#ifndef WIN32_LEAN_AND_MEAN +#define WIN32_LEAN_AND_MEAN +#endif +#ifndef NOMINMAX +#define NOMINMAX +#endif #include // NOLINT -#undef min #ifdef _MSC_VER #include // NOLINT @@ -123,11 +133,17 @@ #endif #if GTEST_CAN_STREAM_RESULTS_ +#if GTEST_OS_WINDOWS +#include // NOLINT +#include // NOLINT +#pragma comment(lib, "Ws2_32.lib") +#else #include // NOLINT #include // NOLINT #include // NOLINT #include // NOLINT #endif +#endif #include "src/gtest-internal-inl.h" @@ -4940,6 +4956,21 @@ void StreamingListener::SocketWriter::MakeConnection() { GTEST_CHECK_(sockfd_ == -1) << "MakeConnection() can't be called when there is already a connection."; +#if GTEST_OS_WINDOWS + WSADATA winsockVersion{}; + int startupError{ WSAStartup(MAKEWORD(2, 2), &winsockVersion) }; + + if (startupError) + { + return; + } + + if (LOBYTE(winsockVersion.wVersion) != 2 || HIBYTE(winsockVersion.wVersion) != 2) + { + return; + } +#endif + addrinfo hints; memset(&hints, 0, sizeof(hints)); hints.ai_family = AF_UNSPEC; // To allow both IPv4 and IPv6 addresses. @@ -4960,6 +4991,15 @@ void StreamingListener::SocketWriter::MakeConnection() { cur_addr = cur_addr->ai_next) { sockfd_ = socket(cur_addr->ai_family, cur_addr->ai_socktype, cur_addr->ai_protocol); +#if GTEST_OS_WINDOWS + if (sockfd_ != INVALID_SOCKET) { + // Connect the client socket to the server socket. + if (connect(sockfd_, cur_addr->ai_addr, static_cast(cur_addr->ai_addrlen)) == -1) { + closesocket(sockfd_); + sockfd_ = INVALID_SOCKET; + } + } +#else if (sockfd_ != -1) { // Connect the client socket to the server socket. if (connect(sockfd_, cur_addr->ai_addr, cur_addr->ai_addrlen) == -1) { @@ -4967,6 +5007,7 @@ void StreamingListener::SocketWriter::MakeConnection() { sockfd_ = -1; } } +#endif } freeaddrinfo(servinfo); // all done with this structure diff --git a/googletest/test/googletest-break-on-failure-unittest_.cc b/googletest/test/googletest-break-on-failure-unittest_.cc index 337e34c33..7e945594b 100644 --- a/googletest/test/googletest-break-on-failure-unittest_.cc +++ b/googletest/test/googletest-break-on-failure-unittest_.cc @@ -41,6 +41,12 @@ #ifdef GTEST_OS_WINDOWS #include +#ifndef WIN32_LEAN_AND_MEAN +#define WIN32_LEAN_AND_MEAN +#endif +#ifndef NOMINMAX +#define NOMINMAX +#endif #include #endif diff --git a/googletest/test/googletest-catch-exceptions-test_.cc b/googletest/test/googletest-catch-exceptions-test_.cc index 3c8f4f4b7..21883c1d2 100644 --- a/googletest/test/googletest-catch-exceptions-test_.cc +++ b/googletest/test/googletest-catch-exceptions-test_.cc @@ -38,6 +38,12 @@ #include "gtest/gtest.h" #if GTEST_HAS_SEH +#ifndef WIN32_LEAN_AND_MEAN +#define WIN32_LEAN_AND_MEAN +#endif +#ifndef NOMINMAX +#define NOMINMAX +#endif #include #endif diff --git a/googletest/test/googletest-death-test-test.cc b/googletest/test/googletest-death-test-test.cc index 75742c938..5cb0e90bd 100644 --- a/googletest/test/googletest-death-test-test.cc +++ b/googletest/test/googletest-death-test-test.cc @@ -1217,10 +1217,8 @@ typedef unsigned long long BiggestParsable; typedef signed long long BiggestSignedParsable; #endif // GTEST_OS_WINDOWS -// We cannot use std::numeric_limits::max() as it clashes with the -// max() macro defined by . -const BiggestParsable kBiggestParsableMax = ULLONG_MAX; -const BiggestSignedParsable kBiggestSignedParsableMax = LLONG_MAX; +const BiggestParsable kBiggestParsableMax = std::numeric_limits::max(); +const BiggestSignedParsable kBiggestSignedParsableMax = std::numeric_limits::max(); TEST(ParseNaturalNumberTest, RejectsInvalidFormat) { BiggestParsable result = 0; diff --git a/googletest/test/googletest-death-test_ex_test.cc b/googletest/test/googletest-death-test_ex_test.cc index 34d55013b..da6f2007c 100644 --- a/googletest/test/googletest-death-test_ex_test.cc +++ b/googletest/test/googletest-death-test_ex_test.cc @@ -36,6 +36,12 @@ #ifdef GTEST_HAS_DEATH_TEST #if GTEST_HAS_SEH +#ifndef WIN32_LEAN_AND_MEAN +#define WIN32_LEAN_AND_MEAN +#endif +#ifndef NOMINMAX +#define NOMINMAX +#endif #include // For RaiseException(). #endif diff --git a/googletest/test/googletest-filepath-test.cc b/googletest/test/googletest-filepath-test.cc index 3e9c79f03..051336221 100644 --- a/googletest/test/googletest-filepath-test.cc +++ b/googletest/test/googletest-filepath-test.cc @@ -42,6 +42,12 @@ #include "src/gtest-internal-inl.h" #ifdef GTEST_OS_WINDOWS_MOBILE +#ifndef WIN32_LEAN_AND_MEAN +#define WIN32_LEAN_AND_MEAN +#endif +#ifndef NOMINMAX +#define NOMINMAX +#endif #include // NOLINT #elif defined(GTEST_OS_WINDOWS) #include // NOLINT diff --git a/googletest/test/googletest-options-test.cc b/googletest/test/googletest-options-test.cc index 91d06a509..1faade70a 100644 --- a/googletest/test/googletest-options-test.cc +++ b/googletest/test/googletest-options-test.cc @@ -41,6 +41,12 @@ #include "gtest/gtest.h" #ifdef GTEST_OS_WINDOWS_MOBILE +#ifndef WIN32_LEAN_AND_MEAN +#define WIN32_LEAN_AND_MEAN +#endif +#ifndef NOMINMAX +#define NOMINMAX +#endif #include #elif defined(GTEST_OS_WINDOWS) #include diff --git a/googletest/test/gtest_help_test.py b/googletest/test/gtest_help_test.py index 38fc90ff1..f71932c2b 100755 --- a/googletest/test/gtest_help_test.py +++ b/googletest/test/gtest_help_test.py @@ -144,7 +144,7 @@ class GTestHelpTest(gtest_test_utils.TestCase): self.assertTrue(HELP_REGEX.search(output), output) - if IS_DARWIN or IS_LINUX or IS_GNUHURD or is_bsd_based_os(): + if IS_DARWIN or IS_LINUX or IS_GNUHURD or is_bsd_based_os() or IS_WINDOWS: self.assertIn(STREAM_RESULT_TO_FLAG, output) else: self.assertNotIn(STREAM_RESULT_TO_FLAG, output)