Commit 9d77e63e authored by Tanzinul Islam's avatar Tanzinul Islam
Browse files

Merge branch 'master' into fix_death_test_child_mingw_wer_issue1116

parents 1cd979a8 e82d3205
...@@ -26,8 +26,7 @@ ...@@ -26,8 +26,7 @@
// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT // THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
//
// Author: vladl@google.com (Vlad Losev)
// This sample shows how to test common properties of multiple // This sample shows how to test common properties of multiple
// implementations of an interface (aka interface tests) using // implementations of an interface (aka interface tests) using
......
...@@ -26,8 +26,7 @@ ...@@ -26,8 +26,7 @@
// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT // THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
//
// Author: vladl@google.com (Vlad Losev)
// This sample shows how to test code relying on some global flag variables. // This sample shows how to test code relying on some global flag variables.
// Combine() helps with generating all possible combinations of such flags, // Combine() helps with generating all possible combinations of such flags,
......
...@@ -25,8 +25,7 @@ ...@@ -25,8 +25,7 @@
// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT // THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
//
// Author: vladl@google.com (Vlad Losev)
// This sample shows how to use Google Test listener API to implement // This sample shows how to use Google Test listener API to implement
// an alternative console output and how to use the UnitTest reflection API // an alternative console output and how to use the UnitTest reflection API
......
...@@ -26,8 +26,7 @@ ...@@ -26,8 +26,7 @@
// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT // THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
//
// Author: mheule@google.com (Markus Heule)
// //
// Google C++ Testing and Mocking Framework (Google Test) // Google C++ Testing and Mocking Framework (Google Test)
// //
......
...@@ -26,8 +26,7 @@ ...@@ -26,8 +26,7 @@
// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT // THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
//
// Author: wan@google.com (Zhanyong Wan), vladl@google.com (Vlad Losev)
// //
// This file implements death tests. // This file implements death tests.
...@@ -67,6 +66,7 @@ ...@@ -67,6 +66,7 @@
# include <lib/fdio/spawn.h> # include <lib/fdio/spawn.h>
# include <zircon/processargs.h> # include <zircon/processargs.h>
# include <zircon/syscalls.h> # include <zircon/syscalls.h>
# include <zircon/syscalls/port.h>
# endif // GTEST_OS_FUCHSIA # endif // GTEST_OS_FUCHSIA
#endif // GTEST_HAS_DEATH_TEST #endif // GTEST_HAS_DEATH_TEST
...@@ -232,10 +232,16 @@ static std::string DeathTestThreadWarning(size_t thread_count) { ...@@ -232,10 +232,16 @@ static std::string DeathTestThreadWarning(size_t thread_count) {
Message msg; Message msg;
msg << "Death tests use fork(), which is unsafe particularly" msg << "Death tests use fork(), which is unsafe particularly"
<< " in a threaded context. For this test, " << GTEST_NAME_ << " "; << " in a threaded context. For this test, " << GTEST_NAME_ << " ";
if (thread_count == 0) if (thread_count == 0) {
msg << "couldn't detect the number of threads."; msg << "couldn't detect the number of threads.";
else } else {
msg << "detected " << thread_count << " threads."; msg << "detected " << thread_count << " threads.";
}
msg << " See "
"https://github.com/google/googletest/blob/master/googletest/docs/"
"advanced.md#death-tests-and-threads"
<< " for more explanation and suggested solutions, especially if"
<< " this is the last message you see before your test times out.";
return msg.GetString(); return msg.GetString();
} }
# endif // !GTEST_OS_WINDOWS && !GTEST_OS_FUCHSIA # endif // !GTEST_OS_WINDOWS && !GTEST_OS_FUCHSIA
...@@ -260,7 +266,7 @@ static const int kFuchsiaReadPipeFd = 3; ...@@ -260,7 +266,7 @@ static const int kFuchsiaReadPipeFd = 3;
// statement, which is not allowed; THREW means that the test statement // statement, which is not allowed; THREW means that the test statement
// returned control by throwing an exception. IN_PROGRESS means the test // returned control by throwing an exception. IN_PROGRESS means the test
// has not yet concluded. // has not yet concluded.
// TODO(vladl@google.com): Unify names and possibly values for // FIXME: Unify names and possibly values for
// AbortReason, DeathTestOutcome, and flag characters above. // AbortReason, DeathTestOutcome, and flag characters above.
enum DeathTestOutcome { IN_PROGRESS, DIED, LIVED, RETURNED, THREW }; enum DeathTestOutcome { IN_PROGRESS, DIED, LIVED, RETURNED, THREW };
...@@ -575,7 +581,6 @@ bool DeathTestImpl::Passed(bool status_ok) { ...@@ -575,7 +581,6 @@ bool DeathTestImpl::Passed(bool status_ok) {
if (status_ok) { if (status_ok) {
# if GTEST_USES_PCRE # if GTEST_USES_PCRE
// PCRE regexes support embedded NULs. // PCRE regexes support embedded NULs.
// GTEST_USES_PCRE is defined only in google3 mode
const bool matched = RE::PartialMatch(error_message, *regex()); const bool matched = RE::PartialMatch(error_message, *regex());
# else # else
const bool matched = RE::PartialMatch(error_message.c_str(), *regex()); const bool matched = RE::PartialMatch(error_message.c_str(), *regex());
...@@ -805,6 +810,12 @@ class FuchsiaDeathTest : public DeathTestImpl { ...@@ -805,6 +810,12 @@ class FuchsiaDeathTest : public DeathTestImpl {
const char* file, const char* file,
int line) int line)
: DeathTestImpl(a_statement, a_regex), file_(file), line_(line) {} : DeathTestImpl(a_statement, a_regex), file_(file), line_(line) {}
virtual ~FuchsiaDeathTest() {
zx_status_t status = zx_handle_close(child_process_);
GTEST_DEATH_TEST_CHECK_(status == ZX_OK);
status = zx_handle_close(port_);
GTEST_DEATH_TEST_CHECK_(status == ZX_OK);
}
// All of these virtual functions are inherited from DeathTest. // All of these virtual functions are inherited from DeathTest.
virtual int Wait(); virtual int Wait();
...@@ -816,7 +827,8 @@ class FuchsiaDeathTest : public DeathTestImpl { ...@@ -816,7 +827,8 @@ class FuchsiaDeathTest : public DeathTestImpl {
// The line number on which the death test is located. // The line number on which the death test is located.
const int line_; const int line_;
zx_handle_t child_process_; zx_handle_t child_process_ = ZX_HANDLE_INVALID;
zx_handle_t port_ = ZX_HANDLE_INVALID;
}; };
// Utility class for accumulating command-line arguments. // Utility class for accumulating command-line arguments.
...@@ -863,16 +875,38 @@ int FuchsiaDeathTest::Wait() { ...@@ -863,16 +875,38 @@ int FuchsiaDeathTest::Wait() {
if (!spawned()) if (!spawned())
return 0; return 0;
// Wait for child process to terminate. // Register to wait for the child process to terminate.
zx_status_t status_zx; zx_status_t status_zx;
zx_signals_t signals; status_zx = zx_object_wait_async(child_process_,
status_zx = zx_object_wait_one( port_,
child_process_, 0 /* key */,
ZX_PROCESS_TERMINATED, ZX_PROCESS_TERMINATED,
ZX_TIME_INFINITE, ZX_WAIT_ASYNC_ONCE);
&signals); GTEST_DEATH_TEST_CHECK_(status_zx == ZX_OK);
// Wait for it to terminate, or an exception to be received.
zx_port_packet_t packet;
status_zx = zx_port_wait(port_, ZX_TIME_INFINITE, &packet);
GTEST_DEATH_TEST_CHECK_(status_zx == ZX_OK); GTEST_DEATH_TEST_CHECK_(status_zx == ZX_OK);
if (ZX_PKT_IS_EXCEPTION(packet.type)) {
// Process encountered an exception. Kill it directly rather than letting
// other handlers process the event.
status_zx = zx_task_kill(child_process_);
GTEST_DEATH_TEST_CHECK_(status_zx == ZX_OK);
// Now wait for |child_process_| to terminate.
zx_signals_t signals = 0;
status_zx = zx_object_wait_one(
child_process_, ZX_PROCESS_TERMINATED, ZX_TIME_INFINITE, &signals);
GTEST_DEATH_TEST_CHECK_(status_zx == ZX_OK);
GTEST_DEATH_TEST_CHECK_(signals & ZX_PROCESS_TERMINATED);
} else {
// Process terminated.
GTEST_DEATH_TEST_CHECK_(ZX_PKT_IS_SIGNAL_ONE(packet.type));
GTEST_DEATH_TEST_CHECK_(packet.signal.observed & ZX_PROCESS_TERMINATED);
}
ReadAndInterpretStatusByte(); ReadAndInterpretStatusByte();
zx_info_process_t buffer; zx_info_process_t buffer;
...@@ -936,13 +970,10 @@ DeathTest::TestRole FuchsiaDeathTest::AssumeRole() { ...@@ -936,13 +970,10 @@ DeathTest::TestRole FuchsiaDeathTest::AssumeRole() {
set_read_fd(status); set_read_fd(status);
// Set the pipe handle for the child. // Set the pipe handle for the child.
fdio_spawn_action_t add_handle_action = { fdio_spawn_action_t add_handle_action = {};
.action = FDIO_SPAWN_ACTION_ADD_HANDLE, add_handle_action.action = FDIO_SPAWN_ACTION_ADD_HANDLE;
.h = { add_handle_action.h.id = PA_HND(type, kFuchsiaReadPipeFd);
.id = PA_HND(type, kFuchsiaReadPipeFd), add_handle_action.h.handle = child_pipe_handle;
.handle = child_pipe_handle
}
};
// Spawn the child process. // Spawn the child process.
status = fdio_spawn_etc(ZX_HANDLE_INVALID, FDIO_SPAWN_CLONE_ALL, status = fdio_spawn_etc(ZX_HANDLE_INVALID, FDIO_SPAWN_CLONE_ALL,
...@@ -950,6 +981,14 @@ DeathTest::TestRole FuchsiaDeathTest::AssumeRole() { ...@@ -950,6 +981,14 @@ DeathTest::TestRole FuchsiaDeathTest::AssumeRole() {
&add_handle_action, &child_process_, nullptr); &add_handle_action, &child_process_, nullptr);
GTEST_DEATH_TEST_CHECK_(status == ZX_OK); GTEST_DEATH_TEST_CHECK_(status == ZX_OK);
// Create an exception port and attach it to the |child_process_|, to allow
// us to suppress the system default exception handler from firing.
status = zx_port_create(0, &port_);
GTEST_DEATH_TEST_CHECK_(status == ZX_OK);
status = zx_task_bind_exception_port(
child_process_, port_, 0 /* key */, 0 /*options */);
GTEST_DEATH_TEST_CHECK_(status == ZX_OK);
set_spawned(true); set_spawned(true);
return OVERSEE_TEST; return OVERSEE_TEST;
} }
...@@ -1419,7 +1458,7 @@ static int GetStatusFileDescriptor(unsigned int parent_process_id, ...@@ -1419,7 +1458,7 @@ static int GetStatusFileDescriptor(unsigned int parent_process_id,
StreamableToString(parent_process_id)); StreamableToString(parent_process_id));
} }
// TODO(vladl@google.com): Replace the following check with a // FIXME: Replace the following check with a
// compile-time assertion when available. // compile-time assertion when available.
GTEST_CHECK_(sizeof(HANDLE) <= sizeof(size_t)); GTEST_CHECK_(sizeof(HANDLE) <= sizeof(size_t));
......
...@@ -250,7 +250,7 @@ bool FilePath::DirectoryExists() const { ...@@ -250,7 +250,7 @@ bool FilePath::DirectoryExists() const {
// root directory per disk drive.) // root directory per disk drive.)
bool FilePath::IsRootDirectory() const { bool FilePath::IsRootDirectory() const {
#if GTEST_OS_WINDOWS #if GTEST_OS_WINDOWS
// TODO(wan@google.com): on Windows a network share like // FIXME: on Windows a network share like
// \\server\share can be a root directory, although it cannot be the // \\server\share can be a root directory, although it cannot be the
// current directory. Handle this properly. // current directory. Handle this properly.
return pathname_.length() == 3 && IsAbsolutePath(); return pathname_.length() == 3 && IsAbsolutePath();
...@@ -350,7 +350,7 @@ FilePath FilePath::RemoveTrailingPathSeparator() const { ...@@ -350,7 +350,7 @@ FilePath FilePath::RemoveTrailingPathSeparator() const {
// Removes any redundant separators that might be in the pathname. // Removes any redundant separators that might be in the pathname.
// For example, "bar///foo" becomes "bar/foo". Does not eliminate other // For example, "bar///foo" becomes "bar/foo". Does not eliminate other
// redundancies that might be in a pathname involving "." or "..". // redundancies that might be in a pathname involving "." or "..".
// TODO(wan@google.com): handle Windows network shares (e.g. \\server\share). // FIXME: handle Windows network shares (e.g. \\server\share).
void FilePath::Normalize() { void FilePath::Normalize() {
if (pathname_.c_str() == NULL) { if (pathname_.c_str() == NULL) {
pathname_ = ""; pathname_ = "";
......
...@@ -27,10 +27,7 @@ ...@@ -27,10 +27,7 @@
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
// Utility functions and classes used by the Google C++ testing framework. // Utility functions and classes used by the Google C++ testing framework.//
//
// Author: wan@google.com (Zhanyong Wan)
//
// This file contains purely Google Test's internal implementation. Please // This file contains purely Google Test's internal implementation. Please
// DO NOT #INCLUDE IT IN A USER PROGRAM. // DO NOT #INCLUDE IT IN A USER PROGRAM.
...@@ -994,7 +991,7 @@ bool ParseNaturalNumber(const ::std::string& str, Integer* number) { ...@@ -994,7 +991,7 @@ bool ParseNaturalNumber(const ::std::string& str, Integer* number) {
const bool parse_success = *end == '\0' && errno == 0; const bool parse_success = *end == '\0' && errno == 0;
// TODO(vladl@google.com): Convert this to compile time assertion when it is // FIXME: Convert this to compile time assertion when it is
// available. // available.
GTEST_CHECK_(sizeof(Integer) <= sizeof(parsed)); GTEST_CHECK_(sizeof(Integer) <= sizeof(parsed));
......
...@@ -26,8 +26,7 @@ ...@@ -26,8 +26,7 @@
// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT // THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
//
// Author: wan@google.com (Zhanyong Wan)
#include "gtest/internal/gtest-port.h" #include "gtest/internal/gtest-port.h"
...@@ -262,7 +261,7 @@ Mutex::Mutex() ...@@ -262,7 +261,7 @@ Mutex::Mutex()
Mutex::~Mutex() { Mutex::~Mutex() {
// Static mutexes are leaked intentionally. It is not thread-safe to try // Static mutexes are leaked intentionally. It is not thread-safe to try
// to clean them up. // to clean them up.
// TODO(yukawa): Switch to Slim Reader/Writer (SRW) Locks, which requires // FIXME: Switch to Slim Reader/Writer (SRW) Locks, which requires
// nothing to clean it up but is available only on Vista and later. // nothing to clean it up but is available only on Vista and later.
// https://docs.microsoft.com/en-us/windows/desktop/Sync/slim-reader-writer--srw--locks // https://docs.microsoft.com/en-us/windows/desktop/Sync/slim-reader-writer--srw--locks
if (type_ == kDynamic) { if (type_ == kDynamic) {
...@@ -295,6 +294,43 @@ void Mutex::AssertHeld() { ...@@ -295,6 +294,43 @@ void Mutex::AssertHeld() {
<< "The current thread is not holding the mutex @" << this; << "The current thread is not holding the mutex @" << this;
} }
namespace {
// Use the RAII idiom to flag mem allocs that are intentionally never
// deallocated. The motivation is to silence the false positive mem leaks
// that are reported by the debug version of MS's CRT which can only detect
// if an alloc is missing a matching deallocation.
// Example:
// MemoryIsNotDeallocated memory_is_not_deallocated;
// critical_section_ = new CRITICAL_SECTION;
//
class MemoryIsNotDeallocated
{
public:
MemoryIsNotDeallocated() : old_crtdbg_flag_(0) {
#ifdef _MSC_VER
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);
#endif // _MSC_VER
}
~MemoryIsNotDeallocated() {
#ifdef _MSC_VER
// Restore the original _CRTDBG_ALLOC_MEM_DF flag
_CrtSetDbgFlag(old_crtdbg_flag_);
#endif // _MSC_VER
}
private:
int old_crtdbg_flag_;
GTEST_DISALLOW_COPY_AND_ASSIGN_(MemoryIsNotDeallocated);
};
} // namespace
// Initializes owner_thread_id_ and critical_section_ in static mutexes. // Initializes owner_thread_id_ and critical_section_ in static mutexes.
void Mutex::ThreadSafeLazyInit() { void Mutex::ThreadSafeLazyInit() {
// Dynamic mutexes are initialized in the constructor. // Dynamic mutexes are initialized in the constructor.
...@@ -305,7 +341,11 @@ void Mutex::ThreadSafeLazyInit() { ...@@ -305,7 +341,11 @@ void Mutex::ThreadSafeLazyInit() {
// If critical_section_init_phase_ was 0 before the exchange, we // If critical_section_init_phase_ was 0 before the exchange, we
// are the first to test it and need to perform the initialization. // are the first to test it and need to perform the initialization.
owner_thread_id_ = 0; owner_thread_id_ = 0;
critical_section_ = new CRITICAL_SECTION; {
// Use RAII to flag that following mem alloc is never deallocated.
MemoryIsNotDeallocated memory_is_not_deallocated;
critical_section_ = new CRITICAL_SECTION;
}
::InitializeCriticalSection(critical_section_); ::InitializeCriticalSection(critical_section_);
// Updates the critical_section_init_phase_ to 2 to signal // Updates the critical_section_init_phase_ to 2 to signal
// initialization complete. // initialization complete.
...@@ -344,7 +384,7 @@ class ThreadWithParamSupport : public ThreadWithParamBase { ...@@ -344,7 +384,7 @@ class ThreadWithParamSupport : public ThreadWithParamBase {
Notification* thread_can_start) { Notification* thread_can_start) {
ThreadMainParam* param = new ThreadMainParam(runnable, thread_can_start); ThreadMainParam* param = new ThreadMainParam(runnable, thread_can_start);
DWORD thread_id; DWORD thread_id;
// TODO(yukawa): Consider to use _beginthreadex instead. // FIXME: Consider to use _beginthreadex instead.
HANDLE thread_handle = ::CreateThread( HANDLE thread_handle = ::CreateThread(
NULL, // Default security. NULL, // Default security.
0, // Default stack size. 0, // Default stack size.
...@@ -547,7 +587,8 @@ class ThreadLocalRegistryImpl { ...@@ -547,7 +587,8 @@ class ThreadLocalRegistryImpl {
// Returns map of thread local instances. // Returns map of thread local instances.
static ThreadIdToThreadLocals* GetThreadLocalsMapLocked() { static ThreadIdToThreadLocals* GetThreadLocalsMapLocked() {
mutex_.AssertHeld(); mutex_.AssertHeld();
static ThreadIdToThreadLocals* map = new ThreadIdToThreadLocals; MemoryIsNotDeallocated memory_is_not_deallocated;
static ThreadIdToThreadLocals* map = new ThreadIdToThreadLocals();
return map; return map;
} }
...@@ -696,7 +737,7 @@ static std::string FormatRegexSyntaxError(const char* regex, int index) { ...@@ -696,7 +737,7 @@ static std::string FormatRegexSyntaxError(const char* regex, int index) {
// otherwise returns true. // otherwise returns true.
bool ValidateRegex(const char* regex) { bool ValidateRegex(const char* regex) {
if (regex == NULL) { if (regex == NULL) {
// TODO(wan@google.com): fix the source file location in the // FIXME: fix the source file location in the
// assertion failures to match where the regex is used in user // assertion failures to match where the regex is used in user
// code. // code.
ADD_FAILURE() << "NULL is not a valid simple regular expression."; ADD_FAILURE() << "NULL is not a valid simple regular expression.";
...@@ -942,7 +983,7 @@ GTestLog::~GTestLog() { ...@@ -942,7 +983,7 @@ GTestLog::~GTestLog() {
// Disable Microsoft deprecation warnings for POSIX functions called from // Disable Microsoft deprecation warnings for POSIX functions called from
// this class (creat, dup, dup2, and close) // this class (creat, dup, dup2, and close)
GTEST_DISABLE_MSC_WARNINGS_PUSH_(4996) GTEST_DISABLE_MSC_DEPRECATED_PUSH_()
#if GTEST_HAS_STREAM_REDIRECTION #if GTEST_HAS_STREAM_REDIRECTION
...@@ -1026,7 +1067,7 @@ class CapturedStream { ...@@ -1026,7 +1067,7 @@ class CapturedStream {
GTEST_DISALLOW_COPY_AND_ASSIGN_(CapturedStream); GTEST_DISALLOW_COPY_AND_ASSIGN_(CapturedStream);
}; };
GTEST_DISABLE_MSC_WARNINGS_POP_() GTEST_DISABLE_MSC_DEPRECATED_POP_()
static CapturedStream* g_captured_stderr = NULL; static CapturedStream* g_captured_stderr = NULL;
static CapturedStream* g_captured_stdout = NULL; static CapturedStream* g_captured_stdout = NULL;
......
...@@ -26,8 +26,7 @@ ...@@ -26,8 +26,7 @@
// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT // THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
//
// Author: wan@google.com (Zhanyong Wan)
// Google Test - The Google C++ Testing and Mocking Framework // Google Test - The Google C++ Testing and Mocking Framework
// //
...@@ -90,7 +89,7 @@ void PrintBytesInObjectToImpl(const unsigned char* obj_bytes, size_t count, ...@@ -90,7 +89,7 @@ void PrintBytesInObjectToImpl(const unsigned char* obj_bytes, size_t count,
// If the object size is bigger than kThreshold, we'll have to omit // If the object size is bigger than kThreshold, we'll have to omit
// some details by printing only the first and the last kChunkSize // some details by printing only the first and the last kChunkSize
// bytes. // bytes.
// TODO(wan): let the user control the threshold using a flag. // FIXME: let the user control the threshold using a flag.
if (count < kThreshold) { if (count < kThreshold) {
PrintByteSegmentInObjectTo(obj_bytes, 0, count, os); PrintByteSegmentInObjectTo(obj_bytes, 0, count, os);
} else { } else {
......
...@@ -26,8 +26,7 @@ ...@@ -26,8 +26,7 @@
// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT // THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
//
// Author: mheule@google.com (Markus Heule)
// //
// The Google C++ Testing and Mocking Framework (Google Test) // The Google C++ Testing and Mocking Framework (Google Test)
......
...@@ -26,8 +26,7 @@ ...@@ -26,8 +26,7 @@
// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT // THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
//
// Author: wan@google.com (Zhanyong Wan)
#include "gtest/gtest-typed-test.h" #include "gtest/gtest-typed-test.h"
......
...@@ -26,8 +26,7 @@ ...@@ -26,8 +26,7 @@
// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT // THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
//
// Author: wan@google.com (Zhanyong Wan)
// //
// The Google C++ Testing and Mocking Framework (Google Test) // The Google C++ Testing and Mocking Framework (Google Test)
...@@ -55,7 +54,7 @@ ...@@ -55,7 +54,7 @@
#if GTEST_OS_LINUX #if GTEST_OS_LINUX
// TODO(kenton@google.com): Use autoconf to detect availability of // FIXME: Use autoconf to detect availability of
// gettimeofday(). // gettimeofday().
# define GTEST_HAS_GETTIMEOFDAY_ 1 # define GTEST_HAS_GETTIMEOFDAY_ 1
...@@ -94,9 +93,9 @@ ...@@ -94,9 +93,9 @@
# if GTEST_OS_WINDOWS_MINGW # if GTEST_OS_WINDOWS_MINGW
// MinGW has gettimeofday() but not _ftime64(). // MinGW has gettimeofday() but not _ftime64().
// TODO(kenton@google.com): Use autoconf to detect availability of // FIXME: Use autoconf to detect availability of
// gettimeofday(). // gettimeofday().
// TODO(kenton@google.com): There are other ways to get the time on // FIXME: There are other ways to get the time on
// Windows, like GetTickCount() or GetSystemTimeAsFileTime(). MinGW // Windows, like GetTickCount() or GetSystemTimeAsFileTime(). MinGW
// supports these. consider using them instead. // supports these. consider using them instead.
# define GTEST_HAS_GETTIMEOFDAY_ 1 # define GTEST_HAS_GETTIMEOFDAY_ 1
...@@ -111,7 +110,7 @@ ...@@ -111,7 +110,7 @@
#else #else
// Assume other platforms have gettimeofday(). // Assume other platforms have gettimeofday().
// TODO(kenton@google.com): Use autoconf to detect availability of // FIXME: Use autoconf to detect availability of
// gettimeofday(). // gettimeofday().
# define GTEST_HAS_GETTIMEOFDAY_ 1 # define GTEST_HAS_GETTIMEOFDAY_ 1
...@@ -468,7 +467,7 @@ std::string UnitTestOptions::GetAbsolutePathToOutputFile() { ...@@ -468,7 +467,7 @@ std::string UnitTestOptions::GetAbsolutePathToOutputFile() {
internal::FilePath output_name(colon + 1); internal::FilePath output_name(colon + 1);
if (!output_name.IsAbsolutePath()) if (!output_name.IsAbsolutePath())
// TODO(wan@google.com): on Windows \some\path is not an absolute // FIXME: on Windows \some\path is not an absolute
// path (as its meaning depends on the current drive), yet the // path (as its meaning depends on the current drive), yet the
// following logic for turning it into an absolute path is wrong. // following logic for turning it into an absolute path is wrong.
// Fix it. // Fix it.
...@@ -842,7 +841,7 @@ TimeInMillis GetTimeInMillis() { ...@@ -842,7 +841,7 @@ TimeInMillis GetTimeInMillis() {
SYSTEMTIME now_systime; SYSTEMTIME now_systime;
FILETIME now_filetime; FILETIME now_filetime;
ULARGE_INTEGER now_int64; ULARGE_INTEGER now_int64;
// TODO(kenton@google.com): Shouldn't this just use // FIXME: Shouldn't this just use
// GetSystemTimeAsFileTime()? // GetSystemTimeAsFileTime()?
GetSystemTime(&now_systime); GetSystemTime(&now_systime);
if (SystemTimeToFileTime(&now_systime, &now_filetime)) { if (SystemTimeToFileTime(&now_systime, &now_filetime)) {
...@@ -858,11 +857,11 @@ TimeInMillis GetTimeInMillis() { ...@@ -858,11 +857,11 @@ TimeInMillis GetTimeInMillis() {
// MSVC 8 deprecates _ftime64(), so we want to suppress warning 4996 // MSVC 8 deprecates _ftime64(), so we want to suppress warning 4996
// (deprecated function) there. // (deprecated function) there.
// TODO(kenton@google.com): Use GetTickCount()? Or use // FIXME: Use GetTickCount()? Or use
// SystemTimeToFileTime() // SystemTimeToFileTime()
GTEST_DISABLE_MSC_WARNINGS_PUSH_(4996) GTEST_DISABLE_MSC_DEPRECATED_PUSH_()
_ftime64(&now); _ftime64(&now);
GTEST_DISABLE_MSC_WARNINGS_POP_() GTEST_DISABLE_MSC_DEPRECATED_POP_()
return static_cast<TimeInMillis>(now.time) * 1000 + now.millitm; return static_cast<TimeInMillis>(now.time) * 1000 + now.millitm;
#elif GTEST_HAS_GETTIMEOFDAY_ #elif GTEST_HAS_GETTIMEOFDAY_
...@@ -1397,7 +1396,7 @@ AssertionResult DoubleNearPredFormat(const char* expr1, ...@@ -1397,7 +1396,7 @@ AssertionResult DoubleNearPredFormat(const char* expr1,
const double diff = fabs(val1 - val2); const double diff = fabs(val1 - val2);
if (diff <= abs_error) return AssertionSuccess(); if (diff <= abs_error) return AssertionSuccess();
// TODO(wan): do not print the value of an expression if it's // FIXME: do not print the value of an expression if it's
// already a literal. // already a literal.
return AssertionFailure() return AssertionFailure()
<< "The difference between " << expr1 << " and " << expr2 << "The difference between " << expr1 << " and " << expr2
...@@ -3138,6 +3137,7 @@ void PrettyUnitTestResultPrinter::OnTestIterationStart( ...@@ -3138,6 +3137,7 @@ void PrettyUnitTestResultPrinter::OnTestIterationStart(
"Note: Randomizing tests' orders with a seed of %d .\n", "Note: Randomizing tests' orders with a seed of %d .\n",
unit_test.random_seed()); unit_test.random_seed());
} }
ColoredPrintf(COLOR_GREEN, "[==========] "); ColoredPrintf(COLOR_GREEN, "[==========] ");
printf("Running %s from %s.\n", printf("Running %s from %s.\n",
FormatTestCount(unit_test.test_to_run_count()).c_str(), FormatTestCount(unit_test.test_to_run_count()).c_str(),
...@@ -3334,7 +3334,7 @@ void TestEventRepeater::Append(TestEventListener *listener) { ...@@ -3334,7 +3334,7 @@ void TestEventRepeater::Append(TestEventListener *listener) {
listeners_.push_back(listener); listeners_.push_back(listener);
} }
// TODO(vladl@google.com): Factor the search functionality into Vector::Find. // FIXME: Factor the search functionality into Vector::Find.
TestEventListener* TestEventRepeater::Release(TestEventListener *listener) { TestEventListener* TestEventRepeater::Release(TestEventListener *listener) {
for (size_t i = 0; i < listeners_.size(); ++i) { for (size_t i = 0; i < listeners_.size(); ++i) {
if (listeners_[i] == listener) { if (listeners_[i] == listener) {
...@@ -3499,7 +3499,7 @@ void XmlUnitTestResultPrinter::OnTestIterationEnd(const UnitTest& unit_test, ...@@ -3499,7 +3499,7 @@ void XmlUnitTestResultPrinter::OnTestIterationEnd(const UnitTest& unit_test,
xmlout = posix::FOpen(output_file_.c_str(), "w"); xmlout = posix::FOpen(output_file_.c_str(), "w");
} }
if (xmlout == NULL) { if (xmlout == NULL) {
// TODO(wan): report the reason of the failure. // FIXME: report the reason of the failure.
// //
// We don't do it for now as: // We don't do it for now as:
// //
...@@ -3528,7 +3528,7 @@ void XmlUnitTestResultPrinter::OnTestIterationEnd(const UnitTest& unit_test, ...@@ -3528,7 +3528,7 @@ void XmlUnitTestResultPrinter::OnTestIterationEnd(const UnitTest& unit_test,
// module will consist of ordinary English text. // module will consist of ordinary English text.
// If this module is ever modified to produce version 1.1 XML output, // If this module is ever modified to produce version 1.1 XML output,
// most invalid characters can be retained using character references. // most invalid characters can be retained using character references.
// TODO(wan): It might be nice to have a minimally invasive, human-readable // FIXME: It might be nice to have a minimally invasive, human-readable
// escaping scheme for invalid characters, rather than dropping them. // escaping scheme for invalid characters, rather than dropping them.
std::string XmlUnitTestResultPrinter::EscapeXml( std::string XmlUnitTestResultPrinter::EscapeXml(
const std::string& str, bool is_attribute) { const std::string& str, bool is_attribute) {
...@@ -3589,6 +3589,7 @@ std::string XmlUnitTestResultPrinter::RemoveInvalidXmlCharacters( ...@@ -3589,6 +3589,7 @@ std::string XmlUnitTestResultPrinter::RemoveInvalidXmlCharacters(
// The following routines generate an XML representation of a UnitTest // The following routines generate an XML representation of a UnitTest
// object. // object.
// GOOGLETEST_CM0009 DO NOT DELETE
// //
// This is how Google Test concepts map to the DTD: // This is how Google Test concepts map to the DTD:
// //
...@@ -3678,7 +3679,7 @@ void XmlUnitTestResultPrinter::OutputXmlAttribute( ...@@ -3678,7 +3679,7 @@ void XmlUnitTestResultPrinter::OutputXmlAttribute(
} }
// Prints an XML representation of a TestInfo object. // Prints an XML representation of a TestInfo object.
// TODO(wan): There is also value in printing properties with the plain printer. // FIXME: There is also value in printing properties with the plain printer.
void XmlUnitTestResultPrinter::OutputXmlTestInfo(::std::ostream* stream, void XmlUnitTestResultPrinter::OutputXmlTestInfo(::std::ostream* stream,
const char* test_case_name, const char* test_case_name,
const TestInfo& test_info) { const TestInfo& test_info) {
...@@ -3905,7 +3906,7 @@ void JsonUnitTestResultPrinter::OnTestIterationEnd(const UnitTest& unit_test, ...@@ -3905,7 +3906,7 @@ void JsonUnitTestResultPrinter::OnTestIterationEnd(const UnitTest& unit_test,
jsonout = posix::FOpen(output_file_.c_str(), "w"); jsonout = posix::FOpen(output_file_.c_str(), "w");
} }
if (jsonout == NULL) { if (jsonout == NULL) {
// TODO(phosek): report the reason of the failure. // FIXME: report the reason of the failure.
// //
// We don't do it for now as: // We don't do it for now as:
// //
...@@ -4720,7 +4721,7 @@ int UnitTest::Run() { ...@@ -4720,7 +4721,7 @@ int UnitTest::Run() {
// VC++ doesn't define _set_abort_behavior() prior to the version 8.0. // VC++ doesn't define _set_abort_behavior() prior to the version 8.0.
// Users of prior VC versions shall suffer the agony and pain of // Users of prior VC versions shall suffer the agony and pain of
// clicking through the countless debug dialogs. // clicking through the countless debug dialogs.
// TODO(vladl@google.com): find a way to suppress the abort dialog() in the // FIXME: find a way to suppress the abort dialog() in the
// debug mode when compiled with VC 7.1 or lower. // debug mode when compiled with VC 7.1 or lower.
if (!GTEST_FLAG(break_on_failure)) if (!GTEST_FLAG(break_on_failure))
_set_abort_behavior( _set_abort_behavior(
...@@ -5614,7 +5615,7 @@ static bool HasGoogleTestFlagPrefix(const char* str) { ...@@ -5614,7 +5615,7 @@ static bool HasGoogleTestFlagPrefix(const char* str) {
// @Y changes the color to yellow. // @Y changes the color to yellow.
// @D changes to the default terminal text color. // @D changes to the default terminal text color.
// //
// TODO(wan@google.com): Write tests for this once we add stdout // FIXME: Write tests for this once we add stdout
// capturing to Google Test. // capturing to Google Test.
static void PrintColorEncoded(const char* str) { static void PrintColorEncoded(const char* str) {
GTestColor color = COLOR_DEFAULT; // The current color. GTestColor color = COLOR_DEFAULT; // The current color.
......
...@@ -26,7 +26,6 @@ ...@@ -26,7 +26,6 @@
// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT // THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
//
#include <stdio.h> #include <stdio.h>
#include "gtest/gtest.h" #include "gtest/gtest.h"
......
...@@ -49,31 +49,48 @@ config_setting( ...@@ -49,31 +49,48 @@ config_setting(
values = {"define": "absl=1"}, values = {"define": "absl=1"},
) )
#on windows exclude gtest-tuple.h and gtest-tuple_test.cc #on windows exclude gtest-tuple.h and googletest-tuple-test.cc
cc_test( cc_test(
name = "gtest_all_test", name = "gtest_all_test",
size = "small", size = "small",
srcs = glob( srcs = glob(
include = [ include = [
"gtest-*.cc", "gtest-*.cc",
"googletest-*.cc",
"*.h", "*.h",
"googletest/include/gtest/**/*.h", "googletest/include/gtest/**/*.h",
], ],
exclude = [ exclude = [
"gtest-unittest-api_test.cc", "gtest-unittest-api_test.cc",
"gtest-tuple_test.cc", "googletest-tuple-test.cc",
"googletest/src/gtest-all.cc", "googletest/src/gtest-all.cc",
"gtest_all_test.cc", "gtest_all_test.cc",
"gtest-death-test_ex_test.cc", "gtest-death-test_ex_test.cc",
"gtest-listener_test.cc", "gtest-listener_test.cc",
"gtest-unittest-api_test.cc", "gtest-unittest-api_test.cc",
"gtest-param-test_test.cc", "googletest-param-test-test.cc",
"googletest-catch-exceptions-test_.cc",
"googletest-color-test_.cc",
"googletest-env-var-test_.cc",
"googletest-filter-unittest_.cc",
"googletest-break-on-failure-unittest_.cc",
"googletest-listener-test.cc",
"googletest-output-test_.cc",
"googletest-list-tests-unittest_.cc",
"googletest-shuffle-test_.cc",
"googletest-uninitialized-test_.cc",
"googletest-death-test_ex_test.cc",
"googletest-param-test-test",
"googletest-throw-on-failure-test_.cc",
"googletest-param-test-invalid-name1-test_.cc",
"googletest-param-test-invalid-name2-test_.cc",
], ],
) + select({ ) + select({
"//:windows": [], "//:windows": [],
"//:windows_msvc": [], "//:windows_msvc": [],
"//conditions:default": [ "//conditions:default": [
"gtest-tuple_test.cc", "googletest-tuple-test.cc",
], ],
}), }),
copts = select({ copts = select({
...@@ -98,6 +115,14 @@ cc_test( ...@@ -98,6 +115,14 @@ cc_test(
) )
# Tests death tests.
cc_test(
name = "googletest-death-test-test",
size = "medium",
srcs = ["googletest-death-test-test.cc"],
deps = ["//:gtest_main"],
)
cc_test( cc_test(
name = "gtest_test_macro_stack_footprint_test", name = "gtest_test_macro_stack_footprint_test",
size = "small", size = "small",
...@@ -107,14 +132,10 @@ cc_test( ...@@ -107,14 +132,10 @@ cc_test(
#These googletest tests have their own main() #These googletest tests have their own main()
cc_test( cc_test(
name = "gtest-listener_test", name = "googletest-listener-test",
size = "small", size = "small",
srcs = [ srcs = ["googletest-listener-test.cc"],
"gtest-listener_test.cc", deps = ["//:gtest_main"],
],
deps = [
"//:gtest",
],
) )
cc_test( cc_test(
...@@ -129,16 +150,14 @@ cc_test( ...@@ -129,16 +150,14 @@ cc_test(
) )
cc_test( cc_test(
name = "gtest-param-test_test", name = "googletest-param-test-test",
size = "small", size = "small",
srcs = [ srcs = [
"gtest-param-test2_test.cc", "googletest-param-test-test.cc",
"gtest-param-test_test.cc", "googletest-param-test-test.h",
"gtest-param-test_test.h", "googletest-param-test2-test.cc",
],
deps = [
"//:gtest",
], ],
deps = ["//:gtest"],
) )
cc_test( cc_test(
...@@ -174,87 +193,92 @@ py_test( ...@@ -174,87 +193,92 @@ py_test(
) )
cc_binary( cc_binary(
name = "gtest_output_test_", name = "googletest-output-test_",
testonly = 1, testonly = 1,
srcs = ["gtest_output_test_.cc"], srcs = ["googletest-output-test_.cc"],
deps = ["//:gtest"], deps = ["//:gtest"],
) )
py_test( py_test(
name = "gtest_output_test", name = "googletest-output-test",
size = "small", size = "small",
srcs = ["gtest_output_test.py"], srcs = ["googletest-output-test.py"],
args = select({ args = select({
":has_absl": [], ":has_absl": [],
"//conditions:default": ["--no_stacktrace_support"], "//conditions:default": ["--no_stacktrace_support"],
}), }),
data = [ data = [
"gtest_output_test_golden_lin.txt", "googletest-output-test-golden-lin.txt",
":gtest_output_test_", ":googletest-output-test_",
], ],
deps = [":gtest_test_utils"], deps = [":gtest_test_utils"],
) )
cc_binary( cc_binary(
name = "gtest_color_test_", name = "googletest-color-test_",
testonly = 1, testonly = 1,
srcs = ["gtest_color_test_.cc"], srcs = ["googletest-color-test_.cc"],
deps = ["//:gtest"], deps = ["//:gtest"],
) )
py_test( py_test(
name = "gtest_color_test", name = "googletest-color-test",
size = "small", size = "small",
srcs = ["gtest_color_test.py"], srcs = ["googletest-color-test.py"],
data = [":gtest_color_test_"], data = [":googletest-color-test_"],
deps = [":gtest_test_utils"], deps = [":gtest_test_utils"],
) )
cc_binary( cc_binary(
name = "gtest_env_var_test_", name = "googletest-env-var-test_",
testonly = 1, testonly = 1,
srcs = ["gtest_env_var_test_.cc"], srcs = ["googletest-env-var-test_.cc"],
deps = ["//:gtest"], deps = ["//:gtest"],
) )
py_test( py_test(
name = "gtest_env_var_test", name = "googletest-env-var-test",
size = "small", size = "medium",
srcs = ["gtest_env_var_test.py"], srcs = ["googletest-env-var-test.py"],
data = [":gtest_env_var_test_"], data = [":googletest-env-var-test_"],
deps = [":gtest_test_utils"], deps = [":gtest_test_utils"],
) )
cc_binary( cc_binary(
name = "gtest_filter_unittest_", name = "googletest-filter-unittest_",
testonly = 1, testonly = 1,
srcs = ["gtest_filter_unittest_.cc"], srcs = ["googletest-filter-unittest_.cc"],
deps = ["//:gtest"], deps = ["//:gtest"],
) )
py_test( py_test(
name = "gtest_filter_unittest", name = "googletest-filter-unittest",
size = "small", size = "medium",
srcs = ["gtest_filter_unittest.py"], srcs = ["googletest-filter-unittest.py"],
data = [":gtest_filter_unittest_"], data = [":googletest-filter-unittest_"],
deps = [":gtest_test_utils"], deps = [":gtest_test_utils"],
) )
cc_binary( cc_binary(
name = "gtest_break_on_failure_unittest_", name = "googletest-break-on-failure-unittest_",
testonly = 1, testonly = 1,
srcs = ["gtest_break_on_failure_unittest_.cc"], srcs = ["googletest-break-on-failure-unittest_.cc"],
deps = ["//:gtest"], deps = ["//:gtest"],
) )
py_test( py_test(
name = "gtest_break_on_failure_unittest", name = "googletest-break-on-failure-unittest",
size = "small", size = "small",
srcs = ["gtest_break_on_failure_unittest.py"], srcs = ["googletest-break-on-failure-unittest.py"],
data = [":gtest_break_on_failure_unittest_"], data = [":googletest-break-on-failure-unittest_"],
deps = [":gtest_test_utils"], deps = [":gtest_test_utils"],
) )
cc_test( cc_test(
name = "gtest_assert_by_exception_test", name = "gtest_assert_by_exception_test",
size = "small", size = "small",
...@@ -262,72 +286,75 @@ cc_test( ...@@ -262,72 +286,75 @@ cc_test(
deps = ["//:gtest"], deps = ["//:gtest"],
) )
cc_binary( cc_binary(
name = "gtest_throw_on_failure_test_", name = "googletest-throw-on-failure-test_",
testonly = 1, testonly = 1,
srcs = ["gtest_throw_on_failure_test_.cc"], srcs = ["googletest-throw-on-failure-test_.cc"],
deps = ["//:gtest"], deps = ["//:gtest"],
) )
py_test( py_test(
name = "gtest_throw_on_failure_test", name = "googletest-throw-on-failure-test",
size = "small", size = "small",
srcs = ["gtest_throw_on_failure_test.py"], srcs = ["googletest-throw-on-failure-test.py"],
data = [":gtest_throw_on_failure_test_"], data = [":googletest-throw-on-failure-test_"],
deps = [":gtest_test_utils"], deps = [":gtest_test_utils"],
) )
cc_binary( cc_binary(
name = "gtest_list_tests_unittest_", name = "googletest-list-tests-unittest_",
testonly = 1, testonly = 1,
srcs = ["gtest_list_tests_unittest_.cc"], srcs = ["googletest-list-tests-unittest_.cc"],
deps = ["//:gtest"], deps = ["//:gtest"],
) )
py_test( py_test(
name = "gtest_list_tests_unittest", name = "googletest-list-tests-unittest",
size = "small", size = "small",
srcs = ["gtest_list_tests_unittest.py"], srcs = ["googletest-list-tests-unittest.py"],
data = [":gtest_list_tests_unittest_"], data = [":googletest-list-tests-unittest_"],
deps = [":gtest_test_utils"], deps = [":gtest_test_utils"],
) )
cc_binary( cc_binary(
name = "gtest_shuffle_test_", name = "googletest-shuffle-test_",
srcs = ["gtest_shuffle_test_.cc"], srcs = ["googletest-shuffle-test_.cc"],
deps = ["//:gtest"], deps = ["//:gtest"],
) )
py_test( py_test(
name = "gtest_shuffle_test", name = "googletest-shuffle-test",
size = "small", size = "small",
srcs = ["gtest_shuffle_test.py"], srcs = ["googletest-shuffle-test.py"],
data = [":gtest_shuffle_test_"], data = [":googletest-shuffle-test_"],
deps = [":gtest_test_utils"], deps = [":gtest_test_utils"],
) )
cc_binary( cc_binary(
name = "gtest_catch_exceptions_no_ex_test_", name = "googletest-catch-exceptions-no-ex-test_",
testonly = 1, testonly = 1,
srcs = ["gtest_catch_exceptions_test_.cc"], srcs = ["googletest-catch-exceptions-test_.cc"],
deps = ["//:gtest_main"], deps = ["//:gtest_main"],
) )
cc_binary( cc_binary(
name = "gtest_catch_exceptions_ex_test_", name = "googletest-catch-exceptions-ex-test_",
testonly = 1, testonly = 1,
srcs = ["gtest_catch_exceptions_test_.cc"], srcs = ["googletest-catch-exceptions-test_.cc"],
copts = ["-fexceptions"], copts = ["-fexceptions"],
deps = ["//:gtest_main"], deps = ["//:gtest_main"],
) )
py_test( py_test(
name = "gtest_catch_exceptions_test", name = "googletest-catch-exceptions-test",
size = "small", size = "small",
srcs = ["gtest_catch_exceptions_test.py"], srcs = ["googletest-catch-exceptions-test.py"],
data = [ data = [
":gtest_catch_exceptions_ex_test_", ":googletest-catch-exceptions-ex-test_",
":gtest_catch_exceptions_no_ex_test_", ":googletest-catch-exceptions-no-ex-test_",
], ],
deps = [":gtest_test_utils"], deps = [":gtest_test_utils"],
) )
...@@ -395,17 +422,17 @@ py_test( ...@@ -395,17 +422,17 @@ py_test(
) )
cc_binary( cc_binary(
name = "gtest_uninitialized_test_", name = "googletest-uninitialized-test_",
testonly = 1, testonly = 1,
srcs = ["gtest_uninitialized_test_.cc"], srcs = ["googletest-uninitialized-test_.cc"],
deps = ["//:gtest"], deps = ["//:gtest"],
) )
py_test( py_test(
name = "gtest_uninitialized_test", name = "googletest-uninitialized-test",
size = "medium", size = "medium",
srcs = ["gtest_uninitialized_test.py"], srcs = ["googletest-uninitialized-test.py"],
data = [":gtest_uninitialized_test_"], data = ["googletest-uninitialized-test_"],
deps = [":gtest_test_utils"], deps = [":gtest_test_utils"],
) )
...@@ -424,3 +451,77 @@ py_test( ...@@ -424,3 +451,77 @@ py_test(
data = [":gtest_testbridge_test_"], data = [":gtest_testbridge_test_"],
deps = [":gtest_test_utils"], deps = [":gtest_test_utils"],
) )
py_test(
name = "googletest-json-outfiles-test",
size = "small",
srcs = [
"googletest-json-outfiles-test.py",
"gtest_json_test_utils.py",
],
data = [
":gtest_xml_outfile1_test_",
":gtest_xml_outfile2_test_",
],
deps = [":gtest_test_utils"],
)
py_test(
name = "googletest-json-output-unittest",
size = "medium",
srcs = [
"googletest-json-output-unittest.py",
"gtest_json_test_utils.py",
],
data = [
# We invoke gtest_no_test_unittest to verify the JSON output
# when the test program contains no test definition.
":gtest_no_test_unittest",
":gtest_xml_output_unittest_",
],
args = select({
":has_absl": [],
"//conditions:default": ["--no_stacktrace_support"],
}),
deps = [":gtest_test_utils"],
)
# Verifies interaction of death tests and exceptions.
cc_test(
name = "googletest-death-test_ex_catch_test",
size = "medium",
srcs = ["googletest-death-test_ex_test.cc"],
copts = ["-fexceptions"],
defines = ["GTEST_ENABLE_CATCH_EXCEPTIONS_=1"],
deps = ["//:gtest"],
)
cc_binary(
name = "googletest-param-test-invalid-name1-test_",
testonly = 1,
srcs = ["googletest-param-test-invalid-name1-test_.cc"],
deps = ["//:gtest"],
)
cc_binary(
name = "googletest-param-test-invalid-name2-test_",
testonly = 1,
srcs = ["googletest-param-test-invalid-name2-test_.cc"],
deps = ["//:gtest"],
)
py_test(
name = "googletest-param-test-invalid-name1-test",
size = "small",
srcs = ["googletest-param-test-invalid-name1-test.py"],
data = [":googletest-param-test-invalid-name1-test_"],
deps = [":gtest_test_utils"],
)
py_test(
name = "googletest-param-test-invalid-name2-test",
size = "small",
srcs = ["googletest-param-test-invalid-name2-test.py"],
data = [":googletest-param-test-invalid-name2-test_"],
deps = [":gtest_test_utils"],
)
...@@ -34,12 +34,10 @@ ...@@ -34,12 +34,10 @@
A user can ask Google Test to seg-fault when an assertion fails, using A user can ask Google Test to seg-fault when an assertion fails, using
either the GTEST_BREAK_ON_FAILURE environment variable or the either the GTEST_BREAK_ON_FAILURE environment variable or the
--gtest_break_on_failure flag. This script tests such functionality --gtest_break_on_failure flag. This script tests such functionality
by invoking gtest_break_on_failure_unittest_ (a program written with by invoking googletest-break-on-failure-unittest_ (a program written with
Google Test) with different environments and command line flags. Google Test) with different environments and command line flags.
""" """
__author__ = 'wan@google.com (Zhanyong Wan)'
import os import os
import gtest_test_utils import gtest_test_utils
...@@ -59,9 +57,9 @@ THROW_ON_FAILURE_ENV_VAR = 'GTEST_THROW_ON_FAILURE' ...@@ -59,9 +57,9 @@ THROW_ON_FAILURE_ENV_VAR = 'GTEST_THROW_ON_FAILURE'
# The environment variable for enabling/disabling the catch-exceptions mode. # The environment variable for enabling/disabling the catch-exceptions mode.
CATCH_EXCEPTIONS_ENV_VAR = 'GTEST_CATCH_EXCEPTIONS' CATCH_EXCEPTIONS_ENV_VAR = 'GTEST_CATCH_EXCEPTIONS'
# Path to the gtest_break_on_failure_unittest_ program. # Path to the googletest-break-on-failure-unittest_ program.
EXE_PATH = gtest_test_utils.GetTestExecutablePath( EXE_PATH = gtest_test_utils.GetTestExecutablePath(
'gtest_break_on_failure_unittest_') 'googletest-break-on-failure-unittest_')
environ = gtest_test_utils.environ environ = gtest_test_utils.environ
...@@ -95,7 +93,7 @@ class GTestBreakOnFailureUnitTest(gtest_test_utils.TestCase): ...@@ -95,7 +93,7 @@ class GTestBreakOnFailureUnitTest(gtest_test_utils.TestCase):
""" """
def RunAndVerify(self, env_var_value, flag_value, expect_seg_fault): def RunAndVerify(self, env_var_value, flag_value, expect_seg_fault):
"""Runs gtest_break_on_failure_unittest_ and verifies that it does """Runs googletest-break-on-failure-unittest_ and verifies that it does
(or does not) have a seg-fault. (or does not) have a seg-fault.
Args: Args:
......
...@@ -26,8 +26,7 @@ ...@@ -26,8 +26,7 @@
// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT // THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
//
// Author: wan@google.com (Zhanyong Wan)
// Unit test for Google Test's break-on-failure mode. // Unit test for Google Test's break-on-failure mode.
// //
......
...@@ -30,13 +30,11 @@ ...@@ -30,13 +30,11 @@
"""Tests Google Test's exception catching behavior. """Tests Google Test's exception catching behavior.
This script invokes gtest_catch_exceptions_test_ and This script invokes googletest-catch-exceptions-test_ and
gtest_catch_exceptions_ex_test_ (programs written with googletest-catch-exceptions-ex-test_ (programs written with
Google Test) and verifies their output. Google Test) and verifies their output.
""" """
__author__ = 'vladl@google.com (Vlad Losev)'
import gtest_test_utils import gtest_test_utils
# Constants. # Constants.
...@@ -45,15 +43,15 @@ LIST_TESTS_FLAG = FLAG_PREFIX + 'list_tests' ...@@ -45,15 +43,15 @@ LIST_TESTS_FLAG = FLAG_PREFIX + 'list_tests'
NO_CATCH_EXCEPTIONS_FLAG = FLAG_PREFIX + 'catch_exceptions=0' NO_CATCH_EXCEPTIONS_FLAG = FLAG_PREFIX + 'catch_exceptions=0'
FILTER_FLAG = FLAG_PREFIX + 'filter' FILTER_FLAG = FLAG_PREFIX + 'filter'
# Path to the gtest_catch_exceptions_ex_test_ binary, compiled with # Path to the googletest-catch-exceptions-ex-test_ binary, compiled with
# exceptions enabled. # exceptions enabled.
EX_EXE_PATH = gtest_test_utils.GetTestExecutablePath( EX_EXE_PATH = gtest_test_utils.GetTestExecutablePath(
'gtest_catch_exceptions_ex_test_') 'googletest-catch-exceptions-ex-test_')
# Path to the gtest_catch_exceptions_test_ binary, compiled with # Path to the googletest-catch-exceptions-test_ binary, compiled with
# exceptions disabled. # exceptions disabled.
EXE_PATH = gtest_test_utils.GetTestExecutablePath( EXE_PATH = gtest_test_utils.GetTestExecutablePath(
'gtest_catch_exceptions_no_ex_test_') 'googletest-catch-exceptions-no-ex-test_')
environ = gtest_test_utils.environ environ = gtest_test_utils.environ
SetEnvVar = gtest_test_utils.SetEnvVar SetEnvVar = gtest_test_utils.SetEnvVar
......
...@@ -26,17 +26,17 @@ ...@@ -26,17 +26,17 @@
// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT // THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
//
// Author: vladl@google.com (Vlad Losev)
// //
// Tests for Google Test itself. Tests in this file throw C++ or SEH // Tests for Google Test itself. Tests in this file throw C++ or SEH
// exceptions, and the output is verified by gtest_catch_exceptions_test.py. // exceptions, and the output is verified by
// googletest-catch-exceptions-test.py.
#include "gtest/gtest.h"
#include <stdio.h> // NOLINT #include <stdio.h> // NOLINT
#include <stdlib.h> // For exit(). #include <stdlib.h> // For exit().
#include "gtest/gtest.h"
#if GTEST_HAS_SEH #if GTEST_HAS_SEH
# include <windows.h> # include <windows.h>
#endif #endif
......
...@@ -31,8 +31,6 @@ ...@@ -31,8 +31,6 @@
"""Verifies that Google Test correctly determines whether to use colors.""" """Verifies that Google Test correctly determines whether to use colors."""
__author__ = 'wan@google.com (Zhanyong Wan)'
import os import os
import gtest_test_utils import gtest_test_utils
...@@ -40,7 +38,7 @@ IS_WINDOWS = os.name == 'nt' ...@@ -40,7 +38,7 @@ IS_WINDOWS = os.name == 'nt'
COLOR_ENV_VAR = 'GTEST_COLOR' COLOR_ENV_VAR = 'GTEST_COLOR'
COLOR_FLAG = 'gtest_color' COLOR_FLAG = 'gtest_color'
COMMAND = gtest_test_utils.GetTestExecutablePath('gtest_color_test_') COMMAND = gtest_test_utils.GetTestExecutablePath('googletest-color-test_')
def SetEnvVar(env_var, value): def SetEnvVar(env_var, value):
...@@ -53,7 +51,7 @@ def SetEnvVar(env_var, value): ...@@ -53,7 +51,7 @@ def SetEnvVar(env_var, value):
def UsesColor(term, color_env_var, color_flag): def UsesColor(term, color_env_var, color_flag):
"""Runs gtest_color_test_ and returns its exit code.""" """Runs googletest-color-test_ and returns its exit code."""
SetEnvVar('TERM', term) SetEnvVar('TERM', term)
SetEnvVar(COLOR_ENV_VAR, color_env_var) SetEnvVar(COLOR_ENV_VAR, color_env_var)
......
...@@ -26,8 +26,7 @@ ...@@ -26,8 +26,7 @@
// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT // THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
//
// Author: wan@google.com (Zhanyong Wan)
// A helper program for testing how Google Test determines whether to use // A helper program for testing how Google Test determines whether to use
// colors in the output. It prints "YES" and returns 1 if Google Test // colors in the output. It prints "YES" and returns 1 if Google Test
......
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment