LIBS: updated googletest
parent
28f5417f0f
commit
b56cc1b56e
|
@ -76,6 +76,13 @@ template <typename Pointer>
|
|||
inline const typename Pointer::element_type* GetRawPointer(const Pointer& p) {
|
||||
return p.get();
|
||||
}
|
||||
// This overload version is for std::reference_wrapper, which does not work with
|
||||
// the overload above, as it does not have an `element_type`.
|
||||
template <typename Element>
|
||||
inline const Element* GetRawPointer(const std::reference_wrapper<Element>& r) {
|
||||
return &r.get();
|
||||
}
|
||||
|
||||
// This overloaded version is for the raw pointer case.
|
||||
template <typename Element>
|
||||
inline Element* GetRawPointer(Element* p) { return p; }
|
||||
|
|
|
@ -591,6 +591,12 @@ inline void PrintTo(internal::StringView sp, ::std::ostream* os) {
|
|||
|
||||
inline void PrintTo(std::nullptr_t, ::std::ostream* os) { *os << "(nullptr)"; }
|
||||
|
||||
#if GTEST_HAS_RTTI
|
||||
inline void PrintTo(const std::type_info& info, std::ostream* os) {
|
||||
*os << internal::GetTypeName(info);
|
||||
}
|
||||
#endif // GTEST_HAS_RTTI
|
||||
|
||||
template <typename T>
|
||||
void PrintTo(std::reference_wrapper<T> ref, ::std::ostream* os) {
|
||||
UniversalPrinter<T&>::Print(ref.get(), os);
|
||||
|
|
|
@ -1123,6 +1123,9 @@ class TestEventListener {
|
|||
// Fired before the test starts.
|
||||
virtual void OnTestStart(const TestInfo& test_info) = 0;
|
||||
|
||||
// Fired when a test is disabled
|
||||
virtual void OnTestDisabled(const TestInfo& /*test_info*/) {}
|
||||
|
||||
// Fired after a failed assertion or a SUCCEED() invocation.
|
||||
// If you want to throw an exception from this function to skip to the next
|
||||
// TEST, it must be AssertionException defined above, or inherited from it.
|
||||
|
@ -1172,6 +1175,7 @@ class EmptyTestEventListener : public TestEventListener {
|
|||
#endif // GTEST_REMOVE_LEGACY_TEST_CASEAPI_
|
||||
|
||||
void OnTestStart(const TestInfo& /*test_info*/) override {}
|
||||
void OnTestDisabled(const TestInfo& /*test_info*/) override {}
|
||||
void OnTestPartResult(const TestPartResult& /*test_part_result*/) override {}
|
||||
void OnTestEnd(const TestInfo& /*test_info*/) override {}
|
||||
void OnTestSuiteEnd(const TestSuite& /*test_suite*/) override {}
|
||||
|
@ -2447,6 +2451,7 @@ GTEST_API_ std::string TempDir();
|
|||
// }
|
||||
// ...
|
||||
// int main(int argc, char** argv) {
|
||||
// ::testing::InitGoogleTest(&argc, argv);
|
||||
// std::vector<int> values_to_test = LoadValuesFromConfig();
|
||||
// RegisterMyTests(values_to_test);
|
||||
// ...
|
||||
|
|
|
@ -260,9 +260,17 @@
|
|||
#include <string.h>
|
||||
|
||||
#include <cerrno>
|
||||
// #include <condition_variable> // Guarded by GTEST_IS_THREADSAFE below
|
||||
#include <cstdint>
|
||||
#include <iostream>
|
||||
#include <limits>
|
||||
#include <locale>
|
||||
#include <memory>
|
||||
#include <string>
|
||||
// #include <mutex> // Guarded by GTEST_IS_THREADSAFE below
|
||||
#include <tuple>
|
||||
#include <type_traits>
|
||||
#include <vector>
|
||||
|
||||
#ifndef _WIN32_WCE
|
||||
# include <sys/types.h>
|
||||
|
@ -274,13 +282,6 @@
|
|||
# include <TargetConditionals.h>
|
||||
#endif
|
||||
|
||||
#include <iostream> // NOLINT
|
||||
#include <locale>
|
||||
#include <memory>
|
||||
#include <string> // NOLINT
|
||||
#include <tuple>
|
||||
#include <vector> // NOLINT
|
||||
|
||||
#include "gtest/internal/custom/gtest-port.h"
|
||||
#include "gtest/internal/gtest-port-arch.h"
|
||||
|
||||
|
@ -688,25 +689,29 @@ typedef struct _RTL_CRITICAL_SECTION GTEST_CRITICAL_SECTION;
|
|||
|
||||
// A macro to disallow copy operator=
|
||||
// This should be used in the private: declarations for a class.
|
||||
// NOLINT is for modernize-use-trailing-return-type in macro uses.
|
||||
#define GTEST_DISALLOW_ASSIGN_(type) \
|
||||
type& operator=(type const &) = delete
|
||||
type& operator=(type const&) = delete /* NOLINT */
|
||||
|
||||
// A macro to disallow copy constructor and operator=
|
||||
// This should be used in the private: declarations for a class.
|
||||
// NOLINT is for modernize-use-trailing-return-type in macro uses.
|
||||
#define GTEST_DISALLOW_COPY_AND_ASSIGN_(type) \
|
||||
type(type const&) = delete; \
|
||||
type& operator=(type const&) = delete
|
||||
type& operator=(type const&) = delete /* NOLINT */
|
||||
|
||||
// A macro to disallow move operator=
|
||||
// This should be used in the private: declarations for a class.
|
||||
// NOLINT is for modernize-use-trailing-return-type in macro uses.
|
||||
#define GTEST_DISALLOW_MOVE_ASSIGN_(type) \
|
||||
type& operator=(type &&) noexcept = delete
|
||||
type& operator=(type&&) noexcept = delete /* NOLINT */
|
||||
|
||||
// A macro to disallow move constructor and operator=
|
||||
// This should be used in the private: declarations for a class.
|
||||
// NOLINT is for modernize-use-trailing-return-type in macro uses.
|
||||
#define GTEST_DISALLOW_MOVE_AND_ASSIGN_(type) \
|
||||
type(type&&) noexcept = delete; \
|
||||
type& operator=(type&&) noexcept = delete
|
||||
type& operator=(type&&) noexcept = delete /* NOLINT */
|
||||
|
||||
// Tell the compiler to warn about unused return values for functions declared
|
||||
// with this macro. The macro should be used on function declarations
|
||||
|
@ -757,6 +762,12 @@ typedef struct _RTL_CRITICAL_SECTION GTEST_CRITICAL_SECTION;
|
|||
|
||||
#endif // GTEST_IS_THREADSAFE
|
||||
|
||||
#if GTEST_IS_THREADSAFE
|
||||
// Some platforms don't support including these threading related headers.
|
||||
#include <condition_variable> // NOLINT
|
||||
#include <mutex> // NOLINT
|
||||
#endif // GTEST_IS_THREADSAFE
|
||||
|
||||
// GTEST_API_ qualifies all symbols that must be exported. The definitions below
|
||||
// are guarded by #ifndef to give embedders a chance to define GTEST_API_ in
|
||||
// gtest/internal/custom/gtest-port.h
|
||||
|
@ -1161,71 +1172,8 @@ void ClearInjectableArgvs();
|
|||
|
||||
// Defines synchronization primitives.
|
||||
#if GTEST_IS_THREADSAFE
|
||||
# if GTEST_HAS_PTHREAD
|
||||
// Sleeps for (roughly) n milliseconds. This function is only for testing
|
||||
// Google Test's own constructs. Don't use it in user tests, either
|
||||
// directly or indirectly.
|
||||
inline void SleepMilliseconds(int n) {
|
||||
const timespec time = {
|
||||
0, // 0 seconds.
|
||||
n * 1000L * 1000L, // And n ms.
|
||||
};
|
||||
nanosleep(&time, nullptr);
|
||||
}
|
||||
# endif // GTEST_HAS_PTHREAD
|
||||
|
||||
# if GTEST_HAS_NOTIFICATION_
|
||||
// Notification has already been imported into the namespace.
|
||||
// Nothing to do here.
|
||||
|
||||
# elif GTEST_HAS_PTHREAD
|
||||
// Allows a controller thread to pause execution of newly created
|
||||
// threads until notified. Instances of this class must be created
|
||||
// and destroyed in the controller thread.
|
||||
//
|
||||
// This class is only for testing Google Test's own constructs. Do not
|
||||
// use it in user tests, either directly or indirectly.
|
||||
class Notification {
|
||||
public:
|
||||
Notification() : notified_(false) {
|
||||
GTEST_CHECK_POSIX_SUCCESS_(pthread_mutex_init(&mutex_, nullptr));
|
||||
}
|
||||
~Notification() {
|
||||
pthread_mutex_destroy(&mutex_);
|
||||
}
|
||||
|
||||
// Notifies all threads created with this notification to start. Must
|
||||
// be called from the controller thread.
|
||||
void Notify() {
|
||||
pthread_mutex_lock(&mutex_);
|
||||
notified_ = true;
|
||||
pthread_mutex_unlock(&mutex_);
|
||||
}
|
||||
|
||||
// Blocks until the controller thread notifies. Must be called from a test
|
||||
// thread.
|
||||
void WaitForNotification() {
|
||||
for (;;) {
|
||||
pthread_mutex_lock(&mutex_);
|
||||
const bool notified = notified_;
|
||||
pthread_mutex_unlock(&mutex_);
|
||||
if (notified)
|
||||
break;
|
||||
SleepMilliseconds(10);
|
||||
}
|
||||
}
|
||||
|
||||
private:
|
||||
pthread_mutex_t mutex_;
|
||||
bool notified_;
|
||||
|
||||
GTEST_DISALLOW_COPY_AND_ASSIGN_(Notification);
|
||||
};
|
||||
|
||||
# elif GTEST_OS_WINDOWS && !GTEST_OS_WINDOWS_PHONE && !GTEST_OS_WINDOWS_RT
|
||||
|
||||
GTEST_API_ void SleepMilliseconds(int n);
|
||||
|
||||
# if GTEST_OS_WINDOWS
|
||||
// Provides leak-safe Windows kernel handle ownership.
|
||||
// Used in death tests and in threading support.
|
||||
class GTEST_API_ AutoHandle {
|
||||
|
@ -1254,23 +1202,45 @@ class GTEST_API_ AutoHandle {
|
|||
|
||||
GTEST_DISALLOW_COPY_AND_ASSIGN_(AutoHandle);
|
||||
};
|
||||
# endif
|
||||
|
||||
# if GTEST_HAS_NOTIFICATION_
|
||||
// Notification has already been imported into the namespace.
|
||||
// Nothing to do here.
|
||||
|
||||
# else
|
||||
// Allows a controller thread to pause execution of newly created
|
||||
// threads until notified. Instances of this class must be created
|
||||
// and destroyed in the controller thread.
|
||||
//
|
||||
// This class is only for testing Google Test's own constructs. Do not
|
||||
// use it in user tests, either directly or indirectly.
|
||||
// TODO(b/203539622): Replace unconditionally with absl::Notification.
|
||||
class GTEST_API_ Notification {
|
||||
public:
|
||||
Notification();
|
||||
void Notify();
|
||||
void WaitForNotification();
|
||||
Notification() : notified_(false) {}
|
||||
Notification(const Notification&) = delete;
|
||||
Notification& operator=(const Notification&) = delete;
|
||||
|
||||
// Notifies all threads created with this notification to start. Must
|
||||
// be called from the controller thread.
|
||||
void Notify() {
|
||||
std::lock_guard<std::mutex> lock(mu_);
|
||||
notified_ = true;
|
||||
cv_.notify_all();
|
||||
}
|
||||
|
||||
// Blocks until the controller thread notifies. Must be called from a test
|
||||
// thread.
|
||||
void WaitForNotification() {
|
||||
std::unique_lock<std::mutex> lock(mu_);
|
||||
cv_.wait(lock, [this]() { return notified_; });
|
||||
}
|
||||
|
||||
private:
|
||||
AutoHandle event_;
|
||||
|
||||
GTEST_DISALLOW_COPY_AND_ASSIGN_(Notification);
|
||||
std::mutex mu_;
|
||||
std::condition_variable cv_;
|
||||
bool notified_;
|
||||
};
|
||||
# endif // GTEST_HAS_NOTIFICATION_
|
||||
|
||||
|
|
|
@ -264,10 +264,10 @@ void ExpectationBase::UntypedTimes(const Cardinality& a_cardinality) {
|
|||
".Times() cannot appear "
|
||||
"more than once in an EXPECT_CALL().");
|
||||
} else {
|
||||
ExpectSpecProperty(last_clause_ < kTimes,
|
||||
".Times() cannot appear after "
|
||||
".InSequence(), .WillOnce(), .WillRepeatedly(), "
|
||||
"or .RetiresOnSaturation().");
|
||||
ExpectSpecProperty(
|
||||
last_clause_ < kTimes,
|
||||
".Times() may only appear *before* .InSequence(), .WillOnce(), "
|
||||
".WillRepeatedly(), or .RetiresOnSaturation(), not after.");
|
||||
}
|
||||
last_clause_ = kTimes;
|
||||
|
||||
|
|
|
@ -280,10 +280,6 @@ size_t GetThreadCount() {
|
|||
|
||||
#if GTEST_IS_THREADSAFE && GTEST_OS_WINDOWS
|
||||
|
||||
void SleepMilliseconds(int n) {
|
||||
::Sleep(static_cast<DWORD>(n));
|
||||
}
|
||||
|
||||
AutoHandle::AutoHandle()
|
||||
: handle_(INVALID_HANDLE_VALUE) {}
|
||||
|
||||
|
@ -322,23 +318,6 @@ bool AutoHandle::IsCloseable() const {
|
|||
return handle_ != nullptr && handle_ != INVALID_HANDLE_VALUE;
|
||||
}
|
||||
|
||||
Notification::Notification()
|
||||
: event_(::CreateEvent(nullptr, // Default security attributes.
|
||||
TRUE, // Do not reset automatically.
|
||||
FALSE, // Initially unset.
|
||||
nullptr)) { // Anonymous event.
|
||||
GTEST_CHECK_(event_.Get() != nullptr);
|
||||
}
|
||||
|
||||
void Notification::Notify() {
|
||||
GTEST_CHECK_(::SetEvent(event_.Get()) != FALSE);
|
||||
}
|
||||
|
||||
void Notification::WaitForNotification() {
|
||||
GTEST_CHECK_(
|
||||
::WaitForSingleObject(event_.Get(), INFINITE) == WAIT_OBJECT_0);
|
||||
}
|
||||
|
||||
Mutex::Mutex()
|
||||
: owner_thread_id_(0),
|
||||
type_(kDynamic),
|
||||
|
@ -398,12 +377,12 @@ class MemoryIsNotDeallocated
|
|||
old_crtdbg_flag_ = _CrtSetDbgFlag(_CRTDBG_REPORT_FLAG);
|
||||
// Set heap allocation block type to _IGNORE_BLOCK so that MS debug CRT
|
||||
// doesn't report mem leak if there's no matching deallocation.
|
||||
_CrtSetDbgFlag(old_crtdbg_flag_ & ~_CRTDBG_ALLOC_MEM_DF);
|
||||
(void)_CrtSetDbgFlag(old_crtdbg_flag_ & ~_CRTDBG_ALLOC_MEM_DF);
|
||||
}
|
||||
|
||||
~MemoryIsNotDeallocated() {
|
||||
// Restore the original _CRTDBG_ALLOC_MEM_DF flag
|
||||
_CrtSetDbgFlag(old_crtdbg_flag_);
|
||||
(void)_CrtSetDbgFlag(old_crtdbg_flag_);
|
||||
}
|
||||
|
||||
private:
|
||||
|
@ -650,7 +629,8 @@ class ThreadLocalRegistryImpl {
|
|||
&ThreadLocalRegistryImpl::WatcherThreadFunc,
|
||||
reinterpret_cast<LPVOID>(new ThreadIdAndHandle(thread_id, thread)),
|
||||
CREATE_SUSPENDED, &watcher_thread_id);
|
||||
GTEST_CHECK_(watcher_thread != nullptr);
|
||||
GTEST_CHECK_(watcher_thread != nullptr)
|
||||
<< "CreateThread failed with error " << ::GetLastError() << ".";
|
||||
// Give the watcher thread the same priority as ours to avoid being
|
||||
// blocked by it.
|
||||
::SetThreadPriority(watcher_thread,
|
||||
|
|
|
@ -2855,20 +2855,20 @@ void UnitTestImpl::RegisterParameterizedTests() {
|
|||
// Creates the test object, runs it, records its result, and then
|
||||
// deletes it.
|
||||
void TestInfo::Run() {
|
||||
if (!should_run_) return;
|
||||
TestEventListener* repeater = UnitTest::GetInstance()->listeners().repeater();
|
||||
if (!should_run_) {
|
||||
if (is_disabled_) repeater->OnTestDisabled(*this);
|
||||
return;
|
||||
}
|
||||
|
||||
// Tells UnitTest where to store test result.
|
||||
internal::UnitTestImpl* const impl = internal::GetUnitTestImpl();
|
||||
impl->set_current_test_info(this);
|
||||
|
||||
TestEventListener* repeater = UnitTest::GetInstance()->listeners().repeater();
|
||||
|
||||
// Notifies the unit test event listeners that a test is about to start.
|
||||
repeater->OnTestStart(*this);
|
||||
|
||||
result_.set_start_timestamp(internal::GetTimeInMillis());
|
||||
internal::Timer timer;
|
||||
|
||||
impl->os_stack_trace_getter()->UponLeavingGTest();
|
||||
|
||||
// Creates the test object.
|
||||
|
@ -3396,6 +3396,7 @@ class PrettyUnitTestResultPrinter : public TestEventListener {
|
|||
#endif // OnTestCaseStart
|
||||
|
||||
void OnTestStart(const TestInfo& test_info) override;
|
||||
void OnTestDisabled(const TestInfo& test_info) override;
|
||||
|
||||
void OnTestPartResult(const TestPartResult& result) override;
|
||||
void OnTestEnd(const TestInfo& test_info) override;
|
||||
|
@ -3495,6 +3496,13 @@ void PrettyUnitTestResultPrinter::OnTestStart(const TestInfo& test_info) {
|
|||
fflush(stdout);
|
||||
}
|
||||
|
||||
void PrettyUnitTestResultPrinter::OnTestDisabled(const TestInfo& test_info) {
|
||||
ColoredPrintf(GTestColor::kYellow, "[ DISABLED ] ");
|
||||
PrintTestName(test_info.test_suite_name(), test_info.name());
|
||||
printf("\n");
|
||||
fflush(stdout);
|
||||
}
|
||||
|
||||
// Called after an assertion failure.
|
||||
void PrettyUnitTestResultPrinter::OnTestPartResult(
|
||||
const TestPartResult& result) {
|
||||
|
@ -3697,6 +3705,7 @@ class BriefUnitTestResultPrinter : public TestEventListener {
|
|||
#endif // OnTestCaseStart
|
||||
|
||||
void OnTestStart(const TestInfo& /*test_info*/) override {}
|
||||
void OnTestDisabled(const TestInfo& /*test_info*/) override {}
|
||||
|
||||
void OnTestPartResult(const TestPartResult& result) override;
|
||||
void OnTestEnd(const TestInfo& test_info) override;
|
||||
|
@ -3803,6 +3812,7 @@ class TestEventRepeater : public TestEventListener {
|
|||
#endif // GTEST_REMOVE_LEGACY_TEST_CASEAPI_
|
||||
void OnTestSuiteStart(const TestSuite& parameter) override;
|
||||
void OnTestStart(const TestInfo& test_info) override;
|
||||
void OnTestDisabled(const TestInfo& test_info) override;
|
||||
void OnTestPartResult(const TestPartResult& result) override;
|
||||
void OnTestEnd(const TestInfo& test_info) override;
|
||||
// Legacy API is deprecated but still available
|
||||
|
@ -3873,6 +3883,7 @@ GTEST_REPEATER_METHOD_(OnTestCaseStart, TestSuite)
|
|||
#endif // GTEST_REMOVE_LEGACY_TEST_CASEAPI_
|
||||
GTEST_REPEATER_METHOD_(OnTestSuiteStart, TestSuite)
|
||||
GTEST_REPEATER_METHOD_(OnTestStart, TestInfo)
|
||||
GTEST_REPEATER_METHOD_(OnTestDisabled, TestInfo)
|
||||
GTEST_REPEATER_METHOD_(OnTestPartResult, TestPartResult)
|
||||
GTEST_REPEATER_METHOD_(OnEnvironmentsTearDownStart, UnitTest)
|
||||
GTEST_REVERSE_REPEATER_METHOD_(OnEnvironmentsSetUpEnd, UnitTest)
|
||||
|
@ -3923,12 +3934,13 @@ class XmlUnitTestResultPrinter : public EmptyTestEventListener {
|
|||
private:
|
||||
// Is c a whitespace character that is normalized to a space character
|
||||
// when it appears in an XML attribute value?
|
||||
static bool IsNormalizableWhitespace(char c) {
|
||||
return c == 0x9 || c == 0xA || c == 0xD;
|
||||
static bool IsNormalizableWhitespace(unsigned char c) {
|
||||
return c == '\t' || c == '\n' || c == '\r';
|
||||
}
|
||||
|
||||
// May c appear in a well-formed XML document?
|
||||
static bool IsValidXmlCharacter(char c) {
|
||||
// https://www.w3.org/TR/REC-xml/#charsets
|
||||
static bool IsValidXmlCharacter(unsigned char c) {
|
||||
return IsNormalizableWhitespace(c) || c >= 0x20;
|
||||
}
|
||||
|
||||
|
@ -5823,9 +5835,7 @@ bool UnitTestImpl::RunAllTests() {
|
|||
return true;
|
||||
}
|
||||
|
||||
random_seed_ = GTEST_FLAG_GET(shuffle)
|
||||
? GetRandomSeedFromFlag(GTEST_FLAG_GET(random_seed))
|
||||
: 0;
|
||||
random_seed_ = GetRandomSeedFromFlag(GTEST_FLAG_GET(random_seed));
|
||||
|
||||
// True if and only if at least one test has failed.
|
||||
bool failed = false;
|
||||
|
|
Loading…
Reference in New Issue