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