14b6829f0d28990dd645e16386eb226d0f10c8731shiqian// Copyright 2007, Google Inc. 24b6829f0d28990dd645e16386eb226d0f10c8731shiqian// All rights reserved. 34b6829f0d28990dd645e16386eb226d0f10c8731shiqian// 44b6829f0d28990dd645e16386eb226d0f10c8731shiqian// Redistribution and use in source and binary forms, with or without 54b6829f0d28990dd645e16386eb226d0f10c8731shiqian// modification, are permitted provided that the following conditions are 64b6829f0d28990dd645e16386eb226d0f10c8731shiqian// met: 74b6829f0d28990dd645e16386eb226d0f10c8731shiqian// 84b6829f0d28990dd645e16386eb226d0f10c8731shiqian// * Redistributions of source code must retain the above copyright 94b6829f0d28990dd645e16386eb226d0f10c8731shiqian// notice, this list of conditions and the following disclaimer. 104b6829f0d28990dd645e16386eb226d0f10c8731shiqian// * Redistributions in binary form must reproduce the above 114b6829f0d28990dd645e16386eb226d0f10c8731shiqian// copyright notice, this list of conditions and the following disclaimer 124b6829f0d28990dd645e16386eb226d0f10c8731shiqian// in the documentation and/or other materials provided with the 134b6829f0d28990dd645e16386eb226d0f10c8731shiqian// distribution. 144b6829f0d28990dd645e16386eb226d0f10c8731shiqian// * Neither the name of Google Inc. nor the names of its 154b6829f0d28990dd645e16386eb226d0f10c8731shiqian// contributors may be used to endorse or promote products derived from 164b6829f0d28990dd645e16386eb226d0f10c8731shiqian// this software without specific prior written permission. 174b6829f0d28990dd645e16386eb226d0f10c8731shiqian// 184b6829f0d28990dd645e16386eb226d0f10c8731shiqian// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 194b6829f0d28990dd645e16386eb226d0f10c8731shiqian// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 204b6829f0d28990dd645e16386eb226d0f10c8731shiqian// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 214b6829f0d28990dd645e16386eb226d0f10c8731shiqian// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 224b6829f0d28990dd645e16386eb226d0f10c8731shiqian// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 234b6829f0d28990dd645e16386eb226d0f10c8731shiqian// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 244b6829f0d28990dd645e16386eb226d0f10c8731shiqian// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 254b6829f0d28990dd645e16386eb226d0f10c8731shiqian// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 264b6829f0d28990dd645e16386eb226d0f10c8731shiqian// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 274b6829f0d28990dd645e16386eb226d0f10c8731shiqian// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 284b6829f0d28990dd645e16386eb226d0f10c8731shiqian// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 294b6829f0d28990dd645e16386eb226d0f10c8731shiqian// 304b6829f0d28990dd645e16386eb226d0f10c8731shiqian// Author: wan@google.com (Zhanyong Wan) 314b6829f0d28990dd645e16386eb226d0f10c8731shiqian 324b6829f0d28990dd645e16386eb226d0f10c8731shiqian// Tests that SCOPED_TRACE() and various Google Test assertions can be 334b6829f0d28990dd645e16386eb226d0f10c8731shiqian// used in a large number of threads concurrently. 344b6829f0d28990dd645e16386eb226d0f10c8731shiqian 352620c79810d4741922e9fa89050c0af564994f24zhanyong.wan#include "gtest/gtest.h" 364b6829f0d28990dd645e16386eb226d0f10c8731shiqian 37fbd53a53c1e01dec71c65754cf73282e4759bc40vladlosev#include <iostream> 3893d13a8bbcb70bfd80b0d7ae2bf9aedfc06bf0cczhanyong.wan#include <vector> 39fbd53a53c1e01dec71c65754cf73282e4759bc40vladlosev 404b6829f0d28990dd645e16386eb226d0f10c8731shiqian// We must define this macro in order to #include 414b6829f0d28990dd645e16386eb226d0f10c8731shiqian// gtest-internal-inl.h. This is how Google Test prevents a user from 424b6829f0d28990dd645e16386eb226d0f10c8731shiqian// accidentally depending on its internal implementation. 434cd62602913a032a7aec091d4c8055ff9af95e37zhanyong.wan#define GTEST_IMPLEMENTATION_ 1 444b6829f0d28990dd645e16386eb226d0f10c8731shiqian#include "src/gtest-internal-inl.h" 454cd62602913a032a7aec091d4c8055ff9af95e37zhanyong.wan#undef GTEST_IMPLEMENTATION_ 464b6829f0d28990dd645e16386eb226d0f10c8731shiqian 47fbd53a53c1e01dec71c65754cf73282e4759bc40vladlosev#if GTEST_IS_THREADSAFE 48fbd53a53c1e01dec71c65754cf73282e4759bc40vladlosev 494b6829f0d28990dd645e16386eb226d0f10c8731shiqiannamespace testing { 504b6829f0d28990dd645e16386eb226d0f10c8731shiqiannamespace { 514b6829f0d28990dd645e16386eb226d0f10c8731shiqian 52f6fb532f0825024feda89c863e33a51b6ff377f5zhanyong.wanusing internal::Notification; 534b6829f0d28990dd645e16386eb226d0f10c8731shiqianusing internal::TestPropertyKeyIs; 54050a520ddf9a34b93a3b41704fa2450d7450783fzhanyong.wanusing internal::ThreadWithParam; 55f6fb532f0825024feda89c863e33a51b6ff377f5zhanyong.wanusing internal::scoped_ptr; 564b6829f0d28990dd645e16386eb226d0f10c8731shiqian 57fbd53a53c1e01dec71c65754cf73282e4759bc40vladlosev// In order to run tests in this file, for platforms where Google Test is 58f6fb532f0825024feda89c863e33a51b6ff377f5zhanyong.wan// thread safe, implement ThreadWithParam. See the description of its API 59f6fb532f0825024feda89c863e33a51b6ff377f5zhanyong.wan// in gtest-port.h, where it is defined for already supported platforms. 60fbd53a53c1e01dec71c65754cf73282e4759bc40vladlosev 614b6829f0d28990dd645e16386eb226d0f10c8731shiqian// How many threads to create? 624b6829f0d28990dd645e16386eb226d0f10c8731shiqianconst int kThreadCount = 50; 634b6829f0d28990dd645e16386eb226d0f10c8731shiqian 6403c314931649a999b0cf5deb0a434a1009157416jgm@google.comstd::string IdToKey(int id, const char* suffix) { 654b6829f0d28990dd645e16386eb226d0f10c8731shiqian Message key; 664b6829f0d28990dd645e16386eb226d0f10c8731shiqian key << "key_" << id << "_" << suffix; 674b6829f0d28990dd645e16386eb226d0f10c8731shiqian return key.GetString(); 684b6829f0d28990dd645e16386eb226d0f10c8731shiqian} 694b6829f0d28990dd645e16386eb226d0f10c8731shiqian 7003c314931649a999b0cf5deb0a434a1009157416jgm@google.comstd::string IdToString(int id) { 714b6829f0d28990dd645e16386eb226d0f10c8731shiqian Message id_message; 724b6829f0d28990dd645e16386eb226d0f10c8731shiqian id_message << id; 734b6829f0d28990dd645e16386eb226d0f10c8731shiqian return id_message.GetString(); 744b6829f0d28990dd645e16386eb226d0f10c8731shiqian} 754b6829f0d28990dd645e16386eb226d0f10c8731shiqian 7693d13a8bbcb70bfd80b0d7ae2bf9aedfc06bf0cczhanyong.wanvoid ExpectKeyAndValueWereRecordedForId( 7793d13a8bbcb70bfd80b0d7ae2bf9aedfc06bf0cczhanyong.wan const std::vector<TestProperty>& properties, 7893d13a8bbcb70bfd80b0d7ae2bf9aedfc06bf0cczhanyong.wan int id, const char* suffix) { 794b6829f0d28990dd645e16386eb226d0f10c8731shiqian TestPropertyKeyIs matches_key(IdToKey(id, suffix).c_str()); 8093d13a8bbcb70bfd80b0d7ae2bf9aedfc06bf0cczhanyong.wan const std::vector<TestProperty>::const_iterator property = 8193d13a8bbcb70bfd80b0d7ae2bf9aedfc06bf0cczhanyong.wan std::find_if(properties.begin(), properties.end(), matches_key); 8293d13a8bbcb70bfd80b0d7ae2bf9aedfc06bf0cczhanyong.wan ASSERT_TRUE(property != properties.end()) 83449f84de9b0c48289e20f63c6d08a39bcee2021bzhanyong.wan << "expecting " << suffix << " value for id " << id; 84449f84de9b0c48289e20f63c6d08a39bcee2021bzhanyong.wan EXPECT_STREQ(IdToString(id).c_str(), property->value()); 854b6829f0d28990dd645e16386eb226d0f10c8731shiqian} 864b6829f0d28990dd645e16386eb226d0f10c8731shiqian 874b6829f0d28990dd645e16386eb226d0f10c8731shiqian// Calls a large number of Google Test assertions, where exactly one of them 884b6829f0d28990dd645e16386eb226d0f10c8731shiqian// will fail. 894b6829f0d28990dd645e16386eb226d0f10c8731shiqianvoid ManyAsserts(int id) { 90fbd53a53c1e01dec71c65754cf73282e4759bc40vladlosev GTEST_LOG_(INFO) << "Thread #" << id << " running..."; 914b6829f0d28990dd645e16386eb226d0f10c8731shiqian 924b6829f0d28990dd645e16386eb226d0f10c8731shiqian SCOPED_TRACE(Message() << "Thread #" << id); 934b6829f0d28990dd645e16386eb226d0f10c8731shiqian 944b6829f0d28990dd645e16386eb226d0f10c8731shiqian for (int i = 0; i < kThreadCount; i++) { 954b6829f0d28990dd645e16386eb226d0f10c8731shiqian SCOPED_TRACE(Message() << "Iteration #" << i); 964b6829f0d28990dd645e16386eb226d0f10c8731shiqian 974b6829f0d28990dd645e16386eb226d0f10c8731shiqian // A bunch of assertions that should succeed. 984b6829f0d28990dd645e16386eb226d0f10c8731shiqian EXPECT_TRUE(true); 994b6829f0d28990dd645e16386eb226d0f10c8731shiqian ASSERT_FALSE(false) << "This shouldn't fail."; 1004b6829f0d28990dd645e16386eb226d0f10c8731shiqian EXPECT_STREQ("a", "a"); 1014b6829f0d28990dd645e16386eb226d0f10c8731shiqian ASSERT_LE(5, 6); 1024b6829f0d28990dd645e16386eb226d0f10c8731shiqian EXPECT_EQ(i, i) << "This shouldn't fail."; 1034b6829f0d28990dd645e16386eb226d0f10c8731shiqian 1044b6829f0d28990dd645e16386eb226d0f10c8731shiqian // RecordProperty() should interact safely with other threads as well. 1054b6829f0d28990dd645e16386eb226d0f10c8731shiqian // The shared_key forces property updates. 1064b6829f0d28990dd645e16386eb226d0f10c8731shiqian Test::RecordProperty(IdToKey(id, "string").c_str(), IdToString(id).c_str()); 1074b6829f0d28990dd645e16386eb226d0f10c8731shiqian Test::RecordProperty(IdToKey(id, "int").c_str(), id); 1084b6829f0d28990dd645e16386eb226d0f10c8731shiqian Test::RecordProperty("shared_key", IdToString(id).c_str()); 1094b6829f0d28990dd645e16386eb226d0f10c8731shiqian 1104b6829f0d28990dd645e16386eb226d0f10c8731shiqian // This assertion should fail kThreadCount times per thread. It 1114b6829f0d28990dd645e16386eb226d0f10c8731shiqian // is for testing whether Google Test can handle failed assertions in a 1124b6829f0d28990dd645e16386eb226d0f10c8731shiqian // multi-threaded context. 1134b6829f0d28990dd645e16386eb226d0f10c8731shiqian EXPECT_LT(i, 0) << "This should always fail."; 1144b6829f0d28990dd645e16386eb226d0f10c8731shiqian } 1154b6829f0d28990dd645e16386eb226d0f10c8731shiqian} 1164b6829f0d28990dd645e16386eb226d0f10c8731shiqian 117fbd53a53c1e01dec71c65754cf73282e4759bc40vladlosevvoid CheckTestFailureCount(int expected_failures) { 118fbd53a53c1e01dec71c65754cf73282e4759bc40vladlosev const TestInfo* const info = UnitTest::GetInstance()->current_test_info(); 119fbd53a53c1e01dec71c65754cf73282e4759bc40vladlosev const TestResult* const result = info->result(); 120fbd53a53c1e01dec71c65754cf73282e4759bc40vladlosev GTEST_CHECK_(expected_failures == result->total_part_count()) 121fbd53a53c1e01dec71c65754cf73282e4759bc40vladlosev << "Logged " << result->total_part_count() << " failures " 122fbd53a53c1e01dec71c65754cf73282e4759bc40vladlosev << " vs. " << expected_failures << " expected"; 123fbd53a53c1e01dec71c65754cf73282e4759bc40vladlosev} 124fbd53a53c1e01dec71c65754cf73282e4759bc40vladlosev 1254b6829f0d28990dd645e16386eb226d0f10c8731shiqian// Tests using SCOPED_TRACE() and Google Test assertions in many threads 1264b6829f0d28990dd645e16386eb226d0f10c8731shiqian// concurrently. 1274b6829f0d28990dd645e16386eb226d0f10c8731shiqianTEST(StressTest, CanUseScopedTraceAndAssertionsInManyThreads) { 128050a520ddf9a34b93a3b41704fa2450d7450783fzhanyong.wan { 129050a520ddf9a34b93a3b41704fa2450d7450783fzhanyong.wan scoped_ptr<ThreadWithParam<int> > threads[kThreadCount]; 130f6fb532f0825024feda89c863e33a51b6ff377f5zhanyong.wan Notification threads_can_start; 131050a520ddf9a34b93a3b41704fa2450d7450783fzhanyong.wan for (int i = 0; i != kThreadCount; i++) 132f6fb532f0825024feda89c863e33a51b6ff377f5zhanyong.wan threads[i].reset(new ThreadWithParam<int>(&ManyAsserts, 133f6fb532f0825024feda89c863e33a51b6ff377f5zhanyong.wan i, 134f6fb532f0825024feda89c863e33a51b6ff377f5zhanyong.wan &threads_can_start)); 135fbd53a53c1e01dec71c65754cf73282e4759bc40vladlosev 136f6fb532f0825024feda89c863e33a51b6ff377f5zhanyong.wan threads_can_start.Notify(); 137fbd53a53c1e01dec71c65754cf73282e4759bc40vladlosev 138050a520ddf9a34b93a3b41704fa2450d7450783fzhanyong.wan // Blocks until all the threads are done. 139050a520ddf9a34b93a3b41704fa2450d7450783fzhanyong.wan for (int i = 0; i != kThreadCount; i++) 140050a520ddf9a34b93a3b41704fa2450d7450783fzhanyong.wan threads[i]->Join(); 141fbd53a53c1e01dec71c65754cf73282e4759bc40vladlosev } 142fbd53a53c1e01dec71c65754cf73282e4759bc40vladlosev 143fbd53a53c1e01dec71c65754cf73282e4759bc40vladlosev // Ensures that kThreadCount*kThreadCount failures have been reported. 144fbd53a53c1e01dec71c65754cf73282e4759bc40vladlosev const TestInfo* const info = UnitTest::GetInstance()->current_test_info(); 145fbd53a53c1e01dec71c65754cf73282e4759bc40vladlosev const TestResult* const result = info->result(); 146fbd53a53c1e01dec71c65754cf73282e4759bc40vladlosev 14793d13a8bbcb70bfd80b0d7ae2bf9aedfc06bf0cczhanyong.wan std::vector<TestProperty> properties; 148fbd53a53c1e01dec71c65754cf73282e4759bc40vladlosev // We have no access to the TestResult's list of properties but we can 149fbd53a53c1e01dec71c65754cf73282e4759bc40vladlosev // copy them one by one. 150fbd53a53c1e01dec71c65754cf73282e4759bc40vladlosev for (int i = 0; i < result->test_property_count(); ++i) 15193d13a8bbcb70bfd80b0d7ae2bf9aedfc06bf0cczhanyong.wan properties.push_back(result->GetTestProperty(i)); 152fbd53a53c1e01dec71c65754cf73282e4759bc40vladlosev 153fbd53a53c1e01dec71c65754cf73282e4759bc40vladlosev EXPECT_EQ(kThreadCount * 2 + 1, result->test_property_count()) 154fbd53a53c1e01dec71c65754cf73282e4759bc40vladlosev << "String and int values recorded on each thread, " 155fbd53a53c1e01dec71c65754cf73282e4759bc40vladlosev << "as well as one shared_key"; 156fbd53a53c1e01dec71c65754cf73282e4759bc40vladlosev for (int i = 0; i < kThreadCount; ++i) { 157fbd53a53c1e01dec71c65754cf73282e4759bc40vladlosev ExpectKeyAndValueWereRecordedForId(properties, i, "string"); 158fbd53a53c1e01dec71c65754cf73282e4759bc40vladlosev ExpectKeyAndValueWereRecordedForId(properties, i, "int"); 159fbd53a53c1e01dec71c65754cf73282e4759bc40vladlosev } 160fbd53a53c1e01dec71c65754cf73282e4759bc40vladlosev CheckTestFailureCount(kThreadCount*kThreadCount); 161fbd53a53c1e01dec71c65754cf73282e4759bc40vladlosev} 162fbd53a53c1e01dec71c65754cf73282e4759bc40vladlosev 163fbd53a53c1e01dec71c65754cf73282e4759bc40vladlosevvoid FailingThread(bool is_fatal) { 164fbd53a53c1e01dec71c65754cf73282e4759bc40vladlosev if (is_fatal) 165fbd53a53c1e01dec71c65754cf73282e4759bc40vladlosev FAIL() << "Fatal failure in some other thread. " 166fbd53a53c1e01dec71c65754cf73282e4759bc40vladlosev << "(This failure is expected.)"; 167fbd53a53c1e01dec71c65754cf73282e4759bc40vladlosev else 168fbd53a53c1e01dec71c65754cf73282e4759bc40vladlosev ADD_FAILURE() << "Non-fatal failure in some other thread. " 169fbd53a53c1e01dec71c65754cf73282e4759bc40vladlosev << "(This failure is expected.)"; 170fbd53a53c1e01dec71c65754cf73282e4759bc40vladlosev} 171fbd53a53c1e01dec71c65754cf73282e4759bc40vladlosev 172fbd53a53c1e01dec71c65754cf73282e4759bc40vladlosevvoid GenerateFatalFailureInAnotherThread(bool is_fatal) { 173050a520ddf9a34b93a3b41704fa2450d7450783fzhanyong.wan ThreadWithParam<bool> thread(&FailingThread, is_fatal, NULL); 174fbd53a53c1e01dec71c65754cf73282e4759bc40vladlosev thread.Join(); 1754b6829f0d28990dd645e16386eb226d0f10c8731shiqian} 1764b6829f0d28990dd645e16386eb226d0f10c8731shiqian 177e44602ec83c65102035ce5304ae8de0cb16e9e56shiqianTEST(NoFatalFailureTest, ExpectNoFatalFailureIgnoresFailuresInOtherThreads) { 178fbd53a53c1e01dec71c65754cf73282e4759bc40vladlosev EXPECT_NO_FATAL_FAILURE(GenerateFatalFailureInAnotherThread(true)); 179fbd53a53c1e01dec71c65754cf73282e4759bc40vladlosev // We should only have one failure (the one from 180fbd53a53c1e01dec71c65754cf73282e4759bc40vladlosev // GenerateFatalFailureInAnotherThread()), since the EXPECT_NO_FATAL_FAILURE 181fbd53a53c1e01dec71c65754cf73282e4759bc40vladlosev // should succeed. 182fbd53a53c1e01dec71c65754cf73282e4759bc40vladlosev CheckTestFailureCount(1); 183e44602ec83c65102035ce5304ae8de0cb16e9e56shiqian} 184e44602ec83c65102035ce5304ae8de0cb16e9e56shiqian 185fbd53a53c1e01dec71c65754cf73282e4759bc40vladlosevvoid AssertNoFatalFailureIgnoresFailuresInOtherThreads() { 186fbd53a53c1e01dec71c65754cf73282e4759bc40vladlosev ASSERT_NO_FATAL_FAILURE(GenerateFatalFailureInAnotherThread(true)); 187fbd53a53c1e01dec71c65754cf73282e4759bc40vladlosev} 188e44602ec83c65102035ce5304ae8de0cb16e9e56shiqianTEST(NoFatalFailureTest, AssertNoFatalFailureIgnoresFailuresInOtherThreads) { 189fbd53a53c1e01dec71c65754cf73282e4759bc40vladlosev // Using a subroutine, to make sure, that the test continues. 190fbd53a53c1e01dec71c65754cf73282e4759bc40vladlosev AssertNoFatalFailureIgnoresFailuresInOtherThreads(); 191fbd53a53c1e01dec71c65754cf73282e4759bc40vladlosev // We should only have one failure (the one from 192fbd53a53c1e01dec71c65754cf73282e4759bc40vladlosev // GenerateFatalFailureInAnotherThread()), since the EXPECT_NO_FATAL_FAILURE 193fbd53a53c1e01dec71c65754cf73282e4759bc40vladlosev // should succeed. 194fbd53a53c1e01dec71c65754cf73282e4759bc40vladlosev CheckTestFailureCount(1); 195e44602ec83c65102035ce5304ae8de0cb16e9e56shiqian} 196e44602ec83c65102035ce5304ae8de0cb16e9e56shiqian 197e44602ec83c65102035ce5304ae8de0cb16e9e56shiqianTEST(FatalFailureTest, ExpectFatalFailureIgnoresFailuresInOtherThreads) { 198fbd53a53c1e01dec71c65754cf73282e4759bc40vladlosev // This statement should fail, since the current thread doesn't generate a 199fbd53a53c1e01dec71c65754cf73282e4759bc40vladlosev // fatal failure, only another one does. 200fbd53a53c1e01dec71c65754cf73282e4759bc40vladlosev EXPECT_FATAL_FAILURE(GenerateFatalFailureInAnotherThread(true), "expected"); 201fbd53a53c1e01dec71c65754cf73282e4759bc40vladlosev CheckTestFailureCount(2); 202e44602ec83c65102035ce5304ae8de0cb16e9e56shiqian} 203e44602ec83c65102035ce5304ae8de0cb16e9e56shiqian 204e44602ec83c65102035ce5304ae8de0cb16e9e56shiqianTEST(FatalFailureOnAllThreadsTest, ExpectFatalFailureOnAllThreads) { 205fbd53a53c1e01dec71c65754cf73282e4759bc40vladlosev // This statement should succeed, because failures in all threads are 206fbd53a53c1e01dec71c65754cf73282e4759bc40vladlosev // considered. 207fbd53a53c1e01dec71c65754cf73282e4759bc40vladlosev EXPECT_FATAL_FAILURE_ON_ALL_THREADS( 208fbd53a53c1e01dec71c65754cf73282e4759bc40vladlosev GenerateFatalFailureInAnotherThread(true), "expected"); 209fbd53a53c1e01dec71c65754cf73282e4759bc40vladlosev CheckTestFailureCount(0); 210fbd53a53c1e01dec71c65754cf73282e4759bc40vladlosev // We need to add a failure, because main() checks that there are failures. 211fbd53a53c1e01dec71c65754cf73282e4759bc40vladlosev // But when only this test is run, we shouldn't have any failures. 212fbd53a53c1e01dec71c65754cf73282e4759bc40vladlosev ADD_FAILURE() << "This is an expected non-fatal failure."; 213e44602ec83c65102035ce5304ae8de0cb16e9e56shiqian} 214e44602ec83c65102035ce5304ae8de0cb16e9e56shiqian 215e44602ec83c65102035ce5304ae8de0cb16e9e56shiqianTEST(NonFatalFailureTest, ExpectNonFatalFailureIgnoresFailuresInOtherThreads) { 216fbd53a53c1e01dec71c65754cf73282e4759bc40vladlosev // This statement should fail, since the current thread doesn't generate a 217fbd53a53c1e01dec71c65754cf73282e4759bc40vladlosev // fatal failure, only another one does. 218fbd53a53c1e01dec71c65754cf73282e4759bc40vladlosev EXPECT_NONFATAL_FAILURE(GenerateFatalFailureInAnotherThread(false), 219fbd53a53c1e01dec71c65754cf73282e4759bc40vladlosev "expected"); 220fbd53a53c1e01dec71c65754cf73282e4759bc40vladlosev CheckTestFailureCount(2); 221e44602ec83c65102035ce5304ae8de0cb16e9e56shiqian} 222e44602ec83c65102035ce5304ae8de0cb16e9e56shiqian 223e44602ec83c65102035ce5304ae8de0cb16e9e56shiqianTEST(NonFatalFailureOnAllThreadsTest, ExpectNonFatalFailureOnAllThreads) { 224fbd53a53c1e01dec71c65754cf73282e4759bc40vladlosev // This statement should succeed, because failures in all threads are 225fbd53a53c1e01dec71c65754cf73282e4759bc40vladlosev // considered. 226fbd53a53c1e01dec71c65754cf73282e4759bc40vladlosev EXPECT_NONFATAL_FAILURE_ON_ALL_THREADS( 227fbd53a53c1e01dec71c65754cf73282e4759bc40vladlosev GenerateFatalFailureInAnotherThread(false), "expected"); 228fbd53a53c1e01dec71c65754cf73282e4759bc40vladlosev CheckTestFailureCount(0); 229fbd53a53c1e01dec71c65754cf73282e4759bc40vladlosev // We need to add a failure, because main() checks that there are failures, 230fbd53a53c1e01dec71c65754cf73282e4759bc40vladlosev // But when only this test is run, we shouldn't have any failures. 231fbd53a53c1e01dec71c65754cf73282e4759bc40vladlosev ADD_FAILURE() << "This is an expected non-fatal failure."; 232e44602ec83c65102035ce5304ae8de0cb16e9e56shiqian} 233e44602ec83c65102035ce5304ae8de0cb16e9e56shiqian 2344b6829f0d28990dd645e16386eb226d0f10c8731shiqian} // namespace 2354b6829f0d28990dd645e16386eb226d0f10c8731shiqian} // namespace testing 2364b6829f0d28990dd645e16386eb226d0f10c8731shiqian 2374b6829f0d28990dd645e16386eb226d0f10c8731shiqianint main(int argc, char **argv) { 2384b6829f0d28990dd645e16386eb226d0f10c8731shiqian testing::InitGoogleTest(&argc, argv); 2394b6829f0d28990dd645e16386eb226d0f10c8731shiqian 240fbd53a53c1e01dec71c65754cf73282e4759bc40vladlosev const int result = RUN_ALL_TESTS(); // Expected to fail. 241fbd53a53c1e01dec71c65754cf73282e4759bc40vladlosev GTEST_CHECK_(result == 1) << "RUN_ALL_TESTS() did not fail as expected"; 242fbd53a53c1e01dec71c65754cf73282e4759bc40vladlosev 243fbd53a53c1e01dec71c65754cf73282e4759bc40vladlosev printf("\nPASS\n"); 244fbd53a53c1e01dec71c65754cf73282e4759bc40vladlosev return 0; 245fbd53a53c1e01dec71c65754cf73282e4759bc40vladlosev} 246fbd53a53c1e01dec71c65754cf73282e4759bc40vladlosev 247fbd53a53c1e01dec71c65754cf73282e4759bc40vladlosev#else 248fbd53a53c1e01dec71c65754cf73282e4759bc40vladlosevTEST(StressTest, 249fbd53a53c1e01dec71c65754cf73282e4759bc40vladlosev DISABLED_ThreadSafetyTestsAreSkippedWhenGoogleTestIsNotThreadSafe) { 250fbd53a53c1e01dec71c65754cf73282e4759bc40vladlosev} 251fbd53a53c1e01dec71c65754cf73282e4759bc40vladlosev 252fbd53a53c1e01dec71c65754cf73282e4759bc40vladlosevint main(int argc, char **argv) { 253fbd53a53c1e01dec71c65754cf73282e4759bc40vladlosev testing::InitGoogleTest(&argc, argv); 2544b6829f0d28990dd645e16386eb226d0f10c8731shiqian return RUN_ALL_TESTS(); 2554b6829f0d28990dd645e16386eb226d0f10c8731shiqian} 256fbd53a53c1e01dec71c65754cf73282e4759bc40vladlosev#endif // GTEST_IS_THREADSAFE 257